ErogazioniHelper.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.erogazioni;

import java.text.MessageFormat;
import java.util.ArrayList;
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.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.core.commons.Filtri;
import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.core.commons.Search;
import org.openspcoop2.core.commons.SearchUtils;
import org.openspcoop2.core.config.AttributeAuthority;
import org.openspcoop2.core.config.CanaleConfigurazione;
import org.openspcoop2.core.config.CanaliConfigurazione;
import org.openspcoop2.core.config.Connettore;
import org.openspcoop2.core.config.GenericProperties;
import org.openspcoop2.core.config.GestioneToken;
import org.openspcoop2.core.config.InvocazioneServizio;
import org.openspcoop2.core.config.MessageSecurity;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaApplicativaServizioApplicativo;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.Property;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.constants.MTOMProcessorType;
import org.openspcoop2.core.config.constants.RuoloContesto;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
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.CostantiDB;
import org.openspcoop2.core.constants.TipiConnettore;
import org.openspcoop2.core.id.IDFruizione;
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.Config;
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.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.GruppoSintetico;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.pdd.config.ConfigurazionePdDReader;
import org.openspcoop2.pdd.config.UrlInvocazioneAPI;
import org.openspcoop2.pdd.core.connettori.ConnettoreUtils;
import org.openspcoop2.pdd.core.token.PolicyGestioneToken;
import org.openspcoop2.pdd.core.token.PolicyNegoziazioneToken;
import org.openspcoop2.pdd.core.token.TokenUtilities;
import org.openspcoop2.pdd.core.token.attribute_authority.AttributeAuthorityUtilities;
import org.openspcoop2.pdd.core.token.attribute_authority.PolicyAttributeAuthority;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.registry.RegistroServiziReader;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.ArchiveType;
import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
import org.openspcoop2.protocol.sdk.properties.ConsoleConfiguration;
import org.openspcoop2.protocol.sdk.properties.IConsoleDynamicConfiguration;
import org.openspcoop2.protocol.sdk.registry.IConfigIntegrationReader;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.protocol.utils.ModIUtils;
import org.openspcoop2.security.message.utils.SecurityUtils;
import org.openspcoop2.utils.certificate.KeystoreParams;
import org.openspcoop2.web.ctrlstat.core.CertificateChecker;
import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.costanti.CostantiControlStation;
import org.openspcoop2.web.ctrlstat.costanti.InUsoType;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationException;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationNotFound;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneUtilities;
import org.openspcoop2.web.ctrlstat.servlet.apc.api.ApiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaCostanti;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaHelper;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaUtilities;
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.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.lib.mvc.AreaBottoni;
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.ForwardParams;
import org.openspcoop2.web.lib.mvc.GeneralData;
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.TargetType;
import org.openspcoop2.web.lib.mvc.TipoOperazione;

