DocumentoExporter.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */


package org.openspcoop2.web.ctrlstat.servlet.archivi;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

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

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.config.Credenziali;
import org.openspcoop2.core.config.InvocazionePorta;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.RegistroPluginArchivio;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.Soggetto;
import org.openspcoop2.core.config.TrasformazioneRegola;
import org.openspcoop2.core.config.TrasformazioneRegolaRichiesta;
import org.openspcoop2.core.config.TrasformazioneRegolaRisposta;
import org.openspcoop2.core.config.TrasformazioneSoap;
import org.openspcoop2.core.config.TrasformazioneSoapRisposta;
import org.openspcoop2.core.config.Trasformazioni;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.CredenzialiSoggetto;
import org.openspcoop2.core.registry.Documento;
import org.openspcoop2.core.registry.Fruitore;
import org.openspcoop2.core.registry.ProtocolProperty;
import org.openspcoop2.core.registry.constants.CredenzialeTipo;
import org.openspcoop2.core.registry.constants.ServiceBinding;
import org.openspcoop2.core.registry.driver.AccordoServizioUtils;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.wsdl.AccordoServizioWrapper;
import org.openspcoop2.core.registry.wsdl.AccordoServizioWrapperUtilities;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.xml.MessageXMLUtils;
import org.openspcoop2.pdd.core.jmx.JMXUtils;
import org.openspcoop2.pdd.core.keystore.RemoteStoreKeyEntry;
import org.openspcoop2.protocol.basic.Costanti;
import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.registry.IRegistryReader;
import org.openspcoop2.protocol.sdk.registry.RegistryNotFound;
import org.openspcoop2.utils.json.YAMLUtils;
import org.openspcoop2.utils.transport.http.HttpUtilities;
import org.openspcoop2.utils.wsdl.WSDLUtilities;
import org.openspcoop2.utils.xml.XMLException;
import org.openspcoop2.utils.xml.XSDSchemaCollection;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationException;
import org.openspcoop2.web.ctrlstat.servlet.apc.AccordiServizioParteComuneCore;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaCore;
import org.openspcoop2.web.ctrlstat.servlet.config.ConfigurazioneCore;
import org.openspcoop2.web.ctrlstat.servlet.config.ConfigurazioneCostanti;
import org.openspcoop2.web.ctrlstat.servlet.connettori.ConnettoriCostanti;
import org.openspcoop2.web.ctrlstat.servlet.pa.PorteApplicativeCore;
import org.openspcoop2.web.ctrlstat.servlet.pd.PorteDelegateCore;
import org.openspcoop2.web.ctrlstat.servlet.protocol_properties.ProtocolPropertiesCore;
import org.openspcoop2.web.ctrlstat.servlet.remote_stores.RemoteStoresCore;
import org.openspcoop2.web.ctrlstat.servlet.sa.ServiziApplicativiCore;
import org.openspcoop2.web.ctrlstat.servlet.soggetti.SoggettiCore;
import org.openspcoop2.web.lib.mvc.PageData;
import org.openspcoop2.web.lib.mvc.ServletUtils;
import org.slf4j.Logger;

