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.UtilsRuntimeException;
  45. import org.openspcoop2.utils.io.notifier.NotifierInputStream;
  46. import org.openspcoop2.utils.io.notifier.NotifierInputStreamParams;
  47. import org.openspcoop2.utils.json.JsonPathExpressionEngine;
  48. import org.openspcoop2.utils.mime.MultipartUtils;
  49. import org.openspcoop2.utils.resources.Loader;
  50. import org.openspcoop2.utils.rest.problem.JsonSerializer;
  51. import org.openspcoop2.utils.rest.problem.ProblemRFC7807;
  52. import org.openspcoop2.utils.rest.problem.ProblemRFC7807Builder;
  53. import org.openspcoop2.utils.rest.problem.XmlSerializer;
  54. import org.openspcoop2.utils.transport.TransportRequestContext;
  55. import org.openspcoop2.utils.transport.TransportResponseContext;
  56. import org.openspcoop2.utils.transport.TransportUtils;
  57. import org.openspcoop2.utils.transport.http.ContentTypeUtilities;
  58. import org.openspcoop2.utils.transport.http.HttpConstants;
  59. import org.slf4j.Logger;
  60. import org.w3c.dom.Document;
  61. import org.w3c.dom.Element;
  62. import org.w3c.dom.Node;

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


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

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

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

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

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

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

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

  1351. }