/**
 * ErogazioniHelper
 * 
 * @author Andrea Poli (poli@link.it)
 * @author Giuliano Pintori (pintori@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public class ErogazioniHelper extends AccordiServizioParteSpecificaHelper{

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

	public void checkGestione(HttpServletRequest request, HttpSession session, ConsoleSearch ricerca, int idLista, String tipologiaParameterName) throws Exception {
		this.checkGestione(request, session, ricerca, idLista, tipologiaParameterName, false);
	}

	public void checkGestione(HttpServletRequest request, HttpSession session, ConsoleSearch ricerca, int idLista, String tipologiaParameterName, boolean addFilterToRicerca) throws Exception { 
		String tipologia = this.getParameter(tipologiaParameterName);
		if(tipologia==null) {
			// guardo se sto entrando da altri link fuori dal menu di sinistra
			// in tal caso e' gia' impostato
			tipologia = ServletUtils.getObjectFromSession(request, session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
		}

		if(tipologia!=null) {
			if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_EROGAZIONE.equals(tipologia)) {
				ServletUtils.setObjectIntoSession(request, session, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_EROGAZIONE, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
				if(addFilterToRicerca)
					ricerca.addFilter(idLista, Filtri.FILTRO_DOMINIO, SoggettiCostanti.SOGGETTO_DOMINIO_OPERATIVO_VALUE);
			}
			else if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE.equals(tipologia)) {
				ServletUtils.setObjectIntoSession(request, session, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
				
				boolean filtraSoloEsterni = true;
				if(addFilterToRicerca) {
					if(this.apsCore.isMultitenant() && this.apsCore.getMultitenantSoggettiFruizioni()!=null) {
						switch (this.apsCore.getMultitenantSoggettiFruizioni()) {
						case SOLO_SOGGETTI_ESTERNI:
							filtraSoloEsterni = true;
							break;
						case ESCLUDI_SOGGETTO_FRUITORE:
						case TUTTI:
							filtraSoloEsterni = false;
							break;
						}
					}
				}
				
				if(addFilterToRicerca && filtraSoloEsterni)
					ricerca.addFilter(idLista, Filtri.FILTRO_DOMINIO, SoggettiCostanti.SOGGETTO_DOMINIO_ESTERNO_VALUE);
			}
			else if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_COMPLETA.equals(tipologia)) {
				ServletUtils.removeObjectFromSession(request, session, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
			}
			
			if(addFilterToRicerca && this.isSoggettoMultitenantSelezionato()) {
				ricerca.addFilter(idLista, Filtri.FILTRO_SOGGETTO, this.getSoggettoMultitenantSelezionato());
			}
		}
	}

	public boolean isGestioneFruitori(String tipologia) throws Exception { 
		boolean gestioneFruitori = false;
		if(tipologia==null) {
			// guardo se sto entrando da altri link fuori dal menu di sinistra in tal caso e' gia' impostato
			tipologia = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
		}

		if(tipologia!=null && AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE.equals(tipologia)) {
			gestioneFruitori = true;
		}

		return gestioneFruitori;
	}

	public DataElement newDataElementStatoApiErogazione(DataElement de, boolean setWidthPx,
			AccordoServizioParteSpecifica asps,AccordoServizioParteComuneSintetico apc, String nomePortaDefault,
			List<MappingErogazionePortaApplicativa> listaMappingErogazionePortaApplicativa, List<PortaApplicativa> listaPorteApplicativeAssociate) throws Exception {
		int numeroAbilitate = 0;
		int numeroConfigurazioni = 0;
		int numeroConfigurazioniSchedulingDisabilitato = 0;
		boolean allActionRedefined = false;
		String msgControlloAccessiMalConfigurato = null;
		// stato gruppi
		numeroConfigurazioni = listaMappingErogazionePortaApplicativa.size();
		
		if(listaMappingErogazionePortaApplicativa.size()>1) {
			List<String> azioniL = new ArrayList<>();
			Map<String,String> azioni = this.apsCore.getAzioniConLabel(asps, apc, false, true, new ArrayList<>());
			if(azioni != null && azioni.size() > 0)
				azioniL.addAll(azioni.keySet());
			allActionRedefined = this.allActionsRedefinedMappingErogazione(azioniL, listaMappingErogazionePortaApplicativa);
		}
		
		for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
			
			String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(paAssociata.getTipoSoggettoProprietario());
			boolean modipa = this.isProfiloModIPA(protocollo);
			
			boolean statoPA = paAssociata.getStato().equals(StatoFunzionalita.ABILITATO);
			if(statoPA) {
				if(!allActionRedefined || !paAssociata.getNome().equals(nomePortaDefault)) {
					numeroAbilitate ++;
				}
			}
			
			if(allActionRedefined && paAssociata.getNome().equals(nomePortaDefault)) {
				// se tutte le azioni sono state ridefinite non devo controllare la porta di default
				continue;
			}
			
			if(StatoFunzionalita.ABILITATO.equals(paAssociata.getStato()) && msgControlloAccessiMalConfigurato==null){
				if(TipoAutorizzazione.isAuthenticationRequired(paAssociata.getAutorizzazione())) {
					if( 
							(paAssociata.getSoggetti()==null || paAssociata.getSoggetti().sizeSoggettoList()<=0) 
							&&
							(paAssociata.getServiziApplicativiAutorizzati()==null || paAssociata.getServiziApplicativiAutorizzati().sizeServizioApplicativoList()<=0)
							) {
						if(!modipa) {
							msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TRASPORTO_NO_FRUITORI;
						}
						else {
							msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_CANALE_NO_FRUITORI;
						}
						if(listaMappingErogazionePortaApplicativa.size()>1) {
							for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
								if(mappinErogazione.getIdPortaApplicativa().getNome().equals(paAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappinErogazione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(msgControlloAccessiMalConfigurato==null && 
						TipoAutorizzazione.isRolesRequired(paAssociata.getAutorizzazione())) {
					if( 
							(paAssociata.getRuoli()==null || paAssociata.getRuoli().sizeRuoloList()<=0) 
						) {
						if(!modipa) {
							msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TRASPORTO_NO_RUOLI;
						}
						else {
							msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_CANALE_NO_RUOLI;
						}
						if(listaMappingErogazionePortaApplicativa.size()>1) {
							for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
								if(mappinErogazione.getIdPortaApplicativa().getNome().equals(paAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappinErogazione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(msgControlloAccessiMalConfigurato==null && 
						paAssociata.getGestioneToken()!=null && StatoFunzionalita.ABILITATO.equals(paAssociata.getStato()) &&
						paAssociata.getAutorizzazioneToken()!=null && StatoFunzionalita.ABILITATO.equals(paAssociata.getAutorizzazioneToken().getAutorizzazioneApplicativi())) {
					if(modipa) {
						if (paAssociata.getServiziApplicativiAutorizzati()==null || paAssociata.getServiziApplicativiAutorizzati().sizeServizioApplicativoList()<=0) {
							msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_MESSAGGIO_NO_FRUITORI;
						}
					}
					else if( 
							paAssociata.getAutorizzazioneToken().getServiziApplicativi()==null || 	(paAssociata.getAutorizzazioneToken().getServiziApplicativi().sizeServizioApplicativoList()<=0) 
						) {
						msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TOKEN_NO_FRUITORI;
					}
					if(msgControlloAccessiMalConfigurato!=null) {
						if(listaMappingErogazionePortaApplicativa.size()>1) {
							for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
								if(mappinErogazione.getIdPortaApplicativa().getNome().equals(paAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappinErogazione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(msgControlloAccessiMalConfigurato==null && 
						paAssociata.getGestioneToken()!=null && StatoFunzionalita.ABILITATO.equals(paAssociata.getStato()) &&
						paAssociata.getAutorizzazioneToken()!=null && StatoFunzionalita.ABILITATO.equals(paAssociata.getAutorizzazioneToken().getAutorizzazioneRuoli())) {
					if( 
							paAssociata.getAutorizzazioneToken().getRuoli()==null || 	(paAssociata.getAutorizzazioneToken().getRuoli().sizeRuoloList()<=0) 
						) {
						if(!modipa) {
							msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TOKEN_NO_RUOLI;
						}
						else {
							msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_MESSAGGIO_NO_RUOLI;
						}
						if(listaMappingErogazionePortaApplicativa.size()>1) {
							for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
								if(mappinErogazione.getIdPortaApplicativa().getNome().equals(paAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappinErogazione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(msgControlloAccessiMalConfigurato==null && 
						paAssociata.getGestioneToken()!=null && StatoFunzionalita.ABILITATO.equals(paAssociata.getStato()) &&
						paAssociata.getScope()!=null && StatoFunzionalita.ABILITATO.equals(paAssociata.getScope().getStato())) {
					if( 
							(paAssociata.getScope().sizeScopeList()<=0) 
						) {
						msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TOKEN_NO_SCOPE;
						if(listaMappingErogazionePortaApplicativa.size()>1) {
							for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
								if(mappinErogazione.getIdPortaApplicativa().getNome().equals(paAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappinErogazione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(paAssociata.getBehaviour()!=null && paAssociata.sizeServizioApplicativoList()>0) {
					for (PortaApplicativaServizioApplicativo paSA : paAssociata.getServizioApplicativoList()) {
						if(paSA!=null && paSA.getDatiConnettore()!=null && 
								StatoFunzionalita.DISABILITATO.equals(paSA.getDatiConnettore().getScheduling()) &&
								!StatoFunzionalita.DISABILITATO.equals(paSA.getDatiConnettore().getStato())) {
							numeroConfigurazioniSchedulingDisabilitato++;
						}
					}
				}
			}
		}
		
		return newDataElementStatoApi(de, setWidthPx, msgControlloAccessiMalConfigurato, null, numeroAbilitate, numeroConfigurazioni, numeroConfigurazioniSchedulingDisabilitato, allActionRedefined);
	}
	
	public DataElement newDataElementStatoApiFruizione(DataElement de, boolean setWidthPx,
			AccordoServizioParteSpecifica asps,AccordoServizioParteComuneSintetico apc, String nomePortaDefault,
			List<MappingFruizionePortaDelegata> listaMappingFruzionePortaDelegata, List<PortaDelegata> listaPorteDelegateAssociate) throws Exception {
		int numeroAbilitate = 0;
		int numeroConfigurazioni = 0;
		boolean allActionRedefined = false;
		String msgControlloAccessiMalConfigurato = null;
		// stato gruppi

		numeroConfigurazioni = listaMappingFruzionePortaDelegata.size();
		
		if(listaMappingFruzionePortaDelegata.size()>1) {
			List<String> azioniL = new ArrayList<>();
			Map<String,String> azioni = this.porteDelegateCore.getAzioniConLabel(asps, apc, false, true, new ArrayList<>());
			if(azioni != null && azioni.size() > 0)
				azioniL.addAll(azioni.keySet());
			allActionRedefined = this.allActionsRedefinedMappingFruizione(azioniL, listaMappingFruzionePortaDelegata);
		}
		
		for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
			boolean statoPD = pdAssociata.getStato().equals(StatoFunzionalita.ABILITATO);
			if(statoPD) {
				if(!allActionRedefined || !pdAssociata.getNome().equals(nomePortaDefault)) {
					numeroAbilitate ++;
				}
			}
			
			if(allActionRedefined && pdAssociata.getNome().equals(nomePortaDefault)) {
				// se tutte le azioni sono state ridefinite non devo controllare la porta di default
				continue;
			}
			
			if(StatoFunzionalita.ABILITATO.equals(pdAssociata.getStato()) && msgControlloAccessiMalConfigurato==null){
				if(TipoAutorizzazione.isAuthenticationRequired(pdAssociata.getAutorizzazione())) {
					if( 
							(pdAssociata.sizeServizioApplicativoList()<=0)
							) {
						msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TRASPORTO_NO_FRUITORI;
						if(listaMappingFruzionePortaDelegata.size()>1) {
							for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
								if(mappingFruizione.getIdPortaDelegata().getNome().equals(pdAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappingFruizione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(msgControlloAccessiMalConfigurato==null && 
						TipoAutorizzazione.isRolesRequired(pdAssociata.getAutorizzazione())) {
					if( 
							(pdAssociata.getRuoli()==null || pdAssociata.getRuoli().sizeRuoloList()<=0) 
						) {
						msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TRASPORTO_NO_RUOLI;
						if(listaMappingFruzionePortaDelegata.size()>1) {
							for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
								if(mappingFruizione.getIdPortaDelegata().getNome().equals(pdAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappingFruizione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(msgControlloAccessiMalConfigurato==null && 
						pdAssociata.getGestioneToken()!=null && StatoFunzionalita.ABILITATO.equals(pdAssociata.getStato()) &&
						pdAssociata.getAutorizzazioneToken()!=null && StatoFunzionalita.ABILITATO.equals(pdAssociata.getAutorizzazioneToken().getAutorizzazioneApplicativi())) {
					if( 
							pdAssociata.getAutorizzazioneToken().getServiziApplicativi()==null || 	(pdAssociata.getAutorizzazioneToken().getServiziApplicativi().sizeServizioApplicativoList()<=0) 
						) {
						msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TOKEN_NO_FRUITORI;
						if(listaMappingFruzionePortaDelegata.size()>1) {
							for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
								if(mappingFruizione.getIdPortaDelegata().getNome().equals(pdAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappingFruizione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(msgControlloAccessiMalConfigurato==null && 
						pdAssociata.getGestioneToken()!=null && StatoFunzionalita.ABILITATO.equals(pdAssociata.getStato()) &&
						pdAssociata.getAutorizzazioneToken()!=null && StatoFunzionalita.ABILITATO.equals(pdAssociata.getAutorizzazioneToken().getAutorizzazioneRuoli())) {
					if( 
							pdAssociata.getAutorizzazioneToken().getRuoli()==null || (pdAssociata.getAutorizzazioneToken().getRuoli().sizeRuoloList()<=0) 
						) {
						msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TOKEN_NO_RUOLI;
						if(listaMappingFruzionePortaDelegata.size()>1) {
							for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
								if(mappingFruizione.getIdPortaDelegata().getNome().equals(pdAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappingFruizione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
				
				if(msgControlloAccessiMalConfigurato==null && 
						pdAssociata.getGestioneToken()!=null && StatoFunzionalita.ABILITATO.equals(pdAssociata.getStato()) &&
						pdAssociata.getScope()!=null && StatoFunzionalita.ABILITATO.equals(pdAssociata.getScope().getStato())) {
					if( 
							(pdAssociata.getScope().sizeScopeList()<=0) 
						) {
						msgControlloAccessiMalConfigurato = ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONTROLLO_ACCESSO_AUTORIZZAZIONE_TOKEN_NO_SCOPE;
						if(listaMappingFruzionePortaDelegata.size()>1) {
							for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
								if(mappingFruizione.getIdPortaDelegata().getNome().equals(pdAssociata.getNome())) {
									msgControlloAccessiMalConfigurato = "(Gruppo: '"+mappingFruizione.getDescrizione()+"') "+ msgControlloAccessiMalConfigurato;
									break;
								}
							}
						}
					}
				}
			}
		}
		
		return newDataElementStatoApi(de, setWidthPx, msgControlloAccessiMalConfigurato, null, numeroAbilitate, numeroConfigurazioni, -1, allActionRedefined);
	}
	
	private DataElement newDataElementStatoApi(DataElement deParam, boolean setWidthPx, String msgControlloAccessiMalConfiguratoError,  String msgControlloAccessiMalConfiguratoWarning, 
			int numeroAbilitate, int numeroConfigurazioni, int numeroConfigurazioniSchedulingDisabilitato, 
			boolean allActionRedefined) {
		
		DataElement de = deParam;
		boolean list = false;
		if(de==null) {
			de = new DataElement();
			list = true;
		}
		if(list) {
			de.setName(ErogazioniCostanti.ASPS_EROGAZIONI_PARAMETRO_STATO_CONFIGURAZIONI);
		}
		de.setType(DataElementType.CHECKBOX);
		if(msgControlloAccessiMalConfiguratoError!=null) {
			de.setStatusType(CheckboxStatusType.DISABILITATO);
			de.setStatusToolTip(msgControlloAccessiMalConfiguratoError);
		}
		else if(msgControlloAccessiMalConfiguratoWarning!=null) {
			de.setStatusType(CheckboxStatusType.WARNING_ONLY);
			de.setStatusToolTip(msgControlloAccessiMalConfiguratoWarning);
		}
		else if(numeroAbilitate == 0) {
			de.setStatusType(CheckboxStatusType.DISABILITATO);
			de.setStatusToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_TUTTE_DISABILITATE_TOOLTIP);
		} else if( 
				(!allActionRedefined && numeroAbilitate == numeroConfigurazioni) 
				||
				(allActionRedefined && numeroAbilitate == (numeroConfigurazioni-1)) // escludo la regola che non viene usata poiche' tutte le azioni sono ridefinite 
				) {
			
			if(numeroConfigurazioniSchedulingDisabilitato>0) {
				de.setStatusType(CheckboxStatusType.WARNING_ONLY);
				de.setStatusToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_CONNETTORI_MULTIPLI_SCHEDULING_DISABILITATO_TOOLTIP);
			}
			else {
				de.setStatusType(CheckboxStatusType.ABILITATO);
				de.setStatusToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_TUTTE_ABILITATE_TOOLTIP);
			}
		} else  {
			de.setStatusType(CheckboxStatusType.WARNING_ONLY);
			de.setStatusToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_STATO_CONFIGURAZIONI_PARZIALMENTE_ABILITATE_TOOLTIP);
		}
		if(setWidthPx) {
			de.setWidthPx(16);
		}

		return de;
		
	}
	
	public void prepareErogazioniList(ISearch ricerca, List<AccordoServizioParteSpecifica> lista) throws Exception {
		try {

			ServletUtils.addListElementIntoSession(this.request, this.session, ErogazioniCostanti.OBJECT_NAME_ASPS_EROGAZIONI);

			String tipologia = ServletUtils.getObjectFromSession(this.request, this.session, String.class, AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE);
			boolean gestioneFruitori = this.isGestioneFruitori(tipologia);
			boolean visualizzaGruppi = false;

			if(gestioneFruitori)
				this.pd.setCustomListViewName(ErogazioniCostanti.ASPS_EROGAZIONI_NOME_VISTA_CUSTOM_LISTA_FRUIZIONI);
			else 
				this.pd.setCustomListViewName(ErogazioniCostanti.ASPS_EROGAZIONI_NOME_VISTA_CUSTOM_LISTA_EROGAZIONI);

			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.isEmpty()) {
					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);

			String filterProtocollo = addFilterProtocol(ricerca, idLista, true);
			boolean profiloSelezionato = false;
			String protocolloS = filterProtocollo;
			if(protocolloS==null) {
				// significa che e' stato selezionato un protocollo nel menu in alto a destra
				List<String> protocolli = this.core.getProtocolli(this.request, this.session);
				if(protocolli!=null && protocolli.size()==1) {
					protocolloS = protocolli.get(0);
				}
			}
			if( (filterProtocollo!=null && 
					//!"".equals(filterProtocollo) &&
					!CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PROTOCOLLO_QUALSIASI.equals(filterProtocollo))
					||
				(filterProtocollo==null && protocolloS!=null)
					) {
				profiloSelezionato = true;
			}
			
			String protocolloPerFiltroProprieta = protocolloS;
			// valorizzato con il protocollo nel menu in alto a destra oppure null, controllo se e' stato selezionato nel filtro di ricerca
			if(protocolloPerFiltroProprieta == null) {
				if(
						//"".equals(filterProtocollo) || 
						CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PROTOCOLLO_QUALSIASI.equals(filterProtocollo)) {
					protocolloPerFiltroProprieta = null;
				} else {
					protocolloPerFiltroProprieta = filterProtocollo;
				}
			}
			
			String soggettoPerFiltroProprieta = null;
			if(profiloSelezionato) {
				// soggetto non selezionato nel menu' in alto a dx
				if(!this.isSoggettoMultitenantSelezionato()) {
					soggettoPerFiltroProprieta = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_SOGGETTO);
					if(
							//"".equals(soggettoPerFiltroProprieta) || 
							CostantiControlStation.DEFAULT_VALUE_PARAMETRO_SOGGETTO_QUALSIASI.equals(soggettoPerFiltroProprieta)) {
						soggettoPerFiltroProprieta = null;
					}
				} else {
					soggettoPerFiltroProprieta = this.getSoggettoMultitenantSelezionato();
				}
			}
			
			// filtri MODIPA da visualizzare solo se non e' stato selezionato un protocollo in alto a dx  (opzione pilota da file di proprieta')
			// oppure e' selezionato MODIPA
			// oppure non e' stato selezionato un protocollo in alto e nessun protocollo nei filtri  (opzione pilota da file di proprieta')
			// oppure MODIPA nei filtri
			boolean profiloModipaSelezionato = false;
			// solo se il protocollo modipa e' caricato faccio la verifica
			if(this.core.getProtocolli().contains(CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PROTOCOLLO_MODIPA)) {
				List<String> profiloModipaSelezionatoOpzioniAccettate = new ArrayList<>();
				profiloModipaSelezionatoOpzioniAccettate.add(CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PROTOCOLLO_MODIPA);
				if(this.core.isModipaFiltroRicercaProfiloQualsiasiVisualizzaDatiModi()) {
					profiloModipaSelezionatoOpzioniAccettate.add(CostantiControlStation.DEFAULT_VALUE_PARAMETRO_PROTOCOLLO_QUALSIASI);
				}
				if( (filterProtocollo!=null && profiloModipaSelezionatoOpzioniAccettate.contains(filterProtocollo))
						||
					(filterProtocollo==null && protocolloS!=null && profiloModipaSelezionatoOpzioniAccettate.contains(protocolloS))
					) {
					profiloModipaSelezionato = true;
				}
			}
			
			if( profiloSelezionato && 
					(!this.isSoggettoMultitenantSelezionato())) {
				String filterSoggetto = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_SOGGETTO);
				this.addFilterSoggetto(filterSoggetto,protocolloS,true,true);
			}
						
			String filterTipoAccordo = null;
			if(showServiceBinding) {
				filterTipoAccordo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_SERVICE_BINDING);
				boolean postBackServiceBinding = profiloSelezionato // serve se poi si fa vedere le API
						||
						profiloModipaSelezionato; // serve per pilotare la label audience e sulla sicurezza messaggio
				this.addFilterServiceBinding(filterTipoAccordo,postBackServiceBinding,true);
			}
			
			String filterGruppo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_GRUPPO);
			boolean postBackGruppo = profiloSelezionato; // serve se poi si fa vedere le API
			addFilterGruppo(filterProtocollo, filterGruppo, postBackGruppo);

			if( profiloSelezionato ) {
				String filterApi = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_API);
				addFilterApi(filterProtocollo, filterTipoAccordo,filterGruppo, filterApi, false);
			}
			
			CanaliConfigurazione canali = this.confCore.getCanaliConfigurazione(false);
			if(canali!=null && StatoFunzionalita.ABILITATO.equals(canali.getStato())) {
				String filterCanale = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CANALE);
				addFilterCanale(canali, filterCanale, false);
			}
			
			if(this.isShowGestioneWorkflowStatoDocumenti() &&
				this.core.isGestioneWorkflowStatoDocumentiVisualizzaStatoLista()) {
				String filterStatoAccordo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_STATO_ACCORDO);
				this.addFilterStatoAccordo(filterStatoAccordo,false);
			}
			
			if(gestioneFruitori) {
				addFilterSoggettoErogatoreStringaLiberaContains(ricerca, idLista);
			}
			
						
			// **** filtro connettore ****
			
			this.addFilterSubtitle(ConnettoriCostanti.NAME_SUBTITLE_DATI_CONNETTORE, ConnettoriCostanti.LABEL_SUBTITLE_DATI_CONNETTORE, false);
			
			// filtro tipo connettore con voce IM solo sulle erogazioni
			String filterTipoConnettore = this.addFilterTipoConnettore(ricerca, idLista, !gestioneFruitori);
			
			// filtro plugin
			this.addFilterConnettorePlugin(ricerca, idLista, filterTipoConnettore);
			
			// filtro debug
			if(!this.isModalitaStandard()) {
				this.addFilterConnettoreDebug(ricerca, idLista, filterTipoConnettore);
			}
			
			// filtro token policy
			this.addFilterConnettoreTokenPolicy(ricerca, idLista, filterTipoConnettore);
			
			// filtro endpoint
			this.addFilterConnettoreEndpoint(ricerca, idLista, filterTipoConnettore);
			
			// filtro keystore
			this.addFilterConnettoreKeystore(ricerca, idLista, filterTipoConnettore);
						
			// imposto apertura sezione
			this.impostaAperturaSubtitle(ConnettoriCostanti.NAME_SUBTITLE_DATI_CONNETTORE);
						
			// **** fine filtro connettore ****
			
			
			// **** filtro modi ****
			
			if(profiloModipaSelezionato) {
				this.addFilterSubtitle(CostantiControlStation.NAME_SUBTITLE_FILTRI_MODIPA, CostantiControlStation.LABEL_SUBTITLE_FILTRI_MODIPA, false);
				
				// filtro sicurezza canale
				this.addFilterModISicurezzaCanale(ricerca, idLista);
				
				// filtro sicurezza messaggio
				this.addFilterModISicurezzaMessaggio(ricerca, idLista, filterTipoAccordo);
				
				// filtro sorgente token
				this.addFilterModIGenerazioneToken(ricerca, idLista);
				
				// filtro sicurezza canale
				this.addFilterModIDigestRichiesta(ricerca, idLista);
				
				// filtro sicurezza canale
				this.addFilterModIInfoUtente(ricerca, idLista);
				
				// filtro keystore
				this.addFilterModIKeystorePath(ricerca, idLista);
				
				// filtro audience
				this.addFilterModIAudience(ricerca, idLista, false, filterTipoAccordo, null);
				
				// imposto apertura sezione
				this.impostaAperturaSubtitle(CostantiControlStation.NAME_SUBTITLE_FILTRI_MODIPA);
			}
			
			// **** fine filtro modi ****

			
			// **** filtro configurazione ****
			
			this.addFilterSubtitle(CostantiControlStation.NAME_SUBTITLE_DATI_CONFIGURAZIONE, CostantiControlStation.LABEL_SUBTITLE_DATI_CONFIGURAZIONE, false);
			
			// filtro stato
			this.addFilterStatoImplementazioneAPI(ricerca, idLista);
			
			// filtro autenticazione token
			this.addFilterTipoAutenticazioneToken(ricerca, idLista);
			
			// filtro autenticazione trasporto
			boolean modiErogazione = profiloModipaSelezionato && !gestioneFruitori;
			Boolean confPers = ServletUtils.getObjectFromSession(this.request, this.session, Boolean.class, CostantiControlStation.SESSION_PARAMETRO_GESTIONE_CONFIGURAZIONI_PERSONALIZZATE);
			String filterTipoAutenticazioneTrasporto = this.addFilterTipoAutenticazioneTrasporto(ricerca, idLista, true, modiErogazione, confPers);
			
			// filtro plugin autenticazione trasporto
			this.addFilterTipoAutenticazioneTrasportoPlugin(ricerca, idLista, filterTipoAutenticazioneTrasporto, gestioneFruitori);
			
			// filtro stato rate limiting
			this.addFilterConfigurazioneRateLimiting(ricerca, idLista);
			
			// filtro stato validazione
			this.addFilterConfigurazioneValidazione(ricerca, idLista);
			
			// filtro stato caching risposta
			this.addFilterConfigurazioneCacheRisposta(ricerca, idLista);
			
			// filtro stato message security
			this.addFilterConfigurazioneMessageSecurity(ricerca, idLista);
			
			// filtro stato mtom
			this.addFilterConfigurazioneMTOM(ricerca, idLista, filterTipoAccordo);
			
			// filtro trasformazione
			this.addFilterConfigurazioneTrasformazione(ricerca, idLista);
			
			// filtro transazioni
			this.addFilterConfigurazioneTransazioni(ricerca, idLista, false);
			
			// filtro correlazione applicativa
			this.addFilterConfigurazioneCorrelazioneApplicativa(ricerca, idLista);
			
			// filtro registrazione messaggi
			this.addFilterConfigurazioneTipoDump(ricerca, idLista, false);
			
			// filtro cors
			String filterCORS = this.addFilterConfigurazioneCORS(ricerca, idLista);
			
			// filtro cors origin
			this.addFilterConfigurazioneCORSOrigin(ricerca, idLista, filterCORS);
			
			// imposto apertura sezione
			this.impostaAperturaSubtitle(CostantiControlStation.NAME_SUBTITLE_DATI_CONFIGURAZIONE);
			
			// **** fine filtro configurazione ****
			
			
			// **** filtro proprieta ****
			
			List<String> nomiProprieta =null;
			if(gestioneFruitori) {
				nomiProprieta = this.nomiProprietaPD(protocolloPerFiltroProprieta,soggettoPerFiltroProprieta);
			} else {
				nomiProprieta = this.nomiProprietaPA(protocolloPerFiltroProprieta,soggettoPerFiltroProprieta);
			}
			
			if(nomiProprieta != null && !nomiProprieta.isEmpty()) {
				this.addFilterSubtitle(CostantiControlStation.NAME_SUBTITLE_PROPRIETA, CostantiControlStation.LABEL_SUBTITLE_PROPRIETA, false);
				
				// filtro nome
				this.addFilterProprietaNome(ricerca, idLista, nomiProprieta);
				
				// filtro valore
				this.addFilterProprietaValore(ricerca, idLista, nomiProprieta);
				
				// imposto apertura sezione
				this.impostaAperturaSubtitle(CostantiControlStation.NAME_SUBTITLE_PROPRIETA);
			}
			
			// **** fine filtro proprieta ****
			

			boolean showConfigurazionePA = false;
			boolean showConfigurazionePD = false;

			if(tipologia==null) {
				throw new DriverControlStationException("Parametro TipologiaErogazione non puo' essere vuoto");
			}

			if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_EROGAZIONE.equals(tipologia)) {
				showConfigurazionePA = true;
			}
			if(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_EROGAZIONE_VALUE_FRUIZIONE.equals(tipologia)) {
				showConfigurazionePD = true;
			}

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

			List<String> labelLst = new ArrayList<>();
			labelLst.add("");//AccordiServizioParteSpecificaCostanti.LABEL_APS_STATO); // colonna stato
			if(gestioneFruitori) {
				labelLst.add(ErogazioniCostanti.LABEL_ASPS_FRUIZIONI);
			}
			else {
				labelLst.add(ErogazioniCostanti.LABEL_ASPS_EROGAZIONI);
			}
			
			if(visualizzaGruppi)
				labelLst.add(ErogazioniCostanti.LABEL_ASPS_LISTA_EROGAZIONI_COLONNA_CONFIGURAZIONE);
			
			String [] labels = labelLst.toArray(new String[labelLst.size()]);
			this.pd.setLabels(labels);

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

			if(gestioneFruitori) {
				lstParm.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_FRUIZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
			} else {
				lstParm.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_EROGAZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
			}
			
			if(gestioneFruitori) {
				this.pd.setSearchLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_RICERCA_API_FRUIZIONE);
			}
			else {
				this.pd.setSearchLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_RICERCA_API_EROGAZIONE);
			}
			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, ErogazioniCostanti.LABEL_ASPS_EROGAZIONI, search);
			}

			List<AccordoServizioParteComuneSintetico> listApc = new ArrayList<>();
			List<String> protocolli = new ArrayList<>();
			
			// colleziono i tags registrati
			List<String> tagsDisponibili = this.gruppiCore.getAllGruppiOrdinatiPerDataRegistrazione();
			
			// configurazione dei canali
			CanaliConfigurazione gestioneCanali = this.confCore.getCanaliConfigurazione(false);
			boolean gestioneCanaliEnabled = gestioneCanali != null && org.openspcoop2.core.config.constants.StatoFunzionalita.ABILITATO.equals(gestioneCanali.getStato());
			List<CanaleConfigurazione> canaleList = gestioneCanali != null ? gestioneCanali.getCanaleList() : new ArrayList<>();
			CanaleConfigurazione canaleConfigurazioneDefault = gestioneCanaliEnabled ? this.getCanaleDefault(canaleList) : null;

			if(lista!=null) {
				for (AccordoServizioParteSpecifica asps : lista) {
					AccordoServizioParteComuneSintetico apc = this.apcCore.getAccordoServizioSintetico(asps.getIdAccordo());
					String tipoSoggetto = asps.getTipoSoggettoErogatore();
					String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(tipoSoggetto);
	
					listApc.add(apc);
					protocolli.add(protocollo);
				}
			}


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

			if(lista!=null) {
				for (int i = 0; i < lista.size(); i++) {
					AccordoServizioParteSpecifica asps = lista.get(i);
					IDServizio idServizio = this.idServizioFactory.getIDServizioFromAccordo(asps);
	
					String protocollo = protocolli.get(i);
					
					Fruitore fruitore = null;
					IDSoggetto idSoggettoFruitore = null;
					if(showConfigurazionePD || gestioneFruitori) {
						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
						idSoggettoFruitore = new IDSoggetto(fruitore.getTipo(), fruitore.getNome());
					}
	
					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());
					Parameter pTipoSoggettoFruitore = null;
					Parameter pNomeSoggettoFruitore = null;
					if(gestioneFruitori) {
						pTipoSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE, fruitore.getTipo());
						pNomeSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE, fruitore.getNome());
					}
	
					String uriASPS = this.idServizioFactory.getUriFromAccordo(asps);
			
					boolean showVerificaCertificati = false;
					if(gestioneFruitori) {
						showVerificaCertificati = this.core.isFruizioniVerificaCertificati();
					}
					else {
						showVerificaCertificati = this.core.isErogazioniVerificaCertificati();
					}
					
					
					// SCHEMA Assegnazione dati -> DataElement:
					// Data Element 1. colonna 1, riga superiore: Titolo Servizio
					// Data Element 2. colonna 1, riga inferiore: Metadati Servizio
					// Data Element 3..n . colonna 2, lista riepilogo configurazioni
	
					// Titolo Servizio
					DataElement de = new DataElement();			
					String labelServizio = this.getLabelServizio(idSoggettoFruitore, gestioneFruitori, idServizio, protocollo);
					de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_NOME_SERVIZIO);
					List<Parameter> listParameters = new ArrayList<>();
					listParameters.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + ""));
					listParameters.add(pNomeServizio);
					listParameters.add(pTipoServizio);
					listParameters.add(pIdsoggErogatore);
					if(gestioneFruitori) {
						listParameters.add(pTipoSoggettoFruitore);
						listParameters.add(pNomeSoggettoFruitore);
					}
					de.setUrl(ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_CHANGE, listParameters.toArray(new Parameter[1]));
					de.setValue(labelServizio);
					if(gestioneFruitori) {
						de.setIdToRemove(uriASPS+"@"+fruitore.getTipo()+"/"+fruitore.getNome());
					}else {
						de.setIdToRemove(uriASPS);
					}
					de.setType(DataElementType.TITLE);
					e.add(de);
					
					AccordoServizioParteComuneSintetico apc = listApc.get(i);
					ServiceBinding serviceBinding = this.apcCore.toMessageServiceBinding(apc.getServiceBinding());
					
					DataElement dataElementStatoApi = null;
					String labelCanalePorta = null;
					// stato gruppi
					if(showConfigurazionePA) {
						List<MappingErogazionePortaApplicativa> listaMappingErogazionePortaApplicativa = this.apsCore.mappingServiziPorteAppList(idServizio,asps.getId(), null);
						List<PortaApplicativa> listaPorteApplicativeAssociate = new ArrayList<>();
	
						String nomePortaDefault = null;
						for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
							PortaApplicativa pa = this.porteApplicativeCore.getPortaApplicativa(mappinErogazione.getIdPortaApplicativa());
							if(mappinErogazione.isDefault()) {
								nomePortaDefault = mappinErogazione.getIdPortaApplicativa().getNome();
								labelCanalePorta = pa.getCanale();
							}
							listaPorteApplicativeAssociate.add(pa);
						}
						
						dataElementStatoApi = this.newDataElementStatoApiErogazione(null, true, asps, apc, nomePortaDefault, listaMappingErogazionePortaApplicativa, listaPorteApplicativeAssociate);
					}
					
					if(showConfigurazionePD) {
						List<MappingFruizionePortaDelegata> listaMappingFruzionePortaDelegata = this.apsCore.serviziFruitoriMappingList(fruitore.getId(), idSoggettoFruitore, idServizio, null);	
						List<PortaDelegata> listaPorteDelegateAssociate = new ArrayList<>();
	
						String nomePortaDefault = null;
						for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
							PortaDelegata pd = this.porteDelegateCore.getPortaDelegata(mappingFruizione.getIdPortaDelegata());
							if(mappingFruizione.isDefault()) {
								nomePortaDefault = mappingFruizione.getIdPortaDelegata().getNome();
								labelCanalePorta = pd.getCanale();
							}					
							
							listaPorteDelegateAssociate.add(pd);
						}
						
						dataElementStatoApi = this.newDataElementStatoApiFruizione(null, true, asps, apc, nomePortaDefault, listaMappingFruzionePortaDelegata, listaPorteDelegateAssociate);
					}
	
					// Metadati Servizio 
					de = new DataElement();
					
					String labelAPI = this.getLabelIdAccordo(apc);
					String labelServiceBinding = null;
					switch (serviceBinding) {
					case REST:
						labelServiceBinding= CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_REST;
						break;
					case SOAP:
					default:
						labelServiceBinding= CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_SOAP;
						break;
					}
	
					if(gestioneCanaliEnabled) {
						if(labelCanalePorta == null) { // default dell'accordo
							labelCanalePorta =  apc.getCanale();
						}
						
						if(labelCanalePorta == null) { // default del sistema
							labelCanalePorta =  canaleConfigurazioneDefault!=null ? canaleConfigurazioneDefault.getNome() : null;
						}
						
						if(showProtocolli) {
							String labelProtocollo =this.getLabelProtocollo(protocollo); 
							de.setValue(MessageFormat.format(ErogazioniCostanti.MESSAGE_METADATI_SERVIZIO_EROGAZIONI_CON_PROFILO_CON_CANALE, labelServiceBinding, labelAPI, labelCanalePorta, labelProtocollo));
						} else {
							de.setValue(MessageFormat.format(ErogazioniCostanti.MESSAGE_METADATI_SERVIZIO_EROGAZIONI_LIST_CON_CANALE, labelServiceBinding, labelAPI, labelCanalePorta));
						}
					} else {
						if(showProtocolli) {
							String labelProtocollo =this.getLabelProtocollo(protocollo); 
							de.setValue(MessageFormat.format(ErogazioniCostanti.MESSAGE_METADATI_SERVIZIO_EROGAZIONI_CON_PROFILO, labelServiceBinding, labelAPI, labelProtocollo));
						} else {
							de.setValue(MessageFormat.format(ErogazioniCostanti.MESSAGE_METADATI_SERVIZIO_EROGAZIONI_LIST, labelServiceBinding, labelAPI));
						}
					}
					de.setType(DataElementType.SUBTITLE);
					e.add(de);
					
					// tags
					List<GruppoSintetico> gruppo = apc.getGruppo();
					if(gruppo != null && !gruppo.isEmpty()) {
						for (int j = 0; j < gruppo.size(); j++) {
							GruppoSintetico gruppoSintetico = gruppo.get(j);
							de = new DataElement();
							de.setName(ApiCostanti.PARAMETRO_APC_API_GESTIONE_GRUPPO + "_" + j);
							de.setType(DataElementType.BUTTON);
							de.setLabel(gruppoSintetico.getNome());
							
							int indexOf = tagsDisponibili.indexOf(gruppoSintetico.getNome());
							if(indexOf == -1)
								indexOf = 0;
							
							indexOf = indexOf % CostantiControlStation.NUMERO_GRUPPI_CSS;
							
							de.setStyleClass("label-info-"+indexOf);
							
							e.add(de);
						}
					}
					
					
					
					if(dataElementStatoApi!=null) {
						e.add(dataElementStatoApi);
					}
	
					if(visualizzaGruppi) {
						// Data Element 3..n . colonna 2, lista riepilogo configurazioni
						if(showConfigurazionePA) {
	
							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;
							}
	
							// Utilizza la configurazione come parent
							ServletUtils.setObjectIntoSession(this.request, this.session, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT_CONFIGURAZIONE, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT);
							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()));
							}
	
							/**					// controllo accessi
							//					boolean controlloAccessiAbilitato = false;
							//					for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
							//						String statoControlloAccessi = this.getStatoControlloAccessiPortaApplicativa(paAssociata); 
							//						
							//						if(statoControlloAccessi.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
							//							controlloAccessiAbilitato = true;
							//							break;
							//						}
							//					}
							//
							//					if(controlloAccessiAbilitato) {
							//						de = new DataElement();
							//						de.setType(DataElementType.IMAGE);
							//						de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONTROLLO_ACCESSI);
							//						e.add(de);
							//					}*/
	
							// controllo accessi (tre box: gestioneToken, autenticazione, autorizzazione)
							boolean gestioneTokenAbilitato = false;
							for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
								String statoGestioneToken = this.getStatoGestioneTokenPortaApplicativa(paAssociata);
	
								if(statoGestioneToken.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
									gestioneTokenAbilitato = true;
									break;
								}
							}
	
							if(gestioneTokenAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_GESTIONE_TOKEN);
								e.add(de);
							}
	
							boolean autenticazioneAbilitato = false;
							for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
								String statoAutenticazione = this.getStatoAutenticazionePortaApplicativa(paAssociata);
	
								if(statoAutenticazione.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
									autenticazioneAbilitato = true;
									break;
								}
							}
	
							if(autenticazioneAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_AUTENTICAZIONE);
								e.add(de);
							}
	
							boolean autorizzazioneAbilitato = false;
							for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
								String statoAutorizzazione = this.getStatoAutorizzazionePortaApplicativa(paAssociata);
	
								if(statoAutorizzazione.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
									autorizzazioneAbilitato = true;
									break;
								}
							}
	
							if(autorizzazioneAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_AUTORIZZAZIONE_DIFFERENTE_DA_TRASPORTO_E_TOKEN);
								e.add(de);
							}
	
							// validazione contenuti
							boolean controlloValidazioneContentuiAbilitato = false;
							for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
								String statoValidazione = this.getStatoValidazionePortaApplicativa(paAssociata);
								if(!statoValidazione.equals(PorteDelegateCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_DELEGATE_VALIDAZIONE_DISABILITATO)) {
									controlloValidazioneContentuiAbilitato = true;
									break;
								}
							}
	
							if(controlloValidazioneContentuiAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI);
								e.add(de);
							}
	
	
							// message security
							if(visualizzaSicurezza) {
								boolean controlloMessageSecurityAbilitato = false;
								for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {	
									String statoMessageSecurity = this.getStatoMessageSecurityPortaApplicativa(paAssociata);
	
									if(statoMessageSecurity.equals(CostantiConfigurazione.ABILITATO.toString())) {
										controlloMessageSecurityAbilitato = true;
										break;
									}
								}
	
								if(controlloMessageSecurityAbilitato) {
									de = new DataElement();
									de.setType(DataElementType.IMAGE);
									de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MESSAGE_SECURITY);
									e.add(de);
								}
							}
	
							//mtom
							if(visualizzaMTOM) {
								boolean controlloMTOMAbilitato = false;
								for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
									String statoMTOM = this.getStatoMTOMPortaApplicativa(paAssociata);
	
									if(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM_ABILITATO.equals(statoMTOM)) {
										controlloMTOMAbilitato = true;
										break;
									}
	
								}
	
								if(controlloMTOMAbilitato) {
									de = new DataElement();
									de.setType(DataElementType.IMAGE);
									de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM);
									e.add(de);
								}
							}
	
							// correlazione applicativa
							if(visualizzaCorrelazione) {
								boolean controlloCorrelazioneApplicativaAbilitato = false;
								for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
									String statoTracciamento = this.getStatoTracciamentoPortaApplicativa(paAssociata);
	
	
									if(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CORRELAZIONE_APPLICATIVA_ABILITATA.equals(statoTracciamento)){
										controlloCorrelazioneApplicativaAbilitato = true;
										break;
									}
	
								}
	
								if(controlloCorrelazioneApplicativaAbilitato) {
									de = new DataElement();
									de.setType(DataElementType.IMAGE);
									de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRACCIAMENTO);
									e.add(de);
								}
							}
	
							// dump
							boolean controlloDumpAbilitato = false;
							for (PortaApplicativa paAssociata : listaPorteApplicativeAssociate) {
								String statoDump = this.getStatoDumpPortaApplicativa(paAssociata, true);
								if(!statoDump.startsWith(CostantiControlStation.LABEL_PARAMETRO_DUMP_STATO_DEFAULT)){
									controlloDumpAbilitato = true;
									break;
								}
							}
	
							if(controlloDumpAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE);
								e.add(de);
							}
	
						} else if(showConfigurazionePD) {
	
							// Utilizza la configurazione come parent
							ServletUtils.setObjectIntoSession(this.request, this.session, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT_CONFIGURAZIONE, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT);
	
							List<MappingFruizionePortaDelegata> listaMappingFruzionePortaDelegata = this.apsCore.serviziFruitoriMappingList(fruitore.getId(), idSoggettoFruitore, idServizio, null);	
							List<PortaDelegata> listaPorteDelegateAssociate = new ArrayList<>();
	
							for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
								listaPorteDelegateAssociate.add(this.porteDelegateCore.getPortaDelegata(mappingFruizione.getIdPortaDelegata()));
							}
	
							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;
							}
	
							/**					// controllo accessi
							//					boolean controlloAccessiAbilitato = false;
							//					for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
							//						String statoControlloAccessi = this.getStatoControlloAccessiPortaDelegata(pdAssociata); 
							//						
							//						if(statoControlloAccessi.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
							//							controlloAccessiAbilitato = true;
							//							break;
							//						}
							//					}
							//					
							//					if(controlloAccessiAbilitato) {
							//						de = new DataElement();
							//						de.setType(DataElementType.IMAGE);
							//						de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONTROLLO_ACCESSI);
							//						e.add(de);
							//					}*/
	
							// controllo accessi (tre box: gestioneToken, autenticazione, autorizzazione)
							boolean gestioneTokenAbilitato = false;
							for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
								String statoGestioneToken = this.getStatoGestioneTokenPortaDelegata(pdAssociata); 
	
								if(statoGestioneToken.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
									gestioneTokenAbilitato = true;
									break;
								}
							}
	
							if(gestioneTokenAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_GESTIONE_TOKEN);
								e.add(de);
							}
	
							boolean autenticazioneAbilitato = false;
							for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
								String statoAutenticazione = this.getStatoAutenticazionePortaDelegata(pdAssociata); 
	
								if(statoAutenticazione.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
									autenticazioneAbilitato = true;
									break;
								}
							}
	
							if(autenticazioneAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_AUTENTICAZIONE);
								e.add(de);
							}
	
							boolean autorizzazioneAbilitato = false;
							for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
								String statoAutorizzazione = this.getStatoAutorizzazionePortaDelegata(pdAssociata); 
	
								if(statoAutorizzazione.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
									autorizzazioneAbilitato = true;
									break;
								}
							}
	
							if(autorizzazioneAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_AUTORIZZAZIONE_DIFFERENTE_DA_TRASPORTO_E_TOKEN);
								e.add(de);
							}
	
	
							// validazione contenuti
							boolean controlloValidazioneContentuiAbilitato = false;
							for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
								String statoValidazione = this.getStatoValidazionePortaDelegata(pdAssociata);
								if(!statoValidazione.equals(PorteDelegateCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_DELEGATE_VALIDAZIONE_DISABILITATO)) {
									controlloValidazioneContentuiAbilitato = true;
									break;
								}
							}
	
							if(controlloValidazioneContentuiAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_VALIDAZIONE_CONTENUTI);
								e.add(de);
							}
	
	
							// message security
							if(visualizzaSicurezza) {
								boolean controlloMessageSecurityAbilitato = false;
								for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
									String statoMessageSecurity = this.getStatoMessageSecurityPortaDelegata(pdAssociata);
	
									if(statoMessageSecurity.equals(CostantiConfigurazione.ABILITATO.toString())) {
										controlloMessageSecurityAbilitato = true;
										break;
									}
								}
	
								if(controlloMessageSecurityAbilitato) {
									de = new DataElement();
									de.setType(DataElementType.IMAGE);
									de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MESSAGE_SECURITY);
									e.add(de);
								}
							}
	
							//mtom
							if(visualizzaMTOM) {
								boolean controlloMTOMAbilitato = false;
								for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
									String statoMTOM = this.getStatoMTOMPortaDelegata(pdAssociata);
	
									if(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MTOM_ABILITATO.equals(statoMTOM)) {
										controlloMTOMAbilitato = true;
										break;
									}
	
								}
	
								if(controlloMTOMAbilitato) {
									de = new DataElement();
									de.setType(DataElementType.IMAGE);
									de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_MTOM);
									e.add(de);
								}
							}
	
							// correlazione applicativa
							if(visualizzaCorrelazione) {
								boolean controlloCorrelazioneApplicativaAbilitato = false;
								for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
									String statoTracciamento = this.getStatoTracciamentoPortaDelegata(pdAssociata);
	
	
									if(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA_ABILITATA.equals(statoTracciamento)){
										controlloCorrelazioneApplicativaAbilitato = true;
										break;
									}
	
								}
	
								if(controlloCorrelazioneApplicativaAbilitato) {
									de = new DataElement();
									de.setType(DataElementType.IMAGE);
									de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CORRELAZIONE_APPLICATIVA);
									e.add(de);
								}
							}
	
							// dump
							boolean controlloDumpAbilitato = false;
							for (PortaDelegata pdAssociata : listaPorteDelegateAssociate) {
								String statoDump = this.getStatoDumpPortaDelegata(pdAssociata, true);
								if(!statoDump.startsWith(CostantiControlStation.LABEL_PARAMETRO_DUMP_STATO_DEFAULT)){
									controlloDumpAbilitato = true;
									break;
								}
							}
	
							if(controlloDumpAbilitato) {
								de = new DataElement();
								de.setType(DataElementType.IMAGE);
								de.setValue(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_DUMP_CONFIGURAZIONE);
								e.add(de);
							}
						}
					}
					
					String idServizioButton = gestioneFruitori ? uriASPS+"@"+fruitore.getTipo()+"/"+fruitore.getNome() : uriASPS;
					
					// In Uso Button
					this.addInUsoInfoButton(e, 
							labelServizio,
							idServizioButton,
							gestioneFruitori ? InUsoType.FRUIZIONE_INFO : InUsoType.EROGAZIONE_INFO);
					
					// Verifica Certificati
					if(showVerificaCertificati) {
						
						List<Parameter> listParametersServizioModificaProfilo = null;
						List<Parameter> listParametersServizioFruitoriModificaProfilo = null;
						listParametersServizioModificaProfilo = new ArrayList<>();
						listParametersServizioModificaProfilo.addAll(listParameters);
						listParametersServizioModificaProfilo.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_PROFILO, true+""));
						listParametersServizioModificaProfilo.add(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CERTIFICATI_FROM_LISTA, true+""));
						
						if(gestioneFruitori) {
							listParametersServizioFruitoriModificaProfilo = new ArrayList<>();
							listParametersServizioFruitoriModificaProfilo.addAll(listParametersServizioModificaProfilo);
							Parameter pIdFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, fruitore.getId()+ "");
							listParametersServizioFruitoriModificaProfilo.add(pIdFruitore);
						}
						
						if(gestioneFruitori) {
							this.addComandoVerificaCertificatiButton(e, labelServizio, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_VERIFICA_CERTIFICATI, listParametersServizioFruitoriModificaProfilo);
						}
						else {
							this.addComandoVerificaCertificatiButton(e, labelServizio, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_VERIFICA_CERTIFICATI, listParametersServizioModificaProfilo);
						}
					}
					
					// se e' abilitata l'opzione reset cache per elemento, visualizzo il comando nell'elenco dei comandi disponibili nella lista
					if(this.core.isElenchiVisualizzaComandoResetCacheSingoloElemento()){
						List<Parameter> listaParametriChange = new ArrayList<>();		
						listaParametriChange.addAll(listParameters);
						
						this.addComandoResetCacheButton(e, labelServizio, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_CHANGE, listaParametriChange);
					}
					
					// Proprieta Button
					/**
					 * troppo costo fare il merge per ogni elemento della lista. Lascio la possibilità di invocare le proprietà sempre.
					 * 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); 
					}*/
					if(gestioneFruitori
							/**&& this.existsProprietaOggetto(pOggetto, fruitore.getDescrizione())*/
							) {
						this.addProprietaOggettoButton(e, labelServizio, idServizioButton, 
								InUsoType.FRUIZIONE);
					}
					else if(!gestioneFruitori 
						/**&& this.existsProprietaOggetto(pOggetto, asps.getDescrizione())*/
						) {
						this.addProprietaOggettoButton(e, labelServizio, idServizioButton, 
								InUsoType.EROGAZIONE);
					}
					
					// aggiungo entry
					dati.add(e);
				}
			}

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

			// preparo bottoni
			if(lista!=null && !lista.isEmpty() &&
				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);
					if(gestioneFruitori) {
						de.setOnClick(AccordiServizioParteSpecificaCostanti.LABEL_FRUIZIONI_ESPORTA_SELEZIONATI_ONCLICK);
					}
					else {
						de.setOnClick(AccordiServizioParteSpecificaCostanti.LABEL_EROGAZIONI_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 DriverControlStationException(e);
		}
	}

	public List<List<DataElement>> addErogazioneToDati(List<List<DataElement>> datiPagina, TipoOperazione tipoOp,
			AccordoServizioParteSpecifica asps, AccordoServizioParteComuneSintetico as, String protocollo,ServiceBinding serviceBinding ,
			boolean gestioneErogatori, boolean gestioneFruitori,
			List<MappingErogazionePortaApplicativa> listaMappingErogazionePortaApplicativa,
			List<PortaApplicativa> listaPorteApplicativeAssociate,
			List<MappingFruizionePortaDelegata> listaMappingFruzionePortaDelegata,
			List<PortaDelegata> listaPorteDelegateAssociate, Fruitore fruitore) throws Exception { 

		boolean visualizzaGruppi = false;

		if(gestioneFruitori)
			this.pd.setCustomListViewName(ErogazioniCostanti.ASPS_EROGAZIONI_NOME_VISTA_CUSTOM_FORM_FRUIZIONE);
		else 
			this.pd.setCustomListViewName(ErogazioniCostanti.ASPS_EROGAZIONI_NOME_VISTA_CUSTOM_FORM_EROGAZIONE);

		if(asps==null) {
			throw new DriverControlStationException("Param asps is null");
		}
		
		boolean showProtocolli = this.core.countProtocolli(this.request, this.session)>1;
		Parameter pNomeServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SERVIZIO, asps.getNome());
		Parameter pTipoServizio = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SERVIZIO, asps.getTipo());
		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 = null;
		Parameter pIdSogg = null;
		Parameter pTipoSoggettoFruitore = null;
		Parameter pNomeSoggettoFruitore = null;
		Parameter pIdProviderFruitore = null;
		if(gestioneFruitori) {
			pIdFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MY_ID, fruitore.getId()+ "");
			pIdSogg = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO, fruitore.getIdSoggetto() + "");
			pTipoSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE, fruitore.getTipo());
			pNomeSoggettoFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE, fruitore.getNome());
			
			Long idSoggettoLong = fruitore.getIdSoggetto();
			if(idSoggettoLong==null) {
				idSoggettoLong = this.soggettiCore.getIdSoggetto(fruitore.getNome(), fruitore.getTipo());
				pIdSogg = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID_SOGGETTO, idSoggettoLong + "");
			}
			pIdProviderFruitore = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_PROVIDER_FRUITORE, idSoggettoLong + "");
		
		}

		Soggetto sog = this.soggettiCore.getSoggettoRegistro(asps.getIdSoggetto());
		boolean isPddEsterna = this.pddCore.isPddEsterna(sog.getPortaDominio());

		boolean showSoggettoErogatoreInErogazioni = this.core.isMultitenant() && 
				!this.isSoggettoMultitenantSelezionato();
		
		boolean showSoggettoFruitoreInFruizioni = gestioneFruitori &&  this.core.isMultitenant() && 
				!this.isSoggettoMultitenantSelezionato();
		
		IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromAccordo(asps);
		
		IDSoggetto idSoggettoFruitore = null;
		if(gestioneFruitori) {
			idSoggettoFruitore = new IDSoggetto(fruitore.getTipo(), fruitore.getNome());
		}
		
		IDServizio idAps = IDServizioFactory.getInstance().getIDServizioFromAccordo(asps);
		idAps.setPortType(asps.getPortType());
		idAps.setUriAccordoServizioParteComune(asps.getAccordoServizioParteComune());
		IProtocolFactory<?> protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(protocollo);
		IConsoleDynamicConfiguration consoleDynamicConfiguration = protocolFactory.createDynamicConfigurationConsole();
		IRegistryReader registryReader = this.apcCore.getRegistryReader(protocolFactory); 
		IConfigIntegrationReader configRegistryReader = this.apcCore.getConfigIntegrationReader(protocolFactory);
		ConsoleConfiguration consoleConfiguration = null;
		if(gestioneErogatori) {
			consoleConfiguration = consoleDynamicConfiguration.getDynamicConfigAccordoServizioParteSpecifica(ConsoleOperationType.CHANGE, this, 
					registryReader, configRegistryReader, idAps );
		}
		else {
			IDFruizione idFruizione = new IDFruizione();
			idFruizione.setIdServizio(idAps);
			idFruizione.setIdFruitore(new IDSoggetto(fruitore.getTipo(), fruitore.getNome()));
			consoleConfiguration = consoleDynamicConfiguration.getDynamicConfigFruizioneAccordoServizioParteSpecifica(ConsoleOperationType.CHANGE, this,  
					registryReader, configRegistryReader, idFruizione);
		}
		
		boolean modificaDatiProfilo = false;
		if(consoleConfiguration!=null && consoleConfiguration.getConsoleItem()!=null && !consoleConfiguration.getConsoleItem().isEmpty()) {
			modificaDatiProfilo = true;
		}
		boolean modi = this.core.isProfiloModIPA(protocollo);
		
		boolean showVerificaCertificati = false;
		if(gestioneFruitori) {
			showVerificaCertificati = this.core.isFruizioniVerificaCertificati();
		}
		else {
			showVerificaCertificati = this.core.isErogazioniVerificaCertificati();
		}
		
		boolean showVerificaCertificatiModi = false; // scudo solo per ModI
		if(modi && modificaDatiProfilo) {
			if(gestioneFruitori) {
				showVerificaCertificatiModi = this.core.isModipaFruizioniVerificaCertificati();
			}
			else {
				showVerificaCertificatiModi = this.core.isModipaErogazioniVerificaCertificati();
			}
		}
		
		List<Parameter> listaParametriChange = new ArrayList<>();		
		listaParametriChange.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getId() + ""));
		listaParametriChange.add(pNomeServizio);
		listaParametriChange.add(pTipoServizio);
		listaParametriChange.add(pIdSoggettoErogatore);
		if(gestioneFruitori) {
			listaParametriChange.add(pTipoSoggettoFruitore);
			listaParametriChange.add(pNomeSoggettoFruitore);
			listaParametriChange.add(pIdProviderFruitore);
		}
		
		List<Parameter> listParametersServizioModificaProfiloOrVerificaCertificati = null;
		List<Parameter> listParametersServizioFruitoriModificaProfiloOrVerificaCertificati = null;
		if(modificaDatiProfilo || showVerificaCertificati) {
			listParametersServizioModificaProfiloOrVerificaCertificati = new ArrayList<>();
			listParametersServizioModificaProfiloOrVerificaCertificati.addAll(listaParametriChange);
			
			if(gestioneFruitori) {
				listParametersServizioFruitoriModificaProfiloOrVerificaCertificati = new ArrayList<>();
				listParametersServizioFruitoriModificaProfiloOrVerificaCertificati.addAll(listParametersServizioModificaProfiloOrVerificaCertificati);
				listParametersServizioFruitoriModificaProfiloOrVerificaCertificati.add(pIdFruitore);
			}
		}
		
		// sezione 1 riepilogo
		List<DataElement> dati = datiPagina.get(0);
		
		ProprietaOggetto pOggetto = this.creaProprietaOggetto(asps, gestioneFruitori, fruitore, idServizio, idSoggettoFruitore);
		
		this.impostaComandiMenuContestuale(asps, protocollo, gestioneFruitori, fruitore,
				showVerificaCertificati, listaParametriChange,
				listParametersServizioModificaProfiloOrVerificaCertificati,
				listParametersServizioFruitoriModificaProfiloOrVerificaCertificati, pOggetto, true, false);
		
		
		// Titolo Servizio
		DataElement de = new DataElement();
		String labelServizio = this.getLabelIdServizioSenzaErogatore(idServizio);
		String labelServizioConPortType = labelServizio;
		if(asps.getPortType()!=null && !"".equals(asps.getPortType()) && !asps.getNome().equals(asps.getPortType())) {
			labelServizioConPortType = labelServizioConPortType +" ("+asps.getPortType()+")";
		}
		de.setLabel(ErogazioniCostanti.LABEL_ASPS_MODIFICA_SERVIZIO_NOME);
		de.setValue(labelServizioConPortType);
		de.setStatusValue(labelServizioConPortType);
		de.setType(DataElementType.TEXT);
		List<Parameter> listParametersServizioModifica = new ArrayList<>();
		listParametersServizioModifica.addAll(listaParametriChange);
		listParametersServizioModifica.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API, false+"")); 
		
		DataElementImage imageChangeStato = null;
		if(gestioneErogatori) {			
			String nomePortaDefault = null;
			for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
				if(mappinErogazione.isDefault()) {
					nomePortaDefault = mappinErogazione.getIdPortaApplicativa().getNome();
				}
			}
			this.newDataElementStatoApiErogazione(de, false, asps, as, nomePortaDefault, listaMappingErogazionePortaApplicativa, listaPorteApplicativeAssociate);
			if(listaMappingErogazionePortaApplicativa.size()==1) {
				PortaApplicativa pa = this.porteApplicativeCore.getPortaApplicativa(listaMappingErogazionePortaApplicativa.get(0).getIdPortaApplicativa());
				Parameter pIdPorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID, ""+pa.getId());
				Parameter pNomePorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME_PORTA, pa.getNome());
				Parameter pIdSoggPA = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, pa.getIdSoggetto() + "");
				Parameter pFromApi = new Parameter(CostantiControlStation.PARAMETRO_API_PAGE_INFO, Costanti.CHECK_BOX_ENABLED_TRUE);
				boolean statoPA = pa.getStato().equals(StatoFunzionalita.ABILITATO);
				Parameter pAbilita = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ABILITA,  (statoPA ? Costanti.CHECK_BOX_DISABLED : Costanti.CHECK_BOX_ENABLED_TRUE));
				imageChangeStato = new DataElementImage();
				imageChangeStato.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_ABILITAZIONE,pIdSoggPA, pNomePorta, pIdPorta,pIdAsps, pAbilita,pFromApi);
				String statoMapping = statoPA ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP;
				imageChangeStato.setToolTip(statoMapping);
				imageChangeStato.setImage(statoPA ? CostantiControlStation.ICONA_MODIFICA_TOGGLE_ON : CostantiControlStation.ICONA_MODIFICA_TOGGLE_OFF);
			}
		}	
		if(gestioneFruitori) {		
			String nomePortaDefault = null;
			for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
				if(mappingFruizione.isDefault()) {
					nomePortaDefault = mappingFruizione.getIdPortaDelegata().getNome();
				}
			}			
			this.newDataElementStatoApiFruizione(de, false, asps, as, nomePortaDefault, listaMappingFruzionePortaDelegata, listaPorteDelegateAssociate);	
			if(listaMappingFruzionePortaDelegata.size()==1) {
				PortaDelegata pd = this.porteDelegateCore.getPortaDelegata(listaMappingFruzionePortaDelegata.get(0).getIdPortaDelegata());
				Parameter pIdPD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID, "" + pd.getId());
				Parameter pNomePD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_NOME_PORTA, pd.getNome());
				Parameter pIdSoggPD = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ID_SOGGETTO, pd.getIdSoggetto() + "");
				Parameter pFromApi = new Parameter(CostantiControlStation.PARAMETRO_API_PAGE_INFO, Costanti.CHECK_BOX_ENABLED_TRUE);
				boolean statoPD = pd.getStato().equals(StatoFunzionalita.ABILITATO);
				Parameter pAbilita = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_ABILITA,  (statoPD ? Costanti.CHECK_BOX_DISABLED : Costanti.CHECK_BOX_ENABLED_TRUE));
				imageChangeStato = new DataElementImage();
				imageChangeStato.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_ABILITAZIONE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pAbilita,pFromApi);
				String statoMapping = statoPD ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP;
				imageChangeStato.setToolTip(statoMapping);
				imageChangeStato.setImage(statoPD ? CostantiControlStation.ICONA_MODIFICA_TOGGLE_ON : CostantiControlStation.ICONA_MODIFICA_TOGGLE_OFF);
			}
		}
		
		DataElementImage imageChangeName = new DataElementImage();
		imageChangeName.setUrl(
				AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE,
				listParametersServizioModifica.toArray(new Parameter[1]));
		imageChangeName.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,
				AccordiServizioParteSpecificaCostanti.LABEL_APS_INFO_GENERALI));
		imageChangeName.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
		
		if(imageChangeStato!=null) {
			de.addImage(imageChangeName);
		}
		else {
			de.setImage(imageChangeName);
		}
		
		boolean descrizioneEmpty = false;
		if(
				(
						gestioneFruitori && 
						(fruitore.getDescrizione()==null || StringUtils.isEmpty(fruitore.getDescrizione()))
				)
			||
				(
					!gestioneFruitori && 
					(asps.getDescrizione()==null || StringUtils.isEmpty(asps.getDescrizione()))
				)
		){
			
			descrizioneEmpty = true;
		}
		
		if(descrizioneEmpty) {
			DataElementImage image = new DataElementImage();
			
			List<Parameter> listParametersServizioModificaDescrizione = new ArrayList<>();
			listParametersServizioModificaDescrizione.addAll(listaParametriChange);
			listParametersServizioModificaDescrizione.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_DESCRIZIONE, true+""));
			
			image.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE, listParametersServizioModificaDescrizione.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_AGGIUNGI_DESCRIZIONE_TOOLTIP_CON_PARAMETRO, AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_AGGIUNGI_DESCRIZIONE);
			de.addImage(image);
		}
		
		if(imageChangeStato!=null) {
			de.addImage(imageChangeStato);
		}
		
		
		
		dati.add(de);
		
		// soggetto erogatore
		if(gestioneFruitori || showSoggettoErogatoreInErogazioni) {
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_EROGATORE);
			de.setValue(this.getLabelNomeSoggetto(protocollo,asps.getTipoSoggettoErogatore(),asps.getNomeSoggettoErogatore()));
			de.setType(DataElementType.TEXT);
			dati.add(de);
			
			List<Parameter> listParametersServizioModificaSoggettoErogatore = new ArrayList<>();
			listParametersServizioModificaSoggettoErogatore.addAll(listaParametriChange);
			listParametersServizioModificaSoggettoErogatore.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_SOGGETTO_EROGATORE, true+""));
			
			DataElementImage image = new DataElementImage();
			image.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE,	listParametersServizioModificaSoggettoErogatore.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_CAMBIA_API_TOOLTIP_CON_PARAMETRO, 
					AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_EROGATORE));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
			image.setTarget(TargetType.SELF);
			de.addImage(image);
		}

		// API
		de = new DataElement();
		Parameter pTipoAccordo = AccordiServizioParteComuneUtilities.getParametroAccordoServizio(as);
		String labelAPI = this.getLabelIdAccordo(as);
		String labelServiceBinding = null;
		switch (serviceBinding) {
		case REST:
			labelServiceBinding= CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_REST;
			break;
		case SOAP:
		default:
			labelServiceBinding= CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_SOAP;
			break;
		}
		de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_ACCORDO); 
		de.setValue(MessageFormat.format(ErogazioniCostanti.MESSAGE_METADATI_SERVIZIO_EROGAZIONI_EDIT, labelServiceBinding, labelAPI));
		de.setType(DataElementType.BUTTON);
		
		List<String> labelsGruppi = new ArrayList<>();
		List<String> valuesGruppi = new ArrayList<>();
		
		List<GruppoSintetico> gruppi = as.getGruppo();
		if(gruppi != null) {
			// colleziono i tags registrati
			List<String> tagsDisponibili = this.gruppiCore.getAllGruppiOrdinatiPerDataRegistrazione();
			
			for (int i = 0; i < gruppi.size(); i++) {
				GruppoSintetico gruppo = gruppi.get(i);
				
				int indexOf = tagsDisponibili.indexOf(gruppo.getNome());
				if(indexOf == -1)
					indexOf = 0;
				
				indexOf = indexOf % CostantiControlStation.NUMERO_GRUPPI_CSS;
				
				labelsGruppi.add(gruppo.getNome());
				valuesGruppi.add("label-info-"+ indexOf);
			}
		}	
		
		de.setLabels(labelsGruppi);
		de.setValues(valuesGruppi);
		
		
		// Lista di Accordi Compatibili
		List<AccordoServizioParteComune> asParteComuneCompatibili = null;
		try{
			boolean soloAccordiConsistentiRest = false;
			boolean soloAccordiConsistentiSoap = false;
			if(!this.isModalitaCompleta()) {
				// filtro accordi senza risorse o senza pt/operation
				soloAccordiConsistentiRest = true;
				soloAccordiConsistentiSoap = true;
			}
			
			List<AccordoServizioParteComune> asParteComuneCompatibiliTmp = this.apsCore.findAccordiParteComuneBySoggettoAndNome(as.getNome(), 
					new IDSoggetto(as.getSoggettoReferente().getTipo(), as.getSoggettoReferente().getNome()));
			if(asParteComuneCompatibiliTmp!=null && !asParteComuneCompatibiliTmp.isEmpty()) {
				for (AccordoServizioParteComune accordoServizioParteComune : asParteComuneCompatibiliTmp) {
					boolean isValid = false;
					
					if(org.openspcoop2.core.registry.constants.ServiceBinding.REST.equals(accordoServizioParteComune.getServiceBinding())) {
						if(soloAccordiConsistentiRest) {
							isValid = accordoServizioParteComune.sizeResourceList()>0;
						}
					}
					else {
						if(soloAccordiConsistentiSoap) {
							if(asps!=null && asps.getPortType()!=null) {
								for (int i = 0; i < accordoServizioParteComune.sizePortTypeList(); i++) {
									if(accordoServizioParteComune.getPortType(i).getNome().equals(asps.getPortType()) &&
										accordoServizioParteComune.getPortType(i).sizeAzioneList()>0) {
										isValid = true;
										break;
									}
								}
							}
							else {
								isValid = accordoServizioParteComune.sizeAzioneList()>0;
							}
						}
					}
					
					if(isValid) {
						if(asParteComuneCompatibili==null) {
							asParteComuneCompatibili = new ArrayList<>();
						}
						asParteComuneCompatibili.add(accordoServizioParteComune);
					}
					
				}
			}			
			
			
		}catch(Exception e){
			ControlStationCore.logError("Errore durante la ricerca degli accordi parte comune compatibili", e);
		}
		
		// lista icone a dx 
		// n.b. iniziare ad aggiungerle da quella che deve stare piu' a dx perche' la regola css float right le allinea al contrario
		
		boolean apiImplementataCambiabile = ErogazioniUtilities.isChangeAPIEnabled(asps, this.apsCore);
		if(apiImplementataCambiabile) {
			List<Parameter> listParametersServizioModificaApi = new ArrayList<>();
			listParametersServizioModificaApi.addAll(listaParametriChange);
			listParametersServizioModificaApi.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_CAMBIA_API, true+""));
			
			DataElementImage image = new DataElementImage();
			image.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE,	listParametersServizioModificaApi.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_CAMBIA_API_TOOLTIP_CON_PARAMETRO, 
					AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_PARTE_COMUNE));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
			image.setTarget(TargetType.SELF);
			de.addImage(image);
		}
		
		if(asParteComuneCompatibili!=null && asParteComuneCompatibili.size()>1) {
			List<Parameter> listParametersServizioModificaApi = new ArrayList<>();
			listParametersServizioModificaApi.addAll(listaParametriChange);
			listParametersServizioModificaApi.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_API, true+""));
			
			DataElementImage image = new DataElementImage();
			image.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE,	listParametersServizioModificaApi.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_UPGRADE_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, 
					"Versione "+AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_PARTE_COMUNE));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_UPGRADE_CONFIGURAZIONE);
			image.setTarget(TargetType.SELF);
			de.addImage(image);
		}
		
		DataElementImage image = new DataElementImage();
		image.setUrl(ApiCostanti.SERVLET_NAME_APC_API_CHANGE, new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID, asps.getIdAccordo() + ""),
				new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME, as.getNome()), pTipoAccordo);
		image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_VISUALIZZA_TOOLTIP_CON_PARAMETRO, AccordiServizioParteSpecificaCostanti.LABEL_APC_COMPOSTO_SOLO_PARTE_COMUNE));
		image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_VISUALIZZA);
		image.setTarget(TargetType.BLANK); 
		image.setDisabilitaAjaxStatus();
		
		de.addImage(image);
		dati.add(de);

				
		
		// ProtocolProperties

		if(showProtocolli || modificaDatiProfilo) {
			
			de = new DataElement();
			String labelProtocollo =this.getLabelProtocollo(protocollo);
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROTOCOLLO);
			de.setValue(labelProtocollo);
			de.setType(DataElementType.TEXT);
								
			List<Parameter> listParametersServizioModificaProfilo = new ArrayList<>();
			if(gestioneFruitori) {
				listParametersServizioModificaProfilo.addAll(listParametersServizioFruitoriModificaProfiloOrVerificaCertificati);
			}
			else {
				listParametersServizioModificaProfilo.addAll(listParametersServizioModificaProfiloOrVerificaCertificati);
			}
			listParametersServizioModificaProfilo.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_PROFILO, true+""));
			
			if(modificaDatiProfilo) {
				
				image = new DataElementImage();
				if(gestioneFruitori) {
					image.setUrl(
							AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_CHANGE,
							listParametersServizioModificaProfilo.toArray(new Parameter[1]));
				}
				else {
					image.setUrl(
							AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE,
							listParametersServizioModificaProfilo.toArray(new Parameter[1]));
				}
				image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,
						AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROTOCOLLO));
				image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
				de.addImage(image);
				
			}
			
			if(showVerificaCertificatiModi)	{
				image = new DataElementImage();
				image.setUrl(
						ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_VERIFICA_CERTIFICATI,
						listParametersServizioModificaProfilo.toArray(new Parameter[1]));
				image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_VERIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO,
						AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_PROTOCOLLO));
				image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_VERIFICA_CERTIFICATI);
				de.addImage(image);
				
			}
			
			dati.add(de);
			
		}
		
		
		// Fruitore
		if(showSoggettoFruitoreInFruizioni) {
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_APS_SOGGETTO_FRUITORE);
			de.setValue(this.getLabelNomeSoggetto(protocollo,fruitore.getTipo(),fruitore.getNome()));
			de.setType(DataElementType.TEXT);
			dati.add(de);
		}

		
		
		
		// Descrizione
		if(!descrizioneEmpty) {
			
			de = new DataElement();
			de.setLabel(AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE);
			int length = 150;
			String descrizione = gestioneFruitori ? fruitore.getDescrizione() : asps.getDescrizione();
			if(descrizione!=null && descrizione.length()>length) {
				descrizione = descrizione.substring(0, (length-4)) + " ...";
			}
			de.setValue(descrizione!=null ? StringEscapeUtils.escapeHtml(descrizione) : null);
			de.setToolTip(gestioneFruitori ? fruitore.getDescrizione() : asps.getDescrizione());
			
			List<Parameter> listParametersServizioModificaDescrizione = new ArrayList<>();
			listParametersServizioModificaDescrizione.addAll(listaParametriChange);
			listParametersServizioModificaDescrizione.add(new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_MODIFICA_DESCRIZIONE, true+""));
						
			image = new DataElementImage();
			image.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_CHANGE, listParametersServizioModificaDescrizione.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, AccordiServizioParteSpecificaCostanti.LABEL_PARAMETRO_APS_DESCRIZIONE));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
			de.setImage(image);
			
			dati.add(de);
			
		}
		
		
		
		
		
		// Url Invocazione
		Parameter paIdSogg = null;
		Parameter paNomePorta = null;
		Parameter paIdPorta = null;
		Parameter paIdAsps = null;
		Parameter paConfigurazioneDati = null;
		Parameter paIdProvider = null;
		Parameter paIdPortaPerSA = null;
		Parameter paConnettoreDaListaAPS = null;
		Parameter paConfigurazioneAltroApi = null;
		IDPortaApplicativa idPA = null;
		PortaApplicativa paDefault = null;
		PortaApplicativaServizioApplicativo paSADefault =  null;
		String canalePorta = null;

		if(gestioneErogatori) {
			
			ServletUtils.setObjectIntoSession(this.request, this.session, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT_CONFIGURAZIONE, PorteApplicativeCostanti.ATTRIBUTO_PORTE_APPLICATIVE_PARENT);
			
			de = new DataElement();
			de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_TITOLO_PORTE_APPLICATIVE_DATI_INVOCAZIONE);
			de.setType(DataElementType.TEXT);
			String urlInvocazione = "";
			String urlInvocazioneTooltip = null;

			if(!isPddEsterna){
				idPA = this.porteApplicativeCore.getIDPortaApplicativaAssociataDefault(idServizio);
				paDefault = this.porteApplicativeCore.getPortaApplicativa(idPA);
				paSADefault = paDefault.getServizioApplicativoList().get(0);

				paIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, asps.getIdSoggetto() + "");
				paNomePorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_NOME_PORTA, paDefault.getNome());
				paIdPorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID, ""+paDefault.getId());
				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);
				paIdProvider = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_PROVIDER, paDefault.getIdSoggetto() + "");
				paIdPortaPerSA = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_PORTA, ""+paDefault.getId());
				paConnettoreDaListaAPS = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_CONNETTORE_DA_LISTA_APS, Costanti.CHECK_BOX_ENABLED_TRUE);
				paConfigurazioneAltroApi = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_CONFIGURAZIONE_ALTRO_API, Costanti.CHECK_BOX_ENABLED_TRUE);
				
				boolean analizeProxyPassRules = true;
				UrlInvocazioneAPI urlInvocazioneConfig = this.confCore.getConfigurazioneUrlInvocazione(protocollo, RuoloContesto.PORTA_APPLICATIVA, serviceBinding, paDefault.getNome(), 
						new IDSoggetto(paDefault.getTipoSoggettoProprietario(), paDefault.getNomeSoggettoProprietario()),
								as, paDefault.getCanale(),
								analizeProxyPassRules);
				urlInvocazione = urlInvocazioneConfig.getUrl();
				
				UrlInvocazioneAPI urlInvocazioneConfigDefault = this.confCore.getConfigurazioneUrlInvocazione(protocollo, RuoloContesto.PORTA_APPLICATIVA, serviceBinding, paDefault.getNome(), 
						new IDSoggetto(paDefault.getTipoSoggettoProprietario(), paDefault.getNomeSoggettoProprietario()),
								as, paDefault.getCanale(),
								!analizeProxyPassRules);
				if(urlInvocazioneConfigDefault!=null && urlInvocazioneConfigDefault.getUrl()!=null && !urlInvocazioneConfigDefault.getUrl().equals(urlInvocazione)) {
					urlInvocazioneTooltip = PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_BASE_URL_INVOCAZIONE_INTERNA+": "+ urlInvocazioneConfigDefault.getUrl();
				}
			} else {
				urlInvocazione = "-";
			}
			de.setValue(urlInvocazione);
			if(urlInvocazioneTooltip!=null) {
				de.setToolTip(urlInvocazioneTooltip);
			}
			List<Parameter> listParametersUrlInvocazione = new ArrayList<>();
			listParametersUrlInvocazione.add(paIdSogg);
			listParametersUrlInvocazione.add(paNomePorta);
			listParametersUrlInvocazione.add(paIdPorta);
			listParametersUrlInvocazione.add(paIdAsps);
			listParametersUrlInvocazione.add(paConfigurazioneDati);
			
			image = new DataElementImage();
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteApplicativeCostanti.LABEL_PARAMETRO_TITOLO_PORTE_APPLICATIVE_DATI_INVOCAZIONE));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
			image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE, listParametersUrlInvocazione.toArray(new Parameter[1]));
			de.setImage(image);
			dati.add(de);
			
			boolean visualizzaConnettore = true;
			boolean checkConnettore = false;
			boolean connettoreMultiploEnabled = false;
			long idConnettore = 1;
			for (int i = 0; i < listaPorteApplicativeAssociate.size(); i++) {
				PortaApplicativa paAssociata = listaPorteApplicativeAssociate.get(i);
				MappingErogazionePortaApplicativa mapping = listaMappingErogazionePortaApplicativa.get(i);
				
				if(!mapping.isDefault()) {
					PortaApplicativaServizioApplicativo portaApplicativaAssociataServizioApplicativo = paAssociata.getServizioApplicativoList().get(0);
					boolean connettoreConfigurazioneRidefinito = this.isConnettoreRidefinito(paDefault, paSADefault, paAssociata, portaApplicativaAssociataServizioApplicativo, paAssociata.getServizioApplicativoList());
					if(connettoreConfigurazioneRidefinito) {
						visualizzaConnettore = false;
						break;
					}
				} else {
					canalePorta = paAssociata.getCanale();
				}
				
			}
			
			if(visualizzaConnettore) {
				IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
				idServizioApplicativo.setIdSoggettoProprietario(new IDSoggetto(paDefault.getTipoSoggettoProprietario(), paDefault.getNomeSoggettoProprietario()));
				idServizioApplicativo.setNome(paSADefault.getNome());
				ServizioApplicativo sa = this.saCore.getServizioApplicativo(idServizioApplicativo);
				Connettore connettore = sa.getInvocazioneServizio().getConnettore();
				idConnettore = connettore.getId();
				checkConnettore = org.openspcoop2.pdd.core.connettori.ConnettoreCheck.checkSupported(connettore);
				
				connettoreMultiploEnabled = paDefault.getBehaviour() != null;

				
				de = new DataElement();
				
				de.setType(DataElementType.TEXT);
				InvocazioneServizio is = sa.getInvocazioneServizio();
				String urlConnettore = this.getLabelConnettore(sa,is,true);
				
				if(!connettoreMultiploEnabled) {	
					de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE);
					de.setValue(formatInfoForView(urlConnettore));
					String tooltipConnettore = this.getTooltipConnettore(sa,is,true);
					de.setToolTip(tooltipConnettore);
				} else {
					de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORI);
					de.setValue(this.getNomiConnettoriMultipliPortaApplicativa(paDefault));
					de.setToolTip(this.getToolTipConnettoriMultipliPortaApplicativa(paDefault));
				}
				
				boolean visualizzaLinkConfigurazioneConnettore = 
						(!this.core.isConnettoriMultipliEnabled()) 
						|| 
						(!connettoreMultiploEnabled );
				if(visualizzaLinkConfigurazioneConnettore) {
					List<Parameter> listParametersConnettore = new ArrayList<>();
					listParametersConnettore.add(paIdProvider);
					listParametersConnettore.add(paIdPortaPerSA);
					listParametersConnettore.add(paIdAsps);
					listParametersConnettore.add(new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_NOME_SERVIZIO_APPLICATIVO, paSADefault.getNome()));
					listParametersConnettore.add(new Parameter(ServiziApplicativiCostanti.PARAMETRO_SERVIZI_APPLICATIVI_ID_SERVIZIO_APPLICATIVO, paSADefault.getIdServizioApplicativo()+""));
					listParametersConnettore.add(paConnettoreDaListaAPS);
					
					image = new DataElementImage();
					image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE));
					image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
					image.setUrl(ServiziApplicativiCostanti.SERVLET_NAME_SERVIZI_APPLICATIVI_ENDPOINT, 
							listParametersConnettore.toArray(new Parameter[1]));
					de.addImage(image);
				}

				boolean visualizzaLinkCheckConnettore = 
						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(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ID, idConnettore+""));
					listParametersVerificaConnettore.add(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ACCESSO_DA_GRUPPI, false+""));
					listParametersVerificaConnettore.add(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_REGISTRO, false+""));
					
					image = new DataElementImage();
					image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_VERIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, CostantiControlStation.LABEL_CONFIGURAZIONE_CONNETTIVITA));
					image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_VERIFICA_CONFIGURAZIONE);
					image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VERIFICA_CONNETTORE, 
							listParametersVerificaConnettore.toArray(new Parameter[1]));
					de.addImage(image);
				}
				
				// link alla configurazione connettori multipli e alla lista dei connettori multipli
				if(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(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ACCESSO_DA_GRUPPI, false+""));
					listParametersConfigutazioneConnettoriMultipli.add(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_REGISTRO, false+""));
					listParametersConfigutazioneConnettoriMultipli.add(new Parameter(CostantiControlStation.PARAMETRO_ID_CONN_TAB, "0"));
					
					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);
					
					if(connettoreMultiploEnabled) {
						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);
					}
				}
				
				dati.add(de);
			}
			
			// CORS
			de = new DataElement();
			de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_CORS);
			de.setType(DataElementType.TEXT);
			de.setValue(this.getStatoGestioneCorsPortaApplicativa(paDefault, false));
			if(!this.isModalitaCompleta()) {
				this.setStatoGestioneCORS(de, paDefault.getGestioneCors(), this.confCore.getConfigurazioneGenerale());
			}
			paIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, asps.getIdSoggetto() + "");
			
			image = new DataElementImage();
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_CORS));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
			image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_GESTIONE_CORS, paIdSogg, paIdPorta, pIdAsps);
			
			de.setImage(image);
			dati.add(de);
			
			
			// Canale
			CanaliConfigurazione gestioneCanali = this.confCore.getCanaliConfigurazione(false);
			boolean gestioneCanaliEnabled = gestioneCanali != null && org.openspcoop2.core.config.constants.StatoFunzionalita.ABILITATO.equals(gestioneCanali.getStato());
			if(gestioneCanaliEnabled) {
				List<CanaleConfigurazione> canaleList = gestioneCanali != null ? gestioneCanali.getCanaleList() : new ArrayList<>();
				de = new DataElement();
				de.setType(DataElementType.TEXT);
				de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_CANALE);
				this.setStatoCanalePorta(de, canalePorta, as.getCanale(), canaleList, true);
				
				image = new DataElementImage();
				image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_CANALE));
				image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
				image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_GESTIONE_CANALE, paIdSogg, paIdPorta, pIdAsps);
				de.setImage(image);
				
				dati.add(de);
			}
			
			
			// Opzioni Avanzate
			
			if(!this.isModalitaStandard() && this.apsCore.getMessageEngines()!=null && !this.apsCore.getMessageEngines().isEmpty()) {
				de = new DataElement();
				de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_OPZIONI_AVANZATE);
				de.setType(DataElementType.TEXT);
				de.setValue(this.getStatoOpzioniAvanzatePortaApplicativaDefault(paDefault));
				if(!this.isModalitaCompleta()) {
					this.setStatoOpzioniAvanzatePortaApplicativaDefault(de, paDefault.getOptions());
				}
				paIdSogg = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, asps.getIdSoggetto() + "");
				
				image = new DataElementImage();
				image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_OPZIONI_AVANZATE));
				image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
				image.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,paIdSogg, paNomePorta, paIdPorta,pIdAsps,paConfigurazioneAltroApi);
				
				de.setImage(image);
				dati.add(de);
			}
			
			// Proprieta
			this.addProprietaOggetto(dati, pOggetto);
			
		}
		
		if(gestioneFruitori) {
			
			ServletUtils.setObjectIntoSession(this.request, this.session, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT_CONFIGURAZIONE, PorteDelegateCostanti.ATTRIBUTO_PORTE_DELEGATE_PARENT);
			
			IDSoggetto idFruitore = new IDSoggetto(fruitore.getTipo(), fruitore.getNome());
			IDPortaDelegata idPD = this.porteDelegateCore.getIDPortaDelegataAssociataDefault(idServizio, idFruitore);
			PortaDelegata pdDefault = this.porteDelegateCore.getPortaDelegata(idPD);
			canalePorta = pdDefault.getCanale();
				
			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 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);
			Parameter pdConfigurazioneAltroApi = new Parameter(PorteDelegateCostanti.PARAMETRO_PORTE_DELEGATE_CONFIGURAZIONE_ALTRO_API, Costanti.CHECK_BOX_ENABLED_TRUE);
			
			
			// url invocazione
			de = new DataElement();
			de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_TITOLO_PORTE_DELEGATE_DATI_INVOCAZIONE);
			de.setType(DataElementType.TEXT);
			boolean analizeProxyPassRules = true;
			UrlInvocazioneAPI urlInvocazione = this.confCore.getConfigurazioneUrlInvocazione(protocollo, RuoloContesto.PORTA_DELEGATA, serviceBinding, pdDefault.getNome(), idFruitore,
					as, pdDefault.getCanale(),
					analizeProxyPassRules);
			String urlInvocazioneAPI = urlInvocazione.getUrl();
			de.setValue(urlInvocazioneAPI);
			
			UrlInvocazioneAPI urlInvocazioneDefault = this.confCore.getConfigurazioneUrlInvocazione(protocollo, RuoloContesto.PORTA_DELEGATA, serviceBinding, pdDefault.getNome(), idFruitore,
					as, pdDefault.getCanale(),
					!analizeProxyPassRules);
			if(urlInvocazioneDefault!=null && urlInvocazioneDefault.getUrl()!=null && !urlInvocazioneDefault.getUrl().equals(urlInvocazioneAPI)) {
				de.setToolTip(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_BASE_URL_INVOCAZIONE_INTERNA+": "+urlInvocazioneDefault.getUrl());
			}
			
			List<Parameter> listParametersUrlInvocazione = new ArrayList<>();
			listParametersUrlInvocazione.add(pIdPD);
			listParametersUrlInvocazione.add(pNomePD);
			listParametersUrlInvocazione.add(pIdSoggPD);
			listParametersUrlInvocazione.add(pIdAsps);
			listParametersUrlInvocazione.add(pIdFruitore);
			listParametersUrlInvocazione.add(pConfigurazioneDati);
			listParametersUrlInvocazione.add(pTipoSoggettoFruitore);
			listParametersUrlInvocazione.add(pNomeSoggettoFruitore);
			
			image = new DataElementImage();
			image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE, listParametersUrlInvocazione.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteDelegateCostanti.LABEL_PARAMETRO_TITOLO_PORTE_DELEGATE_DATI_INVOCAZIONE));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
			
			de.setImage(image);
			dati.add(de);
			
			
			boolean visualizzaConnettore = true;
			boolean checkConnettore = false;
			long idConnettore = 1;
			
			for (int i = 0; i < listaPorteDelegateAssociate.size(); i++) {
				PortaDelegata pdAssociata = listaPorteDelegateAssociate.get(i);
				MappingFruizionePortaDelegata mapping = listaMappingFruzionePortaDelegata.get(i);

				List<String> listaAzioni = null;
				if(!mapping.isDefault()) {
					listaAzioni = pdAssociata.getAzione().getAzioneDelegataList();
				}
				
				String azioneConnettore =  null;
				if(listaAzioni!=null && !listaAzioni.isEmpty()) {
					azioneConnettore = listaAzioni.get(0);
				}
				
				boolean connettoreConfigurazioneRidefinito = false;
				if(azioneConnettore!=null && !"".equals(azioneConnettore)) {
					for (ConfigurazioneServizioAzione check : fruitore.getConfigurazioneAzioneList()) {
						if(check.getAzioneList().contains(azioneConnettore)) {
							connettoreConfigurazioneRidefinito = true;
							break;
						}
					}
				}
				
				
				if(connettoreConfigurazioneRidefinito) {
					visualizzaConnettore = false;
					break;
				}
			}
			
			if(visualizzaConnettore) {
				org.openspcoop2.core.registry.Connettore connettore = fruitore.getConnettore();
				idConnettore = connettore.getId();
				checkConnettore = org.openspcoop2.pdd.core.connettori.ConnettoreCheck.checkSupported(connettore);
			}

			// Connettore
			if(visualizzaConnettore) {
				de = new DataElement();
				de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONNETTORE);
				de.setType(DataElementType.TEXT);
				org.openspcoop2.core.registry.Connettore connettore = fruitore.getConnettore();
				String urlConnettore = this.getLabelConnettore(connettore, true, false);
				String tooltipConnettore = this.getLabelConnettore(connettore, true, true);
				
				// Controllo se richiedere il connettore
				boolean connettoreStatic = false;
				if(gestioneFruitori) {
					connettoreStatic = this.apsCore.isConnettoreStatic(protocollo);
				}
				
				if(!connettoreStatic) {
					
					de.setValue(formatInfoForView(urlConnettore));
					de.setToolTip(tooltipConnettore);
					
					List<Parameter> listParametersConnettore = new ArrayList<>();
					listParametersConnettore.add(pId);
					listParametersConnettore.add(pIdFruitore);
					listParametersConnettore.add(pIdSoggettoErogatore);
					listParametersConnettore.add(pIdProviderFruitore);
					listParametersConnettore.add(pConnettoreDaListaAPS);
					listParametersConnettore.add(pTipoSoggettoFruitore);
					listParametersConnettore.add(pNomeSoggettoFruitore);
					image = new DataElementImage();
					image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_CONNETTORE));
					image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
					image.setUrl(
							AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_CHANGE,
							listParametersConnettore.toArray(new Parameter[1])
							);
					de.addImage(image);
					
					if(checkConnettore) {
						List<Parameter> listParametersVerificaConnettore = new ArrayList<>();
						listParametersVerificaConnettore.add(pIdPD);
						listParametersVerificaConnettore.add(pIdFruitore);
						listParametersVerificaConnettore.add(pIdSoggettoErogatore);
						listParametersVerificaConnettore.add(pIdProviderFruitore);
						listParametersVerificaConnettore.add(pConnettoreDaListaAPS);
						listParametersVerificaConnettore.add(pTipoSoggettoFruitore);
						listParametersVerificaConnettore.add(pNomeSoggettoFruitore);
						listParametersVerificaConnettore.add(pIdSoggPD);
						listParametersVerificaConnettore.add(pIdAsps);
						listParametersVerificaConnettore.add(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ID, idConnettore+""));
						listParametersVerificaConnettore.add(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_ACCESSO_DA_GRUPPI, false+""));
						listParametersVerificaConnettore.add(new Parameter(CostantiControlStation.PARAMETRO_VERIFICA_CONNETTORE_REGISTRO, true+""));
						image = new DataElementImage();
						
						image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_VERIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, CostantiControlStation.LABEL_CONFIGURAZIONE_CONNETTIVITA));
						image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_VERIFICA_CONFIGURAZIONE);
						image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_VERIFICA_CONNETTORE, 
								listParametersVerificaConnettore.toArray(new Parameter[1]));
						
						de.addImage(image);
					}
				}
				else {
					de.setValue("-");
				}
				
				dati.add(de);
			}
			
			// CORS
			de = new DataElement();
			de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_CORS);
			de.setType(DataElementType.TEXT);
			de.setValue(this.getStatoGestioneCorsPortaDelegata(pdDefault, false)); 
			if(!this.isModalitaCompleta()) {
				this.setStatoGestioneCORS(de, pdDefault.getGestioneCors(), this.confCore.getConfigurazioneGenerale());
			}
			image = new DataElementImage();
			image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_CORS));
			image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
			image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_GESTIONE_CORS, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
			de.setImage(image);
			dati.add(de);
			
			// Canale
			CanaliConfigurazione gestioneCanali = this.confCore.getCanaliConfigurazione(false);
			boolean gestioneCanaliEnabled = gestioneCanali != null && org.openspcoop2.core.config.constants.StatoFunzionalita.ABILITATO.equals(gestioneCanali.getStato());
			if(gestioneCanaliEnabled) {
				List<CanaleConfigurazione> canaleList = gestioneCanali != null ? gestioneCanali.getCanaleList() : new ArrayList<>();
				de = new DataElement();
				de.setType(DataElementType.TEXT);
				de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_CANALE);
				this.setStatoCanalePorta(de, canalePorta, as.getCanale(), canaleList, false);
				
				image = new DataElementImage();
				image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_CANALE));
				image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
				image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_GESTIONE_CANALE, pIdPD, pNomePD, pIdSoggPD, pIdAsps, pIdFruitore);
				de.setImage(image);
				
				dati.add(de);
			}
			
			
			// Opzioni Avanzate
			
			if(!this.isModalitaStandard() && this.apsCore.getMessageEngines()!=null && !this.apsCore.getMessageEngines().isEmpty()) {
				de = new DataElement();
				de.setLabel(PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_OPZIONI_AVANZATE);
				de.setType(DataElementType.TEXT);
				de.setValue(this.getStatoOpzioniAvanzatePortaDelegataDefault(pdDefault));
				if(!this.isModalitaCompleta()) {
					this.setStatoOpzioniAvanzatePortaDelegataDefault(de, pdDefault.getOptions());
				}
				image = new DataElementImage();
				image.setToolTip(MessageFormat.format(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP_CON_PARAMETRO, PorteDelegateCostanti.LABEL_PARAMETRO_PORTE_DELEGATE_OPZIONI_AVANZATE));
				image.setImage(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
				image.setUrl(PorteDelegateCostanti.SERVLET_NAME_PORTE_DELEGATE_CHANGE,pIdPD,pNomePD,pIdSoggPD, pIdAsps, pIdFruitore, pdConfigurazioneAltroApi);
				de.setImage(image);
				dati.add(de);
			}
			
			// Proprieta
			this.addProprietaOggetto(dati, pOggetto);
		}
		

		Parameter pGruppiTrue = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_GRUPPI,true+"");
		Parameter pGruppiFalse = new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_GRUPPI,false+"");
		
		Parameter pConfigurazioneTrue =new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_CONFIGURAZIONI,true+"");
		Parameter pConfigurazioneFalse =new Parameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_GESTIONE_CONFIGURAZIONI,false+"");
		

		
		
		boolean visualizzazioneTabs = !this.isModalitaCompleta();
		
		Parameter pIdTab = new Parameter(CostantiControlStation.PARAMETRO_ID_TAB, "0");
		
		// configurazioni
		de = new DataElement();
		de.setType(DataElementType.LINK);
		if(gestioneErogatori)
			de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_PORTE_APPLICATIVE_LIST, 
					pId, pNomeServizio, pTipoServizio, pIdSoggettoErogatore,pConfigurazioneTrue,pGruppiFalse,pIdTab);
		if(gestioneFruitori)
			de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_PORTE_DELEGATE_LIST,	
					pId, pIdSogg, pIdSoggettoErogatore, pNomeServizio, pTipoServizio, pIdFruitore,pConfigurazioneTrue,pGruppiFalse,pTipoSoggettoFruitore,pNomeSoggettoFruitore,pIdTab);
		if(visualizzazioneTabs)
			de.setValue(ErogazioniCostanti.LABEL_ASPS_GESTIONE_CONFIGURAZIONI_CONFIGURA);			
		else
			de.setValue(ErogazioniCostanti.LABEL_ASPS_GESTIONE_CONFIGURAZIONI);
		de.setIcon(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_GESTIONE_CONFIGURAZIONI);
		dati.add(de);
		
		if(!visualizzazioneTabs) {
			// Gestione Gruppi
			de = new DataElement();
			de.setType(DataElementType.LINK);
			if(gestioneErogatori)
				de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_PORTE_APPLICATIVE_LIST, 
						pId, pNomeServizio, pTipoServizio, pIdSoggettoErogatore, pConfigurazioneFalse, pGruppiTrue);
			if(gestioneFruitori)
				de.setUrl(AccordiServizioParteSpecificaCostanti.SERVLET_NAME_APS_FRUITORI_PORTE_DELEGATE_LIST,	
						pId, pIdSogg, pIdSoggettoErogatore, pNomeServizio, pTipoServizio, pIdFruitore, pConfigurazioneFalse, pGruppiTrue,pTipoSoggettoFruitore,pNomeSoggettoFruitore);
			de.setValue(MessageFormat.format(ErogazioniCostanti.LABEL_ASPS_GESTIONE_GRUPPI_CON_PARAMETRO, this.getLabelAzioni(serviceBinding)));
			de.setIcon(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_GESTIONE_GRUPPI_CON_PARAMETRO);
			dati.add(de);
		}
		
		if(visualizzaGruppi)
			this.aggiungiListaConfigurazioni(datiPagina, serviceBinding, gestioneErogatori, listaMappingErogazionePortaApplicativa,	listaPorteApplicativeAssociate, listaMappingFruzionePortaDelegata, listaPorteDelegateAssociate,  pIdAsps, pIdFruitore, asps, as);

		return datiPagina;
	}
	
	@SuppressWarnings("unused")
	private void aggiungiListaConfigurazioni(List<List<DataElement>> datiPagina, ServiceBinding serviceBinding,
			boolean gestioneErogatori, List<MappingErogazionePortaApplicativa> listaMappingErogazionePortaApplicativa,
			List<PortaApplicativa> listaPorteApplicativeAssociate,
			List<MappingFruizionePortaDelegata> listaMappingFruzionePortaDelegata,
			List<PortaDelegata> listaPorteDelegateAssociate,
			Parameter pIdAsps,
			Parameter pIdFruitore, AccordoServizioParteSpecifica asps, AccordoServizioParteComuneSintetico as)	throws Exception {

		Map<String,String> azioni = this.core.getAzioniConLabel(asps, as, false, true, new ArrayList<>());
		boolean allActionRedefined = false;

		PropertiesSourceConfiguration propertiesSourceConfiguration = this.core.getMessageSecurityPropertiesSourceConfiguration();
		ConfigManager configManager = ConfigManager.getinstance(ControlStationCore.getLog());
		configManager.leggiConfigurazioni(propertiesSourceConfiguration, true);

		DataElement de = null;
		// sezione 2 gruppi e funzionalita'

		if(gestioneErogatori) { // erogazioni
			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;
			}

			if(azioni!=null && azioni.size()>1) {
				List<String> azioniL = new ArrayList<>();
				if(azioni != null && azioni.size() > 0)
					azioniL.addAll(azioni.keySet());
				allActionRedefined = this.allActionsRedefinedMappingErogazionePaAssociate(azioniL, listaPorteApplicativeAssociate);
			}

			for (int d = 0; d < listaMappingErogazionePortaApplicativa.size() ; d++) {
				MappingErogazionePortaApplicativa mapping =listaMappingErogazionePortaApplicativa.get(d);
				PortaApplicativa paAssociata = listaPorteApplicativeAssociate.get(d);

				// controllo se la configurazione deve essere visualizzata
				boolean showConfigurazione = !(mapping.isDefault() && allActionRedefined);

				int numeroConfigurazioniAttive = 0;

				List<String> labelDisponibili = new ArrayList<>();
				List<String> urlDisponibili = new ArrayList<>();

				if(showConfigurazione) {
					List<DataElement> gruppoList = 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 pIdSoggPA = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_SOGGETTO, paAssociata.getIdSoggetto() + "");
					Parameter pIdPorta = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID, ""+paAssociata.getId());
					Parameter pIdProvider = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_PROVIDER, paAssociata.getIdSoggetto() + "");
					Parameter pIdPortaPerSA = new Parameter(PorteApplicativeCostanti.PARAMETRO_PORTE_APPLICATIVE_ID_PORTA, ""+paAssociata.getId());

					// nome Gruppo
					de = new DataElement();
					de.setType(DataElementType.TITLE); 
					de.setLabel(mapping.getDescrizione());
					gruppoList.add(de);

					// controllo accessi
					boolean controlloAccessiAbilitato = false;
					String statoControlloAccessi = this.getStatoControlloAccessiPortaApplicativa(this.apsCore.getProtocolloAssociatoTipoServizio(asps.getTipo()), paAssociata);

					if(statoControlloAccessi.equals(CostantiControlStation.DEFAULT_VALUE_ABILITATO)) {
						controlloAccessiAbilitato = true;
						numeroConfigurazioniAttive ++ ;
					} else {
						labelDisponibili.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONTROLLO_ACCESSI);
						DataElement deTmp = new DataElement();
						deTmp.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONTROLLO_ACCESSI, pIdSoggPA, pIdPorta, pIdAsps);
						urlDisponibili.add(deTmp.getUrl());
					}

					if(controlloAccessiAbilitato) {
						de = new DataElement();
						de.setType(DataElementType.SUBTITLE);
						de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONTROLLO_ACCESSI);
						gruppoList.add(de);

						de = new DataElement();
						de.setType(DataElementType.TEXT);
						de.setLabel(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_GESTIONE_TOKEN);				
						de.setValue(this.getStatoGestioneTokenPortaApplicativa(paAssociata));
						gruppoList.add(de);

						de = new DataElement();
						de.setType(DataElementType.TEXT);
						de.setLabel(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_AUTENTICAZIONE);				
						de.setValue(this.getStatoAutenticazionePortaApplicativa(paAssociata));
						gruppoList.add(de);

						de = new DataElement();
						de.setType(DataElementType.TEXT);
						de.setLabel(CostantiControlStation.LABEL_PARAMETRO_PORTE_CONTROLLO_ACCESSI_AUTORIZZAZIONE_DIFFERENTE_DA_TRASPORTO_E_TOKEN);				
						de.setValue(this.getStatoAutorizzazionePortaApplicativa(paAssociata));
						gruppoList.add(de);

						de = new DataElement();
						de.setType(DataElementType.BUTTON);
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONTROLLO_ACCESSI, pIdSoggPA, pIdPorta, pIdAsps);
						de.setValue(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
						de.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP); 
						gruppoList.add(de);
					}

					// validazione contenuti
					boolean validazioneContenutiAbilitato = false;
					String statoValidazione = this.getStatoValidazionePortaApplicativa(paAssociata);

					if(!statoValidazione.equals(PorteDelegateCostanti.DEFAULT_VALUE_PARAMETRO_PORTE_DELEGATE_VALIDAZIONE_DISABILITATO)) {
						validazioneContenutiAbilitato = true;
						numeroConfigurazioniAttive ++ ;
					} else {
						labelDisponibili.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI);
						DataElement deTmp = new DataElement();
						deTmp.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI, pIdSoggPA, pIdPorta, pIdAsps);
						urlDisponibili.add(deTmp.getUrl());
					}

					if(validazioneContenutiAbilitato) {
						de = new DataElement();
						de.setType(DataElementType.SUBTITLE);
						de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI);
						gruppoList.add(de);

						de = new DataElement();
						de.setType(DataElementType.TEXT);
						de.setLabel(CostantiControlStation.LABEL_PARAMETRO_STATO);				
						de.setValue(statoValidazione);
						gruppoList.add(de);

						String tipoValidazione = this.getTipoValidazionePortaApplicativa(paAssociata);
						if(tipoValidazione != null) {
							de = new DataElement();
							de.setType(DataElementType.TEXT);
							de.setLabel(CostantiControlStation.LABEL_PARAMETRO_PORTE_TIPO);				
							de.setValue(tipoValidazione);
							gruppoList.add(de);
						}

						de = new DataElement();
						de.setType(DataElementType.BUTTON);
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_VALIDAZIONE_CONTENUTI, pIdSoggPA, pIdPorta, pIdAsps);
						de.setValue(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
						de.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP); 
						gruppoList.add(de);
					}


					// message security
					if(visualizzaSicurezza) {
						boolean controlloMessageSecurityAbilitato = false;
						String statoMessageSecurity = this.getStatoMessageSecurityPortaApplicativa(paAssociata);

						if(statoMessageSecurity.equals(CostantiConfigurazione.ABILITATO.toString())) {
							controlloMessageSecurityAbilitato = true;
							numeroConfigurazioniAttive ++ ;
						} else {
							labelDisponibili.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MESSAGE_SECURITY);
							DataElement deTmp = new DataElement();
							deTmp.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MESSAGE_SECURITY,pIdSoggPA, pIdPorta, pIdAsps);
							urlDisponibili.add(deTmp.getUrl());
						}

						if(controlloMessageSecurityAbilitato) {
							de = new DataElement();
							de.setType(DataElementType.SUBTITLE);
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MESSAGE_SECURITY);
							gruppoList.add(de);

							de = new DataElement();
							de.setType(DataElementType.TEXT);
							de.setLabel(CostantiControlStation.LABEL_PARAMETRO_STATO);				
							de.setValue(statoMessageSecurity);
							gruppoList.add(de);

							MessageSecurity messageSecurity = paAssociata.getMessageSecurity();
							String requestMode = null;
							String responseMode = null; 

							if(messageSecurity != null) {
								if(messageSecurity.getRequestFlow() != null){
									requestMode = messageSecurity.getRequestFlow().getMode();
								}
								if(messageSecurity.getResponseFlow() != null){
									responseMode = messageSecurity.getResponseFlow().getMode();
								}
							}

							de = new DataElement();
							de.setType(DataElementType.TEXT);
							de.setLabel(CostantiControlStation.LABEL_PARAMETRO_DUMP_SEZIONE_RICHIESTA);				


							if(StringUtils.isNotEmpty(requestMode)) {
								if(requestMode.equals(CostantiControlStation.VALUE_SICUREZZA_MESSAGGIO_SCHEMA_DEFAULT)) {
									de.setValue(CostantiControlStation.LABEL_SICUREZZA_MESSAGGIO_SCHEMA_CONFIGURAZIONE_MANUALE);
								} else {
									Config configurazione = configManager.getConfigurazione(propertiesSourceConfiguration, requestMode);
									de.setValue(configurazione.getLabel());
								}
							} else {
								de.setValue(CostantiControlStation.LABEL_SICUREZZA_MESSAGGIO_SCHEMA_NESSUNO);
							}
							gruppoList.add(de);

							de = new DataElement();
							de.setType(DataElementType.TEXT);
							de.setLabel(CostantiControlStation.LABEL_PARAMETRO_DUMP_SEZIONE_RISPOSTA);				
							if(StringUtils.isNotEmpty(responseMode)) {
								if(responseMode.equals(CostantiControlStation.VALUE_SICUREZZA_MESSAGGIO_SCHEMA_DEFAULT)) {
									de.setValue(CostantiControlStation.LABEL_SICUREZZA_MESSAGGIO_SCHEMA_CONFIGURAZIONE_MANUALE);
								} else {
									Config configurazione = configManager.getConfigurazione(propertiesSourceConfiguration, responseMode);
									de.setValue(configurazione.getLabel());
								}
							} else {
								de.setValue(CostantiControlStation.LABEL_SICUREZZA_MESSAGGIO_SCHEMA_NESSUNO);
							}
							gruppoList.add(de);

							de = new DataElement();
							de.setType(DataElementType.BUTTON);
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MESSAGE_SECURITY,pIdSoggPA, pIdPorta, pIdAsps);
							de.setValue(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
							de.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP); 
							gruppoList.add(de);
						}
					}

					//mtom
					if(visualizzaMTOM) {
						boolean controlloMTOMAbilitato = false;
						String statoMTOM = this.getStatoMTOMPortaApplicativa(paAssociata);

						if(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM_ABILITATO.equals(statoMTOM)) {
							controlloMTOMAbilitato = true;
							numeroConfigurazioniAttive ++ ;
						} else {
							labelDisponibili.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM);
							DataElement deTmp = new DataElement();
							deTmp.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MTOM,pIdPorta, pIdSoggPA, pIdAsps);
							urlDisponibili.add(deTmp.getUrl());
						}

						if(controlloMTOMAbilitato) {
							de = new DataElement();
							de.setType(DataElementType.SUBTITLE);
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM);
							gruppoList.add(de);

							de = new DataElement();
							de.setType(DataElementType.TEXT);
							de.setLabel(CostantiControlStation.LABEL_PARAMETRO_STATO);				
							de.setValue(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_MTOM_ABILITATO);
							gruppoList.add(de);

							de = new DataElement();
							de.setType(DataElementType.TEXT);
							de.setLabel(CostantiControlStation.LABEL_PARAMETRO_DUMP_SEZIONE_RICHIESTA);	
							MTOMProcessorType modeReq = this.getProcessorTypeRequestMTOMPortaApplicativa(paAssociata);
							if(modeReq != null) {
								de.setValue(modeReq.getValue());
							} else {
								de.setValue(MTOMProcessorType.DISABLE.getValue());
							}
							gruppoList.add(de);

							de = new DataElement();
							de.setType(DataElementType.TEXT);
							de.setLabel(CostantiControlStation.LABEL_PARAMETRO_DUMP_SEZIONE_RISPOSTA);		
							MTOMProcessorType modeRes = this.getProcessorTypeResponseMTOMPortaApplicativa(paAssociata);
							if(modeRes != null) {
								de.setValue(modeRes.getValue());
							} else {
								de.setValue(MTOMProcessorType.DISABLE.getValue());
							}
							gruppoList.add(de);

							de = new DataElement();
							de.setType(DataElementType.BUTTON);
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_MTOM,pIdPorta, pIdSoggPA, pIdAsps);
							de.setValue(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
							de.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP); 
							gruppoList.add(de);
						}
					}

					// correlazione applicativa
					if(visualizzaCorrelazione) {
						boolean tracciamentoAbilitato = false;
						String statoTracciamento = this.getStatoTracciamentoPortaApplicativa(paAssociata);

						if(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CORRELAZIONE_APPLICATIVA_ABILITATA.equals(statoTracciamento)){
							tracciamentoAbilitato = true;
							numeroConfigurazioniAttive ++ ;
						} else {
							labelDisponibili.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRACCIAMENTO);
							DataElement deTmp = new DataElement();
							deTmp.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CORRELAZIONE_APPLICATIVA, pIdSoggPA, pIdPorta, pIdNome,pIdAsps);
							urlDisponibili.add(deTmp.getUrl());
						}

						if(tracciamentoAbilitato) {
							de = new DataElement();
							de.setType(DataElementType.SUBTITLE);
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_TRACCIAMENTO);
							gruppoList.add(de);

							if(this.isRidefinitoTransazioniRegistratePortaApplicativa(paAssociata)) {
								de = new DataElement();
								de.setType(DataElementType.TEXT);
								de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_REGISTRAZIONE_ESITI);				
								de.setValue(this.getStatoTransazioniRegistratePortaApplicativa(paAssociata));
								gruppoList.add(de);
							}

							if(this.isRidefinitoMessaggiDiagnosticiPortaApplicativa(paAssociata)) {
								de = new DataElement();
								de.setType(DataElementType.TEXT);
								de.setLabel(ConfigurazioneCostanti.LABEL_CONFIGURAZIONE_MESSAGGI_DIAGNOSTICI);				
								de.setValue(this.getStatoMessaggiDiagnosticiPortaApplicativa(paAssociata));
								gruppoList.add(de);
							}

							if(this.isEnabledCorrelazioneApplicativaPortaApplicativa(paAssociata)) {
								de = new DataElement();
								de.setType(DataElementType.TEXT);
								de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CORRELAZIONE_APPLICATIVA);				
								de.setValue(this.getStatoCorrelazioneApplicativaPortaApplicativa(paAssociata)); 
								gruppoList.add(de);
							}

							de = new DataElement();
							de.setType(DataElementType.BUTTON);
							de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CORRELAZIONE_APPLICATIVA, pIdSoggPA, pIdPorta, pIdNome,pIdAsps);
							de.setValue(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
							de.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP); 
							gruppoList.add(de);
						}
					}

					// dump
					boolean controlloDumpAbilitato = false;
					String statoDump = this.getStatoDumpPortaApplicativa(paAssociata, true);
					if(!statoDump.startsWith(CostantiControlStation.LABEL_PARAMETRO_DUMP_STATO_DEFAULT)){
						controlloDumpAbilitato = true;
						numeroConfigurazioniAttive ++ ;
					} else {
						labelDisponibili.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE);
						DataElement deTmp = new DataElement();
						deTmp.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE, pIdSoggPA, pIdPorta, pIdAsps);
						urlDisponibili.add(deTmp.getUrl());
					}

					if(controlloDumpAbilitato) {
						de = new DataElement();
						de.setType(DataElementType.SUBTITLE);
						de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE);
						gruppoList.add(de);

						de = new DataElement();
						de.setType(DataElementType.TEXT);
						de.setLabel(CostantiControlStation.LABEL_PARAMETRO_DUMP_SEZIONE_RICHIESTA);				
						de.setValue(this.getStatoDumpRichiestaPortaApplicativa(paAssociata, true));
						gruppoList.add(de);

						de = new DataElement();
						de.setType(DataElementType.TEXT);
						de.setLabel(CostantiControlStation.LABEL_PARAMETRO_DUMP_SEZIONE_RISPOSTA);				
						de.setValue(this.getStatoDumpRispostaPortaApplicativa(paAssociata, true));
						gruppoList.add(de);

						de = new DataElement();
						de.setType(DataElementType.BUTTON);
						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_DUMP_CONFIGURAZIONE, pIdSoggPA, pIdPorta, pIdAsps);
						de.setValue(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
						de.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP); 
						gruppoList.add(de);
					}

					// connettore
					if(!mapping.isDefault()) {
						PortaApplicativaServizioApplicativo portaApplicativaAssociataServizioApplicativo = paAssociata.getServizioApplicativoList().get(0);
						boolean connettoreConfigurazioneRidefinito = portaApplicativaAssociataServizioApplicativo.getNome().equals(paAssociata.getNome());

						String servletConnettore = PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORE_DEFAULT;

						if(connettoreConfigurazioneRidefinito) {
							servletConnettore = PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CONNETTORE_RIDEFINITO;
							numeroConfigurazioniAttive ++ ;
							de = new DataElement();
							de.setType(DataElementType.SUBTITLE);
							de.setLabel(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE);
							gruppoList.add(de);

							ServizioApplicativo sa = this.saCore.getServizioApplicativo(portaApplicativaAssociataServizioApplicativo.getIdServizioApplicativo());
							InvocazioneServizio is = sa.getInvocazioneServizio();
							Connettore connis = is.getConnettore();

							String endpointtype = "";
							if ((connis.getCustom()!=null && connis.getCustom()) && 
									!connis.getTipo().equals(TipiConnettore.HTTPS.toString()) && 
									!connis.getTipo().equals(TipiConnettore.FILE.toString()) &&
									!connis.getTipo().equals(TipiConnettore.STATUS.toString())) {
								endpointtype = TipiConnettore.CUSTOM.toString();
							} else
								endpointtype = connis.getTipo();

							if(StringUtils.isNotEmpty(endpointtype)) {
								de = new DataElement();
								de.setType(DataElementType.TEXT);
								de.setLabel(ConnettoriCostanti.LABEL_PARAMETRO_CONNETTORE_ENDPOINT_TYPE);				
								de.setValue(endpointtype);
								gruppoList.add(de);
							}

							List<Property> cp = connis.getPropertyList();
							String urlConnettore = "";
							for (int i = 0; i < connis.sizePropertyList(); i++) {
								Property singlecp = cp.get(i);
								if (singlecp.getNome().equals(CostantiDB.CONNETTORE_HTTP_LOCATION)) {
									urlConnettore = singlecp.getValore();
									break;
								}
							}

							if(StringUtils.isNotEmpty(urlConnettore)) {
								de = new DataElement();
								de.setType(DataElementType.TEXT);
								de.setLabel(ConnettoriCostanti.LABEL_PARAMETRO_CONNETTORE_URL);				
								de.setValue(urlConnettore.length() > 20 ? (urlConnettore.substring(0, 17) + "...") : urlConnettore);
								de.setToolTip(urlConnettore);
								gruppoList.add(de);
							}

							de = new DataElement();
							de.setType(DataElementType.BUTTON);
							de.setUrl(servletConnettore, pIdSoggPA, pIdPorta, pIdAsps);
							de.setValue(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE);
							de.setToolTip(ErogazioniCostanti.ASPS_EROGAZIONI_ICONA_MODIFICA_CONFIGURAZIONE_TOOLTIP); 
							gruppoList.add(de);
						} else {
							labelDisponibili.add(PorteApplicativeCostanti.LABEL_PARAMETRO_PORTE_APPLICATIVE_CONNETTORE);
							DataElement deTmp = new DataElement();
							deTmp.setUrl(servletConnettore, pIdSoggPA, pIdPorta, pIdAsps);
							urlDisponibili.add(deTmp.getUrl());
						}
					}

					if(this.isModalitaAvanzata()) {
						// proprieta'

/**
						//						// opzioni avanzate
						//						de = new DataElement();
						//						//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 (contaListe) {
						//							int numProp = paAssociata.sizeProprietaList();
						//							ServletUtils.setDataElementVisualizzaLabel(de, (long) numProp );
						//						} else
						//							ServletUtils.setDataElementVisualizzaLabel(de);
						//						e.add(de);
						//
						//					// Altro
						//						de = new DataElement();
						//						de.setUrl(PorteApplicativeCostanti.SERVLET_NAME_PORTE_APPLICATIVE_CHANGE,pIdSogg, pNomePorta, pIdPorta,pIdAsps,pConfigurazioneAltro);
						//						ServletUtils.setDataElementVisualizzaLabel(de);
						//						e.add(de);*/


					}


					// check box abilitazione
					de = new DataElement();
					de.setType(DataElementType.CHECKBOX);
					boolean statoPA = paAssociata.getStato().equals(StatoFunzionalita.ABILITATO);
					String statoMapping = statoPA ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP;
					de.setToolTip(statoMapping);
					de.setSelected(statoPA);
					de.setIcon(ErogazioniCostanti.LABEL_ASPS_ABILITA_CONFIGURAZIONE);
					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,pIdSoggPA, pNomePorta, pIdPorta,pIdAsps, pAbilita);
					gruppoList.add(de);


					// select per modale con configurazioni disponibili
					de = new DataElement();
					de.setName(ErogazioniCostanti.ASPS_EROGAZIONI_PARAMETRO_NUOVA_CONFIGURAZIONE+"_"+ d);
					de.setLabel(ErogazioniCostanti.LABEL_ASPS_EROGAZIONI_PARAMETRO_NUOVA_CONFIGURAZIONE);
					if(!labelDisponibili.isEmpty()) {
						de.setType(DataElementType.SELECT);
						de.setValues(urlDisponibili);
						de.setLabels(labelDisponibili);
						de.setSelected(urlDisponibili.get(0));
					} else {
						de.setType(DataElementType.HIDDEN);
					}
					gruppoList.add(de);

					// informazioni disegno in testa
					de = new DataElement();
					de.setType(DataElementType.HIDDEN);
					de.setName(ErogazioniCostanti.ASPS_EROGAZIONI_PARAMETRO_NUMERO_CONFIGURAZIONI_ATTIVE);
					de.setValue(numeroConfigurazioniAttive + "");
					gruppoList.add(0,de);

					int numeroConfigurazioniDisponibili = labelDisponibili.size();

					de = new DataElement();
					de.setType(DataElementType.HIDDEN);
					de.setName(ErogazioniCostanti.ASPS_EROGAZIONI_PARAMETRO_NUMERO_CONFIGURAZIONI_DISPONIBILI);
					de.setValue(numeroConfigurazioniDisponibili + "");
					gruppoList.add(0,de);

					datiPagina.add(gruppoList);
				}
			}

		} else { // fruizioni
			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;
			}

			if(azioni!=null && azioni.size()>1) {
				List<String> azioniL = new ArrayList<>();
				if(azioni != null && azioni.size() > 0)
					azioniL.addAll(azioni.keySet());
				allActionRedefined = this.allActionsRedefinedMappingFruizionePdAssociate(azioniL, listaPorteDelegateAssociate);
			}


			for (int d = 0; d < listaMappingFruzionePortaDelegata.size() ; d++) {
				MappingFruizionePortaDelegata mapping = listaMappingFruzionePortaDelegata.get(d);
				PortaDelegata pdAssociata = listaPorteDelegateAssociate.get(d);

				// controllo se la configurazione deve essere visualizzata
				boolean showConfigurazione = !(mapping.isDefault() && allActionRedefined);

				int numeroConfigurazioniDisponibili = 1;
				int numeroConfigurazioniAttive = 0;

				if(showConfigurazione) {
					List<DataElement> gruppoList = 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() + "");

					// nome Gruppo
					de = new DataElement();
					de.setType(DataElementType.TITLE); 
					de.setLabel(mapping.getDescrizione());
					gruppoList.add(de);




					// check box abilitazione
					de = new DataElement();
					de.setType(DataElementType.CHECKBOX);
					boolean statoPD = pdAssociata.getStato().equals(StatoFunzionalita.ABILITATO);
					String statoMapping = statoPD ? CostantiControlStation.LABEL_PARAMETRO_PORTA_ABILITATO_TOOLTIP : CostantiControlStation.LABEL_PARAMETRO_PORTA_DISABILITATO_TOOLTIP;
					de.setToolTip(statoMapping);
					de.setSelected(statoPD);
					de.setIcon(ErogazioniCostanti.LABEL_ASPS_ABILITA_CONFIGURAZIONE);
					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);
					gruppoList.add(de);


					// informazioni disegno in testa
					de = new DataElement();
					de.setType(DataElementType.HIDDEN);
					de.setName(ErogazioniCostanti.ASPS_EROGAZIONI_PARAMETRO_NUMERO_CONFIGURAZIONI_ATTIVE);
					de.setValue(numeroConfigurazioniAttive + "");
					gruppoList.add(0,de);

					de = new DataElement();
					de.setType(DataElementType.HIDDEN);
					de.setName(ErogazioniCostanti.ASPS_EROGAZIONI_PARAMETRO_NUMERO_CONFIGURAZIONI_DISPONIBILI);
					de.setValue(numeroConfigurazioniDisponibili + "");
					gruppoList.add(0,de);

					datiPagina.add(gruppoList);
				}
			}
		}
	}
	
	public void prepareErogazioneChange(TipoOperazione tipoOp, AccordoServizioParteSpecifica asps, IDSoggetto idSoggettoFruitore) 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;
			}
		}
		
		IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromAccordo(asps);
		String tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(asps.getTipoSoggettoErogatore());
		AccordoServizioParteComuneSintetico as = this.apcCore.getAccordoServizioSintetico(asps.getIdAccordo());
		ServiceBinding serviceBinding = this.apcCore.toMessageServiceBinding(as.getServiceBinding());
		
		String tmpTitle = this.getLabelServizio(idSoggettoFruitore, gestioneFruitori, idServizio, tipoProtocollo);
						
		List<MappingErogazionePortaApplicativa> listaMappingErogazionePortaApplicativa = new ArrayList<>();
		List<PortaApplicativa> listaPorteApplicativeAssociate = new ArrayList<>();
		if(gestioneErogatori) {
			// lettura delle configurazioni associate
			listaMappingErogazionePortaApplicativa = this.apsCore.mappingServiziPorteAppList(idServizio,asps.getId(), null);
			for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
				listaPorteApplicativeAssociate.add(this.porteApplicativeCore.getPortaApplicativa(mappinErogazione.getIdPortaApplicativa()));
			}
		}

		List<MappingFruizionePortaDelegata> listaMappingFruzionePortaDelegata = new ArrayList<>();
		List<PortaDelegata> listaPorteDelegateAssociate = new ArrayList<>();
		Fruitore fruitore = null;
		if(gestioneFruitori) {
			// In questa modalità ci deve essere un fruitore indirizzato
			for (Fruitore check : asps.getFruitoreList()) {
				if(check.getTipo().equals(idSoggettoFruitore.getTipo()) && check.getNome().equals(idSoggettoFruitore.getNome())) {
					fruitore = check;
					break;
				}
			}
			if(fruitore!=null) {
				listaMappingFruzionePortaDelegata = this.apsCore.serviziFruitoriMappingList(fruitore.getId(), idSoggettoFruitore, idServizio, null);	
				for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
					listaPorteDelegateAssociate.add(this.porteDelegateCore.getPortaDelegata(mappingFruizione.getIdPortaDelegata()));
				}
			}
		}
		
		this.makeMenu();
		
		// setto la barra del titolo
		List<Parameter> lstParm = new ArrayList<>();

		if(gestioneFruitori) {
			lstParm.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_FRUIZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
		}
		else {
			lstParm.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_EROGAZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
		}
		lstParm.add(new Parameter(tmpTitle, null));

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

		List<List<DataElement>> datiPagina = new ArrayList<>();
		List<DataElement> dati = new ArrayList<>();
		datiPagina.add(dati);
		dati.add(ServletUtils.getDataElementForEditModeFinished());

		String fromAPIPageInfo = this.getParameter(CostantiControlStation.PARAMETRO_API_PAGE_INFO);
		boolean fromApi = Costanti.CHECK_BOX_ENABLED_TRUE.equalsIgnoreCase(fromAPIPageInfo);
		if(fromApi) {
			DataElement de = new DataElement();
			de.setValue(fromAPIPageInfo);
			de.setType(DataElementType.HIDDEN);
			de.setName(CostantiControlStation.PARAMETRO_API_PAGE_INFO);
			dati.add(de);
			
			String nomePorta = this.getParameter(CostantiControlStation.PARAMETRO_NOME_PORTA);
			de = new DataElement();
			de.setValue(nomePorta);
			de.setType(DataElementType.HIDDEN);
			de.setName(CostantiControlStation.PARAMETRO_NOME_PORTA);
			dati.add(de);
			
			String abilita = this.getParameter(CostantiControlStation.PARAMETRO_ABILITA);
			de = new DataElement();
			de.setValue(abilita);
			de.setType(DataElementType.HIDDEN);
			de.setName(CostantiControlStation.PARAMETRO_ABILITA);
			dati.add(de);
			
			String idsogg = this.getParameter(CostantiControlStation.PARAMETRO_ID_SOGGETTO);
			String id = this.getParameter(CostantiControlStation.PARAMETRO_ID);
			
			String idFruizione = null;
			String tipoSoggettoFruitore = null;
			String nomeSoggettoFruitore = null;
			if(fruitore!=null) {
				idFruizione = fruitore.getId()+"";
				tipoSoggettoFruitore = fruitore.getTipo();
				nomeSoggettoFruitore = fruitore.getNome();
			}
			
			this.addHiddenFieldsToDati(tipoOp, id, idsogg, id, asps.getId()+"", 
					idFruizione, tipoSoggettoFruitore, nomeSoggettoFruitore,
					dati);
		}
		else {
			this.addHiddenFieldsToDati(tipoOp, asps.getId()+"", null, null, dati);
		}
		
		datiPagina = this.addErogazioneToDati(datiPagina, tipoOp, asps, as, tipoProtocollo, serviceBinding, gestioneErogatori, gestioneFruitori, listaMappingErogazionePortaApplicativa, listaPorteApplicativeAssociate, listaMappingFruzionePortaDelegata, listaPorteDelegateAssociate, fruitore);
		
		this.pd.setDati(datiPagina);
		this.pd.disableEditMode();
	}
	
	public ActionForward prepareErogazioneChangeResetCache(ActionMapping mapping, GeneralData gd, ConsoleSearch ricerca, TipoOperazione tipoOp, AccordoServizioParteSpecifica asps, IDSoggetto idSoggettoFruitore) 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;
			}
		}
		
		IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromAccordo(asps);
		String tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(asps.getTipoSoggettoErogatore());
		
		String tmpTitle = this.getLabelServizio(idSoggettoFruitore, gestioneFruitori, idServizio, tipoProtocollo);
						
		List<PortaApplicativa> listaPorteApplicativeAssociate = new ArrayList<>();
		if(gestioneErogatori) {
			// lettura delle configurazioni associate
			List<MappingErogazionePortaApplicativa> listaMappingErogazionePortaApplicativa = this.apsCore.mappingServiziPorteAppList(idServizio,asps.getId(), null);
			for(MappingErogazionePortaApplicativa mappinErogazione : listaMappingErogazionePortaApplicativa) {
				listaPorteApplicativeAssociate.add(this.porteApplicativeCore.getPortaApplicativa(mappinErogazione.getIdPortaApplicativa()));
			}
		}

		List<PortaDelegata> listaPorteDelegateAssociate = new ArrayList<>();
		Fruitore fruitore = null;
		if(gestioneFruitori) {
			// In questa modalità ci deve essere un fruitore indirizzato
			for (Fruitore check : asps.getFruitoreList()) {
				if(check.getTipo().equals(idSoggettoFruitore.getTipo()) && check.getNome().equals(idSoggettoFruitore.getNome())) {
					fruitore = check;
					break;
				}
			}
			if(fruitore!=null) {
				List<MappingFruizionePortaDelegata> listaMappingFruzionePortaDelegata = this.apsCore.serviziFruitoriMappingList(fruitore.getId(), idSoggettoFruitore, idServizio, null);	
				for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruzionePortaDelegata) {
					listaPorteDelegateAssociate.add(this.porteDelegateCore.getPortaDelegata(mappingFruizione.getIdPortaDelegata()));
				}
			}
		}
		
		this.makeMenu();
		
		// setto la barra del titolo
		List<Parameter> lstParm = new ArrayList<>();

		if(gestioneFruitori) {
			lstParm.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_FRUIZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
		}
		else {
			lstParm.add(new Parameter(ErogazioniCostanti.LABEL_ASPS_EROGAZIONI, ErogazioniCostanti.SERVLET_NAME_ASPS_EROGAZIONI_LIST));
		}
		lstParm.add(new Parameter(tmpTitle, null));

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

		String labelServizio = getLabelServizio(idSoggettoFruitore, gestioneFruitori, idServizio, tipoProtocollo);
		
		this.eseguiResetCacheAspsOFruitore(asps, gestioneFruitori, fruitore, labelServizio);
		
		String resetElementoCacheS = this.getParameter(CostantiControlStation.PARAMETRO_ELIMINA_ELEMENTO_DALLA_CACHE);
		boolean resetElementoCache = ServletUtils.isCheckBoxEnabled(resetElementoCacheS);
		
		// reset delle cache richiesto dal link nella lista, torno alla lista
		if(resetElementoCache) {
			
			String userLogin = ServletUtils.getUserLoginFromSession(this.session);	
			
			int idLista = Liste.SERVIZI;
			
			// poiche' esistono filtri che hanno necessita di postback salvo in sessione
			List<AccordoServizioParteSpecifica> lista = null;
			if(!ServletUtils.isSearchDone(this)) {
				lista = ServletUtils.getRisultatiRicercaFromSession(this.request, this.session, idLista,  AccordoServizioParteSpecifica.class);
			}
			
			ricerca = this.checkSearchParameters(idLista, ricerca);
			
			this.clearFiltroSoggettoByPostBackProtocollo(0, ricerca, idLista);
								
			this.checkGestione(this.request, this.session, ricerca, idLista, tipologia,true);
			
			// preparo lista
			boolean [] permessi = AccordiServizioParteSpecificaUtilities.getPermessiUtente(this);
			
			if(lista==null) {
				if(this.apsCore.isVisioneOggettiGlobale(userLogin)){
					lista = this.apsCore.soggettiServizioList(null, ricerca,permessi, gestioneFruitori, gestioneErogatori);
				}else{
					lista = this.apsCore.soggettiServizioList(userLogin, ricerca,permessi, gestioneFruitori, gestioneErogatori);
				}
			}

			
			if(!this.isPostBackFilterElement()) {
				ServletUtils.setRisultatiRicercaIntoSession(this.request, this.session, idLista, lista); // salvo poiche' esistono filtri che hanno necessita di postback
			}
			
			this.prepareErogazioniList(ricerca, lista);
			
			// salvo l'oggetto ricerca nella sessione
			ServletUtils.setSearchObjectIntoSession(this.request, this.session, ricerca);
			
			ServletUtils.setGeneralAndPageDataIntoSession(this.request, this.session, gd, this.pd);
			return ServletUtils.getStrutsForwardEditModeFinished(mapping, ErogazioniCostanti.OBJECT_NAME_ASPS_EROGAZIONI, CostantiControlStation.TIPO_OPERAZIONE_RESET_CACHE_ELEMENTO);
		} else { // reset richiesto dal dettaglio, torno al dettaglio
			this.prepareErogazioneChange(tipoOp, asps, idSoggettoFruitore);
			ServletUtils.setGeneralAndPageDataIntoSession(this.request, this.session, gd, this.pd);
			return ServletUtils.getStrutsForwardEditModeFinished(mapping, ErogazioniCostanti.OBJECT_NAME_ASPS_EROGAZIONI, ForwardParams.CHANGE());
		}
	}
	
	public void eseguiResetCacheAspsOFruitore(AccordoServizioParteSpecifica asps, boolean gestioneFruitori, Fruitore fruitore, String labelServizio) 
			throws DriverControlStationException, DriverControlStationNotFound {
		// Uso lo stessoAlias
		List<String> aliases = this.apcCore.getJmxPdDAliases();
		String alias = null;
		if(aliases!=null && !aliases.isEmpty()) {
			alias = aliases.get(0);
		}
		
		long idOjectLong = -1;
		if(gestioneFruitori) {
			if(fruitore==null) {
				throw new DriverControlStationException("Fruitore non trovato");
			}
			idOjectLong = fruitore.getId();
		}
		else {
			idOjectLong = asps.getId();
		}
		
		this.apcCore.invokeJmxMethodAllNodesAndSetResult(this.pd, this.apcCore.getJmxPdDConfigurazioneSistemaNomeRisorsaConfigurazionePdD(alias), 
				gestioneFruitori ?
						this.apcCore.getJmxPdDConfigurazioneSistemaNomeMetodoRipulisciRiferimentiCacheFruizione(alias) :
						this.apcCore.getJmxPdDConfigurazioneSistemaNomeMetodoRipulisciRiferimentiCacheErogazione(alias),
				MessageFormat.format(CostantiControlStation.LABEL_ELIMINATO_CACHE_SUCCESSO,labelServizio),
				MessageFormat.format(CostantiControlStation.LABEL_ELIMINATO_CACHE_FALLITO_PREFIX,labelServizio),
				idOjectLong);
	}
	
	public void eseguiResetCacheAspsOFruitore()
			throws DriverControlStationException, DriverRegistroServiziNotFound, DriverRegistroServiziException, DriverControlStationNotFound {
		String id = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_ID);
		long idInt  = Long.parseLong(id);
		AccordoServizioParteSpecifica asps = this.apsCore.getAccordoServizioParteSpecifica(idInt);
		
		String tipoSoggettoFruitore = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_TIPO_SOGGETTO_FRUITORE);
		String nomeSoggettoFruitore = this.getParameter(AccordiServizioParteSpecificaCostanti.PARAMETRO_APS_NOME_SOGGETTO_FRUITORE);
		IDSoggetto idSoggettoFruitore = null;
		if(tipoSoggettoFruitore!=null && !"".equals(tipoSoggettoFruitore) &&
				nomeSoggettoFruitore!=null && !"".equals(nomeSoggettoFruitore)) {
			idSoggettoFruitore = new IDSoggetto(tipoSoggettoFruitore, nomeSoggettoFruitore);
		}
		
		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;
		}
		
		Fruitore fruitore = null;
		if(gestioneFruitori && idSoggettoFruitore != null) {
			// In questa modalità ci deve essere un fruitore indirizzato
			for (Fruitore check : asps.getFruitoreList()) {
				if(check.getTipo().equals(idSoggettoFruitore.getTipo()) && check.getNome().equals(idSoggettoFruitore.getNome())) {
					fruitore = check;
					break;
				}
			}
		}
		
		IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromAccordo(asps);
		String tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(asps.getTipoSoggettoErogatore());
		String labelServizio = this.getLabelServizio(idSoggettoFruitore, gestioneFruitori, idServizio, tipoProtocollo);
		this.eseguiResetCacheAspsOFruitore(asps, gestioneFruitori, fruitore, labelServizio);
	}
	
	public boolean estraiElencoInvocazioni(boolean soloModI,
			AccordoServizioParteSpecifica asps, IDSoggetto idSoggettoFruitore, boolean gestioneFruitori,
			Fruitore fruitore, IDServizio idServizio, String tipoProtocollo, String nomeApiImpl,
			List<String> listConnettoriRegistrati, List<String> listPosizioneConnettoriRegistrati,
			List<org.openspcoop2.core.registry.Connettore> listConnettoriRegistry,
			List<org.openspcoop2.core.config.Connettore> listConnettoriConfig, List<String> listTokenPolicyValidazione,
			List<GestioneToken> listTokenPolicyValidazioneConf, List<String> listPosizioneTokenPolicyValidazione,
			List<String> listTokenPolicyNegoziazione, List<String> listPosizioneTokenPolicyNegoziazione,
			List<String> listAttributeAuthority, List<String> listPosizioneAttributeAuthority)
			throws ProtocolException, DriverConfigurazioneException, DriverConfigurazioneNotFound {
		boolean findConnettoreHttpConPrefissoHttps = false;
		if(!soloModI) {
			
			if(gestioneFruitori) {
				
				boolean connettoreStatic = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(tipoProtocollo).createProtocolVersionManager(null).isStaticRoute();
										
				List<MappingFruizionePortaDelegata> listaMappingFruizionePortaDelegata = this.apsCore.serviziFruitoriMappingList(fruitore.getId(), idSoggettoFruitore, idServizio, null);
				for(MappingFruizionePortaDelegata mappingFruizione : listaMappingFruizionePortaDelegata) {
					PortaDelegata porta = this.porteDelegateCore.getPortaDelegata(mappingFruizione.getIdPortaDelegata());
					
					// solo le porte applicative abilitate 
					if(StatoFunzionalita.DISABILITATO.equals(porta.getStato())) {
						continue;
					}
					
					String suffixGruppo = "";
					if(!mappingFruizione.isDefault()) {
						suffixGruppo = org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
						"Gruppo: "+mappingFruizione.getDescrizione();
					}
					String nomeFruizione = nomeApiImpl+suffixGruppo;
					
					if(porta.getGestioneToken()!=null && porta.getGestioneToken().getPolicy()!=null && !listTokenPolicyValidazione.contains(porta.getGestioneToken().getPolicy())) {
						listTokenPolicyValidazione.add(porta.getGestioneToken().getPolicy());
						listTokenPolicyValidazioneConf.add(porta.getGestioneToken());
						listPosizioneTokenPolicyValidazione.add(nomeFruizione+
								org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
								"Token Policy Validazione: "+porta.getGestioneToken().getPolicy());
					}
					if(porta.sizeAttributeAuthorityList()>0) {
						for (AttributeAuthority aa : porta.getAttributeAuthorityList()) {
							if(!listAttributeAuthority.contains(aa.getNome())) {
								listAttributeAuthority.add(aa.getNome());
								listPosizioneAttributeAuthority.add(nomeFruizione+
										org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
										"Attribute Authority: "+aa.getNome());
							}
						}
					}
					
					if(!connettoreStatic) {
						org.openspcoop2.core.registry.Connettore connettore = null;
						if(mappingFruizione.isDefault()) {
							connettore = fruitore.getConnettore();
						}
						else {
							if(porta.getAzione()!=null && porta.getAzione().sizeAzioneDelegataList()>0) {
								for (String az : porta.getAzione().getAzioneDelegataList()) {
									for(ConfigurazioneServizioAzione config : fruitore.getConfigurazioneAzioneList()) {
										if(config.getAzioneList().contains(az)) {
											connettore = config.getConnettore();
											break;
										}
									}
									if(connettore!=null) {
										break;
									}
								}
							}
						}
						
						if(connettore!=null) {
							TipiConnettore tipo = TipiConnettore.toEnumFromName(connettore.getTipo());
							if( (!findConnettoreHttpConPrefissoHttps && TipiConnettore.HTTP.equals(tipo)) 
									|| 
								TipiConnettore.HTTPS.equals(tipo) ) {
								
								String nomeConnettore = connettore.getNome();
								if(listConnettoriRegistrati.contains(nomeConnettore)) {
									continue;
								}
								
								String tokenPolicy = ConnettoreUtils.getNegoziazioneTokenPolicyConnettore(connettore);
								if(tokenPolicy!=null && StringUtils.isNotEmpty(tokenPolicy) && !listTokenPolicyNegoziazione.contains(tokenPolicy)) {
									listTokenPolicyNegoziazione.add(tokenPolicy);
									listPosizioneTokenPolicyNegoziazione.add(nomeFruizione + 
											org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
											"Token Policy Negoziazione: "+tokenPolicy);
								}
								
								if( TipiConnettore.HTTP.equals(tipo) ) {
									String endpoint = ConnettoreUtils.getEndpointConnettore(connettore, false);
									if(endpoint!=null) {
										findConnettoreHttpConPrefissoHttps = endpoint.trim().startsWith("https");
									}
								}
								else {
									listConnettoriRegistry.add(connettore);
									listConnettoriRegistrati.add(nomeConnettore);
									listPosizioneConnettoriRegistrati.add(nomeFruizione);
								}
							}
						}
					}
				}
			}
			else {
				List<MappingErogazionePortaApplicativa> listaMappingErogazionePortaApplicativa = this.apsCore.mappingServiziPorteAppList(idServizio,asps.getId(), null);
				for(MappingErogazionePortaApplicativa mappingErogazione : listaMappingErogazionePortaApplicativa) {
					PortaApplicativa porta = this.porteApplicativeCore.getPortaApplicativa(mappingErogazione.getIdPortaApplicativa());
					
					// solo le porte applicative abilitate 
					if(StatoFunzionalita.DISABILITATO.equals(porta.getStato())) {
						continue;
					}
					
					String suffixGruppo = "";
					if(!mappingErogazione.isDefault()) {
						suffixGruppo = org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
								"Gruppo: "+mappingErogazione.getDescrizione();
					}
					String nomeErogazione = nomeApiImpl+suffixGruppo;
					
					if(porta.getGestioneToken()!=null && porta.getGestioneToken().getPolicy()!=null && !listTokenPolicyValidazione.contains(porta.getGestioneToken().getPolicy())) {
						listTokenPolicyValidazione.add(porta.getGestioneToken().getPolicy());
						listTokenPolicyValidazioneConf.add(porta.getGestioneToken());
						listPosizioneTokenPolicyValidazione.add(nomeErogazione+
								org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
								"Token Policy Validazione: "+porta.getGestioneToken().getPolicy());
					}
					if(porta.sizeAttributeAuthorityList()>0) {
						for (AttributeAuthority aa : porta.getAttributeAuthorityList()) {
							if(!listAttributeAuthority.contains(aa.getNome())) {
								listAttributeAuthority.add(aa.getNome());
								listPosizioneAttributeAuthority.add(nomeErogazione+
									org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
									"Attribute Authority: "+aa.getNome());
							}
						}
					}
					
					boolean connettoreMultiploEnabled = porta.getBehaviour() != null;
					
					for (PortaApplicativaServizioApplicativo paSA : porta.getServizioApplicativoList()) {
						IDServizioApplicativo idServizioApplicativo = new IDServizioApplicativo();
						idServizioApplicativo.setIdSoggettoProprietario(new IDSoggetto(porta.getTipoSoggettoProprietario(), porta.getNomeSoggettoProprietario()));
						idServizioApplicativo.setNome(paSA.getNome());
						ServizioApplicativo sa = this.saCore.getServizioApplicativo(idServizioApplicativo);
						
						InvocazioneServizio is = sa.getInvocazioneServizio();
						if(is!=null) {
							org.openspcoop2.core.config.Connettore connettore = is.getConnettore();
							if(connettore!=null) {
								TipiConnettore tipo = TipiConnettore.toEnumFromName(connettore.getTipo());
								if( (!findConnettoreHttpConPrefissoHttps && TipiConnettore.HTTP.equals(tipo)) 
										|| 
									TipiConnettore.HTTPS.equals(tipo) ) {
									
									String nomeConnettore = connettore.getNome();
									if(listConnettoriRegistrati.contains(nomeConnettore)) {
										continue;
									}
									
									if(connettoreMultiploEnabled && paSA.getDatiConnettore()!=null &&
										// solo le porte applicative abilitate 
										StatoFunzionalita.DISABILITATO.equals(paSA.getDatiConnettore().getStato())) {
										continue;
									}
									
									String nomeErogazioneConnettore = nomeErogazione;
									if(connettoreMultiploEnabled && paSA.getDatiConnettore()!=null &&
										paSA.getDatiConnettore().getNome()!=null) {
										nomeErogazioneConnettore = nomeErogazioneConnettore + 
												org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
												"Connettore Multiplo: "+paSA.getDatiConnettore().getNome();
									}
									
									String tokenPolicy = ConnettoreUtils.getNegoziazioneTokenPolicyConnettore(connettore);
									if(tokenPolicy!=null && StringUtils.isNotEmpty(tokenPolicy) && !listTokenPolicyNegoziazione.contains(tokenPolicy)) {
										listTokenPolicyNegoziazione.add(tokenPolicy);
										listPosizioneTokenPolicyNegoziazione.add(nomeErogazioneConnettore +
												org.openspcoop2.core.constants.Costanti.WEB_NEW_LINE+
												"Token Policy Negoziazione: "+tokenPolicy);
									}
									
									if( TipiConnettore.HTTP.equals(tipo) ) {
										String endpoint = ConnettoreUtils.getEndpointConnettore(connettore, false);
										if(endpoint!=null) {
											findConnettoreHttpConPrefissoHttps = endpoint.trim().startsWith("https");
										}
									}
									else {
										listConnettoriConfig.add(connettore);
										listConnettoriRegistrati.add(nomeConnettore);
										listPosizioneConnettoriRegistrati.add(nomeErogazioneConnettore);
									}
								}
							}
						}
					}
									
				}
			}
		}
		return findConnettoreHttpConPrefissoHttps;
	}
	
	public void eseguiVerificaCertificati(AccordoServizioParteSpecifica asps, String alias, boolean gestioneFruitori,
			Fruitore fruitore, List<String> aliases, String nomeApiImpl, boolean sicurezzaModi, boolean messageSecurity,
			List<String> listConnettoriRegistrati, List<String> listPosizioneConnettoriRegistrati,
			List<org.openspcoop2.core.registry.Connettore> listConnettoriRegistry,
			List<org.openspcoop2.core.config.Connettore> listConnettoriConfig, List<String> listTokenPolicyValidazione,
			List<GestioneToken> listTokenPolicyValidazioneConf, List<String> listPosizioneTokenPolicyValidazione,
			List<String> listTokenPolicyNegoziazione, List<String> listPosizioneTokenPolicyNegoziazione,
			List<String> listAttributeAuthority, List<String> listPosizioneAttributeAuthority,
			boolean findConnettoreHttpConPrefissoHttps, boolean sceltaClusterId)
			throws Exception {
		if(alias==null && !sceltaClusterId) {
			alias = CostantiControlStation.LABEL_VERIFICA_CONNETTORE_TUTTI_I_NODI;
		}
												
		// -- verifica
		List<String> aliasesForCheck = new ArrayList<>();
		boolean all = false;
		if(aliases.size()==1) {
			aliasesForCheck.add(aliases.get(0));
		}
		else if(CostantiControlStation.LABEL_VERIFICA_CONNETTORE_TUTTI_I_NODI.equals(alias)) {
			aliasesForCheck.addAll(aliases);
			all = true;
		}
		else {
			aliasesForCheck.add(alias);
		}
		
		CertificateChecker certificateChecker = null;
		if(all) {
			certificateChecker = this.apsCore.getJmxPdDCertificateChecker();
		}
		else {
			certificateChecker = this.apsCore.newJmxPdDCertificateChecker(aliasesForCheck);
		}
		StringBuilder sbDetailsError = new StringBuilder(); 
		
		int sogliaWarningGiorni = this.apsCore.getVerificaCertificatiWarningExpirationDays();
		
		String posizioneErrore = null;
		String extraErrore = null;
		
		// verifica modi
		StringBuilder sbDetailsWarningModi = new StringBuilder();
		String posizioneWarningModi = null;
		if(sicurezzaModi) {
			if(gestioneFruitori) {
				org.openspcoop2.core.registry.Connettore connettore = null;
				certificateChecker.checkFruizione(sbDetailsError, sbDetailsWarningModi,
						false, connettore,
						sicurezzaModi, 
						false,
						asps, fruitore,
						sogliaWarningGiorni);
			}
			else {
				org.openspcoop2.core.config.Connettore connettore = null;
				certificateChecker.checkErogazione(sbDetailsError, sbDetailsWarningModi,
						false, connettore,
						sicurezzaModi, 
						false,
						asps,
						sogliaWarningGiorni);
			}
			if(sbDetailsError.length()>0) {
				posizioneErrore = nomeApiImpl;
			}
			else if(sbDetailsWarningModi.length()>0) {
				posizioneWarningModi = nomeApiImpl;
			}
		}
				
		// verifica connettori https
		StringBuilder sbDetailsWarningConnettoriHttps = new StringBuilder(); 
		String posizioneWarningConnettoriHttps = null;
		boolean connettoreSsl = !listConnettoriRegistrati.isEmpty();
		if(sbDetailsError.length()<=0 && connettoreSsl) {
			if(gestioneFruitori) {
				for (int i = 0; i < listConnettoriRegistry.size(); i++) {
					org.openspcoop2.core.registry.Connettore connettore = listConnettoriRegistry.get(i);
					String posizione = listPosizioneConnettoriRegistrati.get(i);
					
					StringBuilder sbDetailsWarningConnettoriHttpsSecured = new StringBuilder(); 
					certificateChecker.checkFruizione(sbDetailsError, sbDetailsWarningConnettoriHttpsSecured,
							connettoreSsl, connettore,
							false, 
							false,
							asps, fruitore,
							sogliaWarningGiorni);
					if(sbDetailsError.length()>0) {
						posizioneErrore = posizione;
						break;
					}
					else if(sbDetailsWarningConnettoriHttps.length()<=0 && sbDetailsWarningConnettoriHttpsSecured.length()>0) {
						posizioneWarningModi = nomeApiImpl;
						sbDetailsWarningConnettoriHttps.append(sbDetailsWarningConnettoriHttpsSecured.toString());
					}
				}
			}
			else {
				for (int i = 0; i < listConnettoriConfig.size(); i++) {
					org.openspcoop2.core.config.Connettore connettore = listConnettoriConfig.get(i); 
					String posizione = listPosizioneConnettoriRegistrati.get(i);
					
					StringBuilder sbDetailsWarningConnettoriHttpsSecured = new StringBuilder(); 
					certificateChecker.checkErogazione(sbDetailsError, sbDetailsWarningConnettoriHttpsSecured,
							connettoreSsl, connettore,
							false, 
							false,
							asps,
							sogliaWarningGiorni);
					if(sbDetailsError.length()>0) {
						posizioneErrore = posizione;
						break;
					}
					else if(sbDetailsWarningConnettoriHttps.length()<=0 && sbDetailsWarningConnettoriHttpsSecured.length()>0) {
						posizioneWarningModi = nomeApiImpl;
						sbDetailsWarningConnettoriHttps.append(sbDetailsWarningConnettoriHttpsSecured.toString()); // tengo solo un warning alla volta, come per gli errori
					}
				}
			}
		}
										
		// verifica token policy validazione
		StringBuilder sbDetailsWarningTokenPolicyValidazione = new StringBuilder(); 
		String posizioneWarningTokenPolicyValidazione = null;
		if(sbDetailsError.length()<=0 && listTokenPolicyValidazione!=null && !listTokenPolicyValidazione.isEmpty()) {
			for (int j = 0; j < listTokenPolicyValidazione.size(); j++) {
				GestioneToken policy = listTokenPolicyValidazioneConf.get(j);
				String posizione = listPosizioneTokenPolicyValidazione.get(j);
				GenericProperties gp = this.confCore.getGenericProperties(policy.getPolicy(), org.openspcoop2.pdd.core.token.Costanti.TIPOLOGIA, false);
				if(gp!=null) {
					PolicyGestioneToken policyToken = TokenUtilities.convertTo(gp, policy);
					boolean httpsDynamicDiscovery = policyToken.isDynamicDiscovery();
					boolean httpsValidazioneJwt = false;
					boolean httpsIntrospection = false;
					boolean httpsUserInfo = false;
					boolean validazioneJwt = false;
					if(!policyToken.isDynamicDiscovery()) {
						httpsValidazioneJwt = policyToken.isValidazioneJWT() && policyToken.isValidazioneJWTLocationHttp();
						httpsIntrospection = policyToken.isIntrospection();
						httpsUserInfo = policyToken.isUserInfo();
						validazioneJwt = policyToken.isValidazioneJWT();
					}
					boolean forwardToJwt = policyToken.isForwardToken();
					
					if(httpsDynamicDiscovery &&
						!policyToken.isEndpointHttps(false, false)) {
						httpsDynamicDiscovery = false;
						
						String endpoint = policyToken.getDynamicDiscoveryEndpoint();
						if(endpoint!=null && StringUtils.isNotEmpty(endpoint) &&
							!findConnettoreHttpConPrefissoHttps) {
							findConnettoreHttpConPrefissoHttps = endpoint.trim().startsWith("https");
						}
					}
					if(httpsValidazioneJwt &&
						!policyToken.isEndpointHttps(false, false)) {
						httpsValidazioneJwt = false;
						
						String endpoint = policyToken.getValidazioneJWTLocation();
						if(endpoint!=null && StringUtils.isNotEmpty(endpoint) &&
							!findConnettoreHttpConPrefissoHttps) {
							findConnettoreHttpConPrefissoHttps = endpoint.trim().startsWith("https");
						}
					}
					if(httpsIntrospection &&
						!policyToken.isEndpointHttps(true,false)) {
						httpsIntrospection = false;
						
						String endpoint = policyToken.getIntrospectionEndpoint();
						if(endpoint!=null && StringUtils.isNotEmpty(endpoint) &&
							!findConnettoreHttpConPrefissoHttps) {
							findConnettoreHttpConPrefissoHttps = endpoint.trim().startsWith("https");
						}
					}
					if(httpsUserInfo &&
						!policyToken.isEndpointHttps(false,true)) {
						httpsUserInfo = false;
						
						String endpoint = policyToken.getUserInfoEndpoint();
						if(endpoint!=null && StringUtils.isNotEmpty(endpoint) &&
							!findConnettoreHttpConPrefissoHttps) {
							findConnettoreHttpConPrefissoHttps = endpoint.trim().startsWith("https");
						}
					}
					
					if(validazioneJwt) {
						try {
							String tokenType = policyToken.getTipoToken();
							KeystoreParams keystoreParams = null;
							if(org.openspcoop2.pdd.core.token.Costanti.POLICY_TOKEN_TYPE_JWS.equals(tokenType) ||
									org.openspcoop2.pdd.core.token.Costanti.POLICY_TOKEN_TYPE_JWE.equals(tokenType)) {
								keystoreParams = TokenUtilities.getValidazioneJwtKeystoreParams(policyToken);
							}
							if(keystoreParams==null) {
								validazioneJwt = false;
							}
						}catch(Exception t) {
							throw new DriverConfigurazioneException(t.getMessage(),t);
						}
					}
					
					if(forwardToJwt) {
						try {
							KeystoreParams keystoreParams = null;
							if(policyToken.isForwardTokenInformazioniRaccolte()) {
								String forwardInformazioniRaccolteMode = policyToken.getForwardTokenInformazioniRaccolteMode();
								if(org.openspcoop2.pdd.core.token.Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_OP2_JWS.equals(forwardInformazioniRaccolteMode) ||
										org.openspcoop2.pdd.core.token.Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JWS.equals(forwardInformazioniRaccolteMode) ||
										org.openspcoop2.pdd.core.token.Costanti.POLICY_TOKEN_FORWARD_INFO_RACCOLTE_MODE_JWE.equals(forwardInformazioniRaccolteMode)) {
									keystoreParams = TokenUtilities.getForwardToJwtKeystoreParams(policyToken);
					    		}
							}
							if(keystoreParams==null) {
								forwardToJwt = false;
							}
						}catch(Exception t) {
							throw new DriverConfigurazioneException(t.getMessage(),t);
						}
					}
					
					if(httpsIntrospection || httpsUserInfo || validazioneJwt || forwardToJwt) {
						StringBuilder sbDetailsWarningTokenPolicyValidazioneSecured = new StringBuilder(); 
						certificateChecker.checkTokenPolicyValidazione(sbDetailsError, sbDetailsWarningTokenPolicyValidazioneSecured, 
								httpsDynamicDiscovery, httpsValidazioneJwt, httpsIntrospection, httpsUserInfo, 
								validazioneJwt, forwardToJwt,
								gp,
								sogliaWarningGiorni);
						if(sbDetailsWarningTokenPolicyValidazione.length()<=0 && sbDetailsWarningTokenPolicyValidazioneSecured.length()>0) {
							posizioneWarningTokenPolicyValidazione = posizione;
							sbDetailsWarningTokenPolicyValidazione.append(sbDetailsWarningTokenPolicyValidazioneSecured.toString()); // tengo solo un warning alla volta, come per gli errori
						}
					}
				}
				if(sbDetailsError.length()>0) {
					posizioneErrore = posizione;
					break;
				}
			}
		}
		
		// verifica token policy negoziazione
		StringBuilder sbDetailsWarningTokenPolicyNegoziazione = new StringBuilder(); 
		String posizioneWarningTokenPolicyNegoziazione = null;
		if(sbDetailsError.length()<=0 && listTokenPolicyNegoziazione!=null && !listTokenPolicyNegoziazione.isEmpty()) {
			for (int j = 0; j < listTokenPolicyNegoziazione.size(); j++) {
				String policy = listTokenPolicyNegoziazione.get(j);
				String posizione = listPosizioneTokenPolicyNegoziazione.get(j);
				GenericProperties gp = this.confCore.getGenericProperties(policy, org.openspcoop2.pdd.core.token.Costanti.TIPOLOGIA_RETRIEVE, false);
				if(gp!=null) {
					PolicyNegoziazioneToken policyNegoziazione = TokenUtilities.convertTo(gp);
					
					boolean https = false;
					String endpoint = policyNegoziazione.getEndpoint();
					if(StringUtils.isNotEmpty(endpoint)) {
						if(policyNegoziazione.isEndpointHttps()) {
							https = true;
						}
						else if(endpoint!=null && !findConnettoreHttpConPrefissoHttps) {
							findConnettoreHttpConPrefissoHttps = endpoint.trim().startsWith("https");
						}
					}
														
					boolean signedJwt = false;
					KeystoreParams keystoreParams = null;
					try {
						if(policyNegoziazione.isRfc7523x509Grant()) {
							// JWS Compact   			
							keystoreParams = TokenUtilities.getSignedJwtKeystoreParams(policyNegoziazione);
						}
					}catch(Exception t) {
						throw new DriverConfigurazioneException(t.getMessage(),t);
					}
					
					boolean riferimentoApplicativoModi = keystoreParams!=null && org.openspcoop2.pdd.core.token.Costanti.KEYSTORE_TYPE_APPLICATIVO_MODI_VALUE.equalsIgnoreCase(keystoreParams.getPath());
					boolean riferimentoFruizioneModi = keystoreParams!=null && org.openspcoop2.pdd.core.token.Costanti.KEYSTORE_TYPE_FRUIZIONE_MODI_VALUE.equalsIgnoreCase(keystoreParams.getPath());
					if(keystoreParams!=null &&
							!riferimentoApplicativoModi &&
							!riferimentoFruizioneModi) {
						signedJwt = true;
					}
					
					if(https || signedJwt) {
						StringBuilder sbDetailsWarningTokenPolicyNegoziazioneSecured = new StringBuilder(); 
						certificateChecker.checkTokenPolicyNegoziazione(sbDetailsError, sbDetailsWarningTokenPolicyNegoziazioneSecured,
							https, signedJwt,
							gp,
							sogliaWarningGiorni);
						if(sbDetailsWarningTokenPolicyNegoziazione.length()<=0 && sbDetailsWarningTokenPolicyNegoziazioneSecured.length()>0) {
							posizioneWarningTokenPolicyNegoziazione = posizione;
							sbDetailsWarningTokenPolicyNegoziazione.append(sbDetailsWarningTokenPolicyNegoziazioneSecured.toString()); // tengo solo un warning alla volta, come per gli errori
						}
					}
				}
				if(sbDetailsError.length()>0) {
					posizioneErrore = posizione;
					break;
				}
			}
		}
		
		// attribute authority
		StringBuilder sbDetailsWarningAttributeAuthority = new StringBuilder(); 
		String posizioneWarningAttributeAuthority = null;
		if(sbDetailsError.length()<=0 && listAttributeAuthority!=null && !listAttributeAuthority.isEmpty()) {
			for (int j = 0; j < listAttributeAuthority.size(); j++) {
				String aa = listAttributeAuthority.get(j);
				String posizione = listPosizioneAttributeAuthority.get(j);
				GenericProperties gp = this.confCore.getGenericProperties(aa, org.openspcoop2.pdd.core.token.Costanti.ATTRIBUTE_AUTHORITY, false);
				if(gp!=null) {
					PolicyAttributeAuthority policyAA = AttributeAuthorityUtilities.convertTo(gp);
					
					boolean https = false;
					String endpoint = policyAA.getEndpoint();
					if(StringUtils.isNotEmpty(endpoint)) {
						if(policyAA.isEndpointHttps()) {
							https = true;
						}
						else if(endpoint!=null && !findConnettoreHttpConPrefissoHttps) {
							findConnettoreHttpConPrefissoHttps = endpoint.trim().startsWith("https");
						}
					}
														
					boolean jwtRichiesta = false;
					try {
						KeystoreParams keystoreParams = null;
						if(policyAA.isRequestJws()) {
							// JWS Compact   			
							keystoreParams = AttributeAuthorityUtilities.getRequestJwsKeystoreParams(policyAA);
						}
						if(keystoreParams!=null) {
							jwtRichiesta = true;
						}
					}catch(Exception t) {
						throw new DriverConfigurazioneException(t.getMessage(),t);
					}
					
					boolean jwtRisposta = false;
					try {
						KeystoreParams truststoreParams = null;
						if(policyAA.isResponseJws()) {
							// JWS Compact   			
							truststoreParams = AttributeAuthorityUtilities.getResponseJwsKeystoreParams(policyAA);
						}
						if(truststoreParams!=null) {
							jwtRisposta = true;
						}
					}catch(Exception t) {
						throw new DriverConfigurazioneException(t.getMessage(),t);
					}
					
					if(https || jwtRichiesta || jwtRisposta) {
						StringBuilder sbDetailsWarningAttributeAuthorityDebug = new StringBuilder(); 
						certificateChecker.checkAttributeAuthority(sbDetailsError, sbDetailsWarningAttributeAuthorityDebug,
							https, jwtRichiesta, jwtRisposta,
							gp,
							sogliaWarningGiorni);
						if(sbDetailsWarningAttributeAuthority.length()<=0 && sbDetailsWarningAttributeAuthorityDebug.length()>0) {
							posizioneWarningAttributeAuthority = posizione;
							sbDetailsWarningAttributeAuthority.append(sbDetailsWarningAttributeAuthorityDebug.toString()); // tengo solo un warning alla volta, come per gli errori
						}
					}
				}
				if(sbDetailsError.length()>0) {
					posizioneErrore = posizione;
					break;
				}
			}
		}
				
		// verifica certificati jvm
		StringBuilder sbDetailsWarningCertificatiJvm = new StringBuilder(); 
		String posizioneWarningCertificatiJvm = null;
		String extraWarningCertificatiJvm = null;
		if(sbDetailsError.length()<=0 && findConnettoreHttpConPrefissoHttps) {
			certificateChecker.checkConfigurazioneJvm(sbDetailsError, sbDetailsWarningCertificatiJvm, sogliaWarningGiorni);
			if(sbDetailsError.length()>0) {
				posizioneErrore = nomeApiImpl;
				extraErrore = "Configurazione https nella JVM";
			}
			else if(sbDetailsWarningCertificatiJvm.length()>0) {
				posizioneWarningCertificatiJvm = nomeApiImpl;
				extraWarningCertificatiJvm = "Configurazione https nella JVM";
			}
		}
		
		// lasciare in ultima posizione poichè non viene generato un id univoco per poi formattare l'output
		// verifica message security
		StringBuilder sbDetailsWarningMessageSecurity = new StringBuilder();
		String posizioneWarningMessageSecurity = null;
		if(sbDetailsError.length()<=0 && messageSecurity) {
			if(gestioneFruitori) {
				org.openspcoop2.core.registry.Connettore connettore = null;
				certificateChecker.checkFruizione(sbDetailsError, sbDetailsWarningMessageSecurity,
						false, connettore,
						false,
						messageSecurity,
						asps, fruitore,
						sogliaWarningGiorni);
			}
			else {
				org.openspcoop2.core.config.Connettore connettore = null;
				certificateChecker.checkErogazione(sbDetailsError, sbDetailsWarningMessageSecurity,
						false, connettore,
						false,
						messageSecurity,
						asps,
						sogliaWarningGiorni);
			}
			if(sbDetailsError.length()>0) {
				posizioneErrore = nomeApiImpl;
			}
			else if(sbDetailsWarningMessageSecurity.length()>0) {
				posizioneWarningMessageSecurity = nomeApiImpl;
			}
		}
		
		// analisi warning
		String warning = null;
		String posizioneWarning = null;
		String extraWarning = null;
		if(sbDetailsError.length()<=0) {
			if(sbDetailsWarningModi.length()>0) {
				warning = sbDetailsWarningModi.toString();
				posizioneWarning = posizioneWarningModi;
			}
			else if(sbDetailsWarningConnettoriHttps.length()>0) {
				warning = sbDetailsWarningConnettoriHttps.toString();
				posizioneWarning = posizioneWarningConnettoriHttps;
			}
			else if(sbDetailsWarningTokenPolicyValidazione.length()>0) {
				warning = sbDetailsWarningTokenPolicyValidazione.toString();
				posizioneWarning = posizioneWarningTokenPolicyValidazione;
			}
			else if(sbDetailsWarningTokenPolicyNegoziazione.length()>0) {
				warning = sbDetailsWarningTokenPolicyNegoziazione.toString();
				posizioneWarning = posizioneWarningTokenPolicyNegoziazione;
			}
			else if(sbDetailsWarningAttributeAuthority.length()>0) {
				warning = sbDetailsWarningAttributeAuthority.toString();
				posizioneWarning = posizioneWarningAttributeAuthority;
			}
			else if(sbDetailsWarningCertificatiJvm.length()>0) {
				warning = sbDetailsWarningCertificatiJvm.toString();
				posizioneWarning = posizioneWarningCertificatiJvm;
				extraWarning = extraWarningCertificatiJvm;
			}
			else if(sbDetailsWarningMessageSecurity.length()>0) {
				warning = sbDetailsWarningMessageSecurity.toString();
				posizioneWarning = posizioneWarningMessageSecurity;
			}
		}
									
		// esito
		List<String> formatIds = new ArrayList<>();
		formatIds.add(RegistroServiziReader.ID_CONFIGURAZIONE_CONNETTORE_HTTPS);
		formatIds.add(RegistroServiziReader.ID_CONFIGURAZIONE_FIRMA_MODI);
		formatIds.add(ConfigurazionePdDReader.ID_CONFIGURAZIONE_TOKEN_VALIDAZIONE_JWT);
		formatIds.add(ConfigurazionePdDReader.ID_CONFIGURAZIONE_TOKEN_VALIDAZIONE_FORWARD_TO_JWT);
		formatIds.add(ConfigurazionePdDReader.ID_CONFIGURAZIONE_TOKEN_NEGOZIAZIONE_SIGNED_JWT);
		formatIds.add(ConfigurazionePdDReader.ID_CONFIGURAZIONE_ATTRIBUTE_AUTHORITY_JWT_RICHIESTA);
		formatIds.add(ConfigurazionePdDReader.ID_CONFIGURAZIONE_ATTRIBUTE_AUTHORITY_JWT_RISPOSTA);
		//formatIds.add(ConfigurazionePdDReader.ID_CONFIGURAZIONE_RICHIESTA_MESSAGE_SECURITY); // lasciare in ultima posizione poichè non viene generato un id univoco
		this.apsCore.formatVerificaCertificatiEsito(this.pd, formatIds, 
				(sbDetailsError.length()>0 ? sbDetailsError.toString() : null), extraErrore, posizioneErrore,
				warning, extraWarning, posizioneWarning,
				false);
	}
	
	public boolean eseguiVerificaCertificati(boolean soloModI,
			AccordoServizioParteSpecifica asps, IDSoggetto idSoggettoFruitore, String alias, boolean gestioneFruitori,
			boolean gestioneErogatori, Fruitore fruitore, IDServizio idServizio, String tipoProtocollo,
			List<DataElement> dati) throws Exception {
		
		// Prendo la lista di aliases
		List<String> aliases = this.apsCore.getJmxPdDAliases();
		if(aliases==null || aliases.isEmpty()){
			throw new CoreException("Pagina non prevista, la sezione configurazione non permette di accedere a questa pagina, se la configurazione non e' corretta");
		}
		
		// -- raccolgo dati
		String nomeApiImpl = this.getLabelServizio(idSoggettoFruitore, gestioneFruitori, idServizio, tipoProtocollo);
		
		IDServizio idAps = IDServizioFactory.getInstance().getIDServizioFromAccordo(asps);
		IDSoggetto idFruitore = null;
		if(gestioneFruitori) {
			idFruitore = new IDSoggetto(fruitore.getTipo(), fruitore.getNome());
		}
		
		boolean modi = this.apsCore.isProfiloModIPA(tipoProtocollo);
		boolean sicurezzaModi = false;
		if(modi) {
			idAps.setPortType(asps.getPortType());
			idAps.setUriAccordoServizioParteComune(asps.getAccordoServizioParteComune());
			IProtocolFactory<?> protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(tipoProtocollo);
			IConsoleDynamicConfiguration consoleDynamicConfiguration = protocolFactory.createDynamicConfigurationConsole();
			IRegistryReader registryReader = this.apsCore.getRegistryReader(protocolFactory); 
			IConfigIntegrationReader configRegistryReader = this.apsCore.getConfigIntegrationReader(protocolFactory);
			ConsoleConfiguration consoleConfiguration = null;
			if(!gestioneFruitori) {
				consoleConfiguration = consoleDynamicConfiguration.getDynamicConfigAccordoServizioParteSpecifica(ConsoleOperationType.CHANGE, this, 
						registryReader, configRegistryReader, idAps );
			}
			else {
				IDFruizione idFruizioneObject = new IDFruizione();
				idFruizioneObject.setIdServizio(idAps);
				idFruizioneObject.setIdFruitore(idFruitore);
				consoleConfiguration = consoleDynamicConfiguration.getDynamicConfigFruizioneAccordoServizioParteSpecifica(ConsoleOperationType.CHANGE, this,  
						registryReader, configRegistryReader, idFruizioneObject);
			}
			if(consoleConfiguration!=null && consoleConfiguration.getConsoleItem()!=null && !consoleConfiguration.getConsoleItem().isEmpty()) {
				sicurezzaModi = true;
			}
			if(sicurezzaModi) {
				boolean includeRemoteStore = false;
				boolean checkModeFruizioneKeystoreId = gestioneFruitori;
				if(gestioneFruitori && fruitore.sizeProtocolPropertyList()>0) {
					sicurezzaModi = ModIUtils.existsStoreConfig(fruitore.getProtocolPropertyList(), includeRemoteStore, checkModeFruizioneKeystoreId);
				}
				else if(gestioneErogatori && asps.sizeProtocolPropertyList()>0) {
					sicurezzaModi = ModIUtils.existsStoreConfig(asps.getProtocolPropertyList(), includeRemoteStore, checkModeFruizioneKeystoreId);
				}
			}
		}
		
		boolean messageSecurity = false;
		if(gestioneFruitori) {
			List<MappingFruizionePortaDelegata> list = this.apsCore.serviziFruitoriMappingList(idFruitore,idServizio, new Search(true)); 
			if(list!=null && !list.isEmpty()) {
				for (MappingFruizionePortaDelegata mappingFruizionePortaDelegata : list) {
					PortaDelegata pd = this.porteDelegateCore.getPortaDelegata(mappingFruizionePortaDelegata.getIdPortaDelegata());
					List<KeystoreParams> listKeystoreParams = SecurityUtils.readRequestKeystoreParams(pd);
					if(listKeystoreParams!=null && !listKeystoreParams.isEmpty()) {
						messageSecurity = true;
						break;
					}
					listKeystoreParams = SecurityUtils.readResponseKeystoreParams(pd);
					if(listKeystoreParams!=null && !listKeystoreParams.isEmpty()) {
						messageSecurity = true;
						break;
					}
				}
			}
		}
		else {
			List<MappingErogazionePortaApplicativa> list = this.apsCore.mappingServiziPorteAppList(idServizio, new Search(true)); 
			if(list!=null && !list.isEmpty()) {
				for (MappingErogazionePortaApplicativa mappingErogazionePortaApplicativa : list) {
					PortaApplicativa pa = this.porteApplicativeCore.getPortaApplicativa(mappingErogazionePortaApplicativa.getIdPortaApplicativa());
					List<KeystoreParams> listKeystoreParams = SecurityUtils.readRequestKeystoreParams(pa);
					if(listKeystoreParams!=null && !listKeystoreParams.isEmpty()) {
						messageSecurity = true;
						break;
					}
					listKeystoreParams = SecurityUtils.readResponseKeystoreParams(pa);
					if(listKeystoreParams!=null && !listKeystoreParams.isEmpty()) {
						messageSecurity = true;
						break;
					}
				}
			}
		}
		
		List<String> listConnettoriRegistrati = new ArrayList<>();
		List<String> listPosizioneConnettoriRegistrati = new ArrayList<>();
		List<org.openspcoop2.core.registry.Connettore> listConnettoriRegistry = new ArrayList<>();
		List<org.openspcoop2.core.config.Connettore> listConnettoriConfig = new ArrayList<>();
		
		List<String> listTokenPolicyValidazione = new ArrayList<>();
		List<GestioneToken> listTokenPolicyValidazioneConf = new ArrayList<>();
		List<String> listPosizioneTokenPolicyValidazione = new ArrayList<>();
		
		List<String> listTokenPolicyNegoziazione = new ArrayList<>();
		List<String> listPosizioneTokenPolicyNegoziazione = new ArrayList<>();
		
		List<String> listAttributeAuthority = new ArrayList<>();
		List<String> listPosizioneAttributeAuthority = new ArrayList<>();
		
		boolean findConnettoreHttpConPrefissoHttps = this.estraiElencoInvocazioni(soloModI, asps, idSoggettoFruitore, gestioneFruitori, fruitore, idServizio, tipoProtocollo,
				nomeApiImpl, listConnettoriRegistrati, listPosizioneConnettoriRegistrati, listConnettoriRegistry,
				listConnettoriConfig, listTokenPolicyValidazione, listTokenPolicyValidazioneConf,
				listPosizioneTokenPolicyValidazione, listTokenPolicyNegoziazione,
				listPosizioneTokenPolicyNegoziazione, listAttributeAuthority, listPosizioneAttributeAuthority);
		
		
		boolean verificaCertificatiEffettuata = false;
		
		if(listConnettoriRegistrati.isEmpty() && 
				listTokenPolicyValidazione.isEmpty() &&
				listTokenPolicyNegoziazione.isEmpty() &&
				listAttributeAuthority.isEmpty() &&
				!findConnettoreHttpConPrefissoHttps &&
				!sicurezzaModi&&
				!messageSecurity) {
			this.pd.setMessage(CostantiControlStation.LABEL_VERIFICA_CERTIFICATI_NON_PRESENTI,
					Costanti.MESSAGE_TYPE_INFO);
			
			this.pd.disableEditMode();
			
			verificaCertificatiEffettuata = true;
		}
		else {
			
			boolean sceltaClusterId = this.apsCore.isVerificaCertificatiSceltaClusterId();
			
			if(aliases.size()==1 || alias!=null || !sceltaClusterId) {
				
				this.eseguiVerificaCertificati(asps, alias, gestioneFruitori, fruitore, aliases,
						nomeApiImpl, sicurezzaModi, messageSecurity, listConnettoriRegistrati, listPosizioneConnettoriRegistrati,
						listConnettoriRegistry, listConnettoriConfig, listTokenPolicyValidazione,
						listTokenPolicyValidazioneConf, listPosizioneTokenPolicyValidazione,
						listTokenPolicyNegoziazione, listPosizioneTokenPolicyNegoziazione, listAttributeAuthority,
						listPosizioneAttributeAuthority, findConnettoreHttpConPrefissoHttps, sceltaClusterId);

				this.pd.disableEditMode();
				
				verificaCertificatiEffettuata = true;
				
			} else {
				
				DataElement deTestConnettivita = new DataElement();
				deTestConnettivita.setType(DataElementType.TITLE);
				deTestConnettivita.setLabel(ErogazioniCostanti.LABEL_ASPS_VERIFICA_CERTIFICATI);
				dati.add(deTestConnettivita);
				
				this.addVerificaCertificatoSceltaAlias(aliases, dati);	
			}
			
		}
		return verificaCertificatiEffettuata;
	}

}