AccordiServizioParteComuneUtilities.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.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.openspcoop2.core.commons.ErrorsHandlerCostant;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDPortType;
import org.openspcoop2.core.id.IDPortTypeAzione;
import org.openspcoop2.core.id.IDResource;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteComuneServizioComposto;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Documento;
import org.openspcoop2.core.registry.Operation;
import org.openspcoop2.core.registry.PortType;
import org.openspcoop2.core.registry.ProtocolProperty;
import org.openspcoop2.core.registry.Resource;
import org.openspcoop2.core.registry.beans.AccordoServizioParteComuneSintetico;
import org.openspcoop2.core.registry.constants.FormatoSpecifica;
import org.openspcoop2.core.registry.constants.RuoliDocumento;
import org.openspcoop2.core.registry.constants.StatiAccordo;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.core.registry.driver.FiltroRicercaOperations;
import org.openspcoop2.core.registry.driver.FiltroRicercaProtocolPropertyRegistry;
import org.openspcoop2.core.registry.driver.FiltroRicercaResources;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.ValidazioneStatoPackageException;
import org.openspcoop2.core.registry.driver.db.IDAccordoDB;
import org.openspcoop2.protocol.engine.constants.Costanti;
import org.openspcoop2.protocol.engine.utils.DBOggettiInUsoUtils;
import org.openspcoop2.protocol.engine.utils.NamingUtils;
import org.openspcoop2.protocol.manifest.constants.InterfaceType;
import org.openspcoop2.web.ctrlstat.core.ConsoleSearch;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaCore;
import org.openspcoop2.web.ctrlstat.servlet.archivi.ArchiviCore;
import org.openspcoop2.web.lib.mvc.Parameter;


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

	public static void findOggettiDaAggiornare(IDAccordo idAccordoOLD, AccordoServizioParteComune as, AccordiServizioParteComuneCore apcCore, List<Object> listOggettiDaAggiornare) throws Exception {
		
		AccordiServizioParteSpecificaCore apsCore = new AccordiServizioParteSpecificaCore(apcCore);
		
		IDAccordoFactory idAccordoFactory = IDAccordoFactory.getInstance();
		
		String newURI = idAccordoFactory.getUriFromAccordo(as);

		// Cerco i servizi in cui devo cambiare la URI dell'accordo
		List<AccordoServizioParteSpecifica> servizi = apsCore.serviziByAccordoFilterList(idAccordoOLD);
		if(servizi!=null){
			while(servizi.size()>0){
				AccordoServizioParteSpecifica s = servizi.remove(0);
				s.setAccordoServizioParteComune(newURI);
				listOggettiDaAggiornare.add(s);
			}
		}
		
		if(Costanti.MODIPA_PROTOCOL_NAME.equals(idAccordoOLD.getSoggettoReferente().getTipo())) {
			
			String oldURI = idAccordoFactory.getUriFromIDAccordo(idAccordoOLD);
			
			Map<String, AccordoServizioParteComune> map = new HashMap<String, AccordoServizioParteComune>();
			
			if(org.openspcoop2.core.registry.constants.ServiceBinding.REST.equals(as.getServiceBinding())) {
				FiltroRicercaResources filtroRicerca = new FiltroRicercaResources();
				FiltroRicercaProtocolPropertyRegistry filtroRPP = new FiltroRicercaProtocolPropertyRegistry();
				filtroRPP.setName(org.openspcoop2.protocol.engine.constants.Costanti.MODIPA_PROFILO_INTERAZIONE_ASINCRONA_API_RICHIESTA_CORRELATA);
				filtroRPP.setValueAsString(oldURI);
				filtroRicerca.addProtocolPropertyResource(filtroRPP);
				List<IDResource> list = null;
				try {
					list = apcCore.getAllIdResource(filtroRicerca);
				}catch(DriverRegistroServiziNotFound notFound) {}
				if(list!=null && !list.isEmpty()) {
					for (IDResource idResource : list) {
						
						AccordoServizioParteComune aspc = null;
						String uri = idAccordoFactory.getUriFromIDAccordo(idResource.getIdAccordo());
						boolean forceAdd = false;
						if(map.containsKey(uri)) {
							aspc = map.remove(uri);
							forceAdd = true;
						}
						else {
							if(idResource.getIdAccordo().equals(idAccordoOLD)) {
								// è quello che sto modificando
								aspc = as;
							}
							else {
								aspc = apcCore.getAccordoServizioFull(idResource.getIdAccordo());
							}
						}
						boolean find = false;
						if(aspc.sizeResourceList()>0) {
							for (Resource res : aspc.getResourceList()) {
								if(res.getNome().equals(idResource.getNome())) {
									if(res.sizeProtocolPropertyList()>0) {
										for (ProtocolProperty pp : res.getProtocolPropertyList()) {
											if(org.openspcoop2.protocol.engine.constants.Costanti.MODIPA_PROFILO_INTERAZIONE_ASINCRONA_API_RICHIESTA_CORRELATA.equals(pp.getName())) {
												pp.setValue(newURI);
												find = true;
												break;
											}
										}
									}
									break;
								}
							}
						}
						if((!idResource.getIdAccordo().equals(idAccordoOLD)) && (forceAdd || find)) {
							map.put(uri, aspc);
						}
					}
				}
			}
			else {
				FiltroRicercaOperations filtroRicerca = new FiltroRicercaOperations();
				FiltroRicercaProtocolPropertyRegistry filtroRPP = new FiltroRicercaProtocolPropertyRegistry();
				filtroRPP.setName(org.openspcoop2.protocol.engine.constants.Costanti.MODIPA_PROFILO_INTERAZIONE_ASINCRONA_API_RICHIESTA_CORRELATA);
				filtroRPP.setValueAsString(oldURI);
				filtroRicerca.addProtocolPropertyAzione(filtroRPP);
				List<IDPortTypeAzione> list = null;
				try {
					list = apcCore.getAllIdOperation(filtroRicerca);
				}catch(DriverRegistroServiziNotFound notFound) {}
				if(list!=null && !list.isEmpty()) {
					for (IDPortTypeAzione idAzione : list) {
						
						AccordoServizioParteComune aspc = null;
						String uri = idAccordoFactory.getUriFromIDAccordo(idAzione.getIdPortType().getIdAccordo());
						boolean forceAdd = false;
						if(map.containsKey(uri)) {
							aspc = map.remove(uri);
							forceAdd = true;
						}
						else {
							if(idAzione.getIdPortType().getIdAccordo().equals(idAccordoOLD)) {
								// è quello che sto modificando
								aspc = as;
							}
							else {
								aspc = apcCore.getAccordoServizioFull(idAzione.getIdPortType().getIdAccordo());
							}
						}
						boolean find = false;
						if(aspc.sizePortTypeList()>0) {
							for (PortType portType : aspc.getPortTypeList()) {
								if(portType.getNome().contentEquals(idAzione.getIdPortType().getNome())) {
									if(portType.sizeAzioneList()>0) {
										for (Operation op : portType.getAzioneList()) {
											if(op.getNome().equals(idAzione.getNome())) {
												if(op.sizeProtocolPropertyList()>0) {
													for (ProtocolProperty pp : op.getProtocolPropertyList()) {
														if(org.openspcoop2.protocol.engine.constants.Costanti.MODIPA_PROFILO_INTERAZIONE_ASINCRONA_API_RICHIESTA_CORRELATA.equals(pp.getName())) {
															pp.setValue(newURI);
															find = true;
															break;
														}
													}
												}
												break;
											}
										}
									}
									break;
								}
							}
						}
						if((!idAzione.getIdPortType().getIdAccordo().equals(idAccordoOLD)) && (forceAdd || find)) {
							map.put(uri, aspc);
						}
						
					}
				}
			}
			
			if(!map.isEmpty()) {
				listOggettiDaAggiornare.addAll( map.values() );
			}
			
		}
	}
	
	public static boolean deleteAccordoServizioParteComune(AccordoServizioParteComune as, String userLogin, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper, StringBuilder inUsoMessage, String newLine) throws Exception {
		
		HashMap<ErrorsHandlerCostant, List<String>> whereIsInUso = new HashMap<ErrorsHandlerCostant, List<String>>();
		
		IDAccordo idAccordo = IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as);

		boolean normalizeObjectIds = !apcHelper.isModalitaCompleta();
		if (apcCore.isAccordoInUso(as, whereIsInUso, normalizeObjectIds)) {// accordo in uso
			inUsoMessage.append(DBOggettiInUsoUtils.toString(idAccordo, whereIsInUso, true, newLine, normalizeObjectIds));
			inUsoMessage.append(newLine);
		} else {// accordo non in uso
			apcCore.performDeleteOperation(userLogin, apcHelper.smista(), as);
			return true;
		}
		
		return false;
	}
	
	public static boolean deleteResource(AccordoServizioParteComune as, IDResource idResource, String userLogin, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper, StringBuilder inUsoMessage, String newLine) throws Exception {
		HashMap<ErrorsHandlerCostant, List<String>> whereIsInUso = new HashMap<ErrorsHandlerCostant, List<String>>();
		boolean normalizeObjectIds = !apcHelper.isModalitaCompleta();
		boolean risorsaInUso = apcCore.isRisorsaInUso(idResource,whereIsInUso,normalizeObjectIds);
		
		boolean modificaAS_effettuata = false;
		
		if (risorsaInUso) {
			
			// traduco nomeRisorsa in path
			String methodPath = null;
			for (int j = 0; j < as.sizeResourceList(); j++) {
				Resource risorsa = as.getResource(j);
				if (idResource.getNome().equals(risorsa.getNome())) {
					methodPath = NamingUtils.getLabelResource(risorsa);
					break;
				}
			}
			if(methodPath==null) {
				methodPath = idResource.getNome();
			}
			
			inUsoMessage.append(DBOggettiInUsoUtils.toString(idResource, methodPath, whereIsInUso, true, newLine));
			inUsoMessage.append(newLine);

		} else {
			// Effettuo eliminazione
			for (int j = 0; j < as.sizeResourceList(); j++) {
				Resource risorsa = as.getResource(j);
				if (idResource.getNome().equals(risorsa.getNome())) {
					modificaAS_effettuata = true;
					as.removeResource(j);
					break;
				}
			}
		}
		
		return modificaAS_effettuata;
	}
	
	public static void deleteAccordoServizioParteComuneRisorse(AccordoServizioParteComune as, String userLogin, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper, 
			StringBuilder inUsoMessage, String newLine, List<String> resourcesToRemove) throws Exception {

		boolean modificaAS_effettuata = false;
		
		IDAccordo idAccordo = IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as);
				
		for (int i = 0; i < resourcesToRemove.size(); i++) {
			String nomeRisorsa = resourcesToRemove.get(i);
			IDResource idRisorsa = new IDResource();
			idRisorsa.setNome(nomeRisorsa);
			idRisorsa.setIdAccordo(idAccordo);
			
			boolean modificato = AccordiServizioParteComuneUtilities.deleteResource(as, idRisorsa, userLogin, apcCore, apcHelper, inUsoMessage, newLine);
			if(modificato) {
				modificaAS_effettuata = true;
			}
			
		}// chiudo for
		if(modificaAS_effettuata) {
			apcCore.performUpdateOperation(userLogin, apcHelper.smista(), as);
		}
	}
	
	public static boolean deletePortType(AccordoServizioParteComune as, IDPortType idPortType, String userLogin, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper, StringBuilder inUsoMessage, String newLine) throws Exception {
		HashMap<ErrorsHandlerCostant, List<String>> whereIsInUso = new HashMap<ErrorsHandlerCostant, List<String>>();
		boolean normalizeObjectIds = !apcHelper.isModalitaCompleta();
		boolean portTypeInUso = apcCore.isPortTypeInUso(idPortType,whereIsInUso,normalizeObjectIds);
		
		boolean modificaAS_effettuata = false;
		
		if (portTypeInUso) {
			inUsoMessage.append(DBOggettiInUsoUtils.toString(idPortType, whereIsInUso, true, newLine));
			inUsoMessage.append(newLine);

		} else {
			// Effettuo eliminazione
			for (int j = 0; j < as.sizePortTypeList(); j++) {
				PortType pt = as.getPortType(j);
				if (idPortType.getNome().equals(pt.getNome())) {
					modificaAS_effettuata = true;
					as.removePortType(j);
					break;
				}
			}
		}
		
		return modificaAS_effettuata;
	}
	
	public static void deleteAccordoServizioParteComunePortTypes(AccordoServizioParteComune as, String userLogin, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper, 
			StringBuilder inUsoMessage, String newLine, List<String> ptsToRemove) throws Exception {
		
		boolean modificaAS_effettuata = false;
		
		IDAccordo idAccordo = IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as);
				
		for (int i = 0; i < ptsToRemove.size(); i++) {
			String nomePT = ptsToRemove.get(i);
			
			IDPortType idPT = new IDPortType();
			idPT.setNome(nomePT);
			idPT.setIdAccordo(idAccordo);
						
			boolean modificato = AccordiServizioParteComuneUtilities.deletePortType(as, idPT, userLogin, apcCore, apcHelper, inUsoMessage, newLine);
			if(modificato) {
				modificaAS_effettuata = true;
			}
			
		}// chiudo for
		if(modificaAS_effettuata) {
			apcCore.performUpdateOperation(userLogin, apcHelper.smista(), as);
		}
		
	}
	
	public static boolean deleteOperazione(PortType pt, IDPortTypeAzione idOperazione, String userLogin, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper, StringBuilder inUsoMessage, String newLine) throws Exception {
		HashMap<ErrorsHandlerCostant, List<String>> whereIsInUso = new HashMap<ErrorsHandlerCostant, List<String>>();
		boolean normalizeObjectIds = !apcHelper.isModalitaCompleta();
		boolean operazioneInUso = apcCore.isOperazioneInUso(idOperazione,whereIsInUso,normalizeObjectIds);
		
		boolean modificaAS_effettuata = false;
		
		if (operazioneInUso) {
			inUsoMessage.append(DBOggettiInUsoUtils.toString(idOperazione, whereIsInUso, true, newLine));
			inUsoMessage.append(newLine);

		} else {
			// Effettuo eliminazione
			for (int j = 0; j < pt.sizeAzioneList(); j++) {
				Operation op = pt.getAzione(j);
				if (idOperazione.getNome().equals(op.getNome())) {
					modificaAS_effettuata = true;
					pt.removeAzione(j);
					break;
				}
			}
		}
		
		return modificaAS_effettuata;
	}
	
	
	public static void deleteAccordoServizioParteComuneOperations(AccordoServizioParteComune as, String userLogin, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper, 
			StringBuilder inUsoMessage, String newLine, PortType pt, List<String> optsToRemove) throws Exception {
	
		boolean modificaAS_effettuata = false;
		
		IDAccordo idAccordo = IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as);
		IDPortType idPortType = new IDPortType();
		idPortType.setNome(pt.getNome());
		idPortType.setIdAccordo(idAccordo);
		
		for (int i = 0; i < optsToRemove.size(); i++) {
			String nomeop = optsToRemove.get(i);
			
			IDPortTypeAzione idOperazione = new IDPortTypeAzione();
			idOperazione.setNome(nomeop);
			idOperazione.setIdPortType(idPortType);
			
			boolean modificato = AccordiServizioParteComuneUtilities.deleteOperazione(pt, idOperazione, userLogin, apcCore, apcHelper, inUsoMessage, newLine);
			if(modificato) {
				modificaAS_effettuata = true;
			}
			
		}// chiudo for
		if(modificaAS_effettuata) {
			apcCore.performUpdateOperation(userLogin, apcHelper.smista(), pt);
		}
				
	}
	
	@SuppressWarnings("incomplete-switch")
	public static void updateAccordoServizioParteComuneAllegati(AccordoServizioParteComune as,Documento doc, Documento docNew) {
		switch (RuoliDocumento.valueOf(doc.getRuolo())) {
			case allegato:
				//rimuovo il vecchio doc dalla lista
				for (int i = 0; i < as.sizeAllegatoList(); i++) {
					Documento documento = as.getAllegato(i);						
					if(documento.getId().equals(doc.getId()))
						as.removeAllegato(i);
				}
				//aggiungo il nuovo
				as.addAllegato(docNew);
				
				break;
	
			case specificaSemiformale:
				
				for (int i = 0; i < as.sizeSpecificaSemiformaleList(); i++) {
					Documento documento = as.getSpecificaSemiformale(i);						
					if(documento.getId().equals(doc.getId())){
						as.removeSpecificaSemiformale(i);
						break;
					}
				}
				//aggiungo il nuovo
				as.addSpecificaSemiformale(docNew);
				break;
				
			case specificaCoordinamento:
				AccordoServizioParteComuneServizioComposto assc = as.getServizioComposto();
				for (int i = 0; i < assc.sizeSpecificaCoordinamentoList(); i++) {
					Documento documento = assc.getSpecificaCoordinamento(i);						
					if(documento.getId().equals(doc.getId())){
						assc.removeSpecificaCoordinamento(i);
						break;
					}
				}
				assc.addSpecificaCoordinamento(docNew);
				as.setServizioComposto(assc);
				break;
		}
	}
	
	public static void deleteAccordoServizioParteComuneAllegati(AccordoServizioParteComune as, String userLogin, 
			AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper, 
			List<Long> idAllegati) throws Exception {
		
		ArchiviCore archiviCore = new ArchiviCore(apcCore);
		
		for (int i = 0; i < idAllegati.size(); i++) {
			long idAllegato = idAllegati.get(i);
			
			Documento doc = archiviCore.getDocumento(idAllegato, false);
			
			switch (RuoliDocumento.valueOf(doc.getRuolo())) {
				case allegato:
					//rimuovo il vecchio doc dalla lista
					for (int j = 0; j < as.sizeAllegatoList(); j++) {
						Documento documento = as.getAllegato(j);						
						if(documento.getFile().equals(doc.getFile()))
							as.removeAllegato(j);
					}
					
					break;

				case specificaSemiformale:
					
					for (int j = 0; j < as.sizeSpecificaSemiformaleList(); j++) {
						Documento documento = as.getSpecificaSemiformale(j);						
						if(documento.getFile().equals(doc.getFile()))
							as.removeSpecificaSemiformale(j);
					}
					break;
				
				case specificaCoordinamento:
					if(as.getServizioComposto()!=null){
						for (int j = 0; j < as.getServizioComposto().sizeSpecificaCoordinamentoList(); j++) {
							Documento documento = as.getServizioComposto().getSpecificaCoordinamento(j);						
							if(documento.getFile().equals(doc.getFile()))
								as.getServizioComposto().removeSpecificaCoordinamento(j);
						}
					}
					break;
				case specificaLivelloServizio:
					break;
				case specificaSicurezza:
					break;
			}
			
		}

		// effettuo le operazioni
		apcCore.performUpdateOperation(userLogin, apcHelper.smista(), as);
		
	}
	
	public static String getTerminologiaAccordoServizio(String tipo){
		String termine = null;
		if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE.equals(tipo)){
			termine=AccordiServizioParteComuneCostanti.LABEL_APC;
		}
		else{
			termine=AccordiServizioParteComuneCostanti.LABEL_ASC;
		}
		return termine;
	}

	@Deprecated
	public static String getParametroAccordoServizio(String tipo,String appendChar){
		String parametro = "";
		if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE.equals(tipo)){
			parametro = appendChar+AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO+"="+AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE;
		}
		else{
			parametro = appendChar+AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO+"="+AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_SERVIZIO_COMPOSTO;
		}
		return parametro;
	}
	public static Parameter getParametroAccordoServizio(AccordoServizioParteComune apc){
		if(apc.getServizioComposto()!=null){
			return new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO,
					AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_SERVIZIO_COMPOSTO);
		}else
		{
			return new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO,
					AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE);
		}
	}
	public static Parameter getParametroAccordoServizio(AccordoServizioParteComuneSintetico apc){
		if(apc.getServizioComposto()!=null){
			return new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO,
					AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_SERVIZIO_COMPOSTO);
		}else
		{
			return new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO,
					AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE);
		}
	}

	public static Parameter getParametroAccordoServizio(String tipo){
		if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE.equals(tipo)){
			return new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO,
					AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE);
		}
		else{
			return new Parameter(AccordiServizioParteComuneCostanti.PARAMETRO_APC_TIPO_ACCORDO,
					AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_SERVIZIO_COMPOSTO);
		}
	}

	public static boolean showInformazioniServiziComponenti(String tipo){
		boolean value = true;
		if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE.equals(tipo)){
			value = false;
		}
		return value;
	}

	public static boolean showFlagServizioComposto(){
		return false;
	}

	public static List<AccordoServizioParteComuneSintetico> accordiList(AccordiServizioParteComuneCore core,String userLogin,ConsoleSearch ricerca,String tipoAccordo) throws DriverRegistroServiziException{
		List<AccordoServizioParteComuneSintetico> lista = null;
		if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_PARTE_COMUNE.equals(tipoAccordo)){
			if(core.isVisioneOggettiGlobale(userLogin)){
				lista = core.accordiServizioParteComuneList(null, ricerca);
			}else{
				lista = core.accordiServizioParteComuneList(userLogin, ricerca);
			}
		}
		else if(AccordiServizioParteComuneCostanti.PARAMETRO_VALORE_APC_TIPO_ACCORDO_SERVIZIO_COMPOSTO.equals(tipoAccordo)){
			if(core.isVisioneOggettiGlobale(userLogin)){
				lista = core.accordiServizioCompostiList(null, ricerca);
			}else{
				lista = core.accordiServizioCompostiList(userLogin, ricerca);
			}
		}
		else {
			if(core.isVisioneOggettiGlobale(userLogin)){
				lista = core.accordiList(null, ricerca);
			}else{
				lista = core.accordiList(userLogin, ricerca);
			}
		}
		return lista;
	}

	public static List<AccordoServizioParteComuneSintetico> accordiListFromPermessiUtente(AccordiServizioParteComuneCore core,String userLogin,ConsoleSearch ricerca,boolean[] permessiUtente) throws DriverRegistroServiziException{
		List<AccordoServizioParteComuneSintetico> lista = null;
		if(permessiUtente != null){
			if(permessiUtente[0] && !permessiUtente[1]){
				if(core.isVisioneOggettiGlobale(userLogin)){
					lista = core.accordiServizioParteComuneList(null, ricerca);
				}else{
					lista = core.accordiServizioParteComuneList(userLogin, ricerca);
				}

				return lista;
			}

			if(!permessiUtente[0] && permessiUtente[1]){
				if(core.isVisioneOggettiGlobale(userLogin)){
					lista = core.accordiServizioCompostiList(null, ricerca);
				}else{
					lista = core.accordiServizioCompostiList(userLogin, ricerca);
				}

				return lista;
			}
		}


		if(core.isVisioneOggettiGlobale(userLogin)){
			lista = core.accordiList(null, ricerca);
		}else{
			lista = core.accordiList(userLogin, ricerca);
		}

		return lista;
	}
	
	public static List<IDAccordoDB> idAccordiListFromPermessiUtente(AccordiServizioParteComuneCore core,String userLogin,ConsoleSearch ricerca,boolean[] permessiUtente, 
			boolean soloAccordiConsistentiRest, boolean soloAccordiConsistentiSoap) throws DriverRegistroServiziException{
		List<IDAccordoDB> lista = null;
		if(permessiUtente != null){
			if(permessiUtente[0] && !permessiUtente[1]){
				if(core.isVisioneOggettiGlobale(userLogin)){
					lista = core.idAccordiServizioParteComuneList(null, ricerca, 
							soloAccordiConsistentiRest, soloAccordiConsistentiSoap);
				}else{
					lista = core.idAccordiServizioParteComuneList(userLogin, ricerca, 
							soloAccordiConsistentiRest, soloAccordiConsistentiSoap);
				}

				return lista;
			}

			if(!permessiUtente[0] && permessiUtente[1]){
				if(core.isVisioneOggettiGlobale(userLogin)){
					lista = core.idAccordiServizioCompostiList(null, ricerca, 
							soloAccordiConsistentiRest, soloAccordiConsistentiSoap);
				}else{
					lista = core.idAccordiServizioCompostiList(userLogin, ricerca, 
							soloAccordiConsistentiRest, soloAccordiConsistentiSoap);
				}

				return lista;
			}
		}


		if(core.isVisioneOggettiGlobale(userLogin)){
			lista = core.idAccordiList(null, ricerca, 
					soloAccordiConsistentiRest, soloAccordiConsistentiSoap);
		}else{
			lista = core.idAccordiList(userLogin, ricerca, 
					soloAccordiConsistentiRest, soloAccordiConsistentiSoap);
		}

		return lista;
	}

	public static ArrayList<String> selectPortTypeAsincroni(AccordoServizioParteComune as,String profcollop,String nomept){
		// Recupero i servizi dell'accordo con lo stesso profilo di collaborazione
		ArrayList<String> servCorrUniche = null;
		//List<PortType> getServCorrList = core.accordiPorttypeList(idInt, null, new Search(true));
		List<PortType> getServCorrList = new ArrayList<PortType>();
		for(int k=0;k<as.sizePortTypeList();k++){
			getServCorrList.add(as.getPortType(k));
		}

		if (!getServCorrList.isEmpty()) {
			servCorrUniche = new ArrayList<>();
			servCorrUniche.add("-");
			for (Iterator<PortType> iterator = getServCorrList.iterator(); iterator.hasNext();) {
				PortType myPT = iterator.next();
				// Devono possedere almeno un'azione
				if(myPT.sizeAzioneList()<=0)
					continue;
				// Devono possedere almeno un'azione con profilo di collaborazione uguale a quello selezionato 
				List<Operation> opList = new ArrayList<>();
				for(int j=0; j<myPT.sizeAzioneList();j++){
					Operation op = myPT.getAzione(j);
					// ridefinito sull'azione
					if(AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO.equals(op.getProfAzione()) && 
							(op.getProfiloCollaborazione()!=null && op.getProfiloCollaborazione().equals(profcollop))
							){
						opList.add(op);
					}
					// ereditato dal port type
					else if (AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_DEFAULT.equals(op.getProfAzione()) && 
							AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO.equals(myPT.getProfiloPT()) && 
							(myPT.getProfiloCollaborazione()!=null && myPT.getProfiloCollaborazione().equals(profcollop))
							){
						opList.add(op);
					}
					// ereditato dall'accordo di servizio
					else if (AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_DEFAULT.equals(op.getProfAzione()) && 
							AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_DEFAULT.equals(myPT.getProfiloPT()) && 
							(as.getProfiloCollaborazione()!=null && as.getProfiloCollaborazione().equals(profcollop))
							){
						opList.add(op);
					}
					// profilo non matcha quello atteso
					else{
						continue;
					}
				}
				if(opList.size()<=0){
					continue;
				}
				if (!nomept.equals(myPT.getNome())) {
					servCorrUniche.add(myPT.getNome());
				}
			}
		}

		if (servCorrUniche != null && servCorrUniche.size() > 0)
			return servCorrUniche;
		else
			return null;
	}

	public static Map<String, List<Operation>> selectPortTypeOperationsListAsincrone(AccordoServizioParteComune as,String profcollop,String nomept){
		//List<PortType> getServCorrList = core.accordiPorttypeList(idInt, null, new Search(true));
		List<PortType> getServCorrList = new ArrayList<PortType>();
		for(int k=0;k<as.sizePortTypeList();k++){
			getServCorrList.add(as.getPortType(k));
		}
		Map<String, List<Operation>> operationsListSelezionate = new HashMap<>();

		if (!getServCorrList.isEmpty()) {
			for (Iterator<PortType> iterator = getServCorrList.iterator(); iterator.hasNext();) {
				PortType myPT = iterator.next();
				// Devono possedere almeno un'azione
				if(myPT.sizeAzioneList()<=0)
					continue;
				// Devono possedere almeno un'azione con profilo di collaborazione uguale a quello selezionato 
				List<Operation> opList = new ArrayList<>();
				for(int j=0; j<myPT.sizeAzioneList();j++){
					Operation op = myPT.getAzione(j);
					// ridefinito sull'azione
					if(AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO.equals(op.getProfAzione()) && 
							(op.getProfiloCollaborazione()!=null && op.getProfiloCollaborazione().equals(profcollop))
							){
						opList.add(op);
					}
					// ereditato dal port type
					else if (AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_DEFAULT.equals(op.getProfAzione()) && 
							AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO.equals(myPT.getProfiloPT()) && 
							(myPT.getProfiloCollaborazione()!=null && myPT.getProfiloCollaborazione().equals(profcollop))
							){
						opList.add(op);
					}
					// ereditato dall'accordo di servizio
					else if (AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_DEFAULT.equals(op.getProfAzione()) && 
							AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_DEFAULT.equals(myPT.getProfiloPT()) &&
							(as.getProfiloCollaborazione()!=null && as.getProfiloCollaborazione().equals(profcollop))
							){
						opList.add(op);
					}
					// profilo non matcha quello atteso
					else{
						continue;
					}
				}
				if(opList.size()<=0){
					continue;
				}
				if (!nomept.equals(myPT.getNome())) {
					operationsListSelezionate.put(myPT.getNome(), opList);
				}
				else{
					operationsListSelezionate.put("-", opList);
				}
			}
		}

		return operationsListSelezionate;
	}

	public static ArrayList<String> selectOperationAsincrone(AccordoServizioParteComune as,String servcorr,String profProtocollo,
			String profcollop,PortType pt,String nomeop,AccordiServizioParteComuneCore core, Map<String, List<Operation>> operationsListSelezionate)throws DriverRegistroServiziException{
		// Se è stato selezionato un servizio,
		// recupero le azioni del servizio
		// che non sono già state correlate
		//
		// Se non è stato selezionato un servizio:
		// - se il profilo dell'azione è
		//   asincronoAsimmetrico, recupero le
		//   azioni del servizio con profilo
		//   asincronoAsimmetrico che non sono già
		//   state correlate
		// - se il profilo dell'azione è
		//   asincronoSimmetrico, non permetto
		//   di scegliere un'azione correlata
		ArrayList<String> aziCorrUniche = null;
		List<Operation> getAziCorrList = null;
		PortType ptSel = null;
		if (!servcorr.equals("-")) {
			// Prendo il servizio selezionato
			for (int j = 0; j < as.sizePortTypeList(); j++) {
				ptSel = as.getPortType(j);
				if (servcorr.equals(ptSel.getNome()))
					break;
			}
			//getAziCorrList = core.accordiPorttypeOperationList(ptSel.getId().intValue(), ptSel.getProfiloCollaborazione(), new Search(true));*/
			getAziCorrList = operationsListSelezionate.get(servcorr);
		} else {
			
			boolean calcolaLista = false;
			if(AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO.equals(profProtocollo) && profcollop.equals("asincronoAsimmetrico")) {
				calcolaLista = true;
			}
			else if(AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_DEFAULT.contentEquals(profProtocollo)) {
				if(AccordiServizioParteComuneCostanti.INFORMAZIONI_PROTOCOLLO_MODALITA_RIDEFINITO.equals(pt.getProfiloPT())) {
					if(pt.getProfiloCollaborazione()!=null) {
						calcolaLista = "asincronoAsimmetrico".equals(pt.getProfiloCollaborazione().getValue());
					}
				}
				else {
					if(as.getProfiloCollaborazione()!=null) {
						calcolaLista = "asincronoAsimmetrico".equals(as.getProfiloCollaborazione().getValue());
					}
				}
			}
			if (calcolaLista){
				//getAziCorrList = core.accordiPorttypeOperationList(pt.getId().intValue(), "asincronoAsimmetrico", new Search(true));
				getAziCorrList = operationsListSelezionate.get(servcorr);
				ptSel = pt;
			}
		}

		if (getAziCorrList != null && getAziCorrList.size() > 0) {
			aziCorrUniche = new ArrayList<>();
			aziCorrUniche.add("-");
			for (Iterator<Operation> iterator = getAziCorrList.iterator(); iterator.hasNext();) {
				Operation operation = iterator.next();
				// Se sto utilizzando lo stesso port type, non devo inserire le azioni con il mio nome 
				if (servcorr.equals("-") && nomeop.equals(operation.getNome())) {
					continue;
				}
				// Non devo inserire le azioni gia correlate une alle altre.
				// Devo quindi verificare se l'azione suddetta 'operation.getNome' risulta gia' correlata, oppure e' utilizzata come correlata
				if (ptSel!=null && !core.isOperationCorrelata(ptSel.getNome(), ptSel.getId(), operation.getNome(), operation.getId())) {
					aziCorrUniche.add(operation.getNome());
				}
			}
		}

		if (aziCorrUniche != null && aziCorrUniche.size() > 0)
			return aziCorrUniche;
		else
			return null;
	}

	public static void mapppingAutomaticoInterfaccia(AccordoServizioParteComune as, AccordiServizioParteComuneCore apcCore,
			boolean enableAutoMapping, boolean validazioneDocumenti, boolean enableAutoMapping_estraiXsdSchemiFromWsdlTypes, boolean facilityUnicoWSDL_interfacciaStandard,
			String tipoProtocollo, 
			InterfaceType interfaceType) throws Exception{
		if(as.getByteWsdlConcettuale() != null || as.getByteWsdlLogicoErogatore() != null || as.getByteWsdlLogicoFruitore() != null) {
			apcCore.mappingAutomatico(tipoProtocollo, as, validazioneDocumenti);
			if(enableAutoMapping_estraiXsdSchemiFromWsdlTypes && InterfaceType.WSDL_11.equals(interfaceType)){
				Map<String, byte[]> schemiAggiuntiInQuestaOperazione = new HashMap<String, byte[]>();
				if(as.getByteWsdlConcettuale() != null){ 
					apcCore.estraiSchemiFromWSDLTypesAsAllegati(as, as.getByteWsdlConcettuale(),AccordiServizioParteComuneCostanti.TIPO_WSDL_CONCETTUALE, schemiAggiuntiInQuestaOperazione);
				}
				if(facilityUnicoWSDL_interfacciaStandard){
					// è stato utilizzato il concettuale. Lo riporto nel logico
					if(as.getByteWsdlConcettuale()!=null){
						as.setByteWsdlLogicoErogatore(as.getByteWsdlConcettuale());
					}
				}
				else{
					if(as.getByteWsdlLogicoErogatore() != null){
						apcCore.estraiSchemiFromWSDLTypesAsAllegati(as, as.getByteWsdlLogicoErogatore(),AccordiServizioParteComuneCostanti.TIPO_WSDL_EROGATORE, schemiAggiuntiInQuestaOperazione);
					}
					if(as.getByteWsdlLogicoFruitore() != null){
						apcCore.estraiSchemiFromWSDLTypesAsAllegati(as, as.getByteWsdlLogicoFruitore(),AccordiServizioParteComuneCostanti.TIPO_WSDL_FRUITORE, schemiAggiuntiInQuestaOperazione);
					}
				}
			}
			try{
				// Se ho fatto il mapping controllo la validita' di quanto prodotto
				as.setStatoPackage(StatiAccordo.operativo.toString());
				boolean utilizzoAzioniDiretteInAccordoAbilitato = apcCore.isShowAccordiColonnaAzioni();
				apcCore.validaStatoAccordoServizio(as, utilizzoAzioniDiretteInAccordoAbilitato, false);
			}catch(ValidazioneStatoPackageException validazioneException){
				// Se l'automapping non ha prodotto ne porttype ne operatin rimetto lo stato a bozza
				as.setStatoPackage(StatiAccordo.bozza.toString());
			}
		}
	}
	
	public static boolean createPortTypeOperation(boolean enableAutoMapping, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper,
			AccordoServizioParteComune as, PortType pt, String userLogin) throws Exception{
		boolean updateAccordo = false;
		try{
			if(enableAutoMapping) {
				if(StatiAccordo.bozza.toString().equals(as.getStatoPackage())) {
					// Se ho aggiunto la prima operazione
					if(pt.sizeAzioneList()==1) {
						as.setStatoPackage(StatiAccordo.operativo.toString());
						boolean utilizzoAzioniDiretteInAccordoAbilitato = apcCore.isShowAccordiColonnaAzioni();
						apcCore.validaStatoAccordoServizio(as, utilizzoAzioniDiretteInAccordoAbilitato, false);
						updateAccordo = true;
					}
				}
			}
		}catch(ValidazioneStatoPackageException validazioneException){
		}
		
		if(updateAccordo) {			
			// effettuo le operazioni
			apcCore.performUpdateOperation(userLogin, apcHelper.smista(), as);			
		}		
		else {				
			// effettuo le operazioni
			apcCore.performUpdateOperation(userLogin, apcHelper.smista(), pt);				
		}
		return updateAccordo;
	}
	
	public static void createResource(boolean enableAutoMapping, AccordiServizioParteComuneCore apcCore, AccordiServizioParteComuneHelper apcHelper,
			AccordoServizioParteComune as, String userLogin) throws Exception{
	
		try{
			if(enableAutoMapping) {
				if(StatiAccordo.bozza.toString().equals(as.getStatoPackage())) {
					// Se ho aggiunto la prima risorsa
					if(as.sizeResourceList()==1) {
						as.setStatoPackage(StatiAccordo.operativo.toString());
						boolean utilizzoAzioniDiretteInAccordoAbilitato = apcCore.isShowAccordiColonnaAzioni();
						apcCore.validaStatoAccordoServizio(as, utilizzoAzioniDiretteInAccordoAbilitato, false);
					}
				}
			}
		}catch(ValidazioneStatoPackageException validazioneException){
			// Se l'automapping non ha prodotto ne porttype ne operatin rimetto lo stato a bozza
			as.setStatoPackage(StatiAccordo.bozza.toString());
		}
		
		// effettuo le operazioni
		apcCore.performUpdateOperation(userLogin, apcHelper.smista(), as);
		
	}
	
	public static void updateInterfacciaAccordoServizioParteComune(String tipoParam, String wsdlS, AccordoServizioParteComune as,
			boolean enableAutoMapping, boolean validazioneDocumenti, boolean enableAutoMapping_estraiXsdSchemiFromWsdlTypes, boolean facilityUnicoWSDL_interfacciaStandard,
			String tipoProtocollo, 
			AccordiServizioParteComuneCore apcCore,
			boolean aggiornaEsistenti, boolean eliminaNonPresentiNuovaInterfaccia,
			List<IDResource> risorseEliminate,List<IDPortType> portTypeEliminati, List<IDPortTypeAzione> operationEliminate) throws Exception {
		
		FormatoSpecifica formato = null;
		byte [] wsdlBytes = null;
		if(as!=null) {
			formato = as.getFormatoSpecifica();
		}
		if(wsdlS!=null) {
			wsdlBytes = apcCore.getInterfaceAsByteArray(formato, wsdlS);
		}
		
		// il wsdl definitorio rimane fuori dal nuovo comportamento quindi il flusso della pagina continua come prima
		if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_DEFINITORIO)) {
			as.setByteWsdlDefinitorio(wsdlBytes);
		}
		else {
			// se sono state definiti dei port type ed e' la prima volta che ho passato i controlli 
			//Informo l'utente che potrebbe sovrascrivere i servizi definiti tramite l'aggiornamento del wsdl
			// Questa Modalita' e' controllata tramite la proprieta' isenabledAutoMappingWsdlIntoAccordo
			// e se non e' un reset
			if(enableAutoMapping){
				
				if( wsdlBytes!=null ){
					AccordoServizioParteComune asNuovo = new AccordoServizioParteComune();
					asNuovo.setFormatoSpecifica(as.getFormatoSpecifica());
					asNuovo.setServiceBinding(as.getServiceBinding());

					boolean fillXsd = false;
					String tipo = null;
					
					// decodifico quale wsdl/wsbl sto aggiornando
					if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_CONCETTUALE)) {
						as.setByteWsdlConcettuale(wsdlBytes);

						asNuovo.setByteSpecificaConversazioneConcettuale(as.getByteSpecificaConversazioneConcettuale());
						asNuovo.setByteSpecificaConversazioneErogatore(as.getByteSpecificaConversazioneErogatore());
						asNuovo.setByteSpecificaConversazioneFruitore(as.getByteSpecificaConversazioneFruitore());
						asNuovo.setByteWsdlConcettuale(wsdlBytes);
						
						fillXsd = true;
						tipo=AccordiServizioParteComuneCostanti.TIPO_WSDL_CONCETTUALE;
					}
					if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_EROGATORE)) {
						as.setByteWsdlLogicoErogatore(wsdlBytes);

						asNuovo.setByteSpecificaConversazioneConcettuale(as.getByteSpecificaConversazioneConcettuale());
						asNuovo.setByteSpecificaConversazioneErogatore(as.getByteSpecificaConversazioneErogatore());
						asNuovo.setByteSpecificaConversazioneFruitore(as.getByteSpecificaConversazioneFruitore());
						asNuovo.setByteWsdlLogicoErogatore(wsdlBytes);
						
						fillXsd = true;
						if(facilityUnicoWSDL_interfacciaStandard){
							tipo=AccordiServizioParteComuneCostanti.TIPO_WSDL_CONCETTUALE;
						}
						else{
							tipo=AccordiServizioParteComuneCostanti.TIPO_WSDL_EROGATORE;
						}
						
					}
					if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_FRUITORE)) {
						as.setByteWsdlLogicoFruitore(wsdlBytes);

						asNuovo.setByteSpecificaConversazioneConcettuale(as.getByteSpecificaConversazioneConcettuale());
						asNuovo.setByteSpecificaConversazioneErogatore(as.getByteSpecificaConversazioneErogatore());
						asNuovo.setByteSpecificaConversazioneFruitore(as.getByteSpecificaConversazioneFruitore());
						asNuovo.setByteWsdlLogicoFruitore(wsdlBytes);
						
						fillXsd = true;
						tipo=AccordiServizioParteComuneCostanti.TIPO_WSDL_FRUITORE;
					}
					if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_CONCETTUALE)) {
						as.setByteSpecificaConversazioneConcettuale(wsdlBytes);

						asNuovo.setByteSpecificaConversazioneConcettuale(wsdlBytes);
						asNuovo.setByteWsdlConcettuale(as.getByteWsdlConcettuale());
						asNuovo.setByteWsdlLogicoErogatore(as.getByteWsdlLogicoErogatore());
						asNuovo.setByteWsdlLogicoFruitore(as.getByteWsdlLogicoFruitore());
					}
					if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_EROGATORE)) {
						as.setByteSpecificaConversazioneErogatore(wsdlBytes);

						asNuovo.setByteSpecificaConversazioneErogatore(wsdlBytes);
						asNuovo.setByteWsdlConcettuale(as.getByteWsdlConcettuale());
						asNuovo.setByteWsdlLogicoErogatore(as.getByteWsdlLogicoErogatore());
						asNuovo.setByteWsdlLogicoFruitore(as.getByteWsdlLogicoFruitore());
					}
					if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_FRUITORE)) {
						as.setByteSpecificaConversazioneFruitore(wsdlBytes);

						asNuovo.setByteSpecificaConversazioneFruitore(wsdlBytes);
						asNuovo.setByteWsdlConcettuale(as.getByteWsdlConcettuale());
						asNuovo.setByteWsdlLogicoErogatore(as.getByteWsdlLogicoErogatore());
						asNuovo.setByteWsdlLogicoFruitore(as.getByteWsdlLogicoFruitore());
					}

					// Genero la nuova definizione
					apcCore.mappingAutomatico(tipoProtocollo, asNuovo, validazioneDocumenti);

					// se l'aggiornamento ha creato nuovi oggetti o aggiornato i vecchi aggiorno la configurazione
					if(org.openspcoop2.core.registry.constants.ServiceBinding.REST.equals(as.getServiceBinding())) {
						apcCore.popolaResourceDaUnAltroASPC(as,asNuovo,
								aggiornaEsistenti, eliminaNonPresentiNuovaInterfaccia, risorseEliminate);
					}
					else {
						apcCore.popolaPorttypeOperationDaUnAltroASPC(as,asNuovo,
								aggiornaEsistenti, eliminaNonPresentiNuovaInterfaccia,
								portTypeEliminati, operationEliminate);
					}
					
					// popolo gli allegati
					if(fillXsd && enableAutoMapping_estraiXsdSchemiFromWsdlTypes && FormatoSpecifica.WSDL_11.equals(as.getFormatoSpecifica())){
						apcCore.estraiSchemiFromWSDLTypesAsAllegati(as, wsdlBytes, tipo, new HashMap<String, byte[]> ());
						if(facilityUnicoWSDL_interfacciaStandard){
							// è stato utilizzato il concettuale. Lo riporto nel logico
							as.setByteWsdlLogicoErogatore(as.getByteWsdlConcettuale());
						}
					}
					
					try{
						if(StatiAccordo.bozza.toString().equals(as.getStatoPackage())) {
							// Se ho fatto il mapping controllo la validita' di quanto prodotto
							as.setStatoPackage(StatiAccordo.operativo.toString());
							boolean utilizzoAzioniDiretteInAccordoAbilitato = apcCore.isShowAccordiColonnaAzioni();
							apcCore.validaStatoAccordoServizio(as, utilizzoAzioniDiretteInAccordoAbilitato, false);
						}
					}catch(ValidazioneStatoPackageException validazioneException){
						// Se l'automapping non ha prodotto ne porttype ne operatin rimetto lo stato a bozza
						as.setStatoPackage(StatiAccordo.bozza.toString());
					}
					
				}
			}else {
				// vecchio comportamento sovrascrivo i wsdl
				// Modifico i dati del wsdl dell'accordo nel db
				// anche in caso di reset del wsdl

				if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_CONCETTUALE)) {
					as.setByteWsdlConcettuale(wsdlBytes);
				}
				if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_EROGATORE)) {
					as.setByteWsdlLogicoErogatore(wsdlBytes);
				}
				if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_WSDL_FRUITORE)) {
					as.setByteWsdlLogicoFruitore(wsdlBytes);
				}
				if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_CONCETTUALE)) {
					as.setByteSpecificaConversazioneConcettuale(wsdlBytes);
				}
				if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_EROGATORE)) {
					as.setByteSpecificaConversazioneErogatore(wsdlBytes);
				}
				if (tipoParam.equals(AccordiServizioParteComuneCostanti.PARAMETRO_APC_SPECIFICA_CONVERSAZIONE_FRUITORE)) {
					as.setByteSpecificaConversazioneFruitore(wsdlBytes);
				}

			} 
		}

		// 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
		if(as!=null && as.getByteWsdlLogicoErogatore()!=null && as.getByteWsdlLogicoFruitore()==null && as.getByteWsdlConcettuale()==null){
			as.setByteWsdlConcettuale(as.getByteWsdlLogicoErogatore());
		}
	}
}