SICAtoOpenSPCoopUtilities.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.protocol.spcoop.sica;

import java.io.File;
import java.net.URI;
import java.util.List;

import javax.wsdl.Binding;
import javax.wsdl.Definition;

import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDAccordoCooperazione;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoCooperazione;
import org.openspcoop2.core.registry.AccordoCooperazionePartecipanti;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteComuneServizioCompostoServizioComponente;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.ConfigurazioneServizio;
import org.openspcoop2.core.registry.Connettore;
import org.openspcoop2.core.registry.IdSoggetto;
import org.openspcoop2.core.registry.constants.CostantiRegistroServizi;
import org.openspcoop2.core.registry.constants.FormatoSpecifica;
import org.openspcoop2.core.registry.constants.RuoliDocumento;
import org.openspcoop2.core.registry.constants.ServiceBinding;
import org.openspcoop2.core.registry.constants.TipologiaServizio;
import org.openspcoop2.core.registry.driver.IDAccordoCooperazioneFactory;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.core.registry.wsdl.RegistroOpenSPCoopUtilities;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.message.xml.MessageXMLUtils;
import org.openspcoop2.protocol.sdk.registry.ProtocolFiltroRicercaAccordi;
import org.openspcoop2.protocol.sdk.registry.ProtocolFiltroRicercaServizi;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.protocol.sdk.registry.RegistryNotFound;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.openspcoop2.utils.certificate.CertificateUtils;
import org.openspcoop2.utils.wsdl.DefinitionWrapper;
import org.openspcoop2.utils.wsdl.WSDLUtilities;
import org.openspcoop2.utils.xml.AbstractXMLUtils;
import org.slf4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import it.gov.spcoop.sica.dao.Costanti;
import it.gov.spcoop.sica.manifest.DocumentoCoordinamento;
import it.gov.spcoop.sica.manifest.DocumentoLivelloServizio;
import it.gov.spcoop.sica.manifest.DocumentoSemiformale;
import it.gov.spcoop.sica.manifest.DocumentoSicurezza;
import it.gov.spcoop.sica.manifest.ElencoPartecipanti;
import it.gov.spcoop.sica.manifest.ElencoServiziComponenti;
import it.gov.spcoop.sica.manifest.SpecificaCoordinamento;
import it.gov.spcoop.sica.manifest.SpecificaLivelliServizio;
import it.gov.spcoop.sica.manifest.SpecificaSicurezza;
import it.gov.spcoop.sica.manifest.constants.TipoAdesione;
import it.gov.spcoop.sica.manifest.constants.TipoDocumentoConversazione;
import it.gov.spcoop.sica.manifest.constants.TipoDocumentoInterfaccia;
import it.gov.spcoop.sica.manifest.driver.TipiDocumentoConversazione;
import it.gov.spcoop.sica.manifest.driver.TipiDocumentoInterfaccia;
import it.gov.spcoop.sica.manifest.driver.TipiDocumentoSicurezza;


