AccordiServizioParteComuneAdd.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;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

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

import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.core.config.CanaleConfigurazione;
import org.openspcoop2.core.config.CanaliConfigurazione;
import org.openspcoop2.core.config.Soggetto;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDAccordoCooperazione;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoCooperazione;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteComuneServizioComposto;
import org.openspcoop2.core.registry.GruppiAccordo;
import org.openspcoop2.core.registry.Gruppo;
import org.openspcoop2.core.registry.GruppoAccordo;
import org.openspcoop2.core.registry.IdSoggetto;
import org.openspcoop2.core.registry.ProtocolProperty;
import org.openspcoop2.core.registry.beans.AccordoServizioParteComuneSintetico;
import org.openspcoop2.core.registry.constants.FormatoSpecifica;
import org.openspcoop2.core.registry.constants.PddTipologia;
import org.openspcoop2.core.registry.constants.ProfiloCollaborazione;
import org.openspcoop2.core.registry.constants.StatiAccordo;
import org.openspcoop2.core.registry.constants.StatoFunzionalita;
import org.openspcoop2.core.registry.driver.FiltroRicercaGruppi;
import org.openspcoop2.core.registry.driver.IDAccordoCooperazioneFactory;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.ValidazioneStatoPackageException;
import org.openspcoop2.message.constants.MessageType;
import org.openspcoop2.message.constants.ServiceBinding;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.manifest.constants.InterfaceType;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
import org.openspcoop2.protocol.sdk.constants.ProfiloDiCollaborazione;
import org.openspcoop2.protocol.sdk.properties.ProtocolPropertiesUtils;
import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.servlet.GeneralHelper;
import org.openspcoop2.web.ctrlstat.servlet.ac.AccordiCooperazioneCore;
import org.openspcoop2.web.ctrlstat.servlet.apc.api.ApiCostanti;
import org.openspcoop2.web.ctrlstat.servlet.apc.api.ApiHelper;
import org.openspcoop2.web.ctrlstat.servlet.config.ConfigurazioneCore;
import org.openspcoop2.web.ctrlstat.servlet.gruppi.GruppiCore;
import org.openspcoop2.web.ctrlstat.servlet.protocol_properties.ProtocolPropertiesCostanti;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCore;
import org.openspcoop2.web.lib.mvc.Costanti;
import org.openspcoop2.web.lib.mvc.DataElement;
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.TipoOperazione;