/**
 * Questa servlet si occupa di esportare le tracce diagnostiche in formato xml
 * zippandole
 * 
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author Stefano Corallo (corallo@link.it)
 * @author Sandra Giangrandi (sandra@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public class DocumentoExporter extends HttpServlet {

	private static final long serialVersionUID = -7341279067126334095L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.processRequest(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		this.processRequest(req, resp);
	}

	/**
	 * Processa la richiesta pervenuta e si occupa di fornire i dati richiesti
	 * in formato zip
	 * 
	 * @param req
	 * @param resp
	 * @throws ServletException
	 * @throws IOException
	 */
	private void processRequest(HttpServletRequest request, HttpServletResponse response) {

		HttpSession session = request.getSession(true);

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

		ArchiviHelper archiviHelper = null;
		
		byte[] docBytes = null;
		String fileName = null;
		
		try {
			archiviHelper = new ArchiviHelper(request, pd, session);

			ControlStationCore.logDebug("Ricevuta Richiesta di esportazione...");
			Enumeration<?> en = archiviHelper.getParameterNames();
			ControlStationCore.logDebug("Parametri (nome = valore):\n-----------------");
			while (en.hasMoreElements()) {
				String param = (String) en.nextElement();
				String value = archiviHelper.getParameter(param);
				ControlStationCore.logDebug(param + " = " + value);
			}
			ControlStationCore.logDebug("-----------------");

			String idAllegato = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_ID_ALLEGATO);
			String idAccordo = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_ID_ACCORDO);
			String tipoDocumento = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO);
			String tipoDocumentoDaScaricare = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO);
			if(tipoDocumentoDaScaricare==null || "".equals(tipoDocumentoDaScaricare)){
				tipoDocumentoDaScaricare = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_DOCUMENTO;
			}

			String tipoSoggettoFruitore = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_IMPLEMENTATIVO_TIPO_SOGGETTO_FRUITORE);
			String nomeSoggettoFruitore = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_IMPLEMENTATIVO_NOME_SOGGETTO_FRUITORE);

			long idAccordoLong = getIdAccordoLong(idAccordo);

			ArchiviCore archiviCore = new ArchiviCore();
			ProtocolPropertiesCore ppCore = new ProtocolPropertiesCore(archiviCore);
			PorteDelegateCore pdCore = new PorteDelegateCore(archiviCore);
			PorteApplicativeCore paCore = new PorteApplicativeCore(archiviCore);

			if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_DOCUMENTO.equals(tipoDocumentoDaScaricare) ){

				long idAllegatoInt = Long.parseLong(idAllegato);

				if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_PARTE_COMUNE.equals(tipoDocumento)
						||
						ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_PARTE_SPECIFICA.equals(tipoDocumento)
						||
						ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_COOPERAZIONE.equals(tipoDocumento)){
					Documento doc = archiviCore.getDocumento(idAllegatoInt,true);
					fileName = doc.getFile();
					docBytes = doc.getByteContenuto();
				}
				else{
					throw new ServletException("Tipo archivio ["+tipoDocumento+"] non gestito (tipo documento: "+tipoDocumentoDaScaricare+")");
				}

			}
			else {

				if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_PARTE_COMUNE.equals(tipoDocumento)){

					AccordiServizioParteComuneCore asCore = new AccordiServizioParteComuneCore(archiviCore);
					AccordoServizioParteComune as = asCore.getAccordoServizioFull(idAccordoLong);

					if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_DEFINITORIO.equals(tipoDocumentoDaScaricare) ){
						fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_INTERFACCIA_DEFINITORIA;
						docBytes = as.getByteWsdlDefinitorio();
					}
					else if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_CONCETTUALE.equals(tipoDocumentoDaScaricare) ){
						docBytes = as.getByteWsdlConcettuale();
						if(as.getFormatoSpecifica()!=null) {
							switch (as.getFormatoSpecifica()) {
							case WSDL_11:
								fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_CONCETTUALE_WSDL;
								break;
							case OPEN_API_3:
								YAMLUtils yamlUtils = YAMLUtils.getInstance();
								if(yamlUtils.isYaml(docBytes)) {
									fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_OPENAPI_3_0_YAML;
								}
								else {	
									fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_OPENAPI_3_0_JSON;
								}
								break;
							case SWAGGER_2:
								yamlUtils = YAMLUtils.getInstance();
								if(yamlUtils.isYaml(docBytes)) {
									fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SWAGGER_2_0_YAML;
								}
								else {
									fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SWAGGER_2_0_JSON;
								}
								break;
							case WADL:
								fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WADL;
								break;
							}
						}
						else {
							fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_CONCETTUALE_WSDL;
						}
					}
					else if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_LOGICO_EROGATORE.equals(tipoDocumentoDaScaricare) ){
						fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_LOGICO_EROGATORE_WSDL;
						docBytes = as.getByteWsdlLogicoErogatore();
					}
					else if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_LOGICO_FRUITORE.equals(tipoDocumentoDaScaricare) ){
						fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_LOGICO_FRUITORE_WSDL;
						docBytes = as.getByteWsdlLogicoFruitore();
					}
					else if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_SPECIFICA_CONVERSAZIONE_CONCETTUALE.equals(tipoDocumentoDaScaricare) ){
						fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SPECIFICA_CONVERSIONE_CONCETTUALE;
						docBytes = as.getByteSpecificaConversazioneConcettuale();
					}
					else if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_SPECIFICA_CONVERSAZIONE_LOGICO_EROGATORE.equals(tipoDocumentoDaScaricare) ){
						fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SPECIFICA_CONVERSIONE_LOGICA_EROGATORE;
						docBytes = as.getByteSpecificaConversazioneErogatore();
					}
					else if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_SPECIFICA_CONVERSAZIONE_LOGICO_FRUITORE.equals(tipoDocumentoDaScaricare) ){
						fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_SPECIFICA_CONVERSIONE_LOGICA_FRUITORE;
						docBytes = as.getByteSpecificaConversazioneFruitore();
					}
					else if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_XSD_SCHEMA_COLLECTION.equals(tipoDocumentoDaScaricare) ){

						AccordoServizioParteComune asConAllegati = asCore.getAccordoServizioFull(IDAccordoFactory.getInstance().getIDAccordoFromAccordo(as), true);
						try{
							// Nel caso di API REST devo eliminare la parte concettuale/logica poichè non è un wsdl/xsd
							if( ServiceBinding.REST.equals(asConAllegati.getServiceBinding()) ){
								asConAllegati.setByteWsdlConcettuale(null);
								asConAllegati.setByteWsdlLogicoErogatore(null);
								asConAllegati.setByteWsdlLogicoFruitore(null);
							}
							
							AccordoServizioUtils asUtils = new AccordoServizioUtils(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), ControlStationCore.getLog());
							XSDSchemaCollection schemaCollection = asUtils.buildSchemaCollection(asConAllegati, true);
							fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_XSD_SCHEMA_COLLECTION;
							docBytes = this.serializeWsdl(ControlStationCore.getLog(), schemaCollection, asConAllegati);
						}
						catch(Exception e){
							ControlStationCore.getLog().error("XSDSchemaCollection build error: "+e.getMessage(),e);
							fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_XSD_SCHEMA_COLLECTION_ERROR;
							String msg = e.getMessage();
							if(msg==null || msg.equals("")){
								if(e instanceof NullPointerException){
									msg = "Internal Error (NP)";
								}
								else{
									msg = e.toString();
									if(msg==null || msg.equals("")){
										msg = "Internal Error";
									}
								}
							}
							docBytes = msg.getBytes();
						}

					}
					else{
						throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non gestito per il tipo archivio ["+tipoDocumento+"]");
					}

				}
				else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_PARTE_SPECIFICA.equals(tipoDocumento)){

					AccordiServizioParteSpecificaCore asCore = new AccordiServizioParteSpecificaCore(archiviCore);
					AccordoServizioParteSpecifica as = asCore.getAccordoServizioParteSpecifica(idAccordoLong);

					if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_IMPLEMENTATIVO_EROGATORE.equals(tipoDocumentoDaScaricare) ){
						fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_IMPLEMENTATIVO_EROGATORE_WSDL;
						if(tipoSoggettoFruitore!=null && !"".equals(tipoSoggettoFruitore) &&
								nomeSoggettoFruitore!=null && !"".equals(nomeSoggettoFruitore)){
							for (int i = 0; i < as.sizeFruitoreList(); i++) {
								Fruitore f = as.getFruitore(i);
								if(tipoSoggettoFruitore.equals(f.getTipo()) && nomeSoggettoFruitore.equals(f.getNome())){
									docBytes = f.getByteWsdlImplementativoErogatore();
									break;
								}
							}
						}else{
							docBytes = as.getByteWsdlImplementativoErogatore();
						}
					}
					else if( ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ACCORDO_TIPO_DOCUMENTO_WSDL_IMPLEMENTATIVO_FRUITORE.equals(tipoDocumentoDaScaricare) ){
						fileName = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_IMPLEMENTATIVO_FRUITORE_WSDL;
						if(tipoSoggettoFruitore!=null && !"".equals(tipoSoggettoFruitore) &&
								nomeSoggettoFruitore!=null && !"".equals(nomeSoggettoFruitore)){
							for (int i = 0; i < as.sizeFruitoreList(); i++) {
								Fruitore f = as.getFruitore(i);
								if(tipoSoggettoFruitore.equals(f.getTipo()) && nomeSoggettoFruitore.equals(f.getNome())){
									docBytes = f.getByteWsdlImplementativoFruitore();
									break;
								}
							}
						}else{
							docBytes = as.getByteWsdlImplementativoFruitore();
						}
					}
					else{
						throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non gestito per il tipo archivio ["+tipoDocumento+"]");
					}

				}
				else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_PROTOCOL_PROPERTY.equals(tipoDocumento)){
					if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PROTOCOL_PROPERTY_BINARY.equals(tipoDocumentoDaScaricare)){
						long idAllegatoInt = Long.parseLong(idAllegato);
						ProtocolProperty bp = ppCore.getProtocolPropertyBinaria(idAllegatoInt);
						fileName = bp.getFile();
						docBytes = bp.getByteFile();
						docBytes = archiviCore.getDriverBYOKUtilities().unwrap(docBytes); // se cifrato, viene decifrato
					}else{
						throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non gestito per il tipo archivio ["+tipoDocumento+"]");
					}
				}
				else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_PORTA_APPLICATIVA.equals(tipoDocumento)){
					if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_XACML_POLICY.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaApplicativa portaApplicativa = paCore.getPortaApplicativa(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_XACML_POLICY_FILENAME;
						
						String policy = portaApplicativa.getXacmlPolicy();

						if(StringUtils.isEmpty(policy)) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						docBytes = policy.getBytes();
					}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_CONVERSIONE_TEMPLATE.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaApplicativa portaApplicativa = paCore.getPortaApplicativa(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_CONVERSIONE_TEMPLATE_FILENAME;
						
						String idTrasformazioneRegola = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_ID);
						long idTrasformazione = Long.parseLong(idTrasformazioneRegola);
						
						Trasformazioni trasformazioni = portaApplicativa.getTrasformazioni();
						TrasformazioneRegola oldRegola = null;
						for (TrasformazioneRegola reg : trasformazioni.getRegolaList()) {
							if(reg.getId().longValue() == idTrasformazione) {
								oldRegola = reg;
								break;
							}
						}

						if(oldRegola == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						TrasformazioneRegolaRichiesta richiesta = oldRegola.getRichiesta();
					
						if(richiesta == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						if(richiesta.getConversioneTemplate() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione tipo = StringUtils.isNotEmpty(richiesta.getConversioneTipo()) ? 
								org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.toEnumConstant(richiesta.getConversioneTipo()) : org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.EMPTY;

						switch(tipo) {
						case FREEMARKER_TEMPLATE:
						case CONTEXT_FREEMARKER_TEMPLATE:
						case FREEMARKER_TEMPLATE_ZIP:
						case VELOCITY_TEMPLATE:
						case CONTEXT_VELOCITY_TEMPLATE:
						case VELOCITY_TEMPLATE_ZIP:
						case TEMPLATE:
						case XSLT:
						case ZIP:
						case TGZ:
						case TAR:
							fileName += tipo.getExt();
							break;
						case EMPTY:
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] '"+tipo+"' non disponibile per il tipo archivio ["+tipoDocumento+"]: tipo non supportato");
						}
						
/**						if(fileName==null) {
//							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] '"+tipo+"' non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
//						}*/

						docBytes = richiesta.getConversioneTemplate();
					}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_SOAP_ENVELOPE_TEMPLATE.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaApplicativa portaApplicativa = paCore.getPortaApplicativa(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_SOAP_ENVELOPE_TEMPLATE_FILENAME;
						
						String idTrasformazioneRegola = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_ID);
						long idTrasformazione = Long.parseLong(idTrasformazioneRegola);
						
						Trasformazioni trasformazioni = portaApplicativa.getTrasformazioni();
						TrasformazioneRegola oldRegola = null;
						for (TrasformazioneRegola reg : trasformazioni.getRegolaList()) {
							if(reg.getId().longValue() == idTrasformazione) {
								oldRegola = reg;
								break;
							}
						}

						if(oldRegola == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						TrasformazioneRegolaRichiesta richiesta = oldRegola.getRichiesta();
					
						if(richiesta == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						if(richiesta.getTrasformazioneSoap() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						TrasformazioneSoap trasformazioneSoap = richiesta.getTrasformazioneSoap();
						
						if( trasformazioneSoap.getEnvelopeBodyConversioneTemplate() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione tipo = StringUtils.isNotEmpty(trasformazioneSoap.getEnvelopeBodyConversioneTipo()) ? 
								org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.toEnumConstant(trasformazioneSoap.getEnvelopeBodyConversioneTipo()) : org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.EMPTY;

						switch(tipo) {
						case FREEMARKER_TEMPLATE:
						case CONTEXT_FREEMARKER_TEMPLATE:
						case FREEMARKER_TEMPLATE_ZIP:
						case VELOCITY_TEMPLATE:
						case CONTEXT_VELOCITY_TEMPLATE:
						case VELOCITY_TEMPLATE_ZIP:
						case TEMPLATE:
						case XSLT:
						case ZIP:
						case TGZ:
						case TAR:
							fileName += tipo.getExt();
							break;
						case EMPTY:
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						docBytes = trasformazioneSoap.getEnvelopeBodyConversioneTemplate();
					}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_RISPOSTA_CONVERSIONE_TEMPLATE.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaApplicativa portaApplicativa = paCore.getPortaApplicativa(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_RISPOSTA_CONVERSIONE_TEMPLATE_FILENAME;

						String idTrasformazioneRegola = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_ID);
						long idTrasformazione = Long.parseLong(idTrasformazioneRegola);
						
						String idTrasformazioneRegolaRes = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_RES_ID);
						long idTrasformazioneRisposta = Long.parseLong(idTrasformazioneRegolaRes);
						
						Trasformazioni trasformazioni = portaApplicativa.getTrasformazioni();
						TrasformazioneRegola oldRegola = null;
						for (TrasformazioneRegola reg : trasformazioni.getRegolaList()) {
							if(reg.getId().longValue() == idTrasformazione) {
								oldRegola = reg;
								break;
							}
						}

						if(oldRegola == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						TrasformazioneRegolaRisposta oldRisposta = null;
						for (int j = 0; j < oldRegola.sizeRispostaList(); j++) {
							TrasformazioneRegolaRisposta risposta = oldRegola.getRisposta(j);
							if (risposta.getId().longValue() == idTrasformazioneRisposta) {
								oldRisposta = risposta;
								break;
							}
						}
						
						if(oldRisposta == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						if(oldRisposta.getConversioneTemplate() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione tipo = StringUtils.isNotEmpty(oldRisposta.getConversioneTipo()) ? 
								org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.toEnumConstant(oldRisposta.getConversioneTipo()) : org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.EMPTY;

						switch(tipo) {
						case FREEMARKER_TEMPLATE:
						case CONTEXT_FREEMARKER_TEMPLATE:
						case FREEMARKER_TEMPLATE_ZIP:
						case VELOCITY_TEMPLATE:
						case CONTEXT_VELOCITY_TEMPLATE:
						case VELOCITY_TEMPLATE_ZIP:
						case TEMPLATE:
						case XSLT:
						case ZIP:
						case TGZ:
						case TAR:
							fileName += tipo.getExt();
							break;
						case EMPTY:
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
								
						docBytes = oldRisposta.getConversioneTemplate();
					}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_RISPOSTA_SOAP_ENVELOPE_TEMPLATE.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaApplicativa portaApplicativa = paCore.getPortaApplicativa(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_RISPOSTA_SOAP_ENVELOPE_TEMPLATE_FILENAME;
						
						String idTrasformazioneRegola = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_ID);
						long idTrasformazione = Long.parseLong(idTrasformazioneRegola);
						
						String idTrasformazioneRegolaRes = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_APPLICATIVA_CONFIGURAZIONE_TRASFORMAZIONI_RES_ID);
						long idTrasformazioneRisposta = Long.parseLong(idTrasformazioneRegolaRes);

						Trasformazioni trasformazioni = portaApplicativa.getTrasformazioni();
						TrasformazioneRegola oldRegola = null;
						for (TrasformazioneRegola reg : trasformazioni.getRegolaList()) {
							if(reg.getId().longValue() == idTrasformazione) {
								oldRegola = reg;
								break;
							}
						}

						if(oldRegola == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						TrasformazioneRegolaRisposta oldRisposta = null;
						for (int j = 0; j < oldRegola.sizeRispostaList(); j++) {
							TrasformazioneRegolaRisposta risposta = oldRegola.getRisposta(j);
							if (risposta.getId().longValue() == idTrasformazioneRisposta) {
								oldRisposta = risposta;
								break;
							}
						}
						
						if(oldRisposta == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						if(oldRisposta.getTrasformazioneSoap() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						TrasformazioneSoapRisposta trasformazioneSoap = oldRisposta.getTrasformazioneSoap();
						
						if( trasformazioneSoap.getEnvelopeBodyConversioneTemplate() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione tipo = StringUtils.isNotEmpty(trasformazioneSoap.getEnvelopeBodyConversioneTipo()) ? 
								org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.toEnumConstant(trasformazioneSoap.getEnvelopeBodyConversioneTipo()) : org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.EMPTY;

						switch(tipo) {
						case FREEMARKER_TEMPLATE:
						case CONTEXT_FREEMARKER_TEMPLATE:
						case FREEMARKER_TEMPLATE_ZIP:
						case VELOCITY_TEMPLATE:
						case CONTEXT_VELOCITY_TEMPLATE:
						case VELOCITY_TEMPLATE_ZIP:
						case TEMPLATE:
						case XSLT:
						case ZIP:
						case TGZ:
						case TAR:
							fileName += tipo.getExt();
							break;
						case EMPTY:
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						docBytes = trasformazioneSoap.getEnvelopeBodyConversioneTemplate();
					}else {
						throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non gestito per il tipo archivio ["+tipoDocumento+"]");
					}
				}
				else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_PORTA_DELEGATA.equals(tipoDocumento)){
					if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_XACML_POLICY.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaDelegata portaDelegata = pdCore.getPortaDelegata(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_XACML_POLICY_FILENAME;

						String policy = portaDelegata.getXacmlPolicy();

						if(StringUtils.isEmpty(policy)) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						docBytes = policy.getBytes();
					}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_CONVERSIONE_TEMPLATE.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaDelegata portaDelegata = pdCore.getPortaDelegata(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_CONVERSIONE_TEMPLATE_FILENAME;

						String idTrasformazioneRegola = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_ID);
						long idTrasformazione = Long.parseLong(idTrasformazioneRegola);
						
						Trasformazioni trasformazioni = portaDelegata.getTrasformazioni();
						TrasformazioneRegola oldRegola = null;
						for (TrasformazioneRegola reg : trasformazioni.getRegolaList()) {
							if(reg.getId().longValue() == idTrasformazione) {
								oldRegola = reg;
								break;
							}
						}

						if(oldRegola == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						TrasformazioneRegolaRichiesta richiesta = oldRegola.getRichiesta();
					
						if(richiesta == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						if(richiesta.getConversioneTemplate() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione tipo = StringUtils.isNotEmpty(richiesta.getConversioneTipo()) ? 
								org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.toEnumConstant(richiesta.getConversioneTipo()) : org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.EMPTY;

						switch(tipo) {
						case FREEMARKER_TEMPLATE:
						case CONTEXT_FREEMARKER_TEMPLATE:
						case FREEMARKER_TEMPLATE_ZIP:
						case VELOCITY_TEMPLATE:
						case CONTEXT_VELOCITY_TEMPLATE:
						case VELOCITY_TEMPLATE_ZIP:
						case TEMPLATE:
						case XSLT:
						case ZIP:
						case TGZ:
						case TAR:
							fileName += tipo.getExt();
							break;
						case EMPTY:
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
								
						docBytes = richiesta.getConversioneTemplate();
					}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_SOAP_ENVELOPE_TEMPLATE.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaDelegata portaDelegata = pdCore.getPortaDelegata(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_SOAP_ENVELOPE_TEMPLATE_FILENAME;
						
						String idTrasformazioneRegola = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_ID);
						long idTrasformazione = Long.parseLong(idTrasformazioneRegola);

						Trasformazioni trasformazioni = portaDelegata.getTrasformazioni();
						TrasformazioneRegola oldRegola = null;
						for (TrasformazioneRegola reg : trasformazioni.getRegolaList()) {
							if(reg.getId().longValue() == idTrasformazione) {
								oldRegola = reg;
								break;
							}
						}

						if(oldRegola == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						TrasformazioneRegolaRichiesta richiesta = oldRegola.getRichiesta();
					
						if(richiesta == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						if(richiesta.getTrasformazioneSoap() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						TrasformazioneSoap trasformazioneSoap = richiesta.getTrasformazioneSoap();
						
						if( trasformazioneSoap.getEnvelopeBodyConversioneTemplate() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione tipo = StringUtils.isNotEmpty(trasformazioneSoap.getEnvelopeBodyConversioneTipo()) ? 
								org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.toEnumConstant(trasformazioneSoap.getEnvelopeBodyConversioneTipo()) : org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.EMPTY;

						switch(tipo) {
						case FREEMARKER_TEMPLATE:
						case CONTEXT_FREEMARKER_TEMPLATE:
						case FREEMARKER_TEMPLATE_ZIP:
						case VELOCITY_TEMPLATE:
						case CONTEXT_VELOCITY_TEMPLATE:
						case VELOCITY_TEMPLATE_ZIP:
						case TEMPLATE:
						case XSLT:
						case ZIP:
						case TGZ:
						case TAR:
							fileName += tipo.getExt();
							break;
						case EMPTY:
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						docBytes = trasformazioneSoap.getEnvelopeBodyConversioneTemplate();
					}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_RISPOSTA_CONVERSIONE_TEMPLATE.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaDelegata portaDelegata = pdCore.getPortaDelegata(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_RISPOSTA_CONVERSIONE_TEMPLATE_FILENAME;

						String idTrasformazioneRegola = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_ID);
						long idTrasformazione = Long.parseLong(idTrasformazioneRegola);
						
						String idTrasformazioneRegolaRes = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_RES_ID);
						long idTrasformazioneRisposta = Long.parseLong(idTrasformazioneRegolaRes);
						
						Trasformazioni trasformazioni = portaDelegata.getTrasformazioni();
						TrasformazioneRegola oldRegola = null;
						for (TrasformazioneRegola reg : trasformazioni.getRegolaList()) {
							if(reg.getId().longValue() == idTrasformazione) {
								oldRegola = reg;
								break;
							}
						}

						if(oldRegola == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						TrasformazioneRegolaRisposta oldRisposta = null;
						for (int j = 0; j < oldRegola.sizeRispostaList(); j++) {
							TrasformazioneRegolaRisposta risposta = oldRegola.getRisposta(j);
							if (risposta.getId().longValue() == idTrasformazioneRisposta) {
								oldRisposta = risposta;
								break;
							}
						}
						
						if(oldRisposta == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						if(oldRisposta.getConversioneTemplate() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione tipo = StringUtils.isNotEmpty(oldRisposta.getConversioneTipo()) ? 
								org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.toEnumConstant(oldRisposta.getConversioneTipo()) : org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.EMPTY;

						switch(tipo) {
						case FREEMARKER_TEMPLATE:
						case CONTEXT_FREEMARKER_TEMPLATE:
						case FREEMARKER_TEMPLATE_ZIP:
						case VELOCITY_TEMPLATE:
						case CONTEXT_VELOCITY_TEMPLATE:
						case VELOCITY_TEMPLATE_ZIP:
						case TEMPLATE:
						case XSLT:
						case ZIP:
						case TGZ:
						case TAR:
							fileName += tipo.getExt();
							break;
						case EMPTY:
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
								
						docBytes = oldRisposta.getConversioneTemplate();
					}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_RISPOSTA_SOAP_ENVELOPE_TEMPLATE.equals(tipoDocumentoDaScaricare)){
						Long idPorta = Long.parseLong(idAccordo);
						PortaDelegata portaDelegata = pdCore.getPortaDelegata(idPorta);
						fileName = ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_RISPOSTA_SOAP_ENVELOPE_TEMPLATE_FILENAME;
						
						String idTrasformazioneRegola = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_REQ_ID);
						long idTrasformazione = Long.parseLong(idTrasformazioneRegola);
						
						String idTrasformazioneRegolaRes = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_PORTA_DELEGATA_CONFIGURAZIONE_TRASFORMAZIONI_RES_ID);
						long idTrasformazioneRisposta = Long.parseLong(idTrasformazioneRegolaRes);

						Trasformazioni trasformazioni = portaDelegata.getTrasformazioni();
						TrasformazioneRegola oldRegola = null;
						for (TrasformazioneRegola reg : trasformazioni.getRegolaList()) {
							if(reg.getId().longValue() == idTrasformazione) {
								oldRegola = reg;
								break;
							}
						}

						if(oldRegola == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						TrasformazioneRegolaRisposta oldRisposta = null;
						for (int j = 0; j < oldRegola.sizeRispostaList(); j++) {
							TrasformazioneRegolaRisposta risposta = oldRegola.getRisposta(j);
							if (risposta.getId().longValue() == idTrasformazioneRisposta) {
								oldRisposta = risposta;
								break;
							}
						}
						
						if(oldRisposta == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						if(oldRisposta.getTrasformazioneSoap() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						TrasformazioneSoapRisposta trasformazioneSoap = oldRisposta.getTrasformazioneSoap();
						
						if( trasformazioneSoap.getEnvelopeBodyConversioneTemplate() == null) {
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}
						
						org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione tipo = StringUtils.isNotEmpty(trasformazioneSoap.getEnvelopeBodyConversioneTipo()) ? 
								org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.toEnumConstant(trasformazioneSoap.getEnvelopeBodyConversioneTipo()) : org.openspcoop2.pdd.core.trasformazioni.TipoTrasformazione.EMPTY;

						switch(tipo) {
						case FREEMARKER_TEMPLATE:
						case CONTEXT_FREEMARKER_TEMPLATE:
						case FREEMARKER_TEMPLATE_ZIP:
						case VELOCITY_TEMPLATE:
						case CONTEXT_VELOCITY_TEMPLATE:
						case VELOCITY_TEMPLATE_ZIP:
						case TEMPLATE:
						case XSLT:
						case ZIP:
						case TGZ:
						case TAR:
							fileName += tipo.getExt();
							break;
						case EMPTY:
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non disponibile per il tipo archivio ["+tipoDocumento+"]: contenuto vuoto o non presente");
						}

						docBytes = trasformazioneSoap.getEnvelopeBodyConversioneTemplate();
					}else {
						throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non gestito per il tipo archivio ["+tipoDocumento+"]");
					}
				}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_SOGGETTO.equals(tipoDocumento)){
					if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_CERTIFICATO_SSL.equals(tipoDocumentoDaScaricare)){
						Long idSogg = Long.parseLong(idAccordo);
						SoggettiCore soggettiCore = new SoggettiCore(archiviCore);

						String oldnomeprov = null;
						String oldtipoprov = null;
						if(soggettiCore.isRegistroServiziLocale()){
							org.openspcoop2.core.registry.Soggetto soggettoRegistry = soggettiCore.getSoggettoRegistro(idSogg); 
							oldnomeprov = soggettoRegistry.getNome();
							oldtipoprov = soggettoRegistry.getTipo();
						}
						else{
							Soggetto soggettoConfig = soggettiCore.getSoggetto(idSogg); 
							oldnomeprov = soggettoConfig.getNome();
							oldtipoprov = soggettoConfig.getTipo();
						}

						IDSoggetto idSoggetto = new IDSoggetto(oldtipoprov,oldnomeprov);
						String protocollo = soggettiCore.getProtocolloAssociatoTipoSoggetto(oldtipoprov);
						IProtocolFactory<?> protocolFactory = ProtocolFactoryManager.getInstance().getProtocolFactoryByName(protocollo);
						IRegistryReader registryReader = soggettiCore.getRegistryReader(protocolFactory);

						int posizioneCredenziale = 0;
						String pos = archiviHelper.getParameter(ConnettoriCostanti.PARAMETRO_CREDENZIALI_AUTENTICAZIONE_CREDENZIALI_ID);
						if(StringUtils.isNotEmpty(pos)) {
							posizioneCredenziale = Integer.valueOf(pos);
						}
						
						CredenzialiSoggetto credenziali = null;
						org.openspcoop2.core.registry.Soggetto soggetto = null;
						try{
							soggetto =  registryReader.getSoggetto(idSoggetto);
							if(soggetto.sizeCredenzialiList()>0) {
								credenziali = soggetto.getCredenziali(posizioneCredenziale);
							}
						}catch(RegistryNotFound r){
							// rilancio
							throw r;
						}
						
						fileName = soggetto.getNome() + ".crt";
						
						if(credenziali != null && credenziali.getTipo() != null && credenziali.getTipo().equals(CredenzialeTipo.SSL)) {
							if(credenziali.getCertificate() != null && credenziali.getCertificate().length > 0) {
								docBytes = credenziali.getCertificate();
							} else {
								throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non definito per il tipo archivio ["+tipoDocumento+"]");
							}
						} else 
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non definito per il tipo archivio ["+tipoDocumento+"]");
					}else{
						throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non gestito per il tipo archivio ["+tipoDocumento+"]");
					}
				}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_SERVIZIO_APPLICATIVO.equals(tipoDocumento)){
					if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_DOCUMENTO_CERTIFICATO_SSL.equals(tipoDocumentoDaScaricare)){
						Long idSA = Long.parseLong(idAccordo);
						ServiziApplicativiCore saCore = new ServiziApplicativiCore(archiviCore);
						ServizioApplicativo sa = saCore.getServizioApplicativo(idSA);
						
						fileName = sa.getNome() + ".crt";
						
						int posizioneCredenziale = 0;
						String pos = archiviHelper.getParameter(ConnettoriCostanti.PARAMETRO_CREDENZIALI_AUTENTICAZIONE_CREDENZIALI_ID);
						if(StringUtils.isNotEmpty(pos)) {
							posizioneCredenziale = Integer.valueOf(pos);
						}
						
						InvocazionePorta ip = sa.getInvocazionePorta();
						Credenziali credenziali = null;
						if (ip != null &&
							ip.sizeCredenzialiList()>0) {
							credenziali = ip.getCredenziali(posizioneCredenziale);
						}
						
						if(credenziali != null && credenziali.getTipo() != null && credenziali.getTipo().equals(org.openspcoop2.core.config.constants.CredenzialeTipo.SSL)) {
							if(credenziali.getCertificate() != null && credenziali.getCertificate().length > 0) {
								docBytes = credenziali.getCertificate();
							} else {
								throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non definito per il tipo archivio ["+tipoDocumento+"]");
							}
						} else 
							throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non definito per il tipo archivio ["+tipoDocumento+"]");
					}else{
						throw new ServletException("Tipo documento ["+tipoDocumentoDaScaricare+"] non gestito per il tipo archivio ["+tipoDocumento+"]");
					}
				}
				else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_CONNETTORE_CERTIFICATO_SERVER.equals(tipoDocumento)){
					
					String aliasForVerificaConnettore = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_CERTIFICATI_SERVER_ALIAS_CONNETTORE);
					
					String tipoConnettoreRegistro = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_CERTIFICATI_SERVER_TIPO_CONNETTORE_REGISTRO);
					boolean connettoreRegistro = ServletUtils.isCheckBoxEnabled(tipoConnettoreRegistro);
					String labelConnettore = connettoreRegistro ? "connettore del registro" : "connettore della configurazione";
					
					String idConnettore = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_CERTIFICATI_SERVER_ID_CONNETTORE);
					
					String tokenTipologia = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_CERTIFICATI_SERVER_TOKEN_TIPOLOGIA);
					String tokenNome= archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_CERTIFICATI_SERVER_TOKEN_NOME);
					String tokenConnettoreTipo = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_CERTIFICATI_SERVER_TOKEN_TIPO);
					
					String nameConnettore = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_CERTIFICATI_SERVER_NOME_CONNETTORE);
					
					fileName = nameConnettore + ".pem";
					
					String risorsa = null;
					if(connettoreRegistro) {
						risorsa = archiviCore.getJmxPdDConfigurazioneSistemaNomeRisorsaAccessoRegistroServizi(aliasForVerificaConnettore);
					}
					else {
						risorsa = archiviCore.getJmxPdDConfigurazioneSistemaNomeRisorsaConfigurazionePdD(aliasForVerificaConnettore);
					}
					
					String metodo = null;
					List<Object> parameters = new ArrayList<>();
					if(idConnettore!=null) {
						metodo = archiviCore.getJmxPdDConfigurazioneSistemaNomeMetodoGetCertificatiConnettoreById(aliasForVerificaConnettore);
						parameters.add(idConnettore+"");
					}
					else if(tokenTipologia!=null) {
						if(ConfigurazioneCostanti.DEFAULT_VALUE_PARAMETRO_CONFIGURAZIONE_GESTORE_POLICY_TOKEN_TIPOLOGIA_GESTIONE_POLICY_TOKEN.equals(tokenTipologia)) {
							metodo = archiviCore.getJmxPdDConfigurazioneSistemaNomeMetodoGetCertificatiConnettoreTokenPolicyValidazione(aliasForVerificaConnettore);
							parameters.add(tokenNome);
							if(tokenConnettoreTipo!=null && StringUtils.isNotEmpty(tokenConnettoreTipo)) {
								parameters.add(tokenConnettoreTipo);
							}
						}
						else if(ConfigurazioneCostanti.DEFAULT_VALUE_PARAMETRO_CONFIGURAZIONE_GESTORE_POLICY_TOKEN_TIPOLOGIA_RETRIEVE_POLICY_TOKEN.equals(tokenTipologia)) {
							metodo = archiviCore.getJmxPdDConfigurazioneSistemaNomeMetodoGetCertificatiConnettoreTokenPolicyNegoziazione(aliasForVerificaConnettore);
							parameters.add(tokenNome);
						}
						else if(ConfigurazioneCostanti.DEFAULT_VALUE_PARAMETRO_CONFIGURAZIONE_GESTORE_POLICY_TOKEN_TIPOLOGIA_ATTRIBUTE_AUTHORITY.equals(tokenTipologia)) {
							metodo = archiviCore.getJmxPdDConfigurazioneSistemaNomeMetodoGetCertificatiConnettoreAttributeAuthority(aliasForVerificaConnettore);
							parameters.add(tokenNome);
						}
						else {
							throw new DriverControlStationException("Tipologia '"+tokenTipologia+"' da utilizzare per l'export dei certificati server non supportata");
						}
					}
					else {
						throw new DriverControlStationException("Nessuna risorsa definita da cui effettuare l'export dei certificati server");
					}
					
					try{
						String stato = archiviCore.getInvoker().invokeJMXMethod(aliasForVerificaConnettore, archiviCore.getJmxPdDConfigurazioneSistemaType(aliasForVerificaConnettore),
								risorsa, 
								metodo, 
								parameters.toArray());
						if(stato==null) {
							throw new ServletException("Recupero certificati server fallito");
						}
						if(stato==null || stato.startsWith(JMXUtils.MSG_OPERAZIONE_NON_EFFETTUATA)) {
							throw new ServletException(stato);
						}
						else {
							docBytes = stato.getBytes();
						}
					}catch(Exception e){
						String msgErrore = "Errore durante il recupero dei certificati server del "+labelConnettore+" con parametri '"+parameters+"' (jmxResource '"+risorsa+"') (node:"+aliasForVerificaConnettore+"): "+e.getMessage();
						ControlStationCore.logError(msgErrore, e);
						/**throw new ServletException(msgErrore);*/
						// se lancio una eccezione ho il crash dell'interfaccia. Ritorno anzi un file errato.
						fileName+=".error";
						docBytes = msgErrore.getBytes();
					}
				}
				else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_ARCHIVIO_JAR.equals(tipoDocumento)){
					
					String nomePlugin = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_JAR_NOME_PLUGIN);
					String nomeJar = archiviHelper.getParameter(ArchiviCostanti.PARAMETRO_ARCHIVI_JAR_NOME_ARCHVIO);
					
					fileName = nomeJar;
					
					ConfigurazioneCore confCore = new ConfigurazioneCore(archiviCore);
					try{
						RegistroPluginArchivio jar = confCore.getRegistroPluginArchivio(nomePlugin, nomeJar);
						docBytes = jar.getContenuto();
					}catch(Exception e){
						String msgErrore = "Errore durante il recupero dell'archivio jar '"+nomeJar+"' del plugin "+nomePlugin+": "+e.getMessage();
						ControlStationCore.logError(msgErrore, e);
						/**throw new ServletException(msgErrore);*/
						// se lancio una eccezione ho il crash dell'interfaccia. Ritorno anzi un file errato.
						fileName+=".error";
						docBytes = msgErrore.getBytes();
					}
				}else if(ArchiviCostanti.PARAMETRO_VALORE_ARCHIVI_ALLEGATO_TIPO_REMOTE_STORE_ENTRY.equals(tipoDocumento)){
					RemoteStoresCore remoteStoresCore = new RemoteStoresCore(archiviCore);
					
					RemoteStoreKeyEntry remoteStoreKeyEntry = remoteStoresCore.getRemoteStoreKeyEntry(idAccordoLong);
					fileName = remoteStoreKeyEntry.getKid() + ".jwk";
					docBytes = remoteStoreKeyEntry.getContentKey();
				}
				else{
					throw new ServletException("Tipo archivio ["+tipoDocumento+"] non gestito (tipo documento: "+tipoDocumentoDaScaricare+")");
				}

			} 

			// Setto Proprietà Export File
			HttpUtilities.setOutputFile(response, true, fileName);

			if(docBytes!=null) {
				OutputStream out = response.getOutputStream();	
				out.write(docBytes);
				out.flush();
				out.close();
			}

		} catch (Exception e) {
			ControlStationCore.logError("Errore durante il download dei documenti "+e.getMessage(), e);
		} 
	}

	private long getIdAccordoLong(String idAccordo){
		long idAccordoLong = 0;
		try{ idAccordoLong = Long.valueOf(idAccordo); }catch(Exception e){ idAccordoLong = 0 ; }
		return idAccordoLong;
	}

	private byte[] serializeWsdl(Logger log,XSDSchemaCollection schemaCollection, AccordoServizioParteComune asConAllegati) throws XMLException{
		try{
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			serializeWsdl(log,bout,schemaCollection,asConAllegati);
			bout.flush();
			bout.close();
			return bout.toByteArray();
		}catch(Exception e){
			throw new XMLException(e.getMessage(),e);
		}
	}
	private void serializeWsdl(Logger log,OutputStream out,XSDSchemaCollection schemaCollection, AccordoServizioParteComune asConAllegati) throws XMLException{

		ZipOutputStream zipOut = null;
		try{
			zipOut = new ZipOutputStream(out);

			schemaCollection.zipSerialize(log, zipOut);

			String rootPackageDir = "wsdl"+File.separatorChar;

			if(asConAllegati.getByteWsdlLogicoErogatore()!=null){
				String nomeFile = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_LOGICO_EROGATORE_WSDL;
				this.writeWsdl(log, rootPackageDir+nomeFile, zipOut, true, asConAllegati);
			}

			if(asConAllegati.getByteWsdlLogicoFruitore()!=null){
				String nomeFile = Costanti.OPENSPCOOP2_ARCHIVE_ACCORDI_FILE_WSDL_LOGICO_FRUITORE_WSDL;
				this.writeWsdl(log, rootPackageDir+nomeFile, zipOut, false, asConAllegati);
			}

			zipOut.flush();

		}catch(Exception e){
			throw new XMLException(e.getMessage(),e);
		}finally{
			try{
				if(zipOut!=null)
					zipOut.close();
			}catch(Exception eClose){
				// close
			}
		}
	}
	private void writeWsdl(Logger log,String nomeFile, ZipOutputStream zipOut, boolean erogatore, AccordoServizioParteComune asConAllegati) throws IOException{
		try{
			AccordoServizioWrapperUtilities wsdlWrapperUtilities = new AccordoServizioWrapperUtilities(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), log);
			wsdlWrapperUtilities.setAccordoServizio(new AccordoServizioWrapper());
			wsdlWrapperUtilities.getAccordoServizioWrapper().setAccordoServizio((AccordoServizioParteComune)asConAllegati.clone());
			WSDLUtilities wsdlUtilities = new WSDLUtilities(MessageXMLUtils.DEFAULT);
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			javax.wsdl.Definition wsdl = null;
			if(erogatore){
				wsdl = wsdlWrapperUtilities.buildWsdlErogatoreFromBytes();
			}
			else{
				wsdl = wsdlWrapperUtilities.buildWsdlFruitoreFromBytes();
			}
			wsdlUtilities.writeWsdlTo(wsdl, bout);
			bout.flush();
			bout.close();

			zipOut.putNextEntry(new ZipEntry(nomeFile));
			zipOut.write(bout.toByteArray());
		}catch(Exception e){
			String tipo = "Erogatore";
			if(!erogatore){
				tipo = "Fruitore";
			}
			log.error("Costruzione WSDL "+tipo+" fallita: "+e.getMessage(),e);
			nomeFile = nomeFile + ".buildFailed.txt";
			zipOut.putNextEntry(new ZipEntry(nomeFile));
			String msg = e.getMessage();
			if(msg==null || msg.equals("")){
				if(e instanceof NullPointerException){
					msg = "Internal Error (NP)";
				}
				else{
					msg = e.toString();
					if(msg==null || msg.equals("")){
						msg = "Internal Error";
					}
				}
			}
			zipOut.write(msg.getBytes());
		}
	}

}