ProtocolPropertiesHelper.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it).
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.openspcoop2.web.ctrlstat.servlet.protocol_properties;

import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.constants.ProprietariProtocolProperty;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDAccordoAzione;
import org.openspcoop2.core.id.IDFruizione;
import org.openspcoop2.core.id.IDPortType;
import org.openspcoop2.core.id.IDPortTypeAzione;
import org.openspcoop2.core.id.IDResource;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoCooperazione;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Azione;
import org.openspcoop2.core.registry.Fruitore;
import org.openspcoop2.core.registry.Operation;
import org.openspcoop2.core.registry.PortType;
import org.openspcoop2.core.registry.ProtocolProperty;
import org.openspcoop2.core.registry.Resource;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.beans.AccordoServizioParteComuneSintetico;
import org.openspcoop2.core.registry.beans.PortTypeSintetico;
import org.openspcoop2.core.registry.constants.StatiAccordo;
import org.openspcoop2.core.registry.driver.BeanUtilities;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
import org.openspcoop2.protocol.sdk.properties.AbstractConsoleItem;
import org.openspcoop2.protocol.sdk.properties.BinaryConsoleItem;
import org.openspcoop2.protocol.sdk.properties.ConsoleConfiguration;
import org.openspcoop2.protocol.sdk.properties.IConsoleDynamicConfiguration;
import org.openspcoop2.protocol.sdk.properties.ProtocolProperties;
import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.servlet.ConsoleHelper;
import org.openspcoop2.web.ctrlstat.servlet.ac.AccordiCooperazioneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneHelper;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneUtilities;
import org.openspcoop2.web.ctrlstat.servlet.apc.api.ApiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaCostanti;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaHelper;
import org.openspcoop2.web.ctrlstat.servlet.archivi.ArchiviCostanti;
import org.openspcoop2.web.ctrlstat.servlet.pd.PorteDelegateCostanti;
import org.openspcoop2.web.ctrlstat.servlet.pd.PorteDelegateHelper;
import org.openspcoop2.web.ctrlstat.servlet.sa.ServiziApplicativiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCostanti;
import org.openspcoop2.web.lib.mvc.BinaryParameter;
import org.openspcoop2.web.lib.mvc.Costanti;
import org.openspcoop2.web.lib.mvc.DataElement;
import org.openspcoop2.web.lib.mvc.DataElementType;
import org.openspcoop2.web.lib.mvc.PageData;
import org.openspcoop2.web.lib.mvc.Parameter;
import org.openspcoop2.web.lib.mvc.ServletUtils;
import org.openspcoop2.web.lib.mvc.TipoOperazione;

