OpenSPCoop2MessageFactory.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.message;

  21. import java.io.ByteArrayInputStream;
  22. import java.io.InputStream;
  23. import java.io.SequenceInputStream;
  24. import java.util.Enumeration;
  25. import java.util.HashMap;

  26. import javax.mail.internet.ContentType;
  27. import javax.xml.soap.MessageFactory;
  28. import javax.xml.soap.SOAPConnectionFactory;
  29. import javax.xml.soap.SOAPElement;
  30. import javax.xml.soap.SOAPException;
  31. import javax.xml.soap.SOAPFactory;
  32. import javax.xml.soap.SOAPMessage;

  33. import org.openspcoop2.message.config.FaultBuilderConfig;
  34. import org.openspcoop2.message.constants.Costanti;
  35. import org.openspcoop2.message.constants.MessageRole;
  36. import org.openspcoop2.message.constants.MessageType;
  37. import org.openspcoop2.message.exception.MessageException;
  38. import org.openspcoop2.message.exception.MessageNotSupportedException;
  39. import org.openspcoop2.message.exception.ParseExceptionUtils;
  40. import org.openspcoop2.message.soap.AbstractOpenSPCoop2Message_soap_impl;
  41. import org.openspcoop2.message.soap.reader.OpenSPCoop2MessageSoapStreamReader;
  42. import org.openspcoop2.message.utils.MessageUtilities;
  43. import org.openspcoop2.utils.Utilities;
  44. import org.openspcoop2.utils.io.notifier.NotifierInputStream;
  45. import org.openspcoop2.utils.io.notifier.NotifierInputStreamParams;
  46. import org.openspcoop2.utils.json.JsonPathExpressionEngine;
  47. import org.openspcoop2.utils.mime.MultipartUtils;
  48. import org.openspcoop2.utils.resources.Loader;
  49. import org.openspcoop2.utils.rest.problem.JsonSerializer;
  50. import org.openspcoop2.utils.rest.problem.ProblemRFC7807;
  51. import org.openspcoop2.utils.rest.problem.ProblemRFC7807Builder;
  52. import org.openspcoop2.utils.rest.problem.XmlSerializer;
  53. import org.openspcoop2.utils.transport.TransportRequestContext;
  54. import org.openspcoop2.utils.transport.TransportResponseContext;
  55. import org.openspcoop2.utils.transport.TransportUtils;
  56. import org.openspcoop2.utils.transport.http.ContentTypeUtilities;
  57. import org.openspcoop2.utils.transport.http.HttpConstants;
  58. import org.slf4j.Logger;
  59. import org.w3c.dom.Document;
  60. import org.w3c.dom.Element;
  61. import org.w3c.dom.Node;

  62. import com.sun.xml.messaging.saaj.soap.SOAPDocumentImpl;


  63. /**
  64.  * Factory per la costruzione di messaggi OpenSPCoop2Message.
  65.  *
  66.  * @author Lorenzo Nardi (nardi@link.it)
  67.  * @author Poli Andrea (apoli@link.it)
  68.  * @author $Author$
  69.  * @version $Rev$, $Date$
  70.  */

  71. public abstract class OpenSPCoop2MessageFactory {
  72.    
  73.    
  74.     public static String messageFactoryImpl = org.openspcoop2.message.OpenSPCoop2MessageFactory_impl.class.getName();
  75.    
  76.     public static void setMessageFactoryImpl(String messageFactoryImpl) {
  77.         if(messageFactoryImpl != null)
  78.             OpenSPCoop2MessageFactory.messageFactoryImpl = messageFactoryImpl;
  79.     }

  80.     protected static OpenSPCoop2MessageFactory openspcoopMessageFactory = null;
  81.     public static OpenSPCoop2MessageFactory getDefaultMessageFactory() {
  82.         if(OpenSPCoop2MessageFactory.openspcoopMessageFactory == null)
  83.             try { OpenSPCoop2MessageFactory.initDefaultMessageFactory(); } catch (Exception e) { throw new RuntimeException(e); }
  84.         return OpenSPCoop2MessageFactory.openspcoopMessageFactory;
  85.     }
  86.    
  87.     public static void initDefaultMessageFactory() throws MessageException {
  88.         initDefaultMessageFactory(false);
  89.     }
  90.     public static synchronized void initDefaultMessageFactory(boolean force) throws MessageException {
  91.         try {
  92.             if(OpenSPCoop2MessageFactory.openspcoopMessageFactory==null || force){
  93.                 OpenSPCoop2MessageFactory.openspcoopMessageFactory = (OpenSPCoop2MessageFactory) Loader.getInstance().newInstance(OpenSPCoop2MessageFactory.messageFactoryImpl);
  94.                
  95.                 SOAPDocumentImpl.setCustomDocumentBuilderFactory(OpenSPCoop2MessageFactory.openspcoopMessageFactory.getDocumentBuilderFactoryClass());
  96.                 SOAPDocumentImpl.setCustomSAXParserFactory(OpenSPCoop2MessageFactory.openspcoopMessageFactory.getSAXParserFactoryClass());
  97.                
  98.                 //System.out.println("CREATO F("+force+") ["+OpenSPCoop2MessageFactory.openspcoopMessageFactory+"] ["+OpenSPCoop2MessageFactory.messageFactoryImpl+"]");
  99.             }
  100.     //      else{
  101.     //          System.out.println("GIA ESISTE ["+OpenSPCoop2MessageFactory.openspcoopMessageFactory+"]");
  102.     //      }
  103.         }catch(Exception e) {
  104.             throw new MessageException(e.getMessage(),e);
  105.         }
  106.     }
  107.    
  108.    
  109.    
  110.    
  111.     // ********** SOAP - FACTORY *************
  112.        
  113.     protected static SOAPFactory soapFactory11 = null;
  114.     protected static SOAPFactory soapFactory12 = null;
  115.     public SOAPFactory getSoapFactory11(){
  116.         if(OpenSPCoop2MessageFactory.soapFactory11==null){
  117.             initSoapFactory();
  118.         }
  119.         return OpenSPCoop2MessageFactory.soapFactory11;
  120.     }  
  121.     public SOAPFactory getSoapFactory12(){
  122.         if(OpenSPCoop2MessageFactory.soapFactory12==null){
  123.             initSoapFactory();
  124.         }
  125.         return OpenSPCoop2MessageFactory.soapFactory12;
  126.     }
  127.     public static synchronized void initSoapFactory11(SOAPFactory soapFactory) {
  128.         if(OpenSPCoop2MessageFactory.soapFactory11==null){
  129.             OpenSPCoop2MessageFactory.soapFactory11=soapFactory;
  130.         }
  131.     }
  132.     public static synchronized void initSoapFactory12(SOAPFactory soapFactory) {
  133.         if(OpenSPCoop2MessageFactory.soapFactory12==null){
  134.             OpenSPCoop2MessageFactory.soapFactory12=soapFactory;
  135.         }
  136.     }
  137.     protected abstract void initSoapFactory();
  138.    
  139.    
  140.     protected static MessageFactory soapMessageFactory = null;
  141.     public MessageFactory getSoapMessageFactory() throws SOAPException {
  142.         if(OpenSPCoop2MessageFactory.soapMessageFactory==null){
  143.             initSoapMessageFactory();
  144.         }
  145.         return OpenSPCoop2MessageFactory.soapMessageFactory;
  146.     }
  147.     public static synchronized void initSoapMessageFactory(MessageFactory soapMessageFactory) {
  148.         if(OpenSPCoop2MessageFactory.soapMessageFactory==null){
  149.             OpenSPCoop2MessageFactory.soapMessageFactory=soapMessageFactory;
  150.         }
  151.     }
  152.     protected abstract void initSoapMessageFactory() throws SOAPException;
  153.    
  154.     public abstract SOAPConnectionFactory getSOAPConnectionFactory() throws SOAPException;
  155.    
  156.    
  157.    
  158.    
  159.     // ********** NODE Utilities mediati dall'implementazione dell'OpenSPCoop2Message *************
  160.    
  161.     private static OpenSPCoop2Message _instanceForUtilities = null;
  162.     private static synchronized void initInstanceForUtilities(OpenSPCoop2MessageFactory messageFactory) {
  163.         if(_instanceForUtilities==null) {
  164.             _instanceForUtilities = messageFactory.createEmptyMessage(MessageType.SOAP_11,MessageRole.NONE);
  165.         }
  166.     }
  167.     private static OpenSPCoop2Message getInstanceForUtilities(OpenSPCoop2MessageFactory messageFactory) {
  168.         if(_instanceForUtilities==null) {
  169.             initInstanceForUtilities(messageFactory);
  170.         }
  171.         return _instanceForUtilities;
  172.     }
  173.     public static String getAsString(OpenSPCoop2MessageFactory messageFactory, Node ele, boolean consume){
  174.         // E' indipendente dal tipo SOAP11, il tipo viene utilizzato come uno qualsiasi
  175.         return getInstanceForUtilities(messageFactory).getAsString(ele,consume);
  176.     }
  177.     public static byte[] getAsByte(OpenSPCoop2MessageFactory messageFactory, Node ele, boolean consume){
  178.         // E' indipendente dal tipo SOAP11, il tipo viene utilizzato come uno qualsiasi
  179.         return getInstanceForUtilities(messageFactory).getAsByte(ele,consume);
  180.     }
  181.    
  182.    
  183.     // ********** SOAP Utilities mediati dall'implementazione dell'OpenSPCoop2Message *************
  184.    
  185.     private static HashMap<String, OpenSPCoop2Message> _instanceForSOAPUtilities = new HashMap<>();
  186.     private static synchronized void initInstanceForSOAPUtilities(OpenSPCoop2MessageFactory messageFactory, MessageType messageType) {
  187.         if(!_instanceForSOAPUtilities.containsKey(messageType.name())) {
  188.             OpenSPCoop2Message msg = messageFactory.createEmptyMessage(messageType,MessageRole.NONE);
  189.             _instanceForSOAPUtilities.put(messageType.name(), msg);
  190.         }
  191.     }
  192.     private static OpenSPCoop2Message getInstanceForSOAPUtilities(OpenSPCoop2MessageFactory messageFactory, MessageType messageType) {
  193.         if(!_instanceForSOAPUtilities.containsKey(messageType.name())) {
  194.             initInstanceForSOAPUtilities(messageFactory, messageType);
  195.         }
  196.         return _instanceForSOAPUtilities.get(messageType.name());
  197.     }
  198.    
  199.     public static SOAPElement createSOAPElement(OpenSPCoop2MessageFactory messageFactory, MessageType messageType,byte[] element) throws MessageException, MessageNotSupportedException{
  200.         OpenSPCoop2Message message = getInstanceForSOAPUtilities(messageFactory, messageType);
  201.         OpenSPCoop2SoapMessage soapMsg = message.castAsSoap();
  202.         return soapMsg.createSOAPElement(element);
  203.     }
  204.     public static Element getFirstChildElement(OpenSPCoop2MessageFactory messageFactory, MessageType messageType,SOAPElement element) throws MessageException, MessageNotSupportedException{
  205.         return getInstanceForSOAPUtilities(messageFactory, messageType).castAsSoap().getFirstChildElement(element);
  206.     }
  207.    

  208.    
  209.    
  210.    
  211.     // ********** SAAJ *************
  212.    
  213.     public abstract String getDocumentBuilderFactoryClass();
  214.    
  215.     public abstract String getSAXParserFactoryClass();
  216.    
  217.     public abstract Element convertoForXPathSearch(Element contenutoAsElement);
  218.    
  219.     public abstract void normalizeDocument(Document document);
  220.    
  221.    
  222.    
  223.    
  224.     // ********** OpenSPCoop2Message builder *************
  225.    
  226.     protected abstract OpenSPCoop2Message _createMessage(MessageType messageType, SOAPMessage msg) throws MessageException;
  227.    
  228.     protected abstract OpenSPCoop2Message _createEmptyMessage(MessageType messageType) throws MessageException;
  229.    
  230.     protected abstract OpenSPCoop2Message _createMessage(MessageType messageType, TransportRequestContext requestContext,
  231.             InputStream is,  AttachmentsProcessingMode attachmentsProcessingMode, long overhead,
  232.             OpenSPCoop2MessageSoapStreamReader soapStreamReader) throws MessageException;  
  233.     protected abstract OpenSPCoop2Message _createMessage(MessageType messageType, TransportResponseContext responseContext,
  234.             InputStream is,  AttachmentsProcessingMode attachmentsProcessingMode, long overhead,
  235.             OpenSPCoop2MessageSoapStreamReader soapStreamReader) throws MessageException;  
  236.     protected abstract OpenSPCoop2Message _createMessage(MessageType messageType, String contentType,
  237.             InputStream is,  AttachmentsProcessingMode attachmentsProcessingMode, long overhead,
  238.             OpenSPCoop2MessageSoapStreamReader soapStreamReader) throws MessageException;
  239.    
  240.    
  241.    
  242.    
  243.    
  244.     // ********** MessageType *************

  245.     public MessageType getMessageType(SOAPMessage soapMessage) throws MessageException {
  246.         try{
  247.             Object o = soapMessage.getProperty(Costanti.SOAP_MESSAGE_PROPERTY_MESSAGE_TYPE);
  248.             if(o!=null && o instanceof MessageType){
  249.                 return (MessageType) o;
  250.             }
  251.             return null;
  252.         }catch(Exception e){
  253.             throw new MessageException(e.getMessage(),e);
  254.         }
  255.     }
  256.    
  257.    
  258.    
  259.    
  260.    
  261.    
  262.     // ********** INTERNAL CREATE (chiamate dai metodi pubblici) *************
  263.    
  264.     private OpenSPCoop2Message _internalCreateMessage(MessageType messageType, MessageRole role, SOAPMessage msg) throws MessageException{
  265.        
  266.         if(!MessageType.SOAP_11.equals(messageType) && !MessageType.SOAP_12.equals(messageType)){
  267.             throw new MessageException("Message Type ["+messageType+"] unsupported");
  268.         }
  269.        
  270.         OpenSPCoop2Message msgNew = this._createMessage(messageType, msg);
  271.        
  272.         msgNew.castAsSoap(); // check
  273.        
  274.         msgNew.setMessageType(messageType);
  275.         msgNew.setMessageRole(role);
  276.        
  277.         return msgNew;
  278.     }
  279.    
  280.     private OpenSPCoop2Message _internalCreateEmptyMessage(MessageType messageType, MessageRole role) throws MessageException{
  281.        
  282.         OpenSPCoop2Message msgNew = this._createEmptyMessage(messageType);
  283.        
  284.         MessageUtilities.checkType(messageType, msgNew);
  285.        
  286.         msgNew.setMessageType(messageType);
  287.         msgNew.setMessageRole(role);
  288.        
  289.         return msgNew;
  290.        
  291.     }
  292.    
  293.     private OpenSPCoop2MessageParseResult _internalCreateMessage(MessageType messageType, MessageRole messageRole, Object context,
  294.             Object msgParam, NotifierInputStreamParams notifierInputStreamParams,
  295.             AttachmentsProcessingMode attachmentsProcessingMode, long overhead,
  296.             OpenSPCoop2MessageSoapStreamReader soapStreamReader) {  
  297.        
  298.         OpenSPCoop2MessageParseResult result = new OpenSPCoop2MessageParseResult();
  299.         try{
  300.             InputStream is = null;
  301.             if(msgParam!=null){
  302.                 if(msgParam instanceof byte[]){
  303.                     is = new ByteArrayInputStream( (byte[]) msgParam);
  304.                 }
  305.                 else if(msgParam instanceof InputStream){
  306.                     is = (InputStream) msgParam;
  307.                 }
  308.                 else{
  309.                     throw new Exception("Tipo di messaggio non supportato: "+msgParam.getClass().getName());
  310.                 }
  311.             }
  312.            
  313.             InputStream nis = null;
  314.            
  315. //          if(is==null){
  316. //              throw new Exception("Original InputStream undefined");
  317. //          }
  318. //          
  319.             String contentType = null;
  320.             TransportRequestContext transportRequestContext = null;
  321.             TransportResponseContext transportResponseContext = null;
  322.             String codiceTrasportoRisposta = null;
  323.             if(context instanceof TransportRequestContext){
  324.                 transportRequestContext = (TransportRequestContext) context;
  325.                 contentType = transportRequestContext.getHeaderFirstValue(HttpConstants.CONTENT_TYPE);
  326.             }
  327.             else if(context instanceof TransportResponseContext){
  328.                 transportResponseContext = (TransportResponseContext) context;
  329.                 contentType = transportResponseContext.getHeaderFirstValue(HttpConstants.CONTENT_TYPE);
  330.                 codiceTrasportoRisposta = transportResponseContext.getCodiceTrasporto();
  331.             }
  332.             else if(context instanceof String){
  333.                 contentType = (String) context;
  334.             }
  335.             else{
  336.                 if(context==null) {
  337.                     if(!MessageType.BINARY.equals(messageType)) {
  338.                         throw new MessageException("Unsupported Empty Context for message '"+messageType+"' (No Content Type?)");
  339.                     }
  340.                 }
  341.                 else {
  342.                     throw new MessageException("Unsupported Context ["+context.getClass().getName()+"]");
  343.                 }
  344.             }
  345.            
  346.            
  347.             if(notifierInputStreamParams!=null && is!=null){
  348.                 nis = new NotifierInputStream(is,contentType,notifierInputStreamParams);
  349.             }
  350.             else{
  351.                 nis = is;
  352.             }
  353.            
  354.             OpenSPCoop2Message op2Msg = null;
  355.             if(transportRequestContext!=null){
  356.                 op2Msg = this._createMessage(messageType, transportRequestContext, nis, attachmentsProcessingMode, overhead, soapStreamReader);
  357.                
  358.                 if(MessageType.SOAP_11.equals(messageType) || MessageType.SOAP_12.equals(messageType)){
  359.                     String soapAction = null;
  360.                     if(MessageType.SOAP_11.equals(messageType)){
  361.                         soapAction = transportRequestContext.getHeaderFirstValue(Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION);
  362.                     }
  363.                     else{
  364.                         // The SOAP 1.1 mandatory SOAPAction HTTP header has been removed in SOAP 1.2.
  365.                         // In its place is an optional action parameter on the application/soap+xml media type.
  366.                         if(contentType!=null){
  367.                             ContentType ct = new ContentType(contentType);
  368.                             if(ct.getParameterList()!=null && ct.getParameterList().size()>0){
  369.                                 Enumeration<?> names = ct.getParameterList().getNames();
  370.                                 while (names.hasMoreElements()) {
  371.                                     String name = (String) names.nextElement();
  372.                                     if(Costanti.SOAP12_OPTIONAL_CONTENT_TYPE_PARAMETER_SOAP_ACTION.equals(name)){
  373.                                         soapAction = ct.getParameterList().get(name);
  374.                                     }  
  375.                                 }
  376.                             }
  377.                         }
  378.                     }
  379.                    
  380.                     OpenSPCoop2SoapMessage soapMessage = op2Msg.castAsSoap();
  381.                     if(soapAction!=null){
  382.                         soapMessage.setSoapAction(soapAction);
  383.                     }
  384.                 }
  385.             }
  386.             else if(transportResponseContext!=null){
  387.                 op2Msg = this._createMessage(messageType, transportResponseContext, nis, attachmentsProcessingMode, overhead, soapStreamReader);
  388.             }
  389.             else{
  390.                 op2Msg = this._createMessage(messageType, contentType, nis, attachmentsProcessingMode, overhead, soapStreamReader);
  391.             }
  392.             if(op2Msg==null){
  393.                 throw new Exception("Create message failed");
  394.             }
  395.             if(notifierInputStreamParams!=null && nis!=null){
  396.                 op2Msg.setNotifierInputStream((NotifierInputStream)nis);
  397.             }
  398.            
  399.             if(context instanceof TransportRequestContext){
  400.                 op2Msg.setTransportRequestContext(transportRequestContext);
  401.             }
  402.             else if(context instanceof TransportResponseContext){
  403.                 op2Msg.setTransportResponseContext(transportResponseContext);
  404.                 if(codiceTrasportoRisposta!=null){
  405.                     op2Msg.setForcedResponseCode(codiceTrasportoRisposta);
  406.                 }
  407.             }
  408.            
  409.             op2Msg.setMessageRole(messageRole);
  410.             op2Msg.setMessageType(messageType);
  411.            
  412.             if(MessageType.SOAP_11.equals(messageType) || MessageType.SOAP_12.equals(messageType)){
  413.                 if(! (op2Msg instanceof AbstractOpenSPCoop2Message_soap_impl)) {
  414.                     op2Msg.castAsSoap().getSOAPHeader(); // Verifica struttura
  415.                 }
  416.                 else {
  417.                     // la verifica verra' fatta quando viene costruito il contenuto saaj
  418.                 }
  419.             }
  420.            
  421.             result.setMessage(op2Msg);
  422.         }catch(Throwable t){
  423.             try {
  424.                 result.setParseException(ParseExceptionUtils.buildParseException(t,messageRole));
  425.             }catch(Throwable e) {
  426. //              System.err.println("ECCEZIONE?");
  427. //              e.printStackTrace(System.err);
  428.                 System.err.println("Message reading error: "+t.getMessage());
  429.                 t.printStackTrace(System.err);
  430.                 throw new RuntimeException(t.getMessage(),t);
  431.             }
  432.         }
  433.         return result;
  434.     }
  435.    
  436.     private OpenSPCoop2MessageParseResult _internalEnvelopingMessage(MessageType messageType, MessageRole messageRole,
  437.             String contentTypeForEnvelope, String soapAction,
  438.             Object context,
  439.             Object msgParam, NotifierInputStreamParams notifierInputStreamParams,
  440.             AttachmentsProcessingMode attachmentsProcessingMode,
  441.             boolean eraserXmlTag,
  442.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb ) {
  443.                
  444.         try{
  445.        
  446.             byte[] byteMsg = null;
  447.             if(msgParam instanceof byte[]){
  448.                 byteMsg = (byte[]) msgParam;
  449.             }
  450.             else if(msgParam instanceof InputStream){
  451.                 byteMsg = Utilities.getAsByteArray((InputStream)msgParam);
  452.             }
  453.             else{
  454.                 throw new Exception("Tipo di messaggio non supportato: "+msgParam.getClass().getName());
  455.             }
  456.            
  457.             if(byteMsg==null || byteMsg.length==0)
  458.                 throw new Exception("Nessun contenuto fornito da inserire all'interno del SoapBody");
  459.            
  460.             if(MessageType.SOAP_11.equals(messageType)){
  461.                 if(contentTypeForEnvelope==null){
  462.                     contentTypeForEnvelope = HttpConstants.CONTENT_TYPE_SOAP_1_1;
  463.                 }
  464.             } else if(MessageType.SOAP_12.equals(messageType)){
  465.                 if(contentTypeForEnvelope==null){
  466.                     contentTypeForEnvelope = HttpConstants.CONTENT_TYPE_SOAP_1_2;
  467.                 }
  468.             }
  469.             else{
  470.                 throw new MessageException("Unsupported Type ["+messageType+"]");
  471.             }
  472.            
  473.             int offset = 0;
  474.             InputStream messageInput = null;
  475.            
  476.             if(MultipartUtils.messageWithAttachment(byteMsg)){
  477.                
  478.                 // ** Attachments **
  479.                
  480.                 contentTypeForEnvelope = ContentTypeUtilities.buildMultipartRelatedContentType(byteMsg, contentTypeForEnvelope);
  481.                 String boundary = MultipartUtils.findBoundary(byteMsg);

  482.                 // Il messaggio deve essere imbustato.
  483.                 String msg = new String(byteMsg);
  484.                
  485.                 int firstBound = msg.indexOf(boundary);
  486.                 int secondBound = msg.indexOf(boundary,firstBound+boundary.length());
  487.                 if(firstBound==-1 || secondBound==-1)
  488.                     throw new Exception("multipart/related non correttamente formato (bound not found)");
  489.                 String bodyOriginal = msg.substring(firstBound+boundary.length(), secondBound);
  490.                
  491.                 // Cerco "\r\n\r\n";
  492.                 int indexCarriage = bodyOriginal.indexOf("\r\n\r\n");
  493.                 if(indexCarriage==-1)
  494.                     throw new Exception("multipart/related non correttamente formato (\\r\\n\\r\\n not found)");
  495.                 String contenutoBody = bodyOriginal.substring(indexCarriage+"\r\n\r\n".length());
  496.                
  497.                 // brucio spazi vuoti
  498.                 int puliziaSpaziBianchi_e_XML = 0;
  499.                 for( ; puliziaSpaziBianchi_e_XML<contenutoBody.length(); puliziaSpaziBianchi_e_XML++){
  500.                     if(contenutoBody.charAt(puliziaSpaziBianchi_e_XML)!=' '){
  501.                         break;
  502.                     }
  503.                 }
  504.                 String bodyPulito = contenutoBody.substring(puliziaSpaziBianchi_e_XML);
  505.                
  506.                 // se presente <?xml && eraserXMLTag
  507.                 if(bodyPulito.startsWith("<?xml")){
  508.                     if(eraserXmlTag){
  509.                         // eliminazione tag <?xml
  510.                         for(puliziaSpaziBianchi_e_XML=0 ; puliziaSpaziBianchi_e_XML<contenutoBody.length(); puliziaSpaziBianchi_e_XML++){
  511.                             if(contenutoBody.charAt(puliziaSpaziBianchi_e_XML)=='>'){
  512.                                 break;
  513.                             }
  514.                         }
  515.                         bodyPulito = bodyPulito.substring(puliziaSpaziBianchi_e_XML+1);
  516.                     }else{
  517.                         // lancio eccezione
  518.                         throw new Exception("Tag <?xml non permesso con la funzionalita di imbustamento SOAP");
  519.                     }
  520.                 }
  521.                                    
  522.                 // ImbustamentoSOAP
  523.                 String contenutoBodyImbustato = null;
  524.                 if(MessageType.SOAP_11.equals(messageType)){
  525.                     contenutoBodyImbustato =
  526.                             "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Body>"+
  527.                                     bodyPulito+
  528.                             "</SOAP-ENV:Body></SOAP-ENV:Envelope>\r\n";
  529.                 } else {
  530.                     contenutoBodyImbustato =
  531.                             "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://www.w3.org/2003/05/soap-envelope\"><SOAP-ENV:Body>"+
  532.                                     bodyPulito+
  533.                             "</SOAP-ENV:Body></SOAP-ENV:Envelope>\r\n";
  534.                 }
  535.                
  536.                 // MessaggioImbustato
  537.                 String bodyOriginalImbustato = bodyOriginal.replace(contenutoBody, contenutoBodyImbustato);
  538.                 msg = msg.replace(bodyOriginal, bodyOriginalImbustato);
  539.                 byteMsg = msg.getBytes();
  540.                
  541.                 messageInput = new ByteArrayInputStream(byteMsg,offset,byteMsg.length);
  542.             }
  543.             else{
  544.                
  545.                 // No Attachments
  546.                 //Controllo <?xml
  547.                
  548.                 // brucio spazi vuoti
  549.                 int i = 0;
  550.                 for( ; i<byteMsg.length; i++){
  551.                     if(((char)byteMsg[i])!=' '){
  552.                         break;
  553.                     }
  554.                 }
  555.                
  556.                 // se presente <?xml
  557.                 offset = readOffsetXmlInstruction(byteMsg, i, eraserXmlTag, offset, false);
  558.                 InputStream messageInputXml = new ByteArrayInputStream(byteMsg,offset,byteMsg.length);
  559.                
  560.                 ByteArrayInputStream binSoapOpen = null;
  561.                 if(MessageType.SOAP_11.equals(messageType)){
  562.                     binSoapOpen = new ByteArrayInputStream("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Body>".getBytes());
  563.                 }
  564.                 else {
  565.                     binSoapOpen = new ByteArrayInputStream("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://www.w3.org/2003/05/soap-envelope\"><SOAP-ENV:Body>".getBytes());
  566.                 }
  567.                 ByteArrayInputStream binSoapClose = new ByteArrayInputStream("</SOAP-ENV:Body></SOAP-ENV:Envelope>".getBytes());
  568.                
  569.                 // UNIRE GLI STREAM E LEVARE QUELLO SOTTO
  570.                 InputStream startInput = new SequenceInputStream(binSoapOpen, messageInputXml);
  571.                 messageInput = new SequenceInputStream(startInput, binSoapClose);
  572.             }
  573.                        
  574.             OpenSPCoop2MessageSoapStreamReader soapReader = null;
  575.             if(useSoapMessageReader) {
  576.                 String contentType = contentTypeForEnvelope;
  577.                 if(contentType!=null) {
  578.                     soapReader = new OpenSPCoop2MessageSoapStreamReader(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), contentType,
  579.                             messageInput, soapMessageReaderBufferThresholdKb);
  580.                     try {
  581.                         soapReader.read();
  582.                     }finally {
  583.                         // anche in caso di eccezione devo cmq aggiornare is
  584.                         messageInput = soapReader.getBufferedInputStream();
  585.                     }
  586.                 }
  587.             }
  588.            
  589.             OpenSPCoop2MessageParseResult result = null;
  590.             if(context==null){
  591.                 result = _internalCreateMessage(messageType, messageRole, contentTypeForEnvelope, messageInput, notifierInputStreamParams, attachmentsProcessingMode, 0, soapReader);
  592.             }
  593.             else if(context instanceof TransportRequestContext){
  594.                 TransportRequestContext trc = (TransportRequestContext) context;
  595.                 TransportUtils.removeObject(trc.getHeaders(), HttpConstants.CONTENT_TYPE);
  596.                 TransportUtils.addHeader(trc.getHeaders(), HttpConstants.CONTENT_TYPE, contentTypeForEnvelope);
  597.                
  598.                 result = _internalCreateMessage(messageType, messageRole, trc, messageInput, notifierInputStreamParams, attachmentsProcessingMode, 0, soapReader);
  599.                
  600.             }
  601.             else if(context instanceof TransportResponseContext){
  602.                 TransportResponseContext trc = (TransportResponseContext) context;
  603.                 TransportUtils.removeObject(trc.getHeaders(), HttpConstants.CONTENT_TYPE);
  604.                 TransportUtils.addHeader(trc.getHeaders(), HttpConstants.CONTENT_TYPE, contentTypeForEnvelope);
  605.                
  606.                 result = _internalCreateMessage(messageType, messageRole, trc, messageInput, notifierInputStreamParams, attachmentsProcessingMode, 0, soapReader);
  607.             }
  608.             else{
  609.                 throw new MessageException("Unsupported Context ["+context.getClass().getName()+"]");
  610.             }
  611.            
  612.             // Verifico la costruzione del messaggio SOAP
  613.             if(result.getMessage()!=null){
  614.                 OpenSPCoop2SoapMessage soapMessage = null;
  615.                 try{
  616.                     soapMessage = result.getMessage().castAsSoap();
  617.                     soapMessage.getSOAPHeader();
  618.                 } catch (Throwable soapException) {
  619.                     result.setMessage(null);
  620.                     result.setParseException(ParseExceptionUtils.buildParseException(soapException, messageRole));
  621.                 }

  622.                 if(soapMessage!=null) {
  623.                     soapMessage.setSoapAction(soapAction);
  624.                 }
  625.             }
  626.                        
  627.             return result;
  628.         }catch(Throwable t){
  629.             OpenSPCoop2MessageParseResult result = new OpenSPCoop2MessageParseResult();
  630.             result.setParseException(ParseExceptionUtils.buildParseException(t, messageRole));
  631.             return result;
  632.         }
  633.     }
  634.    
  635.     private static int readOffsetXmlInstruction(byte[]byteMsg, int startFrom,boolean eraserXmlTag, int offsetParam, boolean cleanEmptyChar) throws Exception{
  636.         //System.out.println("START["+(startFrom)+"] OFFSET["+offsetParam+"]");
  637.         int offset = offsetParam;
  638.         int i = startFrom;
  639.        
  640.         // brucio spazi vuoti
  641.         if(cleanEmptyChar){
  642.             for( ; i<byteMsg.length; i++){
  643.                 if(((char)byteMsg[i])=='<'){
  644.                     break;
  645.                 }
  646.             }
  647.         }
  648.        
  649.         String xml = "";
  650.         if(byteMsg.length>i+5){
  651.             xml = "" + ((char)byteMsg[i]) + ((char)byteMsg[i+1]) + ((char)byteMsg[i+2]) +((char)byteMsg[i+3]) + ((char)byteMsg[i+4]);
  652.             //System.out.println("CHECK ["+xml+"]");
  653.             if(xml.equals("<?xml")){
  654.                 if(eraserXmlTag){
  655.                     // eliminazione tag <?xml
  656.                     for( ; i<byteMsg.length; i++){
  657.                         if(((char)byteMsg[i])=='>'){
  658.                             break;
  659.                         }
  660.                     }
  661.                     offset = i+1;
  662.                 }else{
  663.                     // lancio eccezione
  664.                     throw new Exception("Tag <?xml non permesso con la funzionalita di imbustamento SOAP");
  665.                 }
  666.                 //System.out.println("RIGIRO CON START["+(i+1)+"] OFFSET["+offset+"]");
  667.                 return readOffsetXmlInstruction(byteMsg, (i+1), eraserXmlTag, offset, true);
  668.             }
  669.             else{
  670.                 //System.out.println("FINE A["+offset+"]");
  671.                 return offset;
  672.             }
  673.         }
  674.         else{
  675.             //System.out.println("FINE B["+offset+"]");
  676.             return offset;
  677.         }
  678.     }
  679.    
  680.    
  681.    
  682.    
  683.     // ********** METODI PUBBLICI *************
  684.        
  685.    
  686.     /*
  687.      * Messaggi ottenuti tramite InputStream o byte[]
  688.      */
  689.    
  690.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportRequestContext requestContext,
  691.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams) {    
  692.         return this.createMessage(messageType, requestContext, messageInput, notifierInputStreamParams,
  693.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  694.     }
  695.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportRequestContext requestContext,
  696.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  697.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  698.         return _internalCreateMessage(messageType, MessageRole.REQUEST, requestContext, messageInput, notifierInputStreamParams,  
  699.                 attachmentsProcessingMode, 0, null);
  700.     }
  701.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportRequestContext requestContext,
  702.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  703.             OpenSPCoop2MessageSoapStreamReader soapStreamReader) {  
  704.         return this.createMessage(messageType, requestContext, messageInput, notifierInputStreamParams, soapStreamReader,
  705.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  706.     }
  707.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportRequestContext requestContext,
  708.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  709.             OpenSPCoop2MessageSoapStreamReader soapStreamReader,
  710.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  711.         return _internalCreateMessage(messageType, MessageRole.REQUEST, requestContext, messageInput, notifierInputStreamParams,  
  712.                 attachmentsProcessingMode, 0, soapStreamReader);
  713.     }
  714.    
  715.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportRequestContext requestContext,
  716.             byte[] messageInput) {  
  717.         return this.createMessage(messageType, requestContext, messageInput, null,
  718.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  719.     }
  720.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportRequestContext requestContext,
  721.             byte[] messageInput,
  722.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  723.         return this.createMessage(messageType, requestContext, messageInput, null,
  724.                 attachmentsProcessingMode);
  725.     }
  726.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportRequestContext requestContext,
  727.             byte[] messageInput, NotifierInputStreamParams notifierInputStreamParams) {
  728.         return this.createMessage(messageType, requestContext, messageInput, notifierInputStreamParams,
  729.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  730.     }
  731.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportRequestContext requestContext,
  732.             byte[] messageInput, NotifierInputStreamParams notifierInputStreamParams,
  733.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  734.         return _internalCreateMessage(messageType, MessageRole.REQUEST, requestContext, messageInput, notifierInputStreamParams,  
  735.                 attachmentsProcessingMode, 0, null);
  736.     }
  737.    
  738.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportResponseContext responseContext,
  739.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams) {    
  740.         return this.createMessage(messageType, responseContext, messageInput, notifierInputStreamParams,
  741.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  742.     }
  743.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportResponseContext responseContext,
  744.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  745.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  746.         return _internalCreateMessage(messageType, MessageRole.RESPONSE, responseContext, messageInput, notifierInputStreamParams,  
  747.                 attachmentsProcessingMode, 0, null);
  748.     }
  749.    
  750.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportResponseContext responseContext,
  751.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  752.             OpenSPCoop2MessageSoapStreamReader soapStreamReader) {  
  753.         return this.createMessage(messageType, responseContext, messageInput, notifierInputStreamParams, soapStreamReader,
  754.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  755.     }
  756.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportResponseContext responseContext,
  757.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  758.             OpenSPCoop2MessageSoapStreamReader soapStreamReader,
  759.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  760.         return _internalCreateMessage(messageType, MessageRole.RESPONSE, responseContext, messageInput, notifierInputStreamParams,  
  761.                 attachmentsProcessingMode, 0, soapStreamReader);
  762.     }
  763.    
  764.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportResponseContext responseContext,
  765.             byte[] messageInput) {  
  766.         return this.createMessage(messageType, responseContext, messageInput, null,
  767.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  768.     }
  769.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportResponseContext responseContext,
  770.             byte[] messageInput,
  771.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  772.         return this.createMessage(messageType, responseContext, messageInput, null,
  773.                 attachmentsProcessingMode);
  774.     }
  775.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportResponseContext responseContext,
  776.             byte[] messageInput, NotifierInputStreamParams notifierInputStreamParams) {
  777.         return this.createMessage(messageType, responseContext, messageInput, notifierInputStreamParams,
  778.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  779.     }
  780.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, TransportResponseContext responseContext,
  781.             byte[] messageInput, NotifierInputStreamParams notifierInputStreamParams,
  782.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  783.         return _internalCreateMessage(messageType, MessageRole.RESPONSE, responseContext, messageInput, notifierInputStreamParams,  
  784.                 attachmentsProcessingMode, 0, null);
  785.     }
  786.    
  787.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, MessageRole messageRole, String contentType,
  788.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams) {    
  789.         return this.createMessage(messageType, messageRole, contentType, messageInput, notifierInputStreamParams,
  790.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  791.     }
  792.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, MessageRole messageRole, String contentType,
  793.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  794.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  795.         return _internalCreateMessage(messageType, messageRole, contentType, messageInput, notifierInputStreamParams,
  796.                 attachmentsProcessingMode, 0, null);
  797.     }
  798.    
  799.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, MessageRole messageRole, String contentType,
  800.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  801.             OpenSPCoop2MessageSoapStreamReader soapStreamReader) {  
  802.         return this.createMessage(messageType, messageRole, contentType, messageInput, notifierInputStreamParams, soapStreamReader,
  803.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  804.     }
  805.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, MessageRole messageRole, String contentType,
  806.             InputStream messageInput, NotifierInputStreamParams notifierInputStreamParams,
  807.             OpenSPCoop2MessageSoapStreamReader soapStreamReader,
  808.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  809.         return _internalCreateMessage(messageType, messageRole, contentType, messageInput, notifierInputStreamParams,
  810.                 attachmentsProcessingMode, 0, soapStreamReader);
  811.     }
  812.    
  813.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, MessageRole messageRole, String contentType,
  814.             byte[] messageInput) {  
  815.         return this.createMessage(messageType, messageRole, contentType, messageInput, null,
  816.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  817.     }
  818.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, MessageRole messageRole, String contentType,
  819.             byte[] messageInput,
  820.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  821.         return this.createMessage(messageType, messageRole, contentType, messageInput, null,
  822.                 attachmentsProcessingMode);
  823.     }
  824.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, MessageRole messageRole, String contentType,
  825.             byte[] messageInput, NotifierInputStreamParams notifierInputStreamParams) {
  826.         return this.createMessage(messageType, messageRole, contentType, messageInput, notifierInputStreamParams,
  827.                 AttachmentsProcessingMode.getMemoryCacheProcessingMode());
  828.     }
  829.     public OpenSPCoop2MessageParseResult createMessage(MessageType messageType, MessageRole messageRole, String contentType,
  830.             byte[] messageInput, NotifierInputStreamParams notifierInputStreamParams,
  831.             AttachmentsProcessingMode attachmentsProcessingMode) {  
  832.         return _internalCreateMessage(messageType, messageRole, contentType, messageInput, notifierInputStreamParams,
  833.                 attachmentsProcessingMode, 0, null);
  834.     }
  835.    
  836.    
  837.    
  838.    
  839.     /*
  840.      * Enveloping
  841.      */
  842.    
  843.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, String contentTypeForEnvelope, String soapAction,
  844.             TransportRequestContext requestContext,
  845.             InputStream messageInput,NotifierInputStreamParams notifierInputStreamParams,
  846.             boolean eraserXmlTag,
  847.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  848.         return envelopingMessage(messageType, contentTypeForEnvelope, soapAction, requestContext,
  849.                 messageInput, notifierInputStreamParams, AttachmentsProcessingMode.getMemoryCacheProcessingMode(), eraserXmlTag,
  850.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  851.     }
  852.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, String contentTypeForEnvelope, String soapAction,
  853.             TransportRequestContext requestContext,
  854.             InputStream messageInput,NotifierInputStreamParams notifierInputStreamParams,
  855.             AttachmentsProcessingMode attachmentsProcessingMode,
  856.             boolean eraserXmlTag,
  857.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  858.         return this._internalEnvelopingMessage(messageType, MessageRole.REQUEST, contentTypeForEnvelope, soapAction, requestContext,
  859.                 messageInput, notifierInputStreamParams, attachmentsProcessingMode, eraserXmlTag,
  860.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  861.     }
  862.    
  863.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, String contentTypeForEnvelope, String soapAction,
  864.             TransportRequestContext requestContext,
  865.             byte[] messageInput,NotifierInputStreamParams notifierInputStreamParams,
  866.             boolean eraserXmlTag,
  867.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  868.         return envelopingMessage(messageType, contentTypeForEnvelope, soapAction, requestContext,
  869.                 messageInput, notifierInputStreamParams, AttachmentsProcessingMode.getMemoryCacheProcessingMode(), eraserXmlTag,
  870.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  871.     }
  872.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, String contentTypeForEnvelope, String soapAction,
  873.             TransportRequestContext requestContext,
  874.             byte[] messageInput,NotifierInputStreamParams notifierInputStreamParams,
  875.             AttachmentsProcessingMode attachmentsProcessingMode,
  876.             boolean eraserXmlTag,
  877.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  878.         return this._internalEnvelopingMessage(messageType, MessageRole.REQUEST, contentTypeForEnvelope, soapAction, requestContext,
  879.                 messageInput, notifierInputStreamParams, attachmentsProcessingMode, eraserXmlTag,
  880.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  881.     }
  882.    
  883.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, String contentTypeForEnvelope, String soapAction,
  884.             TransportResponseContext responseContext,
  885.             InputStream messageInput,NotifierInputStreamParams notifierInputStreamParams,
  886.             boolean eraserXmlTag,
  887.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  888.         return envelopingMessage(messageType, contentTypeForEnvelope, soapAction, responseContext,
  889.                 messageInput, notifierInputStreamParams, AttachmentsProcessingMode.getMemoryCacheProcessingMode(), eraserXmlTag,
  890.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  891.     }
  892.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, String contentTypeForEnvelope, String soapAction,
  893.             TransportResponseContext responseContext,
  894.             InputStream messageInput,NotifierInputStreamParams notifierInputStreamParams,
  895.             AttachmentsProcessingMode attachmentsProcessingMode,
  896.             boolean eraserXmlTag,
  897.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  898.         return this._internalEnvelopingMessage(messageType, MessageRole.RESPONSE, contentTypeForEnvelope, soapAction, responseContext,
  899.                 messageInput, notifierInputStreamParams, attachmentsProcessingMode, eraserXmlTag,
  900.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  901.     }
  902.    
  903.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, String contentTypeForEnvelope, String soapAction,
  904.             TransportResponseContext responseContext,
  905.             byte[] messageInput,NotifierInputStreamParams notifierInputStreamParams,
  906.             boolean eraserXmlTag,
  907.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  908.         return envelopingMessage(messageType, contentTypeForEnvelope, soapAction, responseContext,
  909.                 messageInput, notifierInputStreamParams, AttachmentsProcessingMode.getMemoryCacheProcessingMode(), eraserXmlTag,
  910.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  911.     }
  912.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, String contentTypeForEnvelope, String soapAction,
  913.             TransportResponseContext responseContext,
  914.             byte[] messageInput,NotifierInputStreamParams notifierInputStreamParams,
  915.             AttachmentsProcessingMode attachmentsProcessingMode,
  916.             boolean eraserXmlTag,
  917.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  918.         return this._internalEnvelopingMessage(messageType, MessageRole.RESPONSE, contentTypeForEnvelope, soapAction, responseContext,
  919.                 messageInput, notifierInputStreamParams, attachmentsProcessingMode, eraserXmlTag,
  920.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  921.     }
  922.    
  923.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, MessageRole messageRole,
  924.             String contentTypeForEnvelope, String soapAction,
  925.             InputStream messageInput,NotifierInputStreamParams notifierInputStreamParams,
  926.             boolean eraserXmlTag,
  927.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  928.         return envelopingMessage(messageType, messageRole, contentTypeForEnvelope, soapAction,
  929.                 messageInput, notifierInputStreamParams, AttachmentsProcessingMode.getMemoryCacheProcessingMode(), eraserXmlTag,
  930.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  931.     }
  932.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, MessageRole messageRole,
  933.             String contentTypeForEnvelope, String soapAction,
  934.             InputStream messageInput,NotifierInputStreamParams notifierInputStreamParams,
  935.             AttachmentsProcessingMode attachmentsProcessingMode,
  936.             boolean eraserXmlTag,
  937.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  938.         return this._internalEnvelopingMessage(messageType, messageRole, contentTypeForEnvelope, soapAction, null,
  939.                 messageInput, notifierInputStreamParams, attachmentsProcessingMode, eraserXmlTag,
  940.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  941.     }
  942.    
  943.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, MessageRole messageRole,
  944.             String contentTypeForEnvelope, String soapAction,
  945.             byte[] messageInput,NotifierInputStreamParams notifierInputStreamParams,
  946.             boolean eraserXmlTag,
  947.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  948.         return envelopingMessage(messageType, messageRole, contentTypeForEnvelope, soapAction,
  949.                 messageInput, notifierInputStreamParams, AttachmentsProcessingMode.getMemoryCacheProcessingMode(), eraserXmlTag,
  950.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  951.     }
  952.     public OpenSPCoop2MessageParseResult envelopingMessage(MessageType messageType, MessageRole messageRole,
  953.             String contentTypeForEnvelope, String soapAction,
  954.             byte[] messageInput,NotifierInputStreamParams notifierInputStreamParams,
  955.             AttachmentsProcessingMode attachmentsProcessingMode,
  956.             boolean eraserXmlTag,
  957.             boolean useSoapMessageReader, int soapMessageReaderBufferThresholdKb) {
  958.         return this._internalEnvelopingMessage(messageType, messageRole, contentTypeForEnvelope, soapAction, null,
  959.                 messageInput, notifierInputStreamParams, attachmentsProcessingMode, eraserXmlTag,
  960.                 useSoapMessageReader, soapMessageReaderBufferThresholdKb);
  961.     }
  962.    
  963.    
  964.    
  965.        
  966.     /*
  967.      * Messaggi
  968.      */
  969.    
  970.     public OpenSPCoop2Message createMessage(MessageType messageType, MessageRole role, SOAPMessage msg) throws MessageException{
  971.         return this._internalCreateMessage(messageType, role, msg);
  972.     }
  973.    
  974.    
  975.    
  976.     /*
  977.      * Messaggi vuoti
  978.      */
  979.    
  980.     public OpenSPCoop2Message createEmptyMessage(MessageType messageType, MessageRole role) {
  981.         return this.createEmptyMessage(messageType,role, null);
  982.     }
  983.     public OpenSPCoop2Message createEmptyMessage(MessageType messageType, MessageRole role, NotifierInputStreamParams notifierInputStreamParams) {
  984.         try{
  985.             // Fix per performance: creare un messaggio vuoto tramite il meccanismo sottostante, faceva utilizzare il metodo 'createMessage -> _internalCreateMessage' che portava
  986.             // a richiemare la struttura del messaggio tramite il controllo: op2Msg.castAsSoap().getSOAPHeader(); // Verifica struttura
  987.             // Tale controllo era costoso in termini di performance per questi messaggi vuoti.
  988.             /*
  989.             if(MessageType.SOAP_11.equals(messageType) || MessageType.SOAP_12.equals(messageType)){
  990.                
  991.                 byte[] xml = null;
  992.                 if(MessageType.SOAP_11.equals(messageType)){
  993.                     xml = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Body/></SOAP-ENV:Envelope>".getBytes();
  994.                 }
  995.                 else if(MessageType.SOAP_12.equals(messageType)){
  996.                     xml = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://www.w3.org/2003/05/soap-envelope\"><SOAP-ENV:Body/></SOAP-ENV:Envelope>".getBytes();
  997.                 }
  998.                
  999.                 OpenSPCoop2MessageParseResult result = this.createMessage(messageType, role , MessageUtilities.getDefaultContentType(messageType),
  1000.                         xml, notifierInputStreamParams);
  1001.                 if(result.getParseException()!=null){
  1002.                     // non dovrebbe succedere
  1003.                     throw result.getParseException().getSourceException();
  1004.                 }
  1005.                 return result.getMessage();
  1006.             }
  1007.             else{
  1008.             */
  1009.             OpenSPCoop2Message msgEmpty = _internalCreateEmptyMessage(messageType, role);
  1010.             if(MessageType.SOAP_11.equals(messageType) || MessageType.SOAP_12.equals(messageType)){
  1011.                 msgEmpty.setContentType(MessageUtilities.getDefaultContentType(messageType));
  1012.             }
  1013.             return msgEmpty;
  1014.             //}
  1015.                
  1016.         }catch(Throwable e){
  1017.             System.err.println("Exception non gestibile durante la creazione di un messaggio vuoto. " + e);
  1018.             e.printStackTrace(System.err);
  1019.         }
  1020.         return null;
  1021.        
  1022.     }
  1023.    
  1024.     /*
  1025.      * Messaggi di Errore
  1026.      */
  1027.        
  1028.     public OpenSPCoop2Message createFaultMessage(MessageType messageType, boolean useProblemRFC7807, FaultBuilderConfig faultBuilderConfig) {
  1029.         return this.createFaultMessage(messageType, useProblemRFC7807, faultBuilderConfig, Costanti.DEFAULT_SOAP_FAULT_STRING,null);
  1030.     }
  1031.     public OpenSPCoop2Message createFaultMessage(MessageType messageType, boolean useProblemRFC7807) {
  1032.         return this.createFaultMessage(messageType, useProblemRFC7807, Costanti.DEFAULT_SOAP_FAULT_STRING,null);
  1033.     }
  1034.    
  1035.     public OpenSPCoop2Message createFaultMessage(MessageType messageType, boolean useProblemRFC7807, FaultBuilderConfig faultBuilderConfig, NotifierInputStreamParams notifierInputStreamParams) {
  1036.         return createFaultMessage(messageType, useProblemRFC7807, faultBuilderConfig, Costanti.DEFAULT_SOAP_FAULT_STRING,notifierInputStreamParams);
  1037.     }
  1038.     public OpenSPCoop2Message createFaultMessage(MessageType messageType, boolean useProblemRFC7807, NotifierInputStreamParams notifierInputStreamParams) {
  1039.         return createFaultMessage(messageType, useProblemRFC7807, Costanti.DEFAULT_SOAP_FAULT_STRING,notifierInputStreamParams);
  1040.     }
  1041.    
  1042.     public OpenSPCoop2Message createFaultMessage(MessageType messageType,boolean useProblemRFC7807, FaultBuilderConfig faultBuilderConfig, Throwable t) {
  1043.         return this.createFaultMessage(messageType,useProblemRFC7807, faultBuilderConfig, t,null);
  1044.     }
  1045.     public OpenSPCoop2Message createFaultMessage(MessageType messageType,boolean useProblemRFC7807, Throwable t) {
  1046.         return this.createFaultMessage(messageType,useProblemRFC7807, t,null);
  1047.     }
  1048.    
  1049.     public OpenSPCoop2Message createFaultMessage(MessageType messageType,boolean useProblemRFC7807, FaultBuilderConfig faultBuilderConfig,
  1050.             Throwable t,NotifierInputStreamParams notifierInputStreamParams) {
  1051.         return createFaultMessage(messageType, useProblemRFC7807, faultBuilderConfig,t!=null ? t.getMessage() : "Internal Error",notifierInputStreamParams);
  1052.     }
  1053.     public OpenSPCoop2Message createFaultMessage(MessageType messageType,boolean useProblemRFC7807,
  1054.             Throwable t,NotifierInputStreamParams notifierInputStreamParams) {
  1055.         return createFaultMessage(messageType, useProblemRFC7807, t.getMessage(),notifierInputStreamParams);
  1056.     }
  1057.    
  1058.     public OpenSPCoop2Message createFaultMessage(MessageType messageType, boolean useProblemRFC7807, FaultBuilderConfig faultBuilderConfig,
  1059.             String errore) {
  1060.         return this.createFaultMessage(messageType, useProblemRFC7807, faultBuilderConfig, errore,null);
  1061.     }
  1062.     public OpenSPCoop2Message createFaultMessage(MessageType messageType, boolean useProblemRFC7807,
  1063.             String errore) {
  1064.         return this.createFaultMessage(messageType, useProblemRFC7807, errore,null);
  1065.     }
  1066.    
  1067.     public OpenSPCoop2Message createFaultMessage(MessageType messageType,boolean useProblemRFC7807,
  1068.             String errore,NotifierInputStreamParams notifierInputStreamParams){
  1069.         return this.createFaultMessage(messageType, useProblemRFC7807, null, errore, notifierInputStreamParams);
  1070.     }
  1071.     public OpenSPCoop2Message createFaultMessage(MessageType messageType,boolean useProblemRFC7807, FaultBuilderConfig faultBuilderConfig,
  1072.             String erroreParam,NotifierInputStreamParams notifierInputStreamParams){
  1073.    
  1074.         if(faultBuilderConfig==null) {
  1075.             faultBuilderConfig = new FaultBuilderConfig();
  1076.         }
  1077.         if(faultBuilderConfig.getHttpReturnCode()==null) {
  1078.             faultBuilderConfig.setHttpReturnCode(503);
  1079.         }
  1080.         if(faultBuilderConfig.getGovwayReturnCode()==null) {
  1081.             faultBuilderConfig.setGovwayReturnCode(faultBuilderConfig.getHttpReturnCode());
  1082.         }
  1083.        
  1084.         String errore = erroreParam;
  1085.         if(faultBuilderConfig.getDetails()!=null) {
  1086.             errore = faultBuilderConfig.getDetails();
  1087.         }
  1088.        
  1089.         if(messageType==null) {
  1090.             messageType = MessageType.BINARY;
  1091.         }
  1092.        
  1093.         try{
  1094.             String fault = null;
  1095.             String contentType = MessageUtilities.getDefaultContentType(messageType);
  1096.             if(MessageType.SOAP_11.equals(messageType)){
  1097.                
  1098.                 String prefixSoap = "SOAP-ENV";
  1099.                 if(faultBuilderConfig.getPrefixSoap()!=null) {
  1100.                     prefixSoap = faultBuilderConfig.getPrefixSoap();
  1101.                 }
  1102.                
  1103.                 fault = "<"+prefixSoap+":Envelope xmlns:"+prefixSoap+"=\"http://schemas.xmlsoap.org/soap/envelope/\">"
  1104.                         +"<"+prefixSoap+":Header/><"+prefixSoap+":Body>"
  1105.                         +"<"+prefixSoap+":Fault>";
  1106.                 if(faultBuilderConfig.getErrorCode()!=null) {
  1107.                     if(prefixSoap.equals(faultBuilderConfig.getErrorCode().getPrefix())) {
  1108.                         fault = fault
  1109.                                 +"<faultcode>"+faultBuilderConfig.getErrorCode().getPrefix()+":"+faultBuilderConfig.getErrorCode().getLocalPart()+"</faultcode>";
  1110.                     }
  1111.                     else {
  1112.                         fault = fault
  1113.                                 +"<faultcode xmlns:"+faultBuilderConfig.getErrorCode().getPrefix()+"=\""+faultBuilderConfig.getErrorCode().getNamespaceURI()+
  1114.                                         "\">"+faultBuilderConfig.getErrorCode().getPrefix()+":"+faultBuilderConfig.getErrorCode().getLocalPart()+"</faultcode>";
  1115.                     }
  1116.                 }
  1117.                 else {
  1118.                     fault = fault      
  1119.                             +"<faultcode>"+prefixSoap+":"+Costanti.SOAP11_FAULT_CODE_SERVER+"</faultcode>";
  1120.                 }
  1121.                 fault = fault
  1122.                         +"<faultstring>" + errore + "</faultstring>";
  1123.                 if(faultBuilderConfig.getActor()!=null) {
  1124.                     fault = fault
  1125.                             +"<faultactor>"+faultBuilderConfig.getActor()+"</faultactor>";
  1126.                 }
  1127.                 else {
  1128.                     fault = fault
  1129.                             +"<faultactor>"+Costanti.DEFAULT_SOAP_FAULT_ACTOR+"</faultactor>";
  1130.                 }
  1131.                 fault = fault
  1132.                         +"</"+prefixSoap+":Fault>"
  1133.                         +"</"+prefixSoap+":Body></"+prefixSoap+":Envelope>";
  1134.             }
  1135.             else if(MessageType.SOAP_12.equals(messageType)){
  1136.                
  1137.                 String prefixSoap = "env";
  1138.                 if(faultBuilderConfig.getPrefixSoap()!=null) {
  1139.                     prefixSoap = faultBuilderConfig.getPrefixSoap();
  1140.                 }
  1141.                
  1142.                 String code12 = Costanti.SOAP12_FAULT_CODE_SERVER;
  1143.                 if(faultBuilderConfig.getGovwayReturnCode()!=null) {
  1144.                     if(faultBuilderConfig.getGovwayReturnCode()<=499) {
  1145.                         code12 = Costanti.SOAP12_FAULT_CODE_CLIENT;
  1146.                     }
  1147.                 }
  1148.                 fault = "<"+prefixSoap+":Envelope xmlns:"+prefixSoap+"=\"http://www.w3.org/2003/05/soap-envelope\">"
  1149.                         +"<"+prefixSoap+":Header/><"+prefixSoap+":Body>"
  1150.                         +"<"+prefixSoap+":Fault>"
  1151.                         +"<"+prefixSoap+":Code><"+prefixSoap+":Value>"+prefixSoap+":"+code12+"</"+prefixSoap+":Value>";
  1152.                 if(faultBuilderConfig.getErrorCode()!=null) {
  1153.                     fault = fault
  1154.                             +"<"+prefixSoap+":Subcode><"+prefixSoap+":Value xmlns:"+faultBuilderConfig.getErrorCode().getPrefix()+"=\""+faultBuilderConfig.getErrorCode().getNamespaceURI()+
  1155.                                 "\">"+faultBuilderConfig.getErrorCode().getPrefix()+":"+faultBuilderConfig.getErrorCode().getLocalPart()+"</"+prefixSoap+":Value></"+prefixSoap+":Subcode>";
  1156.                 }
  1157.                 fault = fault  
  1158.                         +"</"+prefixSoap+":Code>"
  1159.                         +"<"+prefixSoap+":Reason><"+prefixSoap+":Text xml:lang=\"en-US\">" + errore + "</"+prefixSoap+":Text></"+prefixSoap+":Reason>";
  1160.                 if(faultBuilderConfig.getActor()!=null) {
  1161.                     fault = fault
  1162.                             +"<"+prefixSoap+":Role>"+faultBuilderConfig.getActor()+"</"+prefixSoap+":Role>";
  1163.                 }
  1164.                 else {
  1165.                     fault = fault
  1166.                             +"<"+prefixSoap+":Role>"+Costanti.DEFAULT_SOAP_FAULT_ACTOR+"</"+prefixSoap+":Role>";
  1167.                 }
  1168.                 fault = fault
  1169.                         +"</"+prefixSoap+":Fault>"
  1170.                         +"</"+prefixSoap+":Body></"+prefixSoap+":Envelope>";
  1171.             }
  1172.             else if(MessageType.XML.equals(messageType)){
  1173.                 if(useProblemRFC7807) {
  1174.                     ProblemRFC7807Builder builder = null;
  1175.                     if(faultBuilderConfig.isRfc7807Type()) {
  1176.                         if(faultBuilderConfig.getRfc7807WebSite()!=null) {
  1177.                             builder = new ProblemRFC7807Builder(faultBuilderConfig.getRfc7807WebSite());
  1178.                         }
  1179.                         else {
  1180.                             builder = new ProblemRFC7807Builder(true);
  1181.                         }
  1182.                     }
  1183.                     else {
  1184.                         builder = new ProblemRFC7807Builder(false);
  1185.                     }
  1186.                     ProblemRFC7807 problemRFC7807 = builder.buildProblem(faultBuilderConfig.getGovwayReturnCode());
  1187.                     if(faultBuilderConfig.getRfc7807Title()!=null) {
  1188.                         problemRFC7807.setTitle(faultBuilderConfig.getRfc7807Title());
  1189.                     }
  1190.                     if(errore!=null && !Costanti.DEFAULT_SOAP_FAULT_STRING.equals(errore)) {
  1191.                         problemRFC7807.setDetail(errore);
  1192.                     }
  1193.                     XmlSerializer xmlSerializer = new XmlSerializer();
  1194.                     fault = xmlSerializer.toString(problemRFC7807);
  1195.                     contentType = HttpConstants.CONTENT_TYPE_XML_PROBLEM_DETAILS_RFC_7807;
  1196.                 }else {
  1197.                     fault = "<op2:Fault xmlns:op2=\""+(faultBuilderConfig.getActor()!=null ? faultBuilderConfig.getActor() : Costanti.DEFAULT_SOAP_FAULT_ACTOR)+"\">"
  1198.                             +"<op2:Message>"+errore+"</op2:Message>"
  1199.                             +"</op2:Fault>";
  1200.                 }
  1201.             }
  1202.             else if(MessageType.JSON.equals(messageType)){
  1203.                 if(useProblemRFC7807) {
  1204.                     ProblemRFC7807Builder builder = null;
  1205.                     if(faultBuilderConfig.isRfc7807Type()) {
  1206.                         if(faultBuilderConfig.getRfc7807WebSite()!=null) {
  1207.                             builder = new ProblemRFC7807Builder(faultBuilderConfig.getRfc7807WebSite());
  1208.                         }
  1209.                         else {
  1210.                             builder = new ProblemRFC7807Builder(true);
  1211.                         }
  1212.                     }
  1213.                     else {
  1214.                         builder = new ProblemRFC7807Builder(false);
  1215.                     }
  1216.                     ProblemRFC7807 problemRFC7807 = builder.buildProblem(faultBuilderConfig.getGovwayReturnCode());
  1217.                     if(faultBuilderConfig.getRfc7807Title()!=null) {
  1218.                         problemRFC7807.setTitle(faultBuilderConfig.getRfc7807Title());
  1219.                     }
  1220.                     if(errore!=null && !Costanti.DEFAULT_SOAP_FAULT_STRING.equals(errore)) {
  1221.                         problemRFC7807.setDetail(errore);
  1222.                     }
  1223.                     JsonSerializer jsonSerializer = new JsonSerializer();
  1224.                     fault = jsonSerializer.toString(problemRFC7807);
  1225.                     contentType = HttpConstants.CONTENT_TYPE_JSON_PROBLEM_DETAILS_RFC_7807;
  1226.                 }else {
  1227.                     fault = "{ \"fault\" : { \"message\" : \""+errore+"\" , \"namespace\" : \""+(faultBuilderConfig.getActor()!=null ? faultBuilderConfig.getActor() : Costanti.DEFAULT_SOAP_FAULT_ACTOR)+"\" } }";
  1228.                 }
  1229.             }
  1230.             else{
  1231.                 // default uso xml
  1232. //              fault = "<op2:Fault xmlns:op2=\""+Costanti.DEFAULT_SOAP_FAULT_ACTOR+"\">"
  1233. //                      +"<op2:Message>"+errore+"</op2:Message>"
  1234. //                      +"</op2:Fault>";
  1235. //              contentType = MessageUtilities.getDefaultContentType(MessageType.XML);
  1236.                
  1237.                 // modifica default in json
  1238.                 if(useProblemRFC7807) {
  1239.                     ProblemRFC7807Builder builder = null;
  1240.                     if(faultBuilderConfig.isRfc7807Type()) {
  1241.                         if(faultBuilderConfig.getRfc7807WebSite()!=null) {
  1242.                             builder = new ProblemRFC7807Builder(faultBuilderConfig.getRfc7807WebSite());
  1243.                         }
  1244.                         else {
  1245.                             builder = new ProblemRFC7807Builder(true);
  1246.                         }
  1247.                     }
  1248.                     else {
  1249.                         builder = new ProblemRFC7807Builder(false);
  1250.                     }
  1251.                     ProblemRFC7807 problemRFC7807 = builder.buildProblem(faultBuilderConfig.getGovwayReturnCode());
  1252.                     if(faultBuilderConfig.getRfc7807Title()!=null) {
  1253.                         problemRFC7807.setTitle(faultBuilderConfig.getRfc7807Title());
  1254.                     }
  1255.                     if(errore!=null && !Costanti.DEFAULT_SOAP_FAULT_STRING.equals(errore)) {
  1256.                         problemRFC7807.setDetail(errore);
  1257.                     }
  1258.                     if(faultBuilderConfig.getRfc7807GovWayTypeHeaderErrorTypeName()!=null && faultBuilderConfig.getRfc7807GovWayTypeHeaderErrorTypeValue()!=null) {
  1259.                         problemRFC7807.getCustom().put(faultBuilderConfig.getRfc7807GovWayTypeHeaderErrorTypeName(),
  1260.                                 faultBuilderConfig.getRfc7807GovWayTypeHeaderErrorTypeValue());
  1261.                     }
  1262.                     JsonSerializer jsonSerializer = new JsonSerializer();
  1263.                     fault = jsonSerializer.toString(problemRFC7807);
  1264.                     contentType = HttpConstants.CONTENT_TYPE_JSON_PROBLEM_DETAILS_RFC_7807;
  1265.                 }else {
  1266.                     fault = "{ \"fault\" : { \"message\" : \""+errore+"\" , \"namespace\" : \""+(faultBuilderConfig.getActor()!=null ? faultBuilderConfig.getActor() : Costanti.DEFAULT_SOAP_FAULT_ACTOR)+"\" } }";
  1267.                     contentType = MessageUtilities.getDefaultContentType(MessageType.JSON);
  1268.                 }
  1269.             }
  1270.            
  1271.             //System.out.println("XML ["+versioneSoap+"] ["+xml+"]");
  1272.            
  1273.             byte[] xmlByte = fault.getBytes();
  1274.             OpenSPCoop2MessageParseResult result = this.createMessage(messageType, MessageRole.FAULT , contentType,
  1275.                     xmlByte, notifierInputStreamParams);
  1276.             if(result.getParseException()!=null){
  1277.                 // non dovrebbe succedere
  1278.                 throw result.getParseException().getSourceException();
  1279.             }
  1280.             OpenSPCoop2Message msg = result.getMessage();
  1281.            
  1282.             msg.addContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY, useProblemRFC7807 ?
  1283.                     org.openspcoop2.message.constants.Costanti.TIPO_RFC7807 : org.openspcoop2.message.constants.Costanti.TIPO_GOVWAY );
  1284.            
  1285.             if(faultBuilderConfig.getErrorCode()!=null) {
  1286.                 if(faultBuilderConfig.getErrorCode().getPrefix()!=null) {
  1287.                     msg.addContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY_PREFIX_CODE, faultBuilderConfig.getErrorCode().getPrefix() );
  1288.                 }
  1289.                 if(faultBuilderConfig.getErrorCode().getLocalPart()!=null) {
  1290.                     msg.addContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY_CODE, faultBuilderConfig.getErrorCode().getLocalPart() );
  1291.                 }
  1292.                 msg.addContextProperty(org.openspcoop2.message.constants.Costanti.ERRORE_GOVWAY_DETAILS, errore );
  1293.             }
  1294.            
  1295.             if(faultBuilderConfig.getHeaderErrorTypeName()!=null && faultBuilderConfig.getHeaderErrorTypeValue()!=null) {
  1296.                 msg.forceTransportHeader(faultBuilderConfig.getHeaderErrorTypeName(), faultBuilderConfig.getHeaderErrorTypeValue());
  1297.             }
  1298.            
  1299.             msg.setForcedResponseCode(faultBuilderConfig.getHttpReturnCode()+"");
  1300.            
  1301.             return msg;
  1302.         }
  1303.         catch(Throwable e){
  1304.             System.err.println("Exception non gestibile durante la creazione di un Fault. " + e);
  1305.             e.printStackTrace(System.err);
  1306.         }
  1307.         return null;
  1308.     }
  1309.    
  1310.     public static boolean isFaultXmlMessage(Node nodeXml){
  1311.         try{
  1312.             //System.out.println("LOCAL["+Costanti.ROOT_LOCAL_NAME_ERRORE_APPLICATIVO+"]vs["+nodeXml.getLocalName()+"]  NAMESPACE["+Costanti.TARGET_NAMESPACE+"]vs["+nodeXml.getNamespaceURI()+"]");
  1313.             if("Fault".equals(nodeXml.getLocalName()) &&
  1314.                     Costanti.DEFAULT_SOAP_FAULT_ACTOR.equals(nodeXml.getNamespaceURI() )
  1315.                 ){
  1316.                 return true;
  1317.             }
  1318.             else{
  1319.                 return false;
  1320.             }
  1321.         }catch(Exception e){
  1322.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  1323.             return false;
  1324.         }
  1325.     }
  1326.     public static boolean isFaultJsonMessage(String jsonBody, Logger log){
  1327.         try{
  1328.             String namespace = JsonPathExpressionEngine.extractAndConvertResultAsString(jsonBody, "$.fault.namespace", log);
  1329.             if(namespace!=null && Costanti.DEFAULT_SOAP_FAULT_ACTOR.equals(namespace)) {
  1330.                 return true;
  1331.             }
  1332.             return  false;
  1333.         }catch(Exception e){
  1334.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  1335.             return false;
  1336.         }
  1337.     }

  1338. }