GestoreTrasformazioniUtilities.java

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



  20. package org.openspcoop2.pdd.core.trasformazioni;

  21. import java.io.ByteArrayOutputStream;
  22. import java.util.ArrayList;
  23. import java.util.HashMap;
  24. import java.util.Iterator;
  25. import java.util.List;
  26. import java.util.Map;

  27. import javax.activation.DataHandler;
  28. import javax.xml.soap.AttachmentPart;
  29. import javax.xml.soap.SOAPElement;
  30. import javax.xml.transform.dom.DOMSource;

  31. import org.apache.commons.lang.StringUtils;
  32. import org.openspcoop2.core.config.TrasformazioneRegolaApplicabilitaServizioApplicativo;
  33. import org.openspcoop2.core.config.TrasformazioneRegolaApplicabilitaSoggetto;
  34. import org.openspcoop2.core.config.TrasformazioneRegolaParametro;
  35. import org.openspcoop2.core.config.TrasformazioneRegolaRichiesta;
  36. import org.openspcoop2.core.config.TrasformazioneRegolaRisposta;
  37. import org.openspcoop2.core.config.constants.TrasformazioneIdentificazioneRisorsaFallita;
  38. import org.openspcoop2.core.config.constants.TrasformazioneRegolaParametroTipoAzione;
  39. import org.openspcoop2.core.config.constants.VersioneSOAP;
  40. import org.openspcoop2.core.id.IDSoggetto;
  41. import org.openspcoop2.message.OpenSPCoop2Message;
  42. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  43. import org.openspcoop2.message.OpenSPCoop2MessageParseResult;
  44. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  45. import org.openspcoop2.message.constants.MessageRole;
  46. import org.openspcoop2.message.constants.MessageType;
  47. import org.openspcoop2.message.constants.ServiceBinding;
  48. import org.openspcoop2.message.xml.MessageXMLUtils;
  49. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  50. import org.openspcoop2.pdd.core.PdDContext;
  51. import org.openspcoop2.pdd.core.dynamic.DynamicException;
  52. import org.openspcoop2.pdd.core.dynamic.DynamicUtils;
  53. import org.openspcoop2.pdd.core.dynamic.MessageContent;
  54. import org.openspcoop2.pdd.core.dynamic.Template;
  55. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  56. import org.openspcoop2.utils.dch.InputStreamDataSource;
  57. import org.openspcoop2.utils.dch.MailcapActivationReader;
  58. import org.openspcoop2.utils.io.ArchiveType;
  59. import org.openspcoop2.utils.io.CompressorUtilities;
  60. import org.openspcoop2.utils.io.Entry;
  61. import org.openspcoop2.utils.mime.MimeTypes;
  62. import org.openspcoop2.utils.resources.Charset;
  63. import org.openspcoop2.utils.transport.TransportRequestContext;
  64. import org.openspcoop2.utils.transport.TransportResponseContext;
  65. import org.openspcoop2.utils.transport.TransportUtils;
  66. import org.openspcoop2.utils.transport.http.ContentTypeUtilities;
  67. import org.openspcoop2.utils.transport.http.HttpConstants;
  68. import org.slf4j.Logger;
  69. import org.w3c.dom.Element;

  70. /**
  71.  * Gestione delle trasformazioni
  72.  *
  73.  * @author Andrea Poli (apoli@link.it)
  74.  * @author $Author$
  75.  * @version $Rev$, $Date$
  76.  */

  77. public class GestoreTrasformazioniUtilities {

  78.    
  79.     public static boolean isMatchServizioApplicativo(IDSoggetto soggettoFruitore, String sa, List<TrasformazioneRegolaApplicabilitaServizioApplicativo> saCheckList) throws Exception {
  80.        
  81.         if(saCheckList==null || saCheckList.size()<=0) {
  82.             return true;
  83.         }
  84.        
  85.         if(soggettoFruitore==null || soggettoFruitore.getTipo()==null || soggettoFruitore.getNome()==null || sa==null) {
  86.             //return true;
  87.             return false; // se ho indicato una compatibilita attraverso una lista, e non ho l'informazione sul mittente non deve avere un match.
  88.         }
  89.        
  90.         for (TrasformazioneRegolaApplicabilitaServizioApplicativo saCheck : saCheckList) {
  91.             if(soggettoFruitore.getTipo().equals(saCheck.getTipoSoggettoProprietario()) &&
  92.                     soggettoFruitore.getNome().equals(saCheck.getNomeSoggettoProprietario()) &&
  93.                     sa.equals(saCheck.getNome()) ) {
  94.                 return true;
  95.             }          
  96.         }
  97.        
  98.         return false;
  99.        
  100.     }
  101.    
  102.     public static boolean isMatchSoggetto(IDSoggetto soggettoFruitore, List<TrasformazioneRegolaApplicabilitaSoggetto> soggettoCheckList) throws Exception {
  103.        
  104.         if(soggettoCheckList==null || soggettoCheckList.size()<=0) {
  105.             return true;
  106.         }
  107.        
  108.         if(soggettoFruitore==null || soggettoFruitore.getTipo()==null || soggettoFruitore.getNome()==null) {
  109.             //return true;
  110.             return false; // se ho indicato una compatibilita attraverso una lista, e non ho l'informazione sul mittente non deve avere un match.
  111.         }
  112.        
  113.         for (TrasformazioneRegolaApplicabilitaSoggetto soggettoCheck : soggettoCheckList) {
  114.             if(soggettoFruitore.getTipo().equals(soggettoCheck.getTipo()) &&
  115.                     soggettoFruitore.getNome().equals(soggettoCheck.getNome()) ) {
  116.                 return true;
  117.             }          
  118.         }
  119.        
  120.         return false;
  121.        
  122.     }
  123.    
  124.     public static final String TRASFORMAZIONE_HEADER_HTTP_RICHIESTA = "RequestHeader";
  125.     public static final String TRASFORMAZIONE_QUERY_PARAMETER = "QueryParameter";
  126.     public static final String TRASFORMAZIONE_HEADER_HTTP_RISPOSTA = "ResponseHeader";
  127.    
  128.     public static final String TRASFORMAZIONE_SET_COOKIE = "${headerResponse:Set-Cookie}";

  129.    
  130.     public static void trasformazione(Logger log, List<TrasformazioneRegolaParametro> list, Map<String, List<String>> properties, Map<String, List<String>> forceAddProperties, String oggetto,
  131.             Map<String, Object> dynamicMap, PdDContext pddContext) throws Exception {
  132.         if(list!=null && list.size()>0) {
  133.             for (TrasformazioneRegolaParametro parametro : list) {
  134.                 TrasformazioneRegolaParametroTipoAzione tipo = parametro.getConversioneTipo();
  135.                 String nome = parametro.getNome();
  136.                 String valore = parametro.getValore();
  137.                 log.debug("Trasformazione ["+oggetto+"] parametro '"+nome+"', tipo operazione '"+tipo+"' ...");
  138.                 if(nome==null) {
  139.                     throw new Exception("["+oggetto+"] Nome non indicato");
  140.                 }
  141.                 nome = nome.trim();
  142.                 if(tipo==null) {
  143.                     throw new Exception("["+oggetto+"] Tipo di operazione da effettuare non indicata per '"+nome+"'");
  144.                 }
  145.                
  146.                 boolean casoSpecialeForwardSetCookie = false;
  147.                 if(valore!=null &&
  148.                         TRASFORMAZIONE_HEADER_HTTP_RISPOSTA.equals(oggetto) &&
  149.                         TrasformazioneRegolaParametroTipoAzione.UPDATE.equals(tipo) &&
  150.                         HttpConstants.SET_COOKIE.toLowerCase().equals(nome.toLowerCase()) &&
  151.                         TRASFORMAZIONE_SET_COOKIE.toLowerCase().equals(valore.trim().toLowerCase())) {
  152.                     casoSpecialeForwardSetCookie = true;
  153.                 }
  154.                
  155.                 if(valore!=null) {
  156.                     try {
  157.                         valore = DynamicUtils.convertDynamicPropertyValue(oggetto+"-"+nome, valore, dynamicMap, pddContext);
  158.                     }catch(Exception e) {
  159.                         String msgErrore = "["+oggetto+"] Conversione valore per '"+nome+"' non riuscita (valore: "+valore+"): "+e.getMessage();
  160.                         if(parametro.getIdentificazioneFallita()!=null && TrasformazioneIdentificazioneRisorsaFallita.IGNORA.equals(parametro.getIdentificazioneFallita())) {
  161.                             log.debug(msgErrore,e);
  162.                             continue;
  163.                         }
  164.                         else {
  165.                             throw new Exception(msgErrore,e);
  166.                         }
  167.                     }
  168.                 }
  169.                
  170.                 switch (tipo) {
  171.                 case ADD:
  172.                     if(valore==null) {
  173.                         throw new Exception("["+oggetto+"] Valore per '"+nome+"' non indicato");
  174.                     }
  175.                     List<String> vOld = null;
  176.                     if(properties!=null) {
  177.                         vOld = TransportUtils.removeRawObject(properties, nome);
  178.                         if(vOld!=null && !vOld.isEmpty()) {
  179.                             throw new Exception("["+oggetto+"] '"+nome+"' giĆ  esistente; utilizzare direttiva 'updateOrAdd' per aggiornarlo");
  180.                         }
  181.                     }
  182.                     if(properties!=null) {
  183.                         TransportUtils.put(properties, nome, valore, true);
  184.                     }
  185.                     TransportUtils.put(forceAddProperties, nome, valore, true);
  186.                     break;
  187.                 case UPDATE_OR_ADD:
  188.                     if(valore==null) {
  189.                         throw new Exception("["+oggetto+"] Valore per '"+nome+"' non indicato");
  190.                     }
  191.                     if(properties!=null) {
  192.                         TransportUtils.removeRawObject(properties, nome);
  193.                         TransportUtils.put(properties, nome, valore, true);
  194.                     }
  195.                     TransportUtils.put(forceAddProperties, nome, valore, true);
  196.                     break;
  197.                 case UPDATE:
  198.                     List<String> v = null;
  199.                     if(properties!=null) {
  200.                         v = TransportUtils.removeRawObject(properties, nome);
  201.                         if(v!=null && !v.isEmpty()) {
  202.                             if(casoSpecialeForwardSetCookie) {
  203.                                 properties.put(nome, v);
  204.                                 forceAddProperties.put(nome, v);
  205.                             }
  206.                             else {
  207.                                 if(valore==null) {
  208.                                     throw new Exception("["+oggetto+"] Valore del parametro '"+nome+"' non indicato");
  209.                                 }
  210.                                 TransportUtils.put(properties, nome, valore, false);
  211.                                 TransportUtils.put(forceAddProperties, nome, valore, false);
  212.                             }
  213.                         }
  214.                     }
  215.                     break;
  216.                 case DELETE:
  217.                     if(properties!=null) {
  218.                         TransportUtils.removeRawObject(properties, nome);
  219.                     }
  220.                     break;
  221.                 default:
  222.                     break;
  223.                 }
  224.             }
  225.         }
  226.     }
  227.    
  228.     private static String readCharset(Logger log, OpenSPCoop2Message msg, String forceContentType) throws Exception {
  229.         String contentType = forceContentType;
  230.         if(contentType==null || StringUtils.isEmpty(contentType)) {
  231.             if(msg!=null) {
  232.                 contentType = msg.getContentType();
  233.             }
  234.         }
  235.         String charset = null;
  236.         if(contentType!=null) {
  237.             try {
  238.                 boolean multipart = ContentTypeUtilities.isMultipartType(contentType);
  239.                 if(!multipart) {
  240.                     charset = ContentTypeUtilities.readCharsetFromContentType(contentType);
  241.                 }
  242.                 else {
  243.                     String internalCT = ContentTypeUtilities.getInternalMultipartContentType(contentType);
  244.                     charset = ContentTypeUtilities.readCharsetFromContentType(internalCT);
  245.                 }
  246.             }catch(Throwable t) {
  247.                 log.error("Lettura charset non riuscita: "+t.getMessage(),t);
  248.             }
  249.         }
  250.         return charset;
  251.     }
  252.    
  253.     public static RisultatoTrasformazioneContenuto trasformazioneContenuto(Logger log, String tipoConversioneContenuto,
  254.             Template template, String oggetto, Map<String, Object> dynamicMap, OpenSPCoop2Message msg, MessageContent messageContent, PdDContext pddContext,
  255.             String forceContentType, boolean readCharset) throws Exception {
  256.         TipoTrasformazione tipoTrasformazione = null;
  257.         if(tipoConversioneContenuto!=null) {
  258.             tipoTrasformazione = TipoTrasformazione.toEnumConstant(tipoConversioneContenuto, true);
  259.         }
  260.         else {
  261.             throw new Exception("Tipo di conversione contenuto non indicato");
  262.         }
  263.        
  264.         log.debug("Trasformazione "+oggetto+" ["+tipoConversioneContenuto+"] ...");
  265.        
  266.        
  267.         String charset = null;
  268.         if(readCharset) {
  269.             charset = readCharset(log, msg, forceContentType);
  270.             if(charset==null) {
  271.                 charset = Charset.UTF_8.getValue();
  272.             }
  273.         }
  274.        
  275.         RisultatoTrasformazioneContenuto risultato = new RisultatoTrasformazioneContenuto();
  276.         risultato.setTipoTrasformazione(tipoTrasformazione);
  277.        
  278.         // conversione formato

  279.         switch (tipoTrasformazione) {

  280.         case EMPTY:
  281.             log.debug("trasformazione "+oggetto+" del contenuto empty");
  282.             risultato.setEmpty(true);
  283.             break;
  284.            
  285.         case TEMPLATE:
  286.             if(template==null || template.getTemplate()==null) {
  287.                 throw new Exception("Template "+oggetto+" non definito");
  288.             }
  289.                        
  290.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], lettura template ...");
  291.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  292.             bout.write(template.getTemplate());
  293.             bout.flush();
  294.             bout.close();
  295.            
  296.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template ...");
  297.             String newContent = DynamicUtils.convertDynamicPropertyValue("template", bout.toString(), dynamicMap, pddContext);
  298.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template completata");
  299.             if(newContent==null || "".equals(newContent)) {
  300.                 risultato.setEmpty(true);
  301.             }
  302.             else {
  303.                 risultato.setContenuto(newContent.getBytes(), newContent);
  304.             }
  305.            
  306.             break;
  307.            
  308.         case FREEMARKER_TEMPLATE:
  309.         case CONTEXT_FREEMARKER_TEMPLATE:
  310.         case FREEMARKER_TEMPLATE_ZIP:
  311.             if(template==null || template.getTemplate()==null) {
  312.                 throw new Exception("Template "+oggetto+" non definito");
  313.             }
  314.                        
  315.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template ...");
  316.             bout = new ByteArrayOutputStream();
  317.             if(TipoTrasformazione.FREEMARKER_TEMPLATE.equals(tipoTrasformazione) || TipoTrasformazione.CONTEXT_FREEMARKER_TEMPLATE.equals(tipoTrasformazione)) {
  318.                 DynamicUtils.convertFreeMarkerTemplate(template, dynamicMap, bout, charset);
  319.             }
  320.             else {
  321.                 DynamicUtils.convertZipFreeMarkerTemplate(template.getZipTemplate(), dynamicMap, bout, charset);
  322.             }
  323.             bout.flush();
  324.             bout.close();
  325.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template completata");
  326.             if(bout==null || bout.size()<=0) {
  327.                 risultato.setEmpty(true);
  328.             }
  329.             else {
  330.                 risultato.setContenuto(bout.toByteArray(),
  331.                         charset!=null ? bout.toString(charset) : bout.toString());
  332.             }
  333.            
  334.             break;
  335.            
  336.         case VELOCITY_TEMPLATE:
  337.         case CONTEXT_VELOCITY_TEMPLATE:
  338.         case VELOCITY_TEMPLATE_ZIP:
  339.             if(template==null || template.getTemplate()==null) {
  340.                 throw new Exception("Template "+oggetto+" non definito");
  341.             }
  342.                        
  343.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template ...");
  344.             bout = new ByteArrayOutputStream();
  345.             if(TipoTrasformazione.VELOCITY_TEMPLATE.equals(tipoTrasformazione) || TipoTrasformazione.CONTEXT_VELOCITY_TEMPLATE.equals(tipoTrasformazione)) {
  346.                 DynamicUtils.convertVelocityTemplate(template, dynamicMap, bout, charset);
  347.             }
  348.             else {
  349.                 DynamicUtils.convertZipVelocityTemplate(template.getZipTemplate(), dynamicMap, bout, charset);  
  350.             }
  351.             bout.flush();
  352.             bout.close();
  353.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template completata");
  354.             if(bout==null || bout.size()<=0) {
  355.                 risultato.setEmpty(true);
  356.             }
  357.             else {
  358.                 risultato.setContenuto(bout.toByteArray(),
  359.                         charset!=null ? bout.toString(charset) : bout.toString());
  360.             }
  361.            
  362.             break;
  363.            
  364.         case XSLT:
  365.             if(template==null || template.getTemplate()==null) {
  366.                 throw new Exception("Template "+oggetto+" non definito");
  367.             }
  368.             Element element = null;
  369.             if(messageContent!=null && messageContent.isXml()) {
  370.                 element = messageContent.getElement();
  371.             }
  372.             if(element==null) {
  373.                 if(MessageType.XML.equals(msg.getMessageType()) ||
  374.                         MessageType.SOAP_11.equals(msg.getMessageType()) ||
  375.                         MessageType.SOAP_12.equals(msg.getMessageType())) {
  376.                     throw new Exception("Messaggio da convertire non presente");
  377.                 }
  378.                 else {
  379.                     throw new Exception("Template '"+tipoTrasformazione.getLabel()+"' non utilizzabile con messaggio di tipo '"+msg.getMessageType()+"'");
  380.                 }
  381.             }
  382.                        
  383.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template ...");
  384.             bout = new ByteArrayOutputStream();
  385.             DynamicUtils.convertXSLTTemplate("template", template.getTemplate(), element, bout);
  386.             bout.flush();
  387.             bout.close();
  388.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template completata");
  389.             if(bout==null || bout.size()<=0) {
  390.                 risultato.setEmpty(true);
  391.             }
  392.             else {
  393.                 risultato.setContenuto(bout.toByteArray(), bout.toString());
  394.             }
  395.            
  396.             break;
  397.            
  398.            
  399.         case ZIP:
  400.         case TGZ:
  401.         case TAR:
  402.             if(template==null || template.getTemplate()==null) {
  403.                 throw new Exception("Template "+oggetto+" non definito");
  404.             }
  405.        
  406.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template ...");
  407.             bout = new ByteArrayOutputStream();
  408.             ArchiveType archiveType = ArchiveType.valueOf(tipoTrasformazione.name());
  409.             DynamicUtils.convertCompressorTemplate("template", template.getTemplate(), dynamicMap, pddContext, archiveType, bout);
  410.             bout.flush();
  411.             bout.close();
  412.             log.debug("trasformazione "+oggetto+" ["+tipoTrasformazione+"], risoluzione template completata");
  413.             if(bout==null || bout.size()<=0) {
  414.                 risultato.setEmpty(true);
  415.             }
  416.             else {
  417.                 risultato.setContenuto(bout.toByteArray(), bout.toString());
  418.             }
  419.            
  420.             break;

  421.         default:
  422.             break;
  423.         }
  424.         return risultato;
  425.     }
  426.    
  427.    
  428.     public static OpenSPCoop2Message trasformaMessaggio(Logger log, OpenSPCoop2Message message, MessageContent messageContent,
  429.             RequestInfo requestInfo, Map<String, Object> dynamicMap, PdDContext pddContext, OpenSPCoop2Properties op2Properties,
  430.             Map<String, List<String>> trasporto, Map<String, List<String>> forceAddTrasporto,
  431.             Map<String, List<String>> url, Map<String, List<String>> forceAddUrl,
  432.             int status,
  433.             String contentTypeInput, String returnCodeInput, // nota: contentTypeInput e returnCodeInput e' giĆ  convertito nei template prima della chiamata del metodo
  434.             RisultatoTrasformazioneContenuto risultato,
  435.             boolean trasformazioneRest,
  436.             String trasformazioneRest_method, String trasformazioneRest_path,
  437.             boolean trasformazioneSoap,
  438.             VersioneSOAP trasformazioneSoap_versione, String trasformazioneSoap_soapAction,
  439.             boolean trasformazioneSoap_envelope, boolean trasformazioneSoap_envelopeAsAttachment,
  440.             String trasformazioneSoap_tipoConversione, Template trasformazioneSoap_templateConversione) throws Throwable {
  441.        
  442.         try {
  443.        
  444.             OpenSPCoop2MessageFactory messageFactory = message.getFactory();
  445.            
  446.             // TransportRequest
  447.             String forceResponseStatus = null;
  448.             TransportRequestContext transportRequestContext = null;
  449.             TransportResponseContext transportResponseContext = null;
  450.             if(MessageRole.REQUEST.equals(message.getMessageRole())) {
  451.                 transportRequestContext = new TransportRequestContext(log);
  452.                 transportRequestContext.setHeaders(trasporto);
  453.                 transportRequestContext.setParameters(url);
  454.             }
  455.             else {
  456.                 transportResponseContext = new TransportResponseContext(log);
  457.                 transportResponseContext.setHeaders(trasporto);
  458.                 if(returnCodeInput!=null && StringUtils.isNotEmpty(returnCodeInput)) {
  459.                     // nota: returnCodeInput e' giĆ  convertito nei template prima della chiamata del metodo
  460.                     transportResponseContext.setCodiceTrasporto(returnCodeInput);
  461.                     forceResponseStatus = returnCodeInput;
  462.                 }
  463.                 else {
  464.                     transportResponseContext.setCodiceTrasporto(status+"");
  465.                     forceResponseStatus = status+"";
  466.                 }
  467.             }
  468.            
  469.             log.debug("trasformazione conversione messaggio ...");
  470.             boolean skipTransportInfo = true;
  471.                    
  472.             if(ServiceBinding.SOAP.equals(message.getServiceBinding())){
  473.                
  474.                 if(trasformazioneRest) {
  475.                
  476.                     String contentType = contentTypeInput;
  477.                     if(risultato.isEmpty()) {
  478.                         contentType = null;
  479.                         // aggiorno contentType
  480.                         if(transportRequestContext!=null) {
  481.                             transportRequestContext.removeHeader(HttpConstants.CONTENT_TYPE);
  482.                         }
  483.                         else {
  484.                             transportResponseContext.removeHeader(HttpConstants.CONTENT_TYPE);
  485.                         }
  486.                     }
  487.                     else {
  488.                         if(contentType==null) {
  489.                             throw new Exception("Content-Type non indicato per la trasformazione REST");
  490.                         }
  491.                     }
  492.                    
  493.                     MessageType messageType = null;
  494.                     if(transportRequestContext!=null) {
  495.                         transportRequestContext.setRequestType(trasformazioneRest_method);
  496.                         String trasformazioneRest_path_real = null;
  497.                         if(trasformazioneRest_path!=null) {
  498.                             trasformazioneRest_path_real = DynamicUtils.convertDynamicPropertyValue("trasformazioneRest_path", trasformazioneRest_path, dynamicMap, pddContext);
  499.                         }
  500.                         transportRequestContext.setFunctionParameters(trasformazioneRest_path_real);
  501.                         messageType = requestInfo.getBindingConfig().getRequestMessageType(ServiceBinding.REST, transportRequestContext, contentType);
  502.                     }
  503.                     else {
  504.                         messageType = requestInfo.getBindingConfig().getResponseMessageType(ServiceBinding.REST, new TransportRequestContext(log), contentType, status);
  505.                     }
  506.                     if(risultato.getTipoTrasformazione().isBinaryMessage()) {
  507.                         messageType = MessageType.BINARY;
  508.                     }
  509.                    
  510.                     OpenSPCoop2Message newMsg = null;
  511.                     OpenSPCoop2MessageParseResult pr = null;
  512.                     if(risultato.isEmpty()) {
  513.                         if(transportRequestContext!=null) {
  514.                             newMsg = messageFactory.createEmptyMessage(messageType, MessageRole.REQUEST);
  515.                             newMsg.setTransportRequestContext(transportRequestContext);
  516.                         }
  517.                         else {
  518.                             newMsg = messageFactory.createEmptyMessage(messageType, MessageRole.RESPONSE);
  519.                             newMsg.setTransportResponseContext(transportResponseContext);
  520.                         }
  521.                     }
  522.                     else {
  523.                         if(transportRequestContext!=null) {
  524.                             pr = messageFactory.createMessage(messageType, transportRequestContext, risultato.getContenuto());
  525.                         }
  526.                         else {
  527.                             pr = messageFactory.createMessage(messageType, transportResponseContext, risultato.getContenuto());
  528.                         }
  529.                         newMsg = pr.getMessage_throwParseThrowable();
  530.                     }
  531.                    
  532.                     message.copyResourcesTo(newMsg, skipTransportInfo);
  533.                    
  534.                     addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, newMsg);
  535.                     return newMsg;
  536.                    
  537.                 }
  538.                 else {
  539.                    
  540.                     if(risultato.getTipoTrasformazione().isBinaryMessage()) {
  541.                        
  542.                         // converto
  543.                         OpenSPCoop2MessageParseResult pr = null;
  544.                         if(transportRequestContext!=null) {
  545.                             pr = messageFactory.createMessage(MessageType.BINARY, transportRequestContext, risultato.getContenuto());
  546.                         }
  547.                         else {
  548.                             pr = messageFactory.createMessage(MessageType.BINARY, transportResponseContext, risultato.getContenuto());
  549.                         }
  550.                         OpenSPCoop2Message newMsg = pr.getMessage_throwParseThrowable();
  551.                         message.copyResourcesTo(newMsg, skipTransportInfo);
  552.                         addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, message);
  553.                         return newMsg;
  554.                        
  555.                     }
  556.                     else {
  557.                    
  558.                         OpenSPCoop2SoapMessage soapMessage = message.castAsSoap();
  559.                        
  560.                         if(risultato.isEmpty()) {
  561.                             soapMessage.getSOAPPart().getEnvelope().getBody().removeContents();
  562.                         }
  563.                         else {
  564.                             boolean rebuildWithAttachments = false;
  565.                             if(contentTypeInput!=null) {
  566.                                 rebuildWithAttachments = ContentTypeUtilities.isMultipartRelated(contentTypeInput);
  567.                             }
  568.                            
  569.                             boolean changeSoapVersion = false;
  570.                             MessageType messageType_changeSoapVersion = null;
  571.                             if(contentTypeInput!=null) {
  572.                                 if(transportRequestContext!=null) {
  573.                                     messageType_changeSoapVersion = requestInfo.getBindingConfig().getRequestMessageType(ServiceBinding.SOAP, transportRequestContext, contentTypeInput);
  574.                                 }
  575.                                 else {
  576.                                     messageType_changeSoapVersion = requestInfo.getBindingConfig().getResponseMessageType(ServiceBinding.REST, new TransportRequestContext(log), contentTypeInput, status);
  577.                                 }
  578.                                 if(messageType_changeSoapVersion!=null && !messageType_changeSoapVersion.equals(soapMessage.getMessageType())) {
  579.                                     changeSoapVersion=true;
  580.                                 }
  581.                             }
  582.                            
  583.                             if(rebuildWithAttachments) {
  584.                                 OpenSPCoop2MessageParseResult pr = null;
  585.                                 if(transportRequestContext!=null) {
  586.                                     pr = messageFactory.createMessage(changeSoapVersion ? messageType_changeSoapVersion: message.getMessageType(), transportRequestContext, risultato.getContenuto());
  587.                                 }
  588.                                 else {
  589.                                     pr = messageFactory.createMessage(changeSoapVersion ? messageType_changeSoapVersion: message.getMessageType(), transportResponseContext, risultato.getContenuto());
  590.                                 }
  591.                                 OpenSPCoop2Message newMsg = pr.getMessage_throwParseThrowable();
  592.                                 message.copyResourcesTo(newMsg, skipTransportInfo);
  593.                                 addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, message);
  594.                                 return newMsg;
  595.                             }
  596.                             else {
  597.                                 if(changeSoapVersion) {
  598.                                     OpenSPCoop2MessageParseResult pr = null;
  599.                                     if(transportRequestContext!=null) {
  600.                                         pr = messageFactory.createMessage(messageType_changeSoapVersion, transportRequestContext, risultato.getContenuto());
  601.                                     }
  602.                                     else {
  603.                                         pr = messageFactory.createMessage(messageType_changeSoapVersion, transportResponseContext, risultato.getContenuto());
  604.                                     }
  605.                                     OpenSPCoop2Message newMsg = pr.getMessage_throwParseThrowable();
  606.                                     message.copyResourcesTo(newMsg, skipTransportInfo);
  607.                                     addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, message);
  608.                                     return newMsg;
  609.                                 }
  610.                                 else {
  611.                                     SOAPElement newElement = soapMessage.createSOAPElement(risultato.getContenuto());
  612.                                     Element element = null;
  613.                                     if(messageContent!=null && messageContent.isXml()) {
  614.                                         element = messageContent.getElement();
  615.                                     }
  616.                                     if(element!=null && element.getLocalName().equals(newElement.getLocalName()) && element.getNamespaceURI().equals(newElement.getNamespaceURI())) {
  617.                                         // il nuovo elemento ĆØ una busta soap
  618.                                         soapMessage.getSOAPPart().getEnvelope().detachNode();
  619.                                         soapMessage.getSOAPPart().setContent(new DOMSource(newElement));
  620.                                     }
  621.                                     else {
  622.                                         soapMessage.getSOAPPart().getEnvelope().getBody().removeContents();
  623.                                         soapMessage.getSOAPPart().getEnvelope().getBody().addChildElement(newElement);
  624.                                     }
  625.                                 }
  626.                             }
  627.                         }
  628.                        
  629.                         addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, message);
  630.                        
  631.                         if(contentTypeInput!=null) {
  632.                             message.setContentType(contentTypeInput);
  633.                         }
  634.                        
  635.                         return message;
  636.                     }
  637.                    
  638.                 }
  639.                
  640.             }
  641.             else{
  642.                
  643.                 if(trasformazioneSoap) {
  644.                    
  645.                     MessageType messageType = null;
  646.                     String contentTypeForEnvelope = null;
  647.                     if(VersioneSOAP._1_1.equals(trasformazioneSoap_versione)){
  648.                         messageType = MessageType.SOAP_11;
  649.                         if(contentTypeForEnvelope == null) {
  650.                             contentTypeForEnvelope = HttpConstants.CONTENT_TYPE_SOAP_1_1;
  651.                         }
  652.                     }
  653.                     else if(VersioneSOAP._1_2.equals(trasformazioneSoap_versione)){
  654.                         messageType = MessageType.SOAP_12;
  655.                         if(contentTypeForEnvelope == null) {
  656.                             contentTypeForEnvelope = HttpConstants.CONTENT_TYPE_SOAP_1_2;
  657.                         }
  658.                     }
  659.                     else {
  660.                         throw new Exception("Versione SOAP sconosciuta '"+trasformazioneSoap_versione+"'");
  661.                     }
  662.                    
  663.                     // aggiorno contentType
  664.                     if(transportRequestContext!=null) {
  665.                         transportRequestContext.removeHeader(HttpConstants.CONTENT_TYPE);
  666.                         TransportUtils.setHeader(transportRequestContext.getHeaders(),HttpConstants.CONTENT_TYPE, contentTypeForEnvelope);
  667.                     }
  668.                     else {
  669.                         transportResponseContext.removeHeader(HttpConstants.CONTENT_TYPE);
  670.                         TransportUtils.setHeader(transportResponseContext.getHeaders(),HttpConstants.CONTENT_TYPE, contentTypeForEnvelope);
  671.                     }
  672.                    
  673.                     String soapAction = null;
  674.                     if(trasformazioneSoap_soapAction!=null) {
  675.                         soapAction = DynamicUtils.convertDynamicPropertyValue("soapAction", trasformazioneSoap_soapAction, dynamicMap, pddContext);
  676.                     }
  677.                    
  678.                     OpenSPCoop2Message messageSoap = null;
  679.                     if(risultato.isEmpty()) {
  680.                         if(transportRequestContext!=null) {
  681.                             messageSoap = messageFactory.createEmptyMessage(messageType, MessageRole.REQUEST);
  682.                             messageSoap.setTransportRequestContext(transportRequestContext);
  683.                         }
  684.                         else {
  685.                             messageSoap = messageFactory.createEmptyMessage(messageType, MessageRole.RESPONSE);
  686.                             messageSoap.setTransportResponseContext(transportResponseContext);
  687.                         }
  688.                     }
  689.                     else {
  690.                                                    
  691.                         if(trasformazioneSoap_envelopeAsAttachment) {
  692.                            
  693.                             if(trasformazioneSoap_tipoConversione==null) {
  694.                                 throw new Exception("Tipo di conversione del body interno all'envelope non fornito (SOAPWithAttachments)");
  695.                             }
  696.                             RisultatoTrasformazioneContenuto risultatoEnvelopeBody =
  697.                                     GestoreTrasformazioniUtilities.trasformazioneContenuto(log,
  698.                                             trasformazioneSoap_tipoConversione,
  699.                                             trasformazioneSoap_templateConversione,
  700.                                             "envelope-body", dynamicMap, message, messageContent, pddContext,
  701.                                             null, false);
  702.                             try {
  703.                                 if(risultatoEnvelopeBody.isEmpty()) {
  704.                                     if(transportRequestContext!=null) {
  705.                                         messageSoap = messageFactory.createEmptyMessage(messageType, MessageRole.REQUEST);
  706.                                         messageSoap.setTransportRequestContext(transportRequestContext);
  707.                                     }
  708.                                     else {
  709.                                         messageSoap = messageFactory.createEmptyMessage(messageType, MessageRole.RESPONSE);
  710.                                         messageSoap.setTransportResponseContext(transportResponseContext);
  711.                                     }
  712.                                 }
  713.                                 else {
  714.                                     if(trasformazioneSoap_envelope) {
  715.                                         OpenSPCoop2MessageParseResult pr = null;
  716.                                         if(transportRequestContext!=null) {
  717.                                             pr = messageFactory.envelopingMessage(messageType, contentTypeForEnvelope,
  718.                                                     soapAction, transportRequestContext, risultatoEnvelopeBody.getContenuto(), null, true,
  719.                                                     op2Properties.useSoapMessageReader(), op2Properties.getSoapMessageReaderBufferThresholdKb());
  720.                                         }
  721.                                         else {
  722.                                             pr = messageFactory.envelopingMessage(messageType, contentTypeForEnvelope,
  723.                                                     soapAction, transportResponseContext, risultatoEnvelopeBody.getContenuto(), null, true,
  724.                                                     op2Properties.useSoapMessageReader(), op2Properties.getSoapMessageReaderBufferThresholdKb());
  725.                                         }
  726.                                         messageSoap = pr.getMessage_throwParseThrowable();
  727.                                     }
  728.                                     else {
  729.                                         OpenSPCoop2MessageParseResult pr = null;
  730.                                         if(transportRequestContext!=null) {
  731.                                             pr = messageFactory.createMessage(messageType, transportRequestContext,
  732.                                                     risultatoEnvelopeBody.getContenuto());
  733.                                         }
  734.                                         else {
  735.                                             pr = messageFactory.createMessage(messageType, transportResponseContext,
  736.                                                     risultatoEnvelopeBody.getContenuto());
  737.                                         }
  738.                                         messageSoap = pr.getMessage_throwParseThrowable();
  739.                                     }
  740.                                 }
  741.                             }catch(Throwable t) {
  742.                                 if(risultatoEnvelopeBody.getContenutoAsString()!=null) {
  743.                                     log.error("Trasformazione non riuscita per il contenuto del body (SOAP With Attachments): ["+risultatoEnvelopeBody.getContenutoAsString()+"]",t);
  744.                                 }
  745.                                 throw t;
  746.                             }
  747.                                                            
  748.                             // esiste un contenuto nel body
  749.                             AttachmentPart ap = null;
  750.    
  751.                             String contentType = contentTypeInput;
  752.                             if(contentType==null) {
  753.                                 throw new Exception("Content-Type non indicato per l'attachment");
  754.                             }
  755.                             String ctBase = ContentTypeUtilities.readBaseTypeFromContentType(contentType);
  756.                             if(HttpConstants.CONTENT_TYPE_TEXT_XML.equals(ctBase)) {
  757.                                
  758.                                 if(MailcapActivationReader.existsDataContentHandler(HttpConstants.CONTENT_TYPE_TEXT_XML)){
  759.                                     ap = messageSoap.castAsSoap().createAttachmentPart();
  760.                                     messageSoap.castAsSoap().updateAttachmentPart(ap, risultato.getContenuto(), contentType);
  761.                                 }
  762.                                 else {
  763.                                     InputStreamDataSource isSource = new InputStreamDataSource("attach", contentType, risultato.getContenuto());
  764.                                     ap = messageSoap.castAsSoap().createAttachmentPart(new DataHandler(isSource));
  765.                                 }
  766.                             }
  767.                             else {
  768.                                 InputStreamDataSource isSource = new InputStreamDataSource("attach", contentType, risultato.getContenuto());
  769.                                 ap = messageSoap.castAsSoap().createAttachmentPart(new DataHandler(isSource));
  770.                             }
  771.                            
  772.                             String contentID = messageSoap.castAsSoap().createContentID(op2Properties.getHeaderSoapActorIntegrazione());
  773.                             if(contentID.startsWith("<")){
  774.                                 contentID = contentID.substring(1);
  775.                             }
  776.                             if(contentID.endsWith(">")){
  777.                                 contentID = contentID.substring(0,contentID.length()-1);
  778.                             }
  779.                            
  780.                             ap.setContentId(contentID);
  781.                             messageSoap.castAsSoap().addAttachmentPart(ap);
  782.                                
  783.                         }
  784.                         else {
  785.                            
  786.                             if(trasformazioneSoap_envelope) {
  787.                                 OpenSPCoop2MessageParseResult pr = null;
  788.                                 if(transportRequestContext!=null) {
  789.                                     pr = messageFactory.envelopingMessage(messageType, contentTypeForEnvelope,
  790.                                             soapAction, transportRequestContext, risultato.getContenuto(), null, true,
  791.                                             op2Properties.useSoapMessageReader(), op2Properties.getSoapMessageReaderBufferThresholdKb());
  792.                                 }
  793.                                 else {
  794.                                     pr = messageFactory.envelopingMessage(messageType, contentTypeForEnvelope,
  795.                                             soapAction, transportResponseContext, risultato.getContenuto(), null, true,
  796.                                             op2Properties.useSoapMessageReader(), op2Properties.getSoapMessageReaderBufferThresholdKb());
  797.                                 }
  798.                                 messageSoap = pr.getMessage_throwParseThrowable();
  799.                             }
  800.                             else {
  801.                                 OpenSPCoop2MessageParseResult pr = null;
  802.                                 if(transportRequestContext!=null) {
  803.                                     pr = messageFactory.createMessage(messageType, transportRequestContext, risultato.getContenuto());
  804.                                 }
  805.                                 else {
  806.                                     pr = messageFactory.createMessage(messageType, transportResponseContext, risultato.getContenuto());
  807.                                 }
  808.                                 messageSoap = pr.getMessage_throwParseThrowable();
  809.                             }
  810.    
  811.                         }
  812.                        
  813.                     }
  814.                    
  815.                     message.copyResourcesTo(messageSoap, skipTransportInfo);
  816.                    
  817.                     addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, messageSoap);
  818.                    
  819.                     if(messageSoap!=null && soapAction!=null) {
  820.                         messageSoap.castAsSoap().setSoapAction(soapAction);
  821.                     }
  822.                    
  823.                     return messageSoap;
  824.                    
  825.                 }
  826.                 else {
  827.                    
  828.                     if(risultato.isEmpty()) {
  829.                        
  830.                         message.castAsRest().updateContent(null);
  831.                         message.castAsRest().setContentType(null);
  832.                        
  833.                         addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, message);
  834.                        
  835.                         if(ServiceBinding.REST.equals(message.getServiceBinding())) {
  836.                             if(StringUtils.isNotEmpty(trasformazioneRest_method) || StringUtils.isNotEmpty(trasformazioneRest_path)) {
  837.                                 GestoreTrasformazioniUtilities.injectNewRestParameter(message,
  838.                                         trasformazioneRest_method,
  839.                                         trasformazioneRest_path,
  840.                                         dynamicMap, pddContext);
  841.                             }
  842.                         }
  843.                        
  844.                         return message;
  845.                        
  846.                     }
  847.                     else {
  848.                        
  849.                         String contentType = null;
  850.                         if(contentTypeInput!=null) {
  851.                             contentType = contentTypeInput;
  852.                         }
  853.                         else {
  854.                             contentType = message.getContentType();
  855.                         }
  856.                        
  857.                         MessageType messageType = null;
  858.                         if(risultato.getTipoTrasformazione().isBinaryMessage()) {
  859.                             messageType = MessageType.BINARY;
  860.                         }
  861.                         else {
  862.                             if(transportRequestContext!=null) {
  863.                                 messageType = requestInfo.getBindingConfig().getRequestMessageType(ServiceBinding.REST, transportRequestContext, contentType);
  864.                             }
  865.                             else {
  866.                                 messageType = requestInfo.getBindingConfig().getResponseMessageType(ServiceBinding.REST, new TransportRequestContext(log), contentType, status);
  867.                             }
  868.                         }
  869.                         if(messageType.equals(message.getMessageType())) {
  870.                            
  871.                             if(MessageType.XML.equals(messageType)) {
  872.                                
  873.                                 message.castAsRestXml().updateContent(MessageXMLUtils.getInstance(messageFactory).newElement(risultato.getContenuto()));
  874.                                                                
  875.                                 addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, message);
  876.                                
  877.                                 if(contentTypeInput!=null) {
  878.                                     message.setContentType(contentTypeInput);
  879.                                 }
  880.                                
  881.                                 if(ServiceBinding.REST.equals(message.getServiceBinding())) {
  882.                                     if(StringUtils.isNotEmpty(trasformazioneRest_method) || StringUtils.isNotEmpty(trasformazioneRest_path)) {
  883.                                         GestoreTrasformazioniUtilities.injectNewRestParameter(message,
  884.                                                 trasformazioneRest_method,
  885.                                                 trasformazioneRest_path,
  886.                                                 dynamicMap, pddContext);
  887.                                     }
  888.                                 }
  889.                                
  890.                                 return message;
  891.                                
  892.                             }
  893.                             else if(MessageType.JSON.equals(messageType)) {
  894.                                
  895.                                 message.castAsRestJson().updateContent(risultato.getContenutoAsString());
  896.                                
  897.                                 addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, message);
  898.                                
  899.                                 if(contentTypeInput!=null) {
  900.                                     message.setContentType(contentTypeInput);
  901.                                 }
  902.                                
  903.                                 if(ServiceBinding.REST.equals(message.getServiceBinding())) {
  904.                                     if(StringUtils.isNotEmpty(trasformazioneRest_method) || StringUtils.isNotEmpty(trasformazioneRest_path)) {
  905.                                         GestoreTrasformazioniUtilities.injectNewRestParameter(message,
  906.                                                 trasformazioneRest_method,
  907.                                                 trasformazioneRest_path,
  908.                                                 dynamicMap, pddContext);
  909.                                     }
  910.                                 }
  911.                                
  912.                                 return message;
  913.                                
  914.                             }
  915.                            
  916.                         }
  917.                        
  918.                         // converto
  919.                         OpenSPCoop2MessageParseResult pr = null;
  920.                         if(transportRequestContext!=null) {
  921.                             pr = messageFactory.createMessage(messageType, transportRequestContext, risultato.getContenuto());
  922.                         }
  923.                         else {
  924.                             pr = messageFactory.createMessage(messageType, transportResponseContext, risultato.getContenuto());
  925.                         }
  926.                        
  927.                         OpenSPCoop2Message newMsg = pr.getMessage_throwParseThrowable();
  928.                         message.copyResourcesTo(newMsg, !skipTransportInfo); // devo preservare gli header in questo caso
  929.                        
  930.                         addTransportInfo(forceAddTrasporto, forceAddUrl, forceResponseStatus, message);
  931.                        
  932.                         if(ServiceBinding.REST.equals(newMsg.getServiceBinding())) {
  933.                             if(StringUtils.isNotEmpty(trasformazioneRest_method) || StringUtils.isNotEmpty(trasformazioneRest_path)) {
  934.                                 GestoreTrasformazioniUtilities.injectNewRestParameter(newMsg,
  935.                                         trasformazioneRest_method,
  936.                                         trasformazioneRest_path,
  937.                                         dynamicMap, pddContext);
  938.                             }
  939.                         }
  940.                        
  941.                         return newMsg;
  942.                        
  943.                     }
  944.                    
  945.                 }
  946.                
  947.             }
  948.         }catch(Throwable t) {
  949.             if(risultato.getContenutoAsString()!=null) {
  950.                 log.error("Trasformazione non riuscita per il contenuto: ["+risultato.getContenutoAsString()+"]",t);
  951.             }
  952.             throw t;
  953.         }
  954.     }
  955.    
  956.     public static void injectNewRestParameter(OpenSPCoop2Message message, String trasformazioneRest_method, String trasformazioneRest_path,
  957.             Map<String, Object> dynamicMap, PdDContext pddContext) throws DynamicException {
  958.         if(ServiceBinding.REST.equals(message.getServiceBinding())) {
  959.             if(StringUtils.isNotEmpty(trasformazioneRest_method)) {
  960.                 String newMethod = DynamicUtils.convertDynamicPropertyValue("trasformazioneRest_method", trasformazioneRest_method, dynamicMap, pddContext);
  961.                 message.getTransportRequestContext().setRequestType(newMethod);
  962.             }
  963.             if(StringUtils.isNotEmpty(trasformazioneRest_path)) {
  964.                 String newPath = DynamicUtils.convertDynamicPropertyValue("trasformazioneRest_path", trasformazioneRest_path, dynamicMap, pddContext);
  965.                 message.getTransportRequestContext().setFunctionParameters(newPath);
  966.             }
  967.         }
  968.     }
  969.    
  970.     public static void addTransportInfo(Map<String, List<String>> forceAddTrasporto, Map<String, List<String>> forceAddUrl, String forceResponseStatus, OpenSPCoop2Message msg) {
  971.         if(forceAddTrasporto!=null && !forceAddTrasporto.isEmpty()) {
  972.             Iterator<String> keys = forceAddTrasporto.keySet().iterator();
  973.             while (keys.hasNext()) {
  974.                 String key = (String) keys.next();
  975.                 List<String> values = forceAddTrasporto.get(key);
  976.                 msg.forceTransportHeader(key, values);  
  977.             }
  978.         }
  979.         if(forceAddUrl!=null && !forceAddUrl.isEmpty()) {
  980.             Iterator<String> keys = forceAddUrl.keySet().iterator();
  981.             while (keys.hasNext()) {
  982.                 String key = (String) keys.next();
  983.                 List<String> values = forceAddUrl.get(key);
  984.                 msg.forceUrlProperty(key, values);  
  985.             }
  986.         }
  987.         if(forceResponseStatus!=null && StringUtils.isNotEmpty(forceResponseStatus)) {
  988.             msg.setForcedResponseCode(forceResponseStatus);
  989.         }
  990.     }
  991.    
  992.     public static void checkReturnCode(String forceResponseStatus) throws Exception {
  993.         int r = -1;
  994.         try {
  995.             r = Integer.valueOf(forceResponseStatus);
  996.         }catch(Exception e) {
  997.             throw new Exception("Codice HTTP di risposta deve essere un intero compreso tra 200 e 599, trovato: '"+forceResponseStatus+"'");
  998.         }
  999.         if(r<200 || r>599) {
  1000.             throw new Exception("Codice HTTP di risposta deve essere un intero compreso tra 200 e 599, trovato: "+forceResponseStatus+"");
  1001.         }
  1002.     }
  1003.    
  1004.     public static final String TIPO_TRASFORMAZIONE_SEPARATOR = " ";
  1005.     public static final String TIPO_TRASFORMAZIONE_CONVERSIONE_SOAP = "soap";
  1006.     public static final String TIPO_TRASFORMAZIONE_CONVERSIONE_REST = "rest";
  1007.     public static final String TIPO_TRASFORMAZIONE_CONVERSIONE_METHOD = "method";
  1008.     public static final String TIPO_TRASFORMAZIONE_CONVERSIONE_PATH = "path";
  1009.     public static final String TIPO_TRASFORMAZIONE_CONVERSIONE_HEADERS = "headers";
  1010.     public static final String TIPO_TRASFORMAZIONE_CONVERSIONE_QUERY_PARAMETERS = "queryParameters";
  1011.     public static final String TIPO_TRASFORMAZIONE_CONVERSIONE_RETURN_CODE = "returnCode";
  1012.     public static final String TIPO_TRASFORMAZIONE_NESSUNA = "nessuna";
  1013.    
  1014.     public static String getLabelTipoTrasformazioneRichiesta(TrasformazioneRegolaRichiesta richiesta, OpenSPCoop2Message message) {
  1015.         StringBuilder bf = new StringBuilder();
  1016.         if(richiesta.getConversione()) {
  1017.             if(richiesta.getTrasformazioneSoap()!=null) {
  1018.                 bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_SOAP).append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1019.             }
  1020.             else if(richiesta.getTrasformazioneRest()!=null) {
  1021.                 if(ServiceBinding.REST.equals(message.getServiceBinding())) {
  1022.                     if(richiesta.getTrasformazioneRest()!=null) {
  1023.                         if(StringUtils.isNotEmpty(richiesta.getTrasformazioneRest().getMetodo())) {
  1024.                             bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_METHOD).append(TIPO_TRASFORMAZIONE_SEPARATOR);    
  1025.                         }
  1026.                         if(StringUtils.isNotEmpty(richiesta.getTrasformazioneRest().getPath())) {
  1027.                             bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_PATH).append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1028.                         }
  1029.                     }
  1030.                 }
  1031.                 else {
  1032.                     bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_REST).append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1033.                 }
  1034.             }
  1035.             bf.append(richiesta.getConversioneTipo());  
  1036.         }
  1037.         else {
  1038.             if(ServiceBinding.REST.equals(message.getServiceBinding())) {
  1039.                 if(richiesta.getTrasformazioneRest()!=null) {
  1040.                     if(StringUtils.isNotEmpty(richiesta.getTrasformazioneRest().getMetodo())) {
  1041.                         if(bf.length()>0) {
  1042.                             bf.append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1043.                         }
  1044.                         bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_METHOD);  
  1045.                     }
  1046.                     if(StringUtils.isNotEmpty(richiesta.getTrasformazioneRest().getPath())) {
  1047.                         if(bf.length()>0) {
  1048.                             bf.append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1049.                         }
  1050.                         bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_PATH);    
  1051.                     }
  1052.                 }
  1053.             }
  1054.         }
  1055.         if(richiesta.getHeaderList()!=null && !richiesta.getHeaderList().isEmpty()) {
  1056.             if(bf.length()>0) {
  1057.                 bf.append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1058.             }
  1059.             bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_HEADERS);
  1060.         }
  1061.         if(richiesta.getParametroUrlList()!=null && !richiesta.getParametroUrlList().isEmpty()) {
  1062.             if(bf.length()>0) {
  1063.                 bf.append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1064.             }
  1065.             bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_QUERY_PARAMETERS);    
  1066.         }
  1067.         if(bf.length()<=0) {
  1068.             bf.append(TIPO_TRASFORMAZIONE_NESSUNA);
  1069.         }
  1070.         return bf.toString();
  1071.        
  1072.     }
  1073.    
  1074.     public static String getLabelTipoTrasformazioneRisposta(TrasformazioneRegolaRichiesta richiesta,TrasformazioneRegolaRisposta trasformazioneRisposta) {
  1075.         StringBuilder bf = new StringBuilder();
  1076.         if(trasformazioneRisposta.getConversione()) {
  1077.             // !inverto!
  1078.             if(richiesta.getTrasformazioneRest()!=null) {
  1079.                 bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_SOAP).append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1080.             }
  1081.             else if(richiesta.getTrasformazioneSoap()!=null) {
  1082.                 bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_REST).append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1083.             }
  1084.             bf.append(trasformazioneRisposta.getConversioneTipo());
  1085.         }
  1086.         if(trasformazioneRisposta.getHeaderList()!=null && !trasformazioneRisposta.getHeaderList().isEmpty()) {
  1087.             if(bf.length()>0) {
  1088.                 bf.append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1089.             }
  1090.             bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_HEADERS);
  1091.         }
  1092.         if(trasformazioneRisposta.getReturnCode()!=null && StringUtils.isNotEmpty(trasformazioneRisposta.getReturnCode())) {
  1093.             if(bf.length()>0) {
  1094.                 bf.append(TIPO_TRASFORMAZIONE_SEPARATOR);  
  1095.             }
  1096.             bf.append(TIPO_TRASFORMAZIONE_CONVERSIONE_RETURN_CODE);
  1097.         }
  1098.         if(bf.length()<=0) {
  1099.             bf.append(TIPO_TRASFORMAZIONE_NESSUNA);
  1100.         }
  1101.         return bf.toString();
  1102.     }
  1103.    
  1104.     public static OpenSPCoop2Message buildRequestResponseArchive(Logger log, OpenSPCoop2Message request, OpenSPCoop2Message response, ArchiveType archiveType) throws GestoreTrasformazioniException{
  1105.        
  1106.         List<Entry> listEntries = new ArrayList<>();
  1107.        
  1108.         OpenSPCoop2MessageFactory msgFactory = null;
  1109.        
  1110.         if(request!=null) {
  1111.             msgFactory = request.getFactory();
  1112.             _buildEntryZipArchive(listEntries, request, true);
  1113.         }
  1114.        
  1115.         if(response!=null) {
  1116.             if(msgFactory==null && request!=null) {
  1117.                 msgFactory = request.getFactory();
  1118.             }
  1119.             _buildEntryZipArchive(listEntries, response, false);
  1120.         }
  1121.        
  1122.         if(msgFactory==null) {
  1123.             throw new GestoreTrasformazioniException("MessageFactory undefined");
  1124.         }
  1125.        
  1126.         byte [] archive = null;
  1127.         try {
  1128.             archive = CompressorUtilities.archive(listEntries, archiveType);
  1129.         }catch(Throwable t) {
  1130.             throw new GestoreTrasformazioniException("Generazione archive '"+archiveType+"' non riuscita: "+t.getMessage(),t);
  1131.         }
  1132.        
  1133.         String mimeType = null;
  1134.         try {
  1135.             switch (archiveType) {
  1136.             case ZIP:
  1137.                 mimeType = MimeTypes.getInstance().getMimeType("zip");
  1138.                 break;
  1139.             case TAR:
  1140.                 mimeType = MimeTypes.getInstance().getMimeType("tar");
  1141.                 break;
  1142.             case TGZ:
  1143.                 mimeType = MimeTypes.getInstance().getMimeType("tgz");
  1144.                 break;
  1145.             }
  1146.         }catch(Throwable t) {
  1147.             throw new GestoreTrasformazioniException("Generazione mime-type for archive '"+archiveType+"' non riuscita: "+t.getMessage(),t);
  1148.         }
  1149.        
  1150.         try {
  1151.             TransportRequestContext requestContext = new TransportRequestContext(log);
  1152.             requestContext.setHeaders(new HashMap<>());
  1153.             TransportUtils.addHeader(requestContext.getHeaders(), HttpConstants.CONTENT_TYPE, mimeType);
  1154.             OpenSPCoop2MessageParseResult msg = msgFactory.createMessage(MessageType.BINARY, requestContext, archive);
  1155.             return msg.getMessage_throwParseThrowable();
  1156.         }catch(Throwable t) {
  1157.             throw new GestoreTrasformazioniException("Generazione OpenSPCoop2 Message from archive '"+archiveType+"' non riuscita: "+t.getMessage(),t);
  1158.         }
  1159.     }
  1160.     private static void _buildEntryZipArchive(List<Entry> listEntries, OpenSPCoop2Message message, boolean request) throws GestoreTrasformazioniException{
  1161.        
  1162.         String name = request ? "request" : "response";
  1163.        
  1164.         try {
  1165.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  1166.             message.writeTo(bout, true);
  1167.             bout.flush();
  1168.             bout.close();
  1169.             Entry payloadRequest = new Entry(name+".bin", bout.toByteArray());
  1170.             listEntries.add(payloadRequest);
  1171.            
  1172.             Map<String, List<String>> hdr = null;
  1173.            
  1174.             if(request && message.getTransportRequestContext()!=null) {
  1175.                 if(message.getTransportRequestContext().getHeaders()!=null &&
  1176.                     !message.getTransportRequestContext().getHeaders().isEmpty()) {
  1177.                     hdr = message.getTransportRequestContext().getHeaders();
  1178.                 }
  1179.             }
  1180.             else if(!request && message.getTransportResponseContext()!=null) {
  1181.                 if(message.getTransportResponseContext().getHeaders()!=null &&
  1182.                         !message.getTransportResponseContext().getHeaders().isEmpty()) {
  1183.                     hdr = message.getTransportResponseContext().getHeaders();
  1184.                 }
  1185.             }
  1186.        
  1187.             if(hdr!=null) {
  1188.                 StringBuilder sb = new StringBuilder();
  1189.                 for (String hdrName : hdr.keySet()) {
  1190.                     List<String> values = hdr.get(hdrName);
  1191.                     if(values!=null) {
  1192.                         for (String v : values) {
  1193.                             if(v==null) {
  1194.                                 v="";
  1195.                             }
  1196.                             if(sb.length()>0) {
  1197.                                 sb.append("\n");
  1198.                             }
  1199.                             sb.append(hdrName).append(": ").append(v);
  1200.                         }
  1201.                     }
  1202.                 }
  1203.                 if(sb.length()>0) {
  1204.                     bout = new ByteArrayOutputStream();
  1205.                     bout.write(sb.toString().getBytes());
  1206.                     bout.flush();
  1207.                     bout.close();
  1208.                     Entry payloadRequestHeaders = new Entry(name+"Headers.bin", bout.toByteArray());
  1209.                     listEntries.add(payloadRequestHeaders);
  1210.                 }  
  1211.             }
  1212.         }catch(Throwable t) {
  1213.             throw new GestoreTrasformazioniException("Generazione entry '"+name+"' non riuscita: "+t.getMessage(),t);
  1214.         }
  1215.        
  1216.     }
  1217.    
  1218. }