ApiHelper.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.apc.api;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

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.Filtri;
import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.core.commons.SearchUtils;
import org.openspcoop2.core.config.CanaleConfigurazione;
import org.openspcoop2.core.config.CanaliConfigurazione;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.GruppiAccordo;
import org.openspcoop2.core.registry.GruppoAccordo;
import org.openspcoop2.core.registry.PortType;
import org.openspcoop2.core.registry.beans.AccordoServizioParteComuneSintetico;
import org.openspcoop2.core.registry.beans.GruppoSintetico;
import org.openspcoop2.core.registry.driver.BeanUtilities;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.manifest.constants.InterfaceType;
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.web.ctrlstat.core.ConsoleSearch;
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.servlet.apc.AccordiServizioParteComuneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneHelper;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneUtilities;
import org.openspcoop2.web.ctrlstat.servlet.archivi.ArchiviCostanti;
import org.openspcoop2.web.ctrlstat.servlet.archivi.ExporterUtils;
import org.openspcoop2.web.ctrlstat.servlet.protocol_properties.ProtocolPropertiesCostanti;
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;

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

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


	public void prepareApiList(List<AccordoServizioParteComuneSintetico> lista, ISearch ricerca, String tipoAccordo) throws DriverControlStationException {
		try {

			if(lista==null) {
				throw new DriverControlStationException("Param lista is null");
			}
			
			ServletUtils.addListElementIntoSession(this.request, this.session, ApiCostanti.OBJECT_NAME_APC_API,
					new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO, tipoAccordo));
			
			ServletUtils.setObjectIntoSession(this.request, this.session, Boolean.valueOf(true), ApiCostanti.SESSION_ATTRIBUTE_VISTA_APC_API);
			
			this.pd.setCustomListViewName(ApiCostanti.APC_API_NOME_VISTA_CUSTOM_LISTA_API);
			
			boolean showProtocolli = this.core.countProtocolli(this.request, this.session)>1;
			boolean showServiceBinding = true;
			boolean showResources = true;
			boolean showServices = 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) {
						showResources=false;
					}
					if(p.getManifest().getBinding().getSoap()==null) {
						showServices=false;
					}
					if( (!showResources) || (!showServices) ) {
						showServiceBinding = false;
					}
				}
			}
			
			int idLista = Liste.ACCORDI;
			int limit = ricerca.getPageSize(idLista);
			int offset = ricerca.getIndexIniziale(idLista);
			String search = (org.openspcoop2.core.constants.Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : ricerca.getSearchString(idLista));
			
			String filterProtocol = addFilterProtocol(ricerca, idLista, true);
			
			String protocolloS = filterProtocol;
			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);
				}
			}
			// 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( (filterProtocol!=null && profiloModipaSelezionatoOpzioniAccettate.contains(filterProtocol))
						||
					(filterProtocol==null && protocolloS!=null && profiloModipaSelezionatoOpzioniAccettate.contains(protocolloS))
					) {
					profiloModipaSelezionato = true;
				}
			}
						
			String filterTipoAccordo = null;
			if(showServiceBinding) {
				filterTipoAccordo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_SERVICE_BINDING);
				boolean postBackServiceBinding = profiloModipaSelezionato; // serve per pilotare la label sulla sicurezza messaggio
				this.addFilterServiceBinding(filterTipoAccordo,postBackServiceBinding,false);
			}
			
			String filterGruppo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_GRUPPO);
			addFilterGruppo(filterProtocol, filterGruppo, 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);
			}
				
			
			// **** 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 digest richiesta
				this.addFilterModIDigestRichiesta(ricerca, idLista);
				
				// filtro ifo utente
				this.addFilterModIInfoUtente(ricerca, idLista);
				
				// imposto apertura sezione
				this.impostaAperturaSubtitle(CostantiControlStation.NAME_SUBTITLE_FILTRI_MODIPA);
			}
			
			// **** fine filtro modi ****
			
									
			this.pd.setIndex(offset);
			this.pd.setPageSize(limit);
			this.pd.setNumEntries(ricerca.getNumEntries(idLista));

			String termine = AccordiServizioParteComuneUtilities.getTerminologiaAccordoServizio(tipoAccordo);
			
			// setto la barra del titolo
			this.pd.setSearchLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_NOME);
			if (search.equals("")) {
				this.pd.setSearchDescription("");
				ServletUtils.setPageDataTitle(this.pd, 
						new Parameter(termine, AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_LIST));
			}
			else{
				ServletUtils.setPageDataTitle(this.pd,
						new Parameter(termine, AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_LIST),
						new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_RISULTATI_RICERCA, null));
			}

			// controllo eventuali risultati ricerca
			if (!search.equals("")) {
				ServletUtils.enabledPageDataSearch(this.pd, termine, search);
			}
			
			List<String> labelLst = new ArrayList<>();
			labelLst.add("");//AccordiServizioParteComuneCostanti.LABEL_APC_STATO); // colonna stato
			labelLst.add(termine); 
			
			String [] labels = labelLst.toArray(new String[labelLst.size()]);
			this.pd.setLabels(labels);

			// preparo i dati
			List<List<DataElement>> dati = 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 = null;
			if(gestioneCanaliEnabled) {
				canaleConfigurazioneDefault = getCanaleDefault(canaleList);
			}

			for (int i = 0; i < lista.size(); i++) {
				List<DataElement> e = new ArrayList<>();
				AccordoServizioParteComuneSintetico accordoServizio = lista.get(i);
				
				Parameter pIdAccordo = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ID, accordoServizio.getId()+"");
				Parameter pNomeAccordo = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_NOME, accordoServizio.getNome());
				Parameter pTipoAccordo = AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo);
				
				ServiceBinding serviceBinding = this.apcCore.toMessageServiceBinding(accordoServizio.getServiceBinding());
				
				String protocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(accordoServizio.getSoggettoReferente().getTipo());
				
				// SCHEMA Assegnazione dati -> DataElement:
				// Data Element 1. colonna 1, riga superiore: Titolo Api
				// Data Element 2. colonna 1, riga inferiore: Metadati Api
				
				// Titolo API
				DataElement de = new DataElement();
				de.setType(DataElementType.TITLE);
				de.setUrl(ApiCostanti.SERVLET_NAME_APC_API_CHANGE, pIdAccordo, pNomeAccordo , pTipoAccordo);
				IDAccordo idAccordo = this.idAccordoFactory.getIDAccordoFromAccordo(accordoServizio);
				String labelAccordo = getLabelIdAccordo(protocollo, idAccordo);
				de.setValue(labelAccordo);
				de.setIdToRemove("" + accordoServizio.getId());
				e.add(de);
				
				// Metadati Servizio 
				de = new DataElement();
				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;
				}
				InterfaceType interfaceType = this.apcCore.formatoSpecifica2InterfaceType(accordoServizio.getFormatoSpecifica());
				labelServiceBinding = labelServiceBinding + " " + this.getLabelWSDLFromFormatoSpecifica(interfaceType);
				
				if(gestioneCanaliEnabled) {
					String labelCanale = accordoServizio.getCanale();
					if(labelCanale == null) { // default
						labelCanale =  canaleConfigurazioneDefault.getNome();
					}
					
					if(showProtocolli) {
						String labelProtocollo =this.getLabelProtocollo(protocollo); 
						de.setValue(MessageFormat.format(ApiCostanti.MESSAGE_METADATI_APC_API_CON_CANALE_CON_PROFILO, labelServiceBinding, labelCanale, labelProtocollo));
					} else {
						de.setValue(MessageFormat.format(ApiCostanti.MESSAGE_METADATI_APC_API_LIST_CON_CANALE, labelServiceBinding, labelCanale));
					}
				} else {
					if(showProtocolli) {
						String labelProtocollo =this.getLabelProtocollo(protocollo); 
						de.setValue(MessageFormat.format(ApiCostanti.MESSAGE_METADATI_APC_API_CON_PROFILO, labelServiceBinding, labelProtocollo));
					} else {
						de.setValue(MessageFormat.format(ApiCostanti.MESSAGE_METADATI_APC_API_LIST, labelServiceBinding));
					}
				}
				
				de.setType(DataElementType.SUBTITLE);
				e.add(de);
				
				de = new DataElement();
				de.setName(ApiCostanti.APC_API_PARAMETRO_STATO_SERVIZI);
				de.setType(DataElementType.CHECKBOX);
				
				// controllo stato dell'API
				ConsoleSearch searchForCount = new ConsoleSearch(true);
				switch (serviceBinding) {
				case REST:
					// caso REST: l'API e' abilitata se ha almeno una risorsa
					
					this.apcCore.accordiResourceList(accordoServizio.getId().intValue(), searchForCount);
					int numRisorse = searchForCount.getNumEntries(Liste.ACCORDI_API_RESOURCES);
					
					if(numRisorse > 0) {
						de.setStatusType(CheckboxStatusType.ABILITATO);
						de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_RISORSE_TUTTE_ABILITATE_TOOLTIP);
					} else {
						de.setStatusType(CheckboxStatusType.DISABILITATO);
						de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_RISORSE_TUTTE_DISABILITATE_TOOLTIP);
					}
					break;
				case SOAP:
				default:
					List<PortType> accordiPorttypeList = this.apcCore.accordiPorttypeList(accordoServizio.getId().intValue(), searchForCount);
					int numeroTotaleServizi = accordiPorttypeList.size();
					int numeroServiziAbilitati = 0;
					
					for (PortType portType : accordiPorttypeList) {
						if(portType.sizeAzioneList()>0) {
							numeroServiziAbilitati ++;
						}	
					}
					
					if(numeroTotaleServizi == 0) {
						de.setStatusType(CheckboxStatusType.DISABILITATO);
						de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZI_TUTTI_DISABILITATI_TOOLTIP);
					}
					else if(numeroServiziAbilitati==0) {
						de.setStatusType(CheckboxStatusType.DISABILITATO);
						if(numeroTotaleServizi==1) {
							de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZIO_PARZIALMENTE_CONFIGURATO_DISABILITATI_TOOLTIP);
						}
						else {
							de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZI_TUTTI_SENZA_AZIONE_TOOLTIP);
						}
					}
					else if(numeroServiziAbilitati == numeroTotaleServizi) {
						de.setStatusType(CheckboxStatusType.ABILITATO);
						de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZI_TUTTI_ABILITATI_TOOLTIP);
					} 
					else {
						de.setStatusType(CheckboxStatusType.WARNING_ONLY);
						de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZI_PARZIALMENTE_ABILITATI_TOOLTIP);
					}
					break;
				}
				
				de.setWidthPx(16); 
				e.add(de);
				
				// tags
				List<GruppoSintetico> gruppo = accordoServizio.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);
					}
				}
								
				// In Uso Button
				this.addInUsoButton(e, labelAccordo, accordoServizio.getId()+"", InUsoType.ACCORDO_SERVIZIO_PARTE_COMUNE);
				
				// 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.add(pIdAccordo);
					listaParametriChange.add(pNomeAccordo);
					listaParametriChange.add(pTipoAccordo);
					
					this.addComandoResetCacheButton(e, labelAccordo, ApiCostanti.SERVLET_NAME_APC_API_CHANGE, listaParametriChange);
				}

				// Proprieta Button
				if(this.existsProprietaOggetto(accordoServizio.getProprietaOggetto(), accordoServizio.getDescrizione())) {
					this.addProprietaOggettoButton(e, labelAccordo, accordoServizio.getId()+"", InUsoType.ACCORDO_SERVIZIO_PARTE_COMUNE);
				}
				
				// 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);
				boolean exists = false;
				if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE.equals(tipoAccordo)){
					exists = exporterUtils.existsAtLeastOneExportMode(ArchiveType.ACCORDO_SERVIZIO_PARTE_COMUNE, this.request, this.session);
				}
				else{
					exists = exporterUtils.existsAtLeastOneExportMode(ArchiveType.ACCORDO_SERVIZIO_COMPOSTO, this.request, this.session);
				}
				if(exists){

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

					AreaBottoni ab = new AreaBottoni();
					List<DataElement> otherbott = new ArrayList<>();
					DataElement de = new DataElement();
					de.setValue(AccordiServizioParteComuneCostanti.LABEL_APC_ESPORTA_SELEZIONATI);
					if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE.equals(tipoAccordo)){
						de.setOnClick(AccordiServizioParteComuneCostanti.LABEL_APC_ESPORTA_SELEZIONATI_ONCLICK);
					}
					else{
						de.setOnClick(AccordiServizioParteComuneCostanti.LABEL_ASC_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 void prepareApiChange(TipoOperazione tipoOp, AccordoServizioParteComune as) throws DriverControlStationException, DriverRegistroServiziException, ProtocolException, DriverConfigurazioneException, DriverConfigurazioneNotFound {
		
		String tipoAccordo = this.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO);
		Parameter pTipoAccordo = AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo);
		
		IDAccordo idAccordoOLD = this.idAccordoFactory.getIDAccordoFromValues(as.getNome(),BeanUtilities.getSoggettoReferenteID(as.getSoggettoReferente()),as.getVersione());
		String tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(as.getSoggettoReferente().getTipo());
		String labelASTitle = this.getLabelIdAccordo(tipoProtocollo, idAccordoOLD);
		
		ServletUtils.setObjectIntoSession(this.request, this.session, Boolean.valueOf(true), ApiCostanti.SESSION_ATTRIBUTE_VISTA_APC_API);
		
		// setto la barra del titolo
		List<Parameter> lstParm = new ArrayList<>();
		String termine = AccordiServizioParteComuneUtilities.getTerminologiaAccordoServizio(tipoAccordo);
		lstParm.add(new Parameter(termine, ApiCostanti.SERVLET_NAME_APC_API_LIST,pTipoAccordo));
		lstParm.add(new Parameter(labelASTitle, null));

		// setto la barra del titolo
		ServletUtils.setPageDataTitle(this.pd, lstParm);
		
		// Preparo il menu
		this.makeMenu();
		
		List<List<DataElement>> datiPagina = new ArrayList<>();
		List<DataElement> dati = new ArrayList<>();
		datiPagina.add(dati);
		dati.add(ServletUtils.getDataElementForEditModeFinished());
		
		ServiceBinding serviceBinding = this.apcCore.toMessageServiceBinding(as.getServiceBinding());
		
		datiPagina = this.addApiToDati(datiPagina, tipoOp, as, tipoAccordo, tipoProtocollo, serviceBinding);
		
		this.pd.setDati(datiPagina);
		this.pd.disableEditMode();
	}
	
	public ActionForward prepareApiResetCache(ActionMapping mapping, GeneralData gd, 
			TipoOperazione tipoOp, AccordoServizioParteComune as) throws Exception{
		
		String tipoAccordo = this.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO);
		Parameter pTipoAccordo = AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo);
		
		IDAccordo idAccordoOLD = this.idAccordoFactory.getIDAccordoFromValues(as.getNome(),BeanUtilities.getSoggettoReferenteID(as.getSoggettoReferente()),as.getVersione());
		String tipoProtocollo = this.soggettiCore.getProtocolloAssociatoTipoSoggetto(as.getSoggettoReferente().getTipo());
		String labelASTitle = this.getLabelIdAccordo(tipoProtocollo, idAccordoOLD);
		
		ServletUtils.setObjectIntoSession(this.request, this.session, Boolean.valueOf(true), ApiCostanti.SESSION_ATTRIBUTE_VISTA_APC_API);
		
		String userLogin = ServletUtils.getUserLoginFromSession(this.session);	
		
		// setto la barra del titolo
		List<Parameter> lstParm = new ArrayList<>();
		String termine = AccordiServizioParteComuneUtilities.getTerminologiaAccordoServizio(tipoAccordo);
		lstParm.add(new Parameter(termine, ApiCostanti.SERVLET_NAME_APC_API_LIST,pTipoAccordo));
		lstParm.add(new Parameter(labelASTitle, null));

		// setto la barra del titolo
		ServletUtils.setPageDataTitle(this.pd, lstParm);
		
		// Preparo il menu
		this.makeMenu();
		
		// Uso lo stessoAlias
		List<String> aliases = this.apcCore.getJmxPdDAliases();
		String alias = null;
		if(aliases!=null && !aliases.isEmpty()) {
			alias = aliases.get(0);
		}
		this.apcCore.invokeJmxMethodAllNodesAndSetResult(this.pd, this.apcCore.getJmxPdDConfigurazioneSistemaNomeRisorsaConfigurazionePdD(alias), 
				this.apcCore.getJmxPdDConfigurazioneSistemaNomeMetodoRipulisciRiferimentiCacheApi(alias),
				MessageFormat.format(CostantiControlStation.LABEL_ELIMINATO_CACHE_SUCCESSO,labelASTitle),
				MessageFormat.format(CostantiControlStation.LABEL_ELIMINATO_CACHE_FALLITO_PREFIX,labelASTitle),
				as.getId());
		
		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) {
			// preparo lista
			ConsoleSearch ricerca = (ConsoleSearch) ServletUtils.getSearchObjectFromSession(this.request, this.session, ConsoleSearch.class);
			
			int idLista = Liste.ACCORDI;
			
			// poiche' esistono filtri che hanno necessita di postback salvo in sessione
			List<AccordoServizioParteComuneSintetico> lista = null;
			if(this.apcCore.isRegistroServiziLocale() &&
				!ServletUtils.isSearchDone(this)) {
				lista = ServletUtils.getRisultatiRicercaFromSession(this.request, this.session, idLista,  AccordoServizioParteComuneSintetico.class);
			}

			ricerca = this.checkSearchParameters(idLista, ricerca);
			
			if(lista==null) {
				lista = AccordiServizioParteComuneUtilities.accordiList(this.apcCore, userLogin, ricerca, tipoAccordo);
			}

			if(!this.isPostBackFilterElement()) {
				ServletUtils.setRisultatiRicercaIntoSession(this.request, this.session, idLista, lista); // salvo poiche' esistono filtri che hanno necessita di postback
			}
			
			this.prepareApiList(lista, ricerca, tipoAccordo);

			// 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, ApiCostanti.OBJECT_NAME_APC_API, CostantiControlStation.TIPO_OPERAZIONE_RESET_CACHE_ELEMENTO);
		} else { // reset richiesto dal dettaglio, torno al dettaglio
			this.prepareApiChange(tipoOp, as);
			ServletUtils.setGeneralAndPageDataIntoSession(this.request, this.session, gd, this.pd);
			return ServletUtils.getStrutsForwardEditModeFinished(mapping, ApiCostanti.OBJECT_NAME_APC_API, ForwardParams.CHANGE());
		}
	}


	private List<List<DataElement>> addApiToDati(List<List<DataElement>> datiPagina, TipoOperazione tipoOp,
			AccordoServizioParteComune as, String tipoAccordo, String tipoProtocollo, ServiceBinding serviceBinding) throws DriverRegistroServiziException, DriverControlStationException, ProtocolException, DriverConfigurazioneException, DriverConfigurazioneNotFound {
		
		if(tipoOp!=null) {
			// nop
		}
		
		this.pd.setCustomListViewName(ApiCostanti.APC_API_NOME_VISTA_CUSTOM_FORM_API);
		
		Parameter pIdAccordo = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ID, as.getId()+"");
		Parameter pNomeAccordo = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_NOME, as.getNome());
		Parameter pTipoAccordo = AccordiServizioParteComuneUtilities.getParametroAccordoServizio(tipoAccordo);
		
		IDAccordo idAccordo = this.idAccordoFactory.getIDAccordoFromAccordo(as);
		String labelAccordo = getLabelIdAccordo(tipoProtocollo, idAccordo);
		boolean showProtocolli = this.core.countProtocolli(this.request, this.session)>1;
		// sezione 1 riepilogo
		// nome accordo + link edit
		// nome soggetto referente + link edit
		// tipo interfaccia + link wsdl change + link download
		List<DataElement> dati = datiPagina.get(0);
		
		List<Parameter> listParametersApi = new ArrayList<>();
		listParametersApi.add(new Parameter(ApiCostanti.PARAMETRO_APC_API_GESTIONE_PARZIALE, "")); // lasciare per primo
		listParametersApi.add(pIdAccordo);
		listParametersApi.add(pNomeAccordo);
		listParametersApi.add(pTipoAccordo);
		
		// In Uso Button
		this.addComandoInUsoButton(labelAccordo, as.getId()+"", InUsoType.ACCORDO_SERVIZIO_PARTE_COMUNE);

		// 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.add(pIdAccordo);
			listaParametriChange.add(pNomeAccordo);
			listaParametriChange.add(pTipoAccordo);
			
			this.pd.addComandoResetCacheElementoButton(ApiCostanti.SERVLET_NAME_APC_API_CHANGE, listaParametriChange);
		}
		
		// Proprieta Button
		if(this.existsProprietaOggetto(as.getProprietaOggetto(), as.getDescrizione())) {
			this.addComandoProprietaOggettoButton(labelAccordo, as.getId()+"", InUsoType.ACCORDO_SERVIZIO_PARTE_COMUNE);
		}
		
		// Titolo API
		DataElement de = new DataElement();
		de.setType(DataElementType.CHECKBOX);
		de.setLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_NOME);
		de.setValue(getLabelIdAccordoSenzaReferente(tipoProtocollo, idAccordo));
		de.setStatusValue(getLabelIdAccordoSenzaReferente(tipoProtocollo, idAccordo));
				
		DataElementImage image = new DataElementImage();
		listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_INFORMAZIONI_GENERALI);
		image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
		image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_MODIFICA_API_TOOLTIP_CON_PARAMETRO, ApiCostanti.APC_API_LABEL_APS_INFO_GENERALI));
		image.setImage(ApiCostanti.APC_API_ICONA_MODIFICA_API);
		de.addImage(image);
		
		if(as.getDescrizione()==null || StringUtils.isEmpty(as.getDescrizione())) {
			image = new DataElementImage();
			listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_DESCRIZIONE);
			image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_AGGIUNGI_DESCRIZIONE_TOOLTIP_CON_PARAMETRO, AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_DESCRIZIONE));
			image.setImage(ApiCostanti.APC_API_ICONA_AGGIUNGI_DESCRIZIONE);
			de.addImage(image);
		}
		
		ConsoleSearch searchForCount = new ConsoleSearch(true);
		switch (serviceBinding) {
		case REST:
			// caso REST: l'API e' abilitata se ha almeno una risorsa
			
			this.apcCore.accordiResourceList(as.getId().intValue(), searchForCount);
			int numRisorse = searchForCount.getNumEntries(Liste.ACCORDI_API_RESOURCES);
			
			if(numRisorse > 0) {
				de.setStatusType(CheckboxStatusType.ABILITATO);
				de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_RISORSE_TUTTE_ABILITATE_TOOLTIP);
			} else {
				de.setStatusType(CheckboxStatusType.DISABILITATO);
				de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_RISORSE_TUTTE_DISABILITATE_TOOLTIP);
			}
			break;
		case SOAP:
		default:
			List<PortType> accordiPorttypeList = this.apcCore.accordiPorttypeList(as.getId().intValue(), searchForCount);
			int numeroTotaleServizi = accordiPorttypeList.size();
			int numeroServiziAbilitati = 0;
			
			for (PortType portType : accordiPorttypeList) {
				if(portType.sizeAzioneList()>0) {
					numeroServiziAbilitati ++;
				}	
			}
			
			if(numeroTotaleServizi == 0) {
				de.setStatusType(CheckboxStatusType.DISABILITATO);
				de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZI_TUTTI_DISABILITATI_TOOLTIP);
			}
			else if(numeroServiziAbilitati==0) {
				de.setStatusType(CheckboxStatusType.DISABILITATO);
				if(numeroTotaleServizi==1) {
					de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZIO_PARZIALMENTE_CONFIGURATO_DISABILITATI_TOOLTIP);
				}
				else {
					de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZI_TUTTI_SENZA_AZIONE_TOOLTIP);
				}
			}
			else if(numeroServiziAbilitati == numeroTotaleServizi) {
				de.setStatusType(CheckboxStatusType.ABILITATO);
				de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZI_TUTTI_ABILITATI_TOOLTIP);
			} 
			else {
				de.setStatusType(CheckboxStatusType.WARNING_ONLY);
				de.setStatusToolTip(ApiCostanti.APC_API_ICONA_STATO_SERVIZI_PARZIALMENTE_ABILITATI_TOOLTIP);
			}
			break;
		}
		
		dati.add(de);
		

		
		// soggetto referente
		ProtocolFactoryManager protocolFactoryManager = ProtocolFactoryManager.getInstance();
		IProtocolFactory<?> protocolFactory = protocolFactoryManager.getProtocolFactoryByName(tipoProtocollo);
		boolean supportatoSoggettoReferente = protocolFactory.createProtocolConfiguration().isSupportoSoggettoReferenteAccordiParteComune();
		if(supportatoSoggettoReferente) {
			de = new DataElement();
			de.setLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_REFERENTE);
			de.setValue(this.getLabelNomeSoggetto(tipoProtocollo,as.getSoggettoReferente().getTipo(),as.getSoggettoReferente().getNome())); 
			de.setType(DataElementType.TEXT);
			image = new DataElementImage();
			listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_SOGGETTO_REFERENTE);
			image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_MODIFICA_API_TOOLTIP_CON_PARAMETRO, AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_REFERENTE));
			image.setImage(ApiCostanti.APC_API_ICONA_MODIFICA_API);
			de.setImage(image);
			dati.add(de);
		}
		
		// ProtocolProperties
		IConsoleDynamicConfiguration consoleDynamicConfiguration = protocolFactory.createDynamicConfigurationConsole();
		IRegistryReader registryReader = this.apcCore.getRegistryReader(protocolFactory); 
		IConfigIntegrationReader configRegistryReader = this.apcCore.getConfigIntegrationReader(protocolFactory);
		ConsoleConfiguration consoleConfiguration = ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_SERVIZIO_COMPOSTO.equals(tipoAccordo) ? 
				consoleDynamicConfiguration.getDynamicConfigAccordoServizioComposto(ConsoleOperationType.CHANGE, this, 
						registryReader, configRegistryReader, idAccordo)
				: consoleDynamicConfiguration.getDynamicConfigAccordoServizioParteComune(ConsoleOperationType.CHANGE, this, 
						registryReader, configRegistryReader, idAccordo);
		boolean modificaDatiProfilo = false;
		if(consoleConfiguration!=null && consoleConfiguration.getConsoleItem()!=null && !consoleConfiguration.getConsoleItem().isEmpty()) {
			modificaDatiProfilo = true;
		}
		if(showProtocolli || modificaDatiProfilo) {
			de = new DataElement();
			String labelProtocollo =this.getLabelProtocollo(tipoProtocollo);
			de.setLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_PROTOCOLLO);
			de.setValue(labelProtocollo);
			de.setType(DataElementType.TEXT);
			
			if(modificaDatiProfilo) {
				image = new DataElementImage();
				listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_PROFILO);
				image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
				image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_MODIFICA_API_TOOLTIP_CON_PARAMETRO, AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_PROTOCOLLO));
				image.setImage(ApiCostanti.APC_API_ICONA_MODIFICA_API);
				de.setImage(image);
			}
			
			dati.add(de);
		}
		
		// interfaccia
		de = new DataElement();
		de.setLabel(ApiCostanti.APC_API_LABEL_PARAMETRO_INTERFACCIA);
		de.setType(DataElementType.TEXT);
		
		String labelServiceBinding = null;
		String tipoWsdl = null;
		String tipologiaDocumentoScaricare = null;
		boolean download = false;
		switch (serviceBinding) {
		case REST:
			labelServiceBinding= CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_REST;
			tipoWsdl = AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_CONCETTUALE;
			tipologiaDocumentoScaricare = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_CONCETTUALE;
			download = as.getByteWsdlConcettuale()!=null &&  as.getByteWsdlConcettuale().length>0;
			break;
		case SOAP:
		default:
			labelServiceBinding= CostantiControlStation.LABEL_PARAMETRO_SERVICE_BINDING_SOAP;
			tipoWsdl = AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_EROGATORE;
			tipologiaDocumentoScaricare = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_LOGICO_EROGATORE;
			download = as.getByteWsdlLogicoErogatore()!=null &&  as.getByteWsdlLogicoErogatore().length>0;
			break;
		}
		
		InterfaceType interfaceType = this.apcCore.formatoSpecifica2InterfaceType(as.getFormatoSpecifica());
		String labelWsdlCon = this.getLabelWSDLFromFormatoSpecifica(interfaceType);
		StringBuilder sb = new StringBuilder();
		sb.append(labelServiceBinding).append(" ").append(labelWsdlCon);
		de.setValue(sb.toString());
				
		// lista icone a dx 
		// wsdl change
		Parameter pNascondiSezioneDownload = new Parameter(ApiCostanti.PARAMETRO_APC_API_GESTIONE_PARZIALE, ApiCostanti.VALORE_PARAMETRO_APC_API_GESTIONE_PARZIALE_WSDL_CHANGE); 
		Parameter pTipoWsdl = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_WSDL, tipoWsdl);
		List<Parameter> listParametersApiWsdlChange = new ArrayList<>();
		listParametersApiWsdlChange.add(pIdAccordo);
		listParametersApiWsdlChange.add(pTipoAccordo);
		listParametersApiWsdlChange.add(pTipoWsdl);
		listParametersApiWsdlChange.add(pNascondiSezioneDownload);
		image = new DataElementImage();
		if(this.isModalitaStandard()) {
			image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_WSDL_CHANGE, listParametersApiWsdlChange.toArray(new Parameter[1]));
		}
		else {
			listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_GESTIONE_SPECIFICA_INTERFACCE);
			image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
		}
		image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_MODIFICA_API_TOOLTIP_CON_PARAMETRO, ApiCostanti.APC_API_LABEL_PARAMETRO_INTERFACCIA));
		image.setImage(ApiCostanti.APC_API_ICONA_MODIFICA_API);
		image.setTarget(TargetType.SELF);
		
		de.addImage(image);
		// download
		if(download) {
			List<Parameter> listParametersApiWsdlDownload = new ArrayList<>();
			Parameter pIdAccordoDownload = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ALLEGATI_ID_ACCORDO, as.getId()+"");
			Parameter pTipoDocumentoDownload = new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO, tipologiaDocumentoScaricare);
			Parameter pTipoAccordoDownload = new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO, ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_PARTE_COMUNE);
			listParametersApiWsdlDownload.add(pIdAccordoDownload);
			listParametersApiWsdlDownload.add(pTipoDocumentoDownload);
			listParametersApiWsdlDownload.add(pTipoAccordoDownload);
			
			image = new DataElementImage();
			image.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, listParametersApiWsdlDownload.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_DOWNLOAD_DOCUMENTO_INTERFACCIA_TOOLTIP_CON_PARAMETRO, ApiCostanti.APC_API_LABEL_PARAMETRO_INTERFACCIA));
			image.setImage(ApiCostanti.APC_API_ICONA_DOWNLOAD_DOCUMENTO_INTERFACCIA);
			image.setTarget(TargetType.SELF);
			image.setDisabilitaAjaxStatus();
			
			de.addImage(image);
		}
		// xsdSchemaCollction
		if(!this.isModalitaStandard()) {
			boolean asWithAllegati = this.asWithAllegatiXsd(as);
			if(asWithAllegati) {
				List<Parameter> listParametersApiWsdlDownload = new ArrayList<>();
				Parameter pIdAccordoDownload = new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ALLEGATI_ID_ACCORDO, as.getId()+"");
				Parameter pTipoDocumentoDownload = new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO, ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_XSD_SCHEMA_COLLECTION);
				Parameter pTipoAccordoDownload = new Parameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO, ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_PARTE_COMUNE);
				Parameter pApiGestioneParziale = new Parameter(ApiCostanti.PARAMETRO_APC_API_GESTIONE_PARZIALE, ApiCostanti.VALORE_PARAMETRO_APC_API_GESTIONE_SPECIFICA_INTERFACCE);
				listParametersApiWsdlDownload.add(pIdAccordoDownload);
				listParametersApiWsdlDownload.add(pTipoDocumentoDownload);
				listParametersApiWsdlDownload.add(pTipoAccordoDownload);
				listParametersApiWsdlDownload.add(pApiGestioneParziale);
				
				image = new DataElementImage();
				image.setUrl(ArchiviCostanti.SERVLET_NAME_DOCUMENTI_EXPORT, listParametersApiWsdlDownload.toArray(new Parameter[1]));
				image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_DOWNLOAD_DOCUMENTO_INTERFACCIA_TOOLTIP_CON_PARAMETRO, 
						AccordiServizioParteComuneCostanti.LABEL_XSD_SCHEMA_COLLECTION));
				image.setImage(ApiCostanti.APC_API_ICONA_DOWNLOAD_DOCUMENTO_ARCHIVE);
				image.setTarget(TargetType.SELF);
				image.setDisabilitaAjaxStatus();
				
				de.addImage(image);
			}
		}
		
		dati.add(de);
		
		
		// Descrizione
		if(as.getDescrizione()!=null && StringUtils.isNotEmpty(as.getDescrizione())) {
			de = new DataElement();
			de.setType(DataElementType.TEXT);
			de.setLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_DESCRIZIONE);
			int length = 150;
			String descrizione = null;
			if(as.getDescrizione()!=null && as.getDescrizione().length()>length) {
				descrizione = as.getDescrizione().substring(0, (length-4)) + " ...";
			}
			else {
				descrizione =  as.getDescrizione() ;
			}
			de.setValue(descrizione!=null ? StringEscapeUtils.escapeHtml(descrizione) : null);
			de.setToolTip(as.getDescrizione());
			listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_DESCRIZIONE);
			de.setIcon(ApiCostanti.APC_API_ICONA_MODIFICA_API);
			
			image = new DataElementImage();
			listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_DESCRIZIONE);
			image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_MODIFICA_API_TOOLTIP_CON_PARAMETRO, AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_DESCRIZIONE));
			image.setImage(ApiCostanti.APC_API_ICONA_MODIFICA_API);
			de.setImage(image);
			
			dati.add(de);
		}
		
		
		// Gruppi 
		de = new DataElement();
		de.setType(DataElementType.BUTTON);
		de.setLabel(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_GRUPPI);

		List<String> labelsGruppi = new ArrayList<>();
		List<String> valuesGruppi = new ArrayList<>();
		
		GruppiAccordo gruppi = as.getGruppi();
		if(gruppi != null) {
			// colleziono i tags registrati
			List<String> tagsDisponibili = this.gruppiCore.getAllGruppiOrdinatiPerDataRegistrazione();
			
			for (int i = 0; i < gruppi.sizeGruppoList(); i++) {
				GruppoAccordo gruppo = gruppi.getGruppo(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);
		
		listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_GRUPPI);
		de.setIcon(ApiCostanti.APC_API_ICONA_MODIFICA_API);
		image = new DataElementImage();
		listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_GRUPPI);
		image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
		image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_MODIFICA_API_TOOLTIP_CON_PARAMETRO, AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_GRUPPI));
		image.setImage(ApiCostanti.APC_API_ICONA_MODIFICA_API);
		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(AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_CANALE);
			this.setStatoCanale(de, as.getCanale(), canaleList);
			listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_CANALE);
			de.setIcon(ApiCostanti.APC_API_ICONA_MODIFICA_API);
			
			image = new DataElementImage();
			listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_CANALE);
			image.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
			image.setToolTip(MessageFormat.format(ApiCostanti.APC_API_ICONA_MODIFICA_API_TOOLTIP_CON_PARAMETRO, AccordiServizioParteComuneCostanti.LABEL_PARAMETRO_APC_CANALE));
			image.setImage(ApiCostanti.APC_API_ICONA_MODIFICA_API);
			de.setImage(image);
			
			dati.add(de);
		}
		
		// Proprieta Oggetto
		this.addProprietaOggetto(dati, as.getProprietaOggetto());

		
		// link
		// 1. risorse/servizi
		switch(serviceBinding) {
		case REST:
				de = new DataElement();
				de.setType(DataElementType.LINK);
				listParametersApi.get(0).setValue("");
				de.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_RESOURCES_LIST, listParametersApi.toArray(new Parameter[1]));
				de.setValue(ApiCostanti.APC_API_LABEL_GESTIONE_RISORSE);
				de.setIcon(ApiCostanti.APC_API_ICONA_GESTIONE_RISORSE);
				dati.add(de);
			break;
		case SOAP:
		default:
			// PortType
			de = new DataElement();
			de.setType(DataElementType.LINK);
			listParametersApi.get(0).setValue("");
			de.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_PORT_TYPES_LIST, listParametersApi.toArray(new Parameter[1]));
			de.setValue(ApiCostanti.APC_API_LABEL_GESTIONE_SERVIZI);
			de.setIcon(ApiCostanti.APC_API_ICONA_GESTIONE_SERVIZI);
			dati.add(de);
			break;
		
		}

		// 2. allegati
		de = new DataElement();
		de.setType(DataElementType.LINK);
		listParametersApi.get(0).setValue("");
		de.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_ALLEGATI_LIST, listParametersApi.toArray(new Parameter[1]));
		de.setValue(ApiCostanti.APC_API_LABEL_GESTIONE_ALLEGATI);
		de.setIcon(ApiCostanti.APC_API_ICONA_GESTIONE_ALLEGATI);
		dati.add(de);
		
		// 3. opzioni avanzate
		if(this.isModalitaAvanzata()) {
			de = new DataElement();
			de.setType(DataElementType.LINK);
			listParametersApi.get(0).setValue(ApiCostanti.VALORE_PARAMETRO_APC_API_OPZIONI_AVANZATE);
			de.setUrl(AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_CHANGE, listParametersApi.toArray(new Parameter[1]));
			de.setValue(ApiCostanti.APC_API_LABEL_GESTIONE_OPZIONI_AVANZATE);
			de.setIcon(ApiCostanti.APC_API_ICONA_GESTIONE_OPZIONI_AVANZATE);
			dati.add(de);
		}
		
		de = new DataElement();
		de.setType(DataElementType.LINK);
		List<Parameter> listParametersNuovaVersione = new ArrayList<>();
		listParametersNuovaVersione.add(new Parameter(ApiCostanti.PARAMETRO_APC_API_NUOVA_VERSIONE, Costanti.CHECK_BOX_ENABLED_TRUE));
		listParametersNuovaVersione.add(pIdAccordo);
		listParametersNuovaVersione.add(pTipoAccordo);
		de.setUrl(ApiCostanti.SERVLET_NAME_APC_API_ADD, listParametersNuovaVersione.toArray(new Parameter[1]));
		de.setValue(ApiCostanti.APC_API_LABEL_NUOVA_VERSIONE_API);
		de.setIcon(ApiCostanti.APC_API_ICONA_NUOVA_VERSIONE_API);
		de.spostaLinkADestra();
		dati.add(de);
		
		
		return datiPagina;
	}
	
	
}