/**
 * accordiAdd
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author Stefano Corallo (corallo@link.it)
 * @author Sandra Giangrandi (sandra@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public final class AccordiServizioParteComuneAdd extends Action {

	

	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

		HttpSession session = request.getSession(true);

		// Inizializzo PageData
		PageData pd = new PageData();

		GeneralHelper generalHelper = new GeneralHelper(session);

		// Inizializzo GeneralData
		GeneralData gd = generalHelper.initGeneralData(request);

		String userLogin = ServletUtils.getUserLoginFromSession(session);

		AccordiServizioParteComuneAddStrutsBean strutsBean = new AccordiServizioParteComuneAddStrutsBean();
		
		// Parametri Protocol Properties relativi al tipo di operazione e al tipo di visualizzazione
		strutsBean.consoleOperationType = ConsoleOperationType.ADD;
		
		// Parametri relativi al tipo operazione
		TipoOperazione tipoOp = TipoOperazione.ADD; 

		try {
			ApiHelper apcHelper = new ApiHelper(request, pd, session);
			Boolean isModalitaVistaApiCustom = ServletUtils.getBooleanAttributeFromSession(ApiCostanti.SESSION_ATTRIBUTE_VISTA_APC_API, session, request, false).getValue();
			
			strutsBean.editMode = apcHelper.getParameter(Costanti.DATA_ELEMENT_EDIT_MODE_NAME);
			strutsBean.nome = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_NOME);
			strutsBean.descr = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_DESCRIZIONE);
			strutsBean.profcoll = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_PROFILO_COLLABORAZIONE);
			
			
			strutsBean.wsdldef = apcHelper.getBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_DEFINITORIO);
			strutsBean.wsdlconc = apcHelper.getBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_CONCETTUALE);
			strutsBean.wsdlserv = apcHelper.getBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_EROGATORE);
			strutsBean.wsdlservcorr = apcHelper.getBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_FRUITORE);

			strutsBean.wsblconc = apcHelper.getBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_CONCETTUALE);
			strutsBean.wsblserv = apcHelper.getBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_EROGATORE);
			strutsBean.wsblservcorr = apcHelper.getBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_FRUITORE);

			strutsBean.filtrodup = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_FILTRO_DUPLICATI);
			strutsBean.confric = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_CONFERMA_RICEZIONE);
			strutsBean.idcoll = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_COLLABORAZIONE);
			strutsBean.idRifRichiesta = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ID_RIFERIMENTO_RICHIESTA);
			strutsBean.consord = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_CONSEGNA_ORDINE);
			strutsBean.scadenza = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SCADENZA);
			strutsBean.referente = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_REFERENTE);
			strutsBean.versione = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_VERSIONE);
			
			String serviceBindingS = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SERVICE_BINDING);
			strutsBean.serviceBinding = StringUtils.isNotEmpty(serviceBindingS) ? ServiceBinding.valueOf(serviceBindingS) : null;
			String messageProcessorS = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_MESSAGE_TYPE);
			strutsBean.messageType = (StringUtils.isNotEmpty(messageProcessorS) && !messageProcessorS.equals(AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_MESSAGE_TYPE_DEFAULT)) ? MessageType.valueOf(messageProcessorS) : null;
			String formatoSpecificaS = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_INTERFACE_TYPE);
			strutsBean.interfaceType = StringUtils.isNotEmpty(formatoSpecificaS) ? InterfaceType.toEnumConstant(formatoSpecificaS) : null;
			
			strutsBean.gruppi = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_GRUPPI);
			strutsBean.canale = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_CANALE);
			strutsBean.canaleStato = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_CANALE_STATO);

			// patch per version spinner fino a che non si trova un modo piu' elegante
			// Veniva sempre impostato false, lo lascio commentato in questo punto perche' veniva passato nella decode della richiesta multipart...
			/**			if(this.isBackwardCompatibilityAccordo11){
			//				if("0".equals(strutsBean.versione))
			//					strutsBean.versione = "";
			//			} */

			String priv = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_PRIVATO);
			strutsBean.privato = ServletUtils.isCheckBoxEnabled(priv);

			String isServComp = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_IS_SERVIZIO_COMPOSTO);
			strutsBean.isServizioComposto = ServletUtils.isCheckBoxEnabled(isServComp);

			strutsBean.accordoCooperazione = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ACCORDO_COOPERAZIONE);
			strutsBean.statoPackage = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_STATO_PACKAGE);

			strutsBean.tipoAccordo = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO);
			if("".equals(strutsBean.tipoAccordo))
				strutsBean.tipoAccordo = null;
			if(strutsBean.tipoAccordo!=null){
				if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE.equals(strutsBean.tipoAccordo)){
					strutsBean.isServizioComposto = false;
				}else if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_SERVIZIO_COMPOSTO.equals(strutsBean.tipoAccordo)){
					strutsBean.isServizioComposto = true;
				}
			}

			if (apcHelper.isMultipart()) {
				/** this.decodeRequest(request,ch.core.isBackwardCompatibilityAccordo11());
				//				strutsBean.decodeRequestValidazioneDocumenti = false; // init
				//				this.decodeRequest(request,false); */

				//Quando trovava la linea corrispondente a AccordiServizioParteComuneCostanti.PARAMETRO_APC_VALIDAZIONE_DOCUMENTI  
				//eseguiva questo codice 
				strutsBean.decodeRequestValidazioneDocumenti = true;
				String tmpValidazioneDocumenti = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_VALIDAZIONE_DOCUMENTI);
				strutsBean.validazioneDocumenti = ServletUtils.isCheckBoxEnabled(tmpValidazioneDocumenti);
			}

			if(ServletUtils.isEditModeInProgress(strutsBean.editMode)){
				// primo accesso alla servlet
				strutsBean.validazioneDocumenti = true;
			}else{
				if(!strutsBean.decodeRequestValidazioneDocumenti){
					String tmpValidazioneDocumenti = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_VALIDAZIONE_DOCUMENTI);
					strutsBean.validazioneDocumenti = ServletUtils.isCheckBoxEnabled(tmpValidazioneDocumenti);
				}
			}

			AccordiServizioParteComuneCore apcCore = new AccordiServizioParteComuneCore();
			SoggettiCore soggettiCore = new SoggettiCore(apcCore);
			AccordiCooperazioneCore acCore = new AccordiCooperazioneCore(apcCore);
			GruppiCore gruppiCore = new GruppiCore(apcCore);
			ConfigurazioneCore confCore = new ConfigurazioneCore(apcCore);
			String labelAccordoServizio = AccordiServizioParteComuneUtilities.getTerminologiaAccordoServizio(strutsBean.tipoAccordo);
			
			// carico i canali
			CanaliConfigurazione gestioneCanali = confCore.getCanaliConfigurazione(false);
			List<CanaleConfigurazione> canaleList = gestioneCanali != null ? gestioneCanali.getCanaleList() : new ArrayList<>();
			boolean gestioneCanaliEnabled = gestioneCanali != null && org.openspcoop2.core.config.constants.StatoFunzionalita.ABILITATO.equals(gestioneCanali.getStato());
			
			// Tipi protocollo supportati
			// Controllo comunque quelli operativi, almeno uno deve esistere
			List<String> listaTipiProtocollo = apcCore.getProtocolliByFilter(request, session, true, PddTipologia.OPERATIVO, false, strutsBean.isServizioComposto);

			// primo accesso 
			strutsBean.tipoProtocollo =  apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_PROTOCOLLO);
			if(strutsBean.tipoProtocollo == null){
				strutsBean.tipoProtocollo = apcCore.getProtocolloDefault(request, session, listaTipiProtocollo);
			}
			
			String nuovaVersioneTmp = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_API_NUOVA_VERSIONE);
			strutsBean.nuovaVersione = ServletUtils.isCheckBoxEnabled(nuovaVersioneTmp);
			int gestioneNuovaVersioneMin = 1;
			boolean nuovaVersioneRidefinisciInterfaccia = true;
			long gestioneNuovaVersioneOldIdApc = -1;
			List<ProtocolProperty> gestioneNuovaVersioneOldProtocolProperties = null;
			if(strutsBean.nuovaVersione) {
				
				String nuovaVersioneTmpMinVersion = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_API_NUOVA_VERSIONE_MIN);
				if(!StringUtils.isEmpty(nuovaVersioneTmpMinVersion)) {
					gestioneNuovaVersioneMin = Integer.parseInt(nuovaVersioneTmpMinVersion);
				}
								
				String tmpIdPrecedenteAccordo = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_ID);
				if(!StringUtils.isEmpty(tmpIdPrecedenteAccordo)) {
					
					// ci entro solamente la prima volta al "click" sulla nuova versione
					
					nuovaVersioneRidefinisciInterfaccia = true; // default
					
					// fisso alcuni valori
					long idAccordoPrec = Long.parseLong(tmpIdPrecedenteAccordo);
					gestioneNuovaVersioneOldIdApc = idAccordoPrec;
					AccordoServizioParteComune aspc = apcCore.getAccordoServizioFull(idAccordoPrec);
					gestioneNuovaVersioneOldProtocolProperties = aspc.getProtocolPropertyList();
					IDAccordo idAccordoPrecedente = IDAccordoFactory.getInstance().getIDAccordoFromAccordo(aspc);
					strutsBean.nome = aspc.getNome();
					strutsBean.referente = soggettiCore.getSoggetto(aspc.getSoggettoReferente().toIDSoggetto()).getId().longValue()+"";
					strutsBean.tipoProtocollo = soggettiCore.getProtocolloAssociatoTipoSoggetto(aspc.getSoggettoReferente().getTipo());
					strutsBean.serviceBinding = apcCore.toMessageServiceBinding(aspc.getServiceBinding());
					if(aspc.getMessageType()!=null) {
						strutsBean.messageType = apcCore.toMessageMessageType(aspc.getMessageType());
					}
					if(aspc.getServizioComposto()!=null && aspc.getServizioComposto().getAccordoCooperazione()!=null && !"".equals(aspc.getServizioComposto().getAccordoCooperazione())) {
						IDAccordoCooperazione idAccordoCooperazione = IDAccordoCooperazioneFactory.getInstance().getIDAccordoFromUri(aspc.getServizioComposto().getAccordoCooperazione());
						strutsBean.accordoCooperazione = acCore.getAccordoCooperazione(idAccordoCooperazione).getId().longValue()+"";
						strutsBean.isServizioComposto = true;
					}
					if(strutsBean.interfaceType==null) {
						strutsBean.interfaceType = apcCore.formatoSpecifica2InterfaceType(aspc.getFormatoSpecifica());
					}
					if(strutsBean.descr==null || StringUtils.isEmpty(strutsBean.descr)) {
						strutsBean.descr = aspc.getDescrizione();
					}
					if((strutsBean.gruppi==null || StringUtils.isEmpty(strutsBean.gruppi)) &&
						aspc.getGruppi()!=null && aspc.getGruppi().getGruppoList()!=null && !aspc.getGruppi().getGruppoList().isEmpty()) {
						List<String> nomiGruppi = aspc.getGruppi().getGruppoList().stream().flatMap(e-> Stream.of(e.getNome())).collect(Collectors.toList());
						strutsBean.gruppi = StringUtils.join(nomiGruppi, ",");
					}
					if(strutsBean.profcoll==null || StringUtils.isEmpty(strutsBean.profcoll)) {
						strutsBean.profcoll = AccordiServizioParteComuneHelper.convertProfiloCollaborazioneDB2View(aspc.getProfiloCollaborazione());
					}
					if(strutsBean.filtrodup==null || StringUtils.isEmpty(strutsBean.filtrodup)) {
						strutsBean.filtrodup = AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(aspc.getFiltroDuplicati());
					}
					if(strutsBean.confric==null || StringUtils.isEmpty(strutsBean.confric)) {
						strutsBean.confric = AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(aspc.getConfermaRicezione());
					}
					if(strutsBean.idcoll==null || StringUtils.isEmpty(strutsBean.idcoll)) {
						strutsBean.idcoll = AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(aspc.getIdCollaborazione());
					}
					if(strutsBean.idRifRichiesta==null || StringUtils.isEmpty(strutsBean.idRifRichiesta)) {
						strutsBean.idRifRichiesta = AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(aspc.getIdRiferimentoRichiesta());
					}
					if(strutsBean.consord==null || StringUtils.isEmpty(strutsBean.consord)) {
						strutsBean.consord = AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoDB2View(aspc.getConsegnaInOrdine());
					}
					if(strutsBean.scadenza==null || StringUtils.isEmpty(strutsBean.scadenza)) {
						strutsBean.scadenza = aspc.getScadenza() != null ? aspc.getScadenza() : "";
					}
					
					gestioneNuovaVersioneMin = apcCore.getAccordoServizioParteComuneNextVersion(idAccordoPrecedente);
					if(strutsBean.versione==null || StringUtils.isEmpty(strutsBean.versione)) {
						strutsBean.versione = gestioneNuovaVersioneMin+"";
					}
					if(strutsBean.canale==null || StringUtils.isEmpty(strutsBean.canale)) {
						strutsBean.canale = aspc.getCanale();
					}
					if(strutsBean.canaleStato==null || StringUtils.isEmpty(strutsBean.canaleStato)) {
						if(strutsBean.canale == null) {
							strutsBean.canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_DEFAULT;
						} else {
							strutsBean.canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_RIDEFINITO;
						}
					} 
				}
				else {
					String nuovaVersioneRidefinisciInterfacciaTmp = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_API_NUOVA_VERSIONE_RIDEFINISCI_INTERFACCIA);
					nuovaVersioneRidefinisciInterfaccia = ServletUtils.isCheckBoxEnabled(nuovaVersioneRidefinisciInterfacciaTmp);
				
					String nuovaVersioneOldIdApcTmp = apcHelper.getParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_API_NUOVA_VERSIONE_OLD_ID_APC);
					gestioneNuovaVersioneOldIdApc = Long.valueOf(nuovaVersioneOldIdApcTmp);
				}
			}
			
			strutsBean.protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(strutsBean.tipoProtocollo);
			strutsBean.consoleDynamicConfiguration =  strutsBean.protocolFactory.createDynamicConfigurationConsole();
			strutsBean.registryReader = soggettiCore.getRegistryReader(strutsBean.protocolFactory); 
			strutsBean.configRegistryReader = soggettiCore.getConfigIntegrationReader(strutsBean.protocolFactory);
			
			// service binding 
			if(strutsBean.serviceBinding == null) {
				strutsBean.serviceBinding  = soggettiCore.getDefaultServiceBinding(strutsBean.protocolFactory);
			}
			
			FiltroRicercaGruppi filtroRicerca = new FiltroRicercaGruppi();
			filtroRicerca.setServiceBinding(apcCore.fromMessageServiceBinding(strutsBean.serviceBinding));
			List<String> elencoGruppi = gruppiCore.getAllGruppi(filtroRicerca);

			boolean showReferente = false;
			if(strutsBean.isServizioComposto){
				showReferente = true;
			}
			else {
				showReferente = apcCore.isSupportatoSoggettoReferente(strutsBean.tipoProtocollo);
			}
			
			// ID Accordo Null per default
			IDAccordo idApc = null;			
			strutsBean.consoleConfiguration = (strutsBean.tipoAccordo==null || strutsBean.tipoAccordo.equals(ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_PARTE_COMUNE)) ? 
					strutsBean.consoleDynamicConfiguration.getDynamicConfigAccordoServizioParteComune(strutsBean.consoleOperationType, apcHelper, 
							strutsBean.registryReader, strutsBean.configRegistryReader, idApc)
					: strutsBean.consoleDynamicConfiguration.getDynamicConfigAccordoServizioComposto(strutsBean.consoleOperationType, apcHelper, 
							strutsBean.registryReader, strutsBean.configRegistryReader, idApc);
					
			strutsBean.protocolProperties = apcHelper.estraiProtocolPropertiesDaRequest(strutsBean.consoleConfiguration, strutsBean.consoleOperationType);
			
			if(strutsBean.nuovaVersione && gestioneNuovaVersioneOldProtocolProperties!=null && !gestioneNuovaVersioneOldProtocolProperties.isEmpty()){
				ProtocolPropertiesUtils.mergeProtocolPropertiesRegistry(strutsBean.protocolProperties, gestioneNuovaVersioneOldProtocolProperties, strutsBean.consoleOperationType);
			}

			// Flag per controllare il mapping automatico di porttype e operation
			boolean enableAutoMapping = apcCore.isEnableAutoMappingWsdlIntoAccordo();
			boolean enableAutoMappingEstraiXsdSchemiFromWsdlTypes = apcCore.isEnableAutoMappingWsdlIntoAccordoEstrazioneSchemiInWsdlTypes();

			
			
			//Carico la lista dei tipi di soggetti gestiti dal protocollo
			List<String> tipiSoggettiGestitiProtocollo = soggettiCore.getTipiSoggettiGestitiProtocollo(strutsBean.tipoProtocollo);

			// Preparo il menu
			apcHelper.makeMenu();
				
			if(listaTipiProtocollo.isEmpty()) {
				boolean msg = true;
				if(strutsBean.isServizioComposto) {
					List<String> listaTipiProtocolloSenzaAccordiCooperazione = apcCore.getProtocolliByFilter(request, session, true, PddTipologia.OPERATIVO, false, false);
					if(!listaTipiProtocolloSenzaAccordiCooperazione.isEmpty()) {
						pd.setMessage("Non risultano registrati accordi di cooperazione", Costanti.MESSAGE_TYPE_INFO);
						msg = false;
					}
				}
				if(msg) {
					if(soggettiCore.isGestionePddAbilitata(apcHelper)) {
						pd.setMessage("Non risultano registrati soggetti associati a porte di dominio di tipo operativo", Costanti.MESSAGE_TYPE_INFO);
					}
					else {
						pd.setMessage("Non risultano registrati soggetti di dominio interno", Costanti.MESSAGE_TYPE_INFO);
					}
				}
				pd.disableEditMode();

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

				dati.add(ServletUtils.getDataElementForEditModeFinished());

				pd.setDati(dati);

				ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

				return ServletUtils.getStrutsForwardEditModeCheckError(mapping, AccordiServizioParteComuneCostanti.OBJECT_NAME_APC, 
						ForwardParams.ADD());
			}
			
			List<Soggetto> listaSoggetti=null;
			if(apcCore.isVisioneOggettiGlobale(userLogin)){
				listaSoggetti = soggettiCore.soggettiList(null, new ConsoleSearch(true));
			}else{
				listaSoggetti = soggettiCore.soggettiList(userLogin, new ConsoleSearch(true));
			}
			String[] providersList = null;
			String[] providersListLabel = null;

			List<String> soggettiListTmp = new ArrayList<>();
			List<String> soggettiListLabelTmp = new ArrayList<>();
			soggettiListTmp.add("-");
			soggettiListLabelTmp.add("-");

			if (!listaSoggetti.isEmpty()) {
				for (Soggetto soggetto : listaSoggetti) {
					if(tipiSoggettiGestitiProtocollo.contains(soggetto.getTipo())){
						soggettiListTmp.add(soggetto.getId().toString());
						/** soggettiListLabelTmp.add(soggetto.getTipo() + "/" + soggetto.getNome()); */
						soggettiListLabelTmp.add(apcHelper.getLabelNomeSoggetto(strutsBean.tipoProtocollo, soggetto.getTipo() , soggetto.getNome() ));
					}
				}
			}
			providersList = soggettiListTmp.toArray(new String[1]);
			providersListLabel = soggettiListLabelTmp.toArray(new String[1]);

			String[] accordiCooperazioneEsistenti=null;
			String[] accordiCooperazioneEsistentiLabel=null;

 
			String postBackElementName = apcHelper.getParameter(Costanti.POSTBACK_ELEMENT_NAME);

			// Controllo se ho modificato il protocollo, resetto il referente e il service binding
			if(postBackElementName != null ){
				if(postBackElementName.equalsIgnoreCase(AccordiServizioParteComuneCostanti.PARAMETRO_APC_PROTOCOLLO)){
					strutsBean.referente = null;
					apcHelper.deleteBinaryParameters(strutsBean.wsdlconc,strutsBean.wsdldef,strutsBean.wsdlserv,strutsBean.wsdlservcorr,strutsBean.wsblconc,strutsBean.wsblserv,strutsBean.wsblservcorr);
					apcHelper.deleteProtocolPropertiesBinaryParameters(strutsBean.wsdlconc,strutsBean.wsdldef,strutsBean.wsdlserv,strutsBean.wsdlservcorr,strutsBean.wsblconc,strutsBean.wsblserv,strutsBean.wsblservcorr);
					strutsBean.serviceBinding  = soggettiCore.getDefaultServiceBinding(strutsBean.protocolFactory);
					strutsBean.interfaceType = null;
					strutsBean.messageType = null;
					
					strutsBean.wsdldef = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_DEFINITORIO);
					strutsBean.wsdlconc = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_CONCETTUALE);
					strutsBean.wsdlserv = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_EROGATORE);
					strutsBean.wsdlservcorr = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_FRUITORE);

					strutsBean.wsblconc = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_CONCETTUALE);
					strutsBean.wsblserv = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_EROGATORE);
					strutsBean.wsblservcorr = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_FRUITORE);
					
					filtroRicerca = new FiltroRicercaGruppi();
					filtroRicerca.setServiceBinding(apcCore.fromMessageServiceBinding(strutsBean.serviceBinding));
					elencoGruppi = gruppiCore.getAllGruppi(filtroRicerca);
				}
				else if(postBackElementName.equalsIgnoreCase(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SERVICE_BINDING)){
					strutsBean.interfaceType = null;
					strutsBean.messageType = null;
					
					strutsBean.wsdldef = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_DEFINITORIO);
					strutsBean.wsdlconc = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_CONCETTUALE);
					strutsBean.wsdlserv = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_EROGATORE);
					strutsBean.wsdlservcorr = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_FRUITORE);

					strutsBean.wsblconc = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_CONCETTUALE);
					strutsBean.wsblserv = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_EROGATORE);
					strutsBean.wsblservcorr = apcHelper.newBinaryParameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_FRUITORE);
					
					filtroRicerca = new FiltroRicercaGruppi();
					filtroRicerca.setServiceBinding(apcCore.fromMessageServiceBinding(strutsBean.serviceBinding));
					elencoGruppi = gruppiCore.getAllGruppi(filtroRicerca);
				}
			}

			org.openspcoop2.core.registry.Soggetto soggettoReferente = null;
			try{
				soggettoReferente = soggettiCore.getSoggettoRegistro(Long.valueOf(strutsBean.referente));
			}catch(Exception e){
				// ignore
			}
			List<String> tipiSoggettiCompatibili = new ArrayList<>();
			if(soggettoReferente!=null){
				String protocollo = soggettiCore.getProtocolloAssociatoTipoSoggetto(soggettoReferente.getTipo());
				tipiSoggettiCompatibili = soggettiCore.getTipiSoggettiGestitiProtocollo(protocollo);
			}

			if(strutsBean.isServizioComposto) {
				List<AccordoCooperazione> listaTmp = null;
				if(apcCore.isVisioneOggettiGlobale(userLogin)){
					listaTmp = acCore.accordiCooperazioneList(null, new ConsoleSearch(true));
				}else{
					listaTmp = acCore.accordiCooperazioneList(userLogin, new ConsoleSearch(true));
				}
				List<AccordoCooperazione> listaAccordoCooperazione = new ArrayList<>();
				for (AccordoCooperazione accordoCooperazione : listaTmp) {
					if(accordoCooperazione.getSoggettoReferente()!=null &&
						tipiSoggettiCompatibili!=null && tipiSoggettiCompatibili.contains(accordoCooperazione.getSoggettoReferente().getTipo())){
						listaAccordoCooperazione.add(accordoCooperazione);
					}
				}
				if (listaAccordoCooperazione != null && !listaAccordoCooperazione.isEmpty()) {
					accordiCooperazioneEsistenti = new String[listaAccordoCooperazione.size()+1];
					accordiCooperazioneEsistentiLabel = new String[listaAccordoCooperazione.size()+1];
					int i = 1;
					accordiCooperazioneEsistenti[0]="-";
					accordiCooperazioneEsistentiLabel[0]="-";
					Iterator<AccordoCooperazione> itL = listaAccordoCooperazione.iterator();
					while (itL.hasNext()) {
						AccordoCooperazione singleAC = itL.next();
						accordiCooperazioneEsistenti[i] = "" + singleAC.getId();
						accordiCooperazioneEsistentiLabel[i] = apcHelper.getLabelIdAccordoCooperazione(acCore.getAccordoCooperazione(singleAC.getId())); 
						i++;
					}
				} else {
					accordiCooperazioneEsistenti = new String[1];
					accordiCooperazioneEsistentiLabel = new String[1];
					accordiCooperazioneEsistenti[0]="-";
					accordiCooperazioneEsistentiLabel[0]="-";
				}
			}
			
			// message type resta null
			// fromato specifica
			if(strutsBean.interfaceType == null) {
				if(strutsBean.serviceBinding != null) {
					switch(strutsBean.serviceBinding) {
					case REST:
						strutsBean.interfaceType = InterfaceType.toEnumConstant(AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_INTERFACE_TYPE_REST);
						break;
					case SOAP:
					default:
						strutsBean.interfaceType = InterfaceType.toEnumConstant(AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_INTERFACE_TYPE_SOAP);
						break;
					}
				}
			}

			// Se nome = null, devo visualizzare la pagina per l'inserimento dati
			String servletNameApcList = (isModalitaVistaApiCustom!=null && isModalitaVistaApiCustom.booleanValue()) ? ApiCostanti.SERVLET_NAME_APC_API_LIST : AccordiServizioParteComuneCostanti.SERVLET_NAME_APC_LIST; 
			Parameter pTipoAccordo = AccordiServizioParteComuneUtilities.getParametroAccordoServizio(strutsBean.tipoAccordo);
			List<Parameter> listaParams = new ArrayList<>();
			listaParams.add(new Parameter(labelAccordoServizio, servletNameApcList, pTipoAccordo));
			listaParams.add(new Parameter(Costanti.PAGE_DATA_TITLE_LABEL_AGGIUNGI,null));
			
			
			if(ServletUtils.isEditModeInProgress(strutsBean.editMode)){ 

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

				if(strutsBean.nome==null){
					strutsBean.nome = "";
					strutsBean.accordoCooperazione = "";
					strutsBean.confric  = "";
					strutsBean.consord = "";
					strutsBean.descr = "";
					strutsBean.filtrodup = "yes";
					strutsBean.idcoll = "";
					strutsBean.idRifRichiesta = "";
					strutsBean.profcoll = "sincrono";
					
					if(strutsBean.serviceBinding != null) {
						switch(strutsBean.serviceBinding) {
						case REST:
							if( strutsBean.protocolFactory.createProtocolConfiguration().isSupportato(strutsBean.serviceBinding, ProfiloDiCollaborazione.ONEWAY)) {
								strutsBean.profcoll = "oneway"; // es. as4
							}
							else {
								strutsBean.profcoll = "sincrono";
							}
							break;
						case SOAP:
						default:
							break;
						}
					}
					
					strutsBean.accordoCooperazione = "-1";
					strutsBean.scadenza= "";
					strutsBean.privato = false;
					if(strutsBean.tipoProtocollo == null){
						strutsBean.tipoProtocollo = apcCore.getProtocolloDefault(request, session, listaTipiProtocollo);
					}
					strutsBean.referente= "";

					if(strutsBean.tipoAccordo!=null){
						if("apc".equals(strutsBean.tipoAccordo)){
							strutsBean.isServizioComposto = false;
						}else if("asc".equals(strutsBean.tipoAccordo)){
							strutsBean.isServizioComposto = true;
						}
					}else{
						strutsBean.isServizioComposto=false;
					}
					if(apcHelper.isShowGestioneWorkflowStatoDocumenti()){
						if(strutsBean.statoPackage==null)
							strutsBean.statoPackage=StatiAccordo.bozza.toString();
					}else{
						strutsBean.statoPackage=StatiAccordo.finale.toString();
					}
					/**if(core.isBackwardCompatibilityAccordo11()){
					//	strutsBean.versione="0";
					//}else{*/
					strutsBean.versione="1";
					
					strutsBean.gruppi = "";
					strutsBean.canaleStato = AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_DEFAULT;
					strutsBean.canale = "";
				}

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

				dati.add(ServletUtils.getDataElementForEditModeFinished());

				// update della configurazione 
				if(strutsBean.tipoAccordo==null || strutsBean.tipoAccordo.equals(ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_PARTE_COMUNE))
					strutsBean.consoleDynamicConfiguration.updateDynamicConfigAccordoServizioParteComune(strutsBean.consoleConfiguration,
						strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
						strutsBean.registryReader, strutsBean.configRegistryReader, idApc);
				else 
					strutsBean.consoleDynamicConfiguration.updateDynamicConfigAccordoServizioComposto(strutsBean.consoleConfiguration,
							strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
							strutsBean.registryReader, strutsBean.configRegistryReader, idApc);

				dati = apcHelper.addAccordiToDati(dati, strutsBean.nome, strutsBean.descr, strutsBean.profcoll, strutsBean.wsdldef, strutsBean.wsdlconc, strutsBean.wsdlserv, strutsBean.wsdlservcorr, strutsBean.wsblconc,strutsBean.wsblserv,strutsBean.wsblservcorr,
						strutsBean.filtrodup, strutsBean.confric, strutsBean.idcoll, strutsBean.idRifRichiesta, strutsBean.consord, strutsBean.scadenza, "0", tipoOp, 
						false, true, strutsBean.referente, strutsBean.versione, providersList, providersListLabel, 
						strutsBean.privato, strutsBean.isServizioComposto, accordiCooperazioneEsistenti, accordiCooperazioneEsistentiLabel, 
						strutsBean.accordoCooperazione, strutsBean.statoPackage, strutsBean.statoPackage, strutsBean.tipoAccordo, strutsBean.validazioneDocumenti, 
						strutsBean.tipoProtocollo, listaTipiProtocollo,false,false,strutsBean.protocolFactory,
						strutsBean.serviceBinding,strutsBean.messageType,strutsBean.interfaceType, strutsBean.gruppi, elencoGruppi,
						strutsBean.nuovaVersione, gestioneNuovaVersioneMin, nuovaVersioneRidefinisciInterfaccia, gestioneNuovaVersioneOldIdApc,
						false, strutsBean.canaleStato, strutsBean.canale, canaleList, gestioneCanaliEnabled);

				// aggiunta campi custom
				dati = apcHelper.addProtocolPropertiesToDatiRegistry(dati, strutsBean.consoleConfiguration,strutsBean.consoleOperationType, strutsBean.protocolProperties);

				pd.setDati(dati);

				ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

				return ServletUtils.getStrutsForwardEditModeInProgress(mapping, AccordiServizioParteComuneCostanti.OBJECT_NAME_APC,
						ForwardParams.ADD());
			}

			boolean visibilitaAccordoCooperazione=false;
			if(!"-".equals(strutsBean.accordoCooperazione) && !"".equals(strutsBean.accordoCooperazione)  && strutsBean.accordoCooperazione!=null){
				AccordoCooperazione ac = acCore.getAccordoCooperazione(Long.parseLong(strutsBean.accordoCooperazione));
				visibilitaAccordoCooperazione=ac.getPrivato()!=null && ac.getPrivato();
			}

			// Controlli sui campi immessi
			boolean isOk = apcHelper.accordiCheckData(tipoOp, strutsBean.nome, strutsBean.descr, strutsBean.profcoll, 
					strutsBean.wsdldef, strutsBean.wsdlconc, strutsBean.wsdlserv, strutsBean.wsdlservcorr, 
					strutsBean.filtrodup, strutsBean.confric, strutsBean.idcoll, strutsBean.idRifRichiesta, strutsBean.consord, 
					strutsBean.scadenza, "0",strutsBean.referente, strutsBean.versione,strutsBean.accordoCooperazione,strutsBean.privato,visibilitaAccordoCooperazione,null,
					strutsBean.wsblconc,strutsBean.wsblserv,strutsBean.wsblservcorr, strutsBean.validazioneDocumenti, strutsBean.tipoProtocollo,null,strutsBean.serviceBinding,strutsBean.messageType,strutsBean.interfaceType,
					showReferente, strutsBean.gruppi, strutsBean.canaleStato, strutsBean.canale, gestioneCanaliEnabled);

			// updateDynamic
			if(isOk) {
				if(strutsBean.tipoAccordo.equals(ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_PARTE_COMUNE))
					strutsBean.consoleDynamicConfiguration.updateDynamicConfigAccordoServizioParteComune(strutsBean.consoleConfiguration,
						strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
						strutsBean.registryReader, strutsBean.configRegistryReader, idApc);
				else 
					strutsBean.consoleDynamicConfiguration.updateDynamicConfigAccordoServizioComposto(strutsBean.consoleConfiguration,
							strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
							strutsBean.registryReader, strutsBean.configRegistryReader, idApc);
			}
			
			// Validazione base dei parametri custom 
			if(isOk){
				try{
					apcHelper.validaProtocolProperties(strutsBean.consoleConfiguration, strutsBean.consoleOperationType, strutsBean.protocolProperties);
				}catch(ProtocolException e){
					ControlStationCore.getLog().error(e.getMessage(),e);
					pd.setMessage(e.getMessage());
					isOk = false;
				}
			}

			// Valido i parametri custom se ho gia' passato tutta la validazione prevista
			if(isOk){
				try{
					idApc = apcHelper.getIDAccordoFromValues(strutsBean.nome, strutsBean.referente, strutsBean.versione, visibilitaAccordoCooperazione);
					//validazione campi dinamici
					if(strutsBean.tipoAccordo.equals(ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_PARTE_COMUNE))
						strutsBean.consoleDynamicConfiguration.validateDynamicConfigAccordoServizioParteComune(strutsBean.consoleConfiguration, strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
								strutsBean.registryReader, strutsBean.configRegistryReader, idApc);
					else 
						strutsBean.consoleDynamicConfiguration.validateDynamicConfigAccordoServizioComposto(strutsBean.consoleConfiguration, strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
								strutsBean.registryReader, strutsBean.configRegistryReader, idApc);
				}catch(ProtocolException e){
					ControlStationCore.getLog().error(e.getMessage(),e);
					pd.setMessage(e.getMessage());
					isOk = false;
				}
			}

			if (!isOk) {

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

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

				dati.add(ServletUtils.getDataElementForEditModeFinished());

				// update della configurazione 
				if(strutsBean.tipoAccordo.equals(ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_PARTE_COMUNE))
					strutsBean.consoleDynamicConfiguration.updateDynamicConfigAccordoServizioParteComune(strutsBean.consoleConfiguration,
						strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
						strutsBean.registryReader, strutsBean.configRegistryReader, idApc);
				else 
					strutsBean.consoleDynamicConfiguration.updateDynamicConfigAccordoServizioComposto(strutsBean.consoleConfiguration,
							strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
							strutsBean.registryReader, strutsBean.configRegistryReader, idApc);

				dati = apcHelper.addAccordiToDati(dati, strutsBean.nome, strutsBean.descr, strutsBean.profcoll, strutsBean.wsdldef, strutsBean.wsdlconc, strutsBean.wsdlserv, strutsBean.wsdlservcorr, strutsBean.wsblconc,strutsBean.wsblserv,strutsBean.wsblservcorr,
						strutsBean.filtrodup, strutsBean.confric, strutsBean.idcoll, strutsBean.idRifRichiesta, strutsBean.consord, strutsBean.scadenza, "0", tipoOp, 
						false, true,strutsBean.referente, strutsBean.versione, providersList, providersListLabel,
						strutsBean.privato, strutsBean.isServizioComposto, accordiCooperazioneEsistenti, accordiCooperazioneEsistentiLabel, 
						strutsBean.accordoCooperazione, strutsBean.statoPackage, strutsBean.statoPackage, strutsBean.tipoAccordo, strutsBean.validazioneDocumenti, 
						strutsBean.tipoProtocollo, listaTipiProtocollo,false,false,strutsBean.protocolFactory,
						strutsBean.serviceBinding,strutsBean.messageType,strutsBean.interfaceType, strutsBean.gruppi, elencoGruppi,
						strutsBean.nuovaVersione, gestioneNuovaVersioneMin, nuovaVersioneRidefinisciInterfaccia, gestioneNuovaVersioneOldIdApc,
						false, strutsBean.canaleStato, strutsBean.canale, canaleList, gestioneCanaliEnabled);

				// aggiunta campi custom
				dati = apcHelper.addProtocolPropertiesToDatiRegistry(dati, strutsBean.consoleConfiguration,strutsBean.consoleOperationType, strutsBean.protocolProperties);

				pd.setDati(dati);

				ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

				return ServletUtils.getStrutsForwardEditModeCheckError(mapping,
						AccordiServizioParteComuneCostanti.OBJECT_NAME_APC, ForwardParams.ADD());
			}
			
			List<Object> objectToCreate = new ArrayList<>();

			AccordoServizioParteComune as = new AccordoServizioParteComune();

			// preparo l'oggetto
			as.setNome(strutsBean.nome);
			as.setDescrizione(strutsBean.descr);

			// profilo collaborazione
			// controllo profilo collaborazione
			strutsBean.profcoll = AccordiServizioParteComuneHelper.convertProfiloCollaborazioneView2DB(strutsBean.profcoll);
			as.setProfiloCollaborazione(ProfiloCollaborazione.toEnumConstant(strutsBean.profcoll));

			FormatoSpecifica formato = apcCore.interfaceType2FormatoSpecifica(strutsBean.interfaceType);
			
			String wsdlconcS = strutsBean.wsdlconc.getValue() != null ? new String(strutsBean.wsdlconc.getValue()) : null; 
			as.setByteWsdlConcettuale(apcCore.getInterfaceAsByteArray(formato, wsdlconcS));
			String wsdldefS = strutsBean.wsdldef.getValue() != null ? new String(strutsBean.wsdldef.getValue()) : null; 
			as.setByteWsdlDefinitorio(apcCore.getInterfaceAsByteArray(formato, wsdldefS));
			String wsdlservS = strutsBean.wsdlserv.getValue() != null ? new String(strutsBean.wsdlserv.getValue()) : null; 
			as.setByteWsdlLogicoErogatore(apcCore.getInterfaceAsByteArray(formato, wsdlservS));
			String wsdlservcorrS = strutsBean.wsdlservcorr.getValue() != null ? new String(strutsBean.wsdlservcorr.getValue()) : null; 
			as.setByteWsdlLogicoFruitore(apcCore.getInterfaceAsByteArray(formato, wsdlservcorrS));

			// Se un utente ha impostato solo il logico erogatore (avviene automaticamente nel caso non venga visualizzato il campo concettuale)
			// imposto lo stesso wsdl anche per il concettuale. Tanto Rappresenta la stessa informazione, ma e' utile per lo stato dell'accordo
			boolean facilityUnicoWSDLInterfacciaStandard = false;
			if(as.getByteWsdlLogicoErogatore()!=null && as.getByteWsdlLogicoFruitore()==null && as.getByteWsdlConcettuale()==null){
				as.setByteWsdlConcettuale(as.getByteWsdlLogicoErogatore());
				facilityUnicoWSDLInterfacciaStandard = true;
			}

			// Conversione Abilitato/Disabilitato
			as.setFiltroDuplicati(StatoFunzionalita.toEnumConstant(AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoView2DB(strutsBean.filtrodup)));
			as.setConfermaRicezione(StatoFunzionalita.toEnumConstant(AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoView2DB(strutsBean.confric)));
			as.setConsegnaInOrdine(StatoFunzionalita.toEnumConstant(AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoView2DB(strutsBean.consord)));
			as.setIdCollaborazione(StatoFunzionalita.toEnumConstant(AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoView2DB(strutsBean.idcoll)));
			as.setIdRiferimentoRichiesta(StatoFunzionalita.toEnumConstant(AccordiServizioParteComuneHelper.convertAbilitatoDisabilitatoView2DB(strutsBean.idRifRichiesta)));
			if ((strutsBean.scadenza != null) && (!"".equals(strutsBean.scadenza)))
				as.setScadenza(strutsBean.scadenza);
			as.setSuperUser(userLogin);
			as.setUtilizzoSenzaAzione(true);// default true
			String wsblconcS = strutsBean.wsblconc.getValue() != null ? new String(strutsBean.wsblconc.getValue()) : null; 
			as.setByteSpecificaConversazioneConcettuale(apcCore.getInterfaceAsByteArray(formato, wsblconcS));
			String wsblservS = strutsBean.wsblserv.getValue() != null ? new String(strutsBean.wsblserv.getValue()) : null;
			as.setByteSpecificaConversazioneErogatore(apcCore.getInterfaceAsByteArray(formato, wsblservS));
			String wsblservcorrS = strutsBean.wsblservcorr.getValue() != null ? new String(strutsBean.wsblservcorr.getValue()) : null;
			as.setByteSpecificaConversazioneFruitore(apcCore.getInterfaceAsByteArray(formato, wsblservcorrS));
			
			// servicebinding / messagetype / formatospecifica
			as.setServiceBinding(apcCore.fromMessageServiceBinding(strutsBean.serviceBinding));
			as.setMessageType(apcCore.fromMessageMessageType(strutsBean.messageType));
			as.setFormatoSpecifica(formato);
			
			if(strutsBean.referente!=null && !"".equals(strutsBean.referente) && !"-".equals(strutsBean.referente)){
				int idRef = 0;
				try {
					idRef = Integer.parseInt(strutsBean.referente);
				} catch (Exception e) {
				}
				if (idRef != 0) {
					int idReferente = Integer.parseInt(strutsBean.referente);
					Soggetto s = soggettiCore.getSoggetto(idReferente);			
					IdSoggetto assr = new IdSoggetto();
					assr.setTipo(s.getTipo());
					assr.setNome(s.getNome());
					as.setSoggettoReferente(assr);
				}
			}else{				
				if(!showReferente) {
					// Recupero Soggetto Default
					IDSoggetto idSoggetto = apcCore.getSoggettoOperativoDefault(userLogin, strutsBean.tipoProtocollo);
					Soggetto s = soggettiCore.getSoggetto(idSoggetto);
					IdSoggetto assr = new IdSoggetto();
					assr.setTipo(s.getTipo());
					assr.setNome(s.getNome());
					as.setSoggettoReferente(assr);
				}
				else {
					as.setSoggettoReferente(null);
				}
			}
			if(strutsBean.versione!=null){
				as.setVersione(Integer.parseInt(strutsBean.versione));
			}
			as.setPrivato(strutsBean.privato ? Boolean.TRUE : Boolean.FALSE);

			if(strutsBean.accordoCooperazione!=null && !"".equals(strutsBean.accordoCooperazione) && !"-".equals(strutsBean.accordoCooperazione)){
				AccordoServizioParteComuneServizioComposto assc = new AccordoServizioParteComuneServizioComposto();
				assc.setIdAccordoCooperazione(Long.parseLong(strutsBean.accordoCooperazione));
				as.setServizioComposto(assc);
			}

			// stato
			as.setStatoPackage(strutsBean.statoPackage);

			// gruppi
			if(StringUtils.isNotEmpty(strutsBean.gruppi)) {
				if(as.getGruppi() == null)
					as.setGruppi(new GruppiAccordo());
			
				List<String> nomiGruppi = Arrays.asList(strutsBean.gruppi.split(","));
				
				for (String nomeGruppo : nomiGruppi) {
					if(!gruppiCore.existsGruppo(nomeGruppo)) {
						Gruppo nuovoGruppo = new Gruppo();
						nuovoGruppo.setNome(nomeGruppo);
						nuovoGruppo.setSuperUser(userLogin);
						objectToCreate.add(nuovoGruppo);
					}
					
					GruppoAccordo gruppoAccordo = new GruppoAccordo();
					gruppoAccordo.setNome(nomeGruppo);
					as.getGruppi().addGruppo(gruppoAccordo );
				}
			}
			
			// canale
			if(gestioneCanaliEnabled) {
				if(AccordiServizioParteComuneCostanti.DEFAULT_VALUE_PARAMETRO_APC_CANALE_STATO_RIDEFINITO.equals(strutsBean.canaleStato)) {
					as.setCanale(strutsBean.canale);
				} else {
					as.setCanale(null);
				}
			} else {
				as.setCanale(null);
			}

			if(strutsBean.nuovaVersione && !nuovaVersioneRidefinisciInterfaccia) {
				IDAccordo idAcc = apcCore.getIdAccordoServizio(gestioneNuovaVersioneOldIdApc);
				AccordoServizioParteComune aspcOld = apcCore.getAccordoServizioFull(idAcc, true); // devo leggere anche gli allegati
				as.setAllegatoList(aspcOld.getAllegatoList());
				as.setSpecificaSemiformaleList(aspcOld.getSpecificaSemiformaleList());
				as.setAzioneList(aspcOld.getAzioneList());
				as.setPortTypeList(aspcOld.getPortTypeList());
				as.setResourceList(aspcOld.getResourceList());
				as.setByteWsdlDefinitorio(aspcOld.getByteWsdlDefinitorio());
				as.setByteWsdlConcettuale(aspcOld.getByteWsdlConcettuale());
				as.setByteWsdlLogicoErogatore(aspcOld.getByteWsdlLogicoErogatore());
				as.setByteWsdlLogicoFruitore(aspcOld.getByteWsdlLogicoFruitore());
				as.setByteSpecificaConversazioneConcettuale(aspcOld.getByteSpecificaConversazioneConcettuale());
				as.setByteSpecificaConversazioneErogatore(aspcOld.getByteSpecificaConversazioneErogatore());
				as.setByteSpecificaConversazioneFruitore(aspcOld.getByteSpecificaConversazioneFruitore());
			}
			

			// Check stato
			if(apcHelper.isShowGestioneWorkflowStatoDocumenti()){

				try{
					boolean utilizzoAzioniDiretteInAccordoAbilitato = apcCore.isShowAccordiColonnaAzioni();
					apcCore.validaStatoAccordoServizio(as, utilizzoAzioniDiretteInAccordoAbilitato, true);
				}catch(ValidazioneStatoPackageException validazioneException){

					// Setto messaggio di errore
					pd.setMessage(validazioneException.toString());

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

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

					dati.add(ServletUtils.getDataElementForEditModeFinished());

					// update della configurazione 
					if(strutsBean.tipoAccordo.equals(ProtocolPropertiesCostanti.PARAMETRO_VALORE_PP_TIPO_ACCORDO_PARTE_COMUNE))
						strutsBean.consoleDynamicConfiguration.updateDynamicConfigAccordoServizioParteComune(strutsBean.consoleConfiguration,
							strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
							strutsBean.registryReader, strutsBean.configRegistryReader, idApc);
					else 
						strutsBean.consoleDynamicConfiguration.updateDynamicConfigAccordoServizioComposto(strutsBean.consoleConfiguration,
								strutsBean.consoleOperationType, apcHelper, strutsBean.protocolProperties, 
								strutsBean.registryReader, strutsBean.configRegistryReader, idApc);

					dati = apcHelper.addAccordiToDati(dati, strutsBean.nome, strutsBean.descr, strutsBean.profcoll, strutsBean.wsdldef, strutsBean.wsdlconc, strutsBean.wsdlserv, strutsBean.wsdlservcorr, strutsBean.wsblconc,strutsBean.wsblserv,strutsBean.wsblservcorr,
							strutsBean.filtrodup, strutsBean.confric, strutsBean.idcoll, strutsBean.idRifRichiesta, strutsBean.consord, strutsBean.scadenza, "0", tipoOp, 
							false, true,strutsBean.referente, strutsBean.versione, providersList, providersListLabel,
							strutsBean.privato, strutsBean.isServizioComposto, accordiCooperazioneEsistenti, accordiCooperazioneEsistentiLabel, 
							strutsBean.accordoCooperazione, strutsBean.statoPackage, strutsBean.statoPackage, strutsBean.tipoAccordo, strutsBean.validazioneDocumenti, 
							strutsBean.tipoProtocollo, listaTipiProtocollo,false,false,strutsBean.protocolFactory,
							strutsBean.serviceBinding,strutsBean.messageType,strutsBean.interfaceType, strutsBean.gruppi, elencoGruppi,
							strutsBean.nuovaVersione, gestioneNuovaVersioneMin, nuovaVersioneRidefinisciInterfaccia, gestioneNuovaVersioneOldIdApc,
							false, strutsBean.canaleStato, strutsBean.canale, canaleList, gestioneCanaliEnabled);

					// aggiunta campi custom
					dati = apcHelper.addProtocolPropertiesToDatiRegistry(dati, strutsBean.consoleConfiguration,strutsBean.consoleOperationType, strutsBean.protocolProperties);

					pd.setDati(dati);

					ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

					return ServletUtils.getStrutsForwardEditModeCheckError(mapping, AccordiServizioParteComuneCostanti.OBJECT_NAME_APC, ForwardParams.ADD());

				}
			}

			// Automapping
			if(!strutsBean.nuovaVersione || nuovaVersioneRidefinisciInterfaccia) {
				AccordiServizioParteComuneUtilities.mapppingAutomaticoInterfaccia(as, apcCore, 
						enableAutoMapping, strutsBean.validazioneDocumenti, enableAutoMappingEstraiXsdSchemiFromWsdlTypes, facilityUnicoWSDLInterfacciaStandard, 
						strutsBean.tipoProtocollo, strutsBean.interfaceType);
			}

			//imposto properties custom
			as.setProtocolPropertyList(ProtocolPropertiesUtils.toProtocolPropertiesRegistry(strutsBean.protocolProperties, strutsBean.consoleOperationType,null));
			
			objectToCreate.add(as);
			// effettuo le operazioni
			apcCore.performCreateOperation(userLogin, apcHelper.smista(), objectToCreate.toArray(new Object[objectToCreate.size()]));
			
			// cancello i file temporanei
			apcHelper.deleteBinaryParameters(strutsBean.wsdlconc,strutsBean.wsdldef,strutsBean.wsdlserv,strutsBean.wsdlservcorr,strutsBean.wsblconc,strutsBean.wsblserv,strutsBean.wsblservcorr);
			apcHelper.deleteBinaryProtocolPropertiesTmpFiles(strutsBean.protocolProperties);

			// Verifico stato
			boolean incomplete = apcHelper.setMessageWarningStatoConsistenzaAccordo(true, as);
			
			// Preparo la lista
			ConsoleSearch ricerca = (ConsoleSearch) ServletUtils.getSearchObjectFromSession(request, session, ConsoleSearch.class);
			if(incomplete || apcCore.isSetSearchAfterAdd()) {
				apcCore.setSearchAfterAdd(Liste.ACCORDI, as.getNome(), request, session, ricerca);
			}
			
			List<AccordoServizioParteComuneSintetico> lista = AccordiServizioParteComuneUtilities.accordiList(apcCore, userLogin, ricerca, strutsBean.tipoAccordo);

			if(isModalitaVistaApiCustom!=null && isModalitaVistaApiCustom.booleanValue()) {
				apcHelper.prepareApiList(lista, ricerca, strutsBean.tipoAccordo); 
				ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);
				return ServletUtils.getStrutsForwardEditModeFinished(mapping, ApiCostanti.OBJECT_NAME_APC_API, ForwardParams.ADD());
			}
			
			apcHelper.prepareAccordiList(lista, ricerca, strutsBean.tipoAccordo);

			ServletUtils.setGeneralAndPageDataIntoSession(request, session, gd, pd);

			return ServletUtils.getStrutsForwardEditModeFinished(mapping, AccordiServizioParteComuneCostanti.OBJECT_NAME_APC, ForwardParams.ADD());

		} catch (Exception e) {
			return ServletUtils.getStrutsForwardError(ControlStationCore.getLog(), e, pd, request, session, gd, mapping, 
					AccordiServizioParteComuneCostanti.OBJECT_NAME_APC, ForwardParams.ADD());
		} 

	}
}