/**
 * ProtocolPropertiesHelper
 *
 * @author Pintori Giuliano (pintori@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ProtocolPropertiesHelper extends ConsoleHelper {

	public ProtocolPropertiesHelper(HttpServletRequest request, PageData pd, HttpSession session) {
		super(request, pd, session);
	}
	public ProtocolPropertiesHelper(ControlStationCore core, HttpServletRequest request, PageData pd, HttpSession session) {
		super(core, request, pd, session);
	}

	public Object getIdOggettoProprietario(Object proprietario, String idProprietario, String nomeProprieta, String nomeParentProprieta, ProprietariProtocolProperty tipoProprietario, String tipoAccordo) throws Exception {
		try{
			if(tipoProprietario != null && proprietario != null){
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
					AccordoCooperazione ac = (AccordoCooperazione) proprietario;
					IDAccordo idAccordoCooperazione = this.idAccordoFactory.getIDAccordoFromValues(ac.getNome(),BeanUtilities.getSoggettoReferenteID(ac.getSoggettoReferente()),ac.getVersione());
					return idAccordoCooperazione;
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
					AccordoServizioParteComune as = (AccordoServizioParteComune) proprietario;
					IDAccordo idAccordo = this.idAccordoFactory.getIDAccordoFromValues(as.getNome(),BeanUtilities.getSoggettoReferenteID(as.getSoggettoReferente()),as.getVersione());
					return idAccordo;
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
					AccordoServizioParteSpecifica aps = (AccordoServizioParteSpecifica) proprietario;
					IDServizio idAps = this.idServizioFactory.getIDServizioFromAccordo(aps);
					return idAps;
				case AZIONE_ACCORDO:
					Azione azione = (Azione) proprietario;
					AccordoServizioParteComuneSintetico apca = this.apcCore.getAccordoServizioSintetico(Integer.parseInt(idProprietario));
					IDAccordo idAccordoAz = this.idAccordoFactory.getIDAccordoFromValues(apca.getNome(),BeanUtilities.getSoggettoReferenteID(apca.getSoggettoReferente()),apca.getVersione());
					IDAccordoAzione idAccordoAzione = new IDAccordoAzione();
					idAccordoAzione.setIdAccordo(idAccordoAz);
					idAccordoAzione.setNome(azione.getNome());

					return idAccordoAzione;
				case FRUITORE:
					Fruitore fruitore = (Fruitore) proprietario; 
					IDSoggetto idSoggettoFruitore = new IDSoggetto(fruitore.getTipo(), fruitore.getNome()); 
					AccordoServizioParteSpecifica apsFrui = this.apsCore.getAccordoServizioParteSpecifica(fruitore.getIdServizio());
					IDServizio idApsFrui = this.idServizioFactory.getIDServizioFromAccordo(apsFrui);
					IDFruizione idFruizione = new IDFruizione();
					idFruizione.setIdServizio(idApsFrui);
					idFruizione.setIdFruitore(idSoggettoFruitore);

					return idFruizione;
				case OPERATION:
					org.openspcoop2.core.registry.Operation azionePt = (Operation) proprietario;
					IDPortType idPortTypeAz = new IDPortType();
					int idProp = Integer.parseInt(idProprietario);
					AccordoServizioParteComuneSintetico apc = this.apcCore.getAccordoServizioSintetico(idProp);
					for (PortTypeSintetico pt : apc.getPortType()) {
						if(pt.getNome().equals(nomeParentProprieta)){
							IDAccordo idAccordoPt = this.idAccordoFactory.getIDAccordoFromValues(apc.getNome(),BeanUtilities.getSoggettoReferenteID(apc.getSoggettoReferente()),apc.getVersione());
							idPortTypeAz.setIdAccordo(idAccordoPt);
							idPortTypeAz.setNome(pt.getNome());
							break;
						}
					}

					IDPortTypeAzione idAzionePt = new IDPortTypeAzione();
					idAzionePt.setIdPortType(idPortTypeAz); 
					idAzionePt.setNome(azionePt.getNome());

					return idAzionePt;
				case PORT_TYPE:
					PortType pt = (PortType) proprietario;
					IDPortType idPt = new IDPortType();
					AccordoServizioParteComuneSintetico apcPt = this.apcCore.getAccordoServizioSintetico(pt.getIdAccordo());
					IDAccordo idAccordoPt = this.idAccordoFactory.getIDAccordoFromValues(apcPt.getNome(),BeanUtilities.getSoggettoReferenteID(apcPt.getSoggettoReferente()),apcPt.getVersione());
					idPt.setIdAccordo(idAccordoPt);
					idPt.setNome(pt.getNome());

					return idPt;
				case RESOURCE:
					org.openspcoop2.core.registry.Resource risorsa = (org.openspcoop2.core.registry.Resource) proprietario;
					AccordoServizioParteComuneSintetico apcr = this.apcCore.getAccordoServizioSintetico(Integer.parseInt(idProprietario));
					IDAccordo idAccordoRisorsa = this.idAccordoFactory.getIDAccordoFromValues(apcr.getNome(),
							BeanUtilities.getSoggettoReferenteID(apcr.getSoggettoReferente()),apcr.getVersione());
					IDResource idAccordoR = new IDResource();
					idAccordoR.setIdAccordo(idAccordoRisorsa);
					idAccordoR.setNome(risorsa.getNome());

					return idAccordoR;
				case SOGGETTO:
					Soggetto soggettoRegistro = (Soggetto) proprietario;
					IDSoggetto idSoggetto = new IDSoggetto(soggettoRegistro.getTipo(), soggettoRegistro.getNome()); 
					return idSoggetto;
				case SERVIZIO_APPLICATIVO:
					ServizioApplicativo servizioApplicativo = (ServizioApplicativo) proprietario;
					IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
					idServizioApplicativo.setIdSoggettoProprietario(new IDSoggetto(servizioApplicativo.getTipoSoggettoProprietario(), servizioApplicativo.getNomeSoggettoProprietario()));
					idServizioApplicativo.setNome(servizioApplicativo.getNome());
					return idServizioApplicativo;
					
				}
			}

		}  catch (DriverRegistroServiziException e) {
			throw e;
		}
		return null;
	}

	public Object getOggettoProprietario(String idProprietario, String nomeProprieta, String nomeParentProprieta, ProprietariProtocolProperty tipoProprietario, String tipoAccordo) throws Exception {
		try{
			if(tipoProprietario != null && idProprietario != null){
				long idProp = Long.valueOf(idProprietario);

				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
					AccordoCooperazione ac = this.acCore.getAccordoCooperazione(idProp);
					return ac;
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
					AccordoServizioParteComune as = this.apcCore.getAccordoServizioFull(idProp);
					return as;
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
					AccordoServizioParteSpecifica aps = this.apsCore.getAccordoServizioParteSpecifica(idProp);
					return aps;
				case AZIONE_ACCORDO:
					AccordoServizioParteComune apca = this.apcCore.getAccordoServizioFull(idProp);
					for(Azione azione: apca.getAzioneList()){
						if(azione.getNome().equals(nomeProprieta))
							return azione;
					}
					return null;
				case FRUITORE:
					Fruitore servFru = this.apsCore.getServizioFruitore(idProp);
					return servFru;
				case OPERATION:
					AccordoServizioParteComune apcop = this.apcCore.getAccordoServizioFull(idProp);
					for (PortType pt : apcop.getPortTypeList()) {
						if(pt.getNome().equals(nomeParentProprieta)){
							for (org.openspcoop2.core.registry.Operation azione : pt.getAzioneList()) {
								if(azione.getNome().equals(nomeProprieta ))
									return azione;
							}
						}
					}
					return null;
				case PORT_TYPE:
					AccordoServizioParteComune apc = this.apcCore.getAccordoServizioFull(idProp);
					for (PortType pt : apc.getPortTypeList()) {
						if(pt.getNome().equals(nomeProprieta))
							return pt;
					}
					return null;
				case RESOURCE:
					AccordoServizioParteComune apcr = this.apcCore.getAccordoServizioFull(idProp);
					for(Resource risorsa: apcr.getResourceList()){
						if(risorsa.getNome().equals(nomeProprieta))
							return risorsa;
					}
					return null;
				case SOGGETTO:
					Soggetto soggettoRegistro = this.soggettiCore.getSoggettoRegistro(idProp);
					return soggettoRegistro;
				case SERVIZIO_APPLICATIVO:
					ServizioApplicativo servizioApplicativo = this.saCore.getServizioApplicativo(idProp);
					return servizioApplicativo;
				}
			}

		}  catch (DriverRegistroServiziNotFound e) {
			throw e;
		} catch (DriverRegistroServiziException e) {
			throw e;
		}
		return null;
	}
	
	public String getStatoOggettoProprietario(String idProprietario, String nomeProprieta, String nomeParentProprieta, ProprietariProtocolProperty tipoProprietario, String tipoAccordo) throws Exception {
		try{
			if(tipoProprietario != null && idProprietario != null){
				int idProp = Integer.parseInt(idProprietario);

				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
					AccordoCooperazione ac = this.acCore.getAccordoCooperazione(idProp);
					return ac.getStatoPackage();
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
					AccordoServizioParteComuneSintetico as = this.apcCore.getAccordoServizioSintetico(idProp);
					return as.getStatoPackage();
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
					AccordoServizioParteSpecifica aps = this.apsCore.getAccordoServizioParteSpecifica(idProp);
					return aps.getStatoPackage();
				case AZIONE_ACCORDO:
					AccordoServizioParteComuneSintetico apca = this.apcCore.getAccordoServizioSintetico(idProp);
					return apca.getStatoPackage();
				case FRUITORE:
					Fruitore servFru = this.apsCore.getServizioFruitore(idProp);
					return servFru.getStatoPackage();
				case OPERATION:
					AccordoServizioParteComuneSintetico apcop = this.apcCore.getAccordoServizioSintetico(idProp);
					return apcop.getStatoPackage();
				case PORT_TYPE:
					AccordoServizioParteComuneSintetico apc = this.apcCore.getAccordoServizioSintetico(idProp);
					return apc.getStatoPackage();
				case RESOURCE:
					AccordoServizioParteComuneSintetico apcr = this.apcCore.getAccordoServizioSintetico(idProp);
					return apcr.getStatoPackage();
				case SOGGETTO:
					return null;
				case SERVIZIO_APPLICATIVO:
					return null;
				}
			}
		}  catch (DriverRegistroServiziNotFound e) {
			throw e;
		} catch (DriverRegistroServiziException e) {
			throw e;
		}
		return null;
	}

	public List<DataElement> addProtocolPropertyChangeToDati(TipoOperazione tipoOp, List<DataElement> dati, String protocollo, String id, String nome,
			String idProprietario, ProprietariProtocolProperty tipoProprietario, String tipoAccordo, String nomeProprietario,String nomeParentProprietario, String urlChange, String label,
			BinaryParameter contenutoDocumento, StringBuilder contenutoDocumentoStringBuilder, String errore, String tipologiaDocumentoScaricare, AbstractConsoleItem<?> binaryConsoleItem,
			boolean readOnly, String noteAggiornamento) throws Exception { 

		/* ID */
		DataElement de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_ID);
		de.setValue(id);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_ID);
		dati.add(de);

		/* CHANGE_BINARY */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_CHANGE_BINARY);
		de.setValue(ProtocolPropertiesCostanti.PARAMETRO_PP_CHANGE_BINARY_VALUE_TRUE);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_CHANGE_BINARY);
		dati.add(de);
		
		/* NOME */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME);
		de.setValue(nome);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME);
		dati.add(de);

		/* ID_PROPRIETARIO */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_ID_PROPRIETARIO);
		de.setValue(idProprietario);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_ID_PROPRIETARIO);
		dati.add(de);

		/* PROTOCOLLO */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_PROTOCOLLO);
		de.setValue(protocollo);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_PROTOCOLLO);
		dati.add(de);

		/* TIPO_PROPRIETARIO */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_TIPO_PROPRIETARIO);
		de.setValue(tipoProprietario.toString());
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_TIPO_PROPRIETARIO);
		dati.add(de);

		/* TIPO_ACCORDO */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_TIPO_ACCORDO);
		de.setValue(tipoAccordo);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_TIPO_ACCORDO);
		dati.add(de);

		/* NOME_PROPRIETARIO */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME_PROPRIETARIO);
		de.setValue(nomeProprietario);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME_PROPRIETARIO);
		dati.add(de);

		/* NOME_PARENT_PROPRIETARIO */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME_PARENT_PROPRIETARIO);
		de.setValue(nomeParentProprietario);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_NOME_PARENT_PROPRIETARIO);
		dati.add(de);

		/* URL_CHANGE */
		de = new DataElement();
		de.setLabel(ProtocolPropertiesCostanti.PARAMETRO_PP_URL_ORIGINALE_CHANGE);
		de.setValue(urlChange);
		de.setType(DataElementType.HIDDEN);
		de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_URL_ORIGINALE_CHANGE);
		dati.add(de);
		
		de = new DataElement();
		de.setLabel(binaryConsoleItem.getLabel());
		de.setType(DataElementType.TITLE);
		dati.add(de);
		
		boolean showContent = true;
		if(binaryConsoleItem instanceof BinaryConsoleItem) {
			showContent = ((BinaryConsoleItem)binaryConsoleItem).isShowContent();
		}
		
		String statoPackage = this.getStatoOggettoProprietario(idProprietario, nomeProprietario, nomeParentProprietario, tipoProprietario, tipoAccordo);

		// solo per le properties con stato finale blocco l'edit
		if(this.isShowGestioneWorkflowStatoDocumenti() && statoPackage != null && StatiAccordo.finale.toString().equals(statoPackage)) {
			this.pd.disableEditMode();
			
			if(contenutoDocumento != null && contenutoDocumento.getValue() != null && contenutoDocumento.getValue().length > 0){
				de = new DataElement();
				de.setLabel(ProtocolPropertiesCostanti.LABEL_NOME);
				de.setType(DataElementType.TEXT);
				de.setValue(contenutoDocumento.getFilename());
				dati.add(de);
				
				if(showContent) {
					if(errore!=null){
						de = new DataElement();
						de.setValue(errore);
						de.setLabel(binaryConsoleItem.getLabel());
						de.setType(DataElementType.TEXT);
						de.setSize(this.getSize());
						dati.add(de);
					}
					else{
						de = new DataElement();
						de.setLabel(ProtocolPropertiesCostanti.LABEL_DOCUMENTO_ATTUALE);
						de.setType(DataElementType.TEXT_AREA_NO_EDIT);
						de.setValue(contenutoDocumentoStringBuilder.toString());
						de.setRows(30);
						de.setCols(100);
						dati.add(de);
					}
				}
					
			}else {
				de = new DataElement();
				de.setType(DataElementType.TEXT);
				de.setValue(ProtocolPropertiesCostanti.LABEL_DOCUMENTO_NOT_FOUND);
				de.setSize(this.getSize());
				dati.add(de);
			}
			
			
			if(id != null && !"".equals(id) && this.core.isVisualizzaInformazioniCifrate()){
				DataElement saveAs = new DataElement();
				saveAs.setValue(ProtocolPropertiesCostanti.LABEL_DOWNLOAD);
				saveAs.setType(DataElementType.LINK);
				saveAs.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, 
						new Parameter(ProtocolPropertiesCostanti.PARAMETRO_PP_ID_ALLEGATO, id),
						new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO, tipologiaDocumentoScaricare),
						new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO, ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_PROTOCOL_PROPERTY));
				saveAs.setDisabilitaAjaxStatus();
				if(this.core.getDriverBYOKUtilities().isEnabledBYOK() && binaryConsoleItem.isLockedType()) {
					saveAs.setConfirm(Costanti.TITOLO_FINESTRA_MODALE_DOWNLOAD_MESSAGE_WARNING, this.core.getByokWarningMessage(), Costanti.LABEL_MONITOR_BUTTON_CONFERMA);
				}
				dati.add(saveAs);
			}
			
			de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setName(Costanti.PARAMETER_FILENAME_PREFIX + ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO);
			de.setValue(contenutoDocumento!=null ? contenutoDocumento.getFilename() : null);
			dati.add(de);
	
			de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setName(Costanti.PARAMETER_FILEID_PREFIX + ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO);
			de.setValue(contenutoDocumento!=null ? contenutoDocumento.getId(): null);
			dati.add(de);
		}else {
			/* Contenuto Documento */
			if(contenutoDocumento != null && contenutoDocumento.getValue() != null && contenutoDocumento.getValue().length > 0){
				de = new DataElement();
				de.setLabel(ProtocolPropertiesCostanti.LABEL_NOME);
				de.setType(DataElementType.TEXT);
				de.setValue(contenutoDocumento.getFilename());
				dati.add(de);
	
				if(showContent) {
					if(errore!=null){
						de = new DataElement();
						de.setValue(errore);
						de.setLabel(binaryConsoleItem.getLabel());
						de.setType(DataElementType.TEXT);
						de.setSize(this.getSize());
						dati.add(de);
					}
					else{
						de = new DataElement();
						de.setLabel(ProtocolPropertiesCostanti.LABEL_DOCUMENTO_ATTUALE);
						de.setType(DataElementType.TEXT_AREA_NO_EDIT);
						de.setValue(contenutoDocumentoStringBuilder.toString());
						de.setRows(30);
						de.setCols(100);
						dati.add(de);
					}
				}
	
				if(id != null && !"".equals(id) && this.core.isVisualizzaInformazioniCifrate()){
					DataElement saveAs = new DataElement();
					saveAs.setValue(ProtocolPropertiesCostanti.LABEL_DOWNLOAD);
					saveAs.setType(DataElementType.LINK);
					saveAs.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, 
							new Parameter(ProtocolPropertiesCostanti.PARAMETRO_PP_ID_ALLEGATO, id),
							new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO, tipologiaDocumentoScaricare),
							new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO, ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_PROTOCOL_PROPERTY));
					saveAs.setDisabilitaAjaxStatus();
					if(this.core.getDriverBYOKUtilities().isEnabledBYOK() && binaryConsoleItem.isLockedType()) {
						saveAs.setConfirm(Costanti.TITOLO_FINESTRA_MODALE_DOWNLOAD_MESSAGE_WARNING, this.core.getByokWarningMessage(), Costanti.LABEL_MONITOR_BUTTON_CONFERMA);
					}
					dati.add(saveAs);
				}
	
				if(!readOnly) {
					de = new DataElement();
					de.setType(DataElementType.TITLE);
					de.setLabel(ProtocolPropertiesCostanti.LABEL_AGGIORNAMENTO +" " +binaryConsoleItem.getLabel());
					de.setValue("");
					de.setSize(this.getSize());
					dati.add(de);
				}
	
			}else {
				de = new DataElement();
				de.setLabel(ProtocolPropertiesCostanti.LABEL_DOCUMENTO_ATTUALE);
				de.setType(DataElementType.TEXT);
				de.setValue(ProtocolPropertiesCostanti.LABEL_DOCUMENTO_NOT_FOUND);
				dati.add(de);
			}
	
			if(!readOnly) {
				de = new DataElement();
				de.setLabel(ProtocolPropertiesCostanti.LABEL_CONTENUTO_NUOVO);
				de.setValue("");
				de.setType(DataElementType.FILE);
				de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO);
				de.setSize(this.getSize());
				de.setRequired(binaryConsoleItem.isRequired()); 
				dati.add(de);
			}
	
			de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setName(Costanti.PARAMETER_FILENAME_PREFIX + ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO);
			de.setValue(contenutoDocumento!=null ? contenutoDocumento.getFilename() : null);
			dati.add(de);
	
			de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setName(Costanti.PARAMETER_FILEID_PREFIX + ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO);
			de.setValue(contenutoDocumento!=null ? contenutoDocumento.getId() : null);
			dati.add(de);
	
			if(!readOnly &&
				contenutoDocumento != null && contenutoDocumento.getValue() != null && contenutoDocumento.getValue().length > 0 && !binaryConsoleItem.isRequired()){
				de = new DataElement();
				de.setBold(true);
				de.setLabel(ProtocolPropertiesCostanti.LABEL_DOCUMENTO_CHANGE_CLEAR_WARNING);
				de.setValue(ProtocolPropertiesCostanti.LABEL_DOCUMENTO_CHANGE_CLEAR);
				de.setType(DataElementType.NOTE);
				de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO_WARN);
				de.setSize(this.getSize());
				dati.add(de);
			}
	
			if(!readOnly && noteAggiornamento!=null) {
				de = new DataElement();
				de.setValue(noteAggiornamento);
				de.setType(DataElementType.NOTE);
				de.setName(ProtocolPropertiesCostanti.PARAMETRO_PP_CONTENUTO_DOCUMENTO_NOTE);
				de.setSize(this.getSize());
				dati.add(de);
			}
			
			if(readOnly) {
				this.pd.disableEditMode();
			}
		}
		
		return dati;
	}

	public ConsoleConfiguration getConsoleDynamicConfiguration(Object idOggettoProprietario, String idProprietario,
			String nomeProprietario, String nomeParentProprietario, ProprietariProtocolProperty tipoProprietario,
			String tipoAccordo, ConsoleOperationType consoleOperationType, 
			IRegistryReader registryReader,IConfigIntegrationReader configRegistryReader,IConsoleDynamicConfiguration consoleDynamicConfiguration) throws ProtocolException{
		try{
			if(tipoProprietario != null && idProprietario != null && idOggettoProprietario != null){
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
					IDAccordo idAccordoCooperazione = (IDAccordo) idOggettoProprietario;
					return consoleDynamicConfiguration.getDynamicConfigAccordoCooperazione(consoleOperationType, this, 
							registryReader, configRegistryReader, idAccordoCooperazione);
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
					IDAccordo idApc = (IDAccordo) idOggettoProprietario;
					if(tipoAccordo.equals(ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_PARTE_COMUNE)){
						return consoleDynamicConfiguration.getDynamicConfigAccordoServizioParteComune(consoleOperationType, this, 
								registryReader, configRegistryReader, idApc);
					} else {
						return consoleDynamicConfiguration.getDynamicConfigAccordoServizioComposto(consoleOperationType, this, 
								registryReader, configRegistryReader, idApc);
					}
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
					IDServizio idAps =(IDServizio) idOggettoProprietario;			
					return consoleDynamicConfiguration.getDynamicConfigAccordoServizioParteSpecifica(consoleOperationType, this, 
							registryReader, configRegistryReader, idAps);
				case AZIONE_ACCORDO:
					IDAccordoAzione idAccordoAzione = (IDAccordoAzione) idOggettoProprietario;
					return consoleDynamicConfiguration.getDynamicConfigAzione(consoleOperationType, this, 
							registryReader, configRegistryReader, idAccordoAzione);
				case FRUITORE:
					IDFruizione idFruizione = (IDFruizione) idOggettoProprietario;
					return consoleDynamicConfiguration.getDynamicConfigFruizioneAccordoServizioParteSpecifica(consoleOperationType, this, 
							registryReader, configRegistryReader, idFruizione);
				case OPERATION:
					IDPortTypeAzione idAzionePt = (IDPortTypeAzione) idOggettoProprietario;
					return consoleDynamicConfiguration.getDynamicConfigOperation(consoleOperationType, this, 
							registryReader, configRegistryReader, idAzionePt);
				case PORT_TYPE:
					IDPortType idPt = (IDPortType) idOggettoProprietario;
					return consoleDynamicConfiguration.getDynamicConfigPortType(consoleOperationType, this, 
							registryReader, configRegistryReader, idPt);
				case RESOURCE:
					IDResource idAccordoRisorsa = (IDResource) idOggettoProprietario;
					String httpMethod = null;
					String path = null;
					try {
						Resource r = registryReader.getResourceAccordo(idAccordoRisorsa);
						httpMethod = r.getMethod()!=null ? r.getMethod().getValue() : null;
						path = r.getPath();
					}catch(Exception e) {}
					return consoleDynamicConfiguration.getDynamicConfigResource(consoleOperationType, this, 
							registryReader, configRegistryReader, idAccordoRisorsa, httpMethod, path);
				case SOGGETTO:
					IDSoggetto idSoggetto = (IDSoggetto) idOggettoProprietario;
					return consoleDynamicConfiguration.getDynamicConfigSoggetto(consoleOperationType, this, 
							registryReader, configRegistryReader, idSoggetto);
				case SERVIZIO_APPLICATIVO:
					IDServizioApplicativo idServizioApplicativo = (IDServizioApplicativo) idOggettoProprietario;
					return consoleDynamicConfiguration.getDynamicConfigServizioApplicativo(consoleOperationType, this, 
							registryReader, configRegistryReader, idServizioApplicativo);
				}
			}

		}  catch (ProtocolException e) {
			throw e;
		} 
		return null;
	}

	public boolean isProtocolPropertiesRegistry(ProprietariProtocolProperty tipoProprietario){
		try{
			if(tipoProprietario != null){
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
				case AZIONE_ACCORDO:
				case FRUITORE:
				case OPERATION:
				case PORT_TYPE:
				case RESOURCE:
				case SOGGETTO:
					return true;
				case SERVIZIO_APPLICATIVO:
					return false;
				}
			}
		}  catch (Exception e) {
			throw e;
		} 

		return false;
	}
	
	public List<ProtocolProperty> getProtocolPropertiesRegistry(Object proprietario, String id, String nome, String idProprietario, String nomeProprietario,
			String nomeParentProprietario, ProprietariProtocolProperty tipoProprietario, String tipoAccordo) throws Exception {
		try{
			if(proprietario != null){
				List<ProtocolProperty> protocolPropertyList  = null;
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
					AccordoCooperazione ac = (AccordoCooperazione) proprietario;
					protocolPropertyList = ac.getProtocolPropertyList();
					break;
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
					AccordoServizioParteComune as = (AccordoServizioParteComune) proprietario;
					protocolPropertyList = as.getProtocolPropertyList();
					break;
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
					AccordoServizioParteSpecifica aps = (AccordoServizioParteSpecifica) proprietario;
					protocolPropertyList = aps.getProtocolPropertyList();
					break;
				case AZIONE_ACCORDO:
					Azione azione = (Azione) proprietario;
					protocolPropertyList = azione.getProtocolPropertyList();
					break;
				case FRUITORE:
					Fruitore fruitore = (Fruitore) proprietario; 
					protocolPropertyList = fruitore.getProtocolPropertyList();
					break;
				case OPERATION:
					org.openspcoop2.core.registry.Operation azionePt = (Operation) proprietario;
					protocolPropertyList = azionePt.getProtocolPropertyList();
					break;
				case PORT_TYPE:
					PortType pt = (PortType) proprietario;
					protocolPropertyList = pt.getProtocolPropertyList();
					break;
				case RESOURCE:
					Resource risorsa = (Resource) proprietario;
					protocolPropertyList = risorsa.getProtocolPropertyList();
					break;
				case SOGGETTO:
					Soggetto soggettoRegistro = (Soggetto) proprietario;
					protocolPropertyList = soggettoRegistro.getProtocolPropertyList();
					break;
				case SERVIZIO_APPLICATIVO:
					throw new Exception("Con il TipoProprietario indicato ("+tipoProprietario+") deve essere invocato il metodo 'getProtocolPropertiesConfig'");
				}

				return protocolPropertyList;
			}
		}  catch (Exception e) {
			throw e;
		} 

		return null;

	}
	
	public List<org.openspcoop2.core.config.ProtocolProperty> getProtocolPropertiesConfig(Object proprietario, String id, String nome, String idProprietario, String nomeProprietario,
			String nomeParentProprietario, ProprietariProtocolProperty tipoProprietario, String tipoAccordo) throws Exception {
		try{
			if(proprietario != null){
				List<org.openspcoop2.core.config.ProtocolProperty> protocolPropertyList  = null;
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
				case AZIONE_ACCORDO:
				case FRUITORE:
				case OPERATION:
				case PORT_TYPE:
				case RESOURCE:
				case SOGGETTO:
					throw new Exception("Con il TipoProprietario indicato ("+tipoProprietario+") deve essere invocato il metodo 'getProtocolPropertiesRegistry'");
				case SERVIZIO_APPLICATIVO:
					ServizioApplicativo servizioApplicativo = (ServizioApplicativo) proprietario;
					protocolPropertyList = servizioApplicativo.getProtocolPropertyList();
					break;
				}

				return protocolPropertyList;
			}
		}  catch (Exception e) {
			throw e;
		} 

		return null;

	}

	public void salvaPropertiesRegistry(String userLogin, boolean smista, Object proprietario, List<ProtocolProperty> protocolPropertiesAggiornate,
			String id, String nome, String idProprietario, String nomeProprietario, String nomeParentProprietario,
			ProprietariProtocolProperty tipoProprietario, String tipoAccordo) throws Exception {
		try{
			if(proprietario != null){
				int idProp = Integer.parseInt(idProprietario);
				boolean save = false;
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
					AccordoCooperazione ac = (AccordoCooperazione) proprietario;
					ac.setProtocolPropertyList(protocolPropertiesAggiornate);
					// salvataggio
					this.core.performUpdateOperation(userLogin, smista, proprietario);
					break;
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
					AccordoServizioParteComune as = (AccordoServizioParteComune) proprietario;
					as.setProtocolPropertyList(protocolPropertiesAggiornate);
					// salvataggio
					this.core.performUpdateOperation(userLogin, smista, proprietario);
					break;
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
					AccordoServizioParteSpecifica aps = (AccordoServizioParteSpecifica) proprietario;
					aps.setProtocolPropertyList(protocolPropertiesAggiornate);
					// salvataggio
					this.core.performUpdateOperation(userLogin, smista, proprietario);
					break;
				case AZIONE_ACCORDO:
					Azione newAzione = (Azione) proprietario;
					AccordoServizioParteComune apca = this.apcCore.getAccordoServizioFull(idProp);
					for(Azione azione: apca.getAzioneList()){
						if(azione.getNome().equals(newAzione.getNome())){
							azione.setProtocolPropertyList(protocolPropertiesAggiornate);
							save = true;
							break;
						}
					}

					// salvataggio
					if(save)
						this.core.performUpdateOperation(userLogin, smista, apca);
					break;
				case FRUITORE:
					Fruitore fruitore = (Fruitore) proprietario; 
					AccordoServizioParteSpecifica apsFrui = this.apsCore.getAccordoServizioParteSpecifica(fruitore.getIdServizio());

					for (Fruitore fr : apsFrui.getFruitoreList()) {
						if(fr.getTipo().equals(fruitore.getTipo()) && fr.getNome().equals(fruitore.getNome())){
							fr.setProtocolPropertyList(protocolPropertiesAggiornate);
							save = true;
							break;
						}
					}

					// salvataggio
					if(save)
						this.core.performUpdateOperation(userLogin, smista, apsFrui);
					break;
				case OPERATION:
					org.openspcoop2.core.registry.Operation newAzionePt = (Operation) proprietario;
					AccordoServizioParteComune apcop = this.apcCore.getAccordoServizioFull(idProp);
					for (PortType pt : apcop.getPortTypeList()) {
						if(pt.getNome().equals(nomeParentProprietario)){
							for (org.openspcoop2.core.registry.Operation azione : pt.getAzioneList()) {
								if(azione.getNome().equals(newAzionePt.getNome())){
									azione.setProtocolPropertyList(protocolPropertiesAggiornate);
									save = true;
									break;
								}
							}
						}
					}
					// salvataggio
					if(save)
						this.core.performUpdateOperation(userLogin, smista, apcop);
					break;
				case PORT_TYPE:
					AccordoServizioParteComune apc = this.apcCore.getAccordoServizioFull(idProp);
					PortType newPt = (PortType) proprietario;

					for (PortType pt : apc.getPortTypeList()) {
						if(pt.getNome().equals(newPt.getNome())){
							pt.setProtocolPropertyList(protocolPropertiesAggiornate);
							save = true;
							break;
						}

					}
					// salvataggio
					if(save)
						this.core.performUpdateOperation(userLogin, smista, apc);
					break;
				case RESOURCE:
					Resource newResource = (Resource) proprietario;
					AccordoServizioParteComune apcr = this.apcCore.getAccordoServizioFull(idProp);
					for(Resource resource: apcr.getResourceList()){
						if(resource.getNome().equals(newResource.getNome())){
							resource.setProtocolPropertyList(protocolPropertiesAggiornate);
							save = true;
							break;
						}
					}

					// salvataggio
					if(save)
						this.core.performUpdateOperation(userLogin, smista, apcr);
					break;
				case SOGGETTO:
					Soggetto soggettoRegistro = (Soggetto) proprietario;
					soggettoRegistro.setProtocolPropertyList(protocolPropertiesAggiornate);
					// salvataggio
					this.core.performUpdateOperation(userLogin, smista, proprietario);
					break;
					
				case SERVIZIO_APPLICATIVO:
					throw new Exception("Con il TipoProprietario indicato ("+tipoProprietario+") deve essere invocato il metodo 'salvaPropertiesRegistry'");
				}
			}
		}  catch (Exception e) {
			throw e;
		}

	}
	
	public void salvaPropertiesConfig(String userLogin, boolean smista, Object proprietario, List<org.openspcoop2.core.config.ProtocolProperty> protocolPropertiesAggiornate,
			String id, String nome, String idProprietario, String nomeProprietario, String nomeParentProprietario,
			ProprietariProtocolProperty tipoProprietario, String tipoAccordo) throws Exception {
		try{
			if(proprietario != null){
				@SuppressWarnings("unused")
				int idProp = Integer.parseInt(idProprietario);
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
				case AZIONE_ACCORDO:
				case FRUITORE:
				case OPERATION:
				case PORT_TYPE:
				case RESOURCE:
				case SOGGETTO:
					throw new Exception("Con il TipoProprietario indicato ("+tipoProprietario+") deve essere invocato il metodo 'salvaPropertiesRegistry'");
					
				case SERVIZIO_APPLICATIVO:
					ServizioApplicativo servizioApplicativo = (ServizioApplicativo) proprietario;
					servizioApplicativo.setProtocolPropertyList(protocolPropertiesAggiornate);
					// salvataggio
					this.core.performUpdateOperation(userLogin, smista, proprietario);
					break;
				}
			}
		}  catch (Exception e) {
			throw e;
		}

	}

	public void validateDynamicConfig(IConsoleDynamicConfiguration consoleDynamicConfiguration, Object idOggettoProprietario, String tipoAccordo, ProprietariProtocolProperty tipoProprietario,
			ConsoleConfiguration consoleConfiguration, ConsoleOperationType consoleOperationType,ProtocolProperties protocolProperties, 
			IRegistryReader registryReader, IConfigIntegrationReader configRegistryReader) throws ProtocolException {
		try{
			if(idOggettoProprietario != null){
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
					IDAccordo idAccordoCooperazione = (IDAccordo) idOggettoProprietario;
					consoleDynamicConfiguration.validateDynamicConfigCooperazione(consoleConfiguration, consoleOperationType, this, protocolProperties, 
							registryReader, configRegistryReader, idAccordoCooperazione);
					break;
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
					IDAccordo idApc = (IDAccordo) idOggettoProprietario;
					
					if(tipoAccordo.equals(ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_PARTE_COMUNE))
						consoleDynamicConfiguration.validateDynamicConfigAccordoServizioParteComune(consoleConfiguration, consoleOperationType, this, protocolProperties, 
								registryReader, configRegistryReader, idApc);
					else 
						consoleDynamicConfiguration.validateDynamicConfigAccordoServizioComposto(consoleConfiguration, consoleOperationType, this, protocolProperties, 
								registryReader, configRegistryReader, idApc);
					break;
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
					IDServizio idAps =(IDServizio) idOggettoProprietario;
					
					consoleDynamicConfiguration.validateDynamicConfigAccordoServizioParteSpecifica(consoleConfiguration, consoleOperationType, this, protocolProperties, 
							registryReader, configRegistryReader, idAps);
					break;
				case AZIONE_ACCORDO:
					IDAccordoAzione idAccordoAzione = (IDAccordoAzione) idOggettoProprietario;
					consoleDynamicConfiguration.validateDynamicConfigAzione(consoleConfiguration, consoleOperationType, this, protocolProperties, 
							registryReader, configRegistryReader, idAccordoAzione);
					break;
				case FRUITORE:
					IDFruizione idFruizione = (IDFruizione) idOggettoProprietario;
					consoleDynamicConfiguration.validateDynamicConfigFruizioneAccordoServizioParteSpecifica(consoleConfiguration, consoleOperationType, this,  protocolProperties, 
							registryReader, configRegistryReader, idFruizione);
					break;
				case OPERATION:
					IDPortTypeAzione idAzionePt = (IDPortTypeAzione) idOggettoProprietario;
					consoleDynamicConfiguration.validateDynamicConfigOperation(consoleConfiguration, consoleOperationType, this, protocolProperties, 
							registryReader, configRegistryReader, idAzionePt);
					break;
				case PORT_TYPE:
					IDPortType idPt = (IDPortType) idOggettoProprietario;
					consoleDynamicConfiguration.validateDynamicConfigPortType(consoleConfiguration, consoleOperationType, this, protocolProperties, 
							registryReader, configRegistryReader, idPt);
					break;
				case RESOURCE:
					IDResource idAccordoRisorsa = (IDResource) idOggettoProprietario;
					String httpMethod = null;
					String path = null;
					try {
						Resource r = registryReader.getResourceAccordo(idAccordoRisorsa);
						httpMethod = r.getMethod()!=null ? r.getMethod().getValue() : null;
						path = r.getPath();
					}catch(Exception e) {}
					consoleDynamicConfiguration.validateDynamicConfigResource(consoleConfiguration, consoleOperationType, this, protocolProperties, 
							registryReader, configRegistryReader, idAccordoRisorsa, httpMethod, path);
					break;
				case SOGGETTO:
					IDSoggetto idSoggetto = (IDSoggetto) idOggettoProprietario;
					consoleDynamicConfiguration.validateDynamicConfigSoggetto(consoleConfiguration, consoleOperationType, this, protocolProperties, 
							registryReader, configRegistryReader, idSoggetto);
					break;
				case SERVIZIO_APPLICATIVO:
					IDServizioApplicativo idServizioApplicativo = (IDServizioApplicativo) idOggettoProprietario;
					consoleDynamicConfiguration.validateDynamicConfigServizioApplicativo(consoleConfiguration, consoleOperationType, this, protocolProperties, 
							registryReader, configRegistryReader, idServizioApplicativo);
					break;
				}
			}
		}catch(ProtocolException e){
			throw e;
		}
	}
	
	public List<Parameter> getTitolo(Object proprietario,ProprietariProtocolProperty tipoProprietario, 
			String id, String nome, String idProprietario, String nomeProprietario, String nomeParentProprietario, String urlChange,String tipoAccordo) throws Exception{
		return getTitolo(proprietario, tipoProprietario, id, nome, idProprietario, nomeProprietario, nomeParentProprietario, urlChange, tipoAccordo,false);
	}
	
	public List<Parameter> getTitolo(Object proprietario,ProprietariProtocolProperty tipoProprietario, 
			String id, String nome, String idProprietario, String nomeProprietario, String nomeParentProprietario, String urlChange,String tipoAccordo, boolean updateUrlChange) throws Exception{
		AccordiServizioParteComuneHelper apcHelper = null;
		AccordiServizioParteSpecificaHelper apsHelper = null;
		Boolean isModalitaVistaApiCustom = ServletUtils.getBooleanAttributeFromSession(ApiCostanti.SESSION_ATTRIBUTE_VISTA_APC_API, this.session, this.request, false).getValue();
		List<Parameter> lstParam = new ArrayList<>();
		String labelProprietario = nomeProprietario;
		String tipoProtocollo = null;
		IDAccordo idAccordoParteComune = null;
		try{
			String urlDecode = URLDecoder.decode(urlChange,"UTF-8");
			String tipologia = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
			boolean gestioneFruitori = false;
			if(tipologia!=null) {
				if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE.equals(tipologia)) {
					gestioneFruitori = true;
				}
			}
			
			Parameter pTipoAccordo = new Parameter(AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo).getName(), AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo).getValue());
			Parameter pIdApc = null;
			Parameter pNomeApc = null;
			
			if(proprietario != null){
				int idProp = Integer.parseInt(idProprietario);
				switch (tipoProprietario) {
				case ACCORDO_COOPERAZIONE:
					AccordoCooperazione ac = (AccordoCooperazione) proprietario;
					lstParam.add(new Parameter(AccordiCooperazioneCostanti.LABEL_ACCORDI_COOPERAZIONE, AccordiCooperazioneCostanti.SERVLET_NAME_ACCORDI_COOPERAZIONE_LIST));
					labelProprietario = this.getLabelIdAccordoCooperazione(ac);
					// Escape della url del link, risolve il problema di autorizzazione
					lstParam.add(new Parameter(labelProprietario,urlDecode));
					break;
				case ACCORDO_SERVIZIO_PARTE_COMUNE:
					apcHelper = new AccordiServizioParteComuneHelper(this.request, this.pd, this.session); 
					AccordoServizioParteComune as = (AccordoServizioParteComune) proprietario;
					idAccordoParteComune = this.idAccordoFactory.getIDAccordoFromValues(as.getNome(),BeanUtilities.getSoggettoReferenteID(as.getSoggettoReferente()),as.getVersione());
					tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(as.getSoggettoReferente().getTipo());
					labelProprietario = this.getLabelIdAccordo(tipoProtocollo , idAccordoParteComune); 
					
					List<Parameter> parametriDaUrlAs = Parameter.estraiParametriDaUrl(urlDecode);
					String parParz = null;
					for (Parameter parameter : parametriDaUrlAs) {
						if(parameter.getName().equals(ApiCostanti.PARAMETRO_APC_API_GESTIONE_PARZIALE)) {
							parParz = parameter.getValue();
							break;
						}
					}
					
					lstParam = apcHelper.getTitoloApc(TipoOperazione.OTHER, as, tipoAccordo, labelProprietario, AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, parParz, true);
					lstParam.get(lstParam.size() -1).setValue(urlDecode); 
//					lstParam.add(new Parameter(labelProprietario,urlDecode));
					break;
				case ACCORDO_SERVIZIO_PARTE_SPECIFICA:
					apsHelper = new AccordiServizioParteSpecificaHelper(this.request, this.pd, this.session); 
					AccordoServizioParteSpecifica aps = (AccordoServizioParteSpecifica) proprietario;
					
					List<Parameter> parametriDaUrlAps = Parameter.estraiParametriDaUrl(urlDecode);
					String tipoSoggettoFruitore = null;
					String nomeSoggettoFruitore = null;
					for (Parameter parameter : parametriDaUrlAps) {
						if(parameter.getName().equals(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE)) {
							tipoSoggettoFruitore = parameter.getValue();
							break;
						}
					}
					
					for (Parameter parameter : parametriDaUrlAps) {
						if(parameter.getName().equals(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE)) {
							nomeSoggettoFruitore = parameter.getValue();
							break;
						}
					}
					
					tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(aps.getTipoSoggettoErogatore());
					if(gestioneFruitori) {
						IDSoggetto idSoggettoFruitore = null;
						if(tipoSoggettoFruitore!=null && !"".equals(tipoSoggettoFruitore) &&
								nomeSoggettoFruitore!=null && !"".equals(nomeSoggettoFruitore)) {
							idSoggettoFruitore = new IDSoggetto(tipoSoggettoFruitore, nomeSoggettoFruitore);
						}
						labelProprietario = apsHelper.getLabelServizioFruizione(tipoProtocollo, idSoggettoFruitore, aps);
					}
					else {
						labelProprietario = apsHelper.getLabelServizioErogazione(tipoProtocollo, aps);
					}
					
					lstParam = apsHelper.getTitoloAps(TipoOperazione.OTHER, aps, gestioneFruitori, labelProprietario, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE, true, tipoSoggettoFruitore, nomeSoggettoFruitore);
					lstParam.get(lstParam.size() -1).setName(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_PROTOCOLLO); 
					lstParam.get(lstParam.size() -1).setValue(urlDecode); 
					// Escape della url del link, risolve il problema di autorizzazione
//					lstParam.add(new Parameter(labelProprietario,urlDecode));
					break;
				case AZIONE_ACCORDO:
					Azione newAzione = (Azione) proprietario;
					AccordoServizioParteComune apca = this.apcCore.getAccordoServizioFull(idProp);
					for(Azione azione: apca.getAzioneList()){
						if(azione.getNome().equals(newAzione.getNome())){
							labelProprietario = azione.getNome();
							break;
						}
					}
					
					tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(apca.getSoggettoReferente().getTipo());
					idAccordoParteComune = this.idAccordoFactory.getIDAccordoFromValues(apca.getNome(),BeanUtilities.getSoggettoReferenteID(apca.getSoggettoReferente()),apca.getVersione());
					pIdApc = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ID, apca.getId()+"");
					pNomeApc = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_NOME, apca.getNome());
					
					lstParam.add(new Parameter(AccordiServizioParteComuneUtilities.getTerminologiaAccordoServizio(tipoAccordo), AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_LIST, pTipoAccordo));
					lstParam.add(new Parameter(AccordiServizioParteComuneCostanti.LABEL_AZIONI + " di " + this.getLabelIdAccordo(tipoProtocollo , idAccordoParteComune), 
							AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_AZIONI_LIST, pIdApc,pNomeApc, pTipoAccordo));
					// Escape della url del link, risolve il problema di autorizzazione
					lstParam.add(new Parameter(labelProprietario,urlDecode));
					break;
				case FRUITORE:
					Fruitore fruitore = (Fruitore) proprietario; 
					AccordoServizioParteSpecifica apsFrui = this.apsCore.getAccordoServizioParteSpecifica(fruitore.getIdServizio());
					
					for (Fruitore fr : apsFrui.getFruitoreList()) {
						if(fr.getTipo().equals(fruitore.getTipo()) && fr.getNome().equals(fruitore.getNome())){
							tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(fr.getTipo());
							labelProprietario = this.getLabelNomeSoggetto(tipoProtocollo, fr.getTipo() , fr.getNome());
							break;
						}
					}
					
					// prelevo il flag che mi dice da quale pagina ho acceduto la sezione delle porte delegate
					Integer parentPD = ServletUtils.getIntegerAttributeFromSession(PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT, this.session, this.request);
					if(parentPD == null) 
						parentPD = PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT_NONE;
					
					PorteDelegateHelper porteDelegateHelper = new PorteDelegateHelper(this.request, this.pd, this.session);
					lstParam = porteDelegateHelper.getTitoloPD(PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT_CONFIGURAZIONE, fruitore.getIdSoggetto() +"",apsFrui.getId() +"", fruitore.getId() +"");
					labelProprietario = AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_PROTOCOLLO; 
					lstParam.set(lstParam.size()-1, new Parameter(labelProprietario, urlDecode));
					
					break;
				case OPERATION:
					apcHelper = new AccordiServizioParteComuneHelper(this.request, this.pd, this.session); 
					org.openspcoop2.core.registry.Operation newAzionePt = (Operation) proprietario;
					AccordoServizioParteComune apcop = this.apcCore.getAccordoServizioFull(idProp);
					for (PortType pt : apcop.getPortTypeList()) {
						if(pt.getNome().equals(nomeParentProprietario)){
							for (org.openspcoop2.core.registry.Operation azione : pt.getAzioneList()) {
								if(azione.getNome().equals(newAzionePt.getNome())){
									labelProprietario = azione.getNome();
									break;
								}
							}
						}
					}
					
					tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(apcop.getSoggettoReferente().getTipo());
					idAccordoParteComune = this.idAccordoFactory.getIDAccordoFromValues(apcop.getNome(),BeanUtilities.getSoggettoReferenteID(apcop.getSoggettoReferente()),apcop.getVersione());
					pIdApc = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ID, apcop.getId()+"");
					pNomeApc = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_NOME, apcop.getNome());
					Parameter pNomePt = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_PORT_TYPES_NOME, nomeParentProprietario);
					lstParam = apcHelper.getTitoloApc(TipoOperazione.OTHER, apcop, tipoAccordo, this.getLabelIdAccordo(tipoProtocollo , idAccordoParteComune), null, false);
					String labelPortTypesOp = isModalitaVistaApiCustom ? AccordiServizioParteComuneCostanti.LABEL_PORT_TYPES : AccordiServizioParteComuneCostanti.LABEL_PORT_TYPES + " di " + this.getLabelIdAccordo(tipoProtocollo , idAccordoParteComune);
					lstParam.add(new Parameter(labelPortTypesOp, AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_PORT_TYPES_LIST, pIdApc,pNomeApc, pTipoAccordo));
					lstParam.add(new Parameter(AccordiServizioParteComuneCostanti.LABEL_AZIONI + " di " + nomeParentProprietario,	AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_PORT_TYPE_OPERATIONS_LIST,pIdApc,pNomePt,pTipoAccordo));
					// Escape della url del link, risolve il problema di autorizzazione
					lstParam.add(new Parameter(labelProprietario,urlDecode));
					break;
				case PORT_TYPE:
					apcHelper = new AccordiServizioParteComuneHelper(this.request, this.pd, this.session); 
					AccordoServizioParteComune apc = this.apcCore.getAccordoServizioFull(idProp);
					PortType newPt = (PortType) proprietario;

					for (PortType pt : apc.getPortTypeList()) {
						if(pt.getNome().equals(newPt.getNome())){
							labelProprietario = pt.getNome();
							break;
						}

					}
					pIdApc = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ID, apc.getId()+"");
					pNomeApc = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_NOME, apc.getNome());
					idAccordoParteComune = this.idAccordoFactory.getIDAccordoFromValues(apc.getNome(),BeanUtilities.getSoggettoReferenteID(apc.getSoggettoReferente()),apc.getVersione());
					tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(apc.getSoggettoReferente().getTipo());
					lstParam = apcHelper.getTitoloApc(TipoOperazione.OTHER, apc, tipoAccordo, this.getLabelIdAccordo(tipoProtocollo , idAccordoParteComune), null, false);
					String labelPortTypes = isModalitaVistaApiCustom ? AccordiServizioParteComuneCostanti.LABEL_PORT_TYPES : AccordiServizioParteComuneCostanti.LABEL_PORT_TYPES + " di " + this.getLabelIdAccordo(tipoProtocollo , idAccordoParteComune);
					lstParam.add(new Parameter(labelPortTypes, AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_PORT_TYPES_LIST, pIdApc, pNomeApc, pNomeApc));

					// Escape della url del link, risolve il problema di autorizzazione
					lstParam.add(new Parameter(labelProprietario,urlDecode));
					break;
				case RESOURCE:
					apcHelper = new AccordiServizioParteComuneHelper(this.request, this.pd, this.session); 
					Resource newResource = (Resource) proprietario;
					AccordoServizioParteComune apcr = this.apcCore.getAccordoServizioFull(idProp);
					Long idRs = newResource.getId();
					for(Resource resource: apcr.getResourceList()){
						if(resource.getNome().equals(newResource.getNome())){
//							labelProprietario =  APIUtils.normalizeResourceName(HttpMethod.toEnumConstant(resource.get_value_method()), resource.getPath());
							labelProprietario = resource.getNome();
							idRs = resource.getId();
							break;
						}
					}
					
					Parameter pLabelProprietario = new Parameter(labelProprietario,urlDecode);
					if(updateUrlChange) {
						List<Parameter> parametriDaUrl = Parameter.estraiParametriDaUrl(urlDecode);
						String pathDaUrl = Parameter.estraiPathDaUrl(urlDecode);
						
						for (Parameter parameter : parametriDaUrl) {
							if(parameter.getName().equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_RESOURCES_ID)) {
								parameter.setValue(idRs+"");
								break;
							}
						}

						pLabelProprietario = new Parameter(labelProprietario,pathDaUrl,parametriDaUrl);
					}
					
					
					
					tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(apcr.getSoggettoReferente().getTipo());
					idAccordoParteComune = this.idAccordoFactory.getIDAccordoFromValues(apcr.getNome(),BeanUtilities.getSoggettoReferenteID(apcr.getSoggettoReferente()),apcr.getVersione());
					pIdApc = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ID, apcr.getId()+"");
					pNomeApc = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_NOME, apcr.getNome());
					lstParam = apcHelper.getTitoloApc(TipoOperazione.OTHER, apcr, tipoAccordo, this.getLabelIdAccordo(tipoProtocollo , idAccordoParteComune), null, false);
					String labelRisorse = isModalitaVistaApiCustom ? AccordiServizioParteComuneCostanti.LABEL_RISORSE : AccordiServizioParteComuneCostanti.LABEL_RISORSE + " di " + this.getLabelIdAccordo(tipoProtocollo , idAccordoParteComune);
					lstParam.add(new Parameter(labelRisorse, AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_RESOURCES_LIST, pIdApc,pNomeApc, pTipoAccordo));
					// Escape della url del link, risolve il problema di autorizzazione
					lstParam.add(pLabelProprietario);
					break;
				case SOGGETTO:
					Soggetto soggettoRegistro = (Soggetto) proprietario;
					lstParam.add(new Parameter(SoggettiCostanti.LABEL_SOGGETTI, SoggettiCostanti.SERVLET_NAME_SOGGETTI_LIST));
					tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(soggettoRegistro.getTipo());
					labelProprietario = this.getLabelNomeSoggetto(tipoProtocollo, soggettoRegistro.getTipo() , soggettoRegistro.getNome());
					// Escape della url del link, risolve il problema di autorizzazione
					lstParam.add(new Parameter(labelProprietario,urlDecode));
					break;
				case SERVIZIO_APPLICATIVO:
					ServizioApplicativo servizioApplicativo = (ServizioApplicativo) proprietario;
					
					Integer parentSA = ServletUtils.getIntegerAttributeFromSession(ServiziApplicativiCostanti.ATTRIBUTO_SERVIZI_APPLICATIVI_PARENT, this.session, this.request);
					if(parentSA == null) parentSA = ServiziApplicativiCostanti.ATTRIBUTO_SERVIZI_APPLICATIVI_PARENT_NONE;
					Boolean useIdSogg = parentSA == ServiziApplicativiCostanti.ATTRIBUTO_SERVIZI_APPLICATIVI_PARENT_SOGGETTO;
					
					String labelApplicativi = ServiziApplicativiCostanti.LABEL_SERVIZI_APPLICATIVI;
					String labelApplicativiDi = ServiziApplicativiCostanti.LABEL_PARAMETRO_SERVIZI_APPLICATIVI_DI;
					if(this.isModalitaCompleta()==false) {
						labelApplicativi = ServiziApplicativiCostanti.LABEL_APPLICATIVI;
						labelApplicativiDi = ServiziApplicativiCostanti.LABEL_PARAMETRO_APPLICATIVI_DI;
					}
					
					if(useIdSogg){
						
						tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(servizioApplicativo.getTipoSoggettoProprietario());
						String tipoENomeSoggetto = this.getLabelNomeSoggetto(tipoProtocollo, servizioApplicativo.getTipoSoggettoProprietario(), servizioApplicativo.getNomeSoggettoProprietario());
						
						lstParam.add(new Parameter(ServiziApplicativiCostanti.LABEL_PARAMETRO_SERVIZI_APPLICATIVI_SOGGETTI, SoggettiCostanti.SERVLET_NAME_SOGGETTI_LIST));
						lstParam.add(new Parameter(labelApplicativiDi + tipoENomeSoggetto,
										ServiziApplicativiCostanti.SERVLET_NAME_SERVIZI_APPLICATIVI_LIST,
										new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_PROVIDER,servizioApplicativo.getIdSoggetto()+"")));								
						// Escape della url del link, risolve il problema di autorizzazione
						lstParam.add(new Parameter(nome, urlDecode));
					}else {
						lstParam.add(new Parameter(labelApplicativi, ServiziApplicativiCostanti.SERVLET_NAME_SERVIZI_APPLICATIVI_LIST));
						// Escape della url del link, risolve il problema di autorizzazione
						lstParam.add(new Parameter(servizioApplicativo.getNome(), urlDecode));
					}
					break;
				}
			}
		}  catch (Exception e) {
			throw e;
		}
		return lstParam;
	}
}