/**
* Utilities di conversione da oggetto OpenSPCoop a oggetti SICA  e viceversa
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class SICAtoOpenSPCoopUtilities {

	
	/*
	 * uri:dn:<identificativo soggetto>
	 * Potrebbe essere dn=
	 * uri:dn:o=m_sa,c=it
	 * */
	
	/* IDSoggetti */
	private static String [] getValoriDN(String dn) throws SICAToOpenSPCoopUtilitiesException{
		String [] valori;
		int indexOf = dn.indexOf("=");
		if(indexOf<=0){
			throw new SICAToOpenSPCoopUtilitiesException("Separatore validi per il dn non trovati");
		}
		valori =  dn.split(",");
		if(valori==null || valori.length<1){
			throw new SICAToOpenSPCoopUtilitiesException("Identificazione dn non riuscita: null??");
		}
		return valori;
	}
	public static void validateIDSoggettoSICA(String dn) throws SICAToOpenSPCoopUtilitiesException{
		String tmp = new String(dn);
		if(tmp.startsWith("uri:dn:")){
			tmp = tmp.substring("uri:dn:".length());
		}
		if(tmp==null || "".equals(tmp))
			throw new SICAToOpenSPCoopUtilitiesException("DN non fornita");
		if(tmp.contains("c=it")==false){
			throw new SICAToOpenSPCoopUtilitiesException("c=it non presente");
		}
		if(tmp.contains(",")==false){
			throw new SICAToOpenSPCoopUtilitiesException("Nessuna amministrazione definita nella radice c=it");
		}
		if(tmp.contains("=")==false){
			throw new SICAToOpenSPCoopUtilitiesException("Nessuna amministrazione definita nella radice c=it");
		}
		String [] valoriDN = SICAtoOpenSPCoopUtilities.getValoriDN(tmp);
		boolean campoObbligatorioO = false;
		for(int i=0; i<valoriDN.length; i++){
			if(valoriDN[i].contains("=")==false){
				throw new SICAToOpenSPCoopUtilitiesException("Identificazione dn non riuscita: ["+valoriDN[i]+"] non separata dal carattere \"=\"");
			}
			String [] keyValue = valoriDN[i].trim().split("=");
			if(keyValue.length!=2){
				throw new SICAToOpenSPCoopUtilitiesException("Identificazione dn non riuscita: ["+valoriDN[i]+"] contiene piu' di un carattere \"=\"");
			}
			if(keyValue[0].trim().contains(" ")){
				throw new SICAToOpenSPCoopUtilitiesException("Identificazione dn non riuscita: il campo ["+valoriDN[i]+"] contiene spazi nella chiave identificativa ["+keyValue[0].trim()+"]");
			}
			if(CertificateUtils.formatKeyPrincipal(keyValue[0]).equalsIgnoreCase("O")){
				campoObbligatorioO = true;
			}
		}
		if(!campoObbligatorioO){
			throw new SICAToOpenSPCoopUtilitiesException("Nessuna amministrazione definita nella radice c=it (o=XX non trovato)");
		}
		
	}
	public static String appendURI_IDSoggettoSica(String dn) throws SICAToOpenSPCoopUtilitiesException{
		SICAtoOpenSPCoopUtilities.validateIDSoggettoSICA(dn);
		return "uri:dn:" + dn;	
	}
	public static String removeURI_IDSoggettoSica(String uri_dn) throws SICAToOpenSPCoopUtilitiesException{
		SICAtoOpenSPCoopUtilities.validateIDSoggettoSICA(uri_dn);
		if(uri_dn.startsWith("uri:dn:")){
			uri_dn = uri_dn.substring("uri:dn:".length());
		}
		return uri_dn;
	}
	// NOTA: Metodo che permette di costruire DistinguishedName non standard: gestisce i tipi diversi da SPC.
	// Da utilizzare con cautela
	public static String buildIDSoggettoSica(IDSoggetto idSoggetto,boolean createURI) throws SICAToOpenSPCoopUtilitiesException{
		String soggetto = null;
		if("spc".equals(idSoggetto.getTipo())){
			// standard, utilizzo solo il nome
			soggetto = idSoggetto.getNome();
		}else{
			// non standard, utilizzo tipo/nome per avere l'univocita'
			soggetto = idSoggetto.toString();
		}
		return SICAtoOpenSPCoopUtilities.buildIDSoggettoSica(soggetto, createURI);
	}
	public static String buildIDSoggettoSica(String soggetto,boolean createURI) throws SICAToOpenSPCoopUtilitiesException{
		if(soggetto==null || "".equals(soggetto))
			throw new SICAToOpenSPCoopUtilitiesException("Identificativo soggetto non fornito");
		StringBuilder bf = new StringBuilder();
		if(createURI){
			bf.append("uri:dn:");
		}
		bf.append("o=");
		bf.append(soggetto);
		bf.append(",c=it");
		return bf.toString();
	}
	public static String idSoggetto_openspcoopToSica(org.openspcoop2.core.id.IDSoggetto idSoggetto) throws SICAToOpenSPCoopUtilitiesException{

		if(idSoggetto==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDSoggetto non definito");
		if(idSoggetto.getTipo()==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDSoggetto.tipo non definito");
		if(idSoggetto.getNome()==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDSoggetto.nome non definito");
		if("spc".equals(idSoggetto.getTipo())==false)
			throw new SICAToOpenSPCoopUtilitiesException("Tipo soggetto diverso da SPC non utilizzabile");
		
		return SICAtoOpenSPCoopUtilities.buildIDSoggettoSica(idSoggetto.getNome(),true);
	}
	public static org.openspcoop2.core.id.IDSoggetto idSoggetto_sicaToOpenspcoop(String uriSoggetto) throws SICAToOpenSPCoopUtilitiesException{
		return SICAtoOpenSPCoopUtilities.idSoggetto_sicaToOpenspcoop(uriSoggetto,true);
	}
	public static org.openspcoop2.core.id.IDSoggetto idSoggetto_sicaToOpenspcoop(String uriSoggetto,boolean uri) throws SICAToOpenSPCoopUtilitiesException{
		
		if(uriSoggetto==null)
			throw new SICAToOpenSPCoopUtilitiesException("uriSoggetto non definito");
		
		String senzaSpazi = uriSoggetto.replaceAll("" , "");
		
		if(senzaSpazi.startsWith("uri:dn:")==false && uri)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriSoggetto ("+uriSoggetto+") non corretto (uri:dn:o=<identificativo soggetto>,c=it)");
		if( (senzaSpazi.indexOf(",c=it")<=0) && senzaSpazi.indexOf(" c=it")<=0)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriSoggetto ("+uriSoggetto+") non corretto (uri:dn:o=<identificativo soggetto>,c=it)");
		if(uri){
			if(senzaSpazi.indexOf(",o=")<=0 && senzaSpazi.indexOf(":o=")<=0 && senzaSpazi.indexOf(" o=")<=0){
				throw new SICAToOpenSPCoopUtilitiesException("Formato uriSoggetto ("+uriSoggetto+") non corretto (uri:dn:o=<identificativo soggetto>,c=it)");
			}
		}else{
			if(senzaSpazi.indexOf(",o=")<=0 && senzaSpazi.indexOf("o=")<0){
				throw new SICAToOpenSPCoopUtilitiesException("Formato uriSoggetto ("+uriSoggetto+") non corretto (o=<identificativo soggetto>,c=it)");
			}
		}
		
		int index = -1;
		int lenghtPrefixO = 3;
		if(uri){
			index = senzaSpazi.indexOf(",o=");
			if(index<=0){
				index = senzaSpazi.indexOf(":o=");
			}
			if(index<=0){
				index = senzaSpazi.indexOf(" o=");
			}
		}else{
			index = senzaSpazi.indexOf(",o=");
			if(index<=0){
				index = senzaSpazi.indexOf("o=");
				lenghtPrefixO = 2;
 			}
		}
		
		
		int endSoggetto = senzaSpazi.length();
		if(senzaSpazi.indexOf(",",index+1)>0){
			endSoggetto = senzaSpazi.indexOf(",",index+1);
		}
		
		org.openspcoop2.core.id.IDSoggetto idSoggetto = 
			 new org.openspcoop2.core.id.IDSoggetto("spc",senzaSpazi.substring(index+lenghtPrefixO,endSoggetto));
		return idSoggetto;
	}
	public static String readDNSoggettoFromUriAccordo(String uriAccordo) throws SICAToOpenSPCoopUtilitiesException{
		if(uriAccordo==null)
			throw new SICAToOpenSPCoopUtilitiesException("uriAccordo non definito");
		String [] values = uriAccordo.split(":");
		if(values.length != 5)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriAccordo ("+uriAccordo+") non valido (urn:<tipo_accordo>:<soggetto_organizzativo>:<nome_accordo>:<versione>)");
		String urn = values[0];
		if("urn".equals(urn)==false)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriAccordo ("+uriAccordo+") non valido (urn:<tipo_accordo>:<soggetto_organizzativo>:<nome_accordo>:<versione>)");
		String soggetto = values[2];
		if(soggetto==null)
			throw new SICAToOpenSPCoopUtilitiesException("Soggetto non presente nell'uriAccordo ("+uriAccordo+")");
		return soggetto;
	}
	
	
	
	
	
	
	
	
	
	/*
	 * urn:adc:<nome_accordo>:<versione>
	 * */
	public static String buildIDAccordoCooperazioneSica(String nome_accordo,Integer versione)throws SICAToOpenSPCoopUtilitiesException{
		
		if(nome_accordo==null || "".equals(nome_accordo))
			throw new SICAToOpenSPCoopUtilitiesException("Nome accordo non fornito");
		if(versione==null)
			throw new SICAToOpenSPCoopUtilitiesException("Versione non fornita");
		
		StringBuilder bf = new StringBuilder();
		bf.append("urn:");
		bf.append(Costanti.TIPO_ACCORDO_COOPERAZIONE);
		bf.append(":");
		bf.append(nome_accordo);
		bf.append(":");
		bf.append(versione);
		return bf.toString();
	}
	
	public static String idAccordoCooperazione_openspcoopToSica(IRegistryReader registryReader, IDAccordoCooperazione idAccordo) throws SICAToOpenSPCoopUtilitiesException{
		if(idAccordo==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDAccordo non definito");
		if(idAccordo.getNome()==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDAccordo.nome non definito");
		if(idAccordo.getVersione()==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDAccordo.versione non definito");
	
		// Recupero property del nome Accordo
		String nomeAccordo = null;
		try{
			AccordoCooperazione ac = registryReader.getAccordoCooperazione(idAccordo);
//			if(ac.sizeProtocolPropertyList()<=0){
//				throw new Exception("Nome dell'accordo da utilizzare non trovato: non esistono proprieta' di protocollo all'interno dell'accordo di servizio");
//			}
//			for (int i = 0; i < ac.sizeProtocolPropertyList(); i++) {
//				if(org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti.SPCOOP_PROTOCOL_PROPERTIES_NOME_ACCORDO_CNIPA.equals(ac.getProtocolProperty(i).getName())){
//					nomeAccordo = ac.getProtocolProperty(i).getValue();
//				}		
//			}
//			if(nomeAccordo==null){
//				throw new Exception("Nome dell'accordo da utilizzare non trovato all'interno delle proprieta' di protocollo dell'accordo di servizio");
//			}
			nomeAccordo = ac.getNome();
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
		}
		
		return SICAtoOpenSPCoopUtilities.buildIDAccordoCooperazioneSica(nomeAccordo,idAccordo.getVersione());
	}
	public static IDAccordoCooperazione idAccordoCooperazione_sicaToOpenspcoop(IRegistryReader registryReader, String uriAccordo) throws SICAToOpenSPCoopUtilitiesException{
		if(uriAccordo==null)
			throw new SICAToOpenSPCoopUtilitiesException("uriAccordo non definito");
		String [] values = uriAccordo.split(":");
		if(values.length != 4)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriAccordo ("+uriAccordo+") non valido (urn:adc:<nome_accordo>:<versione>)");
		String urn = values[0];
		if("urn".equals(urn)==false)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriAccordo ("+uriAccordo+") non valido (urn:adc:<nome_accordo>:<versione>)");
		String tipoAccordo = values[1];
		if("adc".equals(tipoAccordo)==false)
			throw new SICAToOpenSPCoopUtilitiesException("Tipo presente nell'uriAccordo ("+tipoAccordo+") non corrisponde quello atteso (adc)");
		String nome = values[2];
		if(nome==null)
			throw new SICAToOpenSPCoopUtilitiesException("Nome non presente nell'uriAccordo ("+uriAccordo+")");
		String versione = values[3];
		if(versione==null)
			throw new SICAToOpenSPCoopUtilitiesException("Versione non presente nell'uriAccordo ("+uriAccordo+")");
		Integer versioneInt = null;
		try{
			versioneInt = Integer.parseInt(versione);
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("Versione presente nell'uriAccordo ("+uriAccordo+") non ha un formato numerico: "+e.getMessage(),e);
		}
		
		try{
			ProtocolFiltroRicercaAccordi filtro = new ProtocolFiltroRicercaAccordi();
			filtro.setVersione(versioneInt);
//			org.openspcoop2.protocol.sdk.properties.ProtocolProperties protocolProperties = new org.openspcoop2.protocol.sdk.properties.ProtocolProperties();
//			protocolProperties.addProperty(org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti.SPCOOP_PROTOCOL_PROPERTIES_NOME_ACCORDO_CNIPA, nome);
//			filtro.setProtocolProperties(protocolProperties);
			List<IDAccordoCooperazione> list = null;
			try {
				list = registryReader.findIdAccordiCooperazione(filtro);
			}catch(RegistryNotFound notFound) {}
			if(list==null || list.size()<=0){
				throw new Exception("Non sono stati trovati accordi che contengono il nome '"+nome+"'");
			}
			if(list.size()>1){
				throw new Exception("Sono stati trovati più accordi ("+list.size()+") che contengono il nome '"+nome+"' e  la versione '"+versioneInt+"'");
			}
			return list.get(0);
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
		}
		
	}
	
	
	
	
	
	
	
	
	
	/*
	 * urn:<tipo_accordo>:<soggetto_organizzativo>:<nome_accordo>:<versione>
	 * */
	public static String buildIDAccordoSica(String tipo_accordo,String soggetto,String nome_accordo,Integer versione)throws SICAToOpenSPCoopUtilitiesException{
		
		if(tipo_accordo==null || "".equals(tipo_accordo))
			throw new SICAToOpenSPCoopUtilitiesException("Tipo accordo non fornito");
		if(soggetto==null || "".equals(soggetto))
			throw new SICAToOpenSPCoopUtilitiesException("Soggetto organizzativo non fornito");
		if(nome_accordo==null || "".equals(nome_accordo))
			throw new SICAToOpenSPCoopUtilitiesException("Nome accordo non fornito");
		if(versione==null)
			throw new SICAToOpenSPCoopUtilitiesException("Versione non fornita");
		
		StringBuilder bf = new StringBuilder();
		bf.append("urn:");
		bf.append(tipo_accordo);
		bf.append(":");
		bf.append(soggetto);
		bf.append(":");
		bf.append(nome_accordo);
		bf.append(":");
		bf.append(versione);
		return bf.toString();
	}
	
	public static String idAccordoServizioParteComune_openspcoopToSica(IRegistryReader registryReader, IDAccordo idAccordo,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		
		// Recupero property del nome Accordo
		String nomeAccordo = null;
		try{
			AccordoServizioParteComune aspc = registryReader.getAccordoServizioParteComune(idAccordo, false, false);
//			if(aspc.sizeProtocolPropertyList()<=0){
//				throw new Exception("Nome dell'accordo da utilizzare non trovato: non esistono proprieta' di protocollo all'interno dell'accordo di servizio");
//			}
//			for (int i = 0; i < aspc.sizeProtocolPropertyList(); i++) {
//				if(org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti.SPCOOP_PROTOCOL_PROPERTIES_NOME_ACCORDO_CNIPA.equals(aspc.getProtocolProperty(i).getName())){
//					nomeAccordo = aspc.getProtocolProperty(i).getValue();
//				}		
//			}
//			if(nomeAccordo==null){
//				throw new Exception("Nome dell'accordo da utilizzare non trovato all'interno delle proprieta' di protocollo dell'accordo di servizio");
//			}
			nomeAccordo = aspc.getNome();
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
		}
		
		return SICAtoOpenSPCoopUtilities.idAccordo_openspcoopToSica(nomeAccordo,idAccordo.getVersione(),idAccordo.getSoggettoReferente(),
				Costanti.TIPO_ACCORDO_SERVIZIO_PARTE_COMUNE,sicaToOpenSPCoopContext);
	}
	public static IDAccordo idAccordoServizioParteComune_sicaToOpenspcoop(IRegistryReader registryReader,String uriAccordo,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		return SICAtoOpenSPCoopUtilities.idAccordo_sicaToOpenspcoop(registryReader,uriAccordo,Costanti.TIPO_ACCORDO_SERVIZIO_PARTE_COMUNE,sicaToOpenSPCoopContext);
	}
		
	public static String idAccordoServizioComposto_openspcoopToSica(IRegistryReader registryReader, IDAccordo idAccordo,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		
		// Recupero property del nome Accordo
		String nomeAccordo = null;
		try{
			AccordoServizioParteComune aspc = registryReader.getAccordoServizioParteComune(idAccordo, false, false);
//			if(aspc.sizeProtocolPropertyList()<=0){
//				throw new Exception("Nome dell'accordo da utilizzare non trovato: non esistono proprieta' di protocollo all'interno dell'accordo di servizio");
//			}
//			for (int i = 0; i < aspc.sizeProtocolPropertyList(); i++) {
//				if(org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti.SPCOOP_PROTOCOL_PROPERTIES_NOME_ACCORDO_CNIPA.equals(aspc.getProtocolProperty(i).getName())){
//					nomeAccordo = aspc.getProtocolProperty(i).getValue();
//				}		
//			}
//			if(nomeAccordo==null){
//				throw new Exception("Nome dell'accordo da utilizzare non trovato all'interno delle proprieta' di protocollo dell'accordo di servizio");
//			}
			nomeAccordo = aspc.getNome();
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
		}
		
		return SICAtoOpenSPCoopUtilities.idAccordo_openspcoopToSica(nomeAccordo,idAccordo.getVersione(),idAccordo.getSoggettoReferente(),
				Costanti.TIPO_ACCORDO_SERVIZIO_COMPOSTO,sicaToOpenSPCoopContext);
	}
	public static IDAccordo idAccordoServizioComposto_sicaToOpenspcoop(IRegistryReader registryReader,String uriAccordo,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		return SICAtoOpenSPCoopUtilities.idAccordo_sicaToOpenspcoop(registryReader,uriAccordo,Costanti.TIPO_ACCORDO_SERVIZIO_COMPOSTO,sicaToOpenSPCoopContext);
	}
		
	public static String idAccordoServizioParteSpecifica_openspcoopToSica(IRegistryReader registryReader, IDServizio idServizio,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		
		// Recupero property del nome Accordo
		String nomeAccordo = null;
		try{
			AccordoServizioParteSpecifica asps = registryReader.getAccordoServizioParteSpecifica(idServizio, false);
//			if(asps.sizeProtocolPropertyList()<=0){
//				throw new Exception("Nome dell'accordo da utilizzare non trovato: non esistono proprieta' di protocollo all'interno dell'accordo di servizio");
//			}
//			for (int i = 0; i < asps.sizeProtocolPropertyList(); i++) {
//				if(org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti.SPCOOP_PROTOCOL_PROPERTIES_NOME_ACCORDO_CNIPA.equals(asps.getProtocolProperty(i).getName())){
//					nomeAccordo = asps.getProtocolProperty(i).getValue();
//				}		
//			}
//			if(nomeAccordo==null){
//				throw new Exception("Nome dell'accordo da utilizzare non trovato all'interno delle proprieta' di protocollo dell'accordo di servizio");
//			}
			nomeAccordo = asps.getNome();
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
		}
		
		return SICAtoOpenSPCoopUtilities.idAccordo_openspcoopToSica(nomeAccordo,idServizio.getVersione(),idServizio.getSoggettoErogatore(),
				Costanti.TIPO_ACCORDO_SERVIZIO_PARTE_SPECIFICA,sicaToOpenSPCoopContext);
	}
	public static IDServizio idAccordoServizioParteSpecifica_sicaToOpenspcoop(IRegistryReader registryReader,String uriAccordo,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		return SICAtoOpenSPCoopUtilities.idServizio_sicaToOpenspcoop(registryReader,uriAccordo,Costanti.TIPO_ACCORDO_SERVIZIO_PARTE_SPECIFICA,sicaToOpenSPCoopContext);
	}
	
	
	
	private static String idAccordo_openspcoopToSica(String nomeAccordo, Integer versioneAccordo, IDSoggetto soggettoAccordo,
			String tipo,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		if(nomeAccordo==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDAccordo.nome non definito");
		if(versioneAccordo==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDAccordo.versione non definito");
		if(soggettoAccordo==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDAccordo.soggetto non definito");
		if(soggettoAccordo.getTipo()==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDAccordo.soggetto.tipo non definito");
		if(soggettoAccordo.getNome()==null)
			throw new SICAToOpenSPCoopUtilitiesException("IDAccordo.soggetto.nome non definito");
		if("spc".equals(soggettoAccordo.getTipo())==false)
			throw new SICAToOpenSPCoopUtilitiesException("Tipo soggetto referente diverso da SPC non utilizzabile");
		
		String codiceIPASoggettoReferente = 
			sicaToOpenSPCoopContext.getCodiceIPA(new IDSoggetto(soggettoAccordo.getTipo(), soggettoAccordo.getNome()));
		if(codiceIPASoggettoReferente==null){
			codiceIPASoggettoReferente = SICAtoOpenSPCoopUtilities.buildIDSoggettoSica(soggettoAccordo.getNome(),false);	
		}
		
		return SICAtoOpenSPCoopUtilities.buildIDAccordoSica(tipo,
				codiceIPASoggettoReferente,
				nomeAccordo,
				versioneAccordo);
	}
	public static IDAccordo idAccordo_sicaToOpenspcoop(IRegistryReader registryReader, String uriAccordo,String tipoAtteso,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		if(uriAccordo==null)
			throw new SICAToOpenSPCoopUtilitiesException("uriAccordo non definito");
		String [] values = uriAccordo.split(":");
		if(values.length != 5)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriAccordo ("+uriAccordo+") non valido (urn:<tipo_accordo>:<soggetto_organizzativo>:<nome_accordo>:<versione>)");
		String urn = values[0];
		if("urn".equals(urn)==false)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriAccordo ("+uriAccordo+") non valido (urn:<tipo_accordo>:<soggetto_organizzativo>:<nome_accordo>:<versione>)");
		String tipoAccordo = values[1];
		if(tipoAtteso.equals(tipoAccordo)==false)
			throw new SICAToOpenSPCoopUtilitiesException("Tipo presente nell'uriAccordo ("+tipoAccordo+") non corrisponde quello atteso ("+tipoAtteso+")");
		String soggetto = values[2];
		if(soggetto==null)
			throw new SICAToOpenSPCoopUtilitiesException("Soggetto non presente nell'uriAccordo ("+uriAccordo+")");
		IDSoggetto idSoggetto = sicaToOpenSPCoopContext.getIDSoggetto(soggetto);
		if(idSoggetto==null)
			idSoggetto = SICAtoOpenSPCoopUtilities.idSoggetto_sicaToOpenspcoop(soggetto,false);
		String nome = values[3];
		if(nome==null)
			throw new SICAToOpenSPCoopUtilitiesException("Nome non presente nell'uriAccordo ("+uriAccordo+")");
		String versione = values[4];
		if(versione==null)
			throw new SICAToOpenSPCoopUtilitiesException("Versione non presente nell'uriAccordo ("+uriAccordo+")");
		Integer versioneInt = null;
		try{
			versioneInt = Integer.parseInt(versione);
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("Versione presente nell'uriAccordo ("+uriAccordo+") non ha un formato numerico: "+e.getMessage(),e);
		}
		
		try{
			ProtocolFiltroRicercaAccordi filtro = new ProtocolFiltroRicercaAccordi();
			filtro.setVersione(versioneInt);
			filtro.setSoggetto(idSoggetto);
//			org.openspcoop2.protocol.sdk.properties.ProtocolProperties protocolProperties = new org.openspcoop2.protocol.sdk.properties.ProtocolProperties();
//			protocolProperties.addProperty(org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti.SPCOOP_PROTOCOL_PROPERTIES_NOME_ACCORDO_CNIPA, nome);
//			filtro.setProtocolProperties(protocolProperties);
			List<IDAccordo> list = null;
			try {
				list = registryReader.findIdAccordiServizioParteComune(filtro);
			}catch(RegistryNotFound notFound) {}
			if(list==null || list.size()<=0){
				throw new Exception("Non sono stati trovati accordi che contengono il nome '"+nome+"'");
			}
			if(list.size()>1){
				throw new Exception("Sono stati trovati più accordi ("+list.size()+") che contengono il nome '"+nome+"',  la versione '"+versioneInt+"' ed il soggetto '"+idSoggetto+"'");
			}
			return list.get(0);
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
		}

	}
	public static IDServizio idServizio_sicaToOpenspcoop(IRegistryReader registryReader, String uriAccordo,String tipoAtteso,SICAtoOpenSPCoopContext sicaToOpenSPCoopContext) throws SICAToOpenSPCoopUtilitiesException{
		if(uriAccordo==null)
			throw new SICAToOpenSPCoopUtilitiesException("uriAccordo non definito");
		String [] values = uriAccordo.split(":");
		if(values.length != 5)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriAccordo ("+uriAccordo+") non valido (urn:<tipo_accordo>:<soggetto_organizzativo>:<nome_accordo>:<versione>)");
		String urn = values[0];
		if("urn".equals(urn)==false)
			throw new SICAToOpenSPCoopUtilitiesException("Formato uriAccordo ("+uriAccordo+") non valido (urn:<tipo_accordo>:<soggetto_organizzativo>:<nome_accordo>:<versione>)");
		String tipoAccordo = values[1];
		if(tipoAtteso.equals(tipoAccordo)==false)
			throw new SICAToOpenSPCoopUtilitiesException("Tipo presente nell'uriAccordo ("+tipoAccordo+") non corrisponde quello atteso ("+tipoAtteso+")");
		String soggetto = values[2];
		if(soggetto==null)
			throw new SICAToOpenSPCoopUtilitiesException("Soggetto non presente nell'uriAccordo ("+uriAccordo+")");
		IDSoggetto idSoggetto = sicaToOpenSPCoopContext.getIDSoggetto(soggetto);
		if(idSoggetto==null)
			idSoggetto = SICAtoOpenSPCoopUtilities.idSoggetto_sicaToOpenspcoop(soggetto,false);
		String nome = values[3];
		if(nome==null)
			throw new SICAToOpenSPCoopUtilitiesException("Nome non presente nell'uriAccordo ("+uriAccordo+")");
		String versione = values[4];
		if(versione==null)
			throw new SICAToOpenSPCoopUtilitiesException("Versione non presente nell'uriAccordo ("+uriAccordo+")");
		Integer versioneInt = null;
		try{
			versioneInt = Integer.parseInt(versione);
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("Versione presente nell'uriAccordo ("+uriAccordo+") non ha un formato numerico: "+e.getMessage(),e);
		}
		
		try{
			ProtocolFiltroRicercaServizi filtro = new ProtocolFiltroRicercaServizi();
			filtro.setVersioneServizio(versioneInt);
			filtro.setSoggettoErogatore(idSoggetto);
//			org.openspcoop2.protocol.sdk.properties.ProtocolProperties protocolProperties = new org.openspcoop2.protocol.sdk.properties.ProtocolProperties();
//			protocolProperties.addProperty(org.openspcoop2.protocol.spcoop.constants.SPCoopCostanti.SPCOOP_PROTOCOL_PROPERTIES_NOME_ACCORDO_CNIPA, nome);
//			filtro.setProtocolPropertiesServizi(protocolProperties);
			List<IDServizio> list = null;
			try {
				list = registryReader.findIdAccordiServizioParteSpecifica(filtro);
			}catch(RegistryNotFound notFound) {}
			if(list==null || list.size()<=0){
				throw new Exception("Non sono stati trovati accordi che contengono il nome '"+nome+"'");
			}
			if(list.size()>1){
				throw new Exception("Sono stati trovati più accordi ("+list.size()+") che contengono il nome '"+nome+"',  la versione '"+versioneInt+"' ed il soggetto '"+idSoggetto+"'");
			}
			return list.get(0);
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
		}

	}
	
	
	
	
	
	
	
	
	
	/* WSDL Utilities */
	public static String readConnettoreFromWsdlImplementativo(byte[] wsdlImplementativo) throws SICAToOpenSPCoopUtilitiesException{
		
		try{
			AbstractXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;		
			Document documentLogico = xmlUtils.newDocument(wsdlImplementativo);
			
			NodeList list = documentLogico.getChildNodes();
			if(list!=null){
				for(int i=0; i<list.getLength(); i++){
					Node child = list.item(i);
					if("definitions".equals(child.getLocalName())){
						NodeList listDefinition = child.getChildNodes();
						if(listDefinition!=null){
							for(int j=0; j<listDefinition.getLength(); j++){
								Node childDefinition = listDefinition.item(j);
								if("service".equals(childDefinition.getLocalName())){
									NodeList listPort = childDefinition.getChildNodes();
									if(listPort!=null){
										for(int z=0; z<listPort.getLength(); z++){
											Node port = listPort.item(z);
											if("port".equals(port.getLocalName())){
												NodeList addressList = port.getChildNodes();
												if(addressList!=null){
													for(int m=0; m<addressList.getLength(); m++){
														Node address = addressList.item(m);
														if("address".equals(address.getLocalName())){
															return address.getAttributes().getNamedItem("location").getNodeValue();
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
			
			return null;
			
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("readWsdlImplementativo error: "+e.getMessage(),e);
		}
	}
	public static byte[] saveConnettoreIntoWsdlImplementativo(byte[] wsdlImplementativo,String url) throws SICAToOpenSPCoopUtilitiesException{
		
		try{
			AbstractXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;		
			Document documentLogico = xmlUtils.newDocument(wsdlImplementativo);
			
			NodeList list = documentLogico.getChildNodes();
			if(list!=null){
				for(int i=0; i<list.getLength(); i++){
					Node child = list.item(i);
					if("definitions".equals(child.getLocalName())){
						NodeList listDefinition = child.getChildNodes();
						if(listDefinition!=null){
							for(int j=0; j<listDefinition.getLength(); j++){
								Node childDefinition = listDefinition.item(j);
								if("service".equals(childDefinition.getLocalName())){
									NodeList listPort = childDefinition.getChildNodes();
									if(listPort!=null){
										for(int z=0; z<listPort.getLength(); z++){
											Node port = listPort.item(z);
											if("port".equals(port.getLocalName())){
												NodeList addressList = port.getChildNodes();
												if(addressList!=null){
													for(int m=0; m<addressList.getLength(); m++){
														Node address = addressList.item(m);
														if("address".equals(address.getLocalName())){
															address.getAttributes().getNamedItem("location").setNodeValue(url);
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
			
			return xmlUtils.toByteArray(documentLogico);
			
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("readWsdlImplementativo error: "+e.getMessage(),e);
		}
	}
	
	public static boolean isWsdlEmpty(byte[] wsdl){
		
		try{
			
			// <wsdl:definitions xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\"/>
			Element el = MessageXMLUtils.DEFAULT.newElement(wsdl);
			
			if("http://schemas.xmlsoap.org/wsdl/".equals(el.getNamespaceURI())==false){
				return false;
			}
			if("definitions".equals(el.getLocalName())==false){
				return false;
			}
			
			List<Node> childs = SoapUtils.getNotEmptyChildNodes(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), el, false);
			if(childs.size()<=0){
				return true;
			}
			else{
				return false;
			}
		
		}catch(Exception e){
			//e.printStackTrace();
			return false;
		}
	}
	
	private static String resizeDescriptionForMaxLength(String description){
		if(description!=null && description.length()>255){
			return description.substring(0, 252)+"...";
		}
		else{
			return description;
		}
	}
	
	
	
	
	
	
	
	
	
	
	/* Accordi di cooperazione */
	public static org.openspcoop2.core.registry.AccordoCooperazione accordoCooperazione_sicaToOpenspcoop(
			IRegistryReader registryReader,
			it.gov.spcoop.sica.dao.AccordoCooperazione accordoCooperazioneSICA,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,
			Logger logParam) throws SICAToOpenSPCoopUtilitiesException{
		
		Logger log = logParam;
		if(log==null){
			log = LoggerWrapperFactory.getLogger(SICAtoOpenSPCoopUtilities.class);
		}
		
		org.openspcoop2.core.registry.AccordoCooperazione accCooperazioneOpenspcoop = new org.openspcoop2.core.registry.AccordoCooperazione();
		
		/* Metadati presenti nel Manifest dell'Accordo di Cooperazione. */
		it.gov.spcoop.sica.manifest.AccordoCooperazione manifest = accordoCooperazioneSICA.getManifesto();
		accCooperazioneOpenspcoop.setDescrizione(resizeDescriptionForMaxLength(manifest.getDescrizione()));
		accCooperazioneOpenspcoop.setNome(manifest.getNome());
		if(manifest.getVersione()!=null)
			accCooperazioneOpenspcoop.setVersione(Integer.parseInt(manifest.getVersione()));
		accCooperazioneOpenspcoop.setOraRegistrazione(manifest.getDataCreazione());
		//accCooperazioneOpenspcoop.setDataPubblicazione(manifest.getDataPubblicazione());
		//manifest.getRiservato() ???
		
		// Coordinatore:
		if(manifest.getCoordinatore()!=null){
			IdSoggetto soggettoReferente = 
				new IdSoggetto(); 
			IDSoggetto soggettoCoordinatore = sicaToOpenspcoopContext.getIDSoggetto(SICAtoOpenSPCoopUtilities.removeURI_IDSoggettoSica(manifest.getCoordinatore().toString()));
			if(soggettoCoordinatore==null){
				soggettoCoordinatore = SICAtoOpenSPCoopUtilities.idSoggetto_sicaToOpenspcoop(manifest.getCoordinatore().toString());
			}
			soggettoReferente.setNome(soggettoCoordinatore.getNome());
			soggettoReferente.setTipo(soggettoCoordinatore.getTipo());
			accCooperazioneOpenspcoop.setSoggettoReferente(soggettoReferente);
		}
				
		// Allegati
		if(manifest.getAllegati()!=null){
			for(int i=0; i<manifest.getAllegati().sizeGenericoDocumentoList(); i++){
				String fileName = manifest.getAllegati().getGenericoDocumento(i);
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.allegato.toString());			
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoCooperazioneSICA.sizeAllegati(); j++){
					if(fileName.equals(accordoCooperazioneSICA.getAllegato(j).getNome())){
						docSICA = accordoCooperazioneSICA.getAllegato(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("Allegato con nome["+fileName+"] non trovato");
				docOpenspcoop.setTipo(docSICA.getTipo());
				docOpenspcoop.setByteContenuto(docSICA.getContenuto());
				accCooperazioneOpenspcoop.addAllegato(docOpenspcoop);
			}
		}
		
		// SpecificaSemiformale
		if(manifest.getSpecificaSemiformale()!=null){
			for(int i=0; i<manifest.getSpecificaSemiformale().sizeDocumentoSemiformaleList(); i++){
				DocumentoSemiformale specificaSemiformale = manifest.getSpecificaSemiformale().getDocumentoSemiformale(i);
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = specificaSemiformale.getBase();
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.specificaSemiformale.toString());			
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoCooperazioneSICA.sizeSpecificheSemiformali(); j++){
					if(fileName.equals(accordoCooperazioneSICA.getSpecificaSemiformale(j).getNome())){
						docSICA = accordoCooperazioneSICA.getSpecificaSemiformale(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("SpecificaSemiformale con nome["+fileName+"] non trovato");
				docOpenspcoop.setTipo(docSICA.getTipo());
				docOpenspcoop.setByteContenuto(docSICA.getContenuto());
				accCooperazioneOpenspcoop.addSpecificaSemiformale(docOpenspcoop);
			}
		}
		
		// Partecipanti
		ElencoPartecipanti elencoPartecipantiSICA = manifest.getElencoPartecipanti();
		if(elencoPartecipantiSICA!=null){
			if(elencoPartecipantiSICA.sizePartecipanteList()>0){
				accCooperazioneOpenspcoop.setElencoPartecipanti(new AccordoCooperazionePartecipanti());
			}
			for(int i=0; i<elencoPartecipantiSICA.sizePartecipanteList(); i++){
				String partecipante = elencoPartecipantiSICA.getPartecipante(i).toString();
				
				IdSoggetto soggetto = 
					new IdSoggetto(); 
				IDSoggetto soggettoPartecipante = sicaToOpenspcoopContext.getIDSoggetto(SICAtoOpenSPCoopUtilities.removeURI_IDSoggettoSica(partecipante));
				if(soggettoPartecipante==null){
					soggettoPartecipante = SICAtoOpenSPCoopUtilities.idSoggetto_sicaToOpenspcoop(partecipante);
				}
				soggetto.setNome(soggettoPartecipante.getNome());
				soggetto.setTipo(soggettoPartecipante.getTipo());
				accCooperazioneOpenspcoop.getElencoPartecipanti().addSoggettoPartecipante(soggetto);
			}
		}
		
		// ServiziComposti
		it.gov.spcoop.sica.manifest.ElencoServiziComposti serviziComposti = manifest.getServiziComposti();
		if(serviziComposti!=null){
			for(int i=0; i<serviziComposti.sizeServizioCompostoList(); i++){
				String servizioComposto = serviziComposti.getServizioComposto(i).toString();
				IDAccordo idAccordo = SICAtoOpenSPCoopUtilities.idAccordoServizioComposto_sicaToOpenspcoop(registryReader,servizioComposto,sicaToOpenspcoopContext);
				try{
					accCooperazioneOpenspcoop.addUriServiziComposti(IDAccordoFactory.getInstance().getUriFromIDAccordo(idAccordo));
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("uri IDAccordo servizio composto ["+servizioComposto+"] non costruibile: "+e.getMessage(),e);
				}
			}
		}
		
		/* Firma apposta dal Servizio di Registro quando l'accordo viene scaricato dal Registro stesso  */
		//if(manifest.getFirmato() && accordoCooperazioneSICA.getFirma()!=null)
		//	accCooperazioneOpenspcoop.setByteFirma(accordoCooperazioneSICA.getFirma().getBytes());
		
		
		return accCooperazioneOpenspcoop;
	}
	public static it.gov.spcoop.sica.dao.AccordoCooperazione accordoCooperazione_openspcoopToSica(
			IRegistryReader registryReader,
			org.openspcoop2.core.registry.AccordoCooperazione accordoCooperazioneOpenspcoop,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,
			Logger logParam)throws SICAToOpenSPCoopUtilitiesException{
				
		Logger log = logParam;
		if(log==null){
			log = LoggerWrapperFactory.getLogger(SICAtoOpenSPCoopUtilities.class);
		}
		
		boolean includiInfoRegistroGenerale = sicaToOpenspcoopContext.isSICAClient_includiInfoRegistroGenerale();
				
		it.gov.spcoop.sica.dao.AccordoCooperazione accCooperazioneSICA = 
			new it.gov.spcoop.sica.dao.AccordoCooperazione();
		
		/* Metadati presenti nel Manifest dell'Accordo di Cooperazione. */
		it.gov.spcoop.sica.manifest.AccordoCooperazione manifest = new it.gov.spcoop.sica.manifest.AccordoCooperazione();
		manifest.setDescrizione(accordoCooperazioneOpenspcoop.getDescrizione());
		manifest.setNome(accordoCooperazioneOpenspcoop.getNome());
		manifest.setDataCreazione(accordoCooperazioneOpenspcoop.getOraRegistrazione());
		//manifest.getRiservato() ???
		
		if(includiInfoRegistroGenerale){
			
			if(accordoCooperazioneOpenspcoop.getVersione()!=null){
				manifest.setVersione(accordoCooperazioneOpenspcoop.getVersione().intValue()+"");
			}
			//manifest.setDataPubblicazione(accordoCooperazioneOpenspcoop.getDataPubblicazione());
			//if(accordoCooperazioneOpenspcoop.getByteFirma()!=null){
			//	manifest.setFirmato(true);
			//}
			
			// Coordinatore
			if(accordoCooperazioneOpenspcoop.getSoggettoReferente()==null)
				throw new SICAToOpenSPCoopUtilitiesException("Soggetto referente non definito");
			IDSoggetto soggettoCoordinatore = new IDSoggetto(accordoCooperazioneOpenspcoop.getSoggettoReferente().getTipo(),accordoCooperazioneOpenspcoop.getSoggettoReferente().getNome());
			String uriCoordinatore = sicaToOpenspcoopContext.getCodiceIPA(soggettoCoordinatore);
			if(uriCoordinatore==null)
				uriCoordinatore = SICAtoOpenSPCoopUtilities.idSoggetto_openspcoopToSica(soggettoCoordinatore);
			else
				uriCoordinatore = SICAtoOpenSPCoopUtilities.appendURI_IDSoggettoSica(uriCoordinatore);
			try {
				manifest.setCoordinatore(new URI(uriCoordinatore));
			}catch(Exception e) {
				throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
			}
			
			// ServiziComposti
			it.gov.spcoop.sica.manifest.ElencoServiziComposti sComposti = null;
			for(int i=0; i<accordoCooperazioneOpenspcoop.sizeUriServiziCompostiList(); i++){
				String uriServizioComposto =  accordoCooperazioneOpenspcoop.getUriServiziComposti(i);
					
				if(sComposti==null)
					sComposti = new it.gov.spcoop.sica.manifest.ElencoServiziComposti();
				try{
					sComposti.addServizioComposto(new URI(SICAtoOpenSPCoopUtilities.
							idAccordoServizioComposto_openspcoopToSica(registryReader,
									IDAccordoFactory.getInstance().getIDAccordoFromUri(uriServizioComposto),sicaToOpenspcoopContext)));
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Costruzione IDAccordo servizio composto ["+uriServizioComposto+"] non riuscito: "+e.getMessage(),e);
				}
			}
			if(sComposti!=null)
				manifest.setServiziComposti(sComposti);
			
		} 
		
		// Allegati
		if(accordoCooperazioneOpenspcoop.sizeAllegatoList()>0){
			it.gov.spcoop.sica.manifest.ElencoAllegati allegato = new it.gov.spcoop.sica.manifest.ElencoAllegati();
			for(int i=0; i<accordoCooperazioneOpenspcoop.sizeAllegatoList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = accordoCooperazioneOpenspcoop.getAllegato(i);
				allegato.addGenericoDocumento(docOpenspcoop.getFile());
				it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
				docSICA.setTipo(docOpenspcoop.getTipo());
				docSICA.setNome(docOpenspcoop.getFile());
				if(docOpenspcoop.getByteContenuto()==null){
					throw new SICAToOpenSPCoopUtilitiesException("Byte dell'allegato "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
				}
				docSICA.setContenuto(docOpenspcoop.getByteContenuto());
				accCooperazioneSICA.addAllegato(docSICA);
			}
			manifest.setAllegati(allegato);
		}
		
		// SpecificheSemiformali
		if(accordoCooperazioneOpenspcoop.sizeSpecificaSemiformaleList()>0){
			it.gov.spcoop.sica.manifest.SpecificaSemiformale specificaSemiformale = new it.gov.spcoop.sica.manifest.SpecificaSemiformale();
			for(int i=0; i<accordoCooperazioneOpenspcoop.sizeSpecificaSemiformaleList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = accordoCooperazioneOpenspcoop.getSpecificaSemiformale(i);
				
				it.gov.spcoop.sica.manifest.DocumentoSemiformale docSemiformale = new it.gov.spcoop.sica.manifest.DocumentoSemiformale();
				docSemiformale.setTipo(docOpenspcoop.getTipo());
				docSemiformale.setBase(docOpenspcoop.getFile());
				specificaSemiformale.addDocumentoSemiformale(docSemiformale);
				
				it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
				docSICA.setTipo(docOpenspcoop.getTipo());
				docSICA.setNome(docOpenspcoop.getFile());
				if(docOpenspcoop.getByteContenuto()==null){
					throw new SICAToOpenSPCoopUtilitiesException("Byte della specifica semiformale "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
				}
				docSICA.setContenuto(docOpenspcoop.getByteContenuto());
				accCooperazioneSICA.addSpecificaSemiformale(docSICA);
			}
			manifest.setSpecificaSemiformale(specificaSemiformale);
		}

		// Partecipanti
		it.gov.spcoop.sica.manifest.ElencoPartecipanti partecipanti = null;
		if(accordoCooperazioneOpenspcoop.getElencoPartecipanti()!=null){
			AccordoCooperazionePartecipanti partecipantiOpenSPCoop = accordoCooperazioneOpenspcoop.getElencoPartecipanti();
			for(int i=0; i<partecipantiOpenSPCoop.sizeSoggettoPartecipanteList(); i++){
				IdSoggetto soggetto = partecipantiOpenSPCoop.getSoggettoPartecipante(i);
				IDSoggetto idSoggetto = new IDSoggetto(soggetto.getTipo(),soggetto.getNome());
				
				if(partecipanti==null)
					partecipanti = new it.gov.spcoop.sica.manifest.ElencoPartecipanti();
				String codiceIPAPartecipante = sicaToOpenspcoopContext.getCodiceIPA(idSoggetto);
				if(codiceIPAPartecipante==null){
					codiceIPAPartecipante = SICAtoOpenSPCoopUtilities.idSoggetto_openspcoopToSica(idSoggetto);
				}
				else
					codiceIPAPartecipante = SICAtoOpenSPCoopUtilities.appendURI_IDSoggettoSica(codiceIPAPartecipante);
				try {
					partecipanti.addPartecipante(new URI(codiceIPAPartecipante));
				}catch(Exception e) {
					throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
				}
			}
		}
		if(partecipanti!=null)
			manifest.setElencoPartecipanti(partecipanti);
		
		/* Firma apposta dal Servizio di Registro quando l'accordo viene scaricato dal Registro stesso  */
		if(includiInfoRegistroGenerale){
			//if(accordoCooperazioneOpenspcoop.getByteFirma()!=null){
			//	it.gov.spcoop.sica.firma.Firma firma = new it.gov.spcoop.sica.firma.Firma();
			//	accCooperazioneSICA.setFirma(firma);
			//}
		}
		
		accCooperazioneSICA.setManifesto(manifest);
		return accCooperazioneSICA;
	}
	
	
	
	
	
	
	
	
	
	
	
	/* Accordi di servizio, parte comune */
	public static org.openspcoop2.core.registry.AccordoServizioParteComune accordoServizioParteComune_sicaToOpenspcoop(
			IRegistryReader registryReader,
			it.gov.spcoop.sica.dao.AccordoServizioParteComune accordoServizioSICA,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,
			Logger log)throws SICAToOpenSPCoopUtilitiesException{
		
		if(log==null){
			log = LoggerWrapperFactory.getLogger(SICAtoOpenSPCoopUtilities.class);
		}
		
		boolean verificaCorreggiLocationWSDL = sicaToOpenspcoopContext.isWSDL_XSD_allineaImportInclude();
		boolean prettyDocument = sicaToOpenspcoopContext.isWSDL_XSD_prettyDocuments();
		boolean documentoSpecificaEGOV_asClientSICADisabled_childUnquilified = sicaToOpenspcoopContext.isInformazioniEGov_wscpDisabled_childUnqualified();
		boolean documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified = sicaToOpenspcoopContext.isInformazioniEGov_wscpEnabled_childUnqualified();
		
		org.openspcoop2.core.registry.AccordoServizioParteComune accServizioOpenspcoop = new org.openspcoop2.core.registry.AccordoServizioParteComune();
		accServizioOpenspcoop.setServiceBinding(ServiceBinding.SOAP);
		accServizioOpenspcoop.setFormatoSpecifica(FormatoSpecifica.WSDL_11);
		
		/* Metadati presenti nel Manifest dell'Accordo di Cooperazione. */
		it.gov.spcoop.sica.manifest.AccordoServizio manifest = accordoServizioSICA.getManifesto();
		accServizioOpenspcoop.setDescrizione(resizeDescriptionForMaxLength(manifest.getDescrizione()));
		accServizioOpenspcoop.setNome(manifest.getNome());
		if(manifest.getVersione()!=null){
			accServizioOpenspcoop.setVersione(Integer.parseInt(manifest.getVersione()));
		}
		accServizioOpenspcoop.setOraRegistrazione(manifest.getDataCreazione());
		//accServizioOpenspcoop.setDataPubblicazione(manifest.getDataPubblicazione());
		accServizioOpenspcoop.setProfiloCollaborazione(CostantiRegistroServizi.ONEWAY); // Default per AS
		//manifest.getRiservato() ???
		
		it.gov.spcoop.sica.manifest.AccordoServizioParteComune parteComune = manifest.getParteComune();
		
		// SpecificaInterfaccia
		it.gov.spcoop.sica.manifest.SpecificaInterfaccia specificaInterfaccia = parteComune.getSpecificaInterfaccia();
		if( (accordoServizioSICA.getInterfacciaConcettuale()!=null) ||  (accordoServizioSICA.getInterfacciaLogicaLatoErogatore()!=null) || (accordoServizioSICA.getInterfacciaLogicaLatoFruitore()!=null) ){
			if(specificaInterfaccia.getInterfacciaConcettuale()!=null &&  accordoServizioSICA.getInterfacciaConcettuale()!=null &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getInterfacciaConcettuale().getContenuto()) ){
				accServizioOpenspcoop.setByteWsdlConcettuale(accordoServizioSICA.getInterfacciaConcettuale().getContenuto());
			}
			if(specificaInterfaccia.getInterfacciaLogicaLatoErogatore()!=null && accordoServizioSICA.getInterfacciaLogicaLatoErogatore()!=null &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getInterfacciaLogicaLatoErogatore().getContenuto()) ){
				accServizioOpenspcoop.setByteWsdlLogicoErogatore(accordoServizioSICA.getInterfacciaLogicaLatoErogatore().getContenuto());
			}
			if(specificaInterfaccia.getInterfacciaLogicaLatoFruitore()!=null && accordoServizioSICA.getInterfacciaLogicaLatoFruitore()!=null &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getInterfacciaLogicaLatoFruitore().getContenuto()) ){
				accServizioOpenspcoop.setByteWsdlLogicoFruitore(accordoServizioSICA.getInterfacciaLogicaLatoFruitore().getContenuto());
			}
		}
		
		// SpecificaConversazione
		it.gov.spcoop.sica.manifest.SpecificaConversazione specificaConversazione = parteComune.getSpecificaConversazione();
		if( (accordoServizioSICA.getConversazioneConcettuale()!=null) ||  (accordoServizioSICA.getConversazioneLogicaErogatore()!=null) || (accordoServizioSICA.getConversazioneLogicaFruitore()!=null) ){
			if(specificaConversazione.getConversazioneConcettuale()!=null && accordoServizioSICA.getConversazioneConcettuale()!=null  &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getConversazioneConcettuale().getContenuto()) ){
				accServizioOpenspcoop.setByteSpecificaConversazioneConcettuale(accordoServizioSICA.getConversazioneConcettuale().getContenuto());
			}
			if(specificaConversazione.getConversazioneLogicaLatoErogatore()!=null && accordoServizioSICA.getConversazioneLogicaErogatore()!=null  &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getConversazioneLogicaErogatore().getContenuto()) ){
				accServizioOpenspcoop.setByteSpecificaConversazioneErogatore(accordoServizioSICA.getConversazioneLogicaErogatore().getContenuto());
			}
			if(specificaConversazione.getConversazioneLogicaLatoFruitore()!=null && accordoServizioSICA.getConversazioneLogicaFruitore()!=null  &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getConversazioneLogicaFruitore().getContenuto()) ){
				accServizioOpenspcoop.setByteSpecificaConversazioneFruitore(accordoServizioSICA.getConversazioneLogicaFruitore().getContenuto());
			}
		}
		
		// Pubblicatore:
		if(parteComune.getPubblicatore()!=null){
			IdSoggetto soggettoReferente = 
				new IdSoggetto(); 
			IDSoggetto soggettoPubblicatore = sicaToOpenspcoopContext.getIDSoggetto(SICAtoOpenSPCoopUtilities.removeURI_IDSoggettoSica(parteComune.getPubblicatore().toString()));
			if(soggettoPubblicatore==null){
				soggettoPubblicatore = SICAtoOpenSPCoopUtilities.idSoggetto_sicaToOpenspcoop(parteComune.getPubblicatore().toString());
			}
			soggettoReferente.setNome(soggettoPubblicatore.getNome());
			soggettoReferente.setTipo(soggettoPubblicatore.getTipo());
			accServizioOpenspcoop.setSoggettoReferente(soggettoReferente);
		}
		
		boolean findDocumentoSpecificaEGOV = false;
		String tipoDocumentoSpecificaEGovTrovato = null;
		String fileNameSpecificaEGovTrovata = null;
		
		// Allegati
		if(manifest.getAllegati()!=null){
			for(int i=0; i<manifest.getAllegati().sizeGenericoDocumentoList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = manifest.getAllegati().getGenericoDocumento(i);
				
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.allegato.toString());			
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeAllegati(); j++){
					if(fileName.equals(accordoServizioSICA.getAllegato(j).getNome())){
						docSICA = accordoServizioSICA.getAllegato(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("Allegato con nome["+fileName+"] non trovato");
				
				if(Costanti.ALLEGATO_DEFINITORIO_XSD.equals(fileName)){
					
					accServizioOpenspcoop.setByteWsdlDefinitorio(docSICA.getContenuto());
				
				}else{
					
					// tipo: http://spcoop.gov.it/sica/wscp
					boolean specificaEGovAsClientSICA = it.gov.spcoop.sica.wscp.driver.XMLUtils.isProfiloCollaborazioneEGOV(docSICA.getContenuto());
					// tipo: http://www.cnipa.it/collProfiles
					boolean specificaEGovAsDocumentoCNIPA = it.cnipa.collprofiles.driver.XMLUtils.isProfiloCollaborazioneEGOV(docSICA.getContenuto());
					
					// Check vincoli di unicita
					if(findDocumentoSpecificaEGOV){
						String fileNameTmp = Costanti.ALLEGATI_DIR+File.separatorChar+fileName;
						if(specificaEGovAsClientSICA){
							throw new SICAToOpenSPCoopUtilitiesException("Nel package sono presenti piu' di una specifica delle informazioni egov. E' stata gia' processata una specifica di tipo "+tipoDocumentoSpecificaEGovTrovato+" ("+fileNameSpecificaEGovTrovata+") e adesso e' stato riscontrato una specifica di tipo "+it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE+" ("+fileNameTmp+")");
						}
						if(specificaEGovAsDocumentoCNIPA){
							throw new SICAToOpenSPCoopUtilitiesException("Nel package sono presenti piu' di una specifica delle informazioni egov. E' stata gia' processata una specifica di tipo "+tipoDocumentoSpecificaEGovTrovato+" ("+fileNameSpecificaEGovTrovata+") e adesso e' stato riscontrato una specifica di tipo "+it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE+" ("+fileNameTmp+")");
						}
					}else{
						if(specificaEGovAsClientSICA && specificaEGovAsDocumentoCNIPA){
							throw new SICAToOpenSPCoopUtilitiesException("Trovata specifica delle informazioni egov sia di tipo "+it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE+" che di tipo "+it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE+" ??");
						}
						if(specificaEGovAsClientSICA || specificaEGovAsDocumentoCNIPA){
							findDocumentoSpecificaEGOV = true;
							fileNameSpecificaEGovTrovata = Costanti.ALLEGATI_DIR+File.separatorChar+fileName;
						}
					}
					
					// Gestione
					if(specificaEGovAsClientSICA){
						try{
							it.gov.spcoop.sica.wscp.driver.XMLUtils.mapProfiloCollaborazioneEGOVIntoAS(log,docSICA.getContenuto(), accServizioOpenspcoop, documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified);
							tipoDocumentoSpecificaEGovTrovato = it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE;
						}catch(Exception e){
							throw new SICAToOpenSPCoopUtilitiesException("Errore durante la verifica dell'esistenza del documento di tipo 'ProfiloCollaborazioneEGOV' per il file ["+fileName+"] : "+e.getMessage(),e);
						}
					}
					else if(specificaEGovAsDocumentoCNIPA){
						try{
							it.cnipa.collprofiles.driver.XMLUtils.mapProfiloCollaborazioneEGOVIntoAS(log,docSICA.getContenuto(), accServizioOpenspcoop, documentoSpecificaEGOV_asClientSICADisabled_childUnquilified);
							tipoDocumentoSpecificaEGovTrovato = it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE;
						}catch(Exception e){
							throw new SICAToOpenSPCoopUtilitiesException("Errore durante la verifica dell'esistenza del documento di tipo 'ProfiloCollaborazioneEGOV' per il file ["+fileName+"] : "+e.getMessage(),e);
						}
					}
					else{
						//allegatoGenerico
						docOpenspcoop.setTipo(docSICA.getTipo());
						docOpenspcoop.setByteContenuto(docSICA.getContenuto());
						accServizioOpenspcoop.addAllegato(docOpenspcoop);
					}
				}
			}
		}
		
		// SpecificaSemiformale
		if(manifest.getSpecificaSemiformale()!=null){
			for(int i=0; i<manifest.getSpecificaSemiformale().sizeDocumentoSemiformaleList(); i++){
				DocumentoSemiformale specificaSemiformale = manifest.getSpecificaSemiformale().getDocumentoSemiformale(i);
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = specificaSemiformale.getBase();
				
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeSpecificheSemiformali(); j++){
					if(fileName.equals(accordoServizioSICA.getSpecificaSemiformale(j).getNome())){
						docSICA = accordoServizioSICA.getSpecificaSemiformale(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("SpecificaSemiformale con nome["+fileName+"] non trovato");
				
				// tipo: http://spcoop.gov.it/sica/wscp
				boolean specificaEGovAsClientSICA = it.gov.spcoop.sica.wscp.driver.XMLUtils.isProfiloCollaborazioneEGOV(docSICA.getContenuto());
				// tipo: http://www.cnipa.it/collProfiles
				boolean specificaEGovAsDocumentoCNIPA = it.cnipa.collprofiles.driver.XMLUtils.isProfiloCollaborazioneEGOV(docSICA.getContenuto());
				
				// Check vincoli di unicita
				if(findDocumentoSpecificaEGOV){
					String fileNameTmp = Costanti.SPECIFICA_SEMIFORMALE_DIR+File.separatorChar+fileName;
					if(specificaEGovAsClientSICA){
						throw new SICAToOpenSPCoopUtilitiesException("Nel package sono presenti piu' di una specifica delle informazioni egov. E' stata gia' processata una specifica di tipo "+tipoDocumentoSpecificaEGovTrovato+" ("+fileNameSpecificaEGovTrovata+") e adesso e' stato riscontrato una specifica di tipo "+it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE+" ("+fileNameTmp+")");
					}
					if(specificaEGovAsDocumentoCNIPA){
						throw new SICAToOpenSPCoopUtilitiesException("Nel package sono presenti piu' di una specifica delle informazioni egov. E' stata gia' processata una specifica di tipo "+tipoDocumentoSpecificaEGovTrovato+" ("+fileNameSpecificaEGovTrovata+") e adesso e' stato riscontrato una specifica di tipo "+it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE+" ("+fileNameTmp+")");
					}
				}else{
					if(specificaEGovAsClientSICA && specificaEGovAsDocumentoCNIPA){
						throw new SICAToOpenSPCoopUtilitiesException("La specifica delle informazioni egov e' sia di tipo "+it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE+" che di tipo "+it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE+" ??");
					}
					if(specificaEGovAsClientSICA || specificaEGovAsDocumentoCNIPA){
						findDocumentoSpecificaEGOV = true;
						fileNameSpecificaEGovTrovata = Costanti.SPECIFICA_SEMIFORMALE_DIR+File.separatorChar+fileName;
					}
				}
				
				// Gestione
				if(specificaEGovAsClientSICA){
					try{
						it.gov.spcoop.sica.wscp.driver.XMLUtils.mapProfiloCollaborazioneEGOVIntoAS(log,docSICA.getContenuto(), accServizioOpenspcoop, documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified);
						tipoDocumentoSpecificaEGovTrovato = it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE;
						findDocumentoSpecificaEGOV = true;
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("Errore durante la verifica dell'esistenza del documento di tipo 'ProfiloCollaborazioneEGOV' per il file ["+fileName+"] : "+e.getMessage(),e);
					}
				}
				else if(specificaEGovAsDocumentoCNIPA){
					try{
						it.cnipa.collprofiles.driver.XMLUtils.mapProfiloCollaborazioneEGOVIntoAS(log,docSICA.getContenuto(), accServizioOpenspcoop, documentoSpecificaEGOV_asClientSICADisabled_childUnquilified);
						tipoDocumentoSpecificaEGovTrovato = it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE;
						findDocumentoSpecificaEGOV = true;
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("Errore durante la verifica dell'esistenza del documento di tipo 'ProfiloCollaborazioneEGOV' per il file ["+fileName+"] : "+e.getMessage(),e);
					}
				}
				else{
					//specificaSemiformaleGenerica
					docOpenspcoop.setFile(fileName);
					docOpenspcoop.setRuolo(RuoliDocumento.specificaSemiformale.toString());			
					docOpenspcoop.setTipo(docSICA.getTipo());
					docOpenspcoop.setByteContenuto(docSICA.getContenuto());
					accServizioOpenspcoop.addSpecificaSemiformale(docOpenspcoop);
				}
			}
		}
	
		
		/* Firma apposta dal Servizio di Registro quando l'accordo viene scaricato dal Registro stesso  */
		//if(manifest.getFirmato() && accordoServizioSICA.getFirma()!=null)
		//	accServizioOpenspcoop.setByteFirma(accordoServizioSICA.getFirma().getBytes());
		
		// Correggo eventuali import/include malformati in maniera conforme alla struttura del package CNIPA
		if(verificaCorreggiLocationWSDL){
			try{
				RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), log);
				registroOpenSPCoopUtilities.updateLocation(accServizioOpenspcoop,false,prettyDocument);
			}catch(Exception e){
				throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.setImportLocation error: "+e.getMessage(),e);
			}
		}
		
		if(findDocumentoSpecificaEGOV==false){
			accServizioOpenspcoop.setProfiloCollaborazione(null); // In modo da riconoscere il caso e farlo gestire
		}
		
		return accServizioOpenspcoop;
	}
	public static it.gov.spcoop.sica.dao.AccordoServizioParteComune accordoServizioParteComune_openspcoopToSica(
			IRegistryReader registryReader,
			org.openspcoop2.core.registry.AccordoServizioParteComune accordoServizioOpenspcoop,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,
			Logger log)throws SICAToOpenSPCoopUtilitiesException{
		
		if(log==null){
			log = LoggerWrapperFactory.getLogger(SICAtoOpenSPCoopUtilities.class);
		}
		
		boolean documentoSpecificaEGOV_asClientSICA = sicaToOpenspcoopContext.isInformazioniEGov_wscp();
		boolean documentoSpecificaEGOV_asSpecificaSemiformale = sicaToOpenspcoopContext.isInformazioniEGov_specificaSemiformale();
		boolean documentoSpecificaEGOV_asClientSICADisabled_namespaceCNIPA = sicaToOpenspcoopContext.isInformazioniEGov_wscpDisabled_namespaceCnipa();
		boolean documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified = sicaToOpenspcoopContext.isInformazioniEGov_wscpEnabled_childUnqualified();
		boolean documentoSpecificaEGOV_nomiSPCoopQualified = sicaToOpenspcoopContext.isInformazioniEGov_nomiSPCoop_qualified();
		boolean verificaCorreggiLocationWSDL = sicaToOpenspcoopContext.isWSDL_XSD_allineaImportInclude();
		boolean prettyDocument = sicaToOpenspcoopContext.isWSDL_XSD_prettyDocuments();
		boolean includiInfoRegistroGenerale = sicaToOpenspcoopContext.isSICAClient_includiInfoRegistroGenerale();
		boolean wsdlEmptySeNonDefiniti = sicaToOpenspcoopContext.isWSDL_XSD_accordiParteSpecifica_wsdlEmpty();

		// Correggo eventuali import/include malformati in maniera conforme alla struttura del package CNIPA
		if(verificaCorreggiLocationWSDL){
			try{
				RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), log);
				registroOpenSPCoopUtilities.updateLocation(accordoServizioOpenspcoop,true,prettyDocument);
			}catch(Exception e){
				throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.setImportLocation error: "+e.getMessage(),e);
			}
		}
		
		it.gov.spcoop.sica.dao.AccordoServizioParteComune accServParteComuneSICA = 
			new it.gov.spcoop.sica.dao.AccordoServizioParteComune();
		
		/* Metadati presenti nel Manifest dell'Accordo di Cooperazione. */
		it.gov.spcoop.sica.manifest.AccordoServizio manifest = new it.gov.spcoop.sica.manifest.AccordoServizio();
		manifest.setDescrizione(accordoServizioOpenspcoop.getDescrizione());
		manifest.setNome(accordoServizioOpenspcoop.getNome());
		manifest.setDataCreazione(accordoServizioOpenspcoop.getOraRegistrazione());
		//manifest.getRiservato() ???
		
		it.gov.spcoop.sica.manifest.AccordoServizioParteComune parteComune = new it.gov.spcoop.sica.manifest.AccordoServizioParteComune();
		
		if(includiInfoRegistroGenerale){
			if(accordoServizioOpenspcoop.getVersione()!=null){
				manifest.setVersione(accordoServizioOpenspcoop.getVersione().intValue()+"");
			}
			//manifest.setDataPubblicazione(accordoServizioOpenspcoop.getDataPubblicazione());
			//if(accordoServizioOpenspcoop.getByteFirma()!=null){
			//	manifest.setFirmato(true);
			//}
			
			// Pubblicatore
			if(accordoServizioOpenspcoop.getSoggettoReferente()==null)
				throw new SICAToOpenSPCoopUtilitiesException("Soggetto referente non definito");
			IDSoggetto soggettoPubblicatore = new IDSoggetto(accordoServizioOpenspcoop.getSoggettoReferente().getTipo(),accordoServizioOpenspcoop.getSoggettoReferente().getNome());
			String uriPubblicatore = sicaToOpenspcoopContext.getCodiceIPA(soggettoPubblicatore);
			if(uriPubblicatore==null){
				uriPubblicatore = SICAtoOpenSPCoopUtilities.idSoggetto_openspcoopToSica(soggettoPubblicatore);
			}
			else
				uriPubblicatore = SICAtoOpenSPCoopUtilities.appendURI_IDSoggettoSica(uriPubblicatore);
			try {
				parteComune.setPubblicatore(new URI(uriPubblicatore));
			}catch(Exception e) {
				throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
			}
		}
		
		
		// SpecificaInterfaccia
		it.gov.spcoop.sica.manifest.SpecificaInterfaccia specificaInterfaccia = null;
		if(  (accordoServizioOpenspcoop.getByteWsdlConcettuale()!=null) || (accordoServizioOpenspcoop.getByteWsdlLogicoErogatore()!=null) || (accordoServizioOpenspcoop.getByteWsdlLogicoFruitore()!=null) ){
			specificaInterfaccia = new it.gov.spcoop.sica.manifest.SpecificaInterfaccia();
		}
		if(wsdlEmptySeNonDefiniti || (accordoServizioOpenspcoop.getByteWsdlConcettuale()!=null)){
			it.gov.spcoop.sica.manifest.DocumentoInterfaccia docInterfaccia = new it.gov.spcoop.sica.manifest.DocumentoInterfaccia();
			docInterfaccia.setBase(Costanti.SPECIFICA_INTERFACCIA_CONCETTUALE_WSDL);
			docInterfaccia.setTipo(TipoDocumentoInterfaccia.WSDL);
			specificaInterfaccia.setInterfacciaConcettuale(docInterfaccia);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoInterfaccia.WSDL.toString());
			doc.setNome(Costanti.SPECIFICA_INTERFACCIA_CONCETTUALE_WSDL);
			if(accordoServizioOpenspcoop.getByteWsdlConcettuale()!=null){
				doc.setContenuto(accordoServizioOpenspcoop.getByteWsdlConcettuale());
			}else{
				// Imposto WSDL Empty per compatibilita Client SICA
				doc.setContenuto(Costanti.WSDL_EMPTY.getBytes());
			}
			accServParteComuneSICA.setInterfacciaConcettuale(doc);
		}
		if(wsdlEmptySeNonDefiniti || (accordoServizioOpenspcoop.getByteWsdlLogicoErogatore()!=null)){
			it.gov.spcoop.sica.manifest.DocumentoInterfaccia docInterfaccia = new it.gov.spcoop.sica.manifest.DocumentoInterfaccia();
			docInterfaccia.setBase(Costanti.SPECIFICA_INTERFACCIA_LOGICA_EROGATORE_WSDL);
			docInterfaccia.setTipo(TipoDocumentoInterfaccia.WSDL);
			specificaInterfaccia.setInterfacciaLogicaLatoErogatore(docInterfaccia);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoInterfaccia.WSDL.toString());
			doc.setNome(Costanti.SPECIFICA_INTERFACCIA_LOGICA_EROGATORE_WSDL);
			if(accordoServizioOpenspcoop.getByteWsdlLogicoErogatore()!=null){
				doc.setContenuto(accordoServizioOpenspcoop.getByteWsdlLogicoErogatore());
			}else{
				// Imposto WSDL Empty per compatibilita Client SICA
				doc.setContenuto(Costanti.WSDL_EMPTY.getBytes());
			}
			accServParteComuneSICA.setInterfacciaLogicaLatoErogatore(doc);
		}
		if(wsdlEmptySeNonDefiniti || (accordoServizioOpenspcoop.getByteWsdlLogicoFruitore()!=null)){
			it.gov.spcoop.sica.manifest.DocumentoInterfaccia docInterfaccia = new it.gov.spcoop.sica.manifest.DocumentoInterfaccia();
			docInterfaccia.setBase(Costanti.SPECIFICA_INTERFACCIA_LOGICA_FRUITORE_WSDL);
			docInterfaccia.setTipo(TipoDocumentoInterfaccia.WSDL);
			specificaInterfaccia.setInterfacciaLogicaLatoFruitore(docInterfaccia);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoInterfaccia.WSDL.toString());
			doc.setNome(Costanti.SPECIFICA_INTERFACCIA_LOGICA_FRUITORE_WSDL);
			if(accordoServizioOpenspcoop.getByteWsdlLogicoFruitore()!=null){
				doc.setContenuto(accordoServizioOpenspcoop.getByteWsdlLogicoFruitore());
			}else{
				// Imposto WSDL Empty per compatibilita Client SICA
				doc.setContenuto(Costanti.WSDL_EMPTY.getBytes());
			}
			accServParteComuneSICA.setInterfacciaLogicaLatoFruitore(doc);
		}
		if(specificaInterfaccia!=null){
			parteComune.setSpecificaInterfaccia(specificaInterfaccia);
		}
		
		
		// SpecificaConversazione (li cerco sia negli allegati che nelle specifiche semiformali)
		it.gov.spcoop.sica.manifest.SpecificaConversazione specificaConversazione = null;
		if(  (accordoServizioOpenspcoop.getByteSpecificaConversazioneConcettuale()!=null) || 
				(accordoServizioOpenspcoop.getByteSpecificaConversazioneErogatore()!=null) || 
				(accordoServizioOpenspcoop.getByteSpecificaConversazioneFruitore()!=null) ){
			specificaConversazione = new it.gov.spcoop.sica.manifest.SpecificaConversazione();
		}
		if(accordoServizioOpenspcoop.getByteSpecificaConversazioneConcettuale()!=null){
			it.gov.spcoop.sica.manifest.DocumentoConversazione docConversazione = new it.gov.spcoop.sica.manifest.DocumentoConversazione();
			docConversazione.setBase(Costanti.SPECIFICA_CONVERSAZIONE_CONCETTUALE_WSBL);
			docConversazione.setTipo(TipoDocumentoConversazione.WSBL);
			specificaConversazione.setConversazioneConcettuale(docConversazione);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoConversazione.WSBL.toString());
			doc.setNome(Costanti.SPECIFICA_CONVERSAZIONE_CONCETTUALE_WSBL);
			doc.setContenuto(accordoServizioOpenspcoop.getByteSpecificaConversazioneConcettuale());
			accServParteComuneSICA.setConversazioneConcettuale(doc);
		}
		if(accordoServizioOpenspcoop.getByteSpecificaConversazioneErogatore()!=null){
			it.gov.spcoop.sica.manifest.DocumentoConversazione docConversazione = new it.gov.spcoop.sica.manifest.DocumentoConversazione();
			docConversazione.setBase(Costanti.SPECIFICA_CONVERSAZIONE_LOGICA_LATO_EROGATORE_WSBL);
			docConversazione.setTipo(TipoDocumentoConversazione.WSBL);
			specificaConversazione.setConversazioneLogicaLatoErogatore(docConversazione);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoConversazione.WSBL.toString());
			doc.setNome(Costanti.SPECIFICA_CONVERSAZIONE_LOGICA_LATO_EROGATORE_WSBL);
			doc.setContenuto(accordoServizioOpenspcoop.getByteSpecificaConversazioneErogatore());
			accServParteComuneSICA.setConversazioneLogicaErogatore(doc);
		}
		if(accordoServizioOpenspcoop.getByteSpecificaConversazioneFruitore()!=null){
			it.gov.spcoop.sica.manifest.DocumentoConversazione docConversazione = new it.gov.spcoop.sica.manifest.DocumentoConversazione();
			docConversazione.setBase(Costanti.SPECIFICA_CONVERSAZIONE_LOGICA_LATO_FRUITORE_WSBL);
			docConversazione.setTipo(TipoDocumentoConversazione.WSBL);
			specificaConversazione.setConversazioneLogicaLatoFruitore(docConversazione);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoConversazione.WSBL.toString());
			doc.setNome(Costanti.SPECIFICA_CONVERSAZIONE_LOGICA_LATO_FRUITORE_WSBL);
			doc.setContenuto(accordoServizioOpenspcoop.getByteSpecificaConversazioneFruitore());
			accServParteComuneSICA.setConversazioneLogicaFruitore(doc);
		}
		if(specificaConversazione!=null){
			parteComune.setSpecificaConversazione(specificaConversazione);
		}
		
				
		/* Allegati */
		it.gov.spcoop.sica.manifest.ElencoAllegati allegati = null;
		// ProfiloCollaborazioneEGOV
		if(accordoServizioOpenspcoop.sizePortTypeList()>0 && !documentoSpecificaEGOV_asSpecificaSemiformale){
			String docGenerico = null;
			if(documentoSpecificaEGOV_asClientSICA){
				try{
					docGenerico = it.gov.spcoop.sica.wscp.driver.XMLUtils.generaGenericoDocumento(accordoServizioOpenspcoop, accServParteComuneSICA,
							documentoSpecificaEGOV_nomiSPCoopQualified, documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified);
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Errore durante la conversione delle informazioni eGov in Allegati (http://spcoop.gov.it/sica/wscp): "+e.getMessage(),e);
				}
			}else{
				try{
					docGenerico = it.cnipa.collprofiles.driver.XMLUtils.generaGenericoDocumento(accordoServizioOpenspcoop, accServParteComuneSICA,
							documentoSpecificaEGOV_asClientSICADisabled_namespaceCNIPA,
							documentoSpecificaEGOV_nomiSPCoopQualified);
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Errore durante la conversione delle informazioni eGov in Allegati (http://www.cnipa.it/collProfiles): "+e.getMessage(),e);
				}
			}
			if(docGenerico!=null){
				if(allegati==null){
					allegati = new it.gov.spcoop.sica.manifest.ElencoAllegati();
				}
				allegati.addGenericoDocumento(docGenerico);
				manifest.setAllegati(allegati);
			}
		}
		// Altri allegati generici
		if(accordoServizioOpenspcoop.sizeAllegatoList()>0){
			if(allegati==null){
				allegati = new it.gov.spcoop.sica.manifest.ElencoAllegati();
			}
			for(int i=0; i<accordoServizioOpenspcoop.sizeAllegatoList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = accordoServizioOpenspcoop.getAllegato(i);
				allegati.addGenericoDocumento(docOpenspcoop.getFile());
				
				it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
				docSICA.setTipo(docOpenspcoop.getTipo());
				docSICA.setNome(docOpenspcoop.getFile());
				if(docOpenspcoop.getByteContenuto()==null){
					throw new SICAToOpenSPCoopUtilitiesException("Byte dell'allegato "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
				}
				docSICA.setContenuto(docOpenspcoop.getByteContenuto());
				accServParteComuneSICA.addAllegato(docSICA);
			}
			manifest.setAllegati(allegati);
		}
		// WSDL Definitorio
		if(accordoServizioOpenspcoop.getByteWsdlDefinitorio()!=null){
			if(allegati==null) {
				allegati = new it.gov.spcoop.sica.manifest.ElencoAllegati();
			}
			allegati.addGenericoDocumento(Costanti.ALLEGATO_DEFINITORIO_XSD);
			manifest.setAllegati(allegati);
			
			it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
			docSICA.setTipo("XSD");
			docSICA.setNome(Costanti.ALLEGATO_DEFINITORIO_XSD);
			docSICA.setContenuto(accordoServizioOpenspcoop.getByteWsdlDefinitorio());
			accServParteComuneSICA.addAllegato(docSICA);
		}
		
		
		
		/* SpecificheSemiformali */
		it.gov.spcoop.sica.manifest.SpecificaSemiformale specificaSemiformale = null;
		// ProfiloCollaborazioneEGOV
		if(accordoServizioOpenspcoop.sizePortTypeList()>0 && documentoSpecificaEGOV_asSpecificaSemiformale){
			it.gov.spcoop.sica.manifest.DocumentoSemiformale docSemiformale = null;
			if(documentoSpecificaEGOV_asClientSICA){
				try{
					docSemiformale = it.gov.spcoop.sica.wscp.driver.XMLUtils.generaDocumentoSemiformale(accordoServizioOpenspcoop, accServParteComuneSICA,
							documentoSpecificaEGOV_nomiSPCoopQualified, documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified);
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Errore durante la conversione delle informazioni eGov in SpecificaSemiformale (http://spcoop.gov.it/sica/wscp): "+e.getMessage(),e);
				}
			}else{
				try{
					docSemiformale = it.cnipa.collprofiles.driver.XMLUtils.generaDocumentoSemiformale(accordoServizioOpenspcoop, accServParteComuneSICA, 
							documentoSpecificaEGOV_asClientSICADisabled_namespaceCNIPA,
							documentoSpecificaEGOV_nomiSPCoopQualified);
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Errore durante la conversione delle informazioni eGov in SpecificaSemiformale (http://www.cnipa.it/collProfiles): "+e.getMessage(),e);
				}
			}
			if(docSemiformale!=null){
				if(specificaSemiformale==null){
					specificaSemiformale = new it.gov.spcoop.sica.manifest.SpecificaSemiformale();
				}
				specificaSemiformale.addDocumentoSemiformale(docSemiformale);
				manifest.setSpecificaSemiformale(specificaSemiformale);
			}
		}
		// Altre Specifiche semiformali
		if(accordoServizioOpenspcoop.sizeSpecificaSemiformaleList()>0){
			if(specificaSemiformale==null){
				specificaSemiformale = new it.gov.spcoop.sica.manifest.SpecificaSemiformale();
			}
			for(int i=0; i<accordoServizioOpenspcoop.sizeSpecificaSemiformaleList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = accordoServizioOpenspcoop.getSpecificaSemiformale(i);
				
				it.gov.spcoop.sica.manifest.DocumentoSemiformale docSemiformale = new it.gov.spcoop.sica.manifest.DocumentoSemiformale();
				docSemiformale.setTipo(docOpenspcoop.getTipo());
				docSemiformale.setBase(docOpenspcoop.getFile());
				specificaSemiformale.addDocumentoSemiformale(docSemiformale);
							
				it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
				docSICA.setTipo(docOpenspcoop.getTipo());
				docSICA.setNome(docOpenspcoop.getFile());
				if(docOpenspcoop.getByteContenuto()==null){
					throw new SICAToOpenSPCoopUtilitiesException("Byte della specifica semiformale "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
				}
				docSICA.setContenuto(docOpenspcoop.getByteContenuto());
				accServParteComuneSICA.addSpecificaSemiformale(docSICA);
			}
			manifest.setSpecificaSemiformale(specificaSemiformale);
		}

		
		/* Firma apposta dal Servizio di Registro quando l'accordo viene scaricato dal Registro stesso  */
		if(includiInfoRegistroGenerale){
			//if(accordoServizioOpenspcoop.getByteFirma()!=null){
			//	it.gov.spcoop.sica.firma.Firma firma = new it.gov.spcoop.sica.firma.Firma();
			//	accServParteComuneSICA.setFirma(firma);
			//}
		}
		
		
		// Setto parte comune
		manifest.setParteComune(parteComune);
		
		accServParteComuneSICA.setManifesto(manifest);
		return accServParteComuneSICA;

	}
	
	
	
	
	
	
	/* Accordi di servizio, parte specifica */
	public static org.openspcoop2.core.registry.AccordoServizioParteSpecifica accordoServizioParteSpecifica_sicaToOpenspcoop(
			IRegistryReader registryReader,
			it.gov.spcoop.sica.dao.AccordoServizioParteSpecifica accordoServizioSICA,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,
			Logger log)throws SICAToOpenSPCoopUtilitiesException{
		return SICAtoOpenSPCoopUtilities.accordoServizioParteSpecifica_sicaToOpenspcoop(registryReader,accordoServizioSICA, sicaToOpenspcoopContext,null,log);
	}
	public static org.openspcoop2.core.registry.AccordoServizioParteSpecifica accordoServizioParteSpecifica_sicaToOpenspcoop(
			IRegistryReader registryReader,
			it.gov.spcoop.sica.dao.AccordoServizioParteSpecifica accordoServizioSICA,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,String Servizio,
			Logger log)throws SICAToOpenSPCoopUtilitiesException{
		
		if(log==null){
			log = LoggerWrapperFactory.getLogger(SICAtoOpenSPCoopUtilities.class);
		}
		
		boolean verificaCorreggiLocationWSDL = sicaToOpenspcoopContext.isWSDL_XSD_allineaImportInclude();
		boolean prettyDocument = sicaToOpenspcoopContext.isWSDL_XSD_prettyDocuments();
		boolean eliminaInformazioniASParteComuneWSDL = sicaToOpenspcoopContext.isWSDL_XSD_accordiParteSpecifica_gestioneParteComune();
		boolean sicaToOpenspcoopAggiuntaImportParteComune = sicaToOpenspcoopContext.isWSDL_XSD_accordiParteSpecifica_sicaToOpenspcoop_aggiuntaImportParteComune();
		
		org.openspcoop2.core.registry.AccordoServizioParteSpecifica aspsOpenSPCoop = new org.openspcoop2.core.registry.AccordoServizioParteSpecifica();
		
		IDAccordoFactory idAccordoFactory = IDAccordoFactory.getInstance();
		AbstractXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;		
		WSDLUtilities wsdlUtilities = WSDLUtilities.getInstance(xmlUtils);
				
		/* Metadati presenti nel Manifest dell'Accordo di Cooperazione. */
		it.gov.spcoop.sica.manifest.AccordoServizio manifest = accordoServizioSICA.getManifesto();
		
		aspsOpenSPCoop.setNome(manifest.getNome());
		if(manifest.getVersione()!=null){
			aspsOpenSPCoop.setVersione(Integer.parseInt(manifest.getVersione()));
		}
		
		aspsOpenSPCoop.setDescrizione(resizeDescriptionForMaxLength(manifest.getDescrizione()));
		aspsOpenSPCoop.setOraRegistrazione(manifest.getDataCreazione());
		//aspsOpenSPCoop.setDataPubblicazione(manifest.getDataPubblicazione());
		//manifest.getRiservato() ???
		
		it.gov.spcoop.sica.manifest.AccordoServizioParteSpecifica parteSpecifica = manifest.getParteSpecifica();
		
		// riferimentoParteComune
		try{
			String[] split =  parteSpecifica.getRiferimentoParteComune().toString().split(":");
			if(split.length<2)
				throw new Exception("Riferimento parte comune non corretto (split non riuscito) ["+parteSpecifica.getRiferimentoParteComune()+"]");
			if(split[1].equals(Costanti.TIPO_ACCORDO_SERVIZIO_COMPOSTO)){
				aspsOpenSPCoop.setAccordoServizioParteComune(idAccordoFactory.getUriFromIDAccordo(SICAtoOpenSPCoopUtilities.idAccordoServizioComposto_sicaToOpenspcoop(registryReader,parteSpecifica.getRiferimentoParteComune().toString(),sicaToOpenspcoopContext)));
			}else if(split[1].equals(Costanti.TIPO_ACCORDO_SERVIZIO_PARTE_COMUNE)){
				aspsOpenSPCoop.setAccordoServizioParteComune(idAccordoFactory.getUriFromIDAccordo(SICAtoOpenSPCoopUtilities.idAccordoServizioParteComune_sicaToOpenspcoop(registryReader,parteSpecifica.getRiferimentoParteComune().toString(),sicaToOpenspcoopContext)));
			}else{
				throw new Exception("Tipo accordo ["+split[1]+"] non conosciuto");
			}
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("Trasformazione riferimento parte comune ["+parteSpecifica.getRiferimentoParteComune()+"] non riuscita: "+e.getMessage(),e);
		}
		
		// Specifica Porti di Accesso
		String nomeServizio = Servizio; // Servizio puo' essere null, in tal caso calcolo il nome dal wsdl
		String nomeServizioCorrelato = Servizio; // Servizio puo' essere null, in tal caso calcolo il nome dal wsdl
		it.gov.spcoop.sica.manifest.SpecificaPortiAccesso specificaInterfaccia = parteSpecifica.getSpecificaPortiAccesso();
		if( (accordoServizioSICA.getPortiAccessoFruitore()!=null) ||  (accordoServizioSICA.getPortiAccessoErogatore()!=null) ){
			if(specificaInterfaccia.getPortiAccessoErogatore()!=null &&  accordoServizioSICA.getPortiAccessoErogatore()!=null
					&& accordoServizioSICA.getPortiAccessoErogatore().getContenuto()!=null
					&& !SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getPortiAccessoErogatore().getContenuto()) ){
				byte[] doc = accordoServizioSICA.getPortiAccessoErogatore().getContenuto();
				if(eliminaInformazioniASParteComuneWSDL){
					try{
						RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
						doc = registroOpenSPCoopUtilities.eliminaASParteComune(doc,true);
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.eliminaASParteComune error: "+e.getMessage(),e);
					}
				}else if(sicaToOpenspcoopAggiuntaImportParteComune){
					try{
						RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
						doc = registroOpenSPCoopUtilities.aggiungiImportASParteComune(doc,true);
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.aggiungiImportASParteComune error: "+e.getMessage(),e);
					}
				}
				aspsOpenSPCoop.setByteWsdlImplementativoErogatore(doc);
				aspsOpenSPCoop.setTipologiaServizio(TipologiaServizio.NORMALE);
				
				// Identificazione servizio SPCoop
				if(nomeServizio==null){
					try{
						Document d = xmlUtils.newDocument(doc);
						wsdlUtilities.removeImports(d);
						DefinitionWrapper wsdl = new DefinitionWrapper(d,xmlUtils);
						java.util.Map<?,?> bindings = wsdl.getAllBindings();
						if(bindings==null || bindings.size()<=0){
							throw new Exception("Bindings non presenti");
						}
						java.util.Iterator<?> bindingIterator = bindings.values().iterator();
						while(bindingIterator.hasNext()) {
							Binding binding = (Binding) bindingIterator.next();
							if(binding.getPortType()==null){
								throw new Exception("Un binding non specifica il port type implementato");
							}
							if(binding.getPortType().getQName()==null){
								throw new Exception("Binding con port type che non possiede QName");
							}
							if(nomeServizio==null)
								nomeServizio=binding.getPortType().getQName().getLocalPart();
							else{
								if(nomeServizio.equals(binding.getPortType().getQName().getLocalPart())==false){
									throw new Exception("Trovato piu' di un port-type implementato dai binding definiti nell'interfaccia");
								}
							}
						}
					}catch(Exception e){
						log.error("Identificazione servizio spcoop da wsdl implementativo erogatore non riuscita: "+e.getMessage(),e);
						//throw new SICAToOpenSPCoopUtilitiesException("Identificazione servizio spcoop da wsdl implementativo erogatore non riuscita: "+e.getMessage(),e);
						// Il Servizio verra' selezionato tramite select list
						nomeServizio = "Errore lettura dati Wsdl: "+e.getMessage();
					}
				}
			}
			if(specificaInterfaccia.getPortiAccessoFruitore()!=null &&  accordoServizioSICA.getPortiAccessoFruitore()!=null
					&& accordoServizioSICA.getPortiAccessoFruitore().getContenuto()!=null
					&& !SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getPortiAccessoFruitore().getContenuto()) ){
				byte[] doc = accordoServizioSICA.getPortiAccessoFruitore().getContenuto();
				if(eliminaInformazioniASParteComuneWSDL){
					try{
						RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
						doc = registroOpenSPCoopUtilities.eliminaASParteComune(doc,false);
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.eliminaASParteComune error: "+e.getMessage(),e);
					}
				}else if(sicaToOpenspcoopAggiuntaImportParteComune){
					try{
						RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
						doc = registroOpenSPCoopUtilities.aggiungiImportASParteComune(doc,false);
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.aggiungiImportASParteComune error: "+e.getMessage(),e);
					}
				}
				aspsOpenSPCoop.setByteWsdlImplementativoFruitore(doc);
				aspsOpenSPCoop.setTipologiaServizio(TipologiaServizio.CORRELATO);
				
				// Identificazione servizio SPCoop
				if(nomeServizioCorrelato==null){
					try{
						Document d = xmlUtils.newDocument(doc);
						wsdlUtilities.removeImports(d);
						DefinitionWrapper wsdl = new DefinitionWrapper(d,xmlUtils);
						java.util.Map<?,?> bindings = wsdl.getAllBindings();
						if(bindings==null || bindings.size()<=0){
							throw new Exception("Bindings non presenti");
						}
						java.util.Iterator<?> bindingIterator = bindings.values().iterator();
						while(bindingIterator.hasNext()) {
							Binding binding = (Binding) bindingIterator.next();
							if(binding.getPortType()==null){
								throw new Exception("Un binding non specifica il port type implementato");
							}
							if(binding.getPortType().getQName()==null){
								throw new Exception("Binding con port type che non possiede QName");
							}
							if(nomeServizioCorrelato==null)
								nomeServizioCorrelato=binding.getPortType().getQName().getLocalPart();
							else{
								if(nomeServizioCorrelato.equals(binding.getPortType().getQName().getLocalPart())==false){
									throw new Exception("Trovato piu' di un port-type implementato dai binding definiti nell'interfaccia");
								}
							}
						}
					}catch(Exception e){
						log.error("Identificazione servizio spcoop da wsdl implementativo fruitore non riuscita: "+e.getMessage(),e);
						// throw new SICAToOpenSPCoopUtilitiesException("Identificazione servizio spcoop da wsdl implementativo fruitore non riuscita: "+e.getMessage(),e);
						// Il Servizio verra' selezionato tramite select list
						nomeServizioCorrelato = "Errore lettura dati Wsdl: "+e.getMessage();
					}
				}
			}
		}
		if(TipologiaServizio.CORRELATO.equals(aspsOpenSPCoop.getTipologiaServizio())){
			if(nomeServizioCorrelato==null){
				//throw new SICAToOpenSPCoopUtilitiesException("Identificazione nome del Servizio SPCoop correlato non riuscita tramite la lettura dei wsdl implementativi");
				// Il Servizio verra' selezionato tramite select list
				nomeServizioCorrelato = "Errore lettura dati Wsdl: wsdl implementativo fruitore non esistente o corrotto";
			}
			//else{
			aspsOpenSPCoop.setTipo("spc");
			aspsOpenSPCoop.setNome(nomeServizioCorrelato);
			aspsOpenSPCoop.setPortType(nomeServizioCorrelato);
			//}
		}else{
			if(nomeServizio==null){
				//throw new SICAToOpenSPCoopUtilitiesException("Identificazione nome del Servizio SPCoop non riuscita tramite la lettura dei wsdl implementativi");
				// Il Servizio verra' selezionato tramite select list
				nomeServizio = "Errore lettura dati Wsdl: wsdl implementativo erogatore non esistente o corrotto";
			}
			//else{
			aspsOpenSPCoop.setTipo("spc");
			aspsOpenSPCoop.setNome(nomeServizio);
			aspsOpenSPCoop.setPortType(nomeServizio);
			//}
		}
				
		// Adesione
		//aspsOpenSPCoop.setTipoAdesione(parteSpecifica.getAdesione());
		
		
		// Erogatore:
		IDSoggetto soggettoErogatore = null;
		if(parteSpecifica.getErogatore()!=null){
			soggettoErogatore = sicaToOpenspcoopContext.getIDSoggetto(SICAtoOpenSPCoopUtilities.removeURI_IDSoggettoSica(parteSpecifica.getErogatore().toString()));
			if(soggettoErogatore==null){
				soggettoErogatore = SICAtoOpenSPCoopUtilities.idSoggetto_sicaToOpenspcoop(parteSpecifica.getErogatore().toString());
			}
			aspsOpenSPCoop.setTipoSoggettoErogatore(soggettoErogatore.getTipo());
			aspsOpenSPCoop.setNomeSoggettoErogatore(soggettoErogatore.getNome());
		}
	
						
		// Allegati
		if(manifest.getAllegati()!=null){
			for(int i=0; i<manifest.getAllegati().sizeGenericoDocumentoList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = manifest.getAllegati().getGenericoDocumento(i);
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.allegato.toString());			
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeAllegati(); j++){
					if(fileName.equals(accordoServizioSICA.getAllegato(j).getNome())){
						docSICA = accordoServizioSICA.getAllegato(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("Allegato con nome["+fileName+"] non trovato");
				docOpenspcoop.setTipo(docSICA.getTipo());
				docOpenspcoop.setByteContenuto(docSICA.getContenuto());
				aspsOpenSPCoop.addAllegato(docOpenspcoop);
			}
		}
		
		// SpecificaSemiformale	
		if(manifest.getSpecificaSemiformale()!=null){
			for(int i=0; i<manifest.getSpecificaSemiformale().sizeDocumentoSemiformaleList(); i++){
				DocumentoSemiformale specificaSemiformale = manifest.getSpecificaSemiformale().getDocumentoSemiformale(i);
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = specificaSemiformale.getBase();
				
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeSpecificheSemiformali(); j++){
					if(fileName.equals(accordoServizioSICA.getSpecificaSemiformale(j).getNome())){
						docSICA = accordoServizioSICA.getSpecificaSemiformale(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("SpecificaSemiformale con nome["+fileName+"] non trovato");
				
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.specificaSemiformale.toString());			
				docOpenspcoop.setTipo(docSICA.getTipo());
				docOpenspcoop.setByteContenuto(docSICA.getContenuto());
				aspsOpenSPCoop.addSpecificaSemiformale(docOpenspcoop);
			}
		}
		
		
		// SpecificaSicurezza
		SpecificaSicurezza specificaSicurezza = parteSpecifica.getSpecificaSicurezza();
		if(specificaSicurezza!=null){
			for(int i=0; i<specificaSicurezza.sizeDocumentoSicurezzaList(); i++){
				DocumentoSicurezza docSicurezzaSICA = specificaSicurezza.getDocumentoSicurezza(i);
				
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = docSicurezzaSICA.getBase();
				
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeSpecificheSicurezza(); j++){
					if(fileName.equals(accordoServizioSICA.getSpecificaSicurezza(j).getNome())){
						docSICA = accordoServizioSICA.getSpecificaSicurezza(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("SpecificaSicurezza con nome["+fileName+"] non trovato");
				
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.specificaSicurezza.toString());			
				docOpenspcoop.setTipo(docSICA.getTipo());
				docOpenspcoop.setByteContenuto(docSICA.getContenuto());
				aspsOpenSPCoop.addSpecificaSicurezza(docOpenspcoop);
			}
		}
		
		
		// Specifica Livelli di Servizio
		SpecificaLivelliServizio specificaLivelliServizio = parteSpecifica.getSpecificaLivelliServizio();
		if(specificaLivelliServizio!=null){
			for(int i=0; i<specificaLivelliServizio.sizeDocumentoLivelloServizioList(); i++){
				DocumentoLivelloServizio docLS = specificaLivelliServizio.getDocumentoLivelloServizio(i);
				
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = docLS.getBase();
				
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeSpecificheLivelliServizio(); j++){
					if(fileName.equals(accordoServizioSICA.getSpecificaLivelloServizio(j).getNome())){
						docSICA = accordoServizioSICA.getSpecificaLivelloServizio(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("SpecificaLivelloServizio con nome["+fileName+"] non trovato");
				
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.specificaLivelloServizio.toString());			
				docOpenspcoop.setTipo(docSICA.getTipo());
				docOpenspcoop.setByteContenuto(docSICA.getContenuto());
				aspsOpenSPCoop.addSpecificaLivelloServizio(docOpenspcoop);
			}
		}
	
		
		
		// Connettore servizio
		String url = null;
		if(aspsOpenSPCoop.getByteWsdlImplementativoErogatore()!=null){
			try{
				url = SICAtoOpenSPCoopUtilities.readConnettoreFromWsdlImplementativo(aspsOpenSPCoop.getByteWsdlImplementativoErogatore());
			}catch(Exception e){
				log.info("Lettura WsdlLocation non riuscita (ImplementativoErogatore): "+e.getMessage(),e);
			}
		}else if(aspsOpenSPCoop.getByteWsdlImplementativoFruitore()!=null){
			try{
				url = SICAtoOpenSPCoopUtilities.readConnettoreFromWsdlImplementativo(aspsOpenSPCoop.getByteWsdlImplementativoFruitore());
			}catch(Exception e){
				log.info("Lettura WsdlLocation non riuscita (ImplementativoFruitore): "+e.getMessage(),e);
			}
		}
		Connettore connettore = new Connettore();
		if(soggettoErogatore!=null){
			String nomeConn = "CNT_" + soggettoErogatore.getTipo() + "/" + soggettoErogatore.getNome() + "_" +
					aspsOpenSPCoop.getTipo() + "/" + aspsOpenSPCoop.getNome();
			connettore.setNome(nomeConn);
		}
		if(url!=null){
			connettore.setTipo(CostantiDB.CONNETTORE_TIPO_HTTP);
			org.openspcoop2.core.registry.Property prop = new org.openspcoop2.core.registry.Property();
			prop.setNome(CostantiDB.CONNETTORE_HTTP_LOCATION);
			prop.setValore(url);
			connettore.addProperty(prop);
		}else{
			connettore.setTipo(CostantiDB.CONNETTORE_TIPO_DISABILITATO);
		}
		aspsOpenSPCoop.setConfigurazioneServizio(new ConfigurazioneServizio());
		aspsOpenSPCoop.getConfigurazioneServizio().setConnettore(connettore);
		
		
		
		/* Firma apposta dal Servizio di Registro quando l'accordo viene scaricato dal Registro stesso  */
		//if(manifest.getFirmato() && accordoServizioSICA.getFirma()!=null)
		//	aspsOpenSPCoop.setByteFirma(accordoServizioSICA.getFirma().getBytes());
		
		
		// Correggo eventuali import/include malformati in maniera conforme alla struttura del package CNIPA
		if(verificaCorreggiLocationWSDL){
			try{
				RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
				registroOpenSPCoopUtilities.updateLocation(aspsOpenSPCoop,false,prettyDocument);
			}catch(Exception e){
				//throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.setImportLocation error: "+e.getMessage(),e);
				// Verra impostato uno stato bozza
				log.error("Lettura connettore indicato nel WSDL Implementativo (Port) non riuscita: "+e.getMessage(),e);	
			}
		}
		
		return aspsOpenSPCoop;
	}
	/*public static it.gov.spcoop.sica.dao.AccordoServizioParteSpecifica accordoServizioParteSpecifica_openspcoopToSica(
	 		IRegistryReader registryReader,
			org.openspcoop2.core.registry.Servizio accordoServizioOpenspcoop,
			boolean implementazioneAccordoServizioComposto,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext)throws SICAToOpenSPCoopUtilitiesException{
		return accordoServizioParteSpecifica_openspcoopToSica(registryReader,accordoServizioOpenspcoop, implementazioneAccordoServizioComposto, null, sicaToOpenspcoopContext);
	}*/
	public static it.gov.spcoop.sica.dao.AccordoServizioParteSpecifica accordoServizioParteSpecifica_openspcoopToSica(
			IRegistryReader registryReader,
			org.openspcoop2.core.registry.AccordoServizioParteSpecifica aspsOpenspcoop,
			boolean implementazioneAccordoServizioComposto,
			org.openspcoop2.core.registry.AccordoServizioParteComune parteComuneDaIncludereWSDLImplementativo,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,
			Logger log)throws SICAToOpenSPCoopUtilitiesException{
		
		if(log==null){
			log = LoggerWrapperFactory.getLogger(SICAtoOpenSPCoopUtilities.class);
		}
		
		boolean verificaCorreggiLocationWSDL = sicaToOpenspcoopContext.isWSDL_XSD_allineaImportInclude();
		boolean prettyDocument = sicaToOpenspcoopContext.isWSDL_XSD_prettyDocuments();
		boolean includiInfoRegistroGenerale = sicaToOpenspcoopContext.isSICAClient_includiInfoRegistroGenerale();
		boolean wsdlEmptySeNonDefiniti = sicaToOpenspcoopContext.isWSDL_XSD_accordiParteSpecifica_wsdlEmpty();
		boolean openspcoopToSicaEliminazioneImportParteComune = sicaToOpenspcoopContext.isWSDL_XSD_accordiParteSpecifica_openspcoopToSica_eliminazioneImportParteComune();
		
		AbstractXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;		
		
		IDAccordoFactory idAccordoFactory = IDAccordoFactory.getInstance();
		
		// Correggo eventuali import/include malformati in maniera conforme alla struttura del package CNIPA
		if(verificaCorreggiLocationWSDL){
			try{
				RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
				registroOpenSPCoopUtilities.updateLocation(aspsOpenspcoop,true,prettyDocument);
			}catch(Exception e){
				throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.setImportLocation error: "+e.getMessage(),e);
			}
		}
					
		it.gov.spcoop.sica.dao.AccordoServizioParteSpecifica accServParteSpecificaSICA = 
			new it.gov.spcoop.sica.dao.AccordoServizioParteSpecifica();
		
		/* Metadati presenti nel Manifest dell'Accordo di Cooperazione. */
		it.gov.spcoop.sica.manifest.AccordoServizio manifest = new it.gov.spcoop.sica.manifest.AccordoServizio();
		manifest.setDescrizione(aspsOpenspcoop.getDescrizione());
		manifest.setNome(aspsOpenspcoop.getNome());
		manifest.setDataCreazione(aspsOpenspcoop.getOraRegistrazione());
		//manifest.getRiservato() ???
		
		it.gov.spcoop.sica.manifest.AccordoServizioParteSpecifica parteSpecifica = new it.gov.spcoop.sica.manifest.AccordoServizioParteSpecifica();
				
		if(includiInfoRegistroGenerale){
			if(aspsOpenspcoop.getVersione()!=null){
				manifest.setVersione(aspsOpenspcoop.getVersione().intValue()+"");
			}
			//manifest.setDataPubblicazione(aspsOpenspcoop.getDataPubblicazione());
		
			// Erogatore:
			IDSoggetto soggettoErogatore = new IDSoggetto(aspsOpenspcoop.getTipoSoggettoErogatore(),aspsOpenspcoop.getNomeSoggettoErogatore());
			String uriErogatore = sicaToOpenspcoopContext.getCodiceIPA(soggettoErogatore);
			if(uriErogatore==null){
				uriErogatore =  SICAtoOpenSPCoopUtilities.idSoggetto_openspcoopToSica(soggettoErogatore);
			}
			else
				uriErogatore = SICAtoOpenSPCoopUtilities.appendURI_IDSoggettoSica(uriErogatore);
			try {
				parteSpecifica.setErogatore(new URI(uriErogatore));
			}catch(Exception e) {
				throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
			}
			
			//if(aspsOpenspcoop.getByteFirma()!=null){
			//	manifest.setFirmato(true);
			//}
		}
		
		
		// riferimentoParteComune
		try{
			if(implementazioneAccordoServizioComposto)
				parteSpecifica.setRiferimentoParteComune(new URI(SICAtoOpenSPCoopUtilities.idAccordoServizioComposto_openspcoopToSica(registryReader,idAccordoFactory.getIDAccordoFromUri(aspsOpenspcoop.getAccordoServizioParteComune()),sicaToOpenspcoopContext)));
			else
				parteSpecifica.setRiferimentoParteComune(new URI(SICAtoOpenSPCoopUtilities.idAccordoServizioParteComune_openspcoopToSica(registryReader,idAccordoFactory.getIDAccordoFromUri(aspsOpenspcoop.getAccordoServizioParteComune()),sicaToOpenspcoopContext)));
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("Trasformazione riferimento parte comune ["+aspsOpenspcoop.getAccordoServizioParteComune()+"] non riuscita: "+e.getMessage(),e);
		}
		
		// Calcolo connettore servizioOpenspcoop
		String urlConnettore = null;
		if(aspsOpenspcoop.getConfigurazioneServizio()!=null && aspsOpenspcoop.getConfigurazioneServizio().getConnettore()!=null){
			if(CostantiDB.CONNETTORE_TIPO_HTTP.equals(aspsOpenspcoop.getConfigurazioneServizio().getConnettore().getTipo()) || 
					CostantiDB.CONNETTORE_TIPO_HTTPS.equals(aspsOpenspcoop.getConfigurazioneServizio().getConnettore().getTipo())){
				if(aspsOpenspcoop.getConfigurazioneServizio().getConnettore().sizePropertyList()>0){
					for(int i=0; i<aspsOpenspcoop.getConfigurazioneServizio().getConnettore().sizePropertyList(); i++){
						if(CostantiDB.CONNETTORE_HTTP_LOCATION.equals(aspsOpenspcoop.getConfigurazioneServizio().getConnettore().getProperty(i).getNome())){
							urlConnettore = aspsOpenspcoop.getConfigurazioneServizio().getConnettore().getProperty(i).getValore();
						}
					}
				}
			}
		}
		
		// Specifica Porti di Accesso
		it.gov.spcoop.sica.manifest.SpecificaPortiAccesso specificaPortiAccesso = null;
		if(  (aspsOpenspcoop.getByteWsdlImplementativoErogatore()!=null) || (aspsOpenspcoop.getByteWsdlImplementativoFruitore()!=null) ){
			specificaPortiAccesso = new it.gov.spcoop.sica.manifest.SpecificaPortiAccesso();
		}
		
		// ImplementativoErogatore
		if(wsdlEmptySeNonDefiniti || aspsOpenspcoop.getByteWsdlImplementativoErogatore()!=null){
			it.gov.spcoop.sica.manifest.DocumentoInterfaccia docInterfacciaErogatore = new it.gov.spcoop.sica.manifest.DocumentoInterfaccia();
			docInterfacciaErogatore.setBase(Costanti.SPECIFICA_PORTI_ACCESSO_EROGATORE_WSDL);
			docInterfacciaErogatore.setTipo(TipoDocumentoInterfaccia.WSDL);
			specificaPortiAccesso.setPortiAccessoErogatore(docInterfacciaErogatore);
			it.gov.spcoop.sica.dao.Documento docErogatore = new it.gov.spcoop.sica.dao.Documento();
			docErogatore.setTipo(TipiDocumentoInterfaccia.WSDL.toString());
			docErogatore.setNome(Costanti.SPECIFICA_PORTI_ACCESSO_EROGATORE_WSDL);
			byte [] wsdlImplementativoErogatore = null;
			if(aspsOpenspcoop.getByteWsdlImplementativoErogatore()!=null){
				
				wsdlImplementativoErogatore = aspsOpenspcoop.getByteWsdlImplementativoErogatore();
				if(parteComuneDaIncludereWSDLImplementativo!=null){
					// Includo parte comune
					try{
						RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
						Definition wsdl = registroOpenSPCoopUtilities.buildWsdlFromObjects(parteComuneDaIncludereWSDLImplementativo, wsdlImplementativoErogatore, true);
						DefinitionWrapper wsdlOpenSPCoop = new DefinitionWrapper(wsdl,xmlUtils);
						wsdlImplementativoErogatore = wsdlOpenSPCoop.toByteArray();
					}catch(Exception e){
						log.info("Inserimento parte comune nel wsdl non riuscito (ImplementativoErogatore): "+e.getMessage(),e);
					}
				}
				else if(openspcoopToSicaEliminazioneImportParteComune){
					// Elimino import parte comune
					try{
						RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
						wsdlImplementativoErogatore = registroOpenSPCoopUtilities.eliminaImportASParteComune(wsdlImplementativoErogatore);
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.eliminaImportASParteComune error: "+e.getMessage(),e);
					}
				}
				if(urlConnettore!=null){
					// salvo il connettore
					try{
						wsdlImplementativoErogatore = SICAtoOpenSPCoopUtilities.saveConnettoreIntoWsdlImplementativo(wsdlImplementativoErogatore, 
								urlConnettore);
					}catch(Exception e){
						log.info("Impostazione WsdlLocation non riuscita (ImplementativoErogatore): "+e.getMessage(),e);
					}
				}	
			}
			else{
				// Imposto WSDL Empty per compatibilita Client SICA
				wsdlImplementativoErogatore = Costanti.WSDL_EMPTY.getBytes();
			}
			docErogatore.setContenuto(wsdlImplementativoErogatore);
			accServParteSpecificaSICA.setPortiAccessoErogatore(docErogatore);
		}
		
		// ImplementativoFruitore
		if(wsdlEmptySeNonDefiniti || aspsOpenspcoop.getByteWsdlImplementativoFruitore()!=null){
			it.gov.spcoop.sica.manifest.DocumentoInterfaccia docInterfacciaFruitore = new it.gov.spcoop.sica.manifest.DocumentoInterfaccia();
			docInterfacciaFruitore.setBase(Costanti.SPECIFICA_PORTI_ACCESSO_FRUITORE_WSDL);
			docInterfacciaFruitore.setTipo(TipoDocumentoInterfaccia.WSDL);
			specificaPortiAccesso.setPortiAccessoFruitore(docInterfacciaFruitore);
			it.gov.spcoop.sica.dao.Documento docFruitore = new it.gov.spcoop.sica.dao.Documento();
			docFruitore.setTipo(TipiDocumentoInterfaccia.WSDL.toString());
			docFruitore.setNome(Costanti.SPECIFICA_PORTI_ACCESSO_FRUITORE_WSDL);
			byte [] wsdlImplementativoFruitore = null;
			if(aspsOpenspcoop.getByteWsdlImplementativoFruitore()!=null){
				
				wsdlImplementativoFruitore = aspsOpenspcoop.getByteWsdlImplementativoFruitore();
				if(parteComuneDaIncludereWSDLImplementativo!=null){
					// Includo parte comune
					try{
						RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
						Definition wsdl = registroOpenSPCoopUtilities.buildWsdlFromObjects(parteComuneDaIncludereWSDLImplementativo, wsdlImplementativoFruitore, false);
						DefinitionWrapper wsdlOpenSPCoop = new DefinitionWrapper(wsdl,xmlUtils);
						wsdlImplementativoFruitore = wsdlOpenSPCoop.toByteArray();
					}catch(Exception e){
						log.info("Inserimento parte comune nel wsdl non riuscito (ImplementativoFruitore): "+e.getMessage(),e);
					}
				}
				else if(openspcoopToSicaEliminazioneImportParteComune){
					// Elimino import parte comune
					try{
						RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(),log);
						wsdlImplementativoFruitore = registroOpenSPCoopUtilities.eliminaImportASParteComune(wsdlImplementativoFruitore);
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.eliminaImportASParteComune error: "+e.getMessage(),e);
					}
				}
				if(urlConnettore!=null){
					// salvo il connettore
					try{
						wsdlImplementativoFruitore = SICAtoOpenSPCoopUtilities.saveConnettoreIntoWsdlImplementativo(wsdlImplementativoFruitore, 
								urlConnettore);
					}catch(Exception e){
						log.info("Impostazione WsdlLocation non riuscita (ImplementativoFruitore): "+e.getMessage(),e);
					}
				}
			}
			else{
				// Imposto WSDL Empty per compatibilita Client SICA
				wsdlImplementativoFruitore = Costanti.WSDL_EMPTY.getBytes();
			}
			docFruitore.setContenuto(wsdlImplementativoFruitore);
			accServParteSpecificaSICA.setPortiAccessoFruitore(docFruitore);
		}
		
		// Imposto specificaPortiAccesso
		if(specificaPortiAccesso!=null){
			parteSpecifica.setSpecificaPortiAccesso(specificaPortiAccesso);
		}
			
		// Adesione
		//parteSpecifica.setAdesione(aspsOpenspcoop.getTipoAdesione());
		parteSpecifica.setAdesione(TipoAdesione.AUTOMATICA);
		
				
		// Allegati
		if(aspsOpenspcoop.sizeAllegatoList()>0){
			it.gov.spcoop.sica.manifest.ElencoAllegati allegati = new it.gov.spcoop.sica.manifest.ElencoAllegati();
			for(int i=0; i<aspsOpenspcoop.sizeAllegatoList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = aspsOpenspcoop.getAllegato(i);
				
				allegati.addGenericoDocumento(docOpenspcoop.getFile());
				
				it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
				docSICA.setTipo(docOpenspcoop.getTipo());
				docSICA.setNome(docOpenspcoop.getFile());
				if(docOpenspcoop.getByteContenuto()==null){
					throw new SICAToOpenSPCoopUtilitiesException("Byte dell'allegato "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
				}
				docSICA.setContenuto(docOpenspcoop.getByteContenuto());
				accServParteSpecificaSICA.addAllegato(docSICA);
			}
			manifest.setAllegati(allegati);
		}
		
		// SpecificheSemiformali
		if(aspsOpenspcoop.sizeSpecificaSemiformaleList()>0){
			it.gov.spcoop.sica.manifest.SpecificaSemiformale specificaSemiformale = new it.gov.spcoop.sica.manifest.SpecificaSemiformale();
			for(int i=0; i<aspsOpenspcoop.sizeSpecificaSemiformaleList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = aspsOpenspcoop.getSpecificaSemiformale(i);
				
				it.gov.spcoop.sica.manifest.DocumentoSemiformale docSemiformale = new it.gov.spcoop.sica.manifest.DocumentoSemiformale();
				docSemiformale.setTipo(docOpenspcoop.getTipo());
				docSemiformale.setBase(docOpenspcoop.getFile());
				specificaSemiformale.addDocumentoSemiformale(docSemiformale);			
				
				it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
				docSICA.setTipo(docOpenspcoop.getTipo());
				docSICA.setNome(docOpenspcoop.getFile());
				if(docOpenspcoop.getByteContenuto()==null){
					throw new SICAToOpenSPCoopUtilitiesException("Byte della specifica semiformale "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
				}
				docSICA.setContenuto(docOpenspcoop.getByteContenuto());
				accServParteSpecificaSICA.addSpecificaSemiformale(docSICA);
			}
			manifest.setSpecificaSemiformale(specificaSemiformale);
		}
		
		
		// SpecificheSicurezza
		it.gov.spcoop.sica.manifest.SpecificaSicurezza specificaSicurezza = null;
		for(int i=0; i<aspsOpenspcoop.sizeSpecificaSicurezzaList(); i++){
			org.openspcoop2.core.registry.Documento docOpenspcoop = aspsOpenspcoop.getSpecificaSicurezza(i);
			
			if(specificaSicurezza==null)
				specificaSicurezza = new it.gov.spcoop.sica.manifest.SpecificaSicurezza();
			
			// In OpenSPCoop e' stato aggiunto xacmlPolicy non gestito dal CNIPA
			String tipo = docOpenspcoop.getTipo();
			if(!TipiDocumentoSicurezza.LINGUAGGIO_NATURALE.getNome().equals(tipo) && !TipiDocumentoSicurezza.WSPOLICY.getNome().equals(tipo)){
				tipo = TipiDocumentoSicurezza.LINGUAGGIO_NATURALE.getNome(); // forzo tipo di linguaggio naturale.
			}
			
			it.gov.spcoop.sica.manifest.DocumentoSicurezza docSicurezza = new it.gov.spcoop.sica.manifest.DocumentoSicurezza();
			docSicurezza.setTipo(tipo);
			docSicurezza.setBase(docOpenspcoop.getFile());
			specificaSicurezza.addDocumentoSicurezza(docSicurezza);
					
			it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
			docSICA.setTipo(tipo);
			docSICA.setNome(docOpenspcoop.getFile());
			if(docOpenspcoop.getByteContenuto()==null){
				throw new SICAToOpenSPCoopUtilitiesException("Byte della specifica di sicurezza "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
			}
			docSICA.setContenuto(docOpenspcoop.getByteContenuto());
			accServParteSpecificaSICA.addSpecificaSicurezza(docSICA);
		}
		if(specificaSicurezza!=null)
			parteSpecifica.setSpecificaSicurezza(specificaSicurezza);
		
		
		// Specifiche Livelli di Servizio
		it.gov.spcoop.sica.manifest.SpecificaLivelliServizio specificaLivelliServizio = null;
		for(int i=0; i<aspsOpenspcoop.sizeSpecificaLivelloServizioList(); i++){
			org.openspcoop2.core.registry.Documento docOpenspcoop = aspsOpenspcoop.getSpecificaLivelloServizio(i);
			
			if(specificaLivelliServizio==null)
				specificaLivelliServizio = new it.gov.spcoop.sica.manifest.SpecificaLivelliServizio();
			it.gov.spcoop.sica.manifest.DocumentoLivelloServizio docLivelliServizio = new it.gov.spcoop.sica.manifest.DocumentoLivelloServizio();
			
			docLivelliServizio.setTipo(docOpenspcoop.getTipo());
			docLivelliServizio.setBase(docOpenspcoop.getFile());
			specificaLivelliServizio.addDocumentoLivelloServizio(docLivelliServizio);
			
			it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
			docSICA.setTipo(docOpenspcoop.getTipo());
			docSICA.setNome(docOpenspcoop.getFile());
			if(docOpenspcoop.getByteContenuto()==null){
				throw new SICAToOpenSPCoopUtilitiesException("Byte della specifica del livello di servizio "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
			}
			docSICA.setContenuto(docOpenspcoop.getByteContenuto());
			accServParteSpecificaSICA.addSpecificaLivelloServizio(docSICA);
		}
		if(specificaLivelliServizio!=null)
			parteSpecifica.setSpecificaLivelliServizio(specificaLivelliServizio);

		
		/* Firma apposta dal Servizio di Registro quando l'accordo viene scaricato dal Registro stesso  */
		if(includiInfoRegistroGenerale){
			//if(aspsOpenspcoop.getByteFirma()!=null){
			//	it.gov.spcoop.sica.firma.Firma firma = new it.gov.spcoop.sica.firma.Firma();
			//	accServParteSpecificaSICA.setFirma(firma);
			//}
		}
		
		
		// Setto parte comune
		manifest.setParteSpecifica(parteSpecifica);
		
		accServParteSpecificaSICA.setManifesto(manifest);
		return accServParteSpecificaSICA;
	}
	
	
	
	
	
	
	
	/* Servizio Composto */
	public static org.openspcoop2.core.registry.AccordoServizioParteComune accordoServizioComposto_sicaToOpenspcoop(
			IRegistryReader registryReader,
			it.gov.spcoop.sica.dao.AccordoServizioComposto accordoServizioSICA,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,
			Logger log)throws SICAToOpenSPCoopUtilitiesException{
		
		if(log==null){
			log = LoggerWrapperFactory.getLogger(SICAtoOpenSPCoopUtilities.class);
		}
		
		boolean verificaCorreggiLocationWSDL = sicaToOpenspcoopContext.isWSDL_XSD_allineaImportInclude();
		boolean prettyDocument = sicaToOpenspcoopContext.isWSDL_XSD_prettyDocuments();
		boolean documentoSpecificaEGOV_asClientSICADisabled_childUnquilified = sicaToOpenspcoopContext.isInformazioniEGov_wscpDisabled_childUnqualified();
		boolean documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified = sicaToOpenspcoopContext.isInformazioniEGov_wscpEnabled_childUnqualified();
		
		org.openspcoop2.core.registry.AccordoServizioParteComune accServizioOpenspcoop = new org.openspcoop2.core.registry.AccordoServizioParteComune();
		accServizioOpenspcoop.setServiceBinding(ServiceBinding.SOAP);
		accServizioOpenspcoop.setFormatoSpecifica(FormatoSpecifica.WSDL_11);
		
		IDAccordoCooperazioneFactory idAccordoCooperazioneFactory = IDAccordoCooperazioneFactory.getInstance();
		
		/* Metadati presenti nel Manifest dell'Accordo di Cooperazione. */
		it.gov.spcoop.sica.manifest.ServizioComposto manifest = accordoServizioSICA.getManifesto();
		accServizioOpenspcoop.setDescrizione(resizeDescriptionForMaxLength(manifest.getDescrizione()));
		accServizioOpenspcoop.setNome(manifest.getNome());
		if(manifest.getVersione()!=null){
			accServizioOpenspcoop.setVersione(Integer.parseInt(manifest.getVersione()));
		}
		accServizioOpenspcoop.setOraRegistrazione(manifest.getDataCreazione());
		//accServizioOpenspcoop.setDataPubblicazione(manifest.getDataPubblicazione());
		accServizioOpenspcoop.setProfiloCollaborazione(CostantiRegistroServizi.ONEWAY); // Default per AS
		//manifest.getRiservato() ???
		
		// SpecificaInterfaccia
		it.gov.spcoop.sica.manifest.SpecificaInterfaccia specificaInterfaccia = manifest.getSpecificaInterfaccia();
		if( (accordoServizioSICA.getInterfacciaConcettuale()!=null) ||  (accordoServizioSICA.getInterfacciaLogicaLatoErogatore()!=null) || (accordoServizioSICA.getInterfacciaLogicaLatoFruitore()!=null) ){
			if(specificaInterfaccia.getInterfacciaConcettuale()!=null &&  accordoServizioSICA.getInterfacciaConcettuale()!=null &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getInterfacciaConcettuale().getContenuto()) ){
				accServizioOpenspcoop.setByteWsdlConcettuale(accordoServizioSICA.getInterfacciaConcettuale().getContenuto());
			}
			if(specificaInterfaccia.getInterfacciaLogicaLatoErogatore()!=null && accordoServizioSICA.getInterfacciaLogicaLatoErogatore()!=null &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getInterfacciaLogicaLatoErogatore().getContenuto()) ){
				accServizioOpenspcoop.setByteWsdlLogicoErogatore(accordoServizioSICA.getInterfacciaLogicaLatoErogatore().getContenuto());
			}
			if(specificaInterfaccia.getInterfacciaLogicaLatoFruitore()!=null && accordoServizioSICA.getInterfacciaLogicaLatoFruitore()!=null &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getInterfacciaLogicaLatoFruitore().getContenuto()) ){
				accServizioOpenspcoop.setByteWsdlLogicoFruitore(accordoServizioSICA.getInterfacciaLogicaLatoFruitore().getContenuto());
			}
		}
		
		// SpecificaConversazione
		it.gov.spcoop.sica.manifest.SpecificaConversazione specificaConversazione = manifest.getSpecificaConversazione();
		if( (accordoServizioSICA.getConversazioneConcettuale()!=null) ||  (accordoServizioSICA.getConversazioneLogicaErogatore()!=null) || (accordoServizioSICA.getConversazioneLogicaFruitore()!=null) ){
			if(specificaConversazione.getConversazioneConcettuale()!=null && accordoServizioSICA.getConversazioneConcettuale()!=null  &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getConversazioneConcettuale().getContenuto()) ){
				accServizioOpenspcoop.setByteSpecificaConversazioneConcettuale(accordoServizioSICA.getConversazioneConcettuale().getContenuto());
			}
			if(specificaConversazione.getConversazioneLogicaLatoErogatore()!=null && accordoServizioSICA.getConversazioneLogicaErogatore()!=null  &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getConversazioneLogicaErogatore().getContenuto()) ){
				accServizioOpenspcoop.setByteSpecificaConversazioneErogatore(accordoServizioSICA.getConversazioneLogicaErogatore().getContenuto());
			}
			if(specificaConversazione.getConversazioneLogicaLatoFruitore()!=null && accordoServizioSICA.getConversazioneLogicaFruitore()!=null  &&
					!SICAtoOpenSPCoopUtilities.isWsdlEmpty(accordoServizioSICA.getConversazioneLogicaFruitore().getContenuto()) ){
				accServizioOpenspcoop.setByteSpecificaConversazioneFruitore(accordoServizioSICA.getConversazioneLogicaFruitore().getContenuto());
			}
		}
		
		// Pubblicatore:
		if(manifest.getPubblicatore()!=null){
			IdSoggetto soggettoReferente = 
				new IdSoggetto(); 
			IDSoggetto soggettoPubblicatore = sicaToOpenspcoopContext.getIDSoggetto(SICAtoOpenSPCoopUtilities.removeURI_IDSoggettoSica(manifest.getPubblicatore().toString()));
			if(soggettoPubblicatore==null){
				soggettoPubblicatore = SICAtoOpenSPCoopUtilities.idSoggetto_sicaToOpenspcoop(manifest.getPubblicatore().toString());
			}
			soggettoReferente.setNome(soggettoPubblicatore.getNome());
			soggettoReferente.setTipo(soggettoPubblicatore.getTipo());
			accServizioOpenspcoop.setSoggettoReferente(soggettoReferente);
		}
		

		// Riferimento accordo di cooperazione:
		org.openspcoop2.core.registry.AccordoServizioParteComuneServizioComposto servizioComposto = 
			new org.openspcoop2.core.registry.AccordoServizioParteComuneServizioComposto();
		IDAccordoCooperazione idAccordo = SICAtoOpenSPCoopUtilities.idAccordoCooperazione_sicaToOpenspcoop(registryReader,manifest.getRiferimentoAccordoCooperazione().toString());
		try{
			servizioComposto.setAccordoCooperazione(idAccordoCooperazioneFactory.getUriFromIDAccordo(idAccordo));
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("Trasformazione IDAccordo di cooperazione ["+manifest.getRiferimentoAccordoCooperazione()+"] non riuscito: "+e.getMessage(),e);
		}
		
		// Servizi componenti
		if(manifest.getServiziComponenti()!=null){
			for(int i=0; i<manifest.getServiziComponenti().sizeServizioComponenteList(); i++){
				String servComponente = manifest.getServiziComponenti().getServizioComponente(i).toString(); 
				//IDServizio idServizioComponente = idAccordoServizioParteSpecifica_sicaToOpenspcoop(servComponente,sicaToOpenspcoopContext);
				IDServizio idServizioComponente = sicaToOpenspcoopContext.getIDServizio(servComponente);
				if(idServizioComponente==null){
					throw new SICAToOpenSPCoopUtilitiesException("Trasformazione uriAPS["+servComponente+"] in IDServizio SPCoop non riuscita");
				}
				org.openspcoop2.core.registry.AccordoServizioParteComuneServizioCompostoServizioComponente servComponenteOpenspcoop = 
					new org.openspcoop2.core.registry.AccordoServizioParteComuneServizioCompostoServizioComponente();
				try{
					servComponenteOpenspcoop.setTipo(idServizioComponente.getTipo());
					servComponenteOpenspcoop.setNome(idServizioComponente.getNome());
					servComponenteOpenspcoop.setVersione(idServizioComponente.getVersione());
					servComponenteOpenspcoop.setTipoSoggetto(idServizioComponente.getSoggettoErogatore().getTipo());
					servComponenteOpenspcoop.setNomeSoggetto(idServizioComponente.getSoggettoErogatore().getNome());
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Trasformazione IDAccordo di servizio composto ["+servComponente+"] non riuscito: "+e.getMessage(),e);
				}
				servizioComposto.addServizioComponente(servComponenteOpenspcoop);
			}
		}

		boolean findDocumentoSpecificaEGOV = false;
		String tipoDocumentoSpecificaEGovTrovato = null;
		String fileNameSpecificaEGovTrovata = null;
	
		// Allegati
		if(manifest.getAllegati()!=null){
			for(int i=0; i<manifest.getAllegati().sizeGenericoDocumentoList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = manifest.getAllegati().getGenericoDocumento(i);
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.allegato.toString());			
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeAllegati(); j++){
					if(fileName.equals(accordoServizioSICA.getAllegato(j).getNome())){
						docSICA = accordoServizioSICA.getAllegato(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("Allegato con nome["+fileName+"] non trovato");
				
				if(Costanti.ALLEGATO_DEFINITORIO_XSD.equals(fileName)){
					
					accServizioOpenspcoop.setByteWsdlDefinitorio(docSICA.getContenuto());
				
				}else{
					
					// tipo: http://spcoop.gov.it/sica/wscp
					boolean specificaEGovAsClientSICA = it.gov.spcoop.sica.wscp.driver.XMLUtils.isProfiloCollaborazioneEGOV(docSICA.getContenuto());
					// tipo: http://www.cnipa.it/collProfiles
					boolean specificaEGovAsDocumentoCNIPA = it.cnipa.collprofiles.driver.XMLUtils.isProfiloCollaborazioneEGOV(docSICA.getContenuto());
					
					// Check vincoli di unicita
					if(findDocumentoSpecificaEGOV){
						String fileNameTmp = Costanti.ALLEGATI_DIR+File.separatorChar+fileName;
						if(specificaEGovAsClientSICA){
							throw new SICAToOpenSPCoopUtilitiesException("Nel package sono presenti piu' di una specifica delle informazioni egov. E' stata gia' processata una specifica di tipo "+tipoDocumentoSpecificaEGovTrovato+" ("+fileNameSpecificaEGovTrovata+") e adesso e' stato riscontrato una specifica di tipo "+it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE+" ("+fileNameTmp+")");
						}
						if(specificaEGovAsDocumentoCNIPA){
							throw new SICAToOpenSPCoopUtilitiesException("Nel package sono presenti piu' di una specifica delle informazioni egov. E' stata gia' processata una specifica di tipo "+tipoDocumentoSpecificaEGovTrovato+" ("+fileNameSpecificaEGovTrovata+") e adesso e' stato riscontrato una specifica di tipo "+it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE+" ("+fileNameTmp+")");
						}
					}else{
						if(specificaEGovAsClientSICA && specificaEGovAsDocumentoCNIPA){
							throw new SICAToOpenSPCoopUtilitiesException("Trovata specifica delle informazioni egov sia di tipo "+it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE+" che di tipo "+it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE+" ??");
						}
						if(specificaEGovAsClientSICA || specificaEGovAsDocumentoCNIPA){
							findDocumentoSpecificaEGOV = true;
							fileNameSpecificaEGovTrovata = Costanti.ALLEGATI_DIR+File.separatorChar+fileName;
						}
					}
					
					// Gestione
					if(specificaEGovAsClientSICA){
						try{
							it.gov.spcoop.sica.wscp.driver.XMLUtils.mapProfiloCollaborazioneEGOVIntoAS(log,docSICA.getContenuto(), accServizioOpenspcoop, documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified);
							tipoDocumentoSpecificaEGovTrovato = it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE;
						}catch(Exception e){
							throw new SICAToOpenSPCoopUtilitiesException("Errore durante la verifica dell'esistenza del documento di tipo 'ProfiloCollaborazioneEGOV' per il file ["+fileName+"] : "+e.getMessage(),e);
						}
					}
					else if(specificaEGovAsDocumentoCNIPA){
						try{
							it.cnipa.collprofiles.driver.XMLUtils.mapProfiloCollaborazioneEGOVIntoAS(log,docSICA.getContenuto(), accServizioOpenspcoop, documentoSpecificaEGOV_asClientSICADisabled_childUnquilified);
							tipoDocumentoSpecificaEGovTrovato = it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE;
						}catch(Exception e){
							throw new SICAToOpenSPCoopUtilitiesException("Errore durante la verifica dell'esistenza del documento di tipo 'ProfiloCollaborazioneEGOV' per il file ["+fileName+"] : "+e.getMessage(),e);
						}
					}
					else{
						//allegatoGenerico
						docOpenspcoop.setTipo(docSICA.getTipo());
						docOpenspcoop.setByteContenuto(docSICA.getContenuto());
						accServizioOpenspcoop.addAllegato(docOpenspcoop);
					}
				}
			}
		}
		
		
		
		// SpecificaSemiformale
		if(manifest.getSpecificaSemiformale()!=null){
			for(int i=0; i<manifest.getSpecificaSemiformale().sizeDocumentoSemiformaleList(); i++){
				DocumentoSemiformale specificaSemiformale = manifest.getSpecificaSemiformale().getDocumentoSemiformale(i);
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = specificaSemiformale.getBase();
				
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeSpecificheSemiformali(); j++){
					if(fileName.equals(accordoServizioSICA.getSpecificaSemiformale(j).getNome())){
						docSICA = accordoServizioSICA.getSpecificaSemiformale(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("SpecificaSemiformale con nome["+fileName+"] non trovato");
				
				// tipo: http://spcoop.gov.it/sica/wscp
				boolean specificaEGovAsClientSICA = it.gov.spcoop.sica.wscp.driver.XMLUtils.isProfiloCollaborazioneEGOV(docSICA.getContenuto());
				// tipo: http://www.cnipa.it/collProfiles
				boolean specificaEGovAsDocumentoCNIPA = it.cnipa.collprofiles.driver.XMLUtils.isProfiloCollaborazioneEGOV(docSICA.getContenuto());
				
				// Check vincoli di unicita
				if(findDocumentoSpecificaEGOV){
					String fileNameTmp = Costanti.SPECIFICA_SEMIFORMALE_DIR+File.separatorChar+fileName;
					if(specificaEGovAsClientSICA){
						throw new SICAToOpenSPCoopUtilitiesException("Nel package sono presenti piu' di una specifica delle informazioni egov. E' stata gia' processata una specifica di tipo "+tipoDocumentoSpecificaEGovTrovato+" ("+fileNameSpecificaEGovTrovata+") e adesso e' stato riscontrato una specifica di tipo "+it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE+" ("+fileNameTmp+")");
					}
					if(specificaEGovAsDocumentoCNIPA){
						throw new SICAToOpenSPCoopUtilitiesException("Nel package sono presenti piu' di una specifica delle informazioni egov. E' stata gia' processata una specifica di tipo "+tipoDocumentoSpecificaEGovTrovato+" ("+fileNameSpecificaEGovTrovata+") e adesso e' stato riscontrato una specifica di tipo "+it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE+" ("+fileNameTmp+")");
					}
				}else{
					if(specificaEGovAsClientSICA && specificaEGovAsDocumentoCNIPA){
						throw new SICAToOpenSPCoopUtilitiesException("La specifica delle informazioni egov e' sia di tipo "+it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE+" che di tipo "+it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE+" ??");
					}
					if(specificaEGovAsClientSICA || specificaEGovAsDocumentoCNIPA){
						findDocumentoSpecificaEGOV = true;
						fileNameSpecificaEGovTrovata = Costanti.SPECIFICA_SEMIFORMALE_DIR+File.separatorChar+fileName;
					}
				}
				
				// Gestione
				if(specificaEGovAsClientSICA){
					try{
						it.gov.spcoop.sica.wscp.driver.XMLUtils.mapProfiloCollaborazioneEGOVIntoAS(log,docSICA.getContenuto(), accServizioOpenspcoop, documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified);
						tipoDocumentoSpecificaEGovTrovato = it.gov.spcoop.sica.wscp.driver.Costanti.TARGET_NAMESPACE;
						findDocumentoSpecificaEGOV = true;
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("Errore durante la verifica dell'esistenza del documento di tipo 'ProfiloCollaborazioneEGOV' per il file ["+fileName+"] : "+e.getMessage(),e);
					}
				}
				else if(specificaEGovAsDocumentoCNIPA){
					try{
						it.cnipa.collprofiles.driver.XMLUtils.mapProfiloCollaborazioneEGOVIntoAS(log,docSICA.getContenuto(), accServizioOpenspcoop, documentoSpecificaEGOV_asClientSICADisabled_childUnquilified);
						tipoDocumentoSpecificaEGovTrovato = it.cnipa.collprofiles.driver.Costanti.TARGET_NAMESPACE;
						findDocumentoSpecificaEGOV = true;
					}catch(Exception e){
						throw new SICAToOpenSPCoopUtilitiesException("Errore durante la verifica dell'esistenza del documento di tipo 'ProfiloCollaborazioneEGOV' per il file ["+fileName+"] : "+e.getMessage(),e);
					}
				}
				else{
					//specificaSemiformaleGenerica
					docOpenspcoop.setFile(fileName);
					docOpenspcoop.setRuolo(RuoliDocumento.specificaSemiformale.toString());			
					docOpenspcoop.setTipo(docSICA.getTipo());
					docOpenspcoop.setByteContenuto(docSICA.getContenuto());
					accServizioOpenspcoop.addSpecificaSemiformale(docOpenspcoop);
				}
			}
		}
	
		
		// Specifica coordinamento
		SpecificaCoordinamento specificaCoordinamento = manifest.getSpecificaCoordinamento();
		if(specificaCoordinamento!=null){
			for(int i=0; i<specificaCoordinamento.sizeDocumentoCoordinamentoList(); i++){
				DocumentoCoordinamento docCoordinamento = specificaCoordinamento.getDocumentoCoordinamento(i);
				
				org.openspcoop2.core.registry.Documento docOpenspcoop = new org.openspcoop2.core.registry.Documento();
				String fileName = docCoordinamento.getBase();
				docOpenspcoop.setFile(fileName);
				docOpenspcoop.setRuolo(RuoliDocumento.specificaCoordinamento.toString());			
				it.gov.spcoop.sica.dao.Documento docSICA = null;
				for(int j=0; j<accordoServizioSICA.sizeSpecificheCoordinamento(); j++){
					if(fileName.equals(accordoServizioSICA.getSpecificaCoordinamento(j).getNome())){
						docSICA = accordoServizioSICA.getSpecificaCoordinamento(j);
					}
				}
				if(docSICA==null)
					throw new SICAToOpenSPCoopUtilitiesException("SpecificaCoordinamento con nome["+fileName+"] non trovato");
				docOpenspcoop.setTipo(docSICA.getTipo());
				docOpenspcoop.setByteContenuto(docSICA.getContenuto());
				servizioComposto.addSpecificaCoordinamento(docOpenspcoop);
			}
		}
		
		/* Firma apposta dal Servizio di Registro quando l'accordo viene scaricato dal Registro stesso  */
		//if(manifest.getFirmato() && accordoServizioSICA.getFirma()!=null)
		//	accServizioOpenspcoop.setByteFirma(accordoServizioSICA.getFirma().getBytes());
		
		// Imposto servizio composto
		accServizioOpenspcoop.setServizioComposto(servizioComposto);
		
		// Correggo eventuali import/include malformati in maniera conforme alla struttura del package CNIPA
		if(verificaCorreggiLocationWSDL){
			try{
				RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), log);
				registroOpenSPCoopUtilities.updateLocation(accServizioOpenspcoop,false,prettyDocument);
			}catch(Exception e){
				throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.setImportLocation error: "+e.getMessage(),e);
			}
		}
		
		
		if(findDocumentoSpecificaEGOV==false){
			accServizioOpenspcoop.setProfiloCollaborazione(null); // In modo da riconoscere il caso e farlo gestire
		}
		
		return accServizioOpenspcoop;
	}
	public static it.gov.spcoop.sica.dao.AccordoServizioComposto accordoServizioComposto_openspcoopToSica(
			IRegistryReader registryReader,
			org.openspcoop2.core.registry.AccordoServizioParteComune accordoServizioOpenspcoop,
			SICAtoOpenSPCoopContext sicaToOpenspcoopContext,
			Logger log)throws SICAToOpenSPCoopUtilitiesException{
		
		if(log==null){
			log = LoggerWrapperFactory.getLogger(SICAtoOpenSPCoopUtilities.class);
		}
		
		boolean documentoSpecificaEGOV_asClientSICA = sicaToOpenspcoopContext.isInformazioniEGov_wscp();
		boolean documentoSpecificaEGOV_asSpecificaSemiformale = sicaToOpenspcoopContext.isInformazioniEGov_specificaSemiformale();
		boolean documentoSpecificaEGOV_asClientSICADisabled_namespaceCNIPA = sicaToOpenspcoopContext.isInformazioniEGov_wscpDisabled_namespaceCnipa();
		boolean documentoSpecificaEGOV_nomiSPCoopQualified = sicaToOpenspcoopContext.isInformazioniEGov_nomiSPCoop_qualified();
		boolean documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified = sicaToOpenspcoopContext.isInformazioniEGov_wscpEnabled_childUnqualified();
		boolean verificaCorreggiLocationWSDL = sicaToOpenspcoopContext.isWSDL_XSD_allineaImportInclude();
		boolean prettyDocument = sicaToOpenspcoopContext.isWSDL_XSD_prettyDocuments();
		boolean includiInfoRegistroGenerale = sicaToOpenspcoopContext.isSICAClient_includiInfoRegistroGenerale();
		boolean wsdlEmptySeNonDefiniti = sicaToOpenspcoopContext.isWSDL_XSD_accordiParteSpecifica_wsdlEmpty();
		
		// Correggo eventuali import/include malformati in maniera conforme alla struttura del package CNIPA
		if(verificaCorreggiLocationWSDL){
			try{
				RegistroOpenSPCoopUtilities registroOpenSPCoopUtilities = new RegistroOpenSPCoopUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), log);
				registroOpenSPCoopUtilities.updateLocation(accordoServizioOpenspcoop,true,prettyDocument);
			}catch(Exception e){
				throw new SICAToOpenSPCoopUtilitiesException("RegistroOpenSPCoopUtilities.setImportLocation error: "+e.getMessage(),e);
			}
		}
		
		it.gov.spcoop.sica.dao.AccordoServizioComposto accServCompostoSICA = 
			new it.gov.spcoop.sica.dao.AccordoServizioComposto();
		
		IDAccordoCooperazioneFactory idAccordoCooperazioneFactory = IDAccordoCooperazioneFactory.getInstance();
				
		/* Metadati presenti nel Manifest dell'Accordo di Cooperazione. */
		it.gov.spcoop.sica.manifest.ServizioComposto manifest = new it.gov.spcoop.sica.manifest.ServizioComposto();
		manifest.setDescrizione(accordoServizioOpenspcoop.getDescrizione());
		manifest.setNome(accordoServizioOpenspcoop.getNome());
		manifest.setDataCreazione(accordoServizioOpenspcoop.getOraRegistrazione());
		//manifest.getRiservato() ???
		
		if(includiInfoRegistroGenerale){
			if(accordoServizioOpenspcoop.getVersione()!=null){
				manifest.setVersione(accordoServizioOpenspcoop.getVersione().intValue()+"");
			}
			//manifest.setDataPubblicazione(accordoServizioOpenspcoop.getDataPubblicazione());
		
			// Pubblicatore
			if(accordoServizioOpenspcoop.getSoggettoReferente()==null)
				throw new SICAToOpenSPCoopUtilitiesException("Soggetto referente non definito");
			IDSoggetto soggettoPubblicatore = new IDSoggetto(accordoServizioOpenspcoop.getSoggettoReferente().getTipo(),accordoServizioOpenspcoop.getSoggettoReferente().getNome());
			String uriPubblicatore = sicaToOpenspcoopContext.getCodiceIPA(soggettoPubblicatore);
			if(uriPubblicatore==null){
				uriPubblicatore = SICAtoOpenSPCoopUtilities.idSoggetto_openspcoopToSica(soggettoPubblicatore);
			}
			else
				uriPubblicatore = SICAtoOpenSPCoopUtilities.appendURI_IDSoggettoSica(uriPubblicatore);
			try {
				manifest.setPubblicatore(new URI(uriPubblicatore));
			}catch(Exception e) {
				throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
			}
			
			
			//if(accordoServizioOpenspcoop.getByteFirma()!=null){
			//	manifest.setFirmato(true);
			//}
		}
		
		
		// SpecificaInterfaccia
		it.gov.spcoop.sica.manifest.SpecificaInterfaccia specificaInterfaccia = null;
		if(  (accordoServizioOpenspcoop.getByteWsdlConcettuale()!=null) || (accordoServizioOpenspcoop.getByteWsdlLogicoErogatore()!=null) || (accordoServizioOpenspcoop.getByteWsdlLogicoFruitore()!=null) ){
			specificaInterfaccia = new it.gov.spcoop.sica.manifest.SpecificaInterfaccia();
		}
		if(wsdlEmptySeNonDefiniti || (accordoServizioOpenspcoop.getByteWsdlConcettuale()!=null)){
			it.gov.spcoop.sica.manifest.DocumentoInterfaccia docInterfaccia = new it.gov.spcoop.sica.manifest.DocumentoInterfaccia();
			docInterfaccia.setBase(Costanti.SPECIFICA_INTERFACCIA_CONCETTUALE_WSDL);
			docInterfaccia.setTipo(TipoDocumentoInterfaccia.WSDL);
			specificaInterfaccia.setInterfacciaConcettuale(docInterfaccia);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoInterfaccia.WSDL.toString());
			doc.setNome(Costanti.SPECIFICA_INTERFACCIA_CONCETTUALE_WSDL);
			if(accordoServizioOpenspcoop.getByteWsdlConcettuale()!=null){
				doc.setContenuto(accordoServizioOpenspcoop.getByteWsdlConcettuale());
			}else{
				// Imposto WSDL Empty per compatibilita Client SICA
				doc.setContenuto(Costanti.WSDL_EMPTY.getBytes());
			}
			accServCompostoSICA.setInterfacciaConcettuale(doc);
		}
		if(wsdlEmptySeNonDefiniti || (accordoServizioOpenspcoop.getByteWsdlLogicoErogatore()!=null)){
			it.gov.spcoop.sica.manifest.DocumentoInterfaccia docInterfaccia = new it.gov.spcoop.sica.manifest.DocumentoInterfaccia();
			docInterfaccia.setBase(Costanti.SPECIFICA_INTERFACCIA_LOGICA_EROGATORE_WSDL);
			docInterfaccia.setTipo(TipoDocumentoInterfaccia.WSDL);
			specificaInterfaccia.setInterfacciaLogicaLatoErogatore(docInterfaccia);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoInterfaccia.WSDL.toString());
			doc.setNome(Costanti.SPECIFICA_INTERFACCIA_LOGICA_EROGATORE_WSDL);
			if(accordoServizioOpenspcoop.getByteWsdlLogicoErogatore()!=null){
				doc.setContenuto(accordoServizioOpenspcoop.getByteWsdlLogicoErogatore());
			}else{
				// Imposto WSDL Empty per compatibilita Client SICA
				doc.setContenuto(Costanti.WSDL_EMPTY.getBytes());
			}
			accServCompostoSICA.setInterfacciaLogicaLatoErogatore(doc);
		}
		if(wsdlEmptySeNonDefiniti || (accordoServizioOpenspcoop.getByteWsdlLogicoFruitore()!=null)){
			it.gov.spcoop.sica.manifest.DocumentoInterfaccia docInterfaccia = new it.gov.spcoop.sica.manifest.DocumentoInterfaccia();
			docInterfaccia.setBase(Costanti.SPECIFICA_INTERFACCIA_LOGICA_FRUITORE_WSDL);
			docInterfaccia.setTipo(TipoDocumentoInterfaccia.WSDL);
			specificaInterfaccia.setInterfacciaLogicaLatoFruitore(docInterfaccia);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoInterfaccia.WSDL.toString());
			doc.setNome(Costanti.SPECIFICA_INTERFACCIA_LOGICA_FRUITORE_WSDL);
			if(accordoServizioOpenspcoop.getByteWsdlLogicoFruitore()!=null){
				doc.setContenuto(accordoServizioOpenspcoop.getByteWsdlLogicoFruitore());
			}else{
				// Imposto WSDL Empty per compatibilita Client SICA
				doc.setContenuto(Costanti.WSDL_EMPTY.getBytes());
			}
			accServCompostoSICA.setInterfacciaLogicaLatoFruitore(doc);
		}
		if(specificaInterfaccia!=null){
			manifest.setSpecificaInterfaccia(specificaInterfaccia);
		}
		
		
		// SpecificaConversazione
		it.gov.spcoop.sica.manifest.SpecificaConversazione specificaConversazione = null;
		if(  (accordoServizioOpenspcoop.getByteSpecificaConversazioneConcettuale()!=null) || 
				(accordoServizioOpenspcoop.getByteSpecificaConversazioneErogatore()!=null) || 
				(accordoServizioOpenspcoop.getByteSpecificaConversazioneFruitore()!=null) ){
			specificaConversazione = new it.gov.spcoop.sica.manifest.SpecificaConversazione();
		}
		if(accordoServizioOpenspcoop.getByteSpecificaConversazioneConcettuale()!=null){
			it.gov.spcoop.sica.manifest.DocumentoConversazione docConversazione = new it.gov.spcoop.sica.manifest.DocumentoConversazione();
			docConversazione.setBase(Costanti.SPECIFICA_CONVERSAZIONE_CONCETTUALE_WSBL);
			docConversazione.setTipo(TipoDocumentoConversazione.WSBL);
			specificaConversazione.setConversazioneConcettuale(docConversazione);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoConversazione.WSBL.toString());
			doc.setNome(Costanti.SPECIFICA_CONVERSAZIONE_CONCETTUALE_WSBL);
			doc.setContenuto(accordoServizioOpenspcoop.getByteSpecificaConversazioneConcettuale());
			accServCompostoSICA.setConversazioneConcettuale(doc);
		}
		if(accordoServizioOpenspcoop.getByteSpecificaConversazioneErogatore()!=null){
			it.gov.spcoop.sica.manifest.DocumentoConversazione docConversazione = new it.gov.spcoop.sica.manifest.DocumentoConversazione();
			docConversazione.setBase(Costanti.SPECIFICA_CONVERSAZIONE_LOGICA_LATO_EROGATORE_WSBL);
			docConversazione.setTipo(TipoDocumentoConversazione.WSBL);
			specificaConversazione.setConversazioneLogicaLatoErogatore(docConversazione);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoConversazione.WSBL.toString());
			doc.setNome(Costanti.SPECIFICA_CONVERSAZIONE_LOGICA_LATO_EROGATORE_WSBL);
			doc.setContenuto(accordoServizioOpenspcoop.getByteSpecificaConversazioneErogatore());
			accServCompostoSICA.setConversazioneLogicaErogatore(doc);
		}
		if(accordoServizioOpenspcoop.getByteSpecificaConversazioneFruitore()!=null){
			it.gov.spcoop.sica.manifest.DocumentoConversazione docConversazione = new it.gov.spcoop.sica.manifest.DocumentoConversazione();
			docConversazione.setBase(Costanti.SPECIFICA_CONVERSAZIONE_LOGICA_LATO_FRUITORE_WSBL);
			docConversazione.setTipo(TipoDocumentoConversazione.WSBL);
			specificaConversazione.setConversazioneLogicaLatoFruitore(docConversazione);
			
			it.gov.spcoop.sica.dao.Documento doc = new it.gov.spcoop.sica.dao.Documento();
			doc.setTipo(TipiDocumentoConversazione.WSBL.toString());
			doc.setNome(Costanti.SPECIFICA_CONVERSAZIONE_LOGICA_LATO_FRUITORE_WSBL);
			doc.setContenuto(accordoServizioOpenspcoop.getByteSpecificaConversazioneFruitore());
			accServCompostoSICA.setConversazioneLogicaFruitore(doc);
		}
		if(specificaConversazione!=null){
			manifest.setSpecificaConversazione(specificaConversazione);
		}
		
		
			

		// Riferimento accordo di cooperazione:
		String uriAccordoCooperazione = null;
		if(accordoServizioOpenspcoop.getServizioComposto()==null){
			throw new SICAToOpenSPCoopUtilitiesException("ServizioComposto non definito");
		}
		try{
			uriAccordoCooperazione =  SICAtoOpenSPCoopUtilities.idAccordoCooperazione_openspcoopToSica(registryReader,idAccordoCooperazioneFactory.getIDAccordoFromUri(accordoServizioOpenspcoop.getServizioComposto().getAccordoCooperazione()));
		}catch(Exception e){
			throw new SICAToOpenSPCoopUtilitiesException("Trasformazione IDAccordo di cooperazione ["+accordoServizioOpenspcoop.getServizioComposto().getAccordoCooperazione()+"] non riuscito: "+e.getMessage(),e);
		}
		try {
			manifest.setRiferimentoAccordoCooperazione(new URI(uriAccordoCooperazione));
		}catch(Exception e) {
			throw new SICAToOpenSPCoopUtilitiesException(e.getMessage(),e);
		}
		
		
		
		// Servizi componenti
		ElencoServiziComponenti servComponentiSICA = null;
		for(int i=0; i<accordoServizioOpenspcoop.getServizioComposto().sizeServizioComponenteList(); i++){
			AccordoServizioParteComuneServizioCompostoServizioComponente servComponente = accordoServizioOpenspcoop.getServizioComposto().getServizioComponente(i);
		
			if(servComponentiSICA==null)
				servComponentiSICA = new ElencoServiziComponenti();
			try{
				IDServizio idServ = IDServizioFactory.getInstance().getIDServizioFromValues(servComponente.getTipo(),servComponente.getNome(), 
						servComponente.getTipoSoggetto(),servComponente.getNomeSoggetto(), 
						servComponente.getVersione()); 
				String uriAPS = sicaToOpenspcoopContext.getUriAPS(idServ);
				if(uriAPS==null){
					throw new SICAToOpenSPCoopUtilitiesException("Trasformazione IDServizio ["+idServ+"] in uri accordo servizio parte specifica non riuscita");
				}
				servComponentiSICA.addServizioComponente(new URI(uriAPS));
			}catch(Exception e){
				IDServizio idServWithOutCheck = IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(servComponente.getTipo(),servComponente.getNome(), 
						servComponente.getTipoSoggetto(),servComponente.getNomeSoggetto(), 
						servComponente.getVersione()); 
				throw new SICAToOpenSPCoopUtilitiesException("Trasformazione IDServizio ["+idServWithOutCheck+"] non riuscito: "+e.getMessage(),e);
			}
		}
		if(servComponentiSICA!=null)
			manifest.setServiziComponenti(servComponentiSICA);
		
		
		/* Allegati */
		it.gov.spcoop.sica.manifest.ElencoAllegati allegati = null;
		// ProfiloCollaborazioneEGOV
		if(accordoServizioOpenspcoop.sizePortTypeList()>0 && !documentoSpecificaEGOV_asSpecificaSemiformale){
			String docGenerico = null;
			if(documentoSpecificaEGOV_asClientSICA){
				try{
					docGenerico = it.gov.spcoop.sica.wscp.driver.XMLUtils.generaGenericoDocumento(accordoServizioOpenspcoop, accServCompostoSICA,
							documentoSpecificaEGOV_nomiSPCoopQualified, documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified);
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Errore durante la conversione delle informazioni eGov in Allegati (http://spcoop.gov.it/sica/wscp): "+e.getMessage(),e);
				}
			}else{
				try{
					docGenerico = it.cnipa.collprofiles.driver.XMLUtils.generaGenericoDocumento(accordoServizioOpenspcoop, accServCompostoSICA, 
							documentoSpecificaEGOV_asClientSICADisabled_namespaceCNIPA,
							documentoSpecificaEGOV_nomiSPCoopQualified);
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Errore durante la conversione delle informazioni eGov in Allegati (http://www.cnipa.it/collProfiles): "+e.getMessage(),e);
				}
			}
			if(docGenerico!=null){
				if(allegati==null){
					allegati = new it.gov.spcoop.sica.manifest.ElencoAllegati();
				}
				allegati.addGenericoDocumento(docGenerico);
				manifest.setAllegati(allegati);
			}
		}
		// Altri allegati generici
		if(accordoServizioOpenspcoop.sizeAllegatoList()>0){
			if(allegati==null){
				allegati = new it.gov.spcoop.sica.manifest.ElencoAllegati();
			}
			for(int i=0; i<accordoServizioOpenspcoop.sizeAllegatoList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = accordoServizioOpenspcoop.getAllegato(i);
				
				allegati.addGenericoDocumento(docOpenspcoop.getFile());
					
				it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
				docSICA.setTipo(docOpenspcoop.getTipo());
				docSICA.setNome(docOpenspcoop.getFile());
				if(docOpenspcoop.getByteContenuto()==null){
					throw new SICAToOpenSPCoopUtilitiesException("Byte dell'allegato "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
				}
				docSICA.setContenuto(docOpenspcoop.getByteContenuto());
				accServCompostoSICA.addAllegato(docSICA);
			}
			manifest.setAllegati(allegati);
		}
		// WSDL Definitorio
		if(accordoServizioOpenspcoop.getByteWsdlDefinitorio()!=null){
			if(allegati==null){
				allegati = new it.gov.spcoop.sica.manifest.ElencoAllegati();
			}
			allegati.addGenericoDocumento(Costanti.ALLEGATO_DEFINITORIO_XSD);
			manifest.setAllegati(allegati);
			
			it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
			docSICA.setTipo("XSD");
			docSICA.setNome(Costanti.ALLEGATO_DEFINITORIO_XSD);
			docSICA.setContenuto(accordoServizioOpenspcoop.getByteWsdlDefinitorio());
			accServCompostoSICA.addAllegato(docSICA);
		}
		
		
		/* SpecificheSemiformali */
		it.gov.spcoop.sica.manifest.SpecificaSemiformale specificaSemiformale = null;
		// ProfiloCollaborazioneEGOV
		if(accordoServizioOpenspcoop.sizePortTypeList()>0 && documentoSpecificaEGOV_asSpecificaSemiformale){
			it.gov.spcoop.sica.manifest.DocumentoSemiformale docSemiformale = null;
			if(documentoSpecificaEGOV_asClientSICA){
				try{
					docSemiformale = it.gov.spcoop.sica.wscp.driver.XMLUtils.generaDocumentoSemiformale(accordoServizioOpenspcoop, accServCompostoSICA,
							documentoSpecificaEGOV_nomiSPCoopQualified, documentoSpecificaEGOV_asClientSICAEnabled_childUnquilified);
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Errore durante la conversione delle informazioni eGov in SpecificaSemiformale (http://spcoop.gov.it/sica/wscp): "+e.getMessage(),e);
				}
			}else{
				try{
					docSemiformale = it.cnipa.collprofiles.driver.XMLUtils.generaDocumentoSemiformale(accordoServizioOpenspcoop, accServCompostoSICA, 
							documentoSpecificaEGOV_asClientSICADisabled_namespaceCNIPA,
							documentoSpecificaEGOV_nomiSPCoopQualified);
				}catch(Exception e){
					throw new SICAToOpenSPCoopUtilitiesException("Errore durante la conversione delle informazioni eGov in SpecificaSemiformale (http://www.cnipa.it/collProfiles): "+e.getMessage(),e);
				}
			}
			if(docSemiformale!=null){
				if(specificaSemiformale==null){
					specificaSemiformale = new it.gov.spcoop.sica.manifest.SpecificaSemiformale();
				}
				specificaSemiformale.addDocumentoSemiformale(docSemiformale);
				manifest.setSpecificaSemiformale(specificaSemiformale);
			}
		}
		// Altre Specifiche semiformali
		if(accordoServizioOpenspcoop.sizeSpecificaSemiformaleList()>0){
			if(specificaSemiformale==null){
				specificaSemiformale = new it.gov.spcoop.sica.manifest.SpecificaSemiformale();
			}
			for(int i=0; i<accordoServizioOpenspcoop.sizeSpecificaSemiformaleList(); i++){
				org.openspcoop2.core.registry.Documento docOpenspcoop = accordoServizioOpenspcoop.getSpecificaSemiformale(i);
				
				it.gov.spcoop.sica.manifest.DocumentoSemiformale docSemiformale = new it.gov.spcoop.sica.manifest.DocumentoSemiformale();
				docSemiformale.setTipo(docOpenspcoop.getTipo());
				docSemiformale.setBase(docOpenspcoop.getFile());
				specificaSemiformale.addDocumentoSemiformale(docSemiformale);
				
				it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
				docSICA.setTipo(docOpenspcoop.getTipo());
				docSICA.setNome(docOpenspcoop.getFile());
				if(docOpenspcoop.getByteContenuto()==null){
					throw new SICAToOpenSPCoopUtilitiesException("Byte della specifica semiformale "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
				}
				docSICA.setContenuto(docOpenspcoop.getByteContenuto());
				accServCompostoSICA.addSpecificaSemiformale(docSICA);
			}
			manifest.setSpecificaSemiformale(specificaSemiformale);
		}

		
		// Specifiche di coordinamento
		it.gov.spcoop.sica.manifest.SpecificaCoordinamento coordinamento = null;
		for(int i=0; i<accordoServizioOpenspcoop.getServizioComposto().sizeSpecificaCoordinamentoList(); i++){
			org.openspcoop2.core.registry.Documento docOpenspcoop = accordoServizioOpenspcoop.getServizioComposto().getSpecificaCoordinamento(i);
			
			if(coordinamento==null)
				coordinamento = new it.gov.spcoop.sica.manifest.SpecificaCoordinamento();
			
			it.gov.spcoop.sica.manifest.DocumentoCoordinamento docCoordinamento = new it.gov.spcoop.sica.manifest.DocumentoCoordinamento();
			docCoordinamento.setTipo(docOpenspcoop.getTipo());
			docCoordinamento.setBase(docOpenspcoop.getFile());
			coordinamento.addDocumentoCoordinamento(docCoordinamento);
			
			it.gov.spcoop.sica.dao.Documento docSICA = new it.gov.spcoop.sica.dao.Documento();
			docSICA.setTipo(docOpenspcoop.getTipo());
			docSICA.setNome(docOpenspcoop.getFile());
			if(docOpenspcoop.getByteContenuto()==null){
				throw new SICAToOpenSPCoopUtilitiesException("Byte della specifica di coordinamento "+docOpenspcoop.getFile()+" di tipo "+docOpenspcoop.getTipo()+" non forniti");
			}
			docSICA.setContenuto(docOpenspcoop.getByteContenuto());
			accServCompostoSICA.addSpecificaCoordinamento(docSICA);
		}
		if(coordinamento!=null)
			manifest.setSpecificaCoordinamento(coordinamento);
		
		
		/* Firma apposta dal Servizio di Registro quando l'accordo viene scaricato dal Registro stesso  */
		if(includiInfoRegistroGenerale){
			//if(accordoServizioOpenspcoop.getByteFirma()!=null){
			//	it.gov.spcoop.sica.firma.Firma firma = new it.gov.spcoop.sica.firma.Firma();
			//	accServCompostoSICA.setFirma(firma);
			//}
		}
		
		accServCompostoSICA.setManifesto(manifest);
		return accServCompostoSICA;
	}
}