AccordiServizioParteSpecificaHelper.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.aps;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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

import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts.upload.FormFile;
import org.openspcoop2.core.allarmi.constants.RuoloPorta;
import org.openspcoop2.core.commons.Filtri;
import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.core.commons.SearchUtils;
import org.openspcoop2.core.config.CanaleConfigurazione;
import org.openspcoop2.core.config.Configurazione;
import org.openspcoop2.core.config.GenericProperties;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaApplicativaServizio;
import org.openspcoop2.core.config.PortaApplicativaServizioApplicativo;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.PortaDelegataServizio;
import org.openspcoop2.core.config.Property;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.TrasformazioneRegola;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.constants.MTOMProcessorType;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.config.constants.TipoAutenticazionePrincipal;
import org.openspcoop2.core.config.constants.TipoAutorizzazione;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.constants.TipiConnettore;
import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDPortaApplicativa;
import org.openspcoop2.core.id.IDPortaDelegata;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.mapping.MappingErogazionePortaApplicativa;
import org.openspcoop2.core.mapping.MappingFruizionePortaDelegata;
import org.openspcoop2.core.mvc.properties.utils.ConfigManager;
import org.openspcoop2.core.mvc.properties.utils.PropertiesSourceConfiguration;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.ConfigurazioneServizioAzione;
import org.openspcoop2.core.registry.Connettore;
import org.openspcoop2.core.registry.Documento;
import org.openspcoop2.core.registry.Fruitore;
import org.openspcoop2.core.registry.ProprietaOggetto;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.beans.AccordoServizioParteComuneSintetico;
import org.openspcoop2.core.registry.beans.AzioneSintetica;
import org.openspcoop2.core.registry.beans.OperationSintetica;
import org.openspcoop2.core.registry.beans.PortTypeSintetico;
import org.openspcoop2.core.registry.beans.ResourceSintetica;
import org.openspcoop2.core.registry.constants.FormatoSpecifica;
import org.openspcoop2.core.registry.constants.PddTipologia;
import org.openspcoop2.core.registry.constants.ProprietariDocumento;
import org.openspcoop2.core.registry.constants.RuoliDocumento;
import org.openspcoop2.core.registry.constants.StatiAccordo;
import org.openspcoop2.core.registry.constants.TipiDocumentoLivelloServizio;
import org.openspcoop2.core.registry.constants.TipiDocumentoSemiformale;
import org.openspcoop2.core.registry.constants.TipiDocumentoSicurezza;
import org.openspcoop2.core.registry.constants.TipologiaServizio;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.monitor.engine.alarm.wrapper.ConfigurazioneAllarmeBean;
import org.openspcoop2.protocol.basic.config.ImplementationConfiguration;
import org.openspcoop2.protocol.basic.config.SubscriptionConfiguration;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.constants.ArchiveType;
import org.openspcoop2.protocol.sdk.validator.ValidazioneResult;
import org.openspcoop2.utils.BooleanNullable;
import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.core.ControlStationCoreException;
import org.openspcoop2.web.ctrlstat.costanti.CostantiControlStation;
import org.openspcoop2.web.ctrlstat.plugins.ExtendedConnettore;
import org.openspcoop2.web.ctrlstat.plugins.IExtendedListServlet;
import org.openspcoop2.web.ctrlstat.servlet.ConsoleHelper;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneUtilities;
import org.openspcoop2.web.ctrlstat.servlet.aps.erogazioni.ErogazioniCostanti;
import org.openspcoop2.web.ctrlstat.servlet.archivi.ArchiviCostanti;
import org.openspcoop2.web.ctrlstat.servlet.archivi.ExporterUtils;
import org.openspcoop2.web.ctrlstat.servlet.config.ConfigurazioneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.connettori.ConnettoriCostanti;
import org.openspcoop2.web.ctrlstat.servlet.connettori.ConnettoriHelper;
import org.openspcoop2.web.ctrlstat.servlet.pa.PorteApplicativeCostanti;
import org.openspcoop2.web.ctrlstat.servlet.pd.PorteDelegateCostanti;
import org.openspcoop2.web.ctrlstat.servlet.sa.ServiziApplicativiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.utils.ProprietaOggettoRegistro;
import org.openspcoop2.web.lib.mvc.AreaBottoni;
import org.openspcoop2.web.lib.mvc.BinaryParameter;
import org.openspcoop2.web.lib.mvc.CheckboxStatusType;
import org.openspcoop2.web.lib.mvc.Costanti;
import org.openspcoop2.web.lib.mvc.DataElement;
import org.openspcoop2.web.lib.mvc.DataElementImage;
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;
import org.openspcoop2.web.lib.users.dao.User;

/**
 * AccordiServizioParteSpecificaHelper
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class AccordiServizioParteSpecificaHelper extends ConnettoriHelper {

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


	// Controlla i dati dei WSDL degli Accordi e dei Servizi
	boolean accordiParteSpecificaWSDLCheckData(PageData pd,String tipo, String wsdl, 
			AccordoServizioParteSpecifica aps, AccordoServizioParteComune apc,boolean validazioneDocumenti) throws Exception {

		if(validazioneDocumenti){
			
			FormatoSpecifica formato = null;
			if(apc!=null) {
				formato = apc.getFormatoSpecifica();
			}
			
			boolean  validazioneParteSpecifica = false;
			if (tipo.equals(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE)) {
				byte [] tmp = this.apsCore.getInterfaceAsByteArray(formato, wsdl);
				aps.setByteWsdlImplementativoErogatore(tmp);
				validazioneParteSpecifica = true;
			}
			else if (tipo.equals(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE)) {
				byte [] tmp = this.apsCore.getInterfaceAsByteArray(formato, wsdl);
				aps.setByteWsdlImplementativoFruitore(tmp);
				validazioneParteSpecifica = true;
			}

			if(validazioneParteSpecifica){
				ValidazioneResult result = this.apsCore.validaInterfacciaWsdlParteSpecifica(aps, apc, this.soggettiCore);
				if(result.isEsito()==false){
					pd.setMessage(result.getMessaggioErrore());
				}
				return result.isEsito();
			}
		}

		return true;
	}
	
	// Controlla i dati dei WSDL degli Accordi e dei Servizi
	boolean accordiParteSpecificaFruitoreWSDLCheckData(PageData pd,String tipo, String wsdl, 
			Fruitore fruitore,AccordoServizioParteSpecifica aps, AccordoServizioParteComune apc,boolean validazioneDocumenti) throws Exception {

		if(validazioneDocumenti){

			FormatoSpecifica formato = null;
			if(apc!=null) {
				formato = apc.getFormatoSpecifica();
			}
			
			boolean  validazioneParteSpecifica = false;
			if (tipo.equals(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE)) {
				byte [] tmp = this.apsCore.getInterfaceAsByteArray(formato, wsdl);
				fruitore.setByteWsdlImplementativoErogatore(tmp);
				validazioneParteSpecifica = true;
			}
			else if (tipo.equals(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE)) {
				byte [] tmp = this.apsCore.getInterfaceAsByteArray(formato, wsdl);
				fruitore.setByteWsdlImplementativoFruitore(tmp);
				validazioneParteSpecifica = true;
			}

			if(validazioneParteSpecifica){
				ValidazioneResult result = this.apsCore.validaInterfacciaWsdlParteSpecifica(fruitore, (AccordoServizioParteSpecifica) aps.clone(), apc, this.soggettiCore);
				if(result.isEsito()==false){
					pd.setMessage(result.getMessaggioErrore());
				}
				return result.isEsito();
			}
		}

		return true;
	}

	private boolean existsOperazione(AccordoServizioParteComuneSintetico aspc, ServiceBinding serviceBinding, String portType, String azione) {
		if(ServiceBinding.REST.equals(serviceBinding)) {
			if(aspc.getResource()!=null && !aspc.getResource().isEmpty()) {
				for (ResourceSintetica resource : aspc.getResource()) {
					if(resource.getNome().equals(azione)) {
						return true;
					}
				}
			}
		}
		else {
			if(portType!=null && !"".equals(portType)) {
				if(aspc.getPortType()!=null && !aspc.getPortType().isEmpty()) {
					for (PortTypeSintetico pt : aspc.getPortType()) {
						if(portType.equals(pt.getNome())) {
							if(pt.getAzione()!=null && !pt.getAzione().isEmpty()) {
								for (OperationSintetica az : pt.getAzione()) {
									if(az.getNome().equals(azione)) {
										return true;
									}
								}
							}
							break;
						}
					}
				}
			}
			else {
				if(aspc.getAzione()!=null && !aspc.getAzione().isEmpty()) {
					for (AzioneSintetica az : aspc.getAzione()) {
						if(az.getNome().equals(azione)) {
							return true;
						}
					}
				}
			}
		}
		
		return false;
	}
	private boolean checkModificaVersioneApi(AccordoServizioParteSpecifica servizio, 
			long idAccordo, ServiceBinding serviceBinding, String portType,
			boolean gestioneFruitori, boolean gestioneErogatori) throws Exception {
		List<String> erogazione_listTrasformazioniPredefinito = null;
		List<String> erogazione_listRateLimitingPredefinito = null;
		List<String> erogazione_listAllarmePredefinito = null;
		HashMap<String, List<String>> erogazione_mapGruppi = new HashMap<>();
		
		HashMap<String, List<String>> fruizione_listTrasformazioniPredefinito = null;
		HashMap<String, List<String>> fruizione_listRateLimitingPredefinito = null;
		HashMap<String, List<String>> fruizione_listAllarmePredefinito = null;
		HashMap<String,HashMap<String, List<String>>> fruizione_mapGruppi = new HashMap<String,HashMap<String, List<String>>>();
		
		
		IDServizio idService = this.idServizioFactory.getIDServizioFromAccordo(servizio);
		
		List<MappingErogazionePortaApplicativa> listaMappingErogazione = null;
		try{
			listaMappingErogazione = this.apsCore.mappingServiziPorteAppList(idService,servizio.getId(), null);
		}catch(Exception e) {
			// ignore
		}
		if(listaMappingErogazione!=null && !listaMappingErogazione.isEmpty()) {
			for (MappingErogazionePortaApplicativa mappingErogazionePortaApplicativa : listaMappingErogazione) {
				PortaApplicativa pa = null;
				try {
					pa = this.porteApplicativeCore.getPortaApplicativa(mappingErogazionePortaApplicativa.getIdPortaApplicativa());
				}catch(Exception e) {
					// ignore
				}
				if(pa!=null) {
					if(mappingErogazionePortaApplicativa.isDefault()) {
						if(pa.getTrasformazioni()!=null && pa.getTrasformazioni().sizeRegolaList()>0) {
							for (TrasformazioneRegola regola :  pa.getTrasformazioni().getRegolaList()) {
								if(regola.getApplicabilita()!=null && regola.getApplicabilita().sizeAzioneList()>0) {
									if(erogazione_listTrasformazioniPredefinito==null) {
										erogazione_listTrasformazioniPredefinito = regola.getApplicabilita().getAzioneList();
									}
									else {
										for (String az : regola.getApplicabilita().getAzioneList()) {
											if(!erogazione_listTrasformazioniPredefinito.contains(az)) {
												erogazione_listTrasformazioniPredefinito.add(az);
											}
										}
									}
								}
							}
						}
						List<AttivazionePolicy> listaPolicies = null;
						try {
							ConsoleSearch ricercaPolicies = new ConsoleSearch(true);
							listaPolicies = this.confCore.attivazionePolicyList(ricercaPolicies, RuoloPolicy.APPLICATIVA, pa.getNome());
						}catch(Exception e) {
							// ignore
						}
						if(listaPolicies!=null && !listaPolicies.isEmpty()) {
							for (AttivazionePolicy ap : listaPolicies) {
								if(ap.getFiltro()!=null && ap.getFiltro().getAzione()!=null) {
									String [] tmp = ap.getFiltro().getAzione().split(",");
									if(tmp!=null && tmp.length>0) {
										if(erogazione_listRateLimitingPredefinito==null) {
											erogazione_listRateLimitingPredefinito = new ArrayList<>();
										}
										for (String az : tmp) {
											if(!erogazione_listRateLimitingPredefinito.contains(az)) {
												erogazione_listRateLimitingPredefinito.add(az);
											}	
										}
									}
								}
							}
						}
						if(this.confCore.isConfigurazioneAllarmiEnabled()) {
							List<ConfigurazioneAllarmeBean> listaAllarmi = null;
							try {
								ConsoleSearch ricercaPolicies = new ConsoleSearch(true);
								listaAllarmi = this.confCore.allarmiList(ricercaPolicies, RuoloPorta.APPLICATIVA, pa.getNome());
							}catch(Exception e) {
								// ignore
							}
							if(listaAllarmi!=null && !listaAllarmi.isEmpty()) {
								for (ConfigurazioneAllarmeBean allarme : listaAllarmi) {
									if(allarme.getFiltro()!=null && allarme.getFiltro().getAzione()!=null) {
										String [] tmp = allarme.getFiltro().getAzione().split(",");
										if(tmp!=null && tmp.length>0) {
											if(erogazione_listAllarmePredefinito==null) {
												erogazione_listAllarmePredefinito = new ArrayList<>();
											}
											for (String az : tmp) {
												if(!erogazione_listAllarmePredefinito.contains(az)) {
													erogazione_listAllarmePredefinito.add(az);
												}	
											}
										}
									}
								}
							}
						}
					}
					else {
						if(pa.getAzione()!=null && pa.getAzione().sizeAzioneDelegataList()>0) {
							List<String> l = new ArrayList<>();
							for (String az : pa.getAzione().getAzioneDelegataList()) {
								l.add(az);
							}
							erogazione_mapGruppi.put(mappingErogazionePortaApplicativa.getDescrizione(), l);
						}
					}
				}
			}
		}
		
		if(servizio.sizeFruitoreList()>0) {
			for (Fruitore fruitore : servizio.getFruitoreList()) {
				IDSoggetto idFruitore = new IDSoggetto(fruitore.getTipo(), fruitore.getNome());
				String labelFruitore = ConsoleHelper._getLabelNomeSoggetto(idFruitore);
				
				List<MappingFruizionePortaDelegata> listaMappingFruizione = null;
				try{
					listaMappingFruizione = this.apsCore.serviziFruitoriMappingList(idFruitore, idService, null);
				}catch(Exception e) {
					// ignore
				}
				if(listaMappingFruizione!=null && !listaMappingFruizione.isEmpty()) {
					for (MappingFruizionePortaDelegata mappingFruizionePortaDelegata : listaMappingFruizione) {
						PortaDelegata pd = null;
						try {
							pd = this.porteDelegateCore.getPortaDelegata(mappingFruizionePortaDelegata.getIdPortaDelegata());
						}catch(Exception e) {
							// ignore
						}
						if(pd!=null) {
							if(mappingFruizionePortaDelegata.isDefault()) {
								if(pd.getTrasformazioni()!=null && pd.getTrasformazioni().sizeRegolaList()>0) {
									List<String> list = null;
									for (TrasformazioneRegola regola :  pd.getTrasformazioni().getRegolaList()) {
										if(regola.getApplicabilita()!=null && regola.getApplicabilita().sizeAzioneList()>0) {
											if(list==null) {
												list = regola.getApplicabilita().getAzioneList();
											}
											else {
												for (String az : regola.getApplicabilita().getAzioneList()) {
													if(!list.contains(az)) {
														list.add(az);
													}
												}
											}
										}
									}
									if(list!=null) {
										if(fruizione_listTrasformazioniPredefinito==null) {
											fruizione_listTrasformazioniPredefinito = new HashMap<>();
										}
										fruizione_listTrasformazioniPredefinito.put(labelFruitore, list);
									}
								}
								List<AttivazionePolicy> listaPolicies = null;
								try {
									ConsoleSearch ricercaPolicies = new ConsoleSearch(true);
									listaPolicies = this.confCore.attivazionePolicyList(ricercaPolicies, RuoloPolicy.DELEGATA, pd.getNome());
								}catch(Exception e) {
									// ignore
								}
								if(listaPolicies!=null && !listaPolicies.isEmpty()) {
									List<String> list = null;
									for (AttivazionePolicy ap : listaPolicies) {
										if(ap.getFiltro()!=null && ap.getFiltro().getAzione()!=null) {
											String [] tmp = ap.getFiltro().getAzione().split(",");
											if(tmp!=null && tmp.length>0) {
												if(list==null) {
													list = new ArrayList<>();
												}
												for (String az : tmp) {
													if(!list.contains(az)) {
														list.add(az);
													}	
												}
											}
										}
									}
									if(list!=null) {
										if(fruizione_listRateLimitingPredefinito==null) {
											fruizione_listRateLimitingPredefinito = new HashMap<>();
										}
										fruizione_listRateLimitingPredefinito.put(labelFruitore, list);
									}
								}
								if(this.confCore.isConfigurazioneAllarmiEnabled()) {
									List<ConfigurazioneAllarmeBean> listaAllarmi = null;
									try {
										ConsoleSearch ricercaPolicies = new ConsoleSearch(true);
										listaAllarmi = this.confCore.allarmiList(ricercaPolicies, RuoloPorta.DELEGATA, pd.getNome());
									}catch(Exception e) {
										// ignore
									}
									if(listaAllarmi!=null && !listaAllarmi.isEmpty()) {
										List<String> list = null;
										for (ConfigurazioneAllarmeBean allarme : listaAllarmi) {
											if(allarme.getFiltro()!=null && allarme.getFiltro().getAzione()!=null) {
												String [] tmp = allarme.getFiltro().getAzione().split(",");
												if(tmp!=null && tmp.length>0) {
													if(list==null) {
														list = new ArrayList<>();
													}
													for (String az : tmp) {
														if(!list.contains(az)) {
															list.add(az);
														}	
													}
												}
											}
										}
										if(list!=null) {
											if(fruizione_listAllarmePredefinito==null) {
												fruizione_listAllarmePredefinito = new HashMap<>();
											}
											fruizione_listAllarmePredefinito.put(labelFruitore, list);
										}
									}
								}
							}
							else {
								if(pd.getAzione()!=null && pd.getAzione().sizeAzioneDelegataList()>0) {
									List<String> l = new ArrayList<>();
									for (String az : pd.getAzione().getAzioneDelegataList()) {
										l.add(az);
									}
									HashMap<String, List<String>> m = new HashMap<>();
									m.put(mappingFruizionePortaDelegata.getDescrizione(), l);
									fruizione_mapGruppi.put(labelFruitore, m);
								}
							}
						}
					}
				}
			}
		}
		
		StringBuilder sbError = new StringBuilder();
		
		AccordoServizioParteComuneSintetico asSintetico = null;
		boolean azioniInErogazione = !erogazione_mapGruppi.isEmpty() || erogazione_listRateLimitingPredefinito!=null || erogazione_listAllarmePredefinito!=null || erogazione_listTrasformazioniPredefinito!=null;
		boolean azioniInFruizione = !fruizione_mapGruppi.isEmpty() || fruizione_listRateLimitingPredefinito!=null || fruizione_listAllarmePredefinito!=null || fruizione_listTrasformazioniPredefinito!=null;
		if( azioniInErogazione
				||
				azioniInFruizione )
			 {
			asSintetico = this.apcCore.getAccordoServizioSintetico(idAccordo);
			
			if(!erogazione_mapGruppi.isEmpty() ) {
				for (String gruppo : erogazione_mapGruppi.keySet()) {
					List<String> azioni = erogazione_mapGruppi.get(gruppo);
					List<String> azioniNonTrovate = new ArrayList<>();
					if(azioni!=null && !azioni.isEmpty()) {
						for (String az : azioni) {
							if(!existsOperazione(asSintetico, serviceBinding, portType, az)) {
								azioniNonTrovate.add(az);
							}
						}
					}
					if(!azioniNonTrovate.isEmpty()) {
						if(sbError.length()>0) {
							sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
						}
						sbError.append("Gruppo '"+gruppo+"' (Erogazione): "+azioniNonTrovate);
					}
				}
			}
			
			if(erogazione_listTrasformazioniPredefinito!=null && !erogazione_listTrasformazioniPredefinito.isEmpty()) {
				List<String> azioniNonTrovate = new ArrayList<>();
				for (String az : erogazione_listTrasformazioniPredefinito) {
					if(!existsOperazione(asSintetico, serviceBinding, portType, az)) {
						azioniNonTrovate.add(az);
					}
				}
				if(!azioniNonTrovate.isEmpty()) {
					if(sbError.length()>0) {
						sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
					}
					sbError.append("Criteri di Applicabilità nelle Trasformazioni del gruppo '"+org.openspcoop2.core.constants.Costanti.MAPPING_DESCRIZIONE_DEFAULT+"' (Erogazione): "+azioniNonTrovate);
				}
			}
			
			if(erogazione_listRateLimitingPredefinito!=null && !erogazione_listRateLimitingPredefinito.isEmpty()) {
				List<String> azioniNonTrovate = new ArrayList<>();
				for (String az : erogazione_listRateLimitingPredefinito) {
					if(!existsOperazione(asSintetico, serviceBinding, portType, az)) {
						azioniNonTrovate.add(az);
					}
				}
				if(!azioniNonTrovate.isEmpty()) {
					if(sbError.length()>0) {
						sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
					}
					sbError.append("Policy di RateLimiting del gruppo '"+org.openspcoop2.core.constants.Costanti.MAPPING_DESCRIZIONE_DEFAULT+"' (Erogazione): "+azioniNonTrovate);
				}
			}
			
			if(erogazione_listAllarmePredefinito!=null && !erogazione_listAllarmePredefinito.isEmpty()) {
				List<String> azioniNonTrovate = new ArrayList<>();
				for (String az : erogazione_listAllarmePredefinito) {
					if(!existsOperazione(asSintetico, serviceBinding, portType, az)) {
						azioniNonTrovate.add(az);
					}
				}
				if(!azioniNonTrovate.isEmpty()) {
					if(sbError.length()>0) {
						sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
					}
					sbError.append("Allarme del gruppo '"+org.openspcoop2.core.constants.Costanti.MAPPING_DESCRIZIONE_DEFAULT+"' (Erogazione): "+azioniNonTrovate);
				}
			}
			
			if(azioniInFruizione) {
				if(sbError.length()>0) {
					sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
				}
			}
			
			if(!fruizione_mapGruppi.isEmpty() ) {
				for (String labelFruitore : fruizione_mapGruppi.keySet()) {
					HashMap<String, List<String>> m = fruizione_mapGruppi.get(labelFruitore);
					for (String gruppo : m.keySet()) {
						List<String> azioni = m.get(gruppo);
						List<String> azioniNonTrovate = new ArrayList<>();
						if(azioni!=null && !azioni.isEmpty()) {
							for (String az : azioni) {
								if(!existsOperazione(asSintetico, serviceBinding, portType, az)) {
									azioniNonTrovate.add(az);
								}
							}
						}
						if(!azioniNonTrovate.isEmpty()) {
							if(sbError.length()>0) {
								sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
							}
							sbError.append("Gruppo '"+gruppo+"' (Fruizione '"+labelFruitore+"'): "+azioniNonTrovate);
						}
					}
				}
			}
			
			if(fruizione_listTrasformazioniPredefinito!=null && !fruizione_listTrasformazioniPredefinito.isEmpty()) {
				for (String labelFruitore : fruizione_listTrasformazioniPredefinito.keySet()) {
					List<String> l = fruizione_listTrasformazioniPredefinito.get(labelFruitore);
					List<String> azioniNonTrovate = new ArrayList<>();
					for (String az : l) {
						if(!existsOperazione(asSintetico, serviceBinding, portType, az)) {
							azioniNonTrovate.add(az);
						}
					}
					if(!azioniNonTrovate.isEmpty()) {
						if(sbError.length()>0) {
							sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
						}
						sbError.append("Criteri di Applicabilità nelle Trasformazioni del gruppo '"+org.openspcoop2.core.constants.Costanti.MAPPING_DESCRIZIONE_DEFAULT+"' (Fruizione '"+labelFruitore+"'): "+azioniNonTrovate);
					}
				}
			}
			
			if(fruizione_listRateLimitingPredefinito!=null && !fruizione_listRateLimitingPredefinito.isEmpty()) {
				for (String labelFruitore : fruizione_listRateLimitingPredefinito.keySet()) {
					List<String> l = fruizione_listRateLimitingPredefinito.get(labelFruitore);
					List<String> azioniNonTrovate = new ArrayList<>();
					for (String az : l) {
						if(!existsOperazione(asSintetico, serviceBinding, portType, az)) {
							azioniNonTrovate.add(az);
						}
					}
					if(!azioniNonTrovate.isEmpty()) {
						if(sbError.length()>0) {
							sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
						}
						sbError.append("Policy di RateLimiting del gruppo '"+org.openspcoop2.core.constants.Costanti.MAPPING_DESCRIZIONE_DEFAULT+"' (Fruizione '"+labelFruitore+"'): "+azioniNonTrovate);
					}
				}
			}
			
			if(fruizione_listAllarmePredefinito!=null && !fruizione_listAllarmePredefinito.isEmpty()) {
				for (String labelFruitore : fruizione_listAllarmePredefinito.keySet()) {
					List<String> l = fruizione_listAllarmePredefinito.get(labelFruitore);
					List<String> azioniNonTrovate = new ArrayList<>();
					for (String az : l) {
						if(!existsOperazione(asSintetico, serviceBinding, portType, az)) {
							azioniNonTrovate.add(az);
						}
					}
					if(!azioniNonTrovate.isEmpty()) {
						if(sbError.length()>0) {
							sbError.append(org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE);
						}
						sbError.append("Allarme del gruppo '"+org.openspcoop2.core.constants.Costanti.MAPPING_DESCRIZIONE_DEFAULT+"' (Fruizione '"+labelFruitore+"'): "+azioniNonTrovate);
					}
				}
			}
		}
		
		if(sbError.length()>0) {
			String prefix = "";
			if( 
					(azioniInErogazione	&& azioniInFruizione) 
					||
					(gestioneFruitori && azioniInErogazione)
					||
					(gestioneErogatori && azioniInFruizione)
				) {
				prefix = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_CAMBIO_EROGATORE_MULTI_API_INFLUENZATE_MODIFICA_VERSIONE;
			}
			this.pd.setMessage(prefix+MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_CAMBIO_VERSIONE_ACCORDO,sbError.toString()));
			return false;
		}
		
		return true;
	}

	private boolean checkCambioErogatore(AccordoServizioParteSpecifica servizio, boolean gestioneFruitori, boolean gestioneErogatori,
			String idSoggErogatore, String protocollo) throws Exception {
		
		// Verifico che non esistano erogazioni riguardanti la modifica (anche se la modifica parte da una fruizione) contenente applicativi server.
		List<String> nomiApplicativiServer = new ArrayList<>();
		IDServizio idService = this.idServizioFactory.getIDServizioFromAccordo(servizio);
		List<MappingErogazionePortaApplicativa> listaMappingErogazione = null;
		try{
			listaMappingErogazione = this.apsCore.mappingServiziPorteAppList(idService,servizio.getId(), null);
		}catch(Exception e) {
			// ignore
		}
		if(listaMappingErogazione!=null && !listaMappingErogazione.isEmpty()) {
			for (MappingErogazionePortaApplicativa mappingErogazionePortaApplicativa : listaMappingErogazione) {
				PortaApplicativa pa = null;
				try {
					pa = this.porteApplicativeCore.getPortaApplicativa(mappingErogazionePortaApplicativa.getIdPortaApplicativa());
				}catch(Exception e) {
					// ignore
				}
				if(pa!=null && pa.sizeServizioApplicativoList()>0) {
					for (PortaApplicativaServizioApplicativo pasa: pa.getServizioApplicativoList()) {
						ServizioApplicativo sa = null;
						try {
							sa = this.saCore.getServizioApplicativo(pasa.getIdServizioApplicativo());
						}catch(Exception e) {
							// ignore
						}
						if(sa!=null && ServiziApplicativiCostanti.VALUE_SERVIZI_APPLICATIVI_TIPO_SERVER.equals(sa.getTipo())) {
							if(!nomiApplicativiServer.contains(sa.getNome())) {
								nomiApplicativiServer.add(sa.getNome());
							}
						}
					}
				}
			}
		}
		if(!nomiApplicativiServer.isEmpty()) {
			StringBuilder elenco = new StringBuilder();
			for (String server : nomiApplicativiServer) {
				if(elenco.length()>0) {
					elenco.append(", ");
				}
				elenco.append(server);
			}
			if(gestioneFruitori) {
				this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_CAMBIO_EROGATORE_FRUIZIONE_CON_APPLICATIVO_SERVER,
						getLabelIdServizioSenzaErogatore(idService),
						elenco.toString()));
			}
			else {
				this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_CAMBIO_EROGATORE_CON_APPLICATIVO_SERVER,elenco.toString()));
			}
			return false;
		}
		
		
		// Verifico che il soggetto selezionato sia compatibile con una eventuale fruizione (se modifico da erogazione) o vicersa.
		if(idSoggErogatore!=null && !"".equals(idSoggErogatore)) {
			long idSoggettoErogatoreLong = Long.parseLong(idSoggErogatore);
			Soggetto soggettoErogatoreSelezionato = this.soggettiCore.getSoggettoRegistro(idSoggettoErogatoreLong);
			
			// verifico che se esiste una erogazione, il soggetto selezionato nella fruizione sia compatibile
			// se e' stato selezionato dall'erogazione lo sarà sicuramente
			if(listaMappingErogazione!=null && !listaMappingErogazione.isEmpty()) {
				// esiste erogazione
			
				ConsoleSearch searchSoggetti = new ConsoleSearch(true);
				searchSoggetti.addFilter(Liste.SOGGETTI, Filtri.FILTRO_PROTOCOLLO, protocollo);
				searchSoggetti.addFilter(Liste.SOGGETTI, Filtri.FILTRO_DOMINIO, SoggettiCostanti.SOGGETTO_DOMINIO_OPERATIVO_VALUE);
				
				List<Soggetto> list = this.soggettiCore.soggettiRegistroList(null, searchSoggetti);
				boolean find = false;
				if(list!=null && !list.isEmpty()) {
					for (Soggetto soggetto : list) {
						if(soggettoErogatoreSelezionato.getTipo().equals(soggetto.getTipo()) &&
								soggettoErogatoreSelezionato.getNome().equals(soggetto.getNome())) {
							find = true;
						}
					}
				}
				if(!find) {
					this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_CAMBIO_EROGATORE_NON_COMPATIBILE_CON_EROGAZIONE,
							getLabelIdServizioSenzaErogatore(idService)));
					return false;
				}
			}
			
			// verifico che se esiste una fruizione, il soggetto selezionato nella erogazione sia compatibile
			// se e' stato selezionato dalla fruizione lo sarà sicuramente
			if(servizio.sizeFruitoreList()>0) {
				for (Fruitore fruitore : servizio.getFruitoreList()) {
					IDSoggetto idFruitore = new IDSoggetto(fruitore.getTipo(), fruitore.getNome());
					List<MappingFruizionePortaDelegata> listaMappingFruizione = null;
					try{
						listaMappingFruizione = this.apsCore.serviziFruitoriMappingList(idFruitore, idService, null);
					}catch(Exception e) {
						// ignore
					}
					if(listaMappingFruizione!=null && !listaMappingFruizione.isEmpty()) {
						// esiste fruizione
						
						ConsoleSearch searchSoggetti = new ConsoleSearch(true);
						searchSoggetti.addFilter(Liste.SOGGETTI, Filtri.FILTRO_PROTOCOLLO, protocollo);
						boolean gestioneFruitori_soggettiErogatori_escludiSoggettoFruitore = false;
						boolean filtraSoloEsterni = true;
						if(this.apsCore.isMultitenant() && this.apsCore.getMultitenantSoggettiFruizioni()!=null) {
							switch (this.apsCore.getMultitenantSoggettiFruizioni()) {
							case SOLO_SOGGETTI_ESTERNI:
								filtraSoloEsterni = true;
								break;
							case ESCLUDI_SOGGETTO_FRUITORE:
								filtraSoloEsterni = false;
								gestioneFruitori_soggettiErogatori_escludiSoggettoFruitore = true;
								break;
							case TUTTI:
								filtraSoloEsterni = false;
								break;
							}
						}
						if(filtraSoloEsterni) {
							searchSoggetti.addFilter(Liste.SOGGETTI, Filtri.FILTRO_DOMINIO, SoggettiCostanti.SOGGETTO_DOMINIO_ESTERNO_VALUE);
						}
						List<Soggetto> list = this.soggettiCore.soggettiRegistroList(null, searchSoggetti);									
						if(gestioneFruitori_soggettiErogatori_escludiSoggettoFruitore && list!=null && !list.isEmpty()) {
							for (int i = 0; i < list.size(); i++) {
								Soggetto soggettoCheck = list.get(i);
								if(soggettoCheck.getTipo().equals(fruitore.getTipo()) && soggettoCheck.getNome().equals(fruitore.getNome())) {
									list.remove(i);
									break;
								}
							}
						}
						boolean find = false;
						if(list!=null && !list.isEmpty()) {
							for (Soggetto soggetto : list) {
								if(soggettoErogatoreSelezionato.getTipo().equals(soggetto.getTipo()) &&
										soggettoErogatoreSelezionato.getNome().equals(soggetto.getNome())) {
									find = true;
								}
							}
						}
						if(!find) {
							String labelFruizione = null;
							String labelFruitore = this.getLabelNomeSoggetto(protocollo, idFruitore);
							labelFruizione = labelFruitore + " -> " + getLabelIdServizioSenzaErogatore(idService);
							this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_CAMBIO_EROGATORE_NON_COMPATIBILE_CON_FRUIZIONE,
									labelFruizione));
							return false;
						}
					}
				}
			}
		}
		return true;
	}
	
	private String getServiziCheckDataIdSoggettoErogatoreAsString(long idServizio){
		try {
			AccordoServizioParteSpecifica servizio = this.apsCore.getAccordoServizioParteSpecifica(idServizio);
			return servizio.getIdSoggetto().toString();
		} catch (DriverRegistroServiziNotFound | DriverRegistroServiziException e) {
			// ignore
		} 
		return null;
	}
	
	// Controlla i dati dei Servizi
	public boolean serviziCheckData(TipoOperazione tipoOp, String[] soggettiList,
			String[] accordiList, String oldNomeservizio,
			String oldTiposervizio, int oldVersioneServizio,
			String nomeservizio,
			String tiposervizio, String idSoggErogatore,
			String nomeErogatore, String tipoErogatore, String idAccordo, ServiceBinding serviceBinding,
			String servcorr, String endpointtype, String url, String nome,
			String tipo, String user, String password, String initcont,
			String urlpgk, String provurl, String connfact, String sendas,
			BinaryParameter wsdlimpler, BinaryParameter wsdlimplfru, String id,
			String profilo, String portType, String[] ptList,
			boolean visibilitaAccordoServizio,boolean visibilitaServizio,
			String httpsurl, String httpstipologia, boolean httpshostverify,
			boolean httpsTrustVerifyCert, String httpspath, String httpstipo, String httpspwd,
			String httpsalgoritmo, boolean httpsstato, String httpskeystore,
			String httpspwdprivatekeytrust, String httpspathkey,
			String httpstipokey, String httpspwdkey,
			String httpspwdprivatekey, String httpsalgoritmokey, 
			String httpsKeyAlias, String httpsTrustStoreCRLs, String httpsTrustStoreOCSPPolicy, String httpsKeyStoreBYOKPolicy,
			String tipoconn, String versione,
			boolean validazioneDocumenti,  String backToStato,
			String autenticazioneHttp,
			String proxyEnabled, String proxyHost, String proxyPort, String proxyUsername, String proxyPassword,
			String tempiRispostaEnabled, String tempiRispostaConnectionTimeout, String tempiRispostaReadTimeout, String tempiRispostaTempoMedioRisposta,
			String opzioniAvanzate, String transferMode, String transferModeChunkSize, String redirectMode, String redirectMaxHop,
			String requestOutputFileName, String requestOutputFileNamePermissions, String requestOutputFileNameHeaders, String requestOutputFileNameHeadersPermissions,
			String requestOutputParentDirCreateIfNotExists,String requestOutputOverwriteIfExists,
			String responseInputMode, String responseInputFileName, String responseInputFileNameHeaders, String responseInputDeleteAfterRead, String responseInputWaitTime,
			String erogazioneSoggetto,String erogazioneRuolo,String erogazioneAutenticazione,String erogazioneAutenticazioneOpzionale, TipoAutenticazionePrincipal erogazioneAutenticazionePrincipal, List<String> erogazioneAutenticazioneParametroList, String erogazioneAutorizzazione,
			String erogazioneAutorizzazioneAutenticati,String erogazioneAutorizzazioneRuoli, String erogazioneAutorizzazioneRuoliTipologia, String erogazioneAutorizzazioneRuoliMatch,boolean isSupportatoAutenticazione,
			boolean generaPACheckSoggetto, List<ExtendedConnettore> listExtendedConnettore,
			String fruizioneServizioApplicativo,String fruizioneRuolo,String fruizioneAutenticazione,String fruizioneAutenticazioneOpzionale, TipoAutenticazionePrincipal fruizioneAutenticazionePrincipal, List<String> fruizioneAutenticazioneParametroList, String fruizioneAutorizzazione,
			String fruizioneAutorizzazioneAutenticati,String fruizioneAutorizzazioneRuoli, String fruizioneAutorizzazioneRuoliTipologia, String fruizioneAutorizzazioneRuoliMatch,
			String protocollo,BinaryParameter allegatoXacmlPolicy,
			String descrizione, String tipoFruitore, String nomeFruitore,
			boolean autenticazioneToken, String tokenPolicy,
			String autenticazioneApiKey, boolean useOAS3Names, boolean useAppId, String apiKeyHeader, String apiKeyValue, String appIdHeader, String appIdValue,
			boolean erogazioneServizioApplicativoServerEnabled, String erogazioneServizioApplicativoServer, String canaleStato, String canale, boolean gestioneCanaliEnabled)	throws Exception {

		boolean isModalitaAvanzata = this.isModalitaAvanzata();

		try{
			if(erogazioneSoggetto!=null || erogazioneRuolo!=null || fruizioneServizioApplicativo!=null || fruizioneRuolo!=null || descrizione!=null) {
				// nop
			}

			String tipologia = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
			boolean gestioneFruitori = false;
			boolean gestioneErogatori = false;
			if(tipologia!=null) {
				if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE.equals(tipologia)) {
					gestioneFruitori = true;
				}
				else if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_EROGAZIONE.equals(tipologia)) {
					gestioneErogatori = true;
				}
			}
			
			// ripristina dello stato solo in modalita change
			if(backToStato != null && tipoOp.equals(TipoOperazione.CHANGE)){
				return true;
			}

			int idInt = 0;
			if (tipoOp.equals(TipoOperazione.CHANGE)) {
				idInt = Integer.parseInt(id);
			}
			if (idSoggErogatore == null) {
				idSoggErogatore = "";
			}
			if (idAccordo == null) {
				idAccordo = "";
			}
			if (url == null) {
				url = "";
			}
			if (nome == null) {
				nome = "";
			}
			if (tipo == null) {
				tipo = "";
			}
			if (user == null) {
				user = "";
			}
			if (password == null) {
				password = "";
			}
			if (initcont == null) {
				initcont = "";
			}
			if (urlpgk == null) {
				urlpgk = "";
			}
			if (provurl == null) {
				provurl = "";
			}
			if (connfact == null) {
				connfact = "";
			}
			if (sendas == null) {
				sendas = "";
			}
			if (versione == null) {
				versione = "";
			}

			// Visibilita rispetto all'accordo
			boolean nonVisibile = true;
			boolean visibile = false;
			if( (visibilitaServizio==visibile)
					&&
				(visibilitaAccordoServizio==nonVisibile)
				){
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_USO_ACCORDO_SERVIZIO_CON_VISIBILITA_PRIVATA_IN_UN_SERVIZIO_CON_VISIBILITA_PUBBLICA);
				return false;
			}

			Integer versioneInt = 1;
			if(versione!=null && !"".equals(versione)){
				versioneInt = Integer.parseInt(versione);
			}
			else {
				versione = "1";
				versioneInt = 1;
			}
			
			String oldTipoSoggettoErogatore = null;
			String oldNomeSoggettoErogatore = null;
			boolean cambiaErogatore = false;
			boolean modificaVersioneApi = false;
			
			if (tipoOp.equals(TipoOperazione.CHANGE)) {

				String tmpModificaVersioneApi = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API);
				if(tmpModificaVersioneApi!=null) {
					modificaVersioneApi = "true".equals(tmpModificaVersioneApi);
				}
				
				String tmpCambiaSoggettoErogatore = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_SOGGETTO_EROGATORE);
				if(tmpCambiaSoggettoErogatore!=null) {
					cambiaErogatore = "true".equals(tmpCambiaSoggettoErogatore);
				}
				
				if(modificaVersioneApi) {
					
					AccordoServizioParteSpecifica servizio = this.apsCore.getAccordoServizioParteSpecifica(idInt);
					long idAccordoLong = Long.parseLong(idAccordo);
					boolean isOk = checkModificaVersioneApi(servizio, 
							idAccordoLong, serviceBinding, portType,
							gestioneFruitori, gestioneErogatori);
					if(!isOk) {
						return false; // messaggio scritto nel metodo
					}
					idSoggErogatore = servizio.getIdSoggetto().toString();
				}
				else if(cambiaErogatore) {
					AccordoServizioParteSpecifica servizio = this.apsCore.getAccordoServizioParteSpecifica(idInt);
					oldTipoSoggettoErogatore = servizio.getTipoSoggettoErogatore();
					oldNomeSoggettoErogatore = servizio.getNomeSoggettoErogatore();
					
					boolean isOk =  checkCambioErogatore(servizio, gestioneFruitori, gestioneErogatori,
							idSoggErogatore, protocollo);
					if(!isOk) {
						return false; // messaggio scritto nel metodo
					}
				}
				else {
					@SuppressWarnings("unused")
					IDServizio idService = this.idServizioFactory.getIDServizioFromValues(tiposervizio, nomeservizio, 
							tipoErogatore, nomeErogatore, versioneInt);
					
					idSoggErogatore = getServiziCheckDataIdSoggettoErogatoreAsString(idInt);
				}
				
			}

			// Campi obbligatori
			if (idAccordo.equals("")) {
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_API_NON_INDICATA);
				return false;
			}
			
			if (nomeservizio.equals("") || tiposervizio.equals("") || idSoggErogatore.equals("") || idAccordo.equals("") || versione.equals("")) {
				String tmpElenco = "";
				if (nomeservizio.equals("")) {
					tmpElenco = AccordiServizioParteSpecificaCostanti.LABEL_APS_NOME_SERVIZIO;
				}
				if (tiposervizio.equals("")) {
					if (tmpElenco.equals("")) {
						tmpElenco = AccordiServizioParteSpecificaCostanti.LABEL_APS_TIPO_SERVIZIO;
					} else {
						tmpElenco = tmpElenco + ", " + AccordiServizioParteSpecificaCostanti.LABEL_APS_TIPO_SERVIZIO;
					}
				}
				if (idSoggErogatore.equals("")) {
					if (tmpElenco.equals("")) {
						tmpElenco = AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO;
					} else {
						tmpElenco = tmpElenco + ", " + AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO;
					}
				}
				if (idAccordo.equals("")) {
					if (tmpElenco.equals("")) {
						tmpElenco = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_PARTE_COMUNE;
					} else {
						tmpElenco = tmpElenco + ", " + AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_PARTE_COMUNE;
					}
				}
				if (versione.equals("")) {
					if (tmpElenco.equals("")) {
						tmpElenco = AccordiServizioParteSpecificaCostanti.LABEL_APS_VERSIONE_APS;
					} else {
						tmpElenco = tmpElenco + ", " + AccordiServizioParteSpecificaCostanti.LABEL_APS_VERSIONE_APS;
					}	
				}
				this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_DATI_INCOMPLETI_CON_PARAMETRO, tmpElenco));
				return false;
			}
			
			if (!isModalitaAvanzata || this.apsCore.isPortTypeObbligatorioImplementazioniSOAP()) {
				switch (serviceBinding) {
				case REST:
					
					break;
				case SOAP:
				default:
					if (portType == null || "".equals(portType) || "-".equals(portType)) {
						if(ptList==null || ptList.length == 0){
							this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_SERVIZIO_OBBLIGATORIO_PORT_TYPE_NON_PRESENTI);
							return false;
						}
						
						this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_SERVIZIO_OBBLIGATORIO);
						return false;
					}
					break;
				}
			}
			

			// Controllo che non ci siano spazi nei campi di testo
			if ((nomeservizio.indexOf(" ") != -1) || (tiposervizio.indexOf(" ") != -1)) {
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_SPAZI_BIANCHI_NON_CONSENTITI);
				return false;
			}

			// Il nome deve contenere solo lettere e numeri e '_' '-' '.'
			if(!this.checkNCName(nomeservizio,AccordiServizioParteSpecificaCostanti.LABEL_APS_NOME_SERVIZIO)){
				return false;
			}

			// Il tipo deve contenere solo lettere e numeri
			if(!this.checkNCName(tiposervizio,AccordiServizioParteSpecificaCostanti.LABEL_APS_TIPO_SERVIZIO)){
				return false;
			}

			// Versione deve essere un numero intero
			if (!versione.equals("") && !this.checkNumber(versione, AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VERSIONE, false)) {
				return false;
			}
			
			// Check lunghezza
			if(!this.checkLength255(nomeservizio, AccordiServizioParteSpecificaCostanti.LABEL_APS_NOME_SERVIZIO)) {
				return false;
			}
			if(descrizione!=null && !"".equals(descrizione) &&
				!this.checkLength4000(descrizione, AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE)) {
				return false;
			}
			
			if (tipoOp.equals(TipoOperazione.ADD) &&
				(!this.canaleCheckData(canaleStato, canale, gestioneCanaliEnabled)) 
			){
				return false;
			}
			
			// Controllo dell'end-point
			// Non li puo' prendere dalla servtlet
			boolean connettoreStatic = false;
			if(gestioneFruitori) {
				connettoreStatic = this.apsCore.isConnettoreStatic(protocollo);
			}
			if(!connettoreStatic &&
				!this.endPointCheckData(protocollo, gestioneErogatori,
						endpointtype, url, nome, tipo,
						user, password, initcont, urlpgk, provurl, connfact,
						sendas, httpsurl, httpstipologia, httpshostverify,
						httpsTrustVerifyCert, httpspath, httpstipo, httpspwd, httpsalgoritmo, httpsstato,
						httpskeystore, httpspwdprivatekeytrust, httpspathkey,
						httpstipokey, httpspwdkey, 
						httpspwdprivatekey, httpsalgoritmokey,
						httpsKeyAlias, httpsTrustStoreCRLs, httpsTrustStoreOCSPPolicy, httpsKeyStoreBYOKPolicy,
						tipoconn,autenticazioneHttp,
						proxyEnabled, proxyHost, proxyPort, proxyUsername, proxyPassword,
						tempiRispostaEnabled, tempiRispostaConnectionTimeout, tempiRispostaReadTimeout, tempiRispostaTempoMedioRisposta,
						opzioniAvanzate, transferMode, transferModeChunkSize, redirectMode, redirectMaxHop,
						requestOutputFileName, requestOutputFileNamePermissions, requestOutputFileNameHeaders, requestOutputFileNameHeadersPermissions,
						requestOutputParentDirCreateIfNotExists,requestOutputOverwriteIfExists,
						responseInputMode, responseInputFileName, responseInputFileNameHeaders, responseInputDeleteAfterRead, responseInputWaitTime,
						autenticazioneToken, tokenPolicy,
						autenticazioneApiKey, useOAS3Names, useAppId, apiKeyHeader, apiKeyValue, appIdHeader, appIdValue,
						listExtendedConnettore,erogazioneServizioApplicativoServerEnabled,erogazioneServizioApplicativoServer)) {
				return false;
			}

			// Controllo che i campi "checkbox" abbiano uno dei valori
			// ammessi
			if ((servcorr != null) && !servcorr.equals(Costanti.CHECK_BOX_ENABLED) && !servcorr.equals(Costanti.CHECK_BOX_DISABLED)) {
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_SERVIZIO_CORRELATO_DEV_ESSERE_SELEZIONATO_O_DESELEZIONATO);
				return false;
			}

			// Controllo che il provider appartenga alla lista di
			// providers disponibili
			boolean trovatoProv = false;
			for (int i = 0; i < soggettiList.length; i++) {
				String tmpSogg = soggettiList[i];
				if (tmpSogg.equals(idSoggErogatore)) {
					trovatoProv = true;
				}
			}
			if (!trovatoProv) {
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_IL_SOGGETTO_INDICATO_NON_AUTORIZZATO_A_EROGARE);
				return false;
			}

			// Controllo che l'accordo appartenga alla lista di
			// accordi disponibili
			boolean trovatoAcc = false;
			for (int i = 0; i < accordiList.length; i++) {
				String tmpAcc = accordiList[i];
				if (tmpAcc.equals(idAccordo)) {
					trovatoAcc = true;
				}
			}
			if (!trovatoAcc) {
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ACCORDO_SERVIZIO_DEV_ESSERE_SCELTO_TRA_QUELLI_DEFINITI_NEL_PANNELLO_ACCORDI_SERVIZIO);
				return false;
			}


			// Visibilita rispetto al soggetto erogatore
			if(visibilitaServizio==visibile){
				org.openspcoop2.core.registry.Soggetto tmpSogg = this.soggettiCore.getSoggettoRegistro(new IDSoggetto(tipoErogatore, nomeErogatore));
				if(tmpSogg.getPrivato()!=null && tmpSogg.getPrivato()){
					this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_USO_SOGGETTO_EROGATORE_CON_VISIBILITA_PRIVATA_IN_UN_SERVIZIO_CON_VISIBILITA_PUBBLICA);
					return false;
				}
			}


			// Se il connettore e' disabilitato devo controllare che il
			// connettore del soggetto non sia disabilitato se è di tipo operativo
			if(!gestioneFruitori && !gestioneErogatori && !connettoreStatic &&
				 (endpointtype.equals(TipiConnettore.DISABILITATO.getNome())) 
				 ){
				String eptypeprov = TipiConnettore.DISABILITATO.getNome();

				org.openspcoop2.core.registry.Soggetto soggetto = this.soggettiCore.getSoggettoRegistro(new IDSoggetto(tipoErogatore, nomeErogatore));
				if(this.pddCore.isPddEsterna(soggetto.getPortaDominio())){
					Connettore connettore = soggetto.getConnettore();
					if ((connettore != null) && (connettore.getTipo() != null)) {
						eptypeprov = connettore.getTipo();
					}
	
					if (eptypeprov.equals(TipiConnettore.DISABILITATO.getNome())) {
						if(!this.isModalitaCompleta() && tipoOp.equals(TipoOperazione.ADD)) {
							this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_IL_CONNETTORE_SUL_SERVIZIO_NON_PUO_ESSERE_DISABILITATO_POICHE_NON_E_STATO_DEFINITO_UN_CONNETTORE_EROGAZIONE);
						}
						else {
							this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_IL_CONNETTORE_DEL_SERVIZIO_DEVE_ESSERE_SPECIFICATO_SE_NON_EGRAVE_STATO_DEFINITO_UN_CONNETTORE_PER_IL_SOGGETTO_EROGATORE);
						}
						return false;
					}
				}
				else{
					if(tipoOp.equals(TipoOperazione.CHANGE)){
						boolean escludiSoggettiEsterni = true;
						boolean trovatoServ = this.apsCore.existFruizioniServizioWithoutConnettore(idInt,escludiSoggettiEsterni);
						if (trovatoServ) {
							this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_IL_CONNETTORE_SUL_SERVIZIO_NON_PUO_ESSERE_DISABILITATO_POICHE_NON_E_STATO_DEFINITO_UN_CONNETTORE_SUL_SOGGETTO_EROGATORE_ED_ESISTONO_FRUIZIONI_DEL_SERVIZIO_DA_PARTE_DI_SOGGETTI_OPERATIVI_CHE_NON_HANNO_UN_CONNETTORE_DEFINITO);
							return false;
						}
					}
					
					else {
						if(!this.isModalitaCompleta() && generaPACheckSoggetto) {
							this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_IL_CONNETTORE_SUL_SERVIZIO_NON_PUO_ESSERE_DISABILITATO_POICHE_NON_E_STATO_DEFINITO_UN_CONNETTORE_EROGAZIONE);
							return false;
						}
					}
				}
			}

			// idSoggettoErogatore
			long idSoggettoErogatore = Long.parseLong(idSoggErogatore);
			if (idSoggettoErogatore < 0)
				throw new ControlStationCoreException(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ID_SOGGETTO_EROGATORE_NON_DEFINITO);

			// idAccordo Servizio
			long idAccordoServizio = Long.parseLong(idAccordo);
			if (idAccordoServizio < 0)
				throw new ControlStationCoreException(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ID_ACCORDO_SERVIZIO_NON_DEFINITO);

			// Dati Servizio 
			long idSoggettoErogatoreLong = Long.parseLong(idSoggErogatore);
			Soggetto soggettoErogatore = this.soggettiCore.getSoggettoRegistro(idSoggettoErogatoreLong);
			tipoErogatore = soggettoErogatore.getTipo();
			nomeErogatore = soggettoErogatore.getNome();
			long idAccordoServizioParteComuneLong = Long.parseLong(idAccordo);
			AccordoServizioParteComuneSintetico accordoServizioParteComune = this.apcCore.getAccordoServizioSintetico(idAccordoServizioParteComuneLong);
			String uriAccordoServizioParteComune = this.idAccordoFactory.getUriFromAccordo(accordoServizioParteComune);
			IDServizio idAccordoServizioParteSpecifica = this.idServizioFactory.getIDServizioFromValues(tiposervizio, nomeservizio, 
					tipoErogatore, nomeErogatore, versioneInt);
			
			// Controllo non esistenza gia' del servizio
			if (
					(!tipoOp.equals(TipoOperazione.CHANGE)) 
					|| 
					(
							tipoOp.equals(TipoOperazione.CHANGE)
							&& 
							( 
								(!oldTiposervizio.equals(tiposervizio)) 
									|| 
								(!oldNomeservizio.equals(nomeservizio)) 
									|| 
								(oldVersioneServizio!=versioneInt)
									|| 
								(cambiaErogatore 
									&&
									(
										(!oldTipoSoggettoErogatore.equals(tipoErogatore)) 
											|| 
										(!oldNomeSoggettoErogatore.equals(nomeErogatore))
									)
								)
							) 
					)
				){
				
				StringBuilder inUsoMessage = new StringBuilder();
				
				boolean alreadyExists = AccordiServizioParteSpecificaUtilities.alreadyExists(this.apsCore, this, 
						idSoggettoErogatore, idAccordoServizioParteSpecifica, uriAccordoServizioParteComune,
						tipoFruitore, nomeFruitore,
						protocollo, profilo, portType,
						gestioneFruitori, gestioneErogatori,
						inUsoMessage);
				
				if(alreadyExists) {
					this.pd.setMessage(inUsoMessage.toString());
					return false;
				}
			}

			/*
			 * Controllo che non esistano 2 servizi con stesso soggetto erogatore e accordo di servizio 
			 * che siano entrambi correlati o non correlati. 
			 * Al massimo possono esistere 2 servizi di uno stesso accordo erogati da uno stesso soggetto, 
			 * purche' siano uno correlato e uno no. 
			 * Se tipoOp = change, devo fare attenzione a non escludere il servizio selezionato che sto
			 * cambiando 
			 */
			
			long idAccordoServizioParteSpecificaLong = idInt;
			boolean servizioCorrelato = false;
			if ((servcorr != null) && (servcorr.equals(Costanti.CHECK_BOX_ENABLED) || servcorr.equals(CostantiConfigurazione.ABILITATO.getValue()))) {
				servizioCorrelato = true;
			}
			try{
				this.apsCore.controlloUnicitaImplementazioneAccordoPerSoggetto(portType, 
						new IDSoggetto(soggettoErogatore.getTipo(), soggettoErogatore.getNome()), idSoggettoErogatoreLong, 
						this.idAccordoFactory.getIDAccordoFromAccordo(accordoServizioParteComune), idAccordoServizioParteComuneLong, 
						idAccordoServizioParteSpecifica, idAccordoServizioParteSpecificaLong, 
						tipoOp, servizioCorrelato);
			}catch(Exception e){
				this.pd.setMessage(e.getMessage());
				return false;
			}

			
			// Controllo che non esistano altri accordi di servizio parte specifica con stesso nome, versione e soggetto
			if (tipoOp.equals(TipoOperazione.ADD)){
				if(!gestioneFruitori && !gestioneErogatori && this.apsCore.existsAccordoServizioParteSpecifica(idAccordoServizioParteSpecifica)){
					/**if(this.apsCore.isSupportatoVersionamentoAccordiServizioParteSpecifica(protocollo))*/
					this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ESISTE_GIA_UN_ACCORDO_DI_SERVIZIO_PARTE_SPECIFICA_CON_TIPO_NOME_VERSIONE_E_SOGGETTO_INDICATO);
					/**else
					//	this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ESISTE_GIA_UN_ACCORDO_DI_SERVIZIO_PARTE_SPECIFICA_CON_TIPO_NOME_VERSIONE_E_SOGGETTO_INDICATO);*/
					return false;
				}
			}else{
				// change
				
				try{
					AccordoServizioParteSpecifica servizio =  this.apsCore.getServizio(idAccordoServizioParteSpecifica);
					if(servizio!=null &&
						(idInt != servizio.getId()) 
						){
						if(!gestioneFruitori && !gestioneErogatori) {
							/**if(this.apsCore.isSupportatoVersionamentoAccordiServizioParteSpecifica(protocollo))*/
								this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ESISTE_GIA_UN_ACCORDO_DI_SERVIZIO_PARTE_SPECIFICA_CON_TIPO_NOME_VERSIONE_E_SOGGETTO_INDICATO);
							/**else
							//	this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ESISTE_GIA_UN_ACCORDO_DI_SERVIZIO_PARTE_SPECIFICA_CON_TIPO_NOME_VERSIONE_E_SOGGETTO_INDICATO);*/
							return false;
						}
						else {
							// Per adesso non gestito, vedi spiegazione nel metodo
							if(!AccordiServizioParteSpecificaCostanti.isModificaDatiIdentificativiVersoApsEsistente()) {
								if(gestioneFruitori) {
									this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_CAMBIO_EROGATORE_NON_COMPATIBILE_ESISTE_EROGAZIONE,
											this.getLabelIdServizio(servizio)));
								}
								else {
									this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_CAMBIO_EROGATORE_NON_COMPATIBILE_ESISTE_FRUIZIONE,
											this.getLabelIdServizio(servizio)));
								}
								return false;
							}
						}
					}
				}catch(DriverRegistroServiziNotFound dNotFound){
					// ignore
				}
			}

			// Lettura accordo di servizio
			AccordoServizioParteComune as = null;
			try{
				as = this.apcCore.getAccordoServizioFull(Long.parseLong(idAccordo));
			}catch(Exception e){
				this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_API_SELEZIONATA_NON_ESISTENTE_CON_PARAMETRI, idAccordo,
						e.getMessage()));
				return false;
			}

			AccordoServizioParteSpecifica aps = new AccordoServizioParteSpecifica();
			aps.setTipo(tiposervizio);
			aps.setNome(nomeservizio);
			if(versione!=null)
				aps.setVersione(Integer.parseInt(versione));
			if(Costanti.CHECK_BOX_ENABLED.equals(servcorr)){
				aps.setTipologiaServizio(TipologiaServizio.CORRELATO);
			}
			else{
				aps.setTipologiaServizio(TipologiaServizio.NORMALE);
			}
			aps.setTipoSoggettoErogatore(tipoErogatore);
			aps.setNomeSoggettoErogatore(nomeErogatore);

			ValidazioneResult v = this.apsCore.validazione(aps, this.soggettiCore);
			if(!v.isEsito()){
				String msg = MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_VALIDAZIONE_PROTOCOLLO_CON_PARAMETRI, protocollo, v.getMessaggioErrore());
				this.pd.setMessage(msg);
				if(v.getException()!=null)
					this.logError(msg,v.getException());
				else
					this.logError(msg);
				return false;
			}	

			// Validazione Documenti
			if(validazioneDocumenti && tipoOp.equals(TipoOperazione.ADD)){
				
				FormatoSpecifica formato = null;
				if(as!=null) {
					formato = as.getFormatoSpecifica();
				}
				
				String wsdlimplerS = wsdlimpler.getValue() != null ? new String(wsdlimpler.getValue()) : null; 
				byte [] wsdlImplementativoErogatore = this.apsCore.getInterfaceAsByteArray(formato, wsdlimplerS);
				String wsdlimplfruS = wsdlimplfru.getValue() != null ? new String(wsdlimplfru.getValue()) : null; 
				byte [] wsdlImplementativoFruitore = this.apsCore.getInterfaceAsByteArray(formato, wsdlimplfruS);
				
				aps.setByteWsdlImplementativoErogatore(wsdlImplementativoErogatore);
				aps.setByteWsdlImplementativoFruitore(wsdlImplementativoFruitore);

				ValidazioneResult result = this.apsCore.validaInterfacciaWsdlParteSpecifica(aps, as, this.soggettiCore);
				if(!result.isEsito()){
					this.pd.setMessage(result.getMessaggioErrore());
					return false;
				}	

			}

			if(tipoOp.equals(TipoOperazione.ADD)){
				
				String gestioneToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN);
				String gestioneTokenPolicy = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_POLICY);
				String gestioneTokenValidazioneInput = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_VALIDAZIONE_INPUT);
				String gestioneTokenIntrospection = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_INTROSPECTION);
				String gestioneTokenUserInfo = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_USERINFO);
				String gestioneTokenTokenForward = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_TOKEN_FORWARD);
				
				String autorizzazioneAutenticatiToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_AUTENTICAZIONE_TOKEN);
				String autorizzazioneRuoliToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_RUOLI_TOKEN);
				
				String autorizzazioneToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_TOKEN);
				String autorizzazioneTokenOptions = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_TOKEN_OPTIONS);
				String autorizzazioneScope = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_SCOPE);
				String autorizzazioneScopeMatch = this.getParameter(CostantiControlStation.PARAMETRO_SCOPE_MATCH);

				String autorizzazioneContenutiStato = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI_STATO);
				String autorizzazioneContenuti = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI);
				String autorizzazioneContenutiProperties = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI_PROPERTIES);
				
				String identificazioneAttributiStato = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_STATO);
				String [] attributeAuthoritySelezionate = this.getParameterValues(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_AUTHORITY);
				String attributeAuthorityAttributi = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_AUTHORITY_ATTRIBUTI);
				
				if(gestioneFruitori) {
					
					if(this.controlloAccessiCheck(tipoOp, fruizioneAutenticazione, fruizioneAutenticazioneOpzionale, fruizioneAutenticazionePrincipal, fruizioneAutenticazioneParametroList, 
							fruizioneAutorizzazione, fruizioneAutorizzazioneAutenticati, fruizioneAutorizzazioneRuoli, 
							fruizioneAutorizzazioneRuoliTipologia, fruizioneAutorizzazioneRuoliMatch,
							true, true, null, null,gestioneToken, gestioneTokenPolicy, 
							gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenTokenForward,
							autorizzazioneAutenticatiToken, autorizzazioneRuoliToken, 
							autorizzazioneToken,autorizzazioneTokenOptions,
							autorizzazioneScope,autorizzazioneScopeMatch,allegatoXacmlPolicy,
							autorizzazioneContenutiStato, autorizzazioneContenuti, autorizzazioneContenutiProperties,
							protocollo,
							identificazioneAttributiStato, attributeAuthoritySelezionate, attributeAuthorityAttributi)==false){
						return false;
					}
				}
				else {
				
					
					if(this.controlloAccessiCheck(tipoOp, erogazioneAutenticazione, erogazioneAutenticazioneOpzionale, erogazioneAutenticazionePrincipal, erogazioneAutenticazioneParametroList,
							erogazioneAutorizzazione, erogazioneAutorizzazioneAutenticati, erogazioneAutorizzazioneRuoli, 
							erogazioneAutorizzazioneRuoliTipologia, erogazioneAutorizzazioneRuoliMatch,
							isSupportatoAutenticazione, false, null, null,gestioneToken, gestioneTokenPolicy, 
							gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenTokenForward,
							autorizzazioneAutenticatiToken, autorizzazioneRuoliToken, 
							autorizzazioneToken,autorizzazioneTokenOptions,
							autorizzazioneScope,autorizzazioneScopeMatch,allegatoXacmlPolicy,
							autorizzazioneContenutiStato, autorizzazioneContenuti, autorizzazioneContenutiProperties,
							protocollo,
							identificazioneAttributiStato, attributeAuthoritySelezionate, attributeAuthorityAttributi)==false){
						return false;
					}
				}
			}
			
			
			return true;
		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}


	// Controlla i dati del fruitore del servizio
	public boolean serviziFruitoriCheckData(TipoOperazione tipoOp, String[] soggettiList,
			String id, String nomeservizio, String tiposervizio, Integer versioneservizio,
			String nomeprov, String tipoprov, String idSoggettoFruitore,
			String endpointtype, String url, String nome, String tipo,
			String user, String password, String initcont,
			String urlpgk, String provurl, String connfact,
			String sendas, BinaryParameter wsdlimpler, BinaryParameter wsdlimplfru,
			String myId, 
			String httpsurl, String httpstipologia, boolean httpshostverify,
			boolean httpsTrustVerifyCert, String httpspath, String httpstipo, String httpspwd,
			String httpsalgoritmo, boolean httpsstato, String httpskeystore,
			String httpspwdprivatekeytrust, String httpspathkey,
			String httpstipokey, String httpspwdkey,
			String httpspwdprivatekey, String httpsalgoritmokey, 
			String httpsKeyAlias, String httpsTrustStoreCRLs, String httpsTrustStoreOCSPPolicy, String httpsKeyStoreBYOKPolicy,
			String tipoconn, 
			boolean validazioneDocumenti, String backToStato,
			String autenticazioneHttp,
			String proxyEnabled, String proxyHost, String proxyPort, String proxyUsername, String proxyPassword,
			String tempiRispostaEnabled, String tempiRispostaConnectionTimeout, String tempiRispostaReadTimeout, String tempiRispostaTempoMedioRisposta,
			String opzioniAvanzate, String transferMode, String transferModeChunkSize, String redirectMode, String redirectMaxHop,
			String requestOutputFileName, String requestOutputFileNamePermissions, String requestOutputFileNameHeaders, String requestOutputFileNameHeadersPermissions,
			String requestOutputParentDirCreateIfNotExists,String requestOutputOverwriteIfExists,
			String responseInputMode, String responseInputFileName, String responseInputFileNameHeaders, String responseInputDeleteAfterRead, String responseInputWaitTime,
			String fruizioneServizioApplicativo,String fruizioneRuolo,String fruizioneAutenticazione,String fruizioneAutenticazioneOpzionale, TipoAutenticazionePrincipal fruizioneAutenticazionePrincipal, List<String> fruizioneAutenticazioneParametroList, String fruizioneAutorizzazione,
			String fruizioneAutorizzazioneAutenticati,String fruizioneAutorizzazioneRuoli, String fruizioneAutorizzazioneRuoliTipologia, String fruizioneAutorizzazioneRuoliMatch,BinaryParameter allegatoXacmlPolicy,
			boolean autenticazioneToken, String tokenPolicy,
			String autenticazioneApiKey, boolean useOAS3Names, boolean useAppId, String apiKeyHeader, String apiKeyValue, String appIdHeader, String appIdValue,
			List<ExtendedConnettore> listExtendedConnettore)
					throws Exception {
		try {
			// ripristina dello stato solo in modalita change
			if(backToStato != null && tipoOp.equals(TipoOperazione.CHANGE)){
				return true;
			}

			int myIdInt = 0;
			if (tipoOp.equals(TipoOperazione.CHANGE)) {
				myIdInt = Integer.parseInt(myId);
			}
			if (idSoggettoFruitore == null) {
				idSoggettoFruitore = "";
			}
			if (url == null) {
				url = "";
			}
			if (nome == null) {
				nome = "";
			}
			if (tipo == null) {
				tipo = "";
			}
			if (user == null) {
				user = "";
			}
			if (password == null) {
				password = "";
			}
			if (initcont == null) {
				initcont = "";
			}
			if (urlpgk == null) {
				urlpgk = "";
			}
			if (provurl == null) {
				provurl = "";
			}
			if (connfact == null) {
				connfact = "";
			}
			if (sendas == null) {
				sendas = "";
			}
			// Campi obbligatori
			if (idSoggettoFruitore.equals("")) {
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_DATI_INCOMPLETI_SOGGETTO_MANCANTE);
				return false;
			}

			int idInt = 0;
			if (!nomeservizio.equals("")) {
				IDSoggetto ids = new IDSoggetto(tipoprov, nomeprov);
				IDServizio idserv = this.idServizioFactory.getIDServizioFromValues(tiposervizio, nomeservizio, ids, versioneservizio);
				AccordoServizioParteSpecifica myServ = this.apsCore.getServizio(idserv);
				idInt = myServ.getId().intValue();
			} else {
				idInt = Integer.parseInt(id);
			}
			AccordoServizioParteSpecifica asps = this.apsCore.getAccordoServizioParteSpecifica(idInt);
			String protocollo = ProtocolFactoryManager.getInstance().getProtocolByServiceType(asps.getTipo());
			
//			String tipologia = ServletUtils.getObjectFromSession(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;
//				}
//			}
//			boolean connettoreOnly = gestioneFruitori;
			
			String tmpModificaProfilo = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_PROFILO);
			boolean modificaProfilo = false;
			if(tmpModificaProfilo!=null) {
				modificaProfilo = "true".equals(tmpModificaProfilo);
			}
			
			// Se il connettore e' disabilitato devo controllare che il
			// connettore del soggetto non sia disabilitato se è di tipo operativo
			//if (this.isModalitaAvanzata() || connettoreOnly) {
			if ( !modificaProfilo && (this.isModalitaAvanzata() || TipoOperazione.CHANGE.equals(tipoOp)) ) {
				if (endpointtype.equals(TipiConnettore.DISABILITATO.getNome())) {
					String eptypeprov = TipiConnettore.DISABILITATO.getNome();
	
					org.openspcoop2.core.registry.Soggetto soggetto = this.soggettiCore.getSoggettoRegistro(Long.parseLong(idSoggettoFruitore));
					if(this.pddCore.isPddEsterna(soggetto.getPortaDominio())==false){
						// sto attivando una fruizione su un soggetto operativo
	
						Connettore connettore = asps.getConfigurazioneServizio().getConnettore();
						if ((connettore != null) && (connettore.getTipo() != null)) {
							eptypeprov = connettore.getTipo();
						}
						if (eptypeprov.equals(TipiConnettore.DISABILITATO.getNome())) {
						
							org.openspcoop2.core.registry.Soggetto soggettoErogatore = 
									this.soggettiCore.getSoggettoRegistro(new IDSoggetto(asps.getTipoSoggettoErogatore(), asps.getNomeSoggettoErogatore()));
							connettore = soggettoErogatore.getConnettore();
							if ((connettore != null) && (connettore.getTipo() != null)) {
								eptypeprov = connettore.getTipo();
							}
			
							boolean connettoreStatic = this.apsCore.isConnettoreStatic(protocollo);
							
							if (!connettoreStatic && eptypeprov.equals(TipiConnettore.DISABILITATO.getNome())) {
								if(tipoOp.equals(TipoOperazione.CHANGE)){
									this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_PER_POTER_DISABILITARE_IL_CONNETTORE_DEVE_PRIMA_ESSERE_DEFINITO_UN_CONNETTORE_SUL_SERVIZIO_O_SUL_SOGGETTO_EROGATORE);
								}
								else{
									if(this.isModalitaAvanzata()){
										this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_PER_POTER_AGGIUNGERE_IL_FRUITORE_DEVE_ESSERE_DEFINITO_IL_CONNETTORE_BR_IN_ALTERNATIVA_E_POSSIBILE_CONFIGURARE_UN_CONNETTORE_SUL_SERVIZIO_O_SUL_SOGGETTO_EROGATORE_PRIMA_DI_PROCEDERE_CON_LA_CREAZIONE_DEL_FRUITORE);
									}
									else{
										this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_PER_POTER_AGGIUNGERE_IL_FRUITORE_DEVE_PRIMA_ESSERE_DEFINITO_UN_CONNETTORE_SUL_SERVIZIO_O_SUL_SOGGETTO_EROGATORE);
									}
								}
								return false;
							}
							
						}
						
					}
					
				}
			
				boolean servizioApplicativoServerEnabled = false;
				String servizioApplicativoServer = null;
				// Controllo dell'end-point
				// Non li puo' prendere dalla servtlet
				if (!this.endPointCheckData(protocollo, false,
						endpointtype, url, nome, tipo,
						user, password, initcont, urlpgk, provurl, connfact,
						sendas, httpsurl, httpstipologia, httpshostverify,
						httpsTrustVerifyCert, httpspath, httpstipo, httpspwd, httpsalgoritmo, httpsstato,
						httpskeystore, httpspwdprivatekeytrust, httpspathkey,
						httpstipokey, httpspwdkey,
						httpspwdprivatekey, httpsalgoritmokey,
						httpsKeyAlias, httpsTrustStoreCRLs, httpsTrustStoreOCSPPolicy, httpsKeyStoreBYOKPolicy,
						tipoconn,autenticazioneHttp,
						proxyEnabled, proxyHost, proxyPort, proxyUsername, proxyPassword,
						tempiRispostaEnabled, tempiRispostaConnectionTimeout, tempiRispostaReadTimeout, tempiRispostaTempoMedioRisposta,
						opzioniAvanzate, transferMode, transferModeChunkSize, redirectMode, redirectMaxHop,
						requestOutputFileName, requestOutputFileNamePermissions, requestOutputFileNameHeaders, requestOutputFileNameHeadersPermissions,
						requestOutputParentDirCreateIfNotExists,requestOutputOverwriteIfExists,
						responseInputMode, responseInputFileName, responseInputFileNameHeaders, responseInputDeleteAfterRead, responseInputWaitTime,
						autenticazioneToken, tokenPolicy,
						autenticazioneApiKey, useOAS3Names, useAppId, apiKeyHeader, apiKeyValue, appIdHeader, appIdValue,
						listExtendedConnettore,servizioApplicativoServerEnabled,servizioApplicativoServer)) {
					return false;
				}
			}
			

			// 2 fruitori dello stesso servizio non possono avere lo stesso
			// provider
			if (tipoOp.equals(TipoOperazione.CHANGE)) {
				Fruitore myFru = this.apsCore.getServizioFruitore(myIdInt);
				String nomeSogg = myFru.getNome();
				String tipoSogg = myFru.getTipo();
				IDSoggetto idfru = new IDSoggetto(tipoSogg, nomeSogg);
				Soggetto mySogg = this.soggettiCore.getSoggettoRegistro(idfru);
				int idProv = mySogg.getId().intValue();

				IDServizio idserv = this.idServizioFactory.getIDServizioFromAccordo(asps);
				long idFru = this.apsCore.getServizioFruitore(idserv, idProv);
				if ((idFru != 0) && (tipoOp.equals(TipoOperazione.ADD) || ((tipoOp.equals(TipoOperazione.CHANGE)) && (myIdInt != idFru)))) {
					this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ESISTE_GI_AGRAVE_UN_FRUITORE_DEL_SERVIZIO_CON_LO_STESSO_SOGGETTO);
					return false;
				}
			}
			else{

				// Lettura accordo di servizio
				AccordoServizioParteComune as = null;
				IDAccordo idAccordo = this.idAccordoFactory.getIDAccordoFromUri(asps.getAccordoServizioParteComune());
				try{
					as = this.apcCore.getAccordoServizioFull(idAccordo);
				}catch(Exception e){
					this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_API_SELEZIONATA_NON_ESISTENTE_CON_PARAMETRI, idAccordo,e.getMessage()));
					return false;
				}

				// Validazione Documenti
				if(validazioneDocumenti && tipoOp.equals(TipoOperazione.ADD) && this.isModalitaAvanzata() ){
					
					FormatoSpecifica formato = null;
					if(as!=null) {
						formato = as.getFormatoSpecifica();
					}
					
					String wsdlimplerS = wsdlimpler.getValue() != null ? new String(wsdlimpler.getValue()) : null; 
					byte [] wsdlImplementativoErogatore = this.apsCore.getInterfaceAsByteArray(formato, wsdlimplerS);
					String wsdlimplfruS = wsdlimplfru.getValue() != null ? new String(wsdlimplfru.getValue()) : null; 
					byte [] wsdlImplementativoFruitore = this.apsCore.getInterfaceAsByteArray(formato, wsdlimplfruS);

					Fruitore f = new Fruitore();
					f.setByteWsdlImplementativoErogatore(wsdlImplementativoErogatore);
					f.setByteWsdlImplementativoFruitore(wsdlImplementativoFruitore);

					ValidazioneResult result = this.apsCore.validaInterfacciaWsdlParteSpecifica(f,asps, as, this.soggettiCore);
					if(!result.isEsito()){
						this.pd.setMessage(result.getMessaggioErrore());
						return false;
					}	

				}
				
				String gestioneToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN);
				String gestioneTokenPolicy = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_POLICY);
				String gestioneTokenValidazioneInput = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_VALIDAZIONE_INPUT);
				String gestioneTokenIntrospection = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_INTROSPECTION);
				String gestioneTokenUserInfo = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_USERINFO);
				String gestioneTokenTokenForward = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_TOKEN_FORWARD);
				
				String autorizzazioneAutenticatiToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_AUTENTICAZIONE_TOKEN);
				String autorizzazioneRuoliToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_RUOLI_TOKEN);
				
				String autorizzazione_token = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_TOKEN);
				String autorizzazione_tokenOptions = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_TOKEN_OPTIONS);
				String autorizzazioneScope = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_SCOPE);
				String autorizzazioneScopeMatch = this.getParameter(CostantiControlStation.PARAMETRO_SCOPE_MATCH);
								
				String autorizzazioneContenutiStato = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI_STATO);
				String autorizzazioneContenuti = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI);
				String autorizzazioneContenutiProperties = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI_PROPERTIES);
				
				String identificazioneAttributiStato = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_STATO);
				String [] attributeAuthoritySelezionate = this.getParameterValues(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_AUTHORITY);
				String attributeAuthorityAttributi = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_AUTHORITY_ATTRIBUTI);
				
				if(this.controlloAccessiCheck(tipoOp, fruizioneAutenticazione, fruizioneAutenticazioneOpzionale, fruizioneAutenticazionePrincipal, fruizioneAutenticazioneParametroList,
						fruizioneAutorizzazione, fruizioneAutorizzazioneAutenticati, fruizioneAutorizzazioneRuoli, 
						fruizioneAutorizzazioneRuoliTipologia, fruizioneAutorizzazioneRuoliMatch,
						true, true, null, null,gestioneToken, gestioneTokenPolicy, 
						gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenTokenForward,
						autorizzazioneAutenticatiToken, autorizzazioneRuoliToken, 
						autorizzazione_token,autorizzazione_tokenOptions,
						autorizzazioneScope,autorizzazioneScopeMatch,allegatoXacmlPolicy,
						autorizzazioneContenutiStato, autorizzazioneContenuti, autorizzazioneContenutiProperties,
						protocollo,
						identificazioneAttributiStato, attributeAuthoritySelezionate, attributeAuthorityAttributi)==false){
					return false;
				}
			}

			return true;

		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}

	private static boolean documentoUnivocoIndipendentementeTipo = true;
	public static boolean isDocumentoUnivocoIndipendentementeTipo() {
		return documentoUnivocoIndipendentementeTipo;
	}
	public static void setDocumentoUnivocoIndipendentementeTipo(boolean documentoUnivocoIndipendentementeTipo) {
		AccordiServizioParteSpecificaHelper.documentoUnivocoIndipendentementeTipo = documentoUnivocoIndipendentementeTipo;
	}
	public boolean serviziAllegatiCheckData(TipoOperazione tipoOp,FormFile formFile,Documento documento, IProtocolFactory<?> pf)
			throws Exception {

		try{

			String ruolo = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_RUOLO);

			// Campi obbligatori
			if (ruolo.equals("")) {
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_DATI_INCOMPLETI_E_NECESSARIO_INDICARE_IL_TIPO_DI_DOCUMENTO);
				return false;
			}

			if(formFile==null || formFile.getFileName()!=null && "".equals(formFile.getFileName())){
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_DOCUMENTO_OBBLIGATORIO);
				return false;
			}

			if(formFile==null || formFile.getFileSize()<=0){
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_DOCUMENTO_SELEZIONATO_NON_PUO_ESSERE_VUOTO);
				return false;
			}

			if(documento.getTipo()==null || "".equals(documento.getTipo()) || documento.getTipo().length()>30 || formFile.getFileName().lastIndexOf(".")==-1){
				if(documento.getTipo()==null || "".equals(documento.getTipo()) || formFile.getFileName().lastIndexOf(".")==-1){
					this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ESTENSIONE_DEL_DOCUMENTO_NON_VALIDA);
				}else{
					this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ESTENSIONE_DEL_DOCUMENTO_NON_VALIDA_DIMENSIONE_ESTENSIONE_TROPPO_LUNGA);
				}
				return false;
			}

			String labelServizio = getLabelServizioMessaggioErroreDocumentoDuplicato();
			
			if(this.archiviCore.existsDocumento(documento,ProprietariDocumento.servizio,documentoUnivocoIndipendentementeTipo)){

				String tipo = documento.getTipo();
				String ruoloDoc = documento.getRuolo();
				String allegatoMsg = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_CON_NOME_TIPO_GIA_PRESENTE_NEL_SERVIZIO_CON_PARAMETRI;
				String specificaMsg = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_LA_SPECIFICA_CON_NOME_TIPO_GIA_PRESENTE_NEL_SERVIZIO;
				if(documentoUnivocoIndipendentementeTipo) {
					tipo = null;
					ruoloDoc = null;
					allegatoMsg = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_CON_NOME_TIPO_GIA_PRESENTE_NEL_SERVIZIO_CON_PARAMETRI_SENZA_TIPO;
					specificaMsg = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_LA_SPECIFICA_CON_NOME_TIPO_GIA_PRESENTE_NEL_SERVIZIO_SENZA_TIPO;
				}
				
				//check se stesso documento
				Documento existing = this.archiviCore.getDocumento(documento.getFile(),tipo,ruoloDoc,documento.getIdProprietarioDocumento(),false,ProprietariDocumento.servizio);
				if(existing.getId().longValue() == documento.getId().longValue())
					return true;

				if(RuoliDocumento.allegato.toString().equals(documento.getRuolo()) || documentoUnivocoIndipendentementeTipo) {
					if(documentoUnivocoIndipendentementeTipo) {
						this.pd.setMessage(MessageFormat.format(allegatoMsg,
								documento.getFile(),labelServizio));
					}
					else {
						this.pd.setMessage(MessageFormat.format(allegatoMsg,
								documento.getFile(), documento.getTipo(),labelServizio));
					}
				}else {
//					if(documentoUnivocoIndipendentementeTipo) {
//						this.pd.setMessage(MessageFormat.format(specificaMsg, documento.getRuolo(),
//								documento.getFile(),labelServizio));
//					}
//					else {
					this.pd.setMessage(MessageFormat.format(specificaMsg, documento.getRuolo(),
							documento.getFile(), documento.getTipo(),labelServizio));
//					}
				}
				
				return false;
			}
			

			ValidazioneResult valida = pf.createValidazioneDocumenti().valida (documento);
			if(!valida.isEsito()) {
				this.pd.setMessage(valida.getMessaggioErrore());
				return false;
			}


			return true;

		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}
	private String getLabelServizioMessaggioErroreDocumentoDuplicato() {
		String labelServizio = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_LABEL_SERVIZIO;
		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;
			}
		}
		//Boolean vistaErogazioni = ServletUtils.getBooleanAttributeFromSession(ErogazioniCostanti.ASPS_EROGAZIONI_ATTRIBUTO_VISTA_EROGAZIONI, this.session, this.request).getValue();
		//if(vistaErogazioni != null && vistaErogazioni.booleanValue()) {
			if(gestioneFruitori) {
				labelServizio = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_LABEL_FRUIZIONE;
			} else {
				labelServizio = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_LABEL_EROGAZIONE;
			}
		/*} else {
			if(gestioneFruitori) {
				labelServizio = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_LABEL_FRUIZIONE;
			}
			else {
				labelServizio = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_LABEL_EROGAZIONE;
			}
		}*/
		return labelServizio;
	}
	
	@SuppressWarnings("incomplete-switch")
	public boolean serviziAllegatiCheckData(TipoOperazione tipoOp, List<BinaryParameter> binaryParameterDocumenti, Long idProprietarioDocumento, IProtocolFactory<?> pf)
			throws Exception {

		try{

			String ruolo = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_RUOLO);
			String tipoFile = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_FILE  );

			// Campi obbligatori
			if (ruolo.equals("")) {
				this.pd.setMessage(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_DATI_INCOMPLETI_E_NECESSARIO_INDICARE_IL_TIPO_DI_DOCUMENTO);
				return false;
			}
			
			// 1. Controllo selezione almeno un documento -> cioe' almento un value della lista non e' vuoto
			boolean almenoUnoSelezionato = false;
			for (int i = 0; i < binaryParameterDocumenti.size() ; i++) {
				BinaryParameter binaryParameter = binaryParameterDocumenti.get(i);
				
				// al primo file non vuoto che trovo mi fermo
				if(binaryParameter.getValue() != null && binaryParameter.getValue().length > 0){
					almenoUnoSelezionato = true;
					break;
				}
			}
			
			if(!almenoUnoSelezionato) {
				this.pd.setMessage("&Egrave; necessario selezionare almeno un documento.");
				return false;
			}
			
			List<String> listaErrori = new ArrayList<>();
			String labelServizio = getLabelServizioMessaggioErroreDocumentoDuplicato();
			
			for (int i = 0; i < binaryParameterDocumenti.size() ; i++) {
				BinaryParameter binaryParameter = binaryParameterDocumenti.get(i);
				
				if(StringUtils.isBlank(binaryParameter.getFilename())){
					listaErrori.add("Il documento selezionato in posizione ("+(i+1)+") non ha un nome valido.");
					continue;
				}

				if(binaryParameter.getValue()==null || binaryParameter.getValue().length<=0){
					listaErrori.add("Il documento '"+ binaryParameter.getFilename() +"' &egrave; vuoto.");
					continue;
				}
			
				String tipo = null;
				switch (RuoliDocumento.valueOf(ruolo)) {
					case allegato:
						tipo = binaryParameter.getFilename().substring(binaryParameter.getFilename().lastIndexOf('.')+1, binaryParameter.getFilename().length());
						break;
					case specificaSemiformale:
						tipo = TipiDocumentoSemiformale.valueOf(tipoFile).getNome();
						break;
					case specificaSicurezza:
						tipo = TipiDocumentoSicurezza.valueOf(tipoFile).getNome();
						break;
					case specificaLivelloServizio:
						tipo = TipiDocumentoLivelloServizio.valueOf(tipoFile).getNome();
						break;
				}
				
				
				if(tipo==null || "".equals(tipo) || tipo.length()>30 || binaryParameter.getFilename().lastIndexOf(".")==-1){
					if(tipo==null || "".equals(tipo) || binaryParameter.getFilename().lastIndexOf(".")==-1){
						listaErrori.add("L'estensione del documento '"+ binaryParameter.getFilename() +"' non &egrave; valida.");
					}else{
						listaErrori.add("L'estensione del documento '"+ binaryParameter.getFilename() +"' non &egrave; valida. La dimensione dell'estensione &egrave; troppo lunga.");
					}
					continue;
				}
				
				Documento documento = new Documento();
				documento.setRuolo(RuoliDocumento.valueOf(ruolo).toString());
				documento.setByteContenuto(binaryParameter.getValue());
				documento.setFile(binaryParameter.getFilename());

				switch (RuoliDocumento.valueOf(ruolo)) {
					case allegato:
						documento.setTipo(binaryParameter.getFilename().substring(binaryParameter.getFilename().lastIndexOf('.')+1, binaryParameter.getFilename().length()));
						break;
					case specificaSemiformale:
						documento.setTipo(TipiDocumentoSemiformale.valueOf(tipoFile).getNome());
						break;
					case specificaSicurezza:
						documento.setTipo(TipiDocumentoSicurezza.valueOf(tipoFile).getNome());
						break;
					case specificaLivelloServizio:
						documento.setTipo(TipiDocumentoLivelloServizio.valueOf(tipoFile).getNome());
						break;
				}
				documento.setIdProprietarioDocumento(idProprietarioDocumento);
				
				boolean documentoUnivocoIndipendentementeTipo = true;
				if(this.archiviCore.existsDocumento(documento,ProprietariDocumento.servizio,documentoUnivocoIndipendentementeTipo)){
	
					tipo = documento.getTipo();
					String ruoloDoc = documento.getRuolo();
					String allegatoMsg = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_CON_NOME_TIPO_GIA_PRESENTE_NEL_SERVIZIO_CON_PARAMETRI;
					String specificaMsg = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_LA_SPECIFICA_CON_NOME_TIPO_GIA_PRESENTE_NEL_SERVIZIO;
					if(documentoUnivocoIndipendentementeTipo) {
						tipo = null;
						ruoloDoc = null;
						allegatoMsg = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_ALLEGATO_CON_NOME_TIPO_GIA_PRESENTE_NEL_SERVIZIO_CON_PARAMETRI_SENZA_TIPO;
						specificaMsg = AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_LA_SPECIFICA_CON_NOME_TIPO_GIA_PRESENTE_NEL_SERVIZIO_SENZA_TIPO;
					}
					
					Documento existing = this.archiviCore.getDocumento(documento.getFile(),tipo,ruoloDoc,documento.getIdProprietarioDocumento(),false,ProprietariDocumento.servizio);
					if(!(existing.getId().longValue() == documento.getId().longValue())) {
						if(RuoliDocumento.allegato.toString().equals(documento.getRuolo()) || documentoUnivocoIndipendentementeTipo) {
							if(documentoUnivocoIndipendentementeTipo) {
								listaErrori.add(MessageFormat.format(allegatoMsg, documento.getFile(), labelServizio));
							}
							else {
								listaErrori.add(MessageFormat.format(allegatoMsg, documento.getFile(), documento.getTipo(), labelServizio));
							}
						}else {
//							if(documentoUnivocoIndipendentementeTipo) {
//								listaErrori.add(MessageFormat.format(specificaMsg, documento.getRuolo(), documento.getFile(), labelServizio));
//							}
//							else {
							listaErrori.add(MessageFormat.format(specificaMsg, documento.getRuolo(), documento.getFile(), documento.getTipo(), labelServizio));
//							}
						}
	
						continue;
					}
				}
	
				ValidazioneResult valida = pf.createValidazioneDocumenti().valida (documento);
				if(!valida.isEsito()) {
					listaErrori.add(valida.getMessaggioErrore());
					continue;
				}
			}
			
			if(!listaErrori.isEmpty()) {
				StringBuilder sb = new StringBuilder();
				
				for (int i = 0; i < listaErrori.size(); i++) {
					if(i != 0) {
						sb.append("<br/>");
					}
					sb.append(listaErrori.get(i));
				}
				
				this.pd.setMessage(sb.toString());
				return false;
			}
			
			return true;

		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}

	public void prepareServiziAllegatiList(AccordoServizioParteSpecifica asps, ISearch ricerca, List<Documento> lista) throws Exception {
		try {
			
			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;
				}
			}
			
			String id = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID);		
			
			String tipoSoggettoFruitore = null;
			String nomeSoggettoFruitore = null;
			IDSoggetto idSoggettoFruitore = null;
			Parameter pTipoSoggettoFruitore = null;
			Parameter pNomeSoggettoFruitore = null;
			if(gestioneFruitori) {
				tipoSoggettoFruitore = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE);
				nomeSoggettoFruitore = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE);
				idSoggettoFruitore = new IDSoggetto(tipoSoggettoFruitore, nomeSoggettoFruitore);
				pTipoSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE, tipoSoggettoFruitore);
				pNomeSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE, nomeSoggettoFruitore);
			}
			
			Parameter pModificaAPI = null;
			String modificaAPI = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API);
			if(modificaAPI!=null) {
				pModificaAPI = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API, modificaAPI);
			}
			
			List<Parameter> listAllegatiSession = new ArrayList<>();
			listAllegatiSession.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id));
			if(gestioneFruitori) {
				listAllegatiSession.add(pTipoSoggettoFruitore);
				listAllegatiSession.add(pNomeSoggettoFruitore);
			}
			if(pModificaAPI!=null) {
				listAllegatiSession.add(pModificaAPI);
			}
			ServletUtils.addListElementIntoSession(this.request, this.session, AccordiServizioParteSpecificaCostanti.OBJECT_NAME_APS_ALLEGATI, 
					listAllegatiSession.toArray(new Parameter[1]));

			int idLista = Liste.SERVIZI_ALLEGATI;
			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);
			String search = ServletUtils.getSearchFromSession(ricerca, idLista);

			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));
						
			String tipoProtocollo = this.apsCore.getProtocolloAssociatoTipoServizio(asps.getTipo());
			
			String tmpTitle = this.getLabelServizio(idSoggettoFruitore, gestioneFruitori, asps, tipoProtocollo);
			
			// setto la barra del titolo
			List<Parameter> lstParam = new ArrayList<>();

			Boolean vistaErogazioni = ServletUtils.getBooleanAttributeFromSession(ErogazioniCostanti.ASPS_EROGAZIONI_ATTRIBUTO_VISTA_EROGAZIONI, this.session, this.request).getValue();
			if(vistaErogazioni != null && vistaErogazioni.booleanValue()) {
				if(gestioneFruitori) {
					lstParam.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_FRUIZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
				} else {
					lstParam.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_EROGAZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
				}
				List<Parameter> listErogazioniChange = new ArrayList<>();
				Parameter pIdServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId()+ "");
				Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, asps.getNome());
				Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, asps.getTipo());
				listErogazioniChange.add(pIdServizio);
				listErogazioniChange.add(pNomeServizio);
				listErogazioniChange.add(pTipoServizio);
				if(gestioneFruitori) {
					listErogazioniChange.add(pNomeSoggettoFruitore);
					listErogazioniChange.add(pTipoSoggettoFruitore);
				}
				if(pModificaAPI!=null) {
					listErogazioniChange.add(pModificaAPI);
				}
				lstParam.add(new Parameter(tmpTitle, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_CHANGE, 
						listErogazioniChange.toArray(new Parameter[1])));
				
				lstParam.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_MODIFICA_SERVIZIO_INFO_GENERALI, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE, 
						listErogazioniChange.toArray(new Parameter[1])));
				
				if(search.equals("")){
					this.pd.setSearchDescription("");
					lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI, null));
				}else{
					lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI,
							AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ALLEGATI_LIST, 
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + "")
							));
					lstParam.add(new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_RISULTATI_RICERCA, null));
				}
			} else {
				if(gestioneFruitori) {
					lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
				}
				else {
					lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
				}
				
				if(search.equals("")){
					this.pd.setSearchDescription("");
					lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI_DI + tmpTitle, null));
				}else{
					lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI_DI + tmpTitle,
							AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ALLEGATI_LIST, 
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + "")
							));
					lstParam.add(new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_RISULTATI_RICERCA, null));
				}
			}
			

			// setto la barra del titolo
			ServletUtils.setPageDataTitle(this.pd, lstParam );

			// controllo eventuali risultati ricerca
			this.pd.setSearchLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_FILE);
			if (!search.equals("")) {
				ServletUtils.enabledPageDataSearch(this.pd, AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI, search);
			}

			// setto le label delle colonne
			String[] labels = {
					AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_FILE,
					AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_RUOLO,
					AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO_FILE,
					AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_THE_FILE
			};
			this.pd.setLabels(labels);

			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			if (lista != null) {
				Iterator<Documento> it = lista.iterator();
				while (it.hasNext()) {
					Documento doc = it.next();

					Parameter pIdAllegato= new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_ALLEGATO, doc.getId() + "");
					Parameter pId= new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + "");
					Parameter pNomeDoc= new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_DOCUMENTO, doc.getFile());

					List<DataElement> e = new ArrayList<>();

					DataElement de = new DataElement();
					List<Parameter> listAllegatiChange = new ArrayList<>();
					listAllegatiChange.add(pIdAllegato);
					listAllegatiChange.add(pId);
					listAllegatiChange.add(pNomeDoc);
					if(gestioneFruitori) {
						listAllegatiChange.add(pTipoSoggettoFruitore);
						listAllegatiChange.add(pNomeSoggettoFruitore);
					}
					if(pModificaAPI!=null) {
						listAllegatiChange.add(pModificaAPI);
					}
					de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ALLEGATI_CHANGE,
							listAllegatiChange.toArray(new Parameter[1]));
					de.setValue(doc.getFile());
					de.setIdToRemove(""+doc.getId());
					e.add(de);

					de = new DataElement();
					de.setValue(doc.getRuolo());
					e.add(de);

					de = new DataElement();
					de.setValue(doc.getTipo());
					e.add(de);

					de = new DataElement();
					if(this.core.isShowAllegati()) {
						de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ALLEGATI_VIEW,
								pIdAllegato,pId,pNomeDoc);
						de.setValue(Costanti.LABEL_VISUALIZZA);
					}
					else {
						Parameter pIdAccordo = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_ACCORDO, asps.getId() + "");
						Parameter pTipoDoc = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_DOCUMENTO, "asps");
						de.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT,
								pIdAllegato,pId,pNomeDoc,pIdAccordo,pTipoDoc);
						de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_DOWNLOAD.toLowerCase());
						de.setDisabilitaAjaxStatus();
					}
					e.add(de);

					dati.add(e);
				}
			}

			this.pd.setDati(dati);

			if(this.isShowGestioneWorkflowStatoDocumenti() && StatiAccordo.finale.toString().equals(asps.getStatoPackage())){
				this.pd.setAddButton(false);
				this.pd.setRemoveButton(false);
				this.pd.setSelect(false);
			}else{
				this.pd.setAddButton(true);
				this.pd.setRemoveButton(true);
				this.pd.setSelect(true);
			}

		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}

	public void prepareServiziList(ISearch ricerca, List<AccordoServizioParteSpecifica> lista)
			throws Exception {
		try {

			if(lista==null) {
				throw new Exception("Lista is null");
			}
			
			ServletUtils.addListElementIntoSession(this.request, this.session, AccordiServizioParteSpecificaCostanti.OBJECT_NAME_APS);

			Boolean contaListe = ServletUtils.getContaListeFromSession(this.session);

			User user = ServletUtils.getUserFromSession(this.request, this.session);

			Boolean isAccordiCooperazione = user.getPermessi().isAccordiCooperazione();
			Boolean isServizi = user.getPermessi().isServizi();

			String tipologia = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
			
			boolean showProtocolli = this.core.countProtocolli(this.request, this.session)>1;
			boolean showServiceBinding = true;
			if( !showProtocolli ) {
				List<String> l = this.core.getProtocolli(this.request, this.session);
				if(l.size()>0) {
					IProtocolFactory<?> p = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(l.get(0));
					if(p.getManifest().getBinding().getRest()==null || p.getManifest().getBinding().getSoap()==null) {
						showServiceBinding = false;
					}
				}
			}
			
			int idLista = Liste.SERVIZI;
			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);
			String search = ServletUtils.getSearchFromSession(ricerca, idLista);

			addFilterProtocol(ricerca, idLista);
			
			if(showServiceBinding) {
				String filterTipoAccordo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_SERVICE_BINDING);
				this.addFilterServiceBinding(filterTipoAccordo,false,true);
			}
			
			if(this.isShowGestioneWorkflowStatoDocumenti()){
				if(this.core.isGestioneWorkflowStatoDocumentiVisualizzaStatoLista()) {
					String filterStatoAccordo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_STATO_ACCORDO);
					this.addFilterStatoAccordo(filterStatoAccordo,false);
				}
			}
			
			boolean showConfigurazionePA = false;
			boolean showConfigurazionePD = false;
			boolean showSoggettoFruitore = false;
			boolean showSoggettoErogatore = false;
			boolean showFruitori = false;
			boolean showConnettorePA = false;
			boolean showConnettorePD = false;
			boolean gestioneFruitori = false;
			
			if(tipologia==null) {
				String filterDominio = null;
				if(this.core.isGestionePddAbilitata(this)==false) {
					filterDominio = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_DOMINIO);
					this.addFilterDominio(filterDominio, false);
				}
				PddTipologia pddTipologiaFilter = null;
				if(filterDominio!=null && !"".equals(filterDominio)) {
					pddTipologiaFilter = PddTipologia.toPddTipologia(filterDominio);
				}
				
				showConfigurazionePA = pddTipologiaFilter==null || !PddTipologia.ESTERNO.equals(pddTipologiaFilter);
				if(showConfigurazionePA) {
					showConnettorePA = true; // altrimenti non vi e' un modo per modificarlo come invece succede per la fruizione nel caso multitenant
				}
				showFruitori = pddTipologiaFilter==null || this.isModalitaCompleta() || PddTipologia.ESTERNO.equals(pddTipologiaFilter);
				showSoggettoErogatore = true;
			}
			else {
				if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_EROGAZIONE.equals(tipologia)) {
					showConfigurazionePA = true;
					showSoggettoErogatore = false; // si e' deciso che non si fa vedere essendo solo uno
					showConnettorePA = true;
				}
				if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE.equals(tipologia)) {
					gestioneFruitori = true;
					showConfigurazionePD = true;
					//showSoggettoFruitore = true;
					showSoggettoFruitore = false; // si e' deciso che non si fa vedere essendo solo uno
					showSoggettoErogatore = true;
					showConnettorePD = true;
				}
			}
			
			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));
			// setto la barra del titolo
			List<Parameter> lstParm = new ArrayList<>();

			if(showConfigurazionePD) {
				lstParm.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
			}
			else {
				lstParm.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
			}
//			lstParm.add(new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_ELENCO, 
//					AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
			this.pd.setSearchLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_RICERCA_SERVIZIO_SOGGETTO);
			if(search.equals("")){
				this.pd.setSearchDescription("");
			}else{
				lstParm.add(new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_RISULTATI_RICERCA, null));
			}

			// setto la barra del titolo
			ServletUtils.setPageDataTitle(this.pd, lstParm );

			// controllo eventuali risultati ricerca
			if (!search.equals("")) {
				ServletUtils.enabledPageDataSearch(this.pd, AccordiServizioParteSpecificaCostanti.LABEL_APS, search);
			}

			// setto le label delle colonne
			String[] labels = null;
			//String servizioLabel = AccordiServizioParteSpecificaCostanti.LABEL_APS;

			String asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO;

			if(isServizi && !isAccordiCooperazione){
				asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_PARTE_COMUNE;
			}

			if(!isServizi  && isAccordiCooperazione){
				asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_COMPOSTO;
			}

			if(isServizi  && isAccordiCooperazione){
				asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO;
			}

			@SuppressWarnings("unused")
			String correlatoLabel = AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_RUOLO;

			String fruitoriLabel = AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI;

			
			List<AccordoServizioParteComuneSintetico> listApc = new ArrayList<AccordoServizioParteComuneSintetico>();
			List<String> protocolli = new ArrayList<>();
			
			boolean showRuoli = false;
			for (AccordoServizioParteSpecifica asps : lista) {
				AccordoServizioParteComuneSintetico apc = this.apcCore.getAccordoServizioSintetico(asps.getIdAccordo());
				ServiceBinding serviceBinding = this.apcCore.toMessageServiceBinding(apc.getServiceBinding());
				String tipoSoggetto = asps.getTipoSoggettoErogatore();
				String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(tipoSoggetto);
				showRuoli = showRuoli ||  this.core.isProfiloDiCollaborazioneAsincronoSupportatoDalProtocollo(protocollo,serviceBinding);
				
				listApc.add(apc);
				protocolli.add(protocollo);
			}
						
			// controllo visualizzazione colonna ruolo
			List<String> listaLabelTabella = new ArrayList<>();

			listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO);
			if(showSoggettoErogatore) {
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_EROGATORE);
			}
			if(showSoggettoFruitore) {
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_FRUITORE);
			}
			if( showProtocolli ) {
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROTOCOLLO_COMPACT);
			}
			listaLabelTabella.add(asLabel);
			
			// serviceBinding
			if(showServiceBinding) {
				listaLabelTabella.add(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_SERVICE_BINDING);
			}

			if(showConfigurazionePA) {
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_DATI_INVOCAZIONE);
				if(showConnettorePA) {
					listaLabelTabella.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE);
					listaLabelTabella.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_VERIFICA_CONNETTORE);
					listaLabelTabella.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONFIGURAZIONE_CONNETTORI_MULTIPLI);
					listaLabelTabella.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_ELENCO_CONNETTORI_MULTIPLI);
				}
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_APPLICATIVE);
			}
			
			if(showConfigurazionePD) {
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_DATI_INVOCAZIONE);
				if(showConnettorePD) {
					listaLabelTabella.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONNETTORE);
				}
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE);
			}
			
			if(showRuoli) {
				//listaLabelTabella.add(correlatoLabel);
			}
			if(this.isShowGestioneWorkflowStatoDocumenti()) {
				if(this.core.isGestioneWorkflowStatoDocumentiVisualizzaStatoLista()) {
					listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_STATO);
				}
			}
			if(showFruitori) {
				listaLabelTabella.add(fruitoriLabel);
			}
			if(!this.isModalitaStandard()) {
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI);
			}

			labels = listaLabelTabella.toArray(new String[listaLabelTabella.size()]);

			// "Politiche SLA" };
			this.pd.setLabels(labels);

			// Prendo la lista di accordi dell'utente connesso
			/*List<Long> idsAcc = new ArrayList<Long>();
			List<AccordoServizio> listaAcc = this.core.accordiList(superUser, new Search(true));
			Iterator<AccordoServizio> itA = listaAcc.iterator();
			while (itA.hasNext()) {
				AccordoServizio as = (AccordoServizio) itA.next();
				idsAcc.add(as.getId());
			}*/

			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			for (int i = 0; i < lista.size(); i++) {
				AccordoServizioParteSpecifica asps = lista.get(i);

				Fruitore fruitore = null;
				if(showConfigurazionePD) {
					fruitore = asps.getFruitore(0); // NOTA: il metodo 'soggettiServizioList' ritorna un unico fruitore in caso di gestioneFruitori abiltata per ogni entry. Crea cioè un accordo con fruitore per ogni fruitore esistente
				}
				
				String protocollo = protocolli.get(i);
				
				List<DataElement> e = new ArrayList<>();

				Parameter pIdsoggErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, ""+asps.getIdSoggetto());
				Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, asps.getNome());
				Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, asps.getTipo());
				@SuppressWarnings("unused")
				Parameter pVersioneServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VERSIONE, asps.getVersione().intValue()+"");

				String uriASPS = this.idServizioFactory.getUriFromAccordo(asps);
				
				Soggetto sog = this.soggettiCore.getSoggettoRegistro(asps.getIdSoggetto());
				boolean isPddEsterna = this.pddCore.isPddEsterna(sog.getPortaDominio());
				
				DataElement de = new DataElement();
				de.setUrl(
					AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE,
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + ""),
					pNomeServizio, pTipoServizio, pIdsoggErogatore);
				de.setValue(this.getLabelNomeServizio(protocollo, asps.getTipo(), asps.getNome(), asps.getVersione()));
				de.setIdToRemove(uriASPS);
				e.add(de);

						
				if(showSoggettoErogatore) {
					de = new DataElement();
					de.setUrl(
							SoggettiCostanti.SERVLET_NAME_SOGGETTI_CHANGE, 
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_ID, asps.getIdSoggetto() + ""),
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_TIPO, asps.getTipoSoggettoErogatore()),
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_NOME, asps.getNomeSoggettoErogatore()));
					de.setValue(this.getLabelNomeSoggetto(protocollo, asps.getTipoSoggettoErogatore() , asps.getNomeSoggettoErogatore()));
					e.add(de);
				}
				
				if(showSoggettoFruitore) {
					de = new DataElement();
					de.setUrl(
							SoggettiCostanti.SERVLET_NAME_SOGGETTI_CHANGE, 
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_ID, fruitore.getIdSoggetto() + ""),
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_TIPO, fruitore.getTipo()),
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_NOME, fruitore.getNome()));
					de.setValue(this.getLabelNomeSoggetto(protocollo, fruitore.getTipo() , fruitore.getNome()));
					e.add(de);
				}
				
				if(showProtocolli) {
					de = new DataElement();
					de.setValue(this.getLabelProtocollo(protocollo));
					e.add(de);
				}
				
				de = new DataElement();
				AccordoServizioParteComuneSintetico apc = listApc.get(i);
				ServiceBinding serviceBinding = this.apcCore.toMessageServiceBinding(apc.getServiceBinding());

				Parameter pTipoAccordo = AccordiServizioParteComuneUtilities.getParametroAccordoServizio(apc);

				de.setUrl(
						AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, 
						new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getIdAccordo() + ""),
						new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME, apc.getNome()), pTipoAccordo);
				de.setValue(this.getLabelIdAccordo(apc));
				e.add(de);
				
				if(showServiceBinding) {
					de = new DataElement();
					switch (serviceBinding) {
					case REST:
						de.setValue(CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_REST);
						break;
					case SOAP:
					default:
						de.setValue(CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_SOAP);
						break;
					}
					e.add(de);
				}
				
				// colonna configurazioni
				if(showConfigurazionePA) {
					
					// Utilizza la configurazione come parent
					ServletUtils.setObjectIntoSession(this.request, this.session, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT_CONFIGURAZIONE, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT);
										
					IDServizio idServizio = this.idServizioFactory.getIDServizioFromAccordo(asps);
					
					Parameter paIdSogg = null;
					Parameter paNomePorta = null;
					Parameter paIdPorta = null;
					Parameter paIdAsps = null;
					Parameter paConfigurazioneDati = null;
					Parameter paIdProvider = null;
					Parameter paIdPortaPerSA = null;
					Parameter paConnettoreDaListaAPS = null;
					IDPortaApplicativa idPA = null;
					PortaApplicativa paDefault = null;
					PortaApplicativaServizioApplicativo paSADefault = null;
					boolean connettoreMultiploEnabled = false;
					boolean checkConnettore = false;
					boolean visualizzaConnettore = true;
					long idConnettore = 1;
					if(!isPddEsterna){
						idPA = this.porteApplicativeCore.getIDPortaApplicativaAssociataDefault(idServizio);
						if(idPA!=null) {
							paDefault = this.porteApplicativeCore.getPortaApplicativa(idPA);
						}
						paIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, asps.getIdSoggetto() + "");
						paIdAsps = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_ASPS, asps.getId()+ "");
						paConfigurazioneDati = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_CONFIGURAZIONE_DATI_INVOCAZIONE, Costanti.CHECK_BOX_ENABLED_TRUE);
						paConnettoreDaListaAPS = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_CONNETTORE_DA_LISTA_APS, Costanti.CHECK_BOX_ENABLED_TRUE);
						if(paDefault!=null) {
							paSADefault = paDefault.getServizioApplicativoList().get(0);
							paNomePorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME_PORTA, paDefault.getNome());
							paIdPorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID, ""+paDefault.getId());
							paIdProvider = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_PROVIDER, paDefault.getIdSoggetto() + "");
							paIdPortaPerSA = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_PORTA, ""+paDefault.getId());
						}
						
						List<MappingErogazionePortaApplicativa> listaMappingErogazionePortaApplicativa = this.apsCore.mappingServiziPorteAppList(idServizio,asps.getId(), null);
						List<PortaApplicativa> listaPorteApplicativeAssociate = new ArrayList<>();
						for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
							listaPorteApplicativeAssociate.add(this.porteApplicativeCore.getPortaApplicativa(mappinErogazione.getIdPortaApplicativa()));
						}
						
						for (int z= 0; z < listaPorteApplicativeAssociate.size(); z++) {
							PortaApplicativa paAssociata = listaPorteApplicativeAssociate.get(z);
							MappingErogazionePortaApplicativa mapping = listaMappingErogazionePortaApplicativa.get(z);
							
							if(!mapping.isDefault()) {
								PortaApplicativaServizioApplicativo portaApplicativaAssociataServizioApplicativo = paAssociata.getServizioApplicativoList().get(0);
								boolean connettoreConfigurazioneRidefinito = this.isConnettoreRidefinito(paDefault, paSADefault, paAssociata, portaApplicativaAssociataServizioApplicativo, paAssociata.getServizioApplicativoList());
								if(connettoreConfigurazioneRidefinito) {
									visualizzaConnettore = false;
									break;
								}
							}
							
						}
						
						if(visualizzaConnettore) {
							if(paDefault!=null) {
								connettoreMultiploEnabled = paDefault.getBehaviour() != null;
								PortaApplicativaServizioApplicativo paDefautServizioApplicativo = paDefault.getServizioApplicativoList().get(0);
								IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
								idServizioApplicativo.setIdSoggettoProprietario(new IDSoggetto(paDefault.getTipoSoggettoProprietario(), paDefault.getNomeSoggettoProprietario()));
								idServizioApplicativo.setNome(paDefautServizioApplicativo.getNome());
								ServizioApplicativo sa = this.saCore.getServizioApplicativo(idServizioApplicativo);
								org.openspcoop2.core.config.Connettore connettore = sa.getInvocazioneServizio().getConnettore();
								idConnettore = connettore.getId();
								checkConnettore = org.openspcoop2.pdd.core.connettori.ConnettoreCheck.checkSupported(connettore);
							}
						}
					}
					
					
					// url invocazione
					de = new DataElement();
					if(isPddEsterna || this.isModalitaCompleta()){
						de.setType(DataElementType.TEXT);
						de.setValue("-");
					}
					else{					
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,paIdSogg, paNomePorta, paIdPorta,paIdAsps,paConfigurazioneDati);
						ServletUtils.setDataElementVisualizzaLabel(de);						
					}
					e.add(de);
					
					
					// connettore
					if(showConnettorePA) {
						de = new DataElement();
						if(isPddEsterna || this.isModalitaCompleta()){
							de.setType(DataElementType.TEXT);
							de.setValue("-");
						}
						else{	
							
							boolean visualizzaLinkConfigurazioneConnettore = 
									visualizzaConnettore && 
									(
											(!this.core.isConnettoriMultipliEnabled())
											|| 
											( !connettoreMultiploEnabled )
									);
							if(visualizzaLinkConfigurazioneConnettore) {
								PortaApplicativaServizioApplicativo portaApplicativaServizioApplicativo = paDefault.getServizioApplicativoList().get(0);
								//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
								de.setUrl(ServiziApplicativiCostanti.SERVLET_NAME_SERVIZI_APPLICATIVI_ENDPOINT, paIdProvider, paIdPortaPerSA, paIdAsps,
										new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_NOME_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getNome()),
										new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_ID_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getIdServizioApplicativo()+""),
										paConnettoreDaListaAPS);
								ServletUtils.setDataElementVisualizzaLabel(de);
							} else {
								de.setType(DataElementType.TEXT);
								de.setValue("-");
							}
						}
						e.add(de);
						
						// verifica
						de = new DataElement();
						Parameter pIdConnettore = new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ID, idConnettore+"");
						Parameter pConnettoreAccessoDaGruppi = new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ACCESSO_DA_GRUPPI, "false");
						Parameter pConnettoreVerificaAccesso = new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_REGISTRO, "false");
						if(isPddEsterna || this.isModalitaCompleta()){
							de.setType(DataElementType.TEXT);
							de.setValue("-");
						}
						else{
							boolean visualizzaLinkCheckConnettore =
									visualizzaConnettore && 
									checkConnettore && 
									(
											!this.core.isConnettoriMultipliEnabled() 
											|| 
											( !connettoreMultiploEnabled )
									);
							if(visualizzaLinkCheckConnettore) {
								List<Parameter> listParametersVerificaConnettore = new ArrayList<>();
								paIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, asps.getIdSoggetto() + "");
								listParametersVerificaConnettore.add(paIdSogg);
								listParametersVerificaConnettore.add(paIdPorta);
								listParametersVerificaConnettore.add(paIdAsps);
								listParametersVerificaConnettore.add(paConnettoreDaListaAPS);
								listParametersVerificaConnettore.add(pIdConnettore);
								listParametersVerificaConnettore.add(pConnettoreAccessoDaGruppi);
								listParametersVerificaConnettore.add(pConnettoreVerificaAccesso);
								
								de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VERIFICA_CONNETTORE, 
										listParametersVerificaConnettore.toArray(new Parameter[1]));
								ServletUtils.setDataElementVisualizzaLabel(de);
							} else {
								de.setType(DataElementType.TEXT);
								de.setValue("-");
							}
							
						}
						e.add(de);
						
						// configura connettori multipli
						de = new DataElement();
						if(isPddEsterna || this.isModalitaCompleta()){
							de.setType(DataElementType.TEXT);
							de.setValue("-");
						}
						else{
							if(visualizzaConnettore && this.core.isConnettoriMultipliEnabled()) {
								List<Parameter> listParametersConfigutazioneConnettoriMultipli = new ArrayList<>();
								paIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, asps.getIdSoggetto() + "");
								listParametersConfigutazioneConnettoriMultipli.add(paIdSogg);
								listParametersConfigutazioneConnettoriMultipli.add(paIdPorta);
								listParametersConfigutazioneConnettoriMultipli.add(paIdAsps);
								listParametersConfigutazioneConnettoriMultipli.add(paConnettoreDaListaAPS);
								listParametersConfigutazioneConnettoriMultipli.add(pIdConnettore);
								listParametersConfigutazioneConnettoriMultipli.add(pConnettoreAccessoDaGruppi);
								listParametersConfigutazioneConnettoriMultipli.add(pConnettoreVerificaAccesso);
								
								de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONFIGURAZIONE_CONNETTORI_MULTIPLI, 
										listParametersConfigutazioneConnettoriMultipli.toArray(new Parameter[1]));
								de.setValue(this.getStatoConnettoriMultipliPortaApplicativa(paDefault));
								
							} else {
								de.setType(DataElementType.TEXT);
								de.setValue("-");
							}
						}
						e.add(de);
						
						// lista  connettori multipli
						de = new DataElement();
						if(isPddEsterna || this.isModalitaCompleta()){
							de.setType(DataElementType.TEXT);
							de.setValue("-");
						}
						else{
							if(visualizzaConnettore && this.core.isConnettoriMultipliEnabled() && connettoreMultiploEnabled) {
								List<Parameter> listParametersConfigutazioneConnettoriMultipli = new ArrayList<>();
								paIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, asps.getIdSoggetto() + "");
								listParametersConfigutazioneConnettoriMultipli.add(paIdSogg);
								listParametersConfigutazioneConnettoriMultipli.add(paIdPorta);
								listParametersConfigutazioneConnettoriMultipli.add(paIdAsps);
								listParametersConfigutazioneConnettoriMultipli.add(paConnettoreDaListaAPS);
								listParametersConfigutazioneConnettoriMultipli.add(pIdConnettore);
								listParametersConfigutazioneConnettoriMultipli.add(pConnettoreAccessoDaGruppi);
								listParametersConfigutazioneConnettoriMultipli.add(pConnettoreVerificaAccesso);
								listParametersConfigutazioneConnettoriMultipli.add(new Parameter(CostantiControlStation.PARAMETRO_ID_CONN_TAB, "0"));
								
								de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORI_MULTIPLI_LIST, 
										listParametersConfigutazioneConnettoriMultipli.toArray(new Parameter[1]));
								
								if(contaListe)
									ServletUtils.setDataElementVisualizzaLabel(de, (long) paDefault.sizeServizioApplicativoList());
								else 
									ServletUtils.setDataElementVisualizzaLabel(de);
									
							}else {
								de.setType(DataElementType.TEXT);
								de.setValue("-");
							}
						}
						e.add(de);
					}
					
					// configurazione
					de = new DataElement();
					if(isPddEsterna){
						de.setType(DataElementType.TEXT);
						de.setValue("-");
					}
					else{
						de.setUrl(
								AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_PORTE_APPLICATIVE_LIST,
								new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + ""),
								pNomeServizio, pTipoServizio, pIdsoggErogatore,
								new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_GRUPPI,"true"),
								new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_CONFIGURAZIONI,"true"));
						// +"&nomeprov="+soggErogatore+"&tipoprov="+tipoSoggEr);
						if (contaListe) {
							// BugFix OP-674
							//List<PortaApplicativa> lista1 = this.apsCore.serviziPorteAppList(servizio.getTipo(),servizio.getNome(),asps.getVersione(),
							//		asps.getId().intValue(), asps.getIdSoggetto(), new Search(true));
							ConsoleSearch searchForCount = new ConsoleSearch(true,1);
							this.apsCore.mappingServiziPorteAppList(idServizio, asps.getId(), searchForCount);
							//int numPA = lista1.size();
							int numPA = searchForCount.getNumEntries(Liste.CONFIGURAZIONE_EROGAZIONE);
							ServletUtils.setDataElementVisualizzaLabel(de, (long) numPA );
						} else
							ServletUtils.setDataElementVisualizzaLabel(de);
					}
					e.add(de);
					
				}
				
				if(showConfigurazionePD) {
					
					// Utilizza la configurazione come parent
					ServletUtils.setObjectIntoSession(this.request, this.session, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT_CONFIGURAZIONE, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT);
										
					IDServizio idServizio = this.idServizioFactory.getIDServizioFromAccordo(asps);
					IDSoggetto idFruitore = new IDSoggetto(fruitore.getTipo(), fruitore.getNome());
					
					IDPortaDelegata idPD = this.porteDelegateCore.getIDPortaDelegataAssociataDefault(idServizio, idFruitore);
					PortaDelegata pdDefault = this.porteDelegateCore.getPortaDelegata(idPD);
						
					Parameter pIdPD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, "" + pdDefault.getId());
					Parameter pNomePD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME_PORTA, pdDefault.getNome());
					Parameter pIdSoggPD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, pdDefault.getIdSoggetto() + "");
					Parameter pIdAsps = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_ASPS, asps.getId()+"");
					Parameter pId = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId()+"");
					Parameter pIdSoggettoErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, asps.getIdSoggetto()+"");
					Parameter pIdFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, fruitore.getId()+ "");
					Parameter pConfigurazioneDati = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_CONFIGURAZIONE_DATI_INVOCAZIONE, Costanti.CHECK_BOX_ENABLED_TRUE);
					Parameter pConnettoreDaListaAPS = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_CONNETTORE_DA_LISTA_APS, Costanti.CHECK_BOX_ENABLED_TRUE);
										
					Long idSoggettoLong = fruitore.getIdSoggetto();
					if(idSoggettoLong==null) {
						idSoggettoLong = this.soggettiCore.getIdSoggetto(fruitore.getNome(), fruitore.getTipo());
					}
					Parameter pIdProviderFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE, idSoggettoLong + "");
					Parameter pIdSogg = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO, idSoggettoLong + "");
					
					// url invocazione
					de = new DataElement();				
					de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneDati);
					ServletUtils.setDataElementVisualizzaLabel(de);						
					e.add(de);				
					
					// connettore	
					if(showConnettorePD) {
						
						// Controllo se richiedere il connettore
						boolean connettoreStatic = false;
						if(gestioneFruitori) {
							connettoreStatic = this.apsCore.isConnettoreStatic(protocollo);
						}
						
						de = new DataElement();
						if(!connettoreStatic) {
							List<Parameter> listParameter = new ArrayList<>();
							listParameter.add(pId);
							listParameter.add(pIdFruitore);
							listParameter.add(pIdSoggettoErogatore);
							listParameter.add(pIdProviderFruitore);
							listParameter.add(pConnettoreDaListaAPS);
							de.setUrl(
									AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_CHANGE,
									listParameter.toArray(new Parameter[1])
									);
							ServletUtils.setDataElementVisualizzaLabel(de);
						}
						else {
							de.setValue("-");
						}
						e.add(de);
					}
					
					// configurazione
					de = new DataElement();
					de.setUrl(
							AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_PORTE_DELEGATE_LIST,
							pId, pIdSogg, pIdSoggettoErogatore, pNomeServizio, pTipoServizio, pIdFruitore,
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_GRUPPI,"true"),
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_CONFIGURAZIONI,"true"));
					if (contaListe) {
						// BugFix OP-674
//								List<PortaDelegata> fruLista = this.apsCore.serviziFruitoriPorteDelegateList(this.soggettiCore.getIdSoggetto(fru.getNome(), fru.getTipo()), 
//										serv.getTipo(), serv.getNome(), asps.getId(), 
//										serv.getTipoSoggettoErogatore(), serv.getNomeSoggettoErogatore(), asps.getIdSoggetto(), 
//										ricerca);
						ConsoleSearch searchForCount = new ConsoleSearch(true,1);
						IDServizio idServizioFromAccordo = this.idServizioFactory.getIDServizioFromAccordo(asps); 
						//long idSoggetto = this.soggettiCore.getIdSoggetto(fru.getNome(), fru.getTipo());
						this.apsCore.serviziFruitoriMappingList(fruitore.getId(), idFruitore , idServizioFromAccordo, searchForCount);
						//int numPD = fruLista.size();
						int numPD = searchForCount.getNumEntries(Liste.CONFIGURAZIONE_FRUIZIONE);
						ServletUtils.setDataElementVisualizzaLabel(de, (long) numPD );
					} else
						ServletUtils.setDataElementVisualizzaLabel(de);
					e.add(de);
				}
				
				// Colonna ruoli
//				if(showRuoli){
//					de = new DataElement();
//					if(this.core.isProfiloDiCollaborazioneAsincronoSupportatoDalProtocollo(protocollo,serviceBinding)){ 
//						de.setValue((TipologiaServizio.CORRELATO.equals(asps.getTipologiaServizio()) ?
//								AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_CORRELATO :
//									AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_NORMALE));
//	
//					}else {
//						de.setValue("-");
//					}
//					e.add(de);
//				}

				if(this.isShowGestioneWorkflowStatoDocumenti()){
					if(this.core.isGestioneWorkflowStatoDocumentiVisualizzaStatoLista()) {
						de = new DataElement();
						de.setValue(StatiAccordo.upper(asps.getStatoPackage()));
						e.add(de);
					}
				}

				if(showFruitori) {
					de = new DataElement();
					//if(!user.isPermitMultiTenant() && !isPddEsterna) {
					if(!isPddEsterna) {
						de.setValue("-");
					}
					else {
						de.setUrl(
								AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_LIST,
								new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + ""),
								pNomeServizio, pTipoServizio, pIdsoggErogatore);
						// +"&nomeprov="+soggErogatore+"&tipoprov="+tipoSoggEr);
						if (contaListe) {
							// BugFix OP-674
							//List<Fruitore> lista1 = this.apsCore.serviziFruitoriList(asps.getId().intValue(), new Search(true));
							ConsoleSearch searchForCount = new ConsoleSearch(true,1);
							this.apsCore.serviziFruitoriList(asps.getId().intValue(), searchForCount);
							//int numFru = lista1.size();
							int numFru = searchForCount.getNumEntries(Liste.SERVIZI_FRUITORI);
							ServletUtils.setDataElementVisualizzaLabel(de, (long) numFru);
						} else
							ServletUtils.setDataElementVisualizzaLabel(de);
					}
					e.add(de);
				}

				// de = new DataElement();
				// de.setUrl("serviziRuoli.do?id="+servizio.getId());
				// de.setValue("visualizza");
				// e.add(de);
				//
				// de = new DataElement();
				// de.setValue("non disp.");
				// e.add(de);

				if(!this.isModalitaStandard()) {
					de = new DataElement();
	
					de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ALLEGATI_LIST,
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + ""));
					if (contaListe) {
						// BugFix OP-674
						//List<org.openspcoop2.core.registry.Documento> tmpLista = this.apsCore.serviziAllegatiList(asps.getId().intValue(), new Search(true));
						ConsoleSearch searchForCount = new ConsoleSearch(true,1);
						this.apsCore.serviziAllegatiList(asps.getId().intValue(), searchForCount);
						//int numAllegati = tmpLista.size();
						int numAllegati = searchForCount.getNumEntries(Liste.SERVIZI_ALLEGATI);
						ServletUtils.setDataElementVisualizzaLabel(de, (long) numAllegati);
					} else
						ServletUtils.setDataElementVisualizzaLabel(de);
					e.add(de);
				}

				dati.add(e);
			}

			this.pd.setDati(dati);
			this.pd.setAddButton(true);

			// preparo bottoni
			// String gestioneWSBL = (String) this.session
			// .getAttribute("GestioneWSBL");
			if(lista!=null && lista.size()>0){
				if (this.core.isShowPulsantiImportExport()) {

					ExporterUtils exporterUtils = new ExporterUtils(this.archiviCore);
					if(exporterUtils.existsAtLeastOneExportMode(ArchiveType.ACCORDO_SERVIZIO_PARTE_SPECIFICA, this.request, this.session)){

						List<AreaBottoni> bottoni = new ArrayList<>();

						AreaBottoni ab = new AreaBottoni();
						List<DataElement> otherbott = new ArrayList<>();
						DataElement de = new DataElement();
						de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_ESPORTA_SELEZIONATI);
						de.setOnClick(AccordiServizioParteSpecificaCostanti.LABEL_APS_ESPORTA_SELEZIONATI_ONCLICK);
						de.setDisabilitaAjaxStatus();
						otherbott.add(de);
						ab.setBottoni(otherbott);
						bottoni.add(ab);

						this.pd.setAreaBottoni(bottoni);

					}
				}
			}

		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}


	public void prepareServiziFruitoriList(List<Fruitore> lista, String id, ISearch ricerca)
			throws Exception {
		try {
			Boolean contaListe = ServletUtils.getContaListeFromSession(this.session);
			
			ServletUtils.addListElementIntoSession(this.request, this.session, AccordiServizioParteSpecificaCostanti.OBJECT_NAME_APS_FRUITORI, 
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id));

			int idLista = Liste.SERVIZI_FRUITORI;
			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);
			String search = ServletUtils.getSearchFromSession(ricerca, idLista);

			if(this.isShowGestioneWorkflowStatoDocumenti()){
				if(this.core.isGestioneWorkflowStatoDocumentiVisualizzaStatoLista()) {
					String filterStatoAccordo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_STATO_ACCORDO);
					this.addFilterStatoAccordo(filterStatoAccordo,false);
				}
			}
			
			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));

			String idSoggettoErogatoreDelServizio = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE);
			if ((idSoggettoErogatoreDelServizio == null) || idSoggettoErogatoreDelServizio.equals("")) {
				PageData oldPD = ServletUtils.getPageDataFromSession(this.request, this.session);

				idSoggettoErogatoreDelServizio = oldPD.getHidden(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE);

				if (idSoggettoErogatoreDelServizio == null || idSoggettoErogatoreDelServizio.equals("")) {
					AccordoServizioParteSpecifica asps = this.apsCore.getAccordoServizioParteSpecifica(Integer.parseInt(id));
					String tipoSoggettoErogatore = asps.getTipoSoggettoErogatore();
					String nomesoggettoErogatore = asps.getNomeSoggettoErogatore();
					IDSoggetto idSE = new IDSoggetto(tipoSoggettoErogatore, nomesoggettoErogatore);
					Soggetto SE = this.soggettiCore.getSoggettoRegistro(idSE);
					idSoggettoErogatoreDelServizio = "" + SE.getId();
				}
			}

			// setto i dati come campi hidden nel pd per portarmeli dietro
			this.pd.addHidden(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatoreDelServizio);

			// Prendo il nome e il tipo del servizio
			AccordoServizioParteSpecifica asps = this.apsCore.getAccordoServizioParteSpecifica(Integer.parseInt(id));
			
			String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(asps.getTipoSoggettoErogatore());
			
			// Prendo il nome e il tipo del soggetto erogatore del servizio
			//Soggetto sogg = this.soggettiCore.getSoggettoRegistro(Integer.parseInt(idSoggettoErogatoreDelServizio));

			String tmpTitle = this.getLabelIdServizio(asps);

			// setto la barra del titolo
			List<Parameter> lstParm = new ArrayList<>();

			lstParm.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));

			if (search.equals("")) {
				this.pd.setSearchDescription("");
				lstParm.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_FUITORI_DI  + tmpTitle, null));
			}else {
				lstParm.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_FUITORI_DI  + tmpTitle, 
						AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_LIST ,
						new Parameter( AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, ""+ id)
						));
				lstParm.add(new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_RISULTATI_RICERCA, null));
			}

			// setto la barra del titolo
			ServletUtils.setPageDataTitle(this.pd, lstParm );


			// controllo eventuali risultati ricerca
			this.pd.setSearchLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO);
			if (!search.equals("")) {
				ServletUtils.enabledPageDataSearch(this.pd, AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI, search);
			}

			// setto le label delle colonne
			//User user = ServletUtils.getUserFromSession(this.session);
			String labelFruitore = AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO;
			//if(this.core.isTerminologiaSICA_RegistroServizi()){
			//	labelFruitore = "Adesione";
			//}
			boolean showPoliticheSLA = false;
			
			List<String> listaLabelTabella = new ArrayList<>();
			listaLabelTabella.add(labelFruitore);
			if(this.isShowGestioneWorkflowStatoDocumenti() && this.core.isGestioneWorkflowStatoDocumentiVisualizzaStatoLista()){
				listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_STATO);
			}
			listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_DATI_INVOCAZIONE);
			listaLabelTabella.add(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE);
			
			this.pd.setLabels(listaLabelTabella.toArray(new String[1]));

			Parameter pIdSoggettoErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatoreDelServizio);
			Parameter pId = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id);
			Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, asps.getNome());
			Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, asps.getTipo());
//			@SuppressWarnings("unused")
//			Parameter pVersioneServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VERSIONE, asps.getVersione().intValue()+"");

			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			Iterator<Fruitore> it = lista.iterator();
			Fruitore fru = null;
			while (it.hasNext()) {
				fru = it.next();
				List<DataElement> e = new ArrayList<>();

				Parameter pMyId = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, fru.getId() + "");				

				DataElement de = new DataElement();
				de.setType(DataElementType.HIDDEN);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_FRUITORE);
				de.setValue("" + fru.getId());
				e.add(de);

				de = new DataElement();
				de.setUrl(
						AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_CHANGE,
						pId,	pMyId, pIdSoggettoErogatore,
						new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE, fru.getIdSoggetto() + ""));

				de.setValue(this.getLabelNomeSoggetto(protocollo, fru.getTipo() , fru.getNome()));
				de.setIdToRemove(fru.getId().toString());
				e.add(de);

				if(this.isShowGestioneWorkflowStatoDocumenti()){
					if(this.core.isGestioneWorkflowStatoDocumentiVisualizzaStatoLista()) {
						de = new DataElement();
						de.setValue(StatiAccordo.upper(fru.getStatoPackage()));
						e.add(de);
					}
				}

				Parameter pIdSogg = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO, fru.getIdSoggetto() + "");
				// devo aggiungere le politiche di sicurezza come in
				// accordiServizioApplicativoList
										
				IDSoggetto fruitore = new IDSoggetto(fru.getTipo(), fru.getNome());
				Soggetto fruitoreSogg = this.soggettiCore.getSoggettoRegistro(fruitore);
				
				boolean esterno = this.pddCore.isPddEsterna(fruitoreSogg.getPortaDominio());

				// Elimino eventuale configurazione messa come parent (tanto viene re-inserita se entro dentro la lista della configurazione)
				ServletUtils.removeObjectFromSession(this.request, this.session, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT);
									
				IDServizio idServizio = this.idServizioFactory.getIDServizioFromAccordo(asps);
				
				Parameter pIdPD = null;
				Parameter pNomePD = null;
				Parameter pIdSoggPD = null;
				Parameter pIdAsps = null;
				Parameter pIdFruitore = null;
				Parameter pConfigurazioneDati = null;
				if(!esterno){
					IDPortaDelegata idPD = this.porteDelegateCore.getIDPortaDelegataAssociataDefault(idServizio, fruitore);
					PortaDelegata pdDefault = this.porteDelegateCore.getPortaDelegata(idPD);
					
					pIdPD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, "" + pdDefault.getId());
					pNomePD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME_PORTA, pdDefault.getNome());
					pIdSoggPD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, pdDefault.getIdSoggetto() + "");
					pIdAsps = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_ASPS, asps.getId()+"");
					pIdFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, fru.getId()+ "");
					pConfigurazioneDati = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_CONFIGURAZIONE_DATI_INVOCAZIONE, Costanti.CHECK_BOX_ENABLED_TRUE);
				}

				de = new DataElement();
				if(esterno){
					de.setType(DataElementType.TEXT);
					de.setValue("-");
				}
				else{					
					de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneDati);
					ServletUtils.setDataElementVisualizzaLabel(de);						
				}
				e.add(de);				
				
				de = new DataElement();
				if(esterno){
					de.setValue("-");
				}
				else{
					de.setUrl(
							AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_PORTE_DELEGATE_LIST,
							pId, pIdSogg, pIdSoggettoErogatore, pNomeServizio, pTipoServizio, pMyId,
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_GRUPPI,"true"),
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_CONFIGURAZIONI,"true"));
					if (contaListe) {
						// BugFix OP-674
//							List<PortaDelegata> fruLista = this.apsCore.serviziFruitoriPorteDelegateList(this.soggettiCore.getIdSoggetto(fru.getNome(), fru.getTipo()), 
//									serv.getTipo(), serv.getNome(), asps.getId(), 
//									serv.getTipoSoggettoErogatore(), serv.getNomeSoggettoErogatore(), asps.getIdSoggetto(), 
//									ricerca);
						ConsoleSearch searchForCount = new ConsoleSearch(true,1);
						IDServizio idServizioFromAccordo = this.idServizioFactory.getIDServizioFromAccordo(asps); 
						//long idSoggetto = this.soggettiCore.getIdSoggetto(fru.getNome(), fru.getTipo());
						IDSoggetto idSoggettoFruitore = new IDSoggetto(fru.getNome(), fru.getTipo());
						this.apsCore.serviziFruitoriMappingList(fru.getId(), idSoggettoFruitore , idServizioFromAccordo, searchForCount);
						//int numPD = fruLista.size();
						int numPD = searchForCount.getNumEntries(Liste.CONFIGURAZIONE_FRUIZIONE);
						ServletUtils.setDataElementVisualizzaLabel(de, (long) numPD );
					} else
						ServletUtils.setDataElementVisualizzaLabel(de);
				}
				e.add(de);
				
				if(showPoliticheSLA){
					de = new DataElement();
					de.setValue(Costanti.LABEL_NON_DISPONIBILE);
					e.add(de);
				}

				dati.add(e);
			}

			this.pd.setDati(dati);
			this.pd.setAddButton(true);

			// preparo bottoni
			/*
			 * if(lista!=null && lista.size()>0){
			 * if (AccordiServizioParteComuneUtilities.getImportaEsporta()) {
				List<AreaBottoni> bottoni = new ArrayList<AreaBottoni>();

				AreaBottoni ab = new AreaBottoni();
				List<DataElement> otherbott = new ArrayList<>();
				DataElement de = new DataElement();
				de.setValue("Esporta");
				de.setOnClick("Esporta()");
				otherbott.addElement(de);
				ab.setBottoni(otherbott);
				bottoni.addElement(ab);

				this.pd.setAreaBottoni(bottoni);
			}
			}*/

		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}

	public void prepareServiziConfigurazioneList(List<MappingErogazionePortaApplicativa> listaParam, String id, String idSoggettoErogatoreDelServizio, ISearch ricerca)
			throws Exception {
		try {
			Boolean contaListeObject = ServletUtils.getContaListeFromSession(this.session);
			boolean contaListe = contaListeObject!=null ? contaListeObject.booleanValue() : false;

			IExtendedListServlet extendedServletList = this.core.getExtendedServletPortaApplicativa();
			
			ServletUtils.addListElementIntoSession(this.request, this.session, AccordiServizioParteSpecificaCostanti.OBJECT_NAME_APS_PORTE_APPLICATIVE,
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id),
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatoreDelServizio));

			String tipologia = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
			@SuppressWarnings("unused")
			boolean gestioneErogatori = false;
			if(tipologia!=null) {
				if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_EROGAZIONE.equals(tipologia)) {
					gestioneErogatori = true;
				}
			}
			
			boolean gestioneGruppi = true;
			String paramGestioneGruppi = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_GRUPPI);
			if(paramGestioneGruppi!=null && !"".equals(paramGestioneGruppi)) {
				gestioneGruppi = Boolean.valueOf(paramGestioneGruppi);
			}
			
			boolean gestioneConfigurazioni = true;
			String paramGestioneConfigurazioni = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_CONFIGURAZIONI);
			if(paramGestioneConfigurazioni!=null && !"".equals(paramGestioneConfigurazioni)) {
				gestioneConfigurazioni = Boolean.valueOf(paramGestioneConfigurazioni);
			}
			
			boolean visualizzazioneTabs = !this.isModalitaCompleta();
			if(visualizzazioneTabs) {
				gestioneGruppi = false;
				this.pd.setCustomListViewName(ErogazioniCostanti.ASPS_EROGAZIONI_NOME_VISTA_CUSTOM_CONFIGURAZIONE);
			}
			
			// Prendo il nome e il tipo del servizio
			AccordoServizioParteSpecifica asps = this.apsCore.getAccordoServizioParteSpecifica(Integer.parseInt(id));
			AccordoServizioParteComuneSintetico apc = this.apcCore.getAccordoServizioSintetico(asps.getIdAccordo()); 
			org.openspcoop2.core.registry.constants.ServiceBinding serviceBinding = apc.getServiceBinding();
			ServiceBinding serviceBindingMessage = this.apcCore.toMessageServiceBinding(apc.getServiceBinding());
			String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(asps.getTipoSoggettoErogatore());
			
			int idLista = Liste.CONFIGURAZIONE_EROGAZIONE;
			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);
			
			Map<String,String> azioni = this.porteApplicativeCore.getAzioniConLabel(asps, apc, false, true, new ArrayList<>());
			String filtroAzione = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_AZIONE);
						
			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setSearch("");
			
			List<MappingErogazionePortaApplicativa> listaSenzaFiltro = this.impostaFiltroAzioneMappingErogazione(null, listaParam,ricerca, idLista);
			
			boolean showBottoneAggiungiNuovaConfigurazione = 
					(azioni!=null && azioni.size()>1) 
					||
					(listaSenzaFiltro.size()>1);
			if(showBottoneAggiungiNuovaConfigurazione) {
				// verifico modalita identificazione
				for (MappingErogazionePortaApplicativa mappingErogazionePortaApplicativa : listaParam) {
					if(mappingErogazionePortaApplicativa.isDefault()) {
						PortaApplicativa paDefaullt = this.porteApplicativeCore.getPortaApplicativa(mappingErogazionePortaApplicativa.getIdPortaApplicativa());
						if(paDefaullt.getAzione()!=null && 
								org.openspcoop2.core.config.constants.PortaApplicativaAzioneIdentificazione.STATIC.equals(paDefaullt.getAzione().getIdentificazione())) {
							showBottoneAggiungiNuovaConfigurazione = false;
						}
						break;
					}
				}
			}
			
			List<MappingErogazionePortaApplicativa> lista = null;
			boolean chooseTabWithFilter = !this.isModalitaCompleta();
			if(chooseTabWithFilter) {
				lista = listaSenzaFiltro;
				if(lista.size()>1) {
					MappingErogazionePortaApplicativa mappingContenenteAzione = getFiltroAzioneMappingErogazione(filtroAzione, listaParam);
					if(mappingContenenteAzione!=null) {
						int tab = -1;
						for (int i = 0; i < lista.size(); i++) {
							if(lista.get(i).getNome().equals(mappingContenenteAzione.getNome())) {
								tab = i;
								break;
							}
						}
						if(tab>=0) {
							ServletUtils.setObjectIntoSession(this.request, this.session, tab+"", CostantiControlStation.PARAMETRO_ID_TAB);
						}
					}
					
					this.pd.setLabelBottoneFiltra(CostantiControlStation.LABEL_BOTTONE_INDIVIDUA_GRUPPO);
				}
			}
			else {
				lista = this.impostaFiltroAzioneMappingErogazione(filtroAzione, listaParam,ricerca, idLista);
			}
			
			boolean allActionRedefined = false;
			List<String> actionNonRidefinite = null;
			if(listaSenzaFiltro!=null && listaSenzaFiltro.size()>1) {
				List<String> azioniL = new ArrayList<>();
				if(azioni != null && azioni.size() > 0)
					azioniL.addAll(azioni.keySet());
				allActionRedefined = this.allActionsRedefinedMappingErogazione(azioniL, listaSenzaFiltro);
				if(!allActionRedefined) {
					actionNonRidefinite = this.getAllActionsNotRedefinedMappingErogazione(azioniL, listaSenzaFiltro);
				}
			}
			

			if(!gestioneGruppi && listaParam.size()<=1) {
				ServletUtils.disabledPageDataSearch(this.pd);
			}
			else {
				this.addFilterAzione(azioni, filtroAzione, serviceBindingMessage);
			}
			
			// Utilizza la configurazione come parent
			ServletUtils.setObjectIntoSession(this.request, this.session, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT_CONFIGURAZIONE, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT);
			
			//questo e' il soggetto virtuale
			if ((idSoggettoErogatoreDelServizio == null) || idSoggettoErogatoreDelServizio.equals("")) {
				idSoggettoErogatoreDelServizio = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE);
			}
			
			if ((idSoggettoErogatoreDelServizio == null) || idSoggettoErogatoreDelServizio.equals("")) {
				PageData oldPD = ServletUtils.getPageDataFromSession(this.request, this.session);

				idSoggettoErogatoreDelServizio = oldPD.getHidden(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE);
			}

			// setto i dati come campi hidden nel pd per portarmeli dietro
			this.pd.addHidden(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatoreDelServizio);

			String servizioTmpTile = this.getLabelIdServizio(asps);
			
			// setto la barra del titolo
			List<Parameter> lstParam = new ArrayList<>();

			Parameter pIdServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId()+ "");
			Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, asps.getNome());
			Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, asps.getTipo());
			Parameter pIdSoggettoErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, asps.getIdSoggetto()+"");
			Boolean vistaErogazioni = ServletUtils.getBooleanAttributeFromSession(ErogazioniCostanti.ASPS_EROGAZIONI_ATTRIBUTO_VISTA_EROGAZIONI, this.session, this.request).getValue();
			String labelAzioni = this.getLabelAzioni(serviceBindingMessage); 
			if(vistaErogazioni != null && vistaErogazioni.booleanValue()) {
				lstParam.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_EROGAZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
				
				lstParam.add(new Parameter(servizioTmpTile, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_CHANGE, pIdServizio,pNomeServizio, pTipoServizio));
				String labelConfigurazione = gestioneConfigurazioni ? ErogazioniCostanti.LABEL_ASPS_GESTIONE_CONFIGURAZIONI : 
					(gestioneGruppi ? MessageFormat.format(ErogazioniCostanti.LABEL_ASPS_GESTIONE_GRUPPI_CON_PARAMETRO, labelAzioni) : AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_APPLICATIVE);
				
				lstParam.add(new Parameter(labelConfigurazione, null));
			} else {
				lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
				lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_CONFIGURAZIONI_DI + servizioTmpTile, null));
			}
			
			// setto la barra del titolo
			ServletUtils.setPageDataTitle(this.pd, lstParam );
			
			boolean visualizzaAllarmi = this.confCore.isVisualizzaConfigurazioneAllarmiEnabled();  // configurazione allarmi (solo se sono stati caricati dei plugin di tipo allarme)

			boolean visualizzaMTOM = true;
			boolean visualizzaSicurezza = true;
			boolean visualizzaCorrelazione = true;
			switch (serviceBinding) {
			case REST:
				visualizzaMTOM = false;
				visualizzaSicurezza = true;
				visualizzaCorrelazione = true;
				break;
			case SOAP:
			default:
				visualizzaMTOM = true;
				visualizzaSicurezza = true;
				visualizzaCorrelazione = true;
				break;
			}
			
			boolean showConnettoreLink = true;
			if(gestioneConfigurazioni && this.isModalitaStandard()) {
				showConnettoreLink = false;
				
				Iterator<MappingErogazionePortaApplicativa> it = lista.iterator();
				MappingErogazionePortaApplicativa mapping= null;
				while (it.hasNext()) {
					mapping = it.next();
					if(!mapping.isDefault()) {
						PortaApplicativa paAssociata = this.porteApplicativeCore.getPortaApplicativa(mapping.getIdPortaApplicativa());
						PortaApplicativaServizioApplicativo portaApplicativaServizioApplicativo = paAssociata.getServizioApplicativoList().get(0);
						if(portaApplicativaServizioApplicativo.getNome().equals(paAssociata.getNome())) { 
							showConnettoreLink = true;
							break;
						}
						// controllo che non sia un server
						if(this.saCore.isApplicativiServerEnabled(this)) {
							IDServizioApplicativo idSA = new IDServizioApplicativo();
							idSA.setIdSoggettoProprietario(new IDSoggetto(paAssociata.getTipoSoggettoProprietario(), paAssociata.getNomeSoggettoProprietario()));
							idSA.setNome(portaApplicativaServizioApplicativo.getNome());
							ServizioApplicativo sa = this.saCore.getServizioApplicativo(idSA);
							if(ServiziApplicativiCostanti.VALUE_SERVIZI_APPLICATIVI_TIPO_SERVER.equals(sa.getTipo())) {
								showConnettoreLink = true;
								break;
							}
						}
						
					}
				}
			}
			else {
				// se non e' standard lo faccio vedere solo se ho più di un gruppo.
				showConnettoreLink = lista!=null && lista.size()>1;
			}
			
			PortaApplicativa paAssociataDefault = null; 
			PortaApplicativaServizioApplicativo portaApplicativaServizioApplicativoDefault = null; 
			if(lista!=null) {
				Iterator<MappingErogazionePortaApplicativa> itDef = lista.iterator();
				MappingErogazionePortaApplicativa mappingDefault = null;
				while (itDef.hasNext()) {
					mappingDefault = itDef.next();
					if(mappingDefault.isDefault()) {
						paAssociataDefault = this.porteApplicativeCore.getPortaApplicativa(mappingDefault.getIdPortaApplicativa());
						portaApplicativaServizioApplicativoDefault = paAssociataDefault.getServizioApplicativoList().get(0);
						break;
					}
				}
			}
			
			// setto le label delle colonne
			List<String> listaLabel = new ArrayList<>();

			if(visualizzazioneTabs && (gestioneGruppi || listaParam.size()>1)) {
				listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_NOME_GRUPPO);
			}
			if(gestioneConfigurazioni) {
				/**listaLabel.add(PorteApplicativeCostanti.LABEL_COLUMN_PORTE_APPLICATIVE_STATO_PORTA);*/
				listaLabel.add("");
			}
			if(!visualizzazioneTabs && (gestioneGruppi || listaParam.size()>1)) {
				listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_NOME_GRUPPO);
			}
			if(gestioneGruppi || visualizzazioneTabs) { // visualizzata sia per i gruppi che per la modalita' tab
				if(this.isModalitaCompleta()) {
					listaLabel.add(labelAzioni);
				}
				else {
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_ELENCO_AZIONI_GRUPPI_PREFIX+labelAzioni);
				}
			}
			if(gestioneConfigurazioni) { 
				if(showConnettoreLink) {
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE);
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_VERIFICA_CONNETTORE);
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONFIGURAZIONE_CONNETTORI_MULTIPLI);
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_ELENCO_CONNETTORI_MULTIPLI);
				}
				
				listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONTROLLO_ACCESSI);
				listaLabel.add(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RATE_LIMITING);
				listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI);
				listaLabel.add(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RESPONSE_CACHING);
				if(visualizzaSicurezza) {
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MESSAGE_SECURITY);
				}
				if(visualizzaMTOM) {
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM);
				}
				listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRASFORMAZIONI);
				if(visualizzaCorrelazione) {
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRACCIAMENTO);
				}
				listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE);
				
				if(visualizzaAllarmi) {
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_ALLARMI);
				}
				
				if(this.isModalitaAvanzata() || this.apsCore.isProprietaErogazioniShowModalitaStandard()) {
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_PROTOCOL_PROPERTIES);
				}
				if(this.isModalitaAvanzata()) {
					listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_OPZIONI_AVANZATE);
				}
				if(extendedServletList!=null && extendedServletList.showExtendedInfo(this, protocollo)){
					listaLabel.add(extendedServletList.getListTitle(this));
				}
			}
			String[] labels = listaLabel.toArray(new String[listaLabel.size()]);
			this.pd.setLabels(labels);

			PropertiesSourceConfiguration propertiesSourceConfiguration = null;
			ConfigManager configManager = null;
			Configurazione configurazioneGenerale = null;
			if(visualizzazioneTabs) {
				propertiesSourceConfiguration = this.apsCore.getMessageSecurityPropertiesSourceConfiguration();
				configManager = ConfigManager.getinstance(ControlStationCore.getLog());
				configManager.leggiConfigurazioni(propertiesSourceConfiguration, true);
				configurazioneGenerale = this.confCore.getConfigurazioneGenerale();
			}
			
			impostaComandiMenuContestualePA(asps, protocollo, pNomeServizio, pTipoServizio, pIdSoggettoErogatore);
		
			
			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			if(lista!=null) {
				Iterator<MappingErogazionePortaApplicativa> it = lista.iterator();
				MappingErogazionePortaApplicativa mapping= null;
				int idTab = 0;
				while (it.hasNext()) {
					mapping = it.next();
					PortaApplicativa paAssociata = this.porteApplicativeCore.getPortaApplicativa(mapping.getIdPortaApplicativa());
					
					List<DataElement> e = new ArrayList<>();
	
					Parameter pNomePorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME_PORTA, paAssociata.getNome());
					Parameter pIdNome = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME, paAssociata.getNome());
					Parameter pIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, paAssociata.getIdSoggetto() + "");
					Parameter pIdPorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID, ""+paAssociata.getId());
					Parameter pIdAsps = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_ASPS, asps.getId()+ "");
					Parameter pIdProvider = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_PROVIDER, paAssociata.getIdSoggetto() + "");
					Parameter pIdPortaPerSA = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_PORTA, ""+paAssociata.getId());
					Parameter pIdTAb = new Parameter(CostantiControlStation.PARAMETRO_ID_TAB, ""+idTab);
					
					@SuppressWarnings("unused")
					Parameter pConfigurazioneDati = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_CONFIGURAZIONE_DATI_INVOCAZIONE, Costanti.CHECK_BOX_ENABLED_TRUE);
					Parameter pConfigurazioneAltroPorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_CONFIGURAZIONE_ALTRO_PORTA, Costanti.CHECK_BOX_ENABLED_TRUE);
					
					Parameter pConfigurazioneDescrizione = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_CONFIGURAZIONE_DESCRIZIONE, Costanti.CHECK_BOX_ENABLED_TRUE);
	
					// spostata direttamente nell'elenco delle erogazioni
	/**				// nome mapping
	//				DataElement de = new DataElement();
	//				//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
	//				if(mapping.isDefault()) {
	//					de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,pIdSogg, pNomePorta, pIdPorta,pIdAsps,pConfigurazioneDati);
	//				}
	//				de.setValue(mapping.isDefault() ? PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MAPPING_EROGAZIONE_PA_NOME_DEFAULT : mapping.getNome());
	//				de.setIdToRemove(paAssociata.getNome());
	//				//de.setToolTip(StringUtils.isNotEmpty(paAssociata.getDescrizione()) ? paAssociata.getDescrizione() : paAssociata.getNome()); 
	//				e.add(de);*/
					
					if(gestioneConfigurazioni && mapping.isDefault() && allActionRedefined && (!showConnettoreLink)) {
						int numEntries = ricerca.getNumEntries(idLista);
						ricerca.setNumEntries(idLista, numEntries -1); 
						this.pd.setNumEntries(numEntries -1);
						continue; // non faccio vedere la riga "disconnessa"
					}
					
					
					boolean statoPA = paAssociata.getStato().equals(StatoFunzionalita.ABILITATO);
					String statoPAallRedefined = null;
					String statoMapping = statoPA ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP;
					boolean urlCambiaStato = true;
					if(mapping.isDefault() && allActionRedefined) {
						statoPA = false;
						statoPAallRedefined = "off";
						statoMapping = this.getLabelAllAzioniRidefiniteTooltip(serviceBindingMessage);
						urlCambiaStato = false;
					}
					
					boolean descrizioneEmpty = paAssociata.getDescrizione()==null || StringUtils.isEmpty(paAssociata.getDescrizione()) || 
							ImplementationConfiguration.isDescriptionDefault(paAssociata.getDescrizione());
					

					// Nome Gruppo
					if(visualizzazioneTabs && (gestioneGruppi || listaParam.size()>1)) {
						DataElement de = new DataElement();
						
						de.setWidthPx(10);
						de.setType(DataElementType.CHECKBOX);
						
						de.setStatusToolTip(statoPA ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP_NO_ACTION : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP_NO_ACTION);
						if(statoPAallRedefined!=null) {
							de.setStatusType(statoPAallRedefined);
						}
						else {
							de.setStatusType(statoPA ? CheckboxStatusType.ABILITATO : CheckboxStatusType.DISABILITATO);
						}
						
						de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_NOME_GRUPPO);
						de.setValue(mapping.getDescrizione());
						de.setStatusValue(mapping.getDescrizione());
						
						if(!mapping.isDefault()) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONFIGURAZIONE_CHANGE,pIdSogg, pIdPorta, pIdAsps,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_NOME_GRUPPO));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							de.addImage(image );
						}
						if(!mapping.isDefault()) 
							de.setIdToRemove(paAssociata.getNome());
						
						if(descrizioneEmpty) {
							
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,pIdSogg, pNomePorta, pIdPorta,pIdAsps,pConfigurazioneDescrizione,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.AGGIUNGI_DESCRIZIONE_TOOLTIP_CON_PARAMETRO, PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DESCRIZIONE));
							image.setImage(CostantiControlStation.ICONA_AGGIUNGI_DESCRIZIONE);
							
							de.addImage(image);
						}
						
						if(urlCambiaStato) {
							Parameter pAbilita = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ABILITA,  (statoPA ? Costanti.CHECK_BOX_DISABLED : Costanti.CHECK_BOX_ENABLED_TRUE));
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_ABILITAZIONE,pIdSogg, pNomePorta, pIdPorta,pIdAsps, pAbilita);
							
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_ABILITAZIONE,pIdSogg, pNomePorta, pIdPorta,pIdAsps, pAbilita,pIdTAb);
							image.setToolTip(statoMapping);
							image.setImage(statoPA ? CostantiControlStation.ICONA_MODIFICA_TOGGLE_ON : CostantiControlStation.ICONA_MODIFICA_TOGGLE_OFF);
							
							de.addImage(image);
						}
						
						e.add(de);
					}
					
					if(gestioneConfigurazioni && !visualizzazioneTabs) {
						
						// Abilitato
						DataElement de = new DataElement();
						/**if(visualizzazioneTabs)
						//	de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_STATO);*/
						
						de.setWidthPx(10);
						de.setType(DataElementType.CHECKBOX);
						/**if(visualizzazioneTabs) {
						//	de.setStatusValue(statoPA ? this.getUpperFirstChar(CostantiControlStation.DEFAULT_VALUE_ABILITATO) : this.getUpperFirstChar(CostantiControlStation.DEFAULT_VALUE_DISABILITATO));
						//	de.setStatusToolTip(statoPA ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP_NO_ACTION : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP_NO_ACTION);
						//	if(statoPAallRedefined!=null) {
						//		de.setStatusType(statoPAallRedefined);
						//	}
						//	else {
						//		de.setStatusType(statoPA ? CheckboxStatusType.ABILITATO : CheckboxStatusType.DISABILITATO);
						//	}
						//} else {*/ 
						de.setToolTip(statoMapping);
						
						if(statoPAallRedefined!=null) {
							de.setSelected(statoPAallRedefined);
						}
						else {
							de.setSelected(statoPA);
						}
						if(urlCambiaStato) {
							Parameter pAbilita = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ABILITA,  (statoPA ? Costanti.CHECK_BOX_DISABLED : Costanti.CHECK_BOX_ENABLED_TRUE));
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_ABILITAZIONE,pIdSogg, pNomePorta, pIdPorta,pIdAsps, pAbilita);
							
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_ABILITAZIONE,pIdSogg, pNomePorta, pIdPorta,pIdAsps, pAbilita,pIdTAb);
							image.setToolTip(statoMapping);
							image.setImage(statoPA ? CostantiControlStation.ICONA_MODIFICA_TOGGLE_ON : CostantiControlStation.ICONA_MODIFICA_TOGGLE_OFF);
							
							de.setImage(image);
						}
						e.add(de);
					}
					
					// NomeGruppo
					if(!visualizzazioneTabs && (gestioneGruppi || listaParam.size()>1)) {
											
						DataElement de = new DataElement();
						de.setValue(mapping.getDescrizione());
						if(gestioneGruppi && !mapping.isDefault()) {
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONFIGURAZIONE_CHANGE,pIdSogg, pIdPorta, pIdAsps);
						}
						e.add(de);
					}
					
					// lista delle azioni
					if(gestioneGruppi || (visualizzazioneTabs && (listaParam.size()>1 || !mapping.isDefault()))) {	
											
						List<String> listaAzioni = null;
						String nomiAzioni = null;
						long countAzioni = 0;
						if(!mapping.isDefault()) {
							listaAzioni = paAssociata.getAzione()!= null ?  paAssociata.getAzione().getAzioneDelegataList() : new ArrayList<>();
							
							if(!listaAzioni.isEmpty() && azioni.size()>0) {
								
								StringBuilder sb = new StringBuilder();
								Iterator<String> itAz = azioni.keySet().iterator();
								while (itAz.hasNext()) {
									String idAzione = itAz.next();
									if(listaAzioni.contains(idAzione)) {
										if(sb.length() >0)
											sb.append(", ");
										
										sb.append(azioni.get(idAzione));
										countAzioni++;
									}
								}
								nomiAzioni = sb.toString();
								
							}
						}
						
						DataElement de = new DataElement();
						de.setSize(200);
						de.setIdToRemove(paAssociata.getNome());
						
						if(visualizzazioneTabs) {
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_ELENCO_AZIONI_GRUPPI_PREFIX+labelAzioni);
						}
						
						if(listaSenzaFiltro.size()>1) {
							DataElementImage image = new DataElementImage();
							
							if(!mapping.isDefault()) {
								de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_AZIONE_LIST,pIdSogg, pIdPorta, pIdAsps);
								if(this.isModalitaCompleta()) {
									ServletUtils.setDataElementVisualizzaLabel(de, countAzioni);
								}
								else {
									de.setValue(nomiAzioni);
								}
								de.setToolTip(nomiAzioni);
								
								image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_AZIONE_LIST,pIdSogg, pIdPorta, pIdAsps,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_ELENCO_AZIONI_GRUPPI_PREFIX+labelAzioni));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								de.setImage(image);
							}
							else {
								if(actionNonRidefinite!=null && !actionNonRidefinite.isEmpty() && azioni.size()>0) {
									
									long countAzioniRidefinite = 0;
									StringBuilder sb = new StringBuilder();
									Iterator<String> itAz = azioni.keySet().iterator();
									while (itAz.hasNext()) {
										String idAzione = itAz.next();
										if(actionNonRidefinite.contains(idAzione)) {
											if(sb.length() >0)
												sb.append(", ");
											
											sb.append(azioni.get(idAzione));
											countAzioniRidefinite++;
										}
									}
									String nomiAzioniNonRidefinite = sb.toString();
									de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_AZIONE_LIST,pIdSogg, pIdPorta, pIdAsps);
									if(this.isModalitaCompleta()) {
										ServletUtils.setDataElementVisualizzaLabel(de, countAzioniRidefinite);
									}
									else {
										de.setValue(nomiAzioniNonRidefinite);
									}
									de.setToolTip(nomiAzioniNonRidefinite);
									
									image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_AZIONE_LIST,pIdSogg, pIdPorta, pIdAsps,pIdTAb);
									image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_ELENCO_AZIONI_GRUPPI_PREFIX+labelAzioni));
									image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
									
									de.setImage(image);
								}
								else {
									if(allActionRedefined) {
										de.setValue(this.getLabelAllAzioniRidefiniteTooltip(serviceBindingMessage));
									}
									else {
										de.setValue("-"); // ??
									}
								}
							}
						}
						else {
							if(org.openspcoop2.core.registry.constants.ServiceBinding.SOAP.equals(serviceBinding)) {
								de.setValue(CostantiControlStation.LABEL_TUTTE_AZIONI_DEFAULT);	
							}
							else {
								de.setValue(CostantiControlStation.LABEL_TUTTE_RISORSE_DEFAULT);	
							}
						}
						e.add(de);
						
					}
					
					// Descrizione
					if(!descrizioneEmpty) {
						DataElement de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DESCRIZIONE);
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,pIdSogg, pNomePorta, pIdPorta,pIdAsps,pConfigurazioneDescrizione);
						
						int length = 150;
						String descrizione = paAssociata.getDescrizione();
						if(descrizione!=null && descrizione.length()>length) {
							descrizione = descrizione.substring(0, (length-4)) + " ...";
						}
						de.setValue(descrizione!=null ? StringEscapeUtils.escapeHtml(descrizione) : null);
						de.setToolTip(paAssociata.getDescrizione());
						
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,pIdSogg, pNomePorta, pIdPorta,pIdAsps,pConfigurazioneDescrizione,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DESCRIZIONE));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							de.setImage(image);
						}
						e.add(de);
					}
					
					if(gestioneConfigurazioni) {
						
						// connettore
						if(showConnettoreLink) {
							
							Parameter paIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, asps.getIdSoggetto() + "");
							
							DataElement de = new DataElement();
							//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
							String servletConnettore = ServiziApplicativiCostanti.SERVLET_NAME_SERVIZI_APPLICATIVI_ENDPOINT;
							PortaApplicativaServizioApplicativo portaApplicativaServizioApplicativo = paAssociata.getServizioApplicativoList().get(0);
							
							boolean connettoreMultiploEnabled = paAssociata.getBehaviour() != null;
							
							if(visualizzazioneTabs) {
								if(!connettoreMultiploEnabled)
									de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE);
								else 
									de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORI);
							}
							
							IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
							idServizioApplicativo.setIdSoggettoProprietario(new IDSoggetto(paAssociata.getTipoSoggettoProprietario(), paAssociata.getNomeSoggettoProprietario()));
							idServizioApplicativo.setNome(portaApplicativaServizioApplicativo.getNome());
							ServizioApplicativo sa = this.saCore.getServizioApplicativo(idServizioApplicativo);
							org.openspcoop2.core.config.InvocazioneServizio is = sa.getInvocazioneServizio();
							org.openspcoop2.core.config.Connettore connettore = is.getConnettore();
							
							boolean connettoreMultiploEnabledDefault = false;
							if(!mapping.isDefault()) {
								connettoreMultiploEnabledDefault = paAssociataDefault!=null && paAssociataDefault.getBehaviour() != null;
							}
							
							
							boolean ridefinito = false;
							boolean connettoreRidefinito = false;
							boolean visualizzaLinkConfigurazioneConnettore = 
									(!this.core.isConnettoriMultipliEnabled()) 
									|| 
									( !connettoreMultiploEnabled );
							if(mapping.isDefault()) {
								if(visualizzazioneTabs) {
									if(!connettoreMultiploEnabled) {								
										de.setValue(this.getLabelConnettore(sa,is,true));
										String tooltipConnettore = this.getTooltipConnettore(sa,is,true);
										de.setToolTip(tooltipConnettore);
									} else {
										de.setValue(this.getNomiConnettoriMultipliPortaApplicativa(paAssociata));
										de.setToolTip(this.getToolTipConnettoriMultipliPortaApplicativa(paAssociata));
									}
								}
								else {
									if(visualizzaLinkConfigurazioneConnettore) {
										ServletUtils.setDataElementVisualizzaLabel(de);
									} else {
										de.setType(DataElementType.TEXT);
										de.setValue("-");
									}
								}
								if(visualizzaLinkConfigurazioneConnettore)
									de.setUrl(servletConnettore, pIdProvider, pIdPortaPerSA, pIdAsps,
										new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_NOME_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getNome()),
										new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_ID_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getIdServizioApplicativo()+""));
								
								if(visualizzazioneTabs &&
									(visualizzaLinkConfigurazioneConnettore) 
									){
									DataElementImage image = new DataElementImage();
									image.setUrl(servletConnettore, pIdProvider, pIdPortaPerSA, pIdAsps,pIdTAb,
											new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_NOME_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getNome()),
											new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_ID_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getIdServizioApplicativo()+""));
									image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE));
									image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
									
									de.addImage(image);
								}
								
							}else {
								// Connettore e' ridefinito se
								connettoreRidefinito = isConnettoreRidefinito(paAssociataDefault, portaApplicativaServizioApplicativoDefault, paAssociata, portaApplicativaServizioApplicativo, paAssociata.getServizioApplicativoList());
								
								if(!connettoreRidefinito) { 
									servletConnettore = PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORE_DEFAULT;
									if(visualizzazioneTabs) {									
										if(!connettoreMultiploEnabled && !connettoreMultiploEnabledDefault) {	
											de.setValue("["+org.openspcoop2.core.constants.Costanti.MAPPING_EROGAZIONE_PA_DESCRIZIONE_DEFAULT+"] "+this.getLabelConnettore(sa,is,true));
											String tooltipConnettore = this.getTooltipConnettore(sa,is,true);
											de.setToolTip(ConnettoriCostanti.LABEL_PARAMETRO_MODALITA_CONNETTORE_DEFAULT+CostantiControlStation.TOOLTIP_BREAK_LINE+tooltipConnettore);
										} 
										else if(connettoreMultiploEnabledDefault) {
											/**de.setValue("["+org.openspcoop2.core.constants.Costanti.MAPPING_EROGAZIONE_PA_DESCRIZIONE_DEFAULT+"] "+this.getNomiConnettoriMultipliPortaApplicativa(paAssociataDefault));*/
											de.setValue(this.getNomiConnettoriMultipliPortaApplicativa(paAssociataDefault)); // comunque i connettori vengono ridefiniti internamente, sono proprio istanze differenti, quindi non ha senso la descrizione 
											de.setToolTip(this.getToolTipConnettoriMultipliPortaApplicativa(paAssociataDefault));
											/** Ci vuole, devo poter ridefinire il connettore visualizzaLinkConfigurazioneConnettore = false;*/
										}
										else {
											de.setValue(this.getNomiConnettoriMultipliPortaApplicativa(paAssociata));
											de.setToolTip(this.getToolTipConnettoriMultipliPortaApplicativa(paAssociata));
										}
									}
									else {
										if(visualizzaLinkConfigurazioneConnettore) {
											de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MODALITA_CONNETTORE_DEFAULT); 
											String tooltipConnettore = this.getTooltipConnettore(sa, is,true);
											de.setToolTip(ConnettoriCostanti.LABEL_PARAMETRO_MODALITA_CONNETTORE_DEFAULT+CostantiControlStation.TOOLTIP_BREAK_LINE+tooltipConnettore);
										} else {
											de.setType(DataElementType.TEXT);
											de.setValue("-");
										}
									}
								} else {
									ridefinito = true;
									servletConnettore = PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORE_RIDEFINITO;
									if(visualizzazioneTabs) {
										if(!connettoreMultiploEnabled) {	
											de.setValue(this.getLabelConnettore(sa,is,true));
											String tooltipConnettore = this.getTooltipConnettore(sa,is,true);
											de.setToolTip(ConnettoriCostanti.LABEL_PARAMETRO_MODALITA_CONNETTORE_RIDEFINITO+CostantiControlStation.TOOLTIP_BREAK_LINE+tooltipConnettore);
										} else {
											de.setValue(this.getNomiConnettoriMultipliPortaApplicativa(paAssociata));
											de.setToolTip(this.getToolTipConnettoriMultipliPortaApplicativa(paAssociata));
										}
									}
									else {
										if(visualizzaLinkConfigurazioneConnettore) {
											de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MODALITA_CONNETTORE_RIDEFINITO);
											String tooltipConnettore = this.getTooltipConnettore(sa, is,true);
											de.setToolTip(ConnettoriCostanti.LABEL_PARAMETRO_MODALITA_CONNETTORE_RIDEFINITO+CostantiControlStation.TOOLTIP_BREAK_LINE+tooltipConnettore);
										} else {
											de.setType(DataElementType.TEXT);
											de.setValue("-");
										}
									}
								}
								if(visualizzaLinkConfigurazioneConnettore) {
	/**								if(!isPaDefaultMulti) {*/
										de.setUrl(servletConnettore, pIdSogg, pIdPorta, pIdAsps);
	/**								}else {
	//									// solo modifica non ridefinizione
	//									de.setUrl(ServiziApplicativiCostanti.SERVLET_NAME_SERVIZI_APPLICATIVI_ENDPOINT, pIdProvider, pIdPortaPerSA, pIdAsps,
	//											new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_NOME_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getNome()),
	//											new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_ID_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getIdServizioApplicativo()+""));
	//								}*/
								}
								
								if(visualizzazioneTabs &&
									visualizzaLinkConfigurazioneConnettore) {
									DataElementImage image = new DataElementImage();
/**									if(!isPaDefaultMulti) {*/
										image.setUrl(servletConnettore, pIdSogg, pIdPorta, pIdAsps,pIdTAb);
/**									}else {
//										image.setUrl(ServiziApplicativiCostanti.SERVLET_NAME_SERVIZI_APPLICATIVI_ENDPOINT, pIdProvider, pIdPortaPerSA, pIdAsps,pIdTAb,
//												new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_NOME_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getNome()),
//												new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_ID_SERVIZIO_APPLICATIVO, portaApplicativaServizioApplicativo.getIdServizioApplicativo()+""));
//									}*/
									
									image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE));
									image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
									
									de.addImage(image);
								}
							}
							
							boolean checkConnettore = org.openspcoop2.pdd.core.connettori.ConnettoreCheck.checkSupported(connettore);
							if(checkConnettore &&
								!mapping.isDefault() && !ridefinito) {
								checkConnettore = false;
							}
							
							long idConnettore = connettore.getId();
							boolean visualizzaLinkCheckConnettore = 
									checkConnettore && 
									(
											(!this.core.isConnettoriMultipliEnabled())
											|| 
											( !connettoreMultiploEnabled )
									);
							
							Parameter pIdConnettore = new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ID, idConnettore+"");
							Parameter pConnettoreAccessoDaGruppi = new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ACCESSO_DA_GRUPPI, "true");
							Parameter pConnettoreVerificaRegistro = new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_REGISTRO, "false");
							if(visualizzazioneTabs &&
								visualizzaLinkCheckConnettore) {
								DataElementImage image = new DataElementImage();
								image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VERIFICA_CONNETTORE, paIdSogg, pIdPorta, pIdAsps,pIdTAb,
										pIdConnettore,
										pConnettoreAccessoDaGruppi,
										pConnettoreVerificaRegistro);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_VERIFICA_TOOLTIP_CON_PARAMETRO, PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE));
								image.setImage(CostantiControlStation.ICONA_VERIFICA);
								
								de.addImage(image);
							}
							
							de.allineaTdAlCentro();
							e.add(de);
							
							if(!visualizzazioneTabs) {
								DataElement deVerificaConnettore = new DataElement();
								
								if(visualizzaLinkCheckConnettore) {
									deVerificaConnettore.setValue(CostantiControlStation.LABEL_VERIFICA_CONNETTORE_VALORE_LINK);
									deVerificaConnettore.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VERIFICA_CONNETTORE, paIdSogg, pIdPorta, pIdAsps,
											pIdConnettore,
											pConnettoreAccessoDaGruppi,
											pConnettoreVerificaRegistro);
								}
								else {
									deVerificaConnettore.setValue("-");
								}
								deVerificaConnettore.allineaTdAlCentro();
								e.add(deVerificaConnettore);
							}
							
							
							// configurazione connettori multipli
							if(visualizzazioneTabs) {
								if(this.core.isConnettoriMultipliEnabled() && (connettoreRidefinito || mapping.isDefault())) {
									List<Parameter> listParametersConfigutazioneConnettoriMultipli = new ArrayList<>();
									listParametersConfigutazioneConnettoriMultipli.add(paIdSogg);
									listParametersConfigutazioneConnettoriMultipli.add(pIdPorta);
									listParametersConfigutazioneConnettoriMultipli.add(pIdAsps);
									listParametersConfigutazioneConnettoriMultipli.add(pIdTAb);
									listParametersConfigutazioneConnettoriMultipli.add(pConnettoreAccessoDaGruppi);
									listParametersConfigutazioneConnettoriMultipli.add(pConnettoreVerificaRegistro);
									listParametersConfigutazioneConnettoriMultipli.add(new Parameter(CostantiControlStation.PARAMETRO_ID_CONN_TAB, "0"));
									
									DataElementImage image = new DataElementImage();
									image.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_CONFIGURAZIONE_CONNETTORI_MULTIPLI_TOOLTIP);
									image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_CONFIGURAZIONE_CONNETTORI_MULTIPLI);
									image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONFIGURAZIONE_CONNETTORI_MULTIPLI, 
											listParametersConfigutazioneConnettoriMultipli.toArray(new Parameter[1]));
									de.addImage(image);
								}
							} else {
								DataElement deConfiguraConnettoriMultipli = new DataElement();
								
								if(this.core.isConnettoriMultipliEnabled() && (connettoreRidefinito || mapping.isDefault())) {
									deConfiguraConnettoriMultipli.setValue(this.getStatoConnettoriMultipliPortaApplicativa(paAssociata));
									deConfiguraConnettoriMultipli.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONFIGURAZIONE_CONNETTORI_MULTIPLI, paIdSogg, pIdPorta, pIdAsps,
											pConnettoreAccessoDaGruppi,
											pConnettoreVerificaRegistro,new Parameter(CostantiControlStation.PARAMETRO_ID_CONN_TAB, "0"));
								} else {
									deConfiguraConnettoriMultipli.setValue("-");
								}
								
								deConfiguraConnettoriMultipli.allineaTdAlCentro();
								e.add(deConfiguraConnettoriMultipli);
							}
							
							
							// lista connettori multipli
							if(visualizzazioneTabs) {
								if(this.core.isConnettoriMultipliEnabled() && connettoreMultiploEnabled) {
									List<Parameter> listParametersConfigutazioneConnettoriMultipli = new ArrayList<>();
									listParametersConfigutazioneConnettoriMultipli.add(paIdSogg);
									listParametersConfigutazioneConnettoriMultipli.add(pIdPorta);
									listParametersConfigutazioneConnettoriMultipli.add(pIdAsps);
									listParametersConfigutazioneConnettoriMultipli.add(pIdTAb);
									listParametersConfigutazioneConnettoriMultipli.add(pConnettoreAccessoDaGruppi);
									listParametersConfigutazioneConnettoriMultipli.add(pConnettoreVerificaRegistro);
									
									DataElementImage image = new DataElementImage();
									image.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_ELENCO_CONNETTORI_MULTIPLI_TOOLTIP);
									image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_ELENCO_CONNETTORI_MULTIPLI);
									image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORI_MULTIPLI_LIST, 
											listParametersConfigutazioneConnettoriMultipli.toArray(new Parameter[1]));
									de.addImage(image);
								}
							} else {
								DataElement deListaConnettoriMultipli = new DataElement();
								
								if(this.core.isConnettoriMultipliEnabled() && connettoreMultiploEnabled) {
									if(contaListe)
										ServletUtils.setDataElementVisualizzaLabel(deListaConnettoriMultipli, (long) paAssociata.sizeServizioApplicativoList());
									else 
										ServletUtils.setDataElementVisualizzaLabel(deListaConnettoriMultipli);
									deListaConnettoriMultipli.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORI_MULTIPLI_LIST, paIdSogg, pIdPorta, pIdAsps,
											pConnettoreAccessoDaGruppi,
											pConnettoreVerificaRegistro);
								} else {
									deListaConnettoriMultipli.setValue("-");
								}
								
								deListaConnettoriMultipli.allineaTdAlCentro();
								e.add(deListaConnettoriMultipli);
							}
							
						}
						 
						// controllo accessi
						DataElement de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONTROLLO_ACCESSI);
						//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONTROLLO_ACCESSI, pIdSogg, pIdPorta, pIdAsps);
						if(visualizzazioneTabs) {
							this.setStatoControlloAccessiPortaApplicativa(protocollo, paAssociata, de);
						}
						else {
							String statoControlloAccessi = getStatoControlloAccessiPortaApplicativa(protocollo, paAssociata); 
							de.setValue(statoControlloAccessi);
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONTROLLO_ACCESSI, pIdSogg, pIdPorta, pIdAsps,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONTROLLO_ACCESSI));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							de.setImage(image);
						}
						e.add(de);
											
						// RateLimiting
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RATE_LIMITING);
						
						de.setUrl(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_CONTROLLO_TRAFFICO_ATTIVAZIONE_POLICY_LIST+"?"+
								ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_RUOLO_PORTA+"="+RuoloPolicy.APPLICATIVA.getValue()+"&"+
								ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_NOME_PORTA+"="+paAssociata.getNome()+"&"+
								ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_SERVICE_BINDING+"="+serviceBindingMessage.name()
								);
						List<AttivazionePolicy> listaPolicy = null;
						if(contaListe || visualizzazioneTabs) {
							ConsoleSearch searchPolicy = new ConsoleSearch(true);
							listaPolicy = this.confCore.attivazionePolicyList(searchPolicy, RuoloPolicy.APPLICATIVA, paAssociata.getNome());
						}
						if(visualizzazioneTabs) {
							this.setStatoRateLimiting(de, listaPolicy);
						}
						else {
							if(contaListe) {
								ServletUtils.setDataElementVisualizzaLabel(de, (long) listaPolicy.size() );
							}
							else {
								ServletUtils.setDataElementVisualizzaLabel(de);
							}
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_CONTROLLO_TRAFFICO_ATTIVAZIONE_POLICY_LIST, 
									new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_RUOLO_PORTA,RuoloPolicy.APPLICATIVA.getValue()),
									new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_NOME_PORTA,paAssociata.getNome()),
									new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_SERVICE_BINDING,serviceBindingMessage.name()),
									pIdTAb
									);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RATE_LIMITING));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							de.setImage(image);
						}
						e.add(de);
						
						// validazione contenuti
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI);
						//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI, pIdSogg, pIdPorta, pIdAsps);
						if(visualizzazioneTabs) {
							setStatoValidazioneContenuti(de, paAssociata.getValidazioneContenutiApplicativi(), apc.getFormatoSpecifica());
						}
						else {
							String statoValidazione = getStatoValidazionePortaApplicativa(paAssociata);
							de.setValue(statoValidazione);
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI, pIdSogg, pIdPorta, pIdAsps,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							
							de.setImage(image);
						}
						e.add(de);
						
						// Response Caching
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RESPONSE_CACHING);
						//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_RESPONSE_CACHING, pIdSogg, pIdPorta, pIdAsps);
						if(visualizzazioneTabs) {
							setStatoCachingRisposta(de, paAssociata.getResponseCaching(), configurazioneGenerale);
						}
						else {
							String statoResponseCaching = getStatoResponseCachingPortaApplicativa(paAssociata, false);
							de.setValue(statoResponseCaching);
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_RESPONSE_CACHING, pIdSogg, pIdPorta, pIdAsps,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RESPONSE_CACHING));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							
							de.setImage(image);
						}
						e.add(de);
						
						// message security
						if(visualizzaSicurezza) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MESSAGE_SECURITY);
							//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MESSAGE_SECURITY, pIdSogg, pIdPorta, pIdAsps);
							if(visualizzazioneTabs) {
								setStatoSicurezzaMessaggio(de, paAssociata.getMessageSecurity(), configManager, propertiesSourceConfiguration);
							}
							else {
								String statoMessageSecurity = getStatoMessageSecurityPortaApplicativa(paAssociata);
								de.setValue(statoMessageSecurity);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								
								image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MESSAGE_SECURITY, pIdSogg, pIdPorta, pIdAsps,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MESSAGE_SECURITY));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								de.setImage(image);
							}
							e.add(de);
						}
						
						//mtom
						if(visualizzaMTOM) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM);
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MTOM,pIdPorta, pIdSogg, pIdAsps);
							if(visualizzazioneTabs) {
								setStatoMTOM(de, paAssociata.getMtomProcessor());
							}
							else {
								String statoMTOM = getStatoMTOMPortaApplicativa(paAssociata);
								de.setValue(statoMTOM);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								
								image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MTOM,pIdPorta, pIdSogg, pIdAsps,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								
								de.setImage(image);
							}
							e.add(de);
						}
						
						// trasformazioni
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRASFORMAZIONI);
						//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_TRASFORMAZIONI_LIST, pIdSogg, pIdPorta, pIdAsps);
						if(visualizzazioneTabs) {
							setStatoTrasformazioni(de, paAssociata.getTrasformazioni(), serviceBindingMessage);
						}
						else {
							if(contaListe) {
								long size = 0;
								if(paAssociata.getTrasformazioni()!=null) {
									size = paAssociata.getTrasformazioni().sizeRegolaList();
								}
								ServletUtils.setDataElementVisualizzaLabel(de, size); 
							}
							else {
								ServletUtils.setDataElementVisualizzaLabel(de);
							}	
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_TRASFORMAZIONI_LIST, pIdSogg, pIdPorta, pIdAsps,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRASFORMAZIONI));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							de.setImage(image);
						}
						e.add(de);
						
						// correlazione applicativa
						if(visualizzaCorrelazione) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRACCIAMENTO);
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CORRELAZIONE_APPLICATIVA, pIdSogg, pIdPorta, pIdNome,pIdAsps);
							if(visualizzazioneTabs) {
								setStatoTracciamento(de, paAssociata.getCorrelazioneApplicativa(), 
										paAssociata.getCorrelazioneApplicativaRisposta(), 
										paAssociata.getTracciamento(), 
										(configurazioneGenerale!=null && configurazioneGenerale.getTracciamento()!=null) ? configurazioneGenerale.getTracciamento().getPortaApplicativa() : null,
										paAssociata.getProprieta(),
										configurazioneGenerale);	
							}
							else {
								String statoTracciamento = getStatoTracciamentoPortaApplicativa(paAssociata);
								de.setValue(statoTracciamento);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								
								image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CORRELAZIONE_APPLICATIVA, pIdSogg, pIdPorta, pIdNome,pIdAsps,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRACCIAMENTO));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								de.setImage(image);
							}
							e.add(de);
						}
						
						// dump
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE);
						//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE, pIdSogg, pIdPorta, pIdAsps);
						if(visualizzazioneTabs) {
							setStatoDump(de, paAssociata.getDump(), configurazioneGenerale, true);
						}
						else {
							String statoDump = getStatoDumpPortaApplicativa(paAssociata,false);
							de.setValue(statoDump);
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE, pIdSogg, pIdPorta, pIdAsps,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							de.setImage(image);
						}
						e.add(de);
						
						// Allarmi
						if(visualizzaAllarmi) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_ALLARMI);
							
							de.setUrl(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_ALLARMI_LIST+"?"+
									ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_RUOLO_PORTA+"="+RuoloPorta.APPLICATIVA.getValue()+"&"+
									ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_NOME_PORTA+"="+paAssociata.getNome()+"&"+
									ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_SERVICE_BINDING+"="+serviceBindingMessage.name()
									);
							List<ConfigurazioneAllarmeBean> listaAllarmi = null;
							if(contaListe || visualizzazioneTabs) {
								ConsoleSearch searchPolicy = new ConsoleSearch(true);
								listaAllarmi = this.confCore.allarmiList(searchPolicy, RuoloPorta.APPLICATIVA, paAssociata.getNome());
							}
							if(visualizzazioneTabs) {
								this.setStatoAllarmi(de, listaAllarmi);
							}
							else {
								if(contaListe) {
									ServletUtils.setDataElementVisualizzaLabel(de, (long) listaAllarmi.size() );
								}
								else {
									ServletUtils.setDataElementVisualizzaLabel(de);
								}
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								
								image.setUrl(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_ALLARMI_LIST, 
										new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_RUOLO_PORTA,RuoloPorta.APPLICATIVA.getValue()),
										new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_NOME_PORTA,paAssociata.getNome()),
										new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_SERVICE_BINDING,serviceBindingMessage.name()),
										pIdTAb
										);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_ALLARMI));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								de.setImage(image);
							}
							e.add(de);
						}
						
						// Protocol Properties
						if(this.isModalitaAvanzata() || this.apsCore.isProprietaErogazioniShowModalitaStandard()) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_PROTOCOL_PROPERTIES);
							//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_PROPRIETA_PROTOCOLLO_LIST, pIdSogg, pIdPorta,pIdAsps);
							if(visualizzazioneTabs) {
								setStatoProprieta(de, paAssociata.sizeProprietaList());
							}
							else {
								if (contaListe) {
									int numProp = paAssociata.sizeProprietaList();
									ServletUtils.setDataElementVisualizzaLabel(de, (long) numProp );
								} else
									ServletUtils.setDataElementVisualizzaLabel(de);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								
								image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_PROPRIETA_PROTOCOLLO_LIST, pIdSogg, pIdPorta,pIdAsps,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_PROTOCOL_PROPERTIES));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								de.setImage(image);
							}
							e.add(de);
						}
		
						// Altro
						if(this.isModalitaAvanzata()){
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_OPZIONI_AVANZATE);
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,pIdSogg, pNomePorta, pIdPorta,pIdAsps,pConfigurazioneAltroPorta);
							if(visualizzazioneTabs) {
								String behaviour = (!this.core.isConnettoriMultipliEnabled() && paAssociata.getBehaviour()!=null) ? paAssociata.getBehaviour().getNome() : null;
								setStatoOpzioniAvanzate(de, 
										protocollo, serviceBindingMessage,
										paAssociata.getAllegaBody(), paAssociata.getScartaBody(), 
										paAssociata.getIntegrazione(), behaviour,
										paAssociata.getProprietaRateLimitingList(),
										paAssociata.getStateless(), null, 
										paAssociata.getRicevutaAsincronaSimmetrica(), paAssociata.getRicevutaAsincronaAsimmetrica(),
										paAssociata.getGestioneManifest(), paAssociata.getConfigurazioneHandler());
							}
							else {
								ServletUtils.setDataElementVisualizzaLabel(de);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								
								image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,pIdSogg, pNomePorta, pIdPorta,pIdAsps,pConfigurazioneAltroPorta,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_OPZIONI_AVANZATE));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								de.setImage(image);
							}
							e.add(de);
						}
						
						// Extended Servlet List
						if(extendedServletList!=null && extendedServletList.showExtendedInfo(this, protocollo)){
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(extendedServletList.getListTitle(this));
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_EXTENDED_LIST, pIdPorta,pIdNome,pIdPorta, pIdSogg, pNomePorta, pIdAsps, pConfigurazioneAltroPorta);
							if(visualizzazioneTabs) {
								int numExtended = extendedServletList.sizeList(paAssociata);
								String stato = extendedServletList.getStatoTab(this,paAssociata,mapping.isDefault());
								String statoTooltip = extendedServletList.getStatoTab(this,paAssociata,mapping.isDefault());
								setStatoExtendedList(de, numExtended, stato, statoTooltip);
							}
							else {
								if (contaListe) {
									int numExtended = extendedServletList.sizeList(paAssociata);
									ServletUtils.setDataElementVisualizzaLabel(de,Long.valueOf(numExtended));
								} else
									ServletUtils.setDataElementVisualizzaLabel(de);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								
								image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_EXTENDED_LIST, pIdPorta,pIdNome,pIdPorta, pIdSogg, pNomePorta, pIdAsps, pConfigurazioneAltroPorta,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,extendedServletList.getListTitle(this)));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								de.setImage(image);
							}
							e.add(de);
						}
						
						if(visualizzazioneTabs) {
							// Proprieta Oggetto
							this.addProprietaOggetto(e, paAssociata.getProprietaOggetto());
						}
					}
					
					dati.add(e);
					idTab ++;
				}
			}

			this.pd.setDati(dati);
			if(visualizzazioneTabs) {
				this.pd.setSelect(true);
		        if(showBottoneAggiungiNuovaConfigurazione) {
		        	this.pd.setAddButton(true);
		        }
		        else {
		        	this.pd.setAddButton(false);
		        }
				if(lista.size() > 1)
					this.pd.setRemoveButton(true);
				else 
					this.pd.setRemoveButton(false);
			} else {
				if(gestioneGruppi) {
					if(listaSenzaFiltro!=null && listaSenzaFiltro.size()>1) {
						this.pd.setRemoveButton(true);
						this.pd.setSelect(true);
					}
					else {
						this.pd.setRemoveButton(false);
						this.pd.setSelect(false);
					}
					this.pd.setAddButton(true);
				}
				else {
					this.pd.setAddButton(false);
					this.pd.setRemoveButton(false);
					this.pd.setSelect(false);
				}
			}
		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}
	
	private MappingErogazionePortaApplicativa getFiltroAzioneMappingErogazione(String filtroAzione, List<MappingErogazionePortaApplicativa> lista) throws DriverConfigurazioneNotFound, DriverConfigurazioneException {
		if(StringUtils.isNotEmpty(filtroAzione) && !filtroAzione.equals(CostantiControlStation.DEFAULT_VALUE_AZIONE_RISORSA_NON_SELEZIONATA)) {
			MappingErogazionePortaApplicativa mappingTmp = null; 
			
			for (MappingErogazionePortaApplicativa mappingErogazionePortaApplicativa : lista) {
				PortaApplicativa paAssociata = this.porteApplicativeCore.getPortaApplicativa(mappingErogazionePortaApplicativa.getIdPortaApplicativa());
				if(paAssociata.getAzione() != null && paAssociata.getAzione().getAzioneDelegataList().contains(filtroAzione)) {
					mappingTmp = mappingErogazionePortaApplicativa;
					break;
				}
			}
			if(mappingTmp == null) {
				for (MappingErogazionePortaApplicativa mappingErogazionePortaApplicativa : lista) {
					if(mappingErogazionePortaApplicativa.isDefault()) {
						mappingTmp = mappingErogazionePortaApplicativa;
						break;
					}
				}
			}
			return mappingTmp;
		}
		else {
			return null;
		}
	}
	
	private List<MappingErogazionePortaApplicativa> impostaFiltroAzioneMappingErogazione(String filtroAzione, List<MappingErogazionePortaApplicativa> lista, 
			ISearch ricerca, int idLista) throws DriverConfigurazioneNotFound, DriverConfigurazioneException {
		
		MappingErogazionePortaApplicativa mapping = getFiltroAzioneMappingErogazione(filtroAzione, lista);
		if(mapping!=null) {
			List<MappingErogazionePortaApplicativa> newList = new ArrayList<>();
			newList.add(mapping);
			this.pd.setNumEntries(1);
			return newList;
		}
		else {
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));
			return lista;
		}
	}
	
	public boolean allActionsRedefinedMappingErogazionePaAssociate(List<String> azioni, List<PortaApplicativa> lista) throws DriverConfigurazioneException, DriverConfigurazioneNotFound {
		// verifico se tutte le azioni sono definite in regole specifiche
		boolean all = true;
		if(azioni!=null && azioni.size()>0) {
			for (String azione : azioni) {
				if(lista==null || lista.size()<=0) {
					all  = false;
					break;
				}
				boolean found = false;
				for (PortaApplicativa paAssociata : lista) {
					if(paAssociata.getAzione() != null && paAssociata.getAzione().getAzioneDelegataList().contains(azione)) {
						found = true;
						break;
					}
				}
				if(!found) {
					all  = false;
					break;
				}
			}
		}
		return all;
	}
	
	private MappingFruizionePortaDelegata getFiltroAzioneMappingFruizione(String filtroAzione, List<MappingFruizionePortaDelegata> lista) throws DriverConfigurazioneNotFound, DriverConfigurazioneException {
		if(StringUtils.isNotEmpty(filtroAzione) && !filtroAzione.equals(CostantiControlStation.DEFAULT_VALUE_AZIONE_RISORSA_NON_SELEZIONATA)) {
			MappingFruizionePortaDelegata mappingTmp = null; 
			
			for (MappingFruizionePortaDelegata mappingFruizionePortaDelegata : lista) {
				PortaDelegata pdAssociata = this.porteDelegateCore.getPortaDelegata(mappingFruizionePortaDelegata.getIdPortaDelegata());
				if(pdAssociata.getAzione() != null && pdAssociata.getAzione().getAzioneDelegataList().contains(filtroAzione)) {
					mappingTmp = mappingFruizionePortaDelegata;
					break;
				}
			}
			if(mappingTmp == null) {
				for (MappingFruizionePortaDelegata mappingFruizionePortaDelegata : lista) {
					if(mappingFruizionePortaDelegata.isDefault()) {
						mappingTmp = mappingFruizionePortaDelegata;
						break;
					}
				}
			}
			return mappingTmp;
		}
		else {
			return null;
		}
	}
	private List<MappingFruizionePortaDelegata> impostaFiltroAzioneMappingFruizione(String filtroAzione, List<MappingFruizionePortaDelegata> lista, 
			ISearch ricerca, int idLista) throws DriverConfigurazioneNotFound, DriverConfigurazioneException {
		MappingFruizionePortaDelegata mappingTmp = this.getFiltroAzioneMappingFruizione(filtroAzione, lista);	
		if(mappingTmp!=null) {
			List<MappingFruizionePortaDelegata> newList = new ArrayList<>();
			newList.add(mappingTmp);
			this.pd.setNumEntries(1);
			return newList;
		} else {
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));
			return lista;
		}
	}
	
	public List<String> getAllActionsNotRedefinedMappingFruizione(List<String> azioni, List<MappingFruizionePortaDelegata> lista) throws DriverConfigurazioneException, DriverConfigurazioneNotFound {
		// verifico se tutte le azioni sono definite in regole specifiche
		List<String> l = new ArrayList<>();
		if(lista==null || lista.size()<=0) {
			return azioni;
		}
		l.addAll(azioni);
		for (MappingFruizionePortaDelegata mappingFruizionePortaDelegata : lista) {
			PortaDelegata pdAssociata = this.porteDelegateCore.getPortaDelegata(mappingFruizionePortaDelegata.getIdPortaDelegata());
			if(pdAssociata.getAzione() != null && !pdAssociata.getAzione().getAzioneDelegataList().isEmpty()) {
				for (String azPA : pdAssociata.getAzione().getAzioneDelegataList()) {
					l.remove(azPA);
				}
			}
		}
		return l;
	}
	
	public boolean allActionsRedefinedMappingFruizione(List<String> azioni, List<MappingFruizionePortaDelegata> lista) throws DriverConfigurazioneException, DriverConfigurazioneNotFound {
		// verifico se tutte le azioni sono definite in regole specifiche
		boolean all = true;
		if(azioni!=null && azioni.size()>0) {
			for (String azione : azioni) {
				if(lista==null || lista.size()<=0) {
					all  = false;
					break;
				}
				boolean found = false;
				for (MappingFruizionePortaDelegata mappingFruizionePortaDelegata : lista) {
					PortaDelegata pdAssociata = this.porteDelegateCore.getPortaDelegata(mappingFruizionePortaDelegata.getIdPortaDelegata());
					if(pdAssociata.getAzione() != null && pdAssociata.getAzione().getAzioneDelegataList().contains(azione)) {
						found = true;
						break;
					}
				}
				if(!found) {
					all  = false;
					break;
				}
			}
		}
		return all;
	}
	
	public boolean allActionsRedefinedMappingFruizionePdAssociate(List<String> azioni, List<PortaDelegata> lista) throws DriverConfigurazioneException, DriverConfigurazioneNotFound {
		// verifico se tutte le azioni sono definite in regole specifiche
		boolean all = true;
		if(azioni!=null && azioni.size()>0) {
			for (String azione : azioni) {
				if(lista==null || lista.size()<=0) {
					all  = false;
					break;
				}
				boolean found = false;
				for (PortaDelegata pdAssociata : lista) {
					if(pdAssociata.getAzione() != null && pdAssociata.getAzione().getAzioneDelegataList().contains(azione)) {
						found = true;
						break;
					}
				}
				if(!found) {
					all  = false;
					break;
				}
			}
		}
		return all;
	}


	public void serviziFruitoriPorteDelegateList(List<PortaDelegata> lista, String idServizio, String idSoggettoFruitore, String idFruzione, ISearch ricerca)
			throws Exception {
		try {
			
			Boolean contaListe = ServletUtils.getContaListeFromSession(this.session);

			ServletUtils.addListElementIntoSession(this.request, this.session, AccordiServizioParteSpecificaCostanti.OBJECT_NAME_APS_FRUITORI_PORTE_DELEGATE,
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, idServizio),
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO, idSoggettoFruitore),
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, idFruzione));

			IExtendedListServlet extendedServletList = this.core.getExtendedServletPortaDelegata();
			
			int idLista = Liste.SERVIZI_FRUITORI_PORTE_DELEGATE;
			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);
			String search = ServletUtils.getSearchFromSession(ricerca, idLista);

			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));

			// Utilizza la configurazione come parent
			ServletUtils.setObjectIntoSession(this.request, this.session, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT_CONFIGURAZIONE, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT);

			// Prendo il nome e il tipo del servizio
			AccordoServizioParteSpecifica asps = this.apsCore.getAccordoServizioParteSpecifica(Integer.parseInt(idServizio));

			// Prendo il nome e il tipo del soggetto fruitore
			Soggetto soggFruitore = this.soggettiCore.getSoggettoRegistro(Integer.parseInt(idSoggettoFruitore));
			
			String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(soggFruitore.getTipo());
			
			String servizioTmpTile = asps.getTipoSoggettoErogatore() + "/" + asps.getNomeSoggettoErogatore() + "-" + asps.getTipo() + "/" + asps.getNome();
			Parameter pIdServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, idServizio+ "");
			Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, asps.getNome());
			Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, asps.getTipo());
			
			String fruitoreTmpTile = "Fruitore "+soggFruitore.getTipo() + "/" + soggFruitore.getNome();
			Parameter pIdFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, idFruzione+ "");

			// setto la barra del titolo
			List<Parameter> lstParm = new ArrayList<>();

			lstParm.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
			lstParm.add(new Parameter(servizioTmpTile, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE, pIdServizio,pNomeServizio, pTipoServizio));
			lstParm.add(new Parameter(fruitoreTmpTile, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_CHANGE, pIdServizio,pIdFruitore));
			
			if (search.equals("")) {
				this.pd.setSearchDescription("");
				lstParm.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE, null));
			}else {
				lstParm.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE,
						AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_PORTE_DELEGATE_LIST,
						new Parameter( AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, idServizio),
						new Parameter( AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO, idSoggettoFruitore)));
				lstParm.add(new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_RISULTATI_RICERCA, null));
			}			
			
			// setto la barra del titolo
			ServletUtils.setPageDataTitle(this.pd, lstParm );

			// controllo eventuali risultati ricerca
			if (!search.equals("")) {
				ServletUtils.enabledPageDataSearch(this.pd, AccordiServizioParteSpecificaCostanti.LABEL_APS_CONFIGURAZIONI, search);
			}


			List<String> listaLabel = new ArrayList<>();

			listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_NOME);
			//listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_SOGGETTO);
			//listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_DESCRIZIONE);
			listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_SERVIZI_APPLICATIVI);
			listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_RUOLI); 
			listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MESSAGE_SECURITY);
			//if(InterfaceType.AVANZATA.equals(ServletUtils.getUserFromSession(this.session).getInterfaceType())){
			listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MTOM);
			//}
			listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA_BR_RICHIESTA); 
			listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA_BR_RISPOSTA); 
			if(extendedServletList!=null && extendedServletList.showExtendedInfo(this, protocollo)){
				listaLabel.add(extendedServletList.getListTitle(this));
			}

			String[] labels = listaLabel.toArray(new String[listaLabel.size()]);
			this.pd.setLabels(labels);

			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			Iterator<PortaDelegata> it = lista.iterator();
			PortaDelegata pd = null;
			while (it.hasNext()) {
				pd = it.next();
				List<DataElement> e = new ArrayList<>();

				
				DataElement de = new DataElement();
				de.setType(DataElementType.HIDDEN);
				de.setValue("" + pd.getId());
				e.add(de);
				
				
				de = new DataElement();
				de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME_PORTA,pd.getNome()),
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, "" + pd.getId())
						);
				de.setValue(pd.getNome());
				de.setIdToRemove(pd.getId().toString());
				de.setToolTip(pd.getDescrizione());
				e.add(de);
				
				// NON SERVE: sono già dentro un soggetto fruitore
//				de = new DataElement();
//				de.setValue(pd.getTipoSoggettoProprietario()+"/"+pd.getNomeSoggettoProprietario());
//				e.add(de);
				
//				de = new DataElement();
//				de.setValue(pd.getDescrizione());
//				e.add(de);
				
				de = new DataElement();
				if(TipoAutorizzazione.isAuthenticationRequired(pd.getAutorizzazione())
						|| 
						!TipoAutorizzazione.getAllValues().contains(pd.getAutorizzazione()) ){  // custom ){
					de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_SERVIZIO_APPLICATIVO_LIST,
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, ""+pd.getId())
							);
					if (contaListe) {
						int numSA = pd.sizeServizioApplicativoList();
						ServletUtils.setDataElementVisualizzaLabel(de,Long.valueOf(numSA));
					} else
						ServletUtils.setDataElementVisualizzaLabel(de);
				}
				else{
					de.setValue("-");
				}
				e.add(de);
				
				de = new DataElement();
				if(TipoAutorizzazione.isRolesRequired(pd.getAutorizzazione())
						|| 
						!TipoAutorizzazione.getAllValues().contains(pd.getAutorizzazione()) ){  // custom ){
					de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_RUOLI_LIST,
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, ""+pd.getId())
							);
					if (contaListe) {
						int numSA = 0;
						if(pd.getRuoli()!=null){
							numSA= pd.getRuoli().sizeRuoloList();
						}
						ServletUtils.setDataElementVisualizzaLabel(de,Long.valueOf(numSA));
					} else
						ServletUtils.setDataElementVisualizzaLabel(de);
				}
				else{
					de.setValue("-");
				}
				e.add(de);		

				de = new DataElement();
				de.setUrl( 
						PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_MESSAGE_SECURITY,
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, ""+pd.getId())
						);
				de.setValue(pd.getStatoMessageSecurity());
				e.add(de);

				//if(InterfaceType.AVANZATA.equals(ServletUtils.getUserFromSession(this.session).getInterfaceType())){
				de = new DataElement();
				de.setUrl( 
						PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_MTOM,
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, ""+pd.getId())
						);

				boolean isMTOMAbilitatoReq = false;
				boolean isMTOMAbilitatoRes= false;
				if(pd.getMtomProcessor()!= null){
					if(pd.getMtomProcessor().getRequestFlow() != null){
						if(pd.getMtomProcessor().getRequestFlow().getMode() != null){
							MTOMProcessorType mode = pd.getMtomProcessor().getRequestFlow().getMode();
							if(!mode.equals(MTOMProcessorType.DISABLE))
								isMTOMAbilitatoReq = true;
						}
					}

					if(pd.getMtomProcessor().getResponseFlow() != null){
						if(pd.getMtomProcessor().getResponseFlow().getMode() != null){
							MTOMProcessorType mode = pd.getMtomProcessor().getResponseFlow().getMode();
							if(!mode.equals(MTOMProcessorType.DISABLE))
								isMTOMAbilitatoRes = true;
						}
					}
				}

				if(isMTOMAbilitatoReq || isMTOMAbilitatoRes)
					de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MTOM_ABILITATO);
				else 
					de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MTOM_DISABILITATO);
				e.add(de);
				//}

				de = new DataElement();
				de.setUrl(
						PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA_REQUEST_LIST,
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, ""+pd.getId()),
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME,pd.getNome())
						);
				if (contaListe) {
					int numCorrelazione = 0;
					if (pd.getCorrelazioneApplicativa() != null)
						numCorrelazione = pd.getCorrelazioneApplicativa().sizeElementoList();
					ServletUtils.setDataElementVisualizzaLabel(de,Long.valueOf(numCorrelazione));
				} else
					ServletUtils.setDataElementVisualizzaLabel(de);
				e.add(de);

				de = new DataElement();
				de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA_RESPONSE_LIST,
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, ""+pd.getId()),
						new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME,pd.getNome())
						);
				if (contaListe) {
					int numCorrelazione = 0;
					if (pd.getCorrelazioneApplicativaRisposta() != null)
						numCorrelazione = pd.getCorrelazioneApplicativaRisposta().sizeElementoList();
					ServletUtils.setDataElementVisualizzaLabel(de,Long.valueOf(numCorrelazione));
				} else
					ServletUtils.setDataElementVisualizzaLabel(de);
				e.add(de);

				if(extendedServletList!=null && extendedServletList.showExtendedInfo(this, protocollo)){
					de = new DataElement();
					de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_EXTENDED_LIST,
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, ""+pd.getId()),
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME,pd.getNome())
							);
					if (contaListe) {
						int numExtended = extendedServletList.sizeList(pd);
						ServletUtils.setDataElementVisualizzaLabel(de,Long.valueOf(numExtended));
					} else
						ServletUtils.setDataElementVisualizzaLabel(de);
					e.add(de);
				}
				
				dati.add(e);
			}

			this.pd.setDati(dati);
			this.pd.setAddButton(false);

		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}
	
	public void serviziFruitoriMappingList(List<MappingFruizionePortaDelegata> listaParam, String idServizio, 
			String idSoggFruitoreDelServizio, IDSoggetto idSoggettoFruitore, String idFruzione, ISearch ricerca)	throws Exception {
		try {
			
			Boolean contaListeObject = ServletUtils.getContaListeFromSession(this.session);
			boolean contaListe = contaListeObject!=null ? contaListeObject.booleanValue() : false;
			
			Parameter parametroTipoSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE, idSoggettoFruitore.getTipo());
			Parameter parametroNomeSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE, idSoggettoFruitore.getNome());
			
			ServletUtils.addListElementIntoSession(this.request, this.session, AccordiServizioParteSpecificaCostanti.OBJECT_NAME_APS_FRUITORI_PORTE_DELEGATE,
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, idServizio),
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO, idSoggFruitoreDelServizio),
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, idFruzione),
					parametroTipoSoggettoFruitore, parametroNomeSoggettoFruitore);

			IExtendedListServlet extendedServletList = this.core.getExtendedServletPortaDelegata();
			
			int idLista = Liste.CONFIGURAZIONE_FRUIZIONE;
			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);

			String tipologia = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
			boolean gestioneFruitori = false;
			if(tipologia!=null &&
				AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE.equals(tipologia)) {
				gestioneFruitori = true;
			}
			
			boolean gestioneGruppi = true;
			String paramGestioneGruppi = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_GRUPPI);
			if(paramGestioneGruppi!=null && !"".equals(paramGestioneGruppi)) {
				gestioneGruppi = Boolean.valueOf(paramGestioneGruppi);
			}
			
			boolean gestioneConfigurazioni = true;
			String paramGestioneConfigurazioni = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_CONFIGURAZIONI);
			if(paramGestioneConfigurazioni!=null && !"".equals(paramGestioneConfigurazioni)) {
				gestioneConfigurazioni = Boolean.valueOf(paramGestioneConfigurazioni);
			}
			
			boolean visualizzazioneTabs = !this.isModalitaCompleta();
			if(visualizzazioneTabs) {
			        gestioneGruppi = false;
			        this.pd.setCustomListViewName(ErogazioniCostanti.ASPS_EROGAZIONI_NOME_VISTA_CUSTOM_CONFIGURAZIONE);
			}
			
			// Prendo il nome e il tipo del servizio
			AccordoServizioParteSpecifica asps = this.apsCore.getAccordoServizioParteSpecifica(Integer.parseInt(idServizio));
			AccordoServizioParteComuneSintetico apc = this.apcCore.getAccordoServizioSintetico(asps.getIdAccordo()); 
			org.openspcoop2.core.registry.constants.ServiceBinding serviceBinding = apc.getServiceBinding();
			ServiceBinding serviceBindingMessage = this.apcCore.toMessageServiceBinding(apc.getServiceBinding());
			
			Map<String,String> azioni = this.porteApplicativeCore.getAzioniConLabel(asps, apc, false, true, new ArrayList<>());
			String filtroAzione = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_AZIONE);
			
			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setSearch("");

			// Utilizza la configurazione come parent
			ServletUtils.setObjectIntoSession(this.request, this.session, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT_CONFIGURAZIONE, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT);
			
			List<MappingFruizionePortaDelegata> listaSenzaFiltro = this.impostaFiltroAzioneMappingFruizione(null, listaParam,ricerca, idLista);
			
			boolean showBottoneAggiungiNuovaConfigurazione = 
					(azioni!=null && azioni.size()>1) 
					||
					(listaSenzaFiltro.size()>1);
			if(showBottoneAggiungiNuovaConfigurazione) {
				// verifico modalita identificazione
				for (MappingFruizionePortaDelegata mappingFruizionePortaDelegata : listaParam) {
					if(mappingFruizionePortaDelegata.isDefault()) {
						PortaDelegata pdDefaullt = this.porteDelegateCore.getPortaDelegata(mappingFruizionePortaDelegata.getIdPortaDelegata());
						if(pdDefaullt.getAzione()!=null && 
								org.openspcoop2.core.config.constants.PortaDelegataAzioneIdentificazione.STATIC.equals(pdDefaullt.getAzione().getIdentificazione())) {
							showBottoneAggiungiNuovaConfigurazione = false;
						}
						break;
					}
				}
			}
						
			List<MappingFruizionePortaDelegata> lista = null;
			boolean chooseTabWithFilter = !this.isModalitaCompleta();
			if(chooseTabWithFilter) {
				lista = listaSenzaFiltro;
				if(lista.size()>1) {
					MappingFruizionePortaDelegata mappingContenenteAzione = getFiltroAzioneMappingFruizione(filtroAzione, listaParam);
					if(mappingContenenteAzione!=null) {
						int tab = -1;
						for (int i = 0; i < lista.size(); i++) {
							if(lista.get(i).getNome().equals(mappingContenenteAzione.getNome())) {
								tab = i;
								break;
							}
						}
						if(tab>=0) {
							ServletUtils.setObjectIntoSession(this.request, this.session, tab+"", CostantiControlStation.PARAMETRO_ID_TAB);
						}
					}
					
					this.pd.setLabelBottoneFiltra(CostantiControlStation.LABEL_BOTTONE_INDIVIDUA_GRUPPO);
				}
			}
			else {
				lista = this.impostaFiltroAzioneMappingFruizione(filtroAzione, listaParam,ricerca, idLista);
			}
			
			boolean allActionRedefined = false;
			List<String> actionNonRidefinite = null;
            if(listaSenzaFiltro!=null && listaSenzaFiltro.size()>1) {
				List<String> azioniL = new ArrayList<>();
				if(azioni != null && azioni.size() > 0)
					azioniL.addAll(azioni.keySet());
				allActionRedefined = this.allActionsRedefinedMappingFruizione(azioniL, listaSenzaFiltro);
				if(!allActionRedefined) {
					actionNonRidefinite = this.getAllActionsNotRedefinedMappingFruizione(azioniL, listaSenzaFiltro);
				}
            }
			
			if(!gestioneGruppi && listaParam.size()<=1) {
				ServletUtils.disabledPageDataSearch(this.pd);
			}
			else {
				this.addFilterAzione(azioni, filtroAzione, serviceBindingMessage);
			}
			
			boolean visualizzaAllarmi = this.confCore.isVisualizzaConfigurazioneAllarmiEnabled();  // configurazione allarmi (solo se sono stati caricati dei plugin di tipo allarme)
			
			boolean visualizzaMTOM = true;
			boolean visualizzaSicurezza = true;
			boolean visualizzaCorrelazione = true;
			
			switch (serviceBinding) {
			case REST:
				visualizzaMTOM = false;
				visualizzaSicurezza = true;
				visualizzaCorrelazione = true;
				break;
			case SOAP:
			default:
				visualizzaMTOM = true;
				visualizzaSicurezza = true;
				visualizzaCorrelazione = true;
				break;
			}
			

			// Prendo il nome e il tipo del soggetto fruitore
			Soggetto soggFruitore = this.soggettiCore.getSoggettoRegistro(Integer.parseInt(idSoggFruitoreDelServizio));
		
			String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(soggFruitore.getTipo());
			
			String servizioTmpTile = this.getLabelIdServizio(asps);
			if(gestioneFruitori) {
				servizioTmpTile = this.getLabelServizioFruizione(protocollo, idSoggettoFruitore, asps);
			}
			Parameter pIdServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, idServizio+ "");
			Parameter pIdAsps = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_ASPS, idServizio);
			Parameter pIdSoggettoErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, asps.getIdSoggetto()+"");
			
			String fruitoreTmpTile = this.getLabelNomeSoggetto(protocollo, soggFruitore.getTipo(), soggFruitore.getNome());
		
			Fruitore fru = null;
			if(gestioneFruitori) {
				for (Fruitore fruCheck : asps.getFruitoreList()) {
					if(fruCheck.getTipo().equals(idSoggettoFruitore.getTipo()) &&
							fruCheck.getNome().equals(idSoggettoFruitore.getNome())) {
						fru = fruCheck;
						break;
					}
				}
			}
			else {
				for (Fruitore fruCheck : asps.getFruitoreList()) {
					if(fruCheck.getTipo().equals(soggFruitore.getTipo()) &&
							fruCheck.getNome().equals(soggFruitore.getNome())) {
						fru = fruCheck;
						break;
					}
				}
			}
			
			Parameter pIdFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, idFruzione+ "");
			
			
			boolean showConnettoreLink = true;
			if(gestioneConfigurazioni && this.isModalitaStandard()) {
				showConnettoreLink = false;
				
				Iterator<MappingFruizionePortaDelegata> it = lista.iterator();
				MappingFruizionePortaDelegata mapping = null;
				while (it.hasNext()) {
					mapping = it.next();
					
					if(!mapping.isDefault()) {
						PortaDelegata pdAssociata = this.porteDelegateCore.getPortaDelegata(mapping.getIdPortaDelegata());

						List<String> listaAzioniPDAssociataMappingNonDefault = pdAssociata.getAzione().getAzioneDelegataList();
						
						String azioneConnettore =  null;
						if(listaAzioniPDAssociataMappingNonDefault!=null && !listaAzioniPDAssociataMappingNonDefault.isEmpty()) {
							azioneConnettore = listaAzioniPDAssociataMappingNonDefault.get(0);
						}
						
						boolean ridefinito = false;
						if(azioneConnettore!=null && !"".equals(azioneConnettore)) {
							for (ConfigurazioneServizioAzione check : fru.getConfigurazioneAzioneList()) {
								if(check.getAzioneList().contains(azioneConnettore)) {
									ridefinito = true;
									break;
								}
							}
						}
						if(ridefinito) {
							showConnettoreLink = true;
							break;
						}
					}
				}

			}
			else {
				// se e' standard lo faccio vedere solo se ho più di un gruppo.
				showConnettoreLink = lista!=null && lista.size()>1;
			}
			
			
			// setto la barra del titolo
			List<Parameter> lstParam = new ArrayList<>();
			Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, asps.getNome());
			Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, asps.getTipo());
			
			Boolean vistaErogazioni = ServletUtils.getBooleanAttributeFromSession(ErogazioniCostanti.ASPS_EROGAZIONI_ATTRIBUTO_VISTA_EROGAZIONI, this.session, this.request).getValue();
			String labelAzioni = this.getLabelAzioni(serviceBindingMessage);
			if(gestioneFruitori) {
				if(vistaErogazioni != null && vistaErogazioni.booleanValue()) {
					
					lstParam.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_FRUIZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
					lstParam.add(new Parameter(servizioTmpTile, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_CHANGE, pIdServizio,pNomeServizio, pTipoServizio, 
							parametroTipoSoggettoFruitore, parametroNomeSoggettoFruitore));
					String labelConfigurazione = gestioneConfigurazioni ? ErogazioniCostanti.LABEL_ASPS_GESTIONE_CONFIGURAZIONI : 
						(gestioneGruppi ? MessageFormat.format(ErogazioniCostanti.LABEL_ASPS_GESTIONE_GRUPPI_CON_PARAMETRO, labelAzioni) : AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_APPLICATIVE);
					
					lstParam.add(new Parameter(labelConfigurazione, null));
					
				}else {
					lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
					lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_CONFIGURAZIONI_DI + servizioTmpTile, null));
				}
			}
			else {
				lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
				lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_FUITORI_DI  + servizioTmpTile, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_LIST , pIdServizio,pIdSoggettoErogatore));
				lstParam.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_CONFIGURAZIONI_DI + fruitoreTmpTile, null));
			}
			
			
			
			this.pd.setSearchLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_NOME);
			this.pd.setSearchDescription("");
						
			// Controllo se richiedere il connettore
			boolean connettoreStatic = false;
			if(gestioneFruitori) {
				connettoreStatic = this.apsCore.isConnettoreStatic(protocollo);
			}
			
			// setto la barra del titolo
			ServletUtils.setPageDataTitle(this.pd, lstParam );

			List<String> listaLabel = new ArrayList<>();
			if(visualizzazioneTabs && (gestioneGruppi || listaParam.size()>1)) {
		        listaLabel.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_NOME_GRUPPO);
			}
			if(gestioneConfigurazioni) {
				/**listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_ABILITATO);*/
				listaLabel.add("");
			}
			if(!visualizzazioneTabs && (gestioneGruppi || listaParam.size()>1)) {
				listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_NOME_GRUPPO);
			}
			if(gestioneGruppi || visualizzazioneTabs) {
				/**listaLabel.add(this.getLabelAzioni(serviceBindingMessage));*/
				if(this.isModalitaCompleta()) {
					listaLabel.add(labelAzioni);
				}
				else {
					listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_ELENCO_AZIONI_GRUPPI_PREFIX+labelAzioni);
				}
			}
			if(gestioneConfigurazioni) {
				if(showConnettoreLink && !connettoreStatic) {
					listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONNETTORE);
					listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_VERIFICA_CONNETTORE);
				}
				listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONTROLLO_ACCESSI);
				listaLabel.add(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RATE_LIMITING);
				listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_VALIDAZIONE_CONTENUTI);
				listaLabel.add(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RESPONSE_CACHING);
				if(visualizzaSicurezza) {
					listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MESSAGE_SECURITY);
				}
				if(visualizzaMTOM) {
					listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MTOM);
				}
				listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_TRASFORMAZIONI);
				if(visualizzaCorrelazione) {
					listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_TRACCIAMENTO);
				}
				
				listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_DUMP_CONFIGURAZIONE);
				
				if((this.isModalitaAvanzata() || this.porteDelegateCore.isProprietaFruizioniShowModalitaStandard())) {
					listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_PROTOCOL_PROPERTIES);
				}
				if(this.isModalitaAvanzata()) {
					listaLabel.add(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_OPZIONI_AVANZATE);
				}
				
				if(extendedServletList!=null && extendedServletList.showExtendedInfo(this,protocollo)){
					listaLabel.add(extendedServletList.getListTitle(this));
				}
			}
			
			String[] labels = listaLabel.toArray(new String[listaLabel.size()]);
			this.pd.setLabels(labels);

			PropertiesSourceConfiguration propertiesSourceConfiguration = null;
			ConfigManager configManager = null;
			Configurazione configurazioneGenerale = null;
			if(visualizzazioneTabs) {
				propertiesSourceConfiguration = this.apsCore.getMessageSecurityPropertiesSourceConfiguration();
				configManager = ConfigManager.getinstance(ControlStationCore.getLog());
				configManager.leggiConfigurazioni(propertiesSourceConfiguration, true);
				configurazioneGenerale = this.confCore.getConfigurazioneGenerale();
			}
			
			impostaComandiMenuContestualePD(idSoggFruitoreDelServizio, parametroTipoSoggettoFruitore,
					parametroNomeSoggettoFruitore, asps, protocollo, pIdSoggettoErogatore, fru,
					pIdFruitore, pNomeServizio, pTipoServizio);
			
			// preparo i dati
			List<List<DataElement>> dati = new ArrayList<>();

			if(lista!=null) {
				Iterator<MappingFruizionePortaDelegata> it = lista.iterator();
				MappingFruizionePortaDelegata mapping = null;
				int idTab = 0;
				while (it.hasNext()) {
					mapping = it.next();
					PortaDelegata pdAssociata = this.porteDelegateCore.getPortaDelegata(mapping.getIdPortaDelegata());
					List<DataElement> e = new ArrayList<>();
	
					Parameter pIdPD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, "" + pdAssociata.getId());
					Parameter pNomePD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME_PORTA, pdAssociata.getNome());
					Parameter pIdSoggPD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, pdAssociata.getIdSoggetto() + "");
					Parameter pIdTAb = new Parameter(CostantiControlStation.PARAMETRO_ID_TAB, ""+idTab);
					
					@SuppressWarnings("unused")
					Parameter pConfigurazioneDati = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_CONFIGURAZIONE_DATI_INVOCAZIONE, Costanti.CHECK_BOX_ENABLED_TRUE);
					Parameter pConfigurazioneAltroPorta = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_CONFIGURAZIONE_ALTRO_PORTA, Costanti.CHECK_BOX_ENABLED_TRUE);
					
					Parameter pConfigurazioneDescrizione = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_CONFIGURAZIONE_DESCRIZIONE, Costanti.CHECK_BOX_ENABLED_TRUE);
					
					List<String> listaAzioniPDAssociataMappingNonDefault = null;
					if(!mapping.isDefault()) {
						listaAzioniPDAssociataMappingNonDefault = pdAssociata.getAzione().getAzioneDelegataList();
					}
					
					// spostata direttamente nell'elenco delle fruizioni
	/**				// nome con link al PortaDeletagataChange
	//				DataElement de = new DataElement();
	//				if(mapping.isDefault()) {
	//					de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneDati);
	//				}
	//				de.setValue(mapping.isDefault() ? PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MAPPING_FRUIZIONE_PD_NOME_DEFAULT : mapping.getNome());
	//				de.setIdToRemove(pdAssociata.getNome());
	//				//de.setToolTip(StringUtils.isNotEmpty(pdAssociata.getDescrizione()) ? pdAssociata.getDescrizione() : pdAssociata.getNome());
	//				e.add(de);*/
					
					if(gestioneConfigurazioni && mapping.isDefault() && allActionRedefined && (!showConnettoreLink)) {
						int numEntries = ricerca.getNumEntries(idLista);
						ricerca.setNumEntries(idLista, numEntries -1); 
						this.pd.setNumEntries(numEntries -1);
						continue; // non faccio vedere la riga "disconnessa"
					}
					
					boolean statoPD = pdAssociata.getStato().equals(StatoFunzionalita.ABILITATO);
					String statoPDallRedefined = null;
					String statoMapping = statoPD ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP;
					boolean urlCambiaStato = true;
					if(mapping.isDefault() && allActionRedefined) {
						statoPD = false;
						statoPDallRedefined = "off";
						statoMapping = this.getLabelAllAzioniRidefiniteTooltip(serviceBindingMessage);
						urlCambiaStato = false;
					}
					
					boolean descrizioneEmpty = pdAssociata.getDescrizione()==null || StringUtils.isEmpty(pdAssociata.getDescrizione()) || 
							SubscriptionConfiguration.isDescriptionDefault(pdAssociata.getDescrizione());
					
					// Nome Gruppo
					if(visualizzazioneTabs && (gestioneGruppi || listaParam.size()>1)) {
						DataElement de = new DataElement();
						
						de.setWidthPx(10);
						de.setType(DataElementType.CHECKBOX);
						
						de.setStatusToolTip(statoPD ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP_NO_ACTION : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP_NO_ACTION);
						if(statoPDallRedefined!=null) {
							de.setStatusType(statoPDallRedefined);
						}
						else {
							de.setStatusType(statoPD ? CheckboxStatusType.ABILITATO : CheckboxStatusType.DISABILITATO);
						}
						
						de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_NOME_GRUPPO);
						de.setValue(mapping.getDescrizione());
						de.setStatusValue(mapping.getDescrizione());
						
						if(!mapping.isDefault()) {
		                       DataElementImage image = new DataElementImage();
		                       
		                       image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONFIGURAZIONE_CHANGE,pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
		                       image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_NOME_GRUPPO));
		                       image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
		                       
		                       de.addImage(image );
						}
						if(!mapping.isDefault()) 
		                       de.setIdToRemove(pdAssociata.getNome());
		               
						if(descrizioneEmpty) {
							
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneDescrizione,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.AGGIUNGI_DESCRIZIONE_TOOLTIP_CON_PARAMETRO, PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_DESCRIZIONE));
							image.setImage(CostantiControlStation.ICONA_AGGIUNGI_DESCRIZIONE);
							
							de.addImage(image);
						}
						
						if(urlCambiaStato) {
							Parameter pAbilita = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ABILITA,  (statoPD ? Costanti.CHECK_BOX_DISABLED : Costanti.CHECK_BOX_ENABLED_TRUE));
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_ABILITAZIONE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pAbilita);
							
							DataElementImage image = new DataElementImage();
		                    image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_ABILITAZIONE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pAbilita,pIdTAb);
		                    image.setToolTip(statoMapping);
		                    image.setImage(statoPD ? CostantiControlStation.ICONA_MODIFICA_TOGGLE_ON : CostantiControlStation.ICONA_MODIFICA_TOGGLE_OFF);
		                      
		                    de.addImage(image);
						}
						
						e.add(de);
					}
					
					if(gestioneConfigurazioni && !visualizzazioneTabs) {
						
						// Abilitato
						DataElement de = new DataElement();
						/**if(visualizzazioneTabs)
					    //   de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_STATO);*/
						
						de.setWidthPx(10);
						de.setType(DataElementType.CHECKBOX);
						/**if(visualizzazioneTabs) {
						//	de.setStatusValue(statoPD ? this.getUpperFirstChar(CostantiControlStation.DEFAULT_VALUE_ABILITATO) : this.getUpperFirstChar(CostantiControlStation.DEFAULT_VALUE_DISABILITATO));
						//	de.setStatusToolTip(statoPD ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP_NO_ACTION : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP_NO_ACTION);
						//	if(statoPDallRedefined!=null) {
						//		de.setStatusType(statoPDallRedefined);
						//	}
						//	else {
						//		de.setStatusType(statoPD ? CheckboxStatusType.ABILITATO : CheckboxStatusType.DISABILITATO);
						//	}
						//}
						//else {*/
						de.setToolTip(statoMapping);

						if(statoPDallRedefined!=null) {
							de.setSelected(statoPDallRedefined);
						}
						else {
							de.setSelected(statoPD);
						}
						if(urlCambiaStato) {
							Parameter pAbilita = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ABILITA,  (statoPD ? Costanti.CHECK_BOX_DISABLED : Costanti.CHECK_BOX_ENABLED_TRUE));
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_ABILITAZIONE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pAbilita);
							
							DataElementImage image = new DataElementImage();
		                    image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_ABILITAZIONE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pAbilita,pIdTAb);
		                    image.setToolTip(statoMapping);
		                    image.setImage(statoPD ? CostantiControlStation.ICONA_MODIFICA_TOGGLE_ON : CostantiControlStation.ICONA_MODIFICA_TOGGLE_OFF);
		                      
		                    de.setImage(image);
						}
						e.add(de);
	
					}
					
					
					// NomeGruppo
					if(!visualizzazioneTabs && (gestioneGruppi || listaParam.size()>1)) {
						
						DataElement de = new DataElement();
						de.setValue(mapping.getDescrizione());
						if(gestioneGruppi && !mapping.isDefault()) {
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONFIGURAZIONE_CHANGE,pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
						}
						e.add(de);
					}
						
					// lista delle azioni
					if(gestioneGruppi || (visualizzazioneTabs && (listaParam.size()>1 || !mapping.isDefault()))) {
						
						List<String> listaAzioni = null;
						String nomiAzioni = null;
						long countAzioni = 0;
						if(!mapping.isDefault()) {
							listaAzioni = listaAzioniPDAssociataMappingNonDefault!= null ? listaAzioniPDAssociataMappingNonDefault : new ArrayList<>();
							
							if(!listaAzioni.isEmpty() && azioni.size()>0) {
								
								StringBuilder sb = new StringBuilder();
								Iterator<String> itAz = azioni.keySet().iterator();
								while (itAz.hasNext()) {
									String idAzione = itAz.next();
									if(listaAzioni.contains(idAzione)) {
										if(sb.length() >0)
											sb.append(", ");
										
										sb.append(azioni.get(idAzione));
										countAzioni++;
									}
								}
								nomiAzioni = sb.toString();
								
							}
						}
						
						DataElement de = new DataElement();
						de.setSize(200);
						de.setIdToRemove(pdAssociata.getNome());
						
						if(visualizzazioneTabs) {
					        de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_ELENCO_AZIONI_GRUPPI_PREFIX+labelAzioni);
						}
	
						if(listaSenzaFiltro.size()>1) {
							DataElementImage image = new DataElementImage();
							
							if(!mapping.isDefault()) {
								de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_AZIONE_LIST,pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
								if(this.isModalitaCompleta()) {
									ServletUtils.setDataElementVisualizzaLabel(de, countAzioni);
								}
								else {
									de.setValue(nomiAzioni);
								}
								de.setToolTip(nomiAzioni);
								image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_AZIONE_LIST,pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_ELENCO_AZIONI_GRUPPI_PREFIX+labelAzioni));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								
								de.setImage(image);
							}
							else {
								if(actionNonRidefinite!=null && !actionNonRidefinite.isEmpty() && azioni.size()>0) {
									
									long countAzioniRidefinite = 0;
									StringBuilder sb = new StringBuilder();
									Iterator<String> itAz = azioni.keySet().iterator();
									while (itAz.hasNext()) {
										String idAzione = itAz.next();
										if(actionNonRidefinite.contains(idAzione)) {
											if(sb.length() >0)
												sb.append(", ");
											
											sb.append(azioni.get(idAzione));
											countAzioniRidefinite++;
										}
									}
									String nomiAzioniNonRidefinite = sb.toString();
									de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_AZIONE_LIST,pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
									if(this.isModalitaCompleta()) {
										ServletUtils.setDataElementVisualizzaLabel(de, countAzioniRidefinite);
									}
									else {
										de.setValue(nomiAzioniNonRidefinite);
									}
									de.setToolTip(nomiAzioniNonRidefinite);
									
									image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_AZIONE_LIST,pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
									image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_ELENCO_AZIONI_GRUPPI_PREFIX+labelAzioni));
									image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
									
									de.setImage(image);
								}
								else {
									if(allActionRedefined) {
										de.setValue(this.getLabelAllAzioniRidefiniteTooltip(serviceBindingMessage));
									}
									else {
										de.setValue("-"); // ??
									}
								}
							}
						}
						else {
							if(org.openspcoop2.core.registry.constants.ServiceBinding.SOAP.equals(serviceBinding)) {
								de.setValue(CostantiControlStation.LABEL_TUTTE_AZIONI_DEFAULT);	
							}
							else {
								de.setValue(CostantiControlStation.LABEL_TUTTE_RISORSE_DEFAULT);	
							}
						}
						e.add(de);
						
					}
	
					// Descrizione
					if(!descrizioneEmpty) {
						DataElement de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_DESCRIZIONE);
						de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneDescrizione,pIdTAb);
						
						int length = 150;
						String descrizione = pdAssociata.getDescrizione();
						if(descrizione!=null && descrizione.length()>length) {
							descrizione = descrizione.substring(0, (length-4)) + " ...";
						}
						de.setValue(descrizione!=null ? StringEscapeUtils.escapeHtml(descrizione) : null);
						de.setToolTip(pdAssociata.getDescrizione());
						
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							
							image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneDescrizione,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,	PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_DESCRIZIONE));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							
							de.setImage(image);
						}
						e.add(de);
					}
					
					if(gestioneConfigurazioni) {
					
						// connettore	
						if(showConnettoreLink && !connettoreStatic) {
							DataElement de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONNETTORE);
							
							boolean ridefinito = false;
							
							Connettore connettore = null;
							if(!gestioneFruitori && mapping.isDefault()) {
								de.setValue("-");
							}
							else {
								Long idSoggettoLong = fru.getIdSoggetto();
								if(idSoggettoLong==null) {
									idSoggettoLong = this.soggettiCore.getIdSoggetto(fru.getNome(), fru.getTipo());
								}
								List<Parameter> listParameter = new ArrayList<>();
								
								String azioneConnettore =  null;
								if(listaAzioniPDAssociataMappingNonDefault!=null && !listaAzioniPDAssociataMappingNonDefault.isEmpty()) {
									azioneConnettore = listaAzioniPDAssociataMappingNonDefault.get(0);
								}
								
								String servletConnettore = AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_CHANGE;
								if(mapping.isDefault()) {
									if(visualizzazioneTabs) {
										de.setValue(this.getLabelConnettore(fru.getConnettore(),true,false));
										de.setToolTip(this.getLabelConnettore(fru.getConnettore(),true,true)); // NEW
									}
									else {
										ServletUtils.setDataElementVisualizzaLabel(de);
									}
									Parameter pId = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId()+"");
									Parameter pMyId = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, fru.getId() + "");				
									Parameter actionIdPorta = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_FRUITORE_VIEW_CONNETTORE_MAPPING_AZIONE_ID_PORTA,pdAssociata.getId()+"");
									listParameter.add(actionIdPorta);
									listParameter.add(pId);
									listParameter.add(pMyId);
									listParameter.add(pIdSoggettoErogatore);
									listParameter.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE, idSoggettoLong + ""));
									listParameter.add(pIdTAb);
									if(azioneConnettore!=null && !"".equals(azioneConnettore)) {
										listParameter.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_FRUITORE_VIEW_CONNETTORE_MAPPING_AZIONE,azioneConnettore));
									}
									de.setUrl(servletConnettore, listParameter.toArray(new Parameter[1]));
									
									if(visualizzazioneTabs) {
										DataElementImage image = new DataElementImage();
										image.setUrl(servletConnettore, listParameter.toArray(new Parameter[1]));
										image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONNETTORE));
										image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
										de.setImage(image);
									}
									
									connettore = fru.getConnettore();
								} else {
									if(azioneConnettore!=null && !"".equals(azioneConnettore)) {
										for (ConfigurazioneServizioAzione check : fru.getConfigurazioneAzioneList()) {
											if(check.getAzioneList().contains(azioneConnettore)) {
												ridefinito = true;
												connettore = check.getConnettore();
												break;
											}
										}
									}
									if(ridefinito) {
										servletConnettore = PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONNETTORE_RIDEFINITO;
										if(visualizzazioneTabs) {
											de.setValue(this.getLabelConnettore(connettore,true,false));
										}
										else {
											de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MODALITA_CONNETTORE_RIDEFINITO);
										}
										de.setUrl(servletConnettore, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
										String tooltipConnettore = this.getLabelConnettore(connettore,true,true);
										de.setToolTip(ConnettoriCostanti.LABEL_PARAMETRO_MODALITA_CONNETTORE_RIDEFINITO+CostantiControlStation.TOOLTIP_BREAK_LINE+tooltipConnettore);
									} else {
										servletConnettore = PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONNETTORE_DEFAULT;
										if(visualizzazioneTabs) {
											de.setValue("["+org.openspcoop2.core.constants.Costanti.MAPPING_FRUIZIONE_PD_DESCRIZIONE_DEFAULT+"] "+this.getLabelConnettore(fru.getConnettore(),true,false));
										}
										else {
											de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MODALITA_CONNETTORE_DEFAULT);
										}
										de.setUrl(servletConnettore, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
										String tooltipConnettore = this.getLabelConnettore(fru.getConnettore(),true,true);
										de.setToolTip(ConnettoriCostanti.LABEL_PARAMETRO_MODALITA_CONNETTORE_DEFAULT+CostantiControlStation.TOOLTIP_BREAK_LINE+tooltipConnettore);
										
										connettore = fru.getConnettore();
									}
									
									if(visualizzazioneTabs) {
										DataElementImage image = new DataElementImage();
										image.setUrl(servletConnettore, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
										image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONNETTORE));
										image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
										de.setImage(image);
									}
								}
								
							}
							de.allineaTdAlCentro();
							e.add(de);
							
							if(connettore!=null) {
								
								long idConnettore = connettore.getId();
								boolean checkConnettore = org.openspcoop2.pdd.core.connettori.ConnettoreCheck.checkSupported(connettore);
								if(checkConnettore &&
									(!mapping.isDefault() && !ridefinito) 
									){
									checkConnettore = false;
								}
								
								if(visualizzazioneTabs) {
									if(checkConnettore) {	
										DataElementImage image = new DataElementImage();
										image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_VERIFICA_CONNETTORE, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb,
												new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ID, idConnettore+""),
												new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ACCESSO_DA_GRUPPI, "true"),
												new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_REGISTRO, "true"));
										image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_VERIFICA_TOOLTIP_CON_PARAMETRO, PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONNETTORE));
										image.setImage(CostantiControlStation.ICONA_VERIFICA);
										de.addImage(image);
									}
								} else {
									DataElement deVerificaConnettore = new DataElement();
									if(checkConnettore) {								
										deVerificaConnettore.setValue(CostantiControlStation.LABEL_VERIFICA_CONNETTORE_VALORE_LINK);
										deVerificaConnettore.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_VERIFICA_CONNETTORE, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,
												new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ID, idConnettore+""),
												new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ACCESSO_DA_GRUPPI, "true"),
												new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_REGISTRO, "true"));
									}
									else {
										deVerificaConnettore.setValue("-");
									}
									deVerificaConnettore.allineaTdAlCentro();
									e.add(deVerificaConnettore);
								}
							}
						}

	
						// Controllo Accessi
						DataElement de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONTROLLO_ACCESSI);
						de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONTROLLO_ACCESSI, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
						if(visualizzazioneTabs) {
							this.setStatoControlloAccessiPortaDelegata(protocollo, pdAssociata, de); 
						}
						else {
							String statoControlloAccessi = this.getStatoControlloAccessiPortaDelegata(protocollo, pdAssociata); 				
							de.setValue(statoControlloAccessi);
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CONTROLLO_ACCESSI, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONTROLLO_ACCESSI));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							de.setImage(image);
						}
						e.add(de);
															
						// RateLimiting
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RATE_LIMITING);
						de.setUrl(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_CONTROLLO_TRAFFICO_ATTIVAZIONE_POLICY_LIST+"?"+
								ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_RUOLO_PORTA+"="+RuoloPolicy.DELEGATA.getValue()+"&"+
								ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_NOME_PORTA+"="+pdAssociata.getNome()+"&"+
								ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_SERVICE_BINDING+"="+serviceBindingMessage.name()
								);
						List<AttivazionePolicy> listaPolicy = null;
						if(contaListe || visualizzazioneTabs) {
							ConsoleSearch searchPolicy = new ConsoleSearch(true);
							listaPolicy = this.confCore.attivazionePolicyList(searchPolicy, RuoloPolicy.DELEGATA, pdAssociata.getNome());
						}
						if(visualizzazioneTabs) {
							this.setStatoRateLimiting(de, listaPolicy);
						}
						else {
							if(contaListe) {
								ServletUtils.setDataElementVisualizzaLabel(de, (long) listaPolicy.size() );
							}
							else {
								ServletUtils.setDataElementVisualizzaLabel(de);
							}
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							image.setUrl(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_CONTROLLO_TRAFFICO_ATTIVAZIONE_POLICY_LIST, 
									new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_RUOLO_PORTA,RuoloPolicy.DELEGATA.getValue()),
									new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_NOME_PORTA,pdAssociata.getNome()),
									new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_CONTROLLO_TRAFFICO_RATE_LIMITING_POLICY_GLOBALI_LINK_SERVICE_BINDING,serviceBindingMessage.name()),
									pIdTAb
									);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RATE_LIMITING));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							de.setImage(image);
						}
						e.add(de);
						
						// validazione contenuti
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_VALIDAZIONE_CONTENUTI);
						de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_VALIDAZIONE_CONTENUTI, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
						if(visualizzazioneTabs) {
							setStatoValidazioneContenuti(de, pdAssociata.getValidazioneContenutiApplicativi(), apc.getFormatoSpecifica());
						}
						else {
							String statoValidazione = this.getStatoValidazionePortaDelegata(pdAssociata);
							de.setValue(statoValidazione);
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_VALIDAZIONE_CONTENUTI, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_VALIDAZIONE_CONTENUTI));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							de.setImage(image);
						}
						e.add(de);
						
						// Response Caching
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RESPONSE_CACHING);
						//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
						de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_RESPONSE_CACHING, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
						if(visualizzazioneTabs) {
							setStatoCachingRisposta(de, pdAssociata.getResponseCaching(), configurazioneGenerale);
						}
						else {
							String statoResponseCaching = getStatoResponseCachingPortaDelegata(pdAssociata, false);
							de.setValue(statoResponseCaching);
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_RESPONSE_CACHING, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_RESPONSE_CACHING));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							de.setImage(image);
						}
						e.add(de);
						
						// Message Security
						if(visualizzaSicurezza) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MESSAGE_SECURITY);
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_MESSAGE_SECURITY, pIdPD, pIdSoggPD, pIdAsps, pIdFruitore);
							if(visualizzazioneTabs) {
								setStatoSicurezzaMessaggio(de, pdAssociata.getMessageSecurity(), configManager, propertiesSourceConfiguration);
							}
							else {
								String statoMessageSecurity = getStatoMessageSecurityPortaDelegata(pdAssociata);
								de.setValue(statoMessageSecurity);
							}
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_MESSAGE_SECURITY, pIdPD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MESSAGE_SECURITY));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								de.setImage(image);
							}
							e.add(de);
						}
		
						// MTOM (solo per servizi SOAP)
						if(visualizzaMTOM) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MTOM);
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_MTOM, pIdPD, pIdSoggPD, pIdAsps, pIdFruitore);
							if(visualizzazioneTabs) {
								setStatoMTOM(de, pdAssociata.getMtomProcessor());
							}
							else {
								String statoMTOM = getStatoMTOMPortaDelegata(pdAssociata);
								de.setValue(statoMTOM);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_MTOM, pIdPD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MTOM));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								de.setImage(image);
							}
							e.add(de);
						}
						
						// trasformazioni
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_TRASFORMAZIONI);
						de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_TRASFORMAZIONI_LIST, pIdPD, pIdSoggPD, pIdAsps, pIdFruitore);
						if(visualizzazioneTabs) {
							setStatoTrasformazioni(de, pdAssociata.getTrasformazioni(), serviceBindingMessage);
						}
						else {
							if(contaListe) {
								long size = 0;
								if(pdAssociata.getTrasformazioni()!=null) {
									size = pdAssociata.getTrasformazioni().sizeRegolaList();
								}
								ServletUtils.setDataElementVisualizzaLabel(de, size); 
							}
							else {
								ServletUtils.setDataElementVisualizzaLabel(de);
							}	
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_TRASFORMAZIONI_LIST, pIdPD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_TRASFORMAZIONI));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							de.setImage(image);
						}
						e.add(de);
		
						// Correlazione applicativa
						if(visualizzaCorrelazione) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_TRACCIAMENTO);
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA, pIdPD, pIdSoggPD, pIdAsps, pIdFruitore);
							if(visualizzazioneTabs) {
								setStatoTracciamento(de, pdAssociata.getCorrelazioneApplicativa(), 
										pdAssociata.getCorrelazioneApplicativaRisposta(), pdAssociata.getTracciamento(),
										(configurazioneGenerale!=null && configurazioneGenerale.getTracciamento()!=null) ? configurazioneGenerale.getTracciamento().getPortaDelegata() : null,
										pdAssociata.getProprieta(), 
										configurazioneGenerale);	
							}
							else {
								String statoTracciamento = getStatoTracciamentoPortaDelegata(pdAssociata);
								de.setValue(statoTracciamento);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA, pIdPD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_TRACCIAMENTO));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								de.setImage(image);
							}
							e.add(de);
						}
						
						// dump
						de = new DataElement();
						if(visualizzazioneTabs)
							de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_DUMP_CONFIGURAZIONE);
						de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_DUMP_CONFIGURAZIONE, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
						if(visualizzazioneTabs) {
							setStatoDump(de, pdAssociata.getDump(), configurazioneGenerale, false);
						}
						else {
							String statoDump = getStatoDumpPortaDelegata(pdAssociata, false);
							de.setValue(statoDump);
						}
						de.allineaTdAlCentro();
						if(visualizzazioneTabs) {
							DataElementImage image = new DataElementImage();
							image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_DUMP_CONFIGURAZIONE, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore,pIdTAb);
							image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_DUMP_CONFIGURAZIONE));
							image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
							de.setImage(image);
						}
						e.add(de);
						
						// Allarmi
						if(visualizzaAllarmi) {
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_ALLARMI);
							de.setUrl(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_ALLARMI_LIST+"?"+
					                ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_RUOLO_PORTA+"="+RuoloPorta.DELEGATA.getValue()+"&"+
					                ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_NOME_PORTA+"="+pdAssociata.getNome()+"&"+
					                ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_SERVICE_BINDING+"="+serviceBindingMessage.name()
					                );
	
							List<ConfigurazioneAllarmeBean> listaAllarmi = null;
							if(contaListe || visualizzazioneTabs) {
								ConsoleSearch searchPolicy = new ConsoleSearch(true);
								listaAllarmi = this.confCore.allarmiList(searchPolicy, RuoloPorta.DELEGATA, pdAssociata.getNome());
							}
							if(visualizzazioneTabs) {
								this.setStatoAllarmi(de, listaAllarmi);
							}
							else {
								if(contaListe) {
									ServletUtils.setDataElementVisualizzaLabel(de, (long) listaAllarmi.size() );
								}
								else {
									ServletUtils.setDataElementVisualizzaLabel(de);
								}
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								image.setUrl(ConfigurazioneCostanti.SERVLET_NAME_CONFIGURAZIONE_ALLARMI_LIST, 
						                new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_RUOLO_PORTA,RuoloPorta.DELEGATA.getValue()),
						                new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_NOME_PORTA,pdAssociata.getNome()),
						                new Parameter(ConfigurazioneCostanti.PARAMETRO_CONFIGURAZIONE_ALLARMI_SERVICE_BINDING,serviceBindingMessage.name()),
						                pIdTAb
						                );
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_ALLARMI));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								de.setImage(image);
							}
							e.add(de);
						}
						
						// Protocol Properties
						if((this.isModalitaAvanzata() || this.porteDelegateCore.isProprietaFruizioniShowModalitaStandard())){
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_PROTOCOL_PROPERTIES);
							//fix: idsogg e' il soggetto proprietario della porta applicativa, e nn il soggetto virtuale
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_PROPRIETA_PROTOCOLLO_LIST, pIdSoggPD, pIdPD,pIdAsps,pIdFruitore);
							if(visualizzazioneTabs) {
								setStatoProprieta(de, pdAssociata.sizeProprietaList());
							}
							else {
								if (contaListe) {
									int numProp = pdAssociata.sizeProprietaList();
									ServletUtils.setDataElementVisualizzaLabel(de, (long) numProp );
								} else
									ServletUtils.setDataElementVisualizzaLabel(de);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_PROPRIETA_PROTOCOLLO_LIST, pIdSoggPD, pIdPD,pIdAsps,pIdFruitore,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_PROTOCOL_PROPERTIES));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								de.setImage(image);
							}
							e.add(de);
						}
					
						// Altro
						if(this.isModalitaAvanzata()){
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_OPZIONI_AVANZATE);
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneAltroPorta);
							if(visualizzazioneTabs) {
								setStatoOpzioniAvanzate(de, 
										protocollo, serviceBindingMessage,
										pdAssociata.getAllegaBody(), pdAssociata.getScartaBody(), 
										pdAssociata.getIntegrazione(), null, 
										pdAssociata.getProprietaRateLimitingList(),
										pdAssociata.getStateless(), pdAssociata.getLocalForward(), 
										pdAssociata.getRicevutaAsincronaSimmetrica(), pdAssociata.getRicevutaAsincronaAsimmetrica(),
										pdAssociata.getGestioneManifest(), pdAssociata.getConfigurazioneHandler());
							}
							else {
								ServletUtils.setDataElementVisualizzaLabel(de);
							}
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneAltroPorta,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_OPZIONI_AVANZATE));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								de.setImage(image);
							}
							e.add(de);
						}
						
						// pd exdended list
						if(extendedServletList!=null && extendedServletList.showExtendedInfo(this,protocollo)){
							de = new DataElement();
							if(visualizzazioneTabs)
								de.setLabel(extendedServletList.getListTitle(this));
							de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_EXTENDED_LIST, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneAltroPorta);
							if(visualizzazioneTabs) {
								int numExtended = extendedServletList.sizeList(pdAssociata);
								String stato = extendedServletList.getStatoTab(this,pdAssociata,mapping.isDefault());
								String statoTooltip = extendedServletList.getStatoTab(this,pdAssociata,mapping.isDefault());
								setStatoExtendedList(de, numExtended, stato, statoTooltip);
							}
							else {
								if (contaListe) {
									int numExtended = extendedServletList.sizeList(pdAssociata);
									ServletUtils.setDataElementVisualizzaLabel(de,Long.valueOf(numExtended));
								} else
									ServletUtils.setDataElementVisualizzaLabel(de);
							}
							de.allineaTdAlCentro();
							if(visualizzazioneTabs) {
								DataElementImage image = new DataElementImage();
								image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_EXTENDED_LIST, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore, pConfigurazioneAltroPorta,pIdTAb);
								image.setToolTip(MessageFormat.format(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,extendedServletList.getListTitle(this)));
								image.setImage(CostantiControlStation.ICONA_MODIFICA_CONFIGURAZIONE);
								de.setImage(image);
							}
							e.add(de);
						}
						
						if(visualizzazioneTabs) {
							// Proprieta Oggetto
							this.addProprietaOggetto(e, pdAssociata.getProprietaOggetto());
						}
					}
					
					dati.add(e);
					idTab ++;
				}
			}

			this.pd.setDati(dati);
			if(visualizzazioneTabs) {
		        this.pd.setSelect(true);
		        if(showBottoneAggiungiNuovaConfigurazione) {
		        	this.pd.setAddButton(true);
		        }
		        else {
		        	this.pd.setAddButton(false);
		        }
		        if(lista.size() > 1)
		                this.pd.setRemoveButton(true);
		        else 
		                this.pd.setRemoveButton(false);
			} else {
				if(gestioneGruppi) {
					if(listaSenzaFiltro!=null && listaSenzaFiltro.size()>1) {
						this.pd.setRemoveButton(true);
						this.pd.setSelect(true);
					}
					else {
						this.pd.setRemoveButton(false);
						this.pd.setSelect(false);
					}
					this.pd.setAddButton(true);
				}
				else {
					this.pd.setAddButton(false);
					this.pd.setRemoveButton(false);
					this.pd.setSelect(false);
				}
			}

		} catch (Exception e) {
			this.logError("Exception: " + e.getMessage(), e);
			throw new Exception(e);
		}
	}

	private boolean addInfoCorrelata(TipoOperazione tipoOp, String portType, boolean modificaAbilitata, String servcorr, String oldStato,
			String tipoProtocollo, ServiceBinding serviceBinding, List<DataElement> dati) throws DriverRegistroServiziNotFound, DriverRegistroServiziException {
		boolean isModalitaAvanzata = this.isModalitaAvanzata();
		
		boolean infoCorrelataShow = false;
		
		DataElement de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_SERVIZIO_CORRELATO);
		if( this.core.isShowCorrelazioneAsincronaInAccordi() && 
				( !isModalitaAvanzata || (portType!=null && !"".equals(portType) && !"-".equals(portType)) ) ){
			de.setType(DataElementType.HIDDEN);
		}
		else if( tipoOp.equals(TipoOperazione.ADD) || modificaAbilitata ){
			if(this.core.isProfiloDiCollaborazioneAsincronoSupportatoDalProtocollo(tipoProtocollo,serviceBinding)) {
				de.setType(DataElementType.CHECKBOX);
				infoCorrelataShow = true;
			}
			else {
				de.setType(DataElementType.HIDDEN);
				de.setValue(Costanti.CHECK_BOX_DISABLED);
			}
		}else{
			de.setType(DataElementType.HIDDEN);
		}
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_SERVIZIO_CORRELATO);
		if( this.core.isShowCorrelazioneAsincronaInAccordi() && ( !isModalitaAvanzata || (portType!=null && !"".equals(portType) && !"-".equals(portType)) ) ){
			if (  (servcorr != null) && ((servcorr.equals(Costanti.CHECK_BOX_ENABLED)) || servcorr.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_ABILITATO)) ) {
				de.setValue(Costanti.CHECK_BOX_ENABLED);
			}
			else{
				de.setValue(Costanti.CHECK_BOX_DISABLED);
			}
		}
		else if (  (servcorr != null) && ((servcorr.equals(Costanti.CHECK_BOX_ENABLED)) || servcorr.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_ABILITATO)) ) {
			if(tipoOp.equals(TipoOperazione.ADD) || modificaAbilitata){
				de.setSelected(Costanti.CHECK_BOX_ENABLED);
			}else{
				de.setValue(Costanti.CHECK_BOX_ENABLED);
			}
		}else{
			if(tipoOp.equals(TipoOperazione.CHANGE) && (this.isShowGestioneWorkflowStatoDocumenti() 
					&&  StatiAccordo.finale.toString().equals(oldStato) )){
				de.setValue(Costanti.CHECK_BOX_DISABLED);
			}
		}
		dati.add(de);
		
		if( (tipoOp.equals(TipoOperazione.CHANGE) &&
				(this.isShowGestioneWorkflowStatoDocumenti() &&  StatiAccordo.finale.toString().equals(oldStato) )) 
				||
				(this.core.isShowCorrelazioneAsincronaInAccordi() &&
						( !isModalitaAvanzata || 
								(portType!=null && !"".equals(portType) && !"-".equals(portType)) )) ){
			DataElement deLabel = new DataElement();
			deLabel.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPOLOGIA_SERVIZIO);
			deLabel.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_SERVIZIO_CORRELATO_LABEL);
			if (  (servcorr != null) && ((servcorr.equals(Costanti.CHECK_BOX_ENABLED)) || servcorr.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_ABILITATO)) ) {
				deLabel.setValue(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_CORRELATO);
			}else{
				deLabel.setValue(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_NORMALE);
			}
			if(this.core.isProfiloDiCollaborazioneAsincronoSupportatoDalProtocollo(tipoProtocollo,serviceBinding)){	
				deLabel.setType(DataElementType.TEXT);
				infoCorrelataShow = true;
			} else {
				deLabel.setType(DataElementType.HIDDEN);
			}
			dati.add(deLabel);
		}
		
		return infoCorrelataShow;
	}

	public List<DataElement> addServiziToDati(List<DataElement> dati, String nomeServizio, String tipoServizio, String oldNomeServizio, String oldTipoServizio,
			String provider, String tipoSoggetto, String nomeSoggetto, String[] soggettiList, String[] soggettiListLabel,
			String accordo, ServiceBinding serviceBinding, org.openspcoop2.protocol.manifest.constants.InterfaceType interfaceType, String[] accordiList, String[] accordiListLabel, String servcorr, BinaryParameter wsdlimpler,
			BinaryParameter wsdlimplfru, TipoOperazione tipoOp, String id, List<String> tipi, String profilo, String portType, 
			String[] ptList, boolean privato, String uriAccordo, 
			String descrizione, // porta sempre la descrizione dell'aps per l'hidden 
			String descrizioneModificata, // porta la descrizione in corso di modifica
			long idSoggettoErogatore,
			String statoPackage,String oldStato,String versione,
			List<String> versioni,boolean validazioneDocumenti, 
			String [] saSoggetti, String nomeSA, boolean generaPACheckSoggetto,
			List<AccordoServizioParteComune> asCompatibili,
			String controlloAccessiStato,
			String erogazioneRuolo,String erogazioneAutenticazione,String erogazioneAutenticazioneOpzionale, TipoAutenticazionePrincipal erogazioneAutenticazionePrincipal, List<String> erogazioneAutenticazioneParametroList, String erogazioneAutorizzazione, boolean erogazioneIsSupportatoAutenticazioneSoggetti,
			String erogazioneAutorizzazioneAutenticati, String erogazioneAutorizzazioneRuoli, String erogazioneAutorizzazioneRuoliTipologia, String erogazioneAutorizzazioneRuoliMatch,
			List<String> soggettiAutenticati, List<String> soggettiAutenticatiLabel, String soggettoAutenticato,
			String tipoProtocollo, List<String> listaTipiProtocollo,
			String[] soggettiFruitoriList, String[] soggettiFruitoriListLabel, String providerSoggettoFruitore, String tipoSoggettoFruitore, String nomeSoggettoFruitore,
			String fruizioneServizioApplicativo,String fruizioneRuolo,String fruizioneAutenticazione,String fruizioneAutenticazioneOpzionale, TipoAutenticazionePrincipal fruizioneAutenticazionePrincipal, List<String> fruizioneAutenticazioneParametroList, String fruizioneAutorizzazione,
			String fruizioneAutorizzazioneAutenticati,String fruizioneAutorizzazioneRuoli, String fruizioneAutorizzazioneRuoliTipologia, String fruizioneAutorizzazioneRuoliMatch,
			List<String> saList,String gestioneToken, String[] gestioneTokenPolicyLabels, String[] gestioneTokenPolicyValues,
			String gestioneTokenPolicy, String gestioneTokenOpzionale, 
			String gestioneTokenValidazioneInput, String gestioneTokenIntrospection, String gestioneTokenUserInfo, String gestioneTokenForward,
			String autenticazioneTokenIssuer,String autenticazioneTokenClientId,String autenticazioneTokenSubject,String autenticazioneTokenUsername,String autenticazioneTokenEMail,
			String autorizzazioneToken, String autorizzazioneTokenOptions,
			String autorizzazioneScope,  String scope, String autorizzazioneScopeMatch,BinaryParameter allegatoXacmlPolicy,
			boolean moreThenOneImplementation, String canaleStato, String canaleAPI, String canale, List<CanaleConfigurazione> canaleList, boolean gestioneCanaliEnabled,
			String identificazioneAttributiStato, String[] attributeAuthorityLabels, String[] attributeAuthorityValues, String [] attributeAuthoritySelezionate, String attributeAuthorityAttributi,
			String autorizzazioneAutenticatiToken, 
			String autorizzazioneRuoliToken,  String autorizzazioneRuoliTipologiaToken, String autorizzazioneRuoliMatchToken) throws Exception{

		String tipologia = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
		boolean gestioneFruitori = false;
		boolean gestioneErogatori = false;
		if(tipologia!=null) {
			if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE.equals(tipologia)) {
				gestioneFruitori = true;
			}
			else if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_EROGAZIONE.equals(tipologia)) {
				gestioneErogatori = true;
			}
		}
		
		boolean confirmInProgress = false;
		if(moreThenOneImplementation) {
			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CONFERMA_MODIFICA_DATI_SERVIZIO);
			de.setValue("true");
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
			
			if(this.getPostBackElementName()==null || "".equals(this.getPostBackElementName())) {
				String tmp = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CONFERMA_MODIFICA_DATI_SERVIZIO);
				if(tmp!=null && !"".equals(tmp)) {
					confirmInProgress = true;
				}
			}
		}
		
		if(gestioneFruitori) {
			
			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE);
			de.setValue(tipoSoggettoFruitore);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
			
			de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE);
			de.setValue(nomeSoggettoFruitore);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
		}
		
		String tmpModificaAPI = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API);
		Boolean showModificaAPIErogazioniFruizioniView = null;
		if(tmpModificaAPI!=null) {
			showModificaAPIErogazioniFruizioniView = "true".equals(tmpModificaAPI);
		
			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API);
			de.setValue(tmpModificaAPI);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
		}
		
		String tmpCambiaAPI = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_API);
		boolean cambiaAPI = false;
		if(tmpCambiaAPI!=null) {
			cambiaAPI = "true".equals(tmpCambiaAPI);
			
			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_API);
			de.setValue(tmpCambiaAPI);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
		}
		
		String tmpModificaDescrizione = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_DESCRIZIONE);
		boolean modificaDescrizione = false;
		if(tmpModificaDescrizione!=null) {
			modificaDescrizione = "true".equals(tmpModificaDescrizione);

			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_DESCRIZIONE);
			de.setValue(tmpModificaDescrizione);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
		}
		
		String tmpCambiaErogatore = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_SOGGETTO_EROGATORE);
		boolean cambiaErogatore = false;
		if(tmpCambiaErogatore!=null) {
			cambiaErogatore = "true".equals(tmpCambiaErogatore);
			
			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_SOGGETTO_EROGATORE);
			de.setValue(tmpCambiaErogatore);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
		}
		
		String tmpModificaProfilo = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_PROFILO);
		boolean modificaProfilo = false;
		if(tmpModificaProfilo!=null) {
			modificaProfilo = "true".equals(tmpModificaProfilo);
			
			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_PROFILO);
			de.setValue(tmpModificaProfilo);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
		}
		
		Boolean showInformazioniGeneraliErogazioniFruizioniView = null;
		if(gestioneFruitori || gestioneErogatori) {
			if(showModificaAPIErogazioniFruizioniView!=null && showModificaAPIErogazioniFruizioniView) {
				showInformazioniGeneraliErogazioniFruizioniView = false;
			}
			else if(modificaProfilo || cambiaAPI || cambiaErogatore || modificaDescrizione) {
				showInformazioniGeneraliErogazioniFruizioniView = false;
				showModificaAPIErogazioniFruizioniView = false; // forzo il false
			}
			else {
				showInformazioniGeneraliErogazioniFruizioniView = true;
			}
		}
		
		
		String tipoServizioEffettivo = oldTipoServizio!=null ? oldTipoServizio : tipoServizio; 
		String nomeServizioEffettivo = oldTipoServizio!=null ? oldNomeServizio : nomeServizio; 
		
		String[] tipiLabel = new String[tipi.size()];
		for (int i = 0; i < tipi.size(); i++) {
			String nomeTipo = tipi.get(i);
			tipiLabel[i] = nomeTipo;
		}

		String[] versioniValues = new String[versioni.size()+1];
		String[] versioniLabel = new String[versioni.size()+1];
		versioniLabel[0] = AccordiServizioParteSpecificaCostanti.LABEL_APS_USA_VERSIONE_EROGATORE;
		versioniValues[0] = "-";
		for (int i = 0; i < versioni.size(); i++) {
			String tmp = versioni.get(i);
			versioniLabel[i+1] = tmp;
			versioniValues[i+1] = tmp;
		}

		User user = ServletUtils.getUserFromSession(this.request, this.session);

		boolean creaDataElementVersione = this.apsCore.isSupportatoVersionamentoAccordiServizioParteSpecifica(tipoProtocollo);
		boolean visualizzaSceltaVersioneServizio = creaDataElementVersione;
		if(this.isModalitaStandard() && TipoOperazione.ADD.equals(tipoOp)) {
			visualizzaSceltaVersioneServizio = false;
		}

		boolean modificaAbilitata = ( (!this.isShowGestioneWorkflowStatoDocumenti()) || (!StatiAccordo.finale.toString().equals(oldStato)) );

		boolean isModalitaAvanzata = this.isModalitaAvanzata();

		boolean ripristinoStatoOperativo = this.core.isGestioneWorkflowStatoDocumentiRipristinoStatoOperativoDaFinale();

		Boolean contaListeObject = ServletUtils.getContaListeFromSession(this.session);
		boolean contaListe = contaListeObject!=null && contaListeObject.booleanValue();


		// accordo di servizio parte comune 

		boolean isAccordiCooperazione = user.getPermessi().isAccordiCooperazione();
		boolean isServizi = user.getPermessi().isServizi();

		String asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO;

		if(isServizi && !isAccordiCooperazione){
			asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_PARTE_COMUNE;
		}

		if(!isServizi  && isAccordiCooperazione){
			asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_COMPOSTO;
		}

		if(isServizi  && isAccordiCooperazione){
			asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO;
		}

		boolean showReferente = this.apcCore.isSupportatoSoggettoReferente(tipoProtocollo);
		
		boolean showPortiAccesso = false;
		if(serviceBinding!=null) {
			showPortiAccesso = this.apcCore.showPortiAccesso(tipoProtocollo, serviceBinding, interfaceType);
		}
		
		DataElement de = new DataElement();
		if(gestioneFruitori || gestioneErogatori) {
			if((showModificaAPIErogazioniFruizioniView!=null && showModificaAPIErogazioniFruizioniView) || cambiaAPI) {
				de.setLabel(asLabel);
			}
			else if(modificaDescrizione){
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE);
			}
			else {
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_INFO_GENERALI);
			}
		}
		else {
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_INFO_GENERALI);
		}
		if(modificaProfilo || cambiaErogatore) {
			de.setType(DataElementType.HIDDEN);
		}
		else {
			de.setType(DataElementType.TITLE);
		}
		dati.add(de);

		// Gestione del tipo protocollo per la maschera add
		de = new DataElement();
		if( TipoOperazione.ADD.equals(tipoOp) && (listaTipiProtocollo != null && listaTipiProtocollo.size() > 1)){
			de.setLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_PROTOCOLLO);
			de.setValues(listaTipiProtocollo);
			de.setLabels(this.getLabelsProtocolli(listaTipiProtocollo));
			de.setSelected(tipoProtocollo);
			de.setType(DataElementType.SELECT);
			de.setName(AccordiServizioParteComuneCostanti.PARAMETRO_APC_PROTOCOLLO);
			de.setPostBack_viaPOST(true);
		}else {
			de.setValue(tipoProtocollo);
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteComuneCostanti.PARAMETRO_APC_PROTOCOLLO);
		}
		de.setSize(this.getSize());
		dati.add(de);
		
		
		// Selezione Soggetto Operativo
		if(gestioneFruitori) {
			
			boolean showSoggettoFruitoreInFruizioni = this.core.isMultitenant() && 
					!this.isSoggettoMultitenantSelezionato();
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_FRUITORE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE);
			if (tipoOp.equals(TipoOperazione.ADD) && showSoggettoFruitoreInFruizioni) {
				de.setType(DataElementType.SELECT);
				de.setValues(soggettiFruitoriList);
				de.setLabels(soggettiFruitoriListLabel);
				de.setPostBack_viaPOST(true);
				de.setSelected(providerSoggettoFruitore);
				dati.add(de);
			} else {
				de.setValue(providerSoggettoFruitore);
				de.setType(DataElementType.HIDDEN);
				dati.add(de);
	
				boolean showSoggettoInChange = false; // viene fatto vedere nella maschera riassuntiva
				if(showSoggettoFruitoreInFruizioni && showSoggettoInChange) {
					de = new DataElement();
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_FRUITORE);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE_AS_TEXT);
					de.setType(DataElementType.TEXT);
					de.setValue(this.getLabelNomeSoggetto(tipoProtocollo, tipoSoggettoFruitore, nomeSoggettoFruitore));
					dati.add(de);
				}
			}
		}
		else {
			// anche in modalità completa
			
			boolean showSoggettoErogatoreInErogazioni = this.core.isMultitenant() && 
					!this.isSoggettoMultitenantSelezionato();
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_EROGATORE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_EROGATORE);
			if (tipoOp.equals(TipoOperazione.ADD) && (showSoggettoErogatoreInErogazioni)) {
				de.setType(DataElementType.SELECT);
				de.setValues(soggettiList);
				de.setLabels(soggettiListLabel);
				de.setPostBack_viaPOST(true);
				de.setSelected(provider);
				dati.add(de);
			} else {
				de.setValue(provider);
				de.setType(DataElementType.HIDDEN);
				dati.add(de);

				boolean showSoggettoInChange = false; // viene fatto vedere nella maschera riassuntiva
				if(!gestioneErogatori || (showSoggettoErogatoreInErogazioni && showSoggettoInChange)) {
					de = new DataElement();
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_EROGATORE);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_TEXT);
					de.setType(DataElementType.TEXT);
					de.setValue(this.getLabelNomeSoggetto(tipoProtocollo, tipoSoggetto, nomeSoggetto));
					dati.add(de);
				}
			}
		}
		
		if(this.isModalitaCompleta() || tipoOp.equals(TipoOperazione.ADD) || cambiaAPI) {
			de = new DataElement();
			de.setLabel(asLabel);
			de.setType(DataElementType.SUBTITLE);
			dati.add(de);
		}
		
		// Accordo 
		IDAccordo idAccordoParteComune = null;
		boolean apiChanged = false;
		if(tipoOp.equals(TipoOperazione.ADD)){
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_NOME);
			de.setType(DataElementType.SELECT);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ACCORDO);
			de.setValues(accordiList);
			de.setLabels(accordiListLabel);
			de.setPostBack_viaPOST(true);
			if (accordo != null)
				de.setSelected(accordo);
			
			if(accordiListLabel.length>1) {
				de.setRequired(true);
			}
			dati.add(de);
		}
		else if(cambiaAPI && accordiListLabel!=null && accordiListLabel.length>0) {
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_NOME_ATTUALE);
			de.setType(DataElementType.TEXT);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ACCORDO+CostantiControlStation.PARAMETRO_SUFFIX_LABEL);
			de.setValue(accordiListLabel[0]);
			dati.add(de);
			
			if(accordiListLabel.length>1) {
				String [] newAccordi = new String[accordiListLabel.length];
				String [] newAccordiLabel = new String[accordiListLabel.length];
				for (int i = 0; i < accordiListLabel.length; i++) {
					newAccordi[i] = accordiList[i];
					if(i>0) {
						newAccordiLabel[i] = accordiListLabel[i];
					}
					else {
						newAccordiLabel[i] = "-";
					}
				}
				
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_NOME_NUOVO);
				de.setType(DataElementType.SELECT);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ACCORDO);
				de.setValues(newAccordi);
				de.setLabels(newAccordiLabel);
				de.setPostBack(true);
				if (accordo != null)
					de.setSelected(accordo);
				dati.add(de);
			}
			else {
				de = new DataElement();
				de.setType(DataElementType.HIDDEN);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ACCORDO);
				de.setValue(accordo);
				dati.add(de);
			}
			
			if(accordo!=null) {
				for (int i = 0; i < accordiList.length; i++) {
					if(accordo.equals(accordiList[i])) {
						apiChanged = i>0;
						break;
					}
				}
			}
		}
		else{
			if(!modificaAbilitata || 
					(asCompatibili==null || asCompatibili.size()<=1) || 
					(showModificaAPIErogazioniFruizioniView!=null && !showModificaAPIErogazioniFruizioniView)){
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO);
				de.setType(DataElementType.HIDDEN);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ACCORDO);
				de.setValue(accordo);
				dati.add(de);
			}
				
			idAccordoParteComune = this.idAccordoFactory.getIDAccordoFromUri(uriAccordo);
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_REFERENTE);
			if(showReferente && (showModificaAPIErogazioniFruizioniView==null || showModificaAPIErogazioniFruizioniView)) {
				de.setType(DataElementType.TEXT);
			}
			else {
				de.setType(DataElementType.HIDDEN);
			}
			de.setName(CostantiControlStation.PARAMETRO_PREFIX+AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_REFERENTE );
			de.setValue(idAccordoParteComune.getSoggettoReferente().toString());
			dati.add(de);
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_NOME);
			if(showModificaAPIErogazioniFruizioniView==null || showModificaAPIErogazioniFruizioniView) {
				de.setType(DataElementType.TEXT);
			}
			else {
				de.setType(DataElementType.HIDDEN);
			}
			de.setName(CostantiControlStation.PARAMETRO_PREFIX+AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_NOME );
			de.setValue(idAccordoParteComune.getNome());
			dati.add(de);
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_VERSIONE);
			if(!modificaAbilitata || 
					(asCompatibili==null || asCompatibili.size()<=1) || 
					(showModificaAPIErogazioniFruizioniView!=null && !showModificaAPIErogazioniFruizioniView)){
				if((showModificaAPIErogazioniFruizioniView!=null && !showModificaAPIErogazioniFruizioniView)) {
					de.setType(DataElementType.HIDDEN);
				}
				else {
					de.setType(DataElementType.TEXT);
				}
				de.setName(CostantiControlStation.PARAMETRO_PREFIX+AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_VERSIONE );
				if(idAccordoParteComune.getVersione()!=null)
					de.setValue(idAccordoParteComune.getVersione().intValue()+"");
			}
			else{
				String [] accordiCompatibiliList = new String[asCompatibili.size()];
				String [] accordiCompatibiliLabelList = new String[asCompatibili.size()];
				for (int i = 0; i < asCompatibili.size(); i++) {
					accordiCompatibiliList[i] = asCompatibili.get(i).getId() + "";
					if(asCompatibili.get(i).getVersione()!=null){
						accordiCompatibiliLabelList[i] = asCompatibili.get(i).getVersione().intValue()+"";
					}
				}
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ACCORDO);
				if(showModificaAPIErogazioniFruizioniView==null || showModificaAPIErogazioniFruizioniView) {
					if(confirmInProgress) {
						de.setType(DataElementType.HIDDEN);
						
						DataElement deLabel = new DataElement();
						deLabel.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_VERSIONE);
						deLabel.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ACCORDO+CostantiControlStation.PARAMETRO_SUFFIX_LABEL);
						deLabel.setType(DataElementType.TEXT);
						for (int i = 0; i < accordiCompatibiliList.length; i++) {
							if(accordo.equals(accordiCompatibiliList[i])) {
								deLabel.setValue(accordiCompatibiliLabelList[i]);
								break;
							}
						}
						dati.add(deLabel);
					}
					else {
						de.setType(DataElementType.SELECT);
						de.setValues(accordiCompatibiliList);
						de.setLabels(accordiCompatibiliLabelList);
						// Lasciare il postback, l'evento serve ad allineare la versione dell'API con la versione del servizio in automatico
						de.setPostBack(true);
						de.setSelected(accordo);
					}
				}
				else {
					de.setType(DataElementType.HIDDEN);
				}
				de.setValue(accordo);
			}
			dati.add(de);
			
		}

		if(serviceBinding != null) {
			switch(serviceBinding) {
			case REST:
				
				if(showModificaAPIErogazioniFruizioniView==null || showModificaAPIErogazioniFruizioniView) {
					de = new DataElement();
					de.setType(DataElementType.TEXT);
					de.setLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_SERVICE_BINDING);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PORT_TYPE+CostantiControlStation.PARAMETRO_SUFFIX_LABEL);
					de.setValue(CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_REST);
					dati.add(de);
				}
				
				//Servizio (portType)  nascosto nel caso REST
				de = new DataElement();
				de.setType(DataElementType.HIDDEN);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PORT_TYPE);
				de.setValue(portType);
				dati.add(de);
				break;
			case SOAP:
			default:
				
				if(showModificaAPIErogazioniFruizioniView==null || showModificaAPIErogazioniFruizioniView) {
					de = new DataElement();
					de.setType(DataElementType.TEXT);
					de.setLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_SERVICE_BINDING);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PORT_TYPE+CostantiControlStation.PARAMETRO_SUFFIX_LABEL);
					de.setValue(CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_SOAP);
					dati.add(de);
				}
				
				//Servizio (portType)  visibile nel caso SOAP
				if (ptList != null) {
					if(tipoOp.equals(TipoOperazione.ADD) || modificaAbilitata || apiChanged){
						de = new DataElement();
						de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO);
						de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PORT_TYPE);
						if(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView || apiChanged) {
							if(showInformazioniGeneraliErogazioniFruizioniView!=null) {
								de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO_SOAP);				
							}
							de.setType(DataElementType.SELECT);
							de.setValues(ptList);
							de.setLabels(ptList);
							de.setSelected(portType);
							if(tipoOp.equals(TipoOperazione.ADD)) {
								de.setPostBack_viaPOST(true);
							}
							else {
								de.setPostBack(true);
							}
							if (!isModalitaAvanzata || this.apsCore.isPortTypeObbligatorioImplementazioniSOAP()) {
								de.setRequired(true);
							}
						}
						else {
							if(showModificaAPIErogazioniFruizioniView!=null && showModificaAPIErogazioniFruizioniView) {
								de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO_SOAP);				
								de.setType(DataElementType.TEXT);
							}
							else {
								de.setType(DataElementType.HIDDEN);
							}
							de.setValue(portType);
						}
						dati.add(de);
					}else{
						de = new DataElement();
						de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO);
						de.setType(DataElementType.HIDDEN);
						de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PORT_TYPE);
						de.setValue(portType);
						dati.add(de);
	
						de = new DataElement();
						de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO);
						if(showModificaAPIErogazioniFruizioniView==null || showModificaAPIErogazioniFruizioniView) {
							de.setType(DataElementType.TEXT);
						}
						else {
							de.setType(DataElementType.HIDDEN);
						}
						de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PORT_TYPE_LABEL);
						de.setValue(portType);
						dati.add(de);
					}
				}else{
					de = new DataElement();
					de.setType(DataElementType.HIDDEN );
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PORT_TYPE);
					dati.add(de);
				}
				
				break;
			}
		}

		

		//Sezione Servizio

		List<DataElement> datiCorrelati = new ArrayList<>();
		boolean showInfoCorrelata = false;
		if(serviceBinding != null) {
			showInfoCorrelata = this.addInfoCorrelata(tipoOp, portType, modificaAbilitata, servcorr, oldStato, tipoProtocollo, serviceBinding, datiCorrelati);
		}
		
		boolean modificaAbilitataOrOperazioneAdd = tipoOp.equals(TipoOperazione.ADD) || modificaAbilitata;
		
		boolean showSceltaNomeServizioDisabilitata =false;
		if(TipoOperazione.ADD.equals(tipoOp)) {
			if(!isModalitaAvanzata) {
				showSceltaNomeServizioDisabilitata = true;
			}
		}
		else {
			// change
			if(gestioneErogatori || gestioneFruitori) {
				showSceltaNomeServizioDisabilitata = false; // lo vogliamo poter modificare sempre
			}
			else {
				if( (!isModalitaAvanzata) 
						&&
					(
						(ServiceBinding.SOAP.equals(serviceBinding) && nomeServizio!=null && nomeServizio.equals(portType)) 
						||
						(ServiceBinding.REST.equals(serviceBinding) && nomeServizio!=null && nomeServizio.equals(idAccordoParteComune.getNome()))) 
					){
					showSceltaNomeServizioDisabilitata = true;
				}
			}
		}
		
		
		boolean showFlagPrivato = this.core.isShowFlagPrivato() &&  (tipoOp.equals(TipoOperazione.ADD) || 
				modificaAbilitata) && isModalitaAvanzata;
		
		boolean showFlagPrivatoLabel = this.core.isShowFlagPrivato() && tipoOp.equals(TipoOperazione.CHANGE ) && 
			(this.isShowGestioneWorkflowStatoDocumenti() && 
					StatiAccordo.finale.toString().equals(oldStato) ) &&
					isModalitaAvanzata;
		
		boolean showTipoServizio = (this.apsCore.getTipiServiziGestitiProtocollo(tipoProtocollo,serviceBinding).size()>1);
		
		boolean showVersioneProtocollo = modificaAbilitataOrOperazioneAdd && (this.apsCore.getVersioniProtocollo(tipoProtocollo).size()>1);
		
		
		boolean showLabelServizio = this.isModalitaAvanzata() || 
				showTipoServizio ||
				(!showSceltaNomeServizioDisabilitata) ||
				visualizzaSceltaVersioneServizio ||
				showInfoCorrelata ||
				showFlagPrivato ||
				showFlagPrivatoLabel ||
				showVersioneProtocollo ||
				(this.isShowGestioneWorkflowStatoDocumenti() && (TipoOperazione.CHANGE.equals(tipoOp) || this.isModalitaAvanzata()));
		
		if(showLabelServizio && 
				showInformazioniGeneraliErogazioniFruizioniView==null){
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO);
			de.setType(DataElementType.SUBTITLE);
			dati.add(de);
		}

		if(isModalitaCompleta()) {
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE);
			de.setType(DataElementType.TEXT_AREA);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_DESCRIZIONE);
			de.setSize(getSize());
			de.setValue(descrizione!=null ? StringEscapeUtils.escapeHtml(descrizione) : "");
			if( !modificaAbilitata && StringUtils.isBlank(descrizione))
				de.setValue("");
			
			dati.add(de);
			
		}
		else{
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE);
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_DESCRIZIONE);
			de.setSize(getSize());
			de.setValue(descrizione!=null ? StringEscapeUtils.escapeHtml(descrizione) : "");
			if( !modificaAbilitata && (descrizione==null || "".equals(descrizione)) )
				de.setValue(" ");
			dati.add(de);
			
		}
		
		
		if(!isModalitaCompleta() && modificaDescrizione) {
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE);
			if(modificaAbilitata) {
				de.setType(DataElementType.TEXT_AREA);
				de.setRows(CostantiControlStation.TEXT_AREA_DESCRIZIONE_ROWS);
				de.setLabel(CostantiControlStation.LABEL_PROPRIETA_DESCRIZIONE_EMPTY);
			}
			else {
				de.setType(DataElementType.TEXT_EDIT);
			}
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_DESCRIZIONE_MODIFICA);
			de.setSize(getSize());
			de.setValue(descrizioneModificata!=null ? StringEscapeUtils.escapeHtml(descrizioneModificata) : "");
			if( !modificaAbilitata && StringUtils.isBlank(descrizioneModificata))
				de.setValue("");
			
			dati.add(de);
			
		}
		


		if(showTipoServizio) {
			if(modificaAbilitataOrOperazioneAdd){
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO  );
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO);
				if((showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView)) {
					de.setValues(tipiLabel);
					de.setSelected(tipoServizio);
					de.setType(DataElementType.SELECT);
					de.setSize(this.getSize());
					if(tipoOp.equals(TipoOperazione.ADD)) {
						de.setPostBack_viaPOST(true);
					}
				}
				else {
					de.setType(DataElementType.HIDDEN);
					de.setValue(tipoServizio);
				}
				dati.add(de);
			}else{
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO);
				de.setValue(tipoServizio);
				if((showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView)) {
					de.setType(DataElementType.TEXT);
				}
				else {
					de.setType(DataElementType.HIDDEN);
				}
				dati.add(de);
			}
		}else{
			de = new DataElement();
			de.setValue(tipoServizio);
			de.setType(DataElementType.HIDDEN);
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO);
			dati.add(de);
		}


		if(!showSceltaNomeServizioDisabilitata && cambiaAPI) {
			de = new DataElement();
			if(gestioneErogatori) {
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SINGOLO);
			}
			if(gestioneFruitori) {
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORE);
			}
			de.setType(DataElementType.SUBTITLE);
			dati.add(de);
		}
		
		if (showSceltaNomeServizioDisabilitata ) {
			de = new DataElement();
			if (nomeServizio == null) {
				de.setValue("");
			} else {
				de.setValue(nomeServizio);
			}
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO  );
			dati.add(de);
		} else {
			de = new DataElement();
			if(tipoOp.equals(TipoOperazione.ADD) && isModalitaAvanzata() && (gestioneFruitori || gestioneErogatori)){
				if(gestioneErogatori) {
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_EROGAZIONE);
				}
				else {
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_FRUIZIONE);
				}
			}
			else {
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_FILE);
			}
			if (nomeServizio == null) {
				de.setValue("");
			} else {
				de.setValue(nomeServizio);
			}
			if((showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView) || cambiaAPI ) {
				if(cambiaAPI && !apiChanged) { // else rientrano in modificaAbilitata
					de.setType(DataElementType.TEXT);
				}
				else if(tipoOp.equals(TipoOperazione.ADD) || modificaAbilitata){
					de.setType(DataElementType.TEXT_EDIT);
					de.setRequired(true);
					
					// se non ho selezionato l'accordo non faccio vedere la textedit non ha senso
					if (accordo == null || accordo.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_PARAMETRO_ACCORDO_NON_SELEZIONATO)) { 
						de.setType(DataElementType.HIDDEN);
						de.setRequired(false);
					}
				}else{
					de.setType(DataElementType.TEXT);
				}
			}
			else {
				de.setType(DataElementType.HIDDEN);
			}
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO  );
			de.setSize(this.getSize());
			dati.add(de);
		}
		
		if(uriAccordo != null && creaDataElementVersione){

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VERSIONE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VERSIONE);
			String versioneSelezionata = ((versione==null || "".equals(versione)) ? "1" : versione);
			if(idAccordoParteComune==null) {
				idAccordoParteComune = this.idAccordoFactory.getIDAccordoFromUri(uriAccordo);
			}
			if( TipoOperazione.ADD.equals(tipoOp) && this.isModalitaStandard() ) {
				versioneSelezionata = idAccordoParteComune.getVersione().intValue()+"";
			}
			boolean versioneAllineataAccordoParteComune = false;
			if(TipoOperazione.CHANGE.equals(tipoOp) && !cambiaAPI) {
				versioneAllineataAccordoParteComune = (idAccordoParteComune.getVersione().intValue()+"").equals(versioneSelezionata); // modifica gestita in servlet chage, vedi postback PARAMETRO_APS_ACCORDO
			}
			
			de.setValue(versioneSelezionata);
			if(visualizzaSceltaVersioneServizio){
				if((showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView) || cambiaAPI ) {
					if(cambiaAPI && !apiChanged) { // else rientrano in modificaAbilitata
						de.setType(DataElementType.TEXT);
					}
					else if( modificaAbilitata ){
						if(this.isModalitaStandard() && versioneAllineataAccordoParteComune) {
							de.setType(DataElementType.HIDDEN);
						}
						else {
							de = this.getVersionDataElement(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VERSIONE, 
									AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VERSIONE, 
									versioneSelezionata, false);
						}
					}else{
						de.setType(DataElementType.TEXT);
					}
				}
				else{
					de.setType(DataElementType.HIDDEN);
				}
			}else{
				de.setType(DataElementType.HIDDEN);
			}
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VERSIONE);
			dati.add(de);
			
		}
		
		if((showInformazioniGeneraliErogazioniFruizioniView!=null && !showInformazioniGeneraliErogazioniFruizioniView)) {
			for (DataElement dataElement : datiCorrelati) {
				dataElement.setType(DataElementType.HIDDEN);
			}
		}
		dati.addAll(datiCorrelati);

		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PRIVATO);
		if (showFlagPrivato && (showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView)) {
			de.setType(DataElementType.CHECKBOX);
			de.setSelected(privato ? Costanti.CHECK_BOX_ENABLED : "");
		} else {
			de.setType(DataElementType.HIDDEN);
			de.setValue(privato ? Costanti.CHECK_BOX_ENABLED : "");
		}
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PRIVATO);
		dati.add(de);

		if(showFlagPrivatoLabel && (showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView)){
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VISIBILITA_SERVIZIO);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PRIVATO_LABEL);
			if(privato){
				de.setValue(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_PRIVATA);
			}else{
				de.setValue(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_PUBBLICA);
			}
			dati.add(de);
		}

		
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VERSIONE_PROTOCOLLO);
		if(showVersioneProtocollo && (showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView)){
			if(tipoOp.equals(TipoOperazione.ADD) || modificaAbilitata){
				de.setValues(versioniValues);
				de.setLabels(versioniLabel);
				if(profilo==null){
					profilo="-";
				}
				de.setSelected(profilo);
				de.setType(DataElementType.SELECT);
			}else{
				de.setType(DataElementType.TEXT);
				de.setValue(profilo);
				if( profilo==null || "".equals(profilo) )
					de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_USA_VERSIONE_EROGATORE);
			}
		}else {
			de.setType(DataElementType.HIDDEN);
			if(profilo==null){
				profilo="-";
			}
			de.setValue(profilo);
		}
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROFILO);
		de.setSize(this.getSize());
		dati.add(de);
		
		
		// Gestione canali
		if(gestioneCanaliEnabled) {
			if( tipoOp.equals(TipoOperazione.ADD)) {
				DataElement dataElement = new DataElement();
				dataElement.setLabel(CostantiControlStation.LABEL_CONFIGURAZIONE_CANALE);
				dataElement.setType(DataElementType.SUBTITLE);
				dati.add(dataElement);
				
				this.addCanaleToDati(dati, tipoOp, canaleStato, canale, canaleAPI, canaleList, gestioneCanaliEnabled, false);
			} else {
				// sono dati delle porte applicative/delegate inserisco hidden i valori che mi vengono passati
				this.addCanaleToDatiAsHidden(dati, tipoOp, canaleStato, canale, gestioneCanaliEnabled);
			}
		}

		
		// Modalita' standard faccio vedere lo stato
		// stato
		if(isModalitaAvanzata){

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
			if(this.isShowGestioneWorkflowStatoDocumenti()){
				if( tipoOp.equals(TipoOperazione.ADD) || 
						(!StatiAccordo.finale.toString().equals(oldStato) && 
								(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView)) ){
					de.setType(DataElementType.SELECT);
					de.setValues(StatiAccordo.toArray());
					de.setLabels(StatiAccordo.toLabel());
					de.setSelected(statoPackage);
					de.setName(ConnettoriCostanti.PARAMETRO_CONNETTORE_HTTPS_STATO_PACKAGE);
				}else{
					
					if(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView) {
						DataElement deLabel = new DataElement();
						deLabel.setType(DataElementType.TEXT);
						deLabel.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
						deLabel.setValue(StatiAccordo.upper(StatiAccordo.finale.toString()));
						deLabel.setName(ConnettoriCostanti.PARAMETRO_CONNETTORE_HTTPS_STATO_PACKAGE+CostantiControlStation.PARAMETRO_SUFFIX_LABEL);
						dati.add(deLabel);
					}
					
					de.setType(DataElementType.HIDDEN);
					de.setValue(StatiAccordo.finale.toString());
					de.setName(ConnettoriCostanti.PARAMETRO_CONNETTORE_HTTPS_STATO_PACKAGE);

					if(ripristinoStatoOperativo){
						dati.add(de);

						if(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView) {
							de = new DataElement();
							de.setType(DataElementType.LINK);
	
							Parameter pIdsoggErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatore + "");
							Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, nomeServizioEffettivo);
							Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, tipoServizioEffettivo);
	
							de.setUrl(
									AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE,
									new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id),
									pNomeServizio, pTipoServizio, pIdsoggErogatore,new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_RIPRISTINA_STATO, StatiAccordo.operativo.toString()),
									new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME, Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_IN_PROGRESS));
							de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_RIPRISTINA_STATO_OPERATIVO);
						}
					}
				}
			}else{
				de.setType(DataElementType.HIDDEN);
				de.setValue(StatiAccordo.finale.toString());
				de.setName(ConnettoriCostanti.PARAMETRO_CONNETTORE_HTTPS_STATO_PACKAGE);
			}

			dati.add(de);

		}
		
		else{
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
			de.setName(ConnettoriCostanti.PARAMETRO_CONNETTORE_HTTPS_STATO_PACKAGE);
			if(this.isShowGestioneWorkflowStatoDocumenti()){
				if(tipoOp.equals(TipoOperazione.ADD)){
					de.setType(DataElementType.HIDDEN);
					de.setValue(statoPackage);
				}else if( 
						(!StatiAccordo.finale.toString().equals(oldStato)) && 
						(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView) ){
					de.setType(DataElementType.SELECT);
					de.setValues(StatiAccordo.toArray());
					de.setLabels(StatiAccordo.toLabel());
					de.setSelected(statoPackage);
				}else{
					
					if(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView) {
						DataElement deLabel = new DataElement();
						deLabel.setType(DataElementType.TEXT);
						deLabel.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
						deLabel.setValue(StatiAccordo.upper(StatiAccordo.finale.toString()));
						deLabel.setName(ConnettoriCostanti.PARAMETRO_CONNETTORE_HTTPS_STATO_PACKAGE+CostantiControlStation.PARAMETRO_SUFFIX_LABEL);
						dati.add(deLabel);
					}
					
					de.setType(DataElementType.HIDDEN);
					de.setValue(StatiAccordo.finale.toString());

					if(ripristinoStatoOperativo){
						dati.add(de);

						if(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView) {
							de = new DataElement();
							de.setType(DataElementType.LINK);
	
							Parameter pIdsoggErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatore + "");
							Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, nomeServizioEffettivo);
							Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, tipoServizioEffettivo);
	
							de.setUrl(
									AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE,
									new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id),
									pNomeServizio, pTipoServizio, pIdsoggErogatore,new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_RIPRISTINA_STATO, StatiAccordo.operativo.toString()),
									new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME, Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_IN_PROGRESS));
							de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_RIPRISTINA_STATO_OPERATIVO);
						}
					}
				}				
			}else{
				de.setType(DataElementType.HIDDEN);
				de.setValue(StatiAccordo.finale.toString());
			}

			dati.add(de);
		}
		
		
		
		//Sezione Soggetto Erogatore (provider)

		if(gestioneFruitori) {
			
			boolean showSoggettoInChange = false; // viene fatto vedere nella maschera riassuntiva
			
			if (tipoOp.equals(TipoOperazione.ADD) || showSoggettoInChange) {
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_EROGATORE);
				de.setType(DataElementType.SUBTITLE);
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_EROGATORE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_EROGATORE);
			if (tipoOp.equals(TipoOperazione.ADD)) {
				de.setType(DataElementType.SELECT);
				de.setValues(soggettiList);
				de.setLabels(soggettiListLabel);
				de.setPostBack_viaPOST(true);
				de.setSelected(provider);
				dati.add(de);
			} else {
				de.setValue(provider);
				de.setType(DataElementType.HIDDEN);
				dati.add(de);
	
				if(showSoggettoInChange) {
					de = new DataElement();
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_EROGATORE);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_TEXT);
					de.setType(DataElementType.TEXT);
					de.setValue(this.getLabelNomeSoggetto(tipoProtocollo, tipoSoggetto, nomeSoggetto));
					dati.add(de);
				}
			}
		}
		
		if(cambiaErogatore) {
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_EROGATORE);
			de.setType(DataElementType.TITLE);
			dati.add(de);
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_EROGATORE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_CAMBIO_EROGATORE);
			if(confirmInProgress) {
				de.setType(DataElementType.HIDDEN);
				de.setValue(provider);
			}
			else {
				de.setType(DataElementType.SELECT);
				de.setValues(soggettiList);
				de.setLabels(soggettiListLabel);
				de.setSelected(provider);
				de.setRequired(true);
			}
			dati.add(de);
			
			if(confirmInProgress) {
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_EROGATORE);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_CAMBIO_EROGATORE+CostantiControlStation.PARAMETRO_SUFFIX_LABEL);
				de.setType(DataElementType.TEXT);
				de.setValue("-");
				if(soggettiList!=null && soggettiList.length>0) {
					for (int i = 0; i < soggettiList.length; i++) {
						String prov = soggettiList[i];
						if(prov.equals(provider)) {
							de.setValue(soggettiListLabel[i]);
							break;
						}
					}
				}
				dati.add(de);
			}
		}
		
		
		
		// allegati
		
		if(!tipoOp.equals(TipoOperazione.ADD) && !this.isModalitaCompleta() &&
				(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView)) {
			de = new DataElement();
			de.setType(DataElementType.LINK);
			List<Parameter> listParametersAllegati = new ArrayList<>();
			listParametersAllegati.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id));
			if(tmpModificaAPI!=null) {
				listParametersAllegati.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API, tmpModificaAPI));
			}
			if(gestioneFruitori) {
				listParametersAllegati.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE, tipoSoggettoFruitore));
				listParametersAllegati.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE, nomeSoggettoFruitore));
			}
			de.setUrl(
					AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ALLEGATI_LIST,
					listParametersAllegati.toArray(new Parameter[1]));
			if(contaListe){
				try{
					// BugFix OP-674
					/**int num = this.apsCore.serviziAllegatiList(Integer.parseInt(id), new Search(true)).size();*/
					ConsoleSearch searchForCount = new ConsoleSearch(true,1);
					this.apsCore.serviziAllegatiList(Integer.parseInt(id), searchForCount);
					int num = searchForCount.getNumEntries(Liste.SERVIZI_ALLEGATI);
					ServletUtils.setDataElementCustomLabel(de, AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI, (long) num);
				}catch(Exception e){
					this.logError("Calcolo numero Allegati non riuscito",e);
					ServletUtils.setDataElementCustomLabel(de, AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI, AccordiServizioParteSpecificaCostanti.LABEL_N_D);
				}
			}else{
				de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI  );
			}
			dati.add(de);
		}
		
		
		
		// specifica porti di accesso
		
		if(serviceBinding != null && (serviceBinding.equals(ServiceBinding.SOAP) && interfaceType.equals(org.openspcoop2.protocol.manifest.constants.InterfaceType.WSDL_11) && showPortiAccesso &&
				(showInformazioniGeneraliErogazioniFruizioniView==null || showInformazioniGeneraliErogazioniFruizioniView))){

			if(isModalitaAvanzata){
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SPECIFICA_PORTI_ACCESSO);
				de.setType(DataElementType.SUBTITLE);
				dati.add(de);
	
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VALIDAZIONE_DOCUMENTI_ESTESA);
				de.setValue(""+validazioneDocumenti);
				/**		if (tipoOp.equals(TipoOperazione.ADD) && InterfaceType.AVANZATA.equals(user.getInterfaceType())) { */
				if (tipoOp.equals(TipoOperazione.ADD) ) {
					de.setType(DataElementType.CHECKBOX);
					if(validazioneDocumenti){
						de.setSelected(Costanti.CHECK_BOX_ENABLED);
					}else{
						de.setSelected(Costanti.CHECK_BOX_DISABLED);
					}
				}else{
					de.setType(DataElementType.HIDDEN);
				}
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VALIDAZIONE_DOCUMENTI);
				de.setSize(this.getSize());
				dati.add(de);
	
				boolean isSupportoAsincrono = this.core.isProfiloDiCollaborazioneAsincronoSupportatoDalProtocollo(tipoProtocollo,serviceBinding);
				boolean isRuoloNormale =  !( (servcorr != null) && ((servcorr.equals(Costanti.CHECK_BOX_ENABLED)) || servcorr.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_ABILITATO)) ) ;
	
				if (tipoOp.equals(TipoOperazione.ADD)) {
					if(isSupportoAsincrono){
						if(isRuoloNormale){
							dati.add(wsdlimpler.getFileDataElement(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_EROGATORE_COMPATTO, "", getSize()));
							dati.addAll(wsdlimpler.getFileNameDataElement());
							dati.add(wsdlimpler.getFileIdDataElement());
							
	/**						de = new DataElement();
	//						de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_EROGATORE);
	//						de.setValue(wsdlimpler);
	//						de.setType(DataElementType.FILE);
	//						de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
	//						de.setSize(this.getSize());
	//						dati.add(de);*/
						} else {
							dati.add(wsdlimplfru.getFileDataElement(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_FRUITORE_COMPATTO, "", getSize()));
							dati.addAll(wsdlimplfru.getFileNameDataElement());
							dati.add(wsdlimplfru.getFileIdDataElement());
							
	/**						de = new DataElement();
	//						de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_FRUITORE);
	//						de.setValue(wsdlimplfru);
	//						de.setType(DataElementType.FILE);
	//						de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE);
	//						de.setSize(this.getSize());
	//						dati.add(de);*/
						}
					}else {
						dati.add(wsdlimpler.getFileDataElement(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO, "", getSize()));
						dati.addAll(wsdlimpler.getFileNameDataElement());
						dati.add(wsdlimpler.getFileIdDataElement());
						
	/**					de = new DataElement();
	//					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO);
	//					de.setValue(wsdlimpler);
	//					de.setType(DataElementType.FILE);
	//					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
	//					de.setSize(this.getSize());
	//					dati.add(de);*/
					}
				} else {
					
					List<Parameter> listParametersWSDLChange = new ArrayList<>();
					listParametersWSDLChange.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id));
					if(gestioneFruitori) {
						listParametersWSDLChange.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE, tipoSoggettoFruitore));
						listParametersWSDLChange.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE, nomeSoggettoFruitore));
					}
					
					if(isSupportoAsincrono){
						if(isRuoloNormale){
							de = new DataElement();
							de.setType(DataElementType.LINK);
							listParametersWSDLChange.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE));
							de.setUrl(
									AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_WSDL_CHANGE,
									listParametersWSDLChange.toArray(new Parameter[1]));
							de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_EROGATORE_ESTESO);
							dati.add(de);
						}else{
							de = new DataElement();
							de.setType(DataElementType.LINK);
							listParametersWSDLChange.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE));
							de.setUrl(
									AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_WSDL_CHANGE,
									listParametersWSDLChange.toArray(new Parameter[1]));
							de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_FRUITORE_ESTESO);
							dati.add(de);
						}
					}else {
						de = new DataElement();
						de.setType(DataElementType.LINK);
						listParametersWSDLChange.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE));
						de.setUrl(
								AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_WSDL_CHANGE,
								listParametersWSDLChange.toArray(new Parameter[1]));
	
						de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO);
						dati.add(de);
					}
				}
	
			} else {
				if (tipoOp.equals(TipoOperazione.ADD)) {
					de = new DataElement();
					String wsdlimplerS =  wsdlimpler.getValue() != null ? new String(wsdlimpler.getValue()) : ""; 
					de.setValue(wsdlimplerS);
					de.setType(DataElementType.HIDDEN);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
					dati.add(de);
	
					de = new DataElement();
					String wsdlimplfruS =  wsdlimpler.getValue() != null ? new String(wsdlimpler.getValue()) : ""; 
					de.setValue(wsdlimplfruS);
					de.setType(DataElementType.HIDDEN);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE);
					dati.add(de);
				}
			}
		}
		
		if (tipoOp.equals(TipoOperazione.ADD) && 
				(accordo == null || accordo.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_PARAMETRO_ACCORDO_NON_SELEZIONATO))) { 
			return dati;
		}
		
		// Porta Applicativa e Servizio Applicativo Erogatore
		if (tipoOp.equals(TipoOperazione.ADD) && !ServletUtils.isCheckBoxEnabled(servcorr) && generaPACheckSoggetto) {

			if(this.isModalitaCompleta()) {
			
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO_APPLICATIVO_EROGATORE );
				de.setType(DataElementType.TITLE);
				dati.add(de);
	
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_SERVIZIO_APPLICATIVO_EROGATORE);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SA);
				de.setSelected(nomeSA);
				de.setValues(saSoggetti);
				de.setType(DataElementType.SELECT);
				dati.add(de);
				
			}
			
			// Controllo Accesso
			
			// Creo un oggetto vuoto tanto per passare l'informazione sul tipo protocollo
			PortaApplicativa pa = new PortaApplicativa();
			pa.setServizio(new PortaApplicativaServizio());
			pa.getServizio().setTipo(tipoServizio);
			
			boolean forceAutenticato = false; 
			boolean forceHttps = false;
			boolean forceDisableOptional = false;
			boolean forceGestioneToken = false;
			boolean forceMostraSezioneToken = false;
			
			if(this.isProfiloModIPA(tipoProtocollo)) {
				if(idAccordoParteComune==null) {
					idAccordoParteComune = this.idAccordoFactory.getIDAccordoFromUri(uriAccordo);
				}
				forceAutenticato = true; // in modI ci vuole sempre autenticazione https sull'erogazione (cambia l'opzionalita' o meno)
				forceHttps = forceAutenticato;
				
				boolean forcePDND = false;
				boolean forceOAuth = false;
								
				BooleanNullable forceHttpsClientWrapper = BooleanNullable.NULL(); 
				BooleanNullable forcePDNDWrapper = BooleanNullable.NULL(); 
				BooleanNullable forceOAuthWrapper = BooleanNullable.NULL(); 
				
				this.readModIConfiguration(forceHttpsClientWrapper, forcePDNDWrapper, forceOAuthWrapper, 
						idAccordoParteComune, portType, 
						null);
				
				if(forceHttpsClientWrapper.getValue()!=null) {
					forceDisableOptional = forceHttpsClientWrapper.getValue().booleanValue();
				}
				if(forcePDNDWrapper.getValue()!=null) {
					forcePDND = forcePDNDWrapper.getValue().booleanValue();
				}
				if(forceOAuthWrapper.getValue()!=null) {
					forceOAuth = forceOAuthWrapper.getValue().booleanValue();
				}
				
				if (forcePDND || forceOAuth) {
					
					forceGestioneToken = true;
					forceMostraSezioneToken = true;
					
					gestioneToken = StatoFunzionalita.ABILITATO.getValue();
					
					if(forcePDND) {
						List<String> tokenPolicies = this.getTokenPolicyGestione(true, false, 
								false, // alla posizione 0 NON viene aggiunto -
								gestioneTokenPolicy, tipoOp); 
						if(tokenPolicies!=null && !tokenPolicies.isEmpty()) {
							if(gestioneTokenPolicy==null || StringUtils.isEmpty(gestioneTokenPolicy) || CostantiControlStation.DEFAULT_VALUE_NON_SELEZIONATO.equals(gestioneTokenPolicy)) {
								gestioneTokenPolicy = tokenPolicies.get(0); 
							}
							gestioneTokenPolicyLabels = tokenPolicies.toArray(new String[1]);
							gestioneTokenPolicyValues = tokenPolicies.toArray(new String[1]);
						}
					}
					else {
						List<String> tokenPolicies = this.getTokenPolicyGestione(false, true, 
								false, // alla posizione 0 NON viene aggiunto -
								gestioneTokenPolicy, tipoOp); 
						if(tokenPolicies!=null && !tokenPolicies.isEmpty()) {
							if(gestioneTokenPolicy==null || StringUtils.isEmpty(gestioneTokenPolicy) || CostantiControlStation.DEFAULT_VALUE_NON_SELEZIONATO.equals(gestioneTokenPolicy)) {
								gestioneTokenPolicy = tokenPolicies.get(0); 
							}
							gestioneTokenPolicyLabels = tokenPolicies.toArray(new String[1]);
							gestioneTokenPolicyValues = tokenPolicies.toArray(new String[1]);
						}
					}
					
					gestioneTokenOpzionale = StatoFunzionalita.DISABILITATO.getValue();
					
					if(gestioneTokenPolicy!=null && StringUtils.isNotEmpty(gestioneTokenPolicy) && 
							!CostantiControlStation.DEFAULT_VALUE_NON_SELEZIONATO.equals(gestioneTokenPolicy)) {
						GenericProperties gp = this.confCore.getGenericProperties(gestioneTokenPolicy, CostantiConfigurazione.GENERIC_PROPERTIES_TOKEN_TIPOLOGIA_VALIDATION, false);
						if(gp!=null && gp.sizePropertyList()>0) {
							for (Property p : gp.getPropertyList()) {
								if(org.openspcoop2.pdd.core.token.Costanti.POLICY_VALIDAZIONE_STATO.equals(p.getNome())) {
									if("true".equalsIgnoreCase(p.getValore())) {
										gestioneTokenValidazioneInput = StatoFunzionalita.ABILITATO.getValue();
									}
									else {
										gestioneTokenValidazioneInput = StatoFunzionalita.DISABILITATO.getValue();
									}
								}
								else if(org.openspcoop2.pdd.core.token.Costanti.POLICY_INTROSPECTION_STATO.equals(p.getNome())) {
									if("true".equalsIgnoreCase(p.getValore())) {
										gestioneTokenIntrospection = StatoFunzionalita.ABILITATO.getValue();
									}
									else {
										gestioneTokenIntrospection = StatoFunzionalita.DISABILITATO.getValue();
									}
								}
								else if(org.openspcoop2.pdd.core.token.Costanti.POLICY_USER_INFO_STATO.equals(p.getNome())) {
									if("true".equalsIgnoreCase(p.getValore())) {
										gestioneTokenUserInfo = StatoFunzionalita.ABILITATO.getValue();
									}
									else {
										gestioneTokenUserInfo = StatoFunzionalita.DISABILITATO.getValue();
									}
								}
								else if(org.openspcoop2.pdd.core.token.Costanti.POLICY_TOKEN_FORWARD_STATO.equals(p.getNome())) {
									if("true".equalsIgnoreCase(p.getValore())) {
										gestioneTokenForward = StatoFunzionalita.ABILITATO.getValue();
									}
									else {
										gestioneTokenForward = StatoFunzionalita.DISABILITATO.getValue();
									}
								}
							}
						}
					}
				}
			}
			
			this.controlloAccessiAdd(dati, tipoOp, controlloAccessiStato, forceAutenticato);
			
			this.controlloAccessiGestioneToken(dati, tipoOp, gestioneToken, gestioneTokenPolicyLabels, gestioneTokenPolicyValues, 
					gestioneTokenPolicy, gestioneTokenOpzionale, 
					gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenForward, null,tipoProtocollo, false,
					forceGestioneToken, forceMostraSezioneToken);
			
			this.controlloAccessiAutenticazione(dati, tipoOp, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ADD, pa, tipoProtocollo,
					erogazioneAutenticazione, null, erogazioneAutenticazioneOpzionale, erogazioneAutenticazionePrincipal, erogazioneAutenticazioneParametroList, false, erogazioneIsSupportatoAutenticazioneSoggetti,false,
					gestioneToken, gestioneTokenPolicy, autenticazioneTokenIssuer, autenticazioneTokenClientId, autenticazioneTokenSubject, autenticazioneTokenUsername, autenticazioneTokenEMail,
					false, null, 0,
					forceHttps, forceDisableOptional);
						
			this.controlloAccessiAutorizzazione(dati, tipoOp, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ADD, pa, tipoProtocollo,
					erogazioneAutenticazione, null,
					erogazioneAutorizzazione, null, 
					erogazioneAutorizzazioneAutenticati, null, 0, soggettiAutenticati, soggettiAutenticatiLabel, soggettoAutenticato,
					erogazioneAutorizzazioneRuoli, null, 0, erogazioneRuolo,
					erogazioneAutorizzazioneRuoliTipologia, erogazioneAutorizzazioneRuoliMatch, 
					false, erogazioneIsSupportatoAutenticazioneSoggetti, contaListe, false, false,autorizzazioneScope,null,0,scope,autorizzazioneScopeMatch,
					gestioneToken, gestioneTokenPolicy, 
					autorizzazioneToken, autorizzazioneTokenOptions,allegatoXacmlPolicy,
					null, 0, null, 0,
					identificazioneAttributiStato, attributeAuthorityLabels, attributeAuthorityValues, attributeAuthoritySelezionate, attributeAuthorityAttributi,
					autorizzazioneAutenticatiToken, null, 0,
					autorizzazioneRuoliToken,  null, 0, autorizzazioneRuoliTipologiaToken, autorizzazioneRuoliMatchToken);
			
		}
		
		if(tipoOp.equals(TipoOperazione.ADD) && gestioneFruitori) {
			
			// Controllo Accesso Fruizione
			
			// Creo un oggetto vuoto tanto per passare l'informazione sul tipo protocollo
			PortaDelegata pd = new PortaDelegata();
			pd.setServizio(new PortaDelegataServizio());
			pd.getServizio().setTipo(tipoServizio);
			
			this.controlloAccessiAdd(dati, tipoOp, controlloAccessiStato, false);
			
			this.controlloAccessiGestioneToken(dati, tipoOp, gestioneToken, gestioneTokenPolicyLabels, gestioneTokenPolicyValues, 
					gestioneTokenPolicy, gestioneTokenOpzionale, 
					gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenForward, null,tipoProtocollo, true,
					false);

			this.controlloAccessiAutenticazione(dati, tipoOp, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_ADD,pd, tipoProtocollo,
					fruizioneAutenticazione, null, fruizioneAutenticazioneOpzionale, fruizioneAutenticazionePrincipal, fruizioneAutenticazioneParametroList, false, true,true,
					gestioneToken, gestioneTokenPolicy, autenticazioneTokenIssuer, autenticazioneTokenClientId, autenticazioneTokenSubject, autenticazioneTokenUsername, autenticazioneTokenEMail,
					false, null, 0,
					false, false);
		
			this.controlloAccessiAutorizzazione(dati, tipoOp, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_ADD,pd, tipoProtocollo,
					fruizioneAutenticazione, null,
					fruizioneAutorizzazione, null, 
					fruizioneAutorizzazioneAutenticati, null, 0, saList, fruizioneServizioApplicativo,
					fruizioneAutorizzazioneRuoli, null, 0, fruizioneRuolo,
					fruizioneAutorizzazioneRuoliTipologia, fruizioneAutorizzazioneRuoliMatch, 
					false, true, contaListe, true, false,autorizzazioneScope,null,0,scope,autorizzazioneScopeMatch,
					gestioneToken, gestioneTokenPolicy, 
					autorizzazioneToken, autorizzazioneTokenOptions,allegatoXacmlPolicy,
					null, 0, null, 0,
					identificazioneAttributiStato, attributeAuthorityLabels, attributeAuthorityValues, attributeAuthoritySelezionate, attributeAuthorityAttributi,
					autorizzazioneAutenticatiToken, null, 0,
					autorizzazioneRuoliToken,  null, 0, autorizzazioneRuoliTipologiaToken, autorizzazioneRuoliMatchToken);
			
		}




		if (!tipoOp.equals(TipoOperazione.ADD) &&

			this.isModalitaCompleta()) {
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALTRE_INFORMAZIONI);
			de.setType(DataElementType.TITLE);
			dati.add(de);

			de = new DataElement();
			de.setType(DataElementType.LINK);
			de.setUrl(
					AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_LIST,
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id),
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, ""+idSoggettoErogatore),
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, nomeServizioEffettivo),
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, tipoServizioEffettivo)
					);
			if(contaListe){
				try{
					// BugFix OP-674
					/**int num = this.apsCore.serviziFruitoriList(Integer.parseInt(id), new Search(true)).size();*/
					ConsoleSearch searchForCount = new ConsoleSearch(true,1);
					this.apsCore.serviziFruitoriList(Integer.parseInt(id), searchForCount);
					int num = searchForCount.getNumEntries(Liste.SERVIZI_FRUITORI);
					ServletUtils.setDataElementCustomLabel(de, AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI, (long) num);
				}catch(Exception e){
					this.logError("Calcolo numero fruitori non riuscito",e);
					ServletUtils.setDataElementCustomLabel(de, AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI, AccordiServizioParteSpecificaCostanti.LABEL_N_D);
				}
			}else{
				de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI);
			}
			dati.add(de);

			de = new DataElement();
			de.setType(DataElementType.LINK);
			de.setUrl(
					AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ALLEGATI_LIST,
					new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id));
			if(contaListe){
				try{
					// BugFix OP-674
					/**int num = this.apsCore.serviziAllegatiList(Integer.parseInt(id), new Search(true)).size();*/
					ConsoleSearch searchForCount = new ConsoleSearch(true,1);
					this.apsCore.serviziAllegatiList(Integer.parseInt(id), searchForCount);
					int num = searchForCount.getNumEntries(Liste.SERVIZI_ALLEGATI);
					ServletUtils.setDataElementCustomLabel(de, AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI, (long) num);
				}catch(Exception e){
					this.logError("Calcolo numero Allegati non riuscito",e);
					ServletUtils.setDataElementCustomLabel(de, AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI, AccordiServizioParteSpecificaCostanti.LABEL_N_D);
				}
			}else{
				de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATI  );
			}
			dati.add(de);

		}

		if(cambiaAPI && !apiChanged) {
			this.pd.disableOnlyButton();
		}
		
		return dati;
	}

	public List<DataElement> addServiziToDatiAsHidden(List<DataElement> dati, String nomeservizio, String tiposervizio,
			String provider, String tipoSoggetto, String nomeSoggetto, String[] soggettiList, String[] soggettiListLabel,
			String accordo, ServiceBinding serviceBinding, String[] accordiList, String[] accordiListLabel, String servcorr, String wsdlimpler,
			String wsdlimplfru, TipoOperazione tipoOp, String id, List<String> tipi, String profilo, String portType, 
			String[] ptList, boolean privato, String uriAccordo, String descrizione, long idSoggettoErogatore,
			String statoPackage,String oldStato,String versione,
			List<String> versioni,boolean validazioneDocumenti,String [] saSoggetti, String nomeSA, String protocollo, boolean generaPACheckSoggetto) throws Exception{

		String[] tipiLabel = new String[tipi.size()];
		for (int i = 0; i < tipi.size(); i++) {
			String nomeTipo = tipi.get(i);
			tipiLabel[i] = nomeTipo;
		}

		String[] versioniValues = new String[versioni.size()+1];
		String[] versioniLabel = new String[versioni.size()+1];
		versioniLabel[0] = AccordiServizioParteSpecificaCostanti.LABEL_APS_USA_VERSIONE_EROGATORE;
		versioniValues[0] = "-";
		for (int i = 0; i < versioni.size(); i++) {
			String tmp = versioni.get(i);
			versioniLabel[i+1] = tmp;
			versioniValues[i+1] = tmp;
		}

		boolean modificaAbilitata = ( (this.isShowGestioneWorkflowStatoDocumenti()==false) || (StatiAccordo.finale.toString().equals(oldStato)==false) );

		boolean isModalitaAvanzata = this.isModalitaAvanzata();

		// accordo di servizio parte comune 
		DataElement de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ACCORDO);
		de.setValue(accordo);
		dati.add(de);

		//Servizio (portType) 
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SERVIZIO);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PORT_TYPE);
		de.setValue(portType);
		dati.add(de);

		//Sezione Soggetto Erogatore (provider)

		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_EROGATORE);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_EROGATORE);
		de.setValue(provider);
		de.setType(DataElementType.HIDDEN);
		dati.add(de);

		// Sezione Servizio 

		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_DESCRIZIONE);
		de.setSize(getSize());
		de.setValue(descrizione!=null ? descrizione : "");
		if( !modificaAbilitata && (descrizione==null || "".equals(descrizione)) )
			de.setValue(" ");
		dati.add(de);

		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
		de.setType(DataElementType.HIDDEN);
		de.setValue(statoPackage);
		de.setName(ConnettoriCostanti.PARAMETRO_CONNETTORE_HTTPS_STATO_PACKAGE);
		dati.add(de);

		//Tipo Servizio
		de = new DataElement();
		de.setValue(tiposervizio);
		de.setType(DataElementType.HIDDEN);
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO);
		dati.add(de);

		//Servizio

		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_FILE);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO  );
		de.setValue(nomeservizio);
		de.setSize(this.getSize());
		dati.add(de);
		
		// Versione Servizio
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VERSIONE);
		de.setValue(versione);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VERSIONE);
		dati.add(de);

		// SErvizio Correlato
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_SERVIZIO_CORRELATO);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_SERVIZIO_CORRELATO);
		if( this.core.isShowCorrelazioneAsincronaInAccordi() && ( !isModalitaAvanzata || (portType!=null && !"".equals(portType) && !"-".equals(portType)) ) ){
			if (  (servcorr != null) && ((servcorr.equals(Costanti.CHECK_BOX_ENABLED)) || servcorr.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_ABILITATO)) ) {
				de.setValue(Costanti.CHECK_BOX_ENABLED);
			}
			else{
				de.setValue(Costanti.CHECK_BOX_DISABLED);
			}
		}
		else if (  (servcorr != null) && ((servcorr.equals(Costanti.CHECK_BOX_ENABLED)) || servcorr.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_ABILITATO)) ) {
			if(tipoOp.equals(TipoOperazione.ADD) || modificaAbilitata){
				de.setSelected(Costanti.CHECK_BOX_ENABLED);
			}else{
				de.setValue(Costanti.CHECK_BOX_ENABLED);
			}
		}else{
			if(tipoOp.equals(TipoOperazione.CHANGE) && (this.isShowGestioneWorkflowStatoDocumenti() 
					&&  StatiAccordo.finale.toString().equals(oldStato) )){
				de.setValue(Costanti.CHECK_BOX_DISABLED);
			}
		}
		dati.add(de);

		if( (tipoOp.equals(TipoOperazione.CHANGE) &&
				(this.isShowGestioneWorkflowStatoDocumenti() &&  StatiAccordo.finale.toString().equals(oldStato) )) 
				||
				(this.core.isShowCorrelazioneAsincronaInAccordi() &&
						( !isModalitaAvanzata || 
								(portType!=null && !"".equals(portType) && !"-".equals(portType)) )) ){
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPOLOGIA_SERVIZIO);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_SERVIZIO_CORRELATO_LABEL);
			if (  (servcorr != null) && ((servcorr.equals(Costanti.CHECK_BOX_ENABLED)) || servcorr.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_ABILITATO)) ) {
				de.setValue(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_CORRELATO);
			}else{
				de.setValue(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_NORMALE);
			}
			//			if(this.core.isProfiloDiCollaborazioneAsincronoSupportatoDalProtocollo(protocollo)){	
			//				de.setType(DataElementType.TEXT);
			//			} else {
			de.setType(DataElementType.HIDDEN);
			//			}
			dati.add(de);
		}

		//Privato
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PRIVATO);
		//		if (this.core.isShowFlagPrivato() &&  (tipoOp.equals(TipoOperazione.ADD) || 
		//				modificaAbilitata) && isModalitaAvanzata) {
		//			de.setType(DataElementType.CHECKBOX);
		//			de.setSelected(privato ? Costanti.CHECK_BOX_ENABLED : "");
		//		} else {
		de.setType(DataElementType.HIDDEN);
		de.setValue(privato ? Costanti.CHECK_BOX_ENABLED : Costanti.CHECK_BOX_DISABLED);
		//		}
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PRIVATO);
		dati.add(de);

		if(this.core.isShowFlagPrivato() && tipoOp.equals(TipoOperazione.CHANGE ) && 
				(this.isShowGestioneWorkflowStatoDocumenti() && 
						StatiAccordo.finale.toString().equals(oldStato) ) &&
						isModalitaAvanzata){
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VISIBILITA_SERVIZIO);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PRIVATO_LABEL);
			if(privato){
				de.setValue(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_PRIVATA);
			}else{
				de.setValue(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_PUBBLICA);
			}
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
		}

		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VERSIONE_PROTOCOLLO);
		//		if(isModalitaAvanzata){
		//			if(tipoOp.equals(TipoOperazione.ADD) || modificaAbilitata){
		//				de.setValues(versioniValues);
		//				de.setLabels(versioniLabel);
		//				if(profilo==null){
		//					profilo="-";
		//				}
		//				de.setSelected(profilo);
		//				de.setType(DataElementType.SELECT);
		//			}else{
		//				de.setType(DataElementType.TEXT);
		//				de.setValue(profilo);
		//				if( profilo==null || "".equals(profilo) )
		//					de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_USA_VERSIONE_EROGATORE);
		//			}
		//		}else {
		de.setType(DataElementType.HIDDEN);
		if(profilo==null){
			profilo="-";
		}
		de.setValue(profilo);
		//		}
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROFILO);
		de.setSize(this.getSize());
		dati.add(de);


		// Porta Applicativa e Servizio Applicativo Erogatore
		if (tipoOp.equals(TipoOperazione.ADD) && !ServletUtils.isCheckBoxEnabled(servcorr) && generaPACheckSoggetto) {

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_SERVIZIO_APPLICATIVO_EROGATORE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SA);
			de.setType(DataElementType.HIDDEN);
			de.setValue(nomeSA);
			//			de.setValues(saSoggetti);
			//			de.setType(DataElementType.SELECT);
			dati.add(de);
		}

		//Specifica dei porti di accesso

		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VALIDAZIONE_DOCUMENTI_ESTESA);
		de.setValue(""+validazioneDocumenti);
		//		if (tipoOp.equals(TipoOperazione.ADD) && InterfaceType.AVANZATA.equals(user.getInterfaceType())) {
		//			if (tipoOp.equals(TipoOperazione.ADD) ) {
		//				de.setType(DataElementType.CHECKBOX);
		//				if(validazioneDocumenti){
		//					de.setSelected(Costanti.CHECK_BOX_ENABLED);
		//				}else{
		//					de.setSelected(Costanti.CHECK_BOX_DISABLED);
		//				}
		//			}else{
		de.setType(DataElementType.HIDDEN);
		//			}
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VALIDAZIONE_DOCUMENTI);
		de.setSize(this.getSize());
		dati.add(de);


		de = new DataElement();
		de.setValue(wsdlimpler);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
		dati.add(de);

		de = new DataElement();
		de.setValue(wsdlimplfru);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE);
		dati.add(de);

		return dati;
	}



	public List<DataElement> addWSDLToDati(TipoOperazione tipoOp,  
			int size,
			AccordoServizioParteSpecifica asps, String oldwsdl,
			String tipo, boolean validazioneDocumenti,
			List<DataElement> dati,
			String tipologiaDocumentoScaricare, String label) {

		boolean isModalitaAvanzata = this.isModalitaAvanzata();

		DataElement de = new DataElement();
		if(label.contains(" di ")){
			de.setLabel(label.split(" di")[0]);
		}else{
			de.setLabel(tipologiaDocumentoScaricare.toUpperCase().charAt(0)+tipologiaDocumentoScaricare.substring(1));
		}
		de.setType(DataElementType.TITLE);
		dati.add(de);
		
		de = new DataElement();
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO);
		de.setValue( tipo);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO);
		dati.add(de);

		if( this.isShowGestioneWorkflowStatoDocumenti() && StatiAccordo.finale.toString().equals(asps.getStatoPackage())){
			this.pd.setMode(Costanti.DATA_ELEMENT_EDIT_MODE_DISABLE_NAME);

			if(this.core.isShowInterfacceAPI()) {
				de = new DataElement();
				de.setLabel("");
				de.setType(DataElementType.TEXT_AREA_NO_EDIT);
				de.setValue(oldwsdl);
				de.setRows(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_SIZE);
				de.setCols(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_COLUMNS);
				dati.add(de);
			}
			
			if(oldwsdl != null && !oldwsdl.isEmpty()){
				DataElement saveAs = new DataElement();
				saveAs.setValue(AccordiServizioParteComuneCostanti.LABEL_DOWNLOAD);
				saveAs.setType(DataElementType.LINK);
				saveAs.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, 
						new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ALLEGATI_ID_ACCORDO, asps.getId()+""),
						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_ACCORDO_PARTE_SPECIFICA));
				saveAs.setDisabilitaAjaxStatus();
				dati.add(saveAs);
			}else {
				de = new DataElement();
//				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_ATTUALE );
				de.setType(DataElementType.TEXT);
				de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_NOT_FOUND);
				dati.add(de);
			}
			
		}
		else{

			if(oldwsdl != null && !oldwsdl.isEmpty()){
				if(this.core.isShowInterfacceAPI()) {
					de = new DataElement();
					de.setType(DataElementType.TEXT_AREA_NO_EDIT);
					de.setValue(oldwsdl);
					de.setRows(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_SIZE);
					de.setCols(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_COLUMNS);
					//de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_ATTUALE);
					dati.add(de);
				}

				DataElement saveAs = new DataElement();
				saveAs.setValue(AccordiServizioParteComuneCostanti.LABEL_DOWNLOAD);
				saveAs.setType(DataElementType.LINK);
				saveAs.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, 
						new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ALLEGATI_ID_ACCORDO, asps.getId()+""),
						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_ACCORDO_PARTE_SPECIFICA));
				saveAs.setDisabilitaAjaxStatus();
				dati.add(saveAs);
				
				de = new DataElement();
				de.setType(DataElementType.TITLE);
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_AGGIORNAMENTO);
				de.setValue("");
				de.setSize(this.getSize());
				dati.add(de);
			}else {
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_ATTUALE );
				de.setType(DataElementType.TEXT);
				de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_NOT_FOUND);
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VALIDAZIONE_DOCUMENTI);
			de.setValue("" + validazioneDocumenti);
			if (isModalitaAvanzata) {
				de.setType(DataElementType.CHECKBOX);
				if( validazioneDocumenti){
					de.setSelected(Costanti.CHECK_BOX_ENABLED);
				}else{
					de.setSelected(Costanti.CHECK_BOX_DISABLED);
				}
			}else{
				de.setType(DataElementType.HIDDEN);
			}
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VALIDAZIONE_DOCUMENTI);
			de.setSize(size);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_NUOVO);
			de.setValue("");
			de.setType(DataElementType.FILE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL);
			de.setSize(size);
			dati.add(de);
			
			if(oldwsdl != null && !oldwsdl.isEmpty()){
				de = new DataElement();
				de.setBold(true);
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_CHANGE_CLEAR_WARNING);
				de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_CHANGE_CLEAR);
				de.setType(DataElementType.NOTE);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_WARN);
				de.setSize(this.getSize());
				dati.add(de);
			}
		}

		return dati;
	}


	public List<DataElement> addTipoNomeServizioToDati(TipoOperazione tipoOp,  String myId, String tipoServizio, String nomeServizio, Integer versioneServizio, List<DataElement> dati ){
		DataElement de = new DataElement();

		if(nomeServizio !=null){
			de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO);
			de.setType(DataElementType.HIDDEN);
			de.setValue(nomeServizio);
			dati.add(de);
		}

		if(tipoServizio != null){
			de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO);
			de.setType(DataElementType.HIDDEN);
			de.setValue(tipoServizio);
			dati.add(de);
		}
		
		if(versioneServizio != null){
			de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VERSIONE);
			de.setType(DataElementType.HIDDEN);
			de.setValue(versioneServizio.intValue()+"");
			dati.add(de);
		}

		if(myId != null){
			de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID);
			de.setType(DataElementType.HIDDEN);
			de.setValue(myId);
			dati.add(de);
		}

		return dati;
	}


	public List<DataElement> addFruitoreWSDLToDati(TipoOperazione tipoOp, 
			String tipo, String idSoggettoErogatoreDelServizio, String idSoggettoFruitore, String wsdl, Boolean validazioneDocumenti,
			Fruitore myFru,
			List<DataElement> dati,
			String id, String tipologiaDocumentoScaricare,
			boolean finished, String label) {

		boolean isModalitaAvanzata = this.isModalitaAvanzata();

		DataElement de = new DataElement();
		if(label.contains(" di ")){
			de.setLabel(label.split(" di")[0]);
		}else{
			de.setLabel(tipologiaDocumentoScaricare.toUpperCase().charAt(0)+tipologiaDocumentoScaricare.substring(1));
		}
		de.setType(DataElementType.TITLE);
		dati.add(de);
		
		de = new DataElement();
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO);
		de.setValue( tipo);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO);
		dati.add(de);

		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ID_SOGGETTO_EROGATORE);
		de.setValue( idSoggettoErogatoreDelServizio);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE);
		dati.add(de);
		
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_FRUITORE);
		de.setValue( idSoggettoFruitore);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE);
		dati.add(de);



		if(this.isShowGestioneWorkflowStatoDocumenti() && StatiAccordo.finale.toString().equals(myFru.getStatoPackage())){
			
			this.pd.setMode(Costanti.DATA_ELEMENT_EDIT_MODE_DISABLE_NAME);
			
			if(wsdl != null && !wsdl.isEmpty()){
				this.pd.setMode(Costanti.DATA_ELEMENT_EDIT_MODE_DISABLE_NAME);
				
				if(this.core.isShowInterfacceAPI()) {
					de = new DataElement();
					de.setLabel("");
					de.setType(DataElementType.TEXT_AREA_NO_EDIT);
					de.setValue( wsdl);
					de.setRows(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_SIZE);
					de.setCols(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_COLUMNS);
					dati.add(de);
				}
				
				if(wsdl != null && !wsdl.isEmpty()){
					DataElement saveAs = new DataElement();
					saveAs.setValue(AccordiServizioParteComuneCostanti.LABEL_DOWNLOAD);
					saveAs.setType(DataElementType.LINK);
					saveAs.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, 
							new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ALLEGATI_ID_ACCORDO, id),
							new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO, tipologiaDocumentoScaricare),
							new Parameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_IMPLEMENTATIVO_TIPO_SOGGETTO_FRUITORE, myFru.getTipo()),
							new Parameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_IMPLEMENTATIVO_NOME_SOGGETTO_FRUITORE, myFru.getNome()),
							new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO, ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_PARTE_SPECIFICA));
					saveAs.setDisabilitaAjaxStatus();
					dati.add(saveAs);
				}
			}
			else{
				de = new DataElement();
				//de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_ATTUALE );
				de.setType(DataElementType.TEXT);
				de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_NOT_FOUND);
				dati.add(de);
			}
		}
		else{

			if(wsdl != null && !wsdl.isEmpty()){
				if(this.core.isShowInterfacceAPI()) {
					de = new DataElement();
					de.setType(DataElementType.TEXT_AREA_NO_EDIT);
					de.setValue(wsdl);
					de.setRows(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_SIZE);
					de.setCols(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_COLUMNS);
					//de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_ATTUALE );
					dati.add(de);
				}

				DataElement saveAs = new DataElement();
				saveAs.setValue(AccordiServizioParteComuneCostanti.LABEL_DOWNLOAD);
				saveAs.setType(DataElementType.LINK);
				saveAs.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, 
						new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ALLEGATI_ID_ACCORDO, id),
						new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO, tipologiaDocumentoScaricare),
						new Parameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_IMPLEMENTATIVO_TIPO_SOGGETTO_FRUITORE, myFru.getTipo()),
						new Parameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_IMPLEMENTATIVO_NOME_SOGGETTO_FRUITORE, myFru.getNome()),
						new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO, ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_PARTE_SPECIFICA));
				saveAs.setDisabilitaAjaxStatus();
				dati.add(saveAs);
				
				if(!finished){
					de = new DataElement();
					de.setType(DataElementType.TITLE);
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_AGGIORNAMENTO);
					de.setValue("");
					de.setSize(this.getSize());
					dati.add(de);
				}
			}else {
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_ATTUALE );
				de.setType(DataElementType.TEXT);
				de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_NOT_FOUND);
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VALIDAZIONE_DOCUMENTI);
			de.setValue("" + validazioneDocumenti);
			if (isModalitaAvanzata && !finished) {
				de.setType(DataElementType.CHECKBOX);
				if( validazioneDocumenti){
					de.setSelected(Costanti.CHECK_BOX_ENABLED);
				}else{
					de.setSelected(Costanti.CHECK_BOX_DISABLED);
				}
			}else{
				de.setType(DataElementType.HIDDEN);
			}
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VALIDAZIONE_DOCUMENTI);
			de.setSize( getSize());
			dati.add(de);

			if(!finished){
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_NUOVO);
				de.setValue("");
				de.setType(DataElementType.FILE);
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL);
				de.setSize( getSize());
				dati.add(de);
				
				if(wsdl != null && !wsdl.isEmpty()){
					de = new DataElement();
					de.setBold(true);
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_CHANGE_CLEAR_WARNING);
					de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_WSDL_CHANGE_CLEAR);
					de.setType(DataElementType.NOTE);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_WARN);
					de.setSize(this.getSize());
					dati.add(de);
				}
			}
		}
		return dati;
	}


	public List<DataElement> addServiziFruitoriToDati(List<DataElement> dati, String idSoggettoFruitore, BinaryParameter wsdlimpler, 
			BinaryParameter wsdlimplfru, String[] soggettiList, String[] soggettiListLabel, String idServ, String id, 
			TipoOperazione tipoOp, String idSoggettoErogatoreDelServizio, String nomeprov, String tipoprov,
			String nomeservizio, String tiposervizio, Integer versioneservizio, String correlato, String stato, String oldStato, String statoServizio,
			String tipoAccordo, boolean validazioneDocumenti,
			String controlloAccessiStato,
			String fruizioneServizioApplicativo,String fruizioneRuolo,String fruizioneAutenticazione,String fruizioneAutenticazioneOpzionale, TipoAutenticazionePrincipal fruizioneAutenticazionePrincipal, List<String> fruizioneAutenticazioneParametroList, String fruizioneAutorizzazione,
			String fruizioneAutorizzazioneAutenticati,String fruizioneAutorizzazioneRuoli, String fruizioneAutorizzazioneRuoliTipologia, String fruizioneAutorizzazioneRuoliMatch,
			List<String> saList, ServiceBinding serviceBinding, org.openspcoop2.protocol.manifest.constants.InterfaceType interfaceType,
			String azioneConnettore, String azioneConnettoreIdPorta, String accessoDaAPSParametro, Integer parentPD,
			String gestioneToken, String[] gestioneTokenPolicyLabels, String[] gestioneTokenPolicyValues,
			String gestioneTokenPolicy, String gestioneTokenOpzionale, 
			String gestioneTokenValidazioneInput, String gestioneTokenIntrospection, String gestioneTokenUserInfo, String gestioneTokenForward,
			String autenticazioneTokenIssuer,String autenticazioneTokenClientId,String autenticazioneTokenSubject,String autenticazioneTokenUsername,String autenticazioneTokenEMail,
			String autorizzazioneToken, String autorizzazioneTokenOptions,
			String autorizzazioneScope,  String scope, String autorizzazioneScopeMatch,BinaryParameter allegatoXacmlPolicy,
			String identificazioneAttributiStato, String[] attributeAuthorityLabels, String[] attributeAuthorityValues, String [] attributeAuthoritySelezionate, String attributeAuthorityAttributi,
			String autorizzazioneAutenticatiToken, 
			String autorizzazioneRuoliToken,  String autorizzazioneRuoliTipologiaToken, String autorizzazioneRuoliMatchToken) throws Exception {
		
		boolean isRuoloNormale = !(correlato != null && correlato.equals(AccordiServizioParteSpecificaCostanti.DEFAULT_VALUE_CORRELATO));

		String protocollo = this.apsCore.getProtocolloAssociatoTipoServizio(tiposervizio);

		boolean isProfiloAsincronoSupportatoDalProtocollo = this.core.isProfiloDiCollaborazioneAsincronoSupportatoDalProtocollo(protocollo,serviceBinding);

		boolean ripristinoStatoOperativo = this.core.isGestioneWorkflowStatoDocumentiRipristinoStatoOperativoDaFinale();

		Boolean contaListe = ServletUtils.getContaListeFromSession(this.session);
		
		boolean showPortiAccesso = this.apcCore.showPortiAccesso(protocollo, serviceBinding, interfaceType);
		
		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;
			}
		}
		
		String tmpModificaProfilo = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_PROFILO);
		@SuppressWarnings("unused")
		boolean modificaProfilo = false;
		if(tmpModificaProfilo!=null) {
			modificaProfilo = "true".equals(tmpModificaProfilo);
			
			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_PROFILO);
			de.setValue(tmpModificaProfilo);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
		}
		
		if(azioneConnettore!=null && !"".equals(azioneConnettore)) {
			DataElement de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setValue(azioneConnettore);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_FRUITORE_VIEW_CONNETTORE_MAPPING_AZIONE);
			dati.add(de);
		}
		
		if(azioneConnettoreIdPorta!=null && !"".equals(azioneConnettoreIdPorta)) {
			DataElement de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setValue(azioneConnettoreIdPorta);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_FRUITORE_VIEW_CONNETTORE_MAPPING_AZIONE_ID_PORTA);
			dati.add(de);
		}
		
		if(accessoDaAPSParametro!=null && !"".equals(accessoDaAPSParametro)) {
			DataElement de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setValue(accessoDaAPSParametro);
			de.setName(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_CONNETTORE_DA_LISTA_APS);
			dati.add(de);
		}
		
		if (tipoOp.equals(TipoOperazione.ADD)) {

			DataElement de = new DataElement();
			de.setType(DataElementType.TITLE);
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORE);
			dati.add(de);
			
			// in caso di add allora visualizzo la lista dei soggetti
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_FRUITORE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE);
			de.setType(DataElementType.SELECT);
			de.setValues(soggettiList);
			de.setLabels(soggettiListLabel);
			de.setSelected(idSoggettoFruitore);
			de.setPostBack(true);
			dati.add(de);

			
			if(this.isShowGestioneWorkflowStatoDocumenti()){
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
				if (this.isModalitaStandard()) {
					de.setType(DataElementType.HIDDEN);
					de.setValue(statoServizio);
				}else{
					de.setType(DataElementType.SELECT);
					de.setValues(StatiAccordo.toArray());
					de.setLabels(StatiAccordo.toLabel());
					de.setSelected(stato);
				}
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
				dati.add(de);
			}else{
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
				de.setType(DataElementType.HIDDEN);
				de.setValue(StatiAccordo.finale.toString());
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
				dati.add(de);
			}

			boolean isSoggettoGestitoPorta = false;
			String protocolloSoggettoGestitoPorta = null;
			if(soggettiList!=null && soggettiList.length>0){
				String soggettoId = idSoggettoFruitore;
				if(soggettoId==null || "".equals(soggettoId)){
					soggettoId = soggettiList[0];
				}
				Soggetto sogg = this.soggettiCore.getSoggettoRegistro(Long.parseLong(soggettoId));
				if(!this.pddCore.isPddEsterna(sogg.getPortaDominio())){
					isSoggettoGestitoPorta = true;	
					protocolloSoggettoGestitoPorta = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(sogg.getTipo());
				}
			}




			if(isSoggettoGestitoPorta){
				
				this.controlloAccessiAdd(dati, tipoOp, controlloAccessiStato, false);
				
				this.controlloAccessiGestioneToken(dati, tipoOp, gestioneToken, gestioneTokenPolicyLabels, gestioneTokenPolicyValues, 
						gestioneTokenPolicy, gestioneTokenOpzionale,
						gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenForward, null,protocolloSoggettoGestitoPorta,true,
						false);

				this.controlloAccessiAutenticazione(dati, tipoOp, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_ADD,null,protocolloSoggettoGestitoPorta,
						fruizioneAutenticazione, null, fruizioneAutenticazioneOpzionale, fruizioneAutenticazionePrincipal, fruizioneAutenticazioneParametroList, false, true,true,
						gestioneToken, gestioneTokenPolicy, autenticazioneTokenIssuer, autenticazioneTokenClientId, autenticazioneTokenSubject, autenticazioneTokenUsername, autenticazioneTokenEMail,
						false, null, 0,
						false, false);
				
				this.controlloAccessiAutorizzazione(dati, tipoOp, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_ADD,null,protocolloSoggettoGestitoPorta,
						fruizioneAutenticazione, null,
						fruizioneAutorizzazione, null, 
						fruizioneAutorizzazioneAutenticati, null, 0, saList, fruizioneServizioApplicativo,
						fruizioneAutorizzazioneRuoli, null, 0, fruizioneRuolo,
						fruizioneAutorizzazioneRuoliTipologia, fruizioneAutorizzazioneRuoliMatch, 
						false, true, contaListe, true, false,autorizzazioneScope,null,0,scope,autorizzazioneScopeMatch,
						gestioneToken, gestioneTokenPolicy, 
						autorizzazioneToken, autorizzazioneTokenOptions,allegatoXacmlPolicy,
						null, 0, null, 0,
						identificazioneAttributiStato, attributeAuthorityLabels, attributeAuthorityValues, attributeAuthoritySelezionate, attributeAuthorityAttributi,
						autorizzazioneAutenticatiToken, null, 0,
						autorizzazioneRuoliToken, null, 0, autorizzazioneRuoliTipologiaToken, autorizzazioneRuoliMatchToken);
	
			}

			if(serviceBinding.equals(ServiceBinding.SOAP) && interfaceType.equals(org.openspcoop2.protocol.manifest.constants.InterfaceType.WSDL_11) && showPortiAccesso){
			
				if (this.isModalitaAvanzata()) {
					de = new DataElement();
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SPECIFICA_PORTI_ACCESSO );
					de.setType(DataElementType.TITLE);
					dati.add(de);
				}
	
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VALIDAZIONE_DOCUMENTI_ESTESA);
				de.setValue(""+validazioneDocumenti);
				if (tipoOp.equals(TipoOperazione.ADD) && this.isModalitaAvanzata()) {
					de.setType(DataElementType.CHECKBOX);
					if(validazioneDocumenti){
						de.setSelected(Costanti.CHECK_BOX_ENABLED);
					}else{
						de.setSelected(Costanti.CHECK_BOX_DISABLED);
					}
				}else{
					de.setType(DataElementType.HIDDEN);
				}
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VALIDAZIONE_DOCUMENTI);
				de.setSize(this.getSize());
				dati.add(de);
	
				if(this.isModalitaAvanzata()){
					if(isProfiloAsincronoSupportatoDalProtocollo){
						if(isRuoloNormale){
							dati.add(wsdlimpler.getFileDataElement(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_EROGATORE_COMPATTO, "", getSize()));
							dati.addAll(wsdlimpler.getFileNameDataElement());
							dati.add(wsdlimpler.getFileIdDataElement());
							
	//						de = new DataElement();
	//						de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_EROGATORE);
	//						de.setValue("");
	//						de.setType(DataElementType.FILE);
	//						de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
	//						de.setSize(this.getSize());
	//						dati.add(de);
						}else {
							dati.add(wsdlimplfru.getFileDataElement(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_FRUITORE_COMPATTO, "", getSize()));
							dati.addAll(wsdlimplfru.getFileNameDataElement());
							dati.add(wsdlimplfru.getFileIdDataElement());
							
	//						de = new DataElement();
	//						de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_FRUITORE);
	//						de.setValue("");
	//						de.setType(DataElementType.FILE);
	//						de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE);
	//						de.setSize(this.getSize());
	//						dati.add(de);
						}
					} else {
						dati.add(wsdlimpler.getFileDataElement(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO, "", getSize()));
						dati.addAll(wsdlimpler.getFileNameDataElement());
						dati.add(wsdlimpler.getFileIdDataElement());
						
	//					de = new DataElement();
	//					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO);
	//					de.setValue("");
	//					de.setType(DataElementType.FILE);
	//					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
	//					de.setSize(this.getSize());
	//					dati.add(de);
					}
				} else {
					de = new DataElement();
					de.setValue("");
					de.setType(DataElementType.HIDDEN);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
					dati.add(de);
	
	
					de = new DataElement();
					de.setValue("");
					de.setType(DataElementType.HIDDEN);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE);
					dati.add(de);
				}
				
			}
				
		} else {
					
			boolean viewOnlyConnettore = gestioneFruitori || (PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT_CONFIGURAZIONE==parentPD);
			
			if(!viewOnlyConnettore) {
				DataElement de = new DataElement();
				de.setType(DataElementType.TITLE);
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORE);
				dati.add(de);
			}
			
			DataElement de = new DataElement();
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE);
			de.setValue(idSoggettoFruitore);
			de.setType(DataElementType.HIDDEN);
			dati.add(de);
						
			// in caso di change non visualizzo la select list ma il tipo e il
			// nome del soggetto
			String nomeSoggetto = "";
			for (int i = 0; i < soggettiList.length; i++) {
				if (soggettiList[i].equals(idSoggettoFruitore)) {
					nomeSoggetto = soggettiListLabel[i];
					break;
				}
			}
			
			if(this.apsCore.isRegistroServiziLocale()){
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_FRUITORE);
				String [] split = nomeSoggetto.split("/");
				IDSoggetto idSoggetto = new IDSoggetto(split[0], split[1]);
				de.setValue(this.getLabelNomeSoggetto(protocollo, idSoggetto.getTipo(), idSoggetto.getNome()));
				if(!viewOnlyConnettore) {
					de.setType(DataElementType.TEXT);
				}
				else {
					de.setType(DataElementType.HIDDEN);
				}
				dati.add(de);
			}
			
			if(this.isModalitaCompleta() && !viewOnlyConnettore) {
				de = new DataElement();
				if(this.apsCore.isRegistroServiziLocale()){
					de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_VISUALIZZA_DATI_FRUITORE);
					//de.setValue(nomeSoggetto);
					String [] split = nomeSoggetto.split("/");
					IDSoggetto idSoggetto = new IDSoggetto(split[0], split[1]);
					long idSoggettoLong = this.soggettiCore.getIdSoggetto(idSoggetto.getNome(), idSoggetto.getTipo());
					de.setType(DataElementType.LINK);
					de.setUrl(SoggettiCostanti.SERVLET_NAME_SOGGETTI_CHANGE,
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_ID,idSoggettoLong+""),
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_NOME,idSoggetto.getNome()),
							new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_TIPO,idSoggetto.getTipo()));
				}
				else{
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE_AS_TEXT);
					de.setValue(nomeSoggetto);
					de.setType(DataElementType.TEXT);
				}
				dati.add(de);
			}

						
			if(this.isShowGestioneWorkflowStatoDocumenti() && this.isModalitaCompleta() && !viewOnlyConnettore) {
				de = new DataElement();
				de.setType(DataElementType.TITLE);
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
			if(this.isShowGestioneWorkflowStatoDocumenti()){
				if(viewOnlyConnettore) {
					de.setType(DataElementType.HIDDEN);
					de.setValue(stato);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
				}
				else if(StatiAccordo.finale.toString().equals(oldStato)==false ){
					de.setType(DataElementType.SELECT);
					de.setValues(StatiAccordo.toArray());
					de.setLabels(StatiAccordo.toLabel());
					de.setSelected(stato);
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
				}else{
//					if (!isModalitaAvanzata) {
//						de.setType(DataElementType.HIDDEN);
//						de.setValue(StatiAccordo.finale.toString());
//						de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
//					}else{
					
					DataElement deLabel = new DataElement();
					deLabel.setType(DataElementType.TEXT);
					deLabel.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
					deLabel.setValue(StatiAccordo.upper(StatiAccordo.finale.toString()));
					deLabel.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO+CostantiControlStation.PARAMETRO_SUFFIX_LABEL);
					dati.add(deLabel);
					
					de.setType(DataElementType.HIDDEN);
					de.setValue(StatiAccordo.finale.toString());
					de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);

					if(ripristinoStatoOperativo){
						dati.add(de);

						de = new DataElement();
						de.setType(DataElementType.LINK);

						Parameter pIdSoggettoErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatoreDelServizio);
						Parameter pId = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, idServ);
						Parameter pMyId = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, id);		
						Parameter pFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE, idSoggettoFruitore);		

						de.setUrl(
								AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_CHANGE,
								pId,	pMyId, pIdSoggettoErogatore ,pFruitore,
								new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_RIPRISTINA_STATO, StatiAccordo.operativo.toString()),
								new Parameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME, Costanti.DATA_ELEMENT_EDIT_MODE_VALUE_EDIT_IN_PROGRESS));
						de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_RIPRISTINA_STATO_OPERATIVO);
					}
//					}
				}
			}else{
				de.setType(DataElementType.HIDDEN);
				de.setValue(StatiAccordo.finale.toString());
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
			}
			dati.add(de);
			
			
			// &correlato
			Parameter pCorrelato = null;
			if (correlato != null) {
				pCorrelato = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CORRELATO, correlato);
			}

			Parameter pTipoWSDLEr = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
			Parameter pTipoWSDLFru = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE);
			Parameter pId = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, id);
			Parameter pIdSoggettoErogatore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatoreDelServizio);
			Parameter pIdSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE, idSoggettoFruitore);
			
			Parameter pIdServ = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SERVIZIO, idServ);

			Parameter pNomeProv = new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_NOME, nomeprov);
			Parameter pTipoProv = new Parameter(SoggettiCostanti.PARAMETRO_SOGGETTO_TIPO, tipoprov);
			Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, nomeservizio);
			Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, tiposervizio);
			Parameter pVersioneServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VERSIONE, versioneservizio.intValue()+"");

			Parameter pTipoAccordo = AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo);


			if(!viewOnlyConnettore && serviceBinding.equals(ServiceBinding.SOAP) && interfaceType.equals(org.openspcoop2.protocol.manifest.constants.InterfaceType.WSDL_11) && showPortiAccesso){
				if (this.isModalitaAvanzata()) {
	
					de = new DataElement();
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SPECIFICA_PORTI_ACCESSO );
					de.setType(DataElementType.TITLE);
					dati.add(de);
	
					if(isProfiloAsincronoSupportatoDalProtocollo){
						List<Parameter> lstParam = new ArrayList<>();
	
						if(isRuoloNormale){
							lstParam = new ArrayList<>();
							lstParam.add(pId);
							lstParam.add(pIdSoggettoErogatore);
							lstParam.add(pIdSoggettoFruitore);
							lstParam.add(pTipoWSDLEr);
							if(pCorrelato != null){
								lstParam.add(pCorrelato);
							}
	
							de = new DataElement();
							de.setType(DataElementType.LINK);
							if (tipoOp.equals(TipoOperazione.CHANGE)) {
								de.setUrl( AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_WSDL_CHANGE, lstParam.toArray(new Parameter[lstParam.size()]));
							} else {
								lstParam.add(pIdServ);
								lstParam.add(pNomeProv);
								lstParam.add(pTipoProv);
								lstParam.add(pNomeServizio);
								lstParam.add(pTipoServizio);
								lstParam.add(pVersioneServizio);
								lstParam.add(pTipoAccordo);
	
								de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_WSDL_CHANGE,
										lstParam.toArray(new Parameter[lstParam.size()]));
	
								//					de.setUrl("accordiErogatoriFruitoriWSDLChange.do?id=" + id + "&tipo=wsdlimpler" + "&idSoggErogatore=" + idSoggettoErogatoreDelServizio + 
								//							"&idServ=" + idServ + "&nomeprov=" + nomeprov + "&tipoprov=" + tipoprov + "&nomeservizio=" + nomeservizio + 
								//							"&tiposervizio=" + tiposervizio + tmpCorrelato+
								//							AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo, "&"));
							}
							de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_EROGATORE_ESTESO);
							dati.add(de);
						}else {
							lstParam = new ArrayList<>();
							lstParam.add(pId);
							lstParam.add(pIdSoggettoErogatore);
							lstParam.add(pIdSoggettoFruitore);
							lstParam.add(pTipoWSDLFru);
							if(pCorrelato != null){
								lstParam.add(pCorrelato);
							}
	
							de = new DataElement();
							de.setType(DataElementType.LINK);
							if (tipoOp.equals(TipoOperazione.CHANGE)) {
								de.setUrl( AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_WSDL_CHANGE, lstParam.toArray(new Parameter[lstParam.size()]));
							} else {
								lstParam.add(pIdServ);
								lstParam.add(pNomeProv);
								lstParam.add(pTipoProv);
								lstParam.add(pNomeServizio);
								lstParam.add(pTipoServizio);
								lstParam.add(pVersioneServizio);
								lstParam.add(pTipoAccordo);
	
								de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_WSDL_CHANGE,
										lstParam.toArray(new Parameter[lstParam.size()]));
	
								//					de.setUrl("accordiErogatoriFruitoriWSDLChange.do?id=" + id + "&tipo=wsdlimplfru" + "&idSoggErogatore=" + idSoggettoErogatoreDelServizio + 
								//							"&idServ=" + idServ + "&nomeprov=" + nomeprov + "&tipoprov=" + tipoprov + "&nomeservizio=" + nomeservizio + "&tiposervizio=" + 
								//							tiposervizio + tmpCorrelato+
								//							AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo, "&"));
							}
							de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO_FRUITORE_ESTESO);
							dati.add(de);
						}
					}else {
						List<Parameter> lstParam = new ArrayList<>();
						lstParam.add(pId);
						lstParam.add(pIdSoggettoErogatore);
						lstParam.add(pIdSoggettoFruitore);
						lstParam.add(pTipoWSDLEr);
						if(pCorrelato != null){
							lstParam.add(pCorrelato);
						}
	
						de = new DataElement();
						de.setType(DataElementType.LINK);
						if (tipoOp.equals(TipoOperazione.CHANGE)) {
							de.setUrl( AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_WSDL_CHANGE, lstParam.toArray(new Parameter[lstParam.size()]));
						} else {
							lstParam.add(pIdServ);
							lstParam.add(pNomeProv);
							lstParam.add(pTipoProv);
							lstParam.add(pNomeServizio);
							lstParam.add(pTipoServizio);
							lstParam.add(pVersioneServizio);
							lstParam.add(pTipoAccordo);
	
							de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_WSDL_CHANGE,
									lstParam.toArray(new Parameter[lstParam.size()]));
	
							//					de.setUrl("accordiErogatoriFruitoriWSDLChange.do?id=" + id + "&tipo=wsdlimpler" + "&idSoggErogatore=" + idSoggettoErogatoreDelServizio + 
							//							"&idServ=" + idServ + "&nomeprov=" + nomeprov + "&tipoprov=" + tipoprov + "&nomeservizio=" + nomeservizio + 
							//							"&tiposervizio=" + tiposervizio + tmpCorrelato+
							//							AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo, "&"));
						}
						de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_WSDL_IMPLEMENTATIVO);
						dati.add(de);
					}
				}
			}
		}

		return dati;
	}

	public List<DataElement> addServiziFruitoriToDatiAsHidden(List<DataElement> dati, String idSoggettoFruitore, String wsdlimpler, 
			String wsdlimplfru, String[] soggettiList, String[] soggettiListLabel, String idServ, String id, 
			TipoOperazione tipoOp, String idSoggettoErogatoreDelServizio, String nomeprov, String tipoprov,
			String nomeservizio, String tiposervizio, String correlato, String stato, String oldStato, String statoServizio,
			String tipoAccordo, boolean validazioneDocumenti,
			String azioneConnettore) throws Exception {

		boolean isModalitaAvanzata = this.isModalitaAvanzata();

		if(azioneConnettore!=null && !"".equals(azioneConnettore)) {
			DataElement de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setValue(azioneConnettore);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_FRUITORE_VIEW_CONNETTORE_MAPPING_AZIONE);
			dati.add(de);
		}
		
		if (tipoOp.equals(TipoOperazione.ADD)) {
			// in caso di add allora visualizzo la lista dei soggetti
			DataElement de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_FRUITORE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE);
			de.setType(DataElementType.HIDDEN);
			de.setValue(idSoggettoFruitore);
			dati.add(de);

			if(this.isShowGestioneWorkflowStatoDocumenti()){
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
				if (!isModalitaAvanzata) {
					de.setType(DataElementType.HIDDEN);
					de.setValue(statoServizio);
				}else{
					de.setType(DataElementType.HIDDEN);
					de.setValue(stato);
				}
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
				dati.add(de);
			}else{
				de = new DataElement();
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
				de.setType(DataElementType.HIDDEN);
				de.setValue(StatiAccordo.finale.toString());
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
				dati.add(de);
			}

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_VALIDAZIONE_DOCUMENTI_ESTESA);
			de.setValue(""+validazioneDocumenti);
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_VALIDAZIONE_DOCUMENTI);
			de.setSize(this.getSize());
			dati.add(de);

			de = new DataElement();
			de.setValue("");
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_EROGATORE);
			dati.add(de);


			de = new DataElement();
			de.setValue("");
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_WSDL_FRUITORE);
			dati.add(de);
		} else {
			// in caso di change non visualizzo la select list ma il tipo e il
			// nome del soggetto
			@SuppressWarnings("unused")
			String nomeSoggetto = "";
			for (int i = 0; i < soggettiList.length; i++) {
				if (soggettiList[i].equals(idSoggettoFruitore)) {
					nomeSoggetto = soggettiListLabel[i];
					break;
				}
			}
			DataElement de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROVIDER_FRUITORE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE);
			de.setType(DataElementType.HIDDEN);
			//de.setValue(nomeSoggetto);
			de.setValue(idSoggettoFruitore);
			dati.add(de);

			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_STATO);
			de.setType(DataElementType.HIDDEN);
			de.setValue(stato);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_STATO);
			dati.add(de);
		}

		return dati;
	}

	private static boolean addFruitoreToDati_farVedere =false;
	public static boolean isAddFruitoreToDati_farVedere() {
		return addFruitoreToDati_farVedere;
	}
	public static void setAddFruitoreToDati_farVedere(boolean addFruitoreToDati_farVedere) {
		AccordiServizioParteSpecificaHelper.addFruitoreToDati_farVedere = addFruitoreToDati_farVedere;
	}
	public List<DataElement> addFruitoreToDati(TipoOperazione tipoOp, String[] versioniLabel, String[] versioniValues,
			List<DataElement> dati,
			String oldStatoPackage, String idServizio, String idServizioFruitore, String idSoggettoErogatoreDelServizio,
			String nomeservizio, String tiposervizio, Integer versioneservizio, String idSoggettoFruitore,
			AccordoServizioParteSpecifica asps, Fruitore fruitore) throws Exception{

		boolean isModalitaAvanzata = this.isModalitaAvanzata();

		// Occhio che sotto questo if ci sono dei campi HIDDEN
		if(addFruitoreToDati_farVedere && tipoOp.equals(TipoOperazione.CHANGE)){

			Soggetto fruitoreSogg = this.soggettiCore.getSoggettoRegistro(new IDSoggetto(fruitore.getTipo(), fruitore.getNome()));
			
			boolean esterno = this.pddCore.isPddEsterna(fruitoreSogg.getPortaDominio());			
			if(!esterno){
			
				IDPortaDelegata idPD = null;
				IDSoggetto idSoggettoFruitoreObject = new IDSoggetto(fruitore.getTipo(), fruitore.getNome());
				if(isModalitaAvanzata==false){
					IDServizio idServizioObject = this.idServizioFactory.getIDServizioFromValues(asps.getTipo(), asps.getNome(), 
							asps.getTipoSoggettoErogatore(),asps.getNomeSoggettoErogatore(),asps.getVersione());
					idPD = this.porteDelegateCore.getIDPortaDelegataAssociataDefault(idServizioObject, idSoggettoFruitoreObject);
				}
				
				
				DataElement de = new DataElement();
				if(isModalitaAvanzata || idPD==null){
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE);
				}
				else{
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SPECIFICA_PORTA_DELEGATA);
				}
				de.setType(DataElementType.TITLE);
				dati.add(de);
				
				de = new DataElement();
				de.setType(DataElementType.LINK);
				if(isModalitaAvanzata || idPD==null){
					
					Boolean contaListe = ServletUtils.getContaListeFromSession(this.session);
					
					de.setUrl(
							AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_PORTE_DELEGATE_LIST,
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID,idServizio),
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO, idSoggettoFruitore ),
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE, idSoggettoErogatoreDelServizio),
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, nomeservizio),
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, tiposervizio),
							new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, idServizioFruitore));
					if(contaListe){
						try{
							// BugFix OP-674
//							int num = this.apsCore.serviziFruitoriPorteDelegateList(this.soggettiCore.getIdSoggetto(fruitore.getNome(), fruitore.getTipo()), 
//									asps.getServizio().getTipo(),asps.getServizio().getNome(), asps.getId(), 
//									asps.getServizio().getTipoSoggettoErogatore(), asps.getServizio().getNomeSoggettoErogatore(), asps.getIdSoggetto(), 
//									new Search(true)).size();
							ConsoleSearch searchForCount = new ConsoleSearch(true,1);
							IDServizio idServizioFromAccordo = this.idServizioFactory.getIDServizioFromAccordo(asps); 
							//long idSoggetto = this.soggettiCore.getIdSoggetto(fruitore.getNome(), fruitore.getTipo());
							IDSoggetto idSoggettoFr = new IDSoggetto(fruitore.getNome(), fruitore.getTipo());
							this.apsCore.serviziFruitoriMappingList(fruitore.getId(), idSoggettoFr, idServizioFromAccordo, searchForCount);
							//int numPD = fruLista.size();
							int numPD = searchForCount.getNumEntries(Liste.CONFIGURAZIONE_FRUIZIONE);
							ServletUtils.setDataElementCustomLabel(de, AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE, (long) numPD );
							
						}catch(Exception e){
							this.logError("Calcolo numero pa non riuscito",e);
							ServletUtils.setDataElementCustomLabel(de, AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE, AccordiServizioParteSpecificaCostanti.LABEL_N_D);
						}
					}else{
						de.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE);
					}
					
				}
				else{
					// Utilizza la configurazione come parent
					ServletUtils.setObjectIntoSession(this.request, this.session, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT_CONFIGURAZIONE, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT);
					
					PortaDelegata pd = this.porteDelegateCore.getPortaDelegata(idPD);
					de.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, "" + pd.getIdSoggetto()),
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME_PORTA,pd.getNome()),
							new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, "" + pd.getId())
							);
					de.setValue(Costanti.LABEL_VISUALIZZA);
				}
				dati.add(de);
				
			}
			
		}

		if(tipoOp.equals(TipoOperazione.CHANGE)){
			DataElement de = new DataElement();
			de.setValue(idServizioFruitore);
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID);
			dati.add(de);

		}

		return dati;
	}

	public List<DataElement> addFruitoreToDatiAsHidden(TipoOperazione tipoOp, String[] versioniLabel, String[] versioniValues,
			List<DataElement> dati,
			String oldStatoPackage, String idServizio, String idServizioFruitore, String idSoggettoErogatoreDelServizio,
			String nomeservizio, String tiposervizio, String idSoggettoFruitore){

	
		if(tipoOp.equals(TipoOperazione.CHANGE)){
			DataElement de = new DataElement();
			de.setValue(idServizioFruitore);
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID);
			dati.add(de);

			//			boolean modificaAbilitata = ( (this.apsCore.isShowGestioneWorkflowStatoDocumenti()==false)
			//					|| (StatiAccordo.finale.toString().equals(oldStatoPackage)==false) );


		}
		
		return dati;
	}

	public List<DataElement>  addTipiAllegatiToDati(TipoOperazione tipoOp, String idServizio, String ruolo,
			String[] ruoli, String[] tipiAmmessi, String[] tipiAmmessiLabel, String tipoFile,
			List<DataElement> dati, String modificaAPI, List<BinaryParameter> binaryParameterDocumenti) {
		
		DataElement de = new DataElement();
		de.setType(DataElementType.TITLE);
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATO);
		dati.add(de);
		
		de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_RUOLO);
		de.setType(DataElementType.SELECT);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_RUOLO);
		de.setValues(ruoli);
		//				de.setOnChange("CambiaTipoDocumento('serviziAllegati')");
		de.setPostBack(true);
		de.setSelected(ruolo!=null ? ruolo : "");
		de.setSize( getSize());
		dati.add(de);

		if(tipiAmmessi!=null){
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO_FILE);
			de.setType(DataElementType.SELECT);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_FILE);
			de.setValues(tipiAmmessi);
			de.setLabels(tipiAmmessiLabel);
			de.setSelected(tipoFile);
			de.setSize( getSize());
			dati.add(de);
		}

		
		if(TipoOperazione.ADD.equals(tipoOp)){
			// dal parametro in posizione 0 leggiamo i dati per creare l'elemento grafico
			BinaryParameter allegato0 = binaryParameterDocumenti.get(0);
			
			DataElement fileDataElement = allegato0.getFileDataElement(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_THE_FILE, "", getSize());
			fileDataElement.setType(DataElementType.MULTI_FILE);
			fileDataElement.setRequired(true);
			dati.add(fileDataElement);
			dati.addAll(BinaryParameter.getFileNameDataElement(binaryParameterDocumenti));
			dati.add(BinaryParameter.getFileIdDataElement(binaryParameterDocumenti));
		} else {
			de = new DataElement();
			de.setValue(idServizio);
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_THE_FILE);
			de.setType(DataElementType.FILE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_THE_FILE);
			de.setSize( getSize());
			dati.add(de);
		}
		
		if(modificaAPI!=null) {
			de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API);
			de.setValue(modificaAPI);
			dati.add(de);
		}

		return dati;
	}

	public List<DataElement>  addInfoAllegatiToDati(TipoOperazione tipoOp,    String idAllegato,
			AccordoServizioParteSpecifica asps, Documento doc,
			List<DataElement> dati, String modificaAPI) throws Exception {

		DataElement de = new DataElement();
		de.setType(DataElementType.TITLE);
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATO);
		dati.add(de);
		
		de = new DataElement();
		de.setValue(idAllegato);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_ALLEGATO);
		dati.add(de);

		boolean stato = this.isEditModeInProgress() && this.isShowGestioneWorkflowStatoDocumenti() && StatiAccordo.finale.toString().equals(asps.getStatoPackage());
		
		if(!stato) {
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_NOME_ATTUALE);
			de.setType(DataElementType.SUBTITLE);
			dati.add(de);
		}

		de = new DataElement();
		de.setValue(doc.getRuolo());
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_RUOLO);
		de.setType(DataElementType.TEXT);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_RUOLO);
		de.setSize( getSize());
		dati.add(de);

		de = new DataElement();
		de.setValue(doc.getFile());
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_FILE);
		de.setType(DataElementType.TEXT);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_DOCUMENTO);
		de.setSize( getSize());
		dati.add(de);

		de = new DataElement();
		de.setValue(doc.getTipo());
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO_FILE);
		de.setType(DataElementType.TEXT);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_FILE);
		de.setSize( getSize());
		dati.add(de);

		if(stato){
			this.pd.setMode(Costanti.DATA_ELEMENT_EDIT_MODE_DISABLE_NAME);
		}
		else{	
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO_PARTE_COMUNE_NOME_NUOVO);
			de.setType(DataElementType.SUBTITLE);
			dati.add(de);
			
			de = new DataElement();
			de.setType(DataElementType.FILE);
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_THE_FILE);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_THE_FILE);
			de.setSize( getSize());
			dati.add(de);
		}

		if(modificaAPI!=null) {
			de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API);
			de.setValue(modificaAPI);
			dati.add(de);
		}
		
		return dati;
	}


	public List<DataElement> addViewAllegatiToDati(TipoOperazione tipoOp, String idAllegato, String idServizio,
			Documento doc, StringBuilder contenutoAllegato, String errore,
			List<DataElement> dati, String modificaAPI) {
		DataElement de = new DataElement();

		de.setValue(idAllegato);
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_ALLEGATO);
		dati.add(de);

		de = new DataElement();
		de.setType(DataElementType.TITLE);
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_ALLEGATO);
		dati.add(de);
		
		de = new DataElement();
		de.setValue(doc.getRuolo());
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_RUOLO);
		de.setType(DataElementType.TEXT);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_RUOLO);
		de.setSize( getSize());
		dati.add(de);

		de = new DataElement();
		de.setValue(doc.getFile());
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_NOME_FILE);
		de.setType(DataElementType.TEXT);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_DOCUMENTO);
		de.setSize( getSize());
		dati.add(de);

		de = new DataElement();
		de.setValue(doc.getTipo());
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_TIPO_FILE);
		de.setType(DataElementType.TEXT);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_FILE);
		de.setSize( getSize());
		dati.add(de);

		if(this.core.isShowAllegati()) {
			if(errore!=null){
				de = new DataElement();
				de.setValue(errore);
				de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_THE_FILE);
				de.setType(DataElementType.TEXT );
				de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_DOCUMENTO);
				de.setSize( getSize());
				dati.add(de);
			}
			else{
				de = new DataElement();
				de.setLabel("");
				de.setType(DataElementType.TEXT_AREA_NO_EDIT);
				de.setValue(contenutoAllegato.toString());
				de.setRows(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_SIZE);
				de.setCols(CostantiControlStation.LABEL_PARAMETRO_TEXT_AREA_API_COLUMNS);
				dati.add(de);
			}
		}
		
		DataElement saveAs = new DataElement();
		saveAs.setValue(AccordiServizioParteSpecificaCostanti.LABEL_APS_DOWNLOAD);
		saveAs.setType(DataElementType.LINK);
		Parameter pIdAccordo = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_ACCORDO, idServizio);
		Parameter pIdAllegato = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_ALLEGATO, idAllegato);
		Parameter pTipoDoc = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_DOCUMENTO, "asps");
		//			String params = "idAccordo="+idServizio+"&idAllegato="+idAllegato+"&tipoDocumento=asps";
		saveAs.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, pIdAccordo, pIdAllegato, pTipoDoc);
		saveAs.setDisabilitaAjaxStatus();
		dati.add(saveAs);

		if(modificaAPI!=null) {
			de = new DataElement();
			de.setType(DataElementType.HIDDEN);
			de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API);
			de.setValue(modificaAPI);
			dati.add(de);
		}
		
		return dati;
	}
	
	public List<DataElement> addConfigurazioneErogazioneToDati(TipoOperazione tipoOperazione, List<DataElement> dati, String nome, String nomeGruppo,
			String[] azioni, String[] azioniDisponibiliList, String[] azioniDisponibiliLabelList, 
			String idAsps, String idSoggettoErogatoreDelServizio, String identificazione, 
			AccordoServizioParteSpecifica asps, AccordoServizioParteComuneSintetico as, ServiceBinding serviceBinding, String modeCreazione, String modeCreazioneConnettore,
			String[] listaMappingLabels, String[] listaMappingValues, String mapping, String mappingLabel, boolean paMappingSelezionatoMulti, String nomeSA, String [] saSoggetti, 
			String controlloAccessiStato,
			String erogazioneAutenticazione, String erogazioneAutenticazioneOpzionale, TipoAutenticazionePrincipal erogazioneAutenticazionePrincipal, List<String> erogazioneAutenticazioneParametroList, boolean erogazioneIsSupportatoAutenticazioneSoggetti,
			String erogazioneAutorizzazione, String erogazioneAutorizzazioneAutenticati, String erogazioneAutorizzazioneRuoli,
			String erogazioneRuolo, String erogazioneAutorizzazioneRuoliTipologia, String erogazioneAutorizzazioneRuoliMatch,
			List<String> soggettiAutenticati,  List<String> soggettiAutenticatiLabel, String soggettoAutenticato,
			String gestioneToken, String[] gestioneTokenPolicyLabels, String[] gestioneTokenPolicyValues,
			String gestioneTokenPolicy, String gestioneTokenOpzionale, 
			String gestioneTokenValidazioneInput, String gestioneTokenIntrospection, String gestioneTokenUserInfo, String gestioneTokenForward,
			String autenticazioneTokenIssuer,String autenticazioneTokenClientId,String autenticazioneTokenSubject,String autenticazioneTokenUsername,String autenticazioneTokenEMail,
			String autorizzazioneToken, String autorizzazioneTokenOptions,
			String autorizzazioneScope, String scope, String autorizzazioneScopeMatch,BinaryParameter allegatoXacmlPolicy,
			String identificazioneAttributiStato, String[] attributeAuthorityLabels, String[] attributeAuthorityValues, String [] attributeAuthoritySelezionate, String attributeAuthorityAttributi,
			String autorizzazioneAutenticatiToken, 
			String autorizzazioneRuoliToken, String autorizzazioneRuoliTipologiaToken, String autorizzazioneRuoliMatchToken) throws Exception {
		
		Boolean contaListe = ServletUtils.getContaListeFromSession(this.session);
		
		DataElement de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_APPLICATIVE);
		de.setType(DataElementType.TITLE);
		dati.add(de);
		
		// idSoggetto erogatore
		de = new DataElement();
		de.setType(DataElementType.HIDDEN);
		de.setName(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO_EROGATORE);
		de.setValue(idSoggettoErogatoreDelServizio); 
		dati.add(de);
		
		// Nome Gruppo
		de = new DataElement();
		de.setName(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME_GRUPPO);
		de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_NOME_GRUPPO);
		de.setValue(nomeGruppo);
		de.setType(DataElementType.TEXT_EDIT);
		de.setRequired(true); 
		dati.add(de);
		
		// Azione
		DataElement deAzione = new DataElement();
		deAzione.setLabel(this.getLabelAzioni(serviceBinding));
		deAzione.setValues(azioniDisponibiliList);
		deAzione.setLabels(azioniDisponibiliLabelList);
		deAzione.setSelezionati(azioni);
		deAzione.setType(DataElementType.MULTI_SELECT);
		deAzione.setName(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_AZIONI);
		deAzione.setRows(CostantiControlStation.RIGHE_MULTISELECT_AZIONI);
		deAzione.setRequired(true); 
		dati.add(deAzione);
		
		
		// Nome
		de = new DataElement();
		de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_NOME);
		de.setValue(nome);
		de.setType(DataElementType.HIDDEN);
		de.setRequired(true);
		de.setName(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME);
		dati.add(de);
		
		// mode
		de = new DataElement();
		de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE);
		String[] modeLabels = {PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_EREDITA,PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_NUOVA};
		String[] modeValues = {PorteApplicativeCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_EREDITA, PorteApplicativeCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_NUOVA};
		de.setLabels(modeLabels); 
		de.setValues(modeValues);
		de.setSelected(modeCreazione);
		de.setType(DataElementType.SELECT);
		de.setName(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_MODE_CREAZIONE);
		de.setPostBack(true, true);
		dati.add(de);
		
		
		boolean showModeConnettore = !this.isModalitaStandard();
		// 	modo creazione: se erediti la configurazione da una precedente allora devi solo sezionarla, altrimenti devi compilare le sezioni SA e controllo accessi
		if(modeCreazione.equals(PorteApplicativeCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_EREDITA)) {
			// mapping
			de = new DataElement();
			de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MAPPING_GRUPPO);
			de.setLabels(listaMappingLabels); 
			de.setValues(listaMappingValues);
			de.setSelected(mapping);
			de.setToolTip(mappingLabel);
			de.setType(DataElementType.SELECT);
			de.setName(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_MAPPING);
			de.setPostBack(true);
			dati.add(de);
			
			showModeConnettore = showModeConnettore && !paMappingSelezionatoMulti;
		} 
		
		// mode Connettore
		de = new DataElement();
		de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_CONNETTORE);
		de.setName(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_MODE_CREAZIONE_CONNETTORE);
		if(showModeConnettore) {
			de.setType(DataElementType.CHECKBOX);
			de.setSelected(ServletUtils.isCheckBoxEnabled(modeCreazioneConnettore));
			de.setPostBack(true);
		} else {
			de.setType(DataElementType.HIDDEN);
			de.setValue(modeCreazione);
		}
		dati.add(de);
		
		if(!modeCreazione.equals(PorteApplicativeCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_EREDITA)) {
			
			// Controllo Accesso
			
			boolean forceAutenticato = false; 
			boolean forceHttps = false;
			boolean forceDisableOptional = false;
			boolean forceGestioneToken = false;
			boolean forceMostraSezioneToken = false;
			String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(asps.getTipoSoggettoErogatore());
			if(this.isProfiloModIPA(protocollo)) {
				forceAutenticato = true; // in modI ci vuole sempre autenticazione https sull'erogazione (cambia l'opzionalita' o meno)
				forceHttps = forceAutenticato;
				
				if(PorteApplicativeCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_NUOVA.equals(modeCreazione)) {
					
					BooleanNullable forcePDNDWrapper = BooleanNullable.NULL(); 
					BooleanNullable forceOAuthWrapper = BooleanNullable.NULL(); 
					this.readModIConfiguration(BooleanNullable.NULL(), forcePDNDWrapper, forceOAuthWrapper, 
							this.idAccordoFactory.getIDAccordoFromAccordo(as),asps.getPortType(), 
							azioniDisponibiliList!=null && azioniDisponibiliList.length>0 ? Arrays.asList(azioniDisponibiliList) : null); // verifica per tutte le azioni disponibili
					boolean forcePDND = false;
					boolean forceOAuth = false;
					if(forcePDNDWrapper.getValue()!=null) {
						forcePDND = forcePDNDWrapper.getValue().booleanValue();
					}
					if(forceOAuthWrapper.getValue()!=null) {
						forceOAuth = forceOAuthWrapper.getValue().booleanValue();
					}
					if (forcePDND || forceOAuth) {
						deAzione.setPostBack(true);
					}
					
				}
				
				boolean forcePDND = false;
				boolean forceOAuth = false;
								
				BooleanNullable forceHttpsClientWrapper = BooleanNullable.NULL(); 
				BooleanNullable forcePDNDWrapper = BooleanNullable.NULL(); 
				BooleanNullable forceOAuthWrapper = BooleanNullable.NULL(); 
				
				List<String> azioniList = null;
				if(azioni!=null && azioni.length>0) {
					azioniList = Arrays.asList(azioni);
				}
				this.readModIConfiguration(forceHttpsClientWrapper, forcePDNDWrapper, forceOAuthWrapper, 
						this.idAccordoFactory.getIDAccordoFromAccordo(as),asps.getPortType(), 
						azioniList);
				
				if(forceHttpsClientWrapper.getValue()!=null) {
					forceDisableOptional = forceHttpsClientWrapper.getValue().booleanValue();
				}
				if(forcePDNDWrapper.getValue()!=null) {
					forcePDND = forcePDNDWrapper.getValue().booleanValue();
				}
				if(forceOAuthWrapper.getValue()!=null) {
					forceOAuth = forceOAuthWrapper.getValue().booleanValue();
				}
				
				if (forcePDND || forceOAuth) {
					
					forceGestioneToken = true;
					forceMostraSezioneToken = true;
										
					gestioneToken = StatoFunzionalita.ABILITATO.getValue();
					
					if(forcePDND) {
						List<String> tokenPolicies = this.getTokenPolicyGestione(true, false, 
								false, // alla posizione 0 NON viene aggiunto -
								gestioneTokenPolicy, tipoOperazione);
						if(tokenPolicies!=null && !tokenPolicies.isEmpty()) {
							if(gestioneTokenPolicy==null || StringUtils.isEmpty(gestioneTokenPolicy) || CostantiControlStation.DEFAULT_VALUE_NON_SELEZIONATO.equals(gestioneTokenPolicy)) {
								gestioneTokenPolicy = tokenPolicies.get(0); 
							}
							gestioneTokenPolicyLabels = tokenPolicies.toArray(new String[1]);
							gestioneTokenPolicyValues = tokenPolicies.toArray(new String[1]);
						}
					}
					else {
						List<String> tokenPolicies = this.getTokenPolicyGestione(false, true, 
								false, // alla posizione 0 NON viene aggiunto -
								gestioneTokenPolicy, tipoOperazione);
						if(tokenPolicies!=null && !tokenPolicies.isEmpty()) {
							if(gestioneTokenPolicy==null || StringUtils.isEmpty(gestioneTokenPolicy) || CostantiControlStation.DEFAULT_VALUE_NON_SELEZIONATO.equals(gestioneTokenPolicy)) {
								gestioneTokenPolicy = tokenPolicies.get(0); 
							}
							gestioneTokenPolicyLabels = tokenPolicies.toArray(new String[1]);
							gestioneTokenPolicyValues = tokenPolicies.toArray(new String[1]);
						}
					}
					
					gestioneTokenOpzionale = StatoFunzionalita.DISABILITATO.getValue();
					
					if(gestioneTokenPolicy!=null && StringUtils.isNotEmpty(gestioneTokenPolicy) && 
							!CostantiControlStation.DEFAULT_VALUE_NON_SELEZIONATO.equals(gestioneTokenPolicy)) {
						GenericProperties gp = this.confCore.getGenericProperties(gestioneTokenPolicy, CostantiConfigurazione.GENERIC_PROPERTIES_TOKEN_TIPOLOGIA_VALIDATION, false);
						if(gp!=null && gp.sizePropertyList()>0) {
							for (Property p : gp.getPropertyList()) {
								if(org.openspcoop2.pdd.core.token.Costanti.POLICY_VALIDAZIONE_STATO.equals(p.getNome())) {
									if("true".equalsIgnoreCase(p.getValore())) {
										gestioneTokenValidazioneInput = StatoFunzionalita.ABILITATO.getValue();
									}
									else {
										gestioneTokenValidazioneInput = StatoFunzionalita.DISABILITATO.getValue();
									}
								}
								else if(org.openspcoop2.pdd.core.token.Costanti.POLICY_INTROSPECTION_STATO.equals(p.getNome())) {
									if("true".equalsIgnoreCase(p.getValore())) {
										gestioneTokenIntrospection = StatoFunzionalita.ABILITATO.getValue();
									}
									else {
										gestioneTokenIntrospection = StatoFunzionalita.DISABILITATO.getValue();
									}
								}
								else if(org.openspcoop2.pdd.core.token.Costanti.POLICY_USER_INFO_STATO.equals(p.getNome())) {
									if("true".equalsIgnoreCase(p.getValore())) {
										gestioneTokenUserInfo = StatoFunzionalita.ABILITATO.getValue();
									}
									else {
										gestioneTokenUserInfo = StatoFunzionalita.DISABILITATO.getValue();
									}
								}
								else if(org.openspcoop2.pdd.core.token.Costanti.POLICY_TOKEN_FORWARD_STATO.equals(p.getNome())) {
									if("true".equalsIgnoreCase(p.getValore())) {
										gestioneTokenForward = StatoFunzionalita.ABILITATO.getValue();
									}
									else {
										gestioneTokenForward = StatoFunzionalita.DISABILITATO.getValue();
									}
								}
							}
						}
					}
				} 
			}
			
			this.controlloAccessiAdd(dati, tipoOperazione, controlloAccessiStato, forceAutenticato);
			
			this.controlloAccessiGestioneToken(dati, tipoOperazione, gestioneToken, gestioneTokenPolicyLabels, gestioneTokenPolicyValues, 
					gestioneTokenPolicy, gestioneTokenOpzionale,
					gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenForward, null,protocollo, false,
					forceGestioneToken, forceMostraSezioneToken);
			
			this.controlloAccessiAutenticazione(dati, tipoOperazione, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ADD, null,protocollo,
					erogazioneAutenticazione, null, erogazioneAutenticazioneOpzionale, erogazioneAutenticazionePrincipal, erogazioneAutenticazioneParametroList, false, erogazioneIsSupportatoAutenticazioneSoggetti,false,
					gestioneToken, gestioneTokenPolicy, autenticazioneTokenIssuer, autenticazioneTokenClientId, autenticazioneTokenSubject, autenticazioneTokenUsername, autenticazioneTokenEMail,
					false, null, 0,
					forceHttps, forceDisableOptional);
			
			this.controlloAccessiAutorizzazione(dati, tipoOperazione, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_ADD, null,protocollo,
					erogazioneAutenticazione, null,
					erogazioneAutorizzazione, null, 
					erogazioneAutorizzazioneAutenticati, null, 0, soggettiAutenticati, soggettiAutenticatiLabel, soggettoAutenticato,
					erogazioneAutorizzazioneRuoli, null, 0, erogazioneRuolo,
					erogazioneAutorizzazioneRuoliTipologia, erogazioneAutorizzazioneRuoliMatch, 
					false, erogazioneIsSupportatoAutenticazioneSoggetti, contaListe, false, false,autorizzazioneScope,null,0,scope,autorizzazioneScopeMatch,
					gestioneToken, gestioneTokenPolicy, 
					autorizzazioneToken, autorizzazioneTokenOptions,allegatoXacmlPolicy,
					null, 0, null, 0,
					identificazioneAttributiStato, attributeAuthorityLabels, attributeAuthorityValues, attributeAuthoritySelezionate, attributeAuthorityAttributi,
					autorizzazioneAutenticatiToken, null, 0,
					autorizzazioneRuoliToken, null, 0, autorizzazioneRuoliTipologiaToken, autorizzazioneRuoliMatchToken);
		}
		
		
		return dati;
	}

	public boolean configurazioneErogazioneCheckData(TipoOperazione tipoOp, String nome, String nomeGruppo, String[] azioni,
			AccordoServizioParteSpecifica asps, List<String> azioniOccupate,
			String modeCreazione, String idPorta, boolean isSupportatoAutenticazione,
			AccordiServizioParteSpecificaPorteApplicativeMappingInfo mappingInfo) throws Exception{
		
		if(nomeGruppo==null || "".equals(nomeGruppo.trim())) {
			this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_NOME_GRUPPO_NON_PUO_ESSERE_VUOTA);
			return false;
		}
		// Check lunghezza
		if(this.checkLength255(nomeGruppo, PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME_GRUPPO)==false) {
			return false;
		}
		if(AccordiServizioParteSpecificaUtilities.getMappingPAFilterByDescription(mappingInfo.getListaMappingErogazione(), nomeGruppo)!=null) {
			this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_NOME_GRUPPO_GIA_ESISTENTE);
			return false;
		}
		
		if(azioni == null || azioni.length == 0) {
			this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_AZIONE_PORTA_NON_PUO_ESSERE_VUOTA);
			return false;
		}
		for (String azioneTmp : azioni) {
			if(azioneTmp == null || azioneTmp.equals("") || azioneTmp.equals("-")) {
				this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_AZIONE_PORTA_NON_PUO_ESSERE_VUOTA);
				return false;
			}
		}
		
		for (String azioneTmp : azioni) {
			if(azioniOccupate.contains(azioneTmp)) {
				this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_AZIONE_PORTA_GIA_PRESENTE);
				return false;			
			}
		}
		
		if(checkAzioniUtilizzateErogazione(mappingInfo, azioni)==false) {
			return false;
		}
		
		if(modeCreazione.equals(PorteApplicativeCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_EREDITA)) {
			
		} else {
			String autenticazione = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTENTICAZIONE);
			String autenticazioneCustom = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTENTICAZIONE_CUSTOM);
			String autenticazioneOpzionale = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTENTICAZIONE_OPZIONALE);
			String autenticazionePrincipalTipo = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTENTICAZIONE_PRINCIPAL_TIPO);
			TipoAutenticazionePrincipal autenticazionePrincipal = TipoAutenticazionePrincipal.toEnumConstant(autenticazionePrincipalTipo, false);
			List<String> autenticazioneParametroList = this.convertFromDataElementValue_parametroAutenticazioneList(autenticazione, autenticazionePrincipal);
			
			String autorizzazione = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE);
			String autorizzazioneCustom = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_CUSTOM);
			String autorizzazioneAutenticati = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_AUTENTICAZIONE);
			String autorizzazioneRuoli = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_RUOLI);
			String autorizzazioneRuoliTipologia = this.getParameter(CostantiControlStation.PARAMETRO_RUOLO_TIPOLOGIA);
			String ruoloMatch = this.getParameter(CostantiControlStation.PARAMETRO_RUOLO_MATCH);
			
			String autorizzazioneContenutiStato = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI_STATO);
			String autorizzazioneContenuti = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI);
			String autorizzazioneContenutiProperties = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI_PROPERTIES);
			
//			if() {
//				
//			}
			
			// Se autenticazione = custom, nomeauth dev'essere specificato
			if (CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PORTE_AUTENTICAZIONE_CUSTOM.equals(autenticazione) && 
					(autenticazioneCustom == null || autenticazioneCustom.equals(""))) {
				this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_INDICARE_UN_NOME_PER_AUTENTICAZIONE_XX, CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PORTE_AUTENTICAZIONE_CUSTOM));
				return false;
			}

			// Se autorizzazione = custom, nomeautor dev'essere specificato
			if (CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PORTE_AUTORIZZAZIONE_CUSTOM.equals(autorizzazione) && 
					(autorizzazioneCustom == null || autorizzazioneCustom.equals(""))) {
				this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_INDICARE_UN_NOME_PER_AUTORIZZAZIONE_XX, CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PORTE_AUTORIZZAZIONE_CUSTOM));
				return false;
			}
			
			PortaApplicativa pa = null;
			if (TipoOperazione.CHANGE == tipoOp){
				pa = this.porteApplicativeCore.getPortaApplicativa(Long.parseLong(idPorta)); 
			}
			
			List<String> ruoli = new ArrayList<>();
			if(pa!=null && pa.getRuoli()!=null && pa.getRuoli().sizeRuoloList()>0){
				for (int i = 0; i < pa.getRuoli().sizeRuoloList(); i++) {
					ruoli.add(pa.getRuoli().getRuolo(i).getNome());
				}
			}
			
			String gestioneToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN);
			String gestioneTokenPolicy = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_POLICY);
			String gestioneTokenValidazioneInput = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_VALIDAZIONE_INPUT);
			String gestioneTokenIntrospection = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_INTROSPECTION);
			String gestioneTokenUserInfo = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_USERINFO);
			String gestioneTokenTokenForward = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_TOKEN_FORWARD);
			
			String autorizzazioneAutenticatiToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_AUTENTICAZIONE_TOKEN);
			String autorizzazioneRuoliToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_RUOLI_TOKEN);
			
			String autorizzazione_token = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_TOKEN);
			String autorizzazione_tokenOptions = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_TOKEN_OPTIONS);
			String autorizzazioneScope = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_SCOPE);
			String autorizzazioneScopeMatch = this.getParameter(CostantiControlStation.PARAMETRO_SCOPE_MATCH);
			
			BinaryParameter allegatoXacmlPolicy = this.getBinaryParameter(CostantiControlStation.PARAMETRO_DOCUMENTO_SICUREZZA_XACML_POLICY);
			String protocollo = ProtocolFactoryManager.getInstance().getProtocolByServiceType(asps.getTipo());
			
			String identificazioneAttributiStato = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_STATO);
			String [] attributeAuthoritySelezionate = this.getParameterValues(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_AUTHORITY);
			String attributeAuthorityAttributi = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_AUTHORITY_ATTRIBUTI);
			
			if(this.controlloAccessiCheck(tipoOp, autenticazione, autenticazioneOpzionale, autenticazionePrincipal, autenticazioneParametroList,
					autorizzazione, autorizzazioneAutenticati, autorizzazioneRuoli, 
					autorizzazioneRuoliTipologia, ruoloMatch, 
					isSupportatoAutenticazione, false, pa, ruoli,gestioneToken, gestioneTokenPolicy, 
					gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenTokenForward,
					autorizzazioneAutenticatiToken, autorizzazioneRuoliToken, 
					autorizzazione_token,autorizzazione_tokenOptions,
					autorizzazioneScope,autorizzazioneScopeMatch,allegatoXacmlPolicy,
					autorizzazioneContenutiStato, autorizzazioneContenuti, autorizzazioneContenutiProperties,
					protocollo,
					identificazioneAttributiStato, attributeAuthoritySelezionate, attributeAuthorityAttributi)==false){
				return false;
			}
		}
		
		return true;
	}
		
	public boolean configurazioneFruizioneCheckData(TipoOperazione tipoOp, String nome, String nomeGruppo, String [] azioni,
			AccordoServizioParteSpecifica asps, List<String> azioniOccupate,
			String modeCreazione, String idPorta, boolean isSupportatoAutenticazione,
			AccordiServizioParteSpecificaFruitoriPorteDelegateMappingInfo mappingInfo) throws Exception{
		
		if(nomeGruppo==null || "".equals(nomeGruppo.trim())) {
			this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_NOME_GRUPPO_NON_PUO_ESSERE_VUOTA);
			return false;
		}
		
		// Check lunghezza
		if(this.checkLength255(nomeGruppo, PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_NOME_GRUPPO)==false) {
			return false;
		}
		
		if(AccordiServizioParteSpecificaUtilities.getMappingPDFilterByDescription(mappingInfo.getListaMappingFruizione(), nomeGruppo)!=null) {
			this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_NOME_GRUPPO_GIA_ESISTENTE);
			return false;
		}
		
		if(azioni == null || azioni.length == 0) {
			this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_AZIONE_PORTA_NON_PUO_ESSERE_VUOTA);
			return false;
		}
		for (String azioneTmp : azioni) {
			if(azioneTmp == null || azioneTmp.equals("") || azioneTmp.equals("-")) {
				this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_AZIONE_PORTA_NON_PUO_ESSERE_VUOTA);
				return false;
			}
		}
		
		for (String azioneTmp : azioni) {
			if(azioniOccupate.contains(azioneTmp)) {
				this.pd.setMessage(CostantiControlStation.MESSAGGIO_ERRORE_AZIONE_PORTA_GIA_PRESENTE);
				return false;			
			}
		}
		
		if(checkAzioniUtilizzateFruizione(mappingInfo, azioni)==false) {
			return false;
		}
		
		if(modeCreazione.equals(PorteApplicativeCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_APPLICATIVE_MODO_CREAZIONE_EREDITA)) {
			
		} else {
			String autenticazione = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTENTICAZIONE);
			String autenticazioneCustom = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTENTICAZIONE_CUSTOM);
			String autenticazioneOpzionale = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTENTICAZIONE_OPZIONALE);
			String autenticazionePrincipalTipo = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTENTICAZIONE_PRINCIPAL_TIPO);
			TipoAutenticazionePrincipal autenticazionePrincipal = TipoAutenticazionePrincipal.toEnumConstant(autenticazionePrincipalTipo, false);
			List<String> autenticazioneParametroList = this.convertFromDataElementValue_parametroAutenticazioneList(autenticazione, autenticazionePrincipal);
			
			String autorizzazione = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE);
			String autorizzazioneCustom = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_CUSTOM);
			String autorizzazioneAutenticati = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_AUTENTICAZIONE);
			String autorizzazioneRuoli = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_RUOLI);
			String autorizzazioneRuoliTipologia = this.getParameter(CostantiControlStation.PARAMETRO_RUOLO_TIPOLOGIA);
			String ruoloMatch = this.getParameter(CostantiControlStation.PARAMETRO_RUOLO_MATCH);
			
			String autorizzazioneContenutiStato = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI_STATO);
			String autorizzazioneContenuti = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI);
			String autorizzazioneContenutiProperties = this.getParameter(CostantiControlStation.PARAMETRO_AUTORIZZAZIONE_CONTENUTI_PROPERTIES);
			
			// Se autenticazione = custom, nomeauth dev'essere specificato
			if (CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PORTE_AUTENTICAZIONE_CUSTOM.equals(autenticazione) && 
					(autenticazioneCustom == null || autenticazioneCustom.equals(""))) {
				this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_INDICARE_UN_NOME_PER_AUTENTICAZIONE_XX, CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PORTE_AUTENTICAZIONE_CUSTOM));
				return false;
			}

			// Se autorizzazione = custom, nomeautor dev'essere specificato
			if (CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PORTE_AUTORIZZAZIONE_CUSTOM.equals(autorizzazione) && 
					(autorizzazioneCustom == null || autorizzazioneCustom.equals(""))) {
				this.pd.setMessage(MessageFormat.format(AccordiServizioParteSpecificaCostanti.MESSAGGIO_ERRORE_INDICARE_UN_NOME_PER_AUTORIZZAZIONE_XX, CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PORTE_AUTORIZZAZIONE_CUSTOM));
				return false;
			}
			
			PortaDelegata pd = null;
			if (TipoOperazione.CHANGE == tipoOp){
				pd = this.porteDelegateCore.getPortaDelegata(Long.parseLong(idPorta)); 
			}
			
			List<String> ruoli = new ArrayList<>();
			if(pd!=null && pd.getRuoli()!=null && pd.getRuoli().sizeRuoloList()>0){
				for (int i = 0; i < pd.getRuoli().sizeRuoloList(); i++) {
					ruoli.add(pd.getRuoli().getRuolo(i).getNome());
				}
			}
			
			String gestioneToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN);
			String gestioneTokenPolicy = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_POLICY);
			String gestioneTokenValidazioneInput = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_VALIDAZIONE_INPUT);
			String gestioneTokenIntrospection = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_INTROSPECTION);
			String gestioneTokenUserInfo = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_USERINFO);
			String gestioneTokenTokenForward = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_GESTIONE_TOKEN_TOKEN_FORWARD);
			
			String autorizzazioneAutenticatiToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_AUTENTICAZIONE_TOKEN);
			String autorizzazioneRuoliToken = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_RUOLI_TOKEN);
			
			String autorizzazione_token = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_TOKEN);
			String autorizzazione_tokenOptions = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_TOKEN_OPTIONS);
			String autorizzazioneScope = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_AUTORIZZAZIONE_SCOPE);
			String autorizzazioneScopeMatch = this.getParameter(CostantiControlStation.PARAMETRO_SCOPE_MATCH);
			
			BinaryParameter allegatoXacmlPolicy = this.getBinaryParameter(CostantiControlStation.PARAMETRO_DOCUMENTO_SICUREZZA_XACML_POLICY);
			String protocollo = ProtocolFactoryManager.getInstance().getProtocolByServiceType(asps.getTipo());
			
			String identificazioneAttributiStato = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_STATO);
			String [] attributeAuthoritySelezionate = this.getParameterValues(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_AUTHORITY);
			String attributeAuthorityAttributi = this.getParameter(CostantiControlStation.PARAMETRO_PORTE_ATTRIBUTI_AUTHORITY_ATTRIBUTI);
			
			if(this.controlloAccessiCheck(tipoOp, autenticazione, autenticazioneOpzionale, autenticazionePrincipal, autenticazioneParametroList,
					autorizzazione, autorizzazioneAutenticati, autorizzazioneRuoli, 
					autorizzazioneRuoliTipologia, ruoloMatch, 
					isSupportatoAutenticazione, true, pd, ruoli,gestioneToken, gestioneTokenPolicy, 
					gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenTokenForward,
					autorizzazioneAutenticatiToken, autorizzazioneRuoliToken, 
					autorizzazione_token,autorizzazione_tokenOptions,
					autorizzazioneScope,autorizzazioneScopeMatch,allegatoXacmlPolicy,
					autorizzazioneContenutiStato, autorizzazioneContenuti, autorizzazioneContenutiProperties,
					protocollo,
					identificazioneAttributiStato, attributeAuthoritySelezionate, attributeAuthorityAttributi)==false){
				return false;
			}
		}
		
		return true;
	}


	public List<DataElement> addConfigurazioneFruizioneToDati(TipoOperazione tipoOp, List<DataElement> dati, 
			String nome, String nomeGruppo,
			String [] azioni, String[] azioniDisponibiliList, String[] azioniDisponibiliLabelList, String idAsps,
			IDSoggetto idSoggettoFruitore, String identificazione, AccordoServizioParteSpecifica asps,
			AccordoServizioParteComuneSintetico as, ServiceBinding serviceBinding, String modeCreazione, String modeCreazioneConnettore,
			String[] listaMappingLabels, String[] listaMappingValues, String mapping, String mappingLabel, List<String> saList, String nomeSA, 
			String controlloAccessiStato,
			String fruizioneAutenticazione, String fruizioneAutenticazioneOpzionale, TipoAutenticazionePrincipal fruizioneAutenticazionePrincipal, List<String> fruizioneAutenticazioneParametroList, boolean erogazioneIsSupportatoAutenticazioneSoggetti,
			String fruizioneAutorizzazione, String fruizioneAutorizzazioneAutenticati,
			String fruizioneAutorizzazioneRuoli, String fruizioneRuolo, String fruizioneAutorizzazioneRuoliTipologia,
			String fruizioneAutorizzazioneRuoliMatch, String fruizioneServizioApplicativo,
			String gestioneToken, String[] gestioneTokenPolicyLabels, String[] gestioneTokenPolicyValues,
			String gestioneTokenPolicy, String gestioneTokenOpzionale, 
			String gestioneTokenValidazioneInput, String gestioneTokenIntrospection, String gestioneTokenUserInfo, String gestioneTokenForward,
			String autenticazioneTokenIssuer,String autenticazioneTokenClientId,String autenticazioneTokenSubject,String autenticazioneTokenUsername,String autenticazioneTokenEMail,
			String autorizzazioneToken, String autorizzazioneTokenOptions,
			String autorizzazioneScope,  String scope, String autorizzazioneScopeMatch, BinaryParameter allegatoXacmlPolicy,
			String identificazioneAttributiStato, String[] attributeAuthorityLabels, String[] attributeAuthorityValues, String [] attributeAuthoritySelezionate, String attributeAuthorityAttributi,
			String autorizzazioneAutenticatiToken, 
			String autorizzazioneRuoliToken, String autorizzazioneRuoliTipologiaToken, String autorizzazioneRuoliMatchToken) throws Exception{
		
		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;
			}
		}
		
		Boolean contaListe = ServletUtils.getContaListeFromSession(this.session);
		
		DataElement de = new DataElement();
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_PORTE_DELEGATE);
		de.setType(DataElementType.TITLE);
		dati.add(de);
		
		// Nome Gruppo
		de = new DataElement();
		de.setName(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME_GRUPPO);
		de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_NOME_GRUPPO);
		de.setValue(nomeGruppo);
		de.setType(DataElementType.TEXT_EDIT);
		de.setRequired(true); 
		dati.add(de);
		
		// Azione
		de = new DataElement();
		de.setLabel(this.getLabelAzioni(serviceBinding));
		de.setValues(azioniDisponibiliList);
		de.setLabels(azioniDisponibiliLabelList);
		de.setSelezionati(azioni); 
		de.setType(DataElementType.MULTI_SELECT);
		de.setName(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_AZIONI);
		de.setRows(CostantiControlStation.RIGHE_MULTISELECT_AZIONI);
		de.setRequired(true); 
		dati.add(de);
		
		
		// Nome
		de = new DataElement();
		de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_NOME);
		de.setValue(nome);
		de.setType(DataElementType.HIDDEN);
		de.setRequired(true);
		de.setName(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME);
		dati.add(de);
		
		// mode
		de = new DataElement();
		de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MODO_CREAZIONE);
		String[] modeLabels = {PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MODO_CREAZIONE_EREDITA,PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MODO_CREAZIONE_NUOVA};
		String[] modeValues = {PorteDelegateCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_DELEGATE_MODO_CREAZIONE_EREDITA, PorteDelegateCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_DELEGATE_MODO_CREAZIONE_NUOVA};
		de.setLabels(modeLabels); 
		de.setValues(modeValues);
		de.setSelected(modeCreazione);
		de.setType(DataElementType.SELECT);
		de.setName(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_MODE_CREAZIONE);
		de.setPostBack(true, true);
		dati.add(de);
		
		// 	modo creazione: se erediti la configurazione da una precedente allora devi solo sezionarla, altrimenti devi compilare le sezioni SA e controllo accessi
		if(modeCreazione.equals(PorteDelegateCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_DELEGATE_MODO_CREAZIONE_EREDITA)) {
			// mapping
			de = new DataElement();
			de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MAPPING_GRUPPO);
			de.setLabels(listaMappingLabels); 
			de.setValues(listaMappingValues);
			de.setSelected(mapping);
			de.setToolTip(mappingLabel);
			de.setType(DataElementType.SELECT);
			de.setName(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_MAPPING);
			de.setPostBack(true);
			dati.add(de);
		}
		
		// Controllo se richiedere il connettore
		boolean connettoreStatic = false;
		if(gestioneFruitori) {
			connettoreStatic = this.apsCore.isConnettoreStatic(this.soggettiCore.getProtocolloAssociatoTipoSoggetto(asps.getTipoSoggettoErogatore()));
		}
		
		// mode Connettore
		de = new DataElement();
		de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MODO_CREAZIONE_CONNETTORE);
		de.setName(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_MODE_CREAZIONE_CONNETTORE);
		if(this.isModalitaStandard() || connettoreStatic) {
			de.setType(DataElementType.HIDDEN);
			de.setValue(modeCreazione);
		}
		else {
			de.setType(DataElementType.CHECKBOX);
			de.setSelected(ServletUtils.isCheckBoxEnabled(modeCreazioneConnettore));
			de.setPostBack(true);
		}
		dati.add(de);
		
		if(!modeCreazione.equals(PorteDelegateCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_DELEGATE_MODO_CREAZIONE_EREDITA)) {
			
			this.controlloAccessiAdd(dati, tipoOp, controlloAccessiStato, false);
			
			String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(asps.getTipoSoggettoErogatore());
			
			this.controlloAccessiGestioneToken(dati, tipoOp, gestioneToken, gestioneTokenPolicyLabels, gestioneTokenPolicyValues, 
					gestioneTokenPolicy, gestioneTokenOpzionale,
					gestioneTokenValidazioneInput, gestioneTokenIntrospection, gestioneTokenUserInfo, gestioneTokenForward, null,protocollo,true,
					false);
		
			this.controlloAccessiAutenticazione(dati, tipoOp, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_ADD,null,protocollo,
					fruizioneAutenticazione, null, fruizioneAutenticazioneOpzionale, fruizioneAutenticazionePrincipal, fruizioneAutenticazioneParametroList, false, true,true,
					gestioneToken, gestioneTokenPolicy, autenticazioneTokenIssuer, autenticazioneTokenClientId, autenticazioneTokenSubject, autenticazioneTokenUsername, autenticazioneTokenEMail,
					false, null, 0,
					false, false);
			
			this.controlloAccessiAutorizzazione(dati, tipoOp, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_ADD,null,protocollo,
				fruizioneAutenticazione, null,
				fruizioneAutorizzazione, null, 
				fruizioneAutorizzazioneAutenticati, null, 0, saList, fruizioneServizioApplicativo,
				fruizioneAutorizzazioneRuoli, null, 0, fruizioneRuolo,
				fruizioneAutorizzazioneRuoliTipologia, fruizioneAutorizzazioneRuoliMatch, 
				false, erogazioneIsSupportatoAutenticazioneSoggetti, contaListe, true, false,autorizzazioneScope,null,0,scope,autorizzazioneScopeMatch,
				gestioneToken, gestioneTokenPolicy, 
				autorizzazioneToken, autorizzazioneTokenOptions,allegatoXacmlPolicy,
				null, 0 , null, 0,
				identificazioneAttributiStato, attributeAuthorityLabels, attributeAuthorityValues, attributeAuthoritySelezionate, attributeAuthorityAttributi,
				autorizzazioneAutenticatiToken, null, 0,
				autorizzazioneRuoliToken, null, 0, autorizzazioneRuoliTipologiaToken, autorizzazioneRuoliMatchToken);
		}
		
		return dati;
	}

	
	public List<Parameter> getTitoloAps(TipoOperazione tipoOperazione, AccordoServizioParteSpecifica asps, boolean gestioneFruitori, String labelApsTitle, String servletNameApsChange, boolean addApsChange, String tipoSoggettoFruitore, String nomeSoggettoFruitore) throws Exception {
		
		if(tipoOperazione!=null) {
			// nop
		}
		
		List<Parameter> listaParams = new ArrayList<>();
		
		Parameter pIdServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId()+ "");
		Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, asps.getNome());
		Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, asps.getTipo());
		Boolean vistaErogazioni = ServletUtils.getBooleanAttributeFromSession(ErogazioniCostanti.ASPS_EROGAZIONI_ATTRIBUTO_VISTA_EROGAZIONI, this.session, this.request).getValue();
		String labelApsChange = null;
		
		List<Parameter> listParametersErogazioniChange = new ArrayList<>();
		listParametersErogazioniChange.add(pIdServizio);
		listParametersErogazioniChange.add(pNomeServizio);
		listParametersErogazioniChange.add(pTipoServizio);
		if(gestioneFruitori) {
			Parameter pTipoSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE, tipoSoggettoFruitore);
			Parameter pNomeSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE, nomeSoggettoFruitore);
			listParametersErogazioniChange.add(pTipoSoggettoFruitore);
			listParametersErogazioniChange.add(pNomeSoggettoFruitore);
		}
		if(vistaErogazioni != null && vistaErogazioni.booleanValue()) {
			if(gestioneFruitori) {
				listaParams.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_FRUIZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
				
			} else {
				listaParams.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_EROGAZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
			}
			
			
			listaParams.add(new Parameter(labelApsTitle, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_CHANGE, listParametersErogazioniChange));
			
			String paramModificaProfilo = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_PROFILO);
			String paramModificaAPI = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API);
			String paramCambiaAPI = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_API);
			String paramModificaDescrizione = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_DESCRIZIONE);
			String paramCambiaErogatore = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_SOGGETTO_EROGATORE);
			
			User user = ServletUtils.getUserFromSession(this.request, this.session);
			boolean isAccordiCooperazione = user.getPermessi().isAccordiCooperazione();
			boolean isServizi = user.getPermessi().isServizi();
			String asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO;
			if(isServizi && !isAccordiCooperazione){
				asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_PARTE_COMUNE;
			}
			if(!isServizi  && isAccordiCooperazione){
				asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_COMPOSTO;
			}
			/**if(isServizi  && isAccordiCooperazione){
				asLabel = AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO;
			}*/
			
			if("true".equals(paramModificaAPI) || "true".equals(paramCambiaAPI)) {
				labelApsChange = asLabel;
			}
			else if("true".equals(paramCambiaErogatore)) {
				labelApsChange = AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_EROGATORE;
			}
			else if("true".equals(paramModificaProfilo)) {
				labelApsChange = AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_PROTOCOLLO;
			}
			else if("true".equals(paramModificaDescrizione)) {
				labelApsChange = AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_DESCRIZIONE;
			}
			else {
				labelApsChange = ErogazioniCostanti.LABEL_ASPS_MODIFICA_SERVIZIO_INFO_GENERALI;
			}
			
		} else {
			if(gestioneFruitori) {
				listaParams.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS_FRUITORI, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
			}
			else {
				listaParams.add(new Parameter(AccordiServizioParteSpecificaCostanti.LABEL_APS, AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_LIST));
			}
			labelApsChange = labelApsTitle;
		}
		
		if(addApsChange) {
			Parameter parameterApcChange = servletNameApsChange != null ? new Parameter(labelApsChange, servletNameApsChange, listParametersErogazioniChange) : new Parameter(labelApsChange, servletNameApsChange);
			listaParams.add(parameterApcChange);
		}
		
		return listaParams;
	}

	protected ProprietaOggetto creaProprietaOggetto(AccordoServizioParteSpecifica asps, boolean gestioneFruitori, Fruitore fruitore, IDServizio idServizio, IDSoggetto idSoggettoFruitore) {
		ProprietaOggetto pOggetto = null;
		if(gestioneFruitori) {
			pOggetto = ProprietaOggettoRegistro.mergeProprietaOggetto(fruitore.getProprietaOggetto(), idServizio, idSoggettoFruitore, this.porteDelegateCore, this); 
		}
		else {
			pOggetto = ProprietaOggettoRegistro.mergeProprietaOggetto(asps.getProprietaOggetto(), idServizio, this.porteApplicativeCore, this.saCore, this); 
		}
		return pOggetto;
	}
	
	
}