MessageUtils.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.InputStream;

  22. import javax.mail.BodyPart;
  23. import javax.xml.soap.SOAPEnvelope;
  24. import javax.xml.soap.SOAPMessage;
  25. import javax.xml.soap.SOAPPart;

  26. import org.openspcoop2.message.constants.MessageType;
  27. import org.openspcoop2.message.exception.MessageException;
  28. import org.openspcoop2.message.rest.MultipartContent;
  29. import org.openspcoop2.message.soap.AbstractOpenSPCoop2Message_soap_impl;
  30. import org.openspcoop2.message.xml.MessageXMLUtils;
  31. import org.openspcoop2.utils.Utilities;
  32. import org.openspcoop2.utils.mime.MimeMultipart;
  33. import org.openspcoop2.utils.regexp.RegularExpressionEngine;
  34. import org.openspcoop2.utils.resources.Charset;
  35. import org.openspcoop2.utils.transport.http.ContentTypeUtilities;
  36. import org.openspcoop2.utils.transport.http.HttpConstants;
  37. import org.w3c.dom.Element;

  38. /**
  39.  * MessageUtils
  40.  *
  41.  *
  42.  * @author Poli Andrea (apoli@link.it)
  43.  * @author $Author$
  44.  * @version $Rev$, $Date$
  45.  */
  46. public class MessageUtils {

  47.     public static void registerParseException(OpenSPCoop2Message msg, Throwable e){
  48.         registerParseException(msg, e, false);
  49.     }

  50.     public static void registerParseException(OpenSPCoop2Message o, Throwable e, boolean allException){
  51.         if(o!=null && o.getParseException()==null){
  52.             if(allException){
  53.                 o.setParseException(e);
  54.             }
  55.             else{
  56.                 Throwable t = org.openspcoop2.message.exception.ParseExceptionUtils.getParseException(e);
  57.                 if(t!=null){
  58.                     o.setParseException(t);
  59.                 }
  60.             }
  61.            
  62.         }
  63.     }
  64.    
  65.     public static SOAPMessage getSOAPMessage(OpenSPCoop2SoapMessage soapMessage, boolean bufferMessage_readOnly, String idTransazione) throws MessageException {
  66.         try {
  67.             if(soapMessage instanceof AbstractOpenSPCoop2Message_soap_impl<?>) {
  68.                 AbstractOpenSPCoop2Message_soap_impl<?> soap = (AbstractOpenSPCoop2Message_soap_impl<?>)soapMessage;
  69.                 return soap.getContent(bufferMessage_readOnly, idTransazione).getSOAPMessage();
  70.             }
  71.             else {
  72.                 return soapMessage.getSOAPMessage();
  73.             }
  74.         }catch(MessageException me) {
  75.             throw me;
  76.         }
  77.         catch(Exception e){
  78.             throw new MessageException(e.getMessage(),e);
  79.         }
  80.     }
  81.    
  82.     public static SOAPPart getSOAPPart(OpenSPCoop2SoapMessage soapMessage, boolean bufferMessage_readOnly, String idTransazione) throws MessageException {
  83.         try {
  84.             if(soapMessage instanceof AbstractOpenSPCoop2Message_soap_impl<?>) {
  85.                 AbstractOpenSPCoop2Message_soap_impl<?> soap = (AbstractOpenSPCoop2Message_soap_impl<?>)soapMessage;
  86.                 return soap.getContent(bufferMessage_readOnly, idTransazione).getSOAPPart();
  87.             }
  88.             else {
  89.                 return soapMessage.getSOAPPart();
  90.             }
  91.         }catch(MessageException me) {
  92.             throw me;
  93.         }
  94.         catch(Exception e){
  95.             throw new MessageException(e.getMessage(),e);
  96.         }
  97.     }
  98.    
  99.     public static Element getContentElement(OpenSPCoop2Message msg, boolean checkSoapBodyEmpty, boolean bufferMessage_readOnly, String idTransazione) throws MessageException {
  100.         try {
  101.             if(MessageType.SOAP_11.equals(msg.getMessageType()) || MessageType.SOAP_12.equals(msg.getMessageType())) {
  102.                 OpenSPCoop2SoapMessage soapMessage = msg.castAsSoap();
  103.                 if(!soapMessage.isSOAPBodyEmpty() || !checkSoapBodyEmpty) {
  104.                     SOAPPart soapPart = getSOAPPart(soapMessage, bufferMessage_readOnly, idTransazione);
  105.                     if(soapPart==null){
  106.                         throw new MessageException("Messaggio (SOAPPart) non fornito");
  107.                     }
  108.                     SOAPEnvelope envelope = soapPart.getEnvelope();
  109.                     if(envelope==null){
  110.                         throw new MessageException("Envelope non fornita");
  111.                     }
  112.                     return envelope;
  113.                 }
  114.             }
  115.             else if (MessageType.XML.equals(msg.getMessageType())){
  116.                 OpenSPCoop2RestXmlMessage xmlMsg = msg.castAsRestXml();
  117.                 if(xmlMsg.hasContent()) {
  118.                     return (Element) xmlMsg.getContent(bufferMessage_readOnly, idTransazione);
  119.                 }
  120.             }
  121.             else if(MessageType.MIME_MULTIPART.equals(msg.getMessageType())) {
  122.                 // Prendo il primo part che corrisponde ad un xml
  123.                 OpenSPCoop2RestMimeMultipartMessage mimeMsg = msg.castAsRestMimeMultipart();
  124.                 if(mimeMsg.hasContent()) {
  125.                     MultipartContent mc = mimeMsg.getContent();
  126.                     if(mc!=null) {
  127.                         MimeMultipart mm = mc.getMimeMultipart();
  128.                         if(mm!=null && mm.countBodyParts()>0) {
  129.                             for (int i = 0; i < mm.countBodyParts(); i++) {
  130.                                 try {
  131.                                     BodyPart bodyPart = mm.getBodyPart(i);
  132.                                     String contentType = bodyPart.getContentType();
  133.                                     if(contentType!=null) {
  134.                                         /*
  135.                                         <mediaType messageType="xml">text/xml</mediaType>
  136.                                         <mediaType messageType="xml">application/xml</mediaType>
  137.                                         <mediaType messageType="xml" regExpr="true">.*\+xml</mediaType>
  138.                                         */
  139.                                         if(HttpConstants.CONTENT_TYPE_TEXT_XML.equals(contentType)
  140.                                                 ||
  141.                                                 HttpConstants.CONTENT_TYPE_XML.equals(contentType)
  142.                                                 ||
  143.                                                 RegularExpressionEngine.isMatch(contentType, ".*\\+xml")) {
  144.                                             InputStream is = bodyPart.getInputStream();
  145.                                             byte [] xmlBytes = Utilities.getAsByteArray(is);
  146.                                             return MessageXMLUtils.getInstance(msg.getFactory()).newElement(xmlBytes);
  147.                                         }
  148.                                     }
  149.                                 }catch(Throwable t) {}
  150.                             }
  151.                         }
  152.                     }
  153.                 }
  154.             }
  155.             return null;
  156.         }
  157.         catch(MessageException me) {
  158.             throw me;
  159.         }
  160.         catch(Exception e){
  161.             throw new MessageException(e.getMessage(),e);
  162.         }
  163.     }
  164.     public static String getContentString(OpenSPCoop2Message msg, boolean bufferMessage_readOnly, String idTransazione) throws MessageException {
  165.         try {
  166.             if(MessageType.JSON.equals(msg.getMessageType())){
  167.                 OpenSPCoop2RestJsonMessage json = msg.castAsRestJson();
  168.                 return json.getContent(bufferMessage_readOnly, idTransazione);
  169.             }
  170.             else if(MessageType.MIME_MULTIPART.equals(msg.getMessageType())) {
  171.                 // Prendo il primo part che corrisponde ad un json
  172.                 OpenSPCoop2RestMimeMultipartMessage mimeMsg = msg.castAsRestMimeMultipart();
  173.                 if(mimeMsg.hasContent()) {
  174.                     MultipartContent mc = mimeMsg.getContent();
  175.                     if(mc!=null) {
  176.                         MimeMultipart mm = mc.getMimeMultipart();
  177.                         if(mm!=null && mm.countBodyParts()>0) {
  178.                             for (int i = 0; i < mm.countBodyParts(); i++) {
  179.                                 try {
  180.                                     BodyPart bodyPart = mm.getBodyPart(i);
  181.                                     String contentType = bodyPart.getContentType();
  182.                                     if(contentType!=null) {
  183.                                         /*
  184.                                         <mediaType messageType="json">text/json</mediaType>
  185.                                         <mediaType messageType="json">text/x-json</mediaType>
  186.                                         <mediaType messageType="json">application/json</mediaType>
  187.                                         <mediaType messageType="json">application/x-json</mediaType>
  188.                                         <mediaType messageType="json" regExpr="true">.*\+json</mediaType>
  189.                                         */
  190.                                         if(HttpConstants.CONTENT_TYPE_JSON.equals(contentType)
  191.                                                 ||
  192.                                                 RegularExpressionEngine.isMatch(contentType, ".*/json|.*/x-json|.*\\+json")) {
  193.                                             InputStream is = bodyPart.getInputStream();
  194.                                             byte [] jsonBytes = Utilities.getAsByteArray(is);
  195.                                             String charset = ContentTypeUtilities.readCharsetFromContentType(contentType);
  196.                                             if(charset==null) {
  197.                                                 charset = Charset.UTF_8.getValue();
  198.                                             }
  199.                                             return new String(jsonBytes,charset);
  200.                                         }
  201.                                     }
  202.                                 }catch(Throwable t) {}
  203.                             }
  204.                         }
  205.                     }
  206.                 }
  207.             }
  208.             return null;
  209.         }
  210.         catch(MessageException me) {
  211.             throw me;
  212.         }
  213.         catch(Exception e){
  214.             throw new MessageException(e.getMessage(),e);
  215.         }
  216.     }
  217.     public static void setUpdatable(OpenSPCoop2Message msg) throws MessageException {
  218.         try {
  219.             if(MessageType.SOAP_11.equals(msg.getMessageType()) || MessageType.SOAP_12.equals(msg.getMessageType())) {
  220.                 OpenSPCoop2SoapMessage soapMessage = msg.castAsSoap();
  221.                 if(soapMessage instanceof AbstractOpenSPCoop2Message_soap_impl<?>) {
  222.                     AbstractOpenSPCoop2Message_soap_impl<?> soap = (AbstractOpenSPCoop2Message_soap_impl<?>)soapMessage;
  223.                     soap.setContentUpdatable();
  224.                 }
  225.             }
  226.             else {
  227.                 msg.castAsRest().setContentUpdatable();
  228.             }
  229.         }
  230.         catch(MessageException me) {
  231.             throw me;
  232.         }
  233.         catch(Exception e){
  234.             throw new MessageException(e.getMessage(),e);
  235.         }
  236.     }
  237.    
  238. }