XMLUtils.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.core.eccezione.errore_applicativo.utils;

  21. import java.io.ByteArrayInputStream;
  22. import java.io.ByteArrayOutputStream;
  23. import java.io.File;
  24. import java.io.FileInputStream;
  25. import java.io.InputStream;
  26. import java.io.OutputStream;
  27. import java.util.Iterator;

  28. import javax.xml.namespace.QName;
  29. import javax.xml.soap.SOAPBody;
  30. import javax.xml.soap.SOAPElement;
  31. import javax.xml.soap.SOAPFault;

  32. import org.openspcoop2.core.eccezione.errore_applicativo.DatiCooperazione;
  33. import org.openspcoop2.core.eccezione.errore_applicativo.Dominio;
  34. import org.openspcoop2.core.eccezione.errore_applicativo.Eccezione;
  35. import org.openspcoop2.core.eccezione.errore_applicativo.ErroreApplicativo;
  36. import org.openspcoop2.core.eccezione.errore_applicativo.Servizio;
  37. import org.openspcoop2.core.eccezione.errore_applicativo.Soggetto;
  38. import org.openspcoop2.core.eccezione.errore_applicativo.constants.Costanti;
  39. import org.openspcoop2.core.eccezione.errore_applicativo.utils.serializer.JsonJacksonDeserializer;
  40. import org.openspcoop2.message.OpenSPCoop2Message;
  41. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  42. import org.openspcoop2.message.OpenSPCoop2RestJsonMessage;
  43. import org.openspcoop2.message.OpenSPCoop2RestXmlMessage;
  44. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  45. import org.openspcoop2.message.xml.ValidatoreXSD;
  46. import org.openspcoop2.utils.beans.WriteToSerializerType;
  47. import org.slf4j.Logger;
  48. import org.w3c.dom.Document;
  49. import org.w3c.dom.Element;
  50. import org.w3c.dom.Node;


  51. /**
  52.  * Classe utilizzata per la generazione il detail errore-applicativo inseriti in un SOAPFault generato dalla PdD in caso di errore di processamento
  53.  *
  54.  *
  55.  * @author Poli Andrea (apoli@link.it)
  56.  * @author $Author$
  57.  * @version $Rev$, $Date$
  58.  */

  59. public class XMLUtils  {

  60.     /** Validatore XSD */
  61.     static ValidatoreXSD validatoreXSD = null;
  62.     private static synchronized void initValidatoreXSD(Logger log) throws Exception{
  63.         if(XMLUtils.validatoreXSD==null){
  64.             XMLUtils.validatoreXSD = new ValidatoreXSD(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), log,XMLUtils.class.getResourceAsStream("/openspcoopErroreApplicativo.xsd"));
  65.         }
  66.     }
  67.     public static ValidatoreXSD getValidatoreXSD(Logger log) throws Exception{
  68.         if(XMLUtils.validatoreXSD==null){
  69.             initValidatoreXSD(log);
  70.         }
  71.         return XMLUtils.validatoreXSD;
  72.     }
  73.     public static boolean validate(ErroreApplicativo erroreApplicativo,StringBuilder motivoErroreValidazione){
  74.        
  75.         int size = motivoErroreValidazione.length();
  76.        
  77.         if(erroreApplicativo.getDomain()==null){
  78.             motivoErroreValidazione.append("Dominio non definito\n");
  79.         }
  80.         else{
  81.             validate(erroreApplicativo.getDomain(), motivoErroreValidazione);
  82.         }
  83.        
  84.         if(erroreApplicativo.getTimestamp()==null){
  85.             motivoErroreValidazione.append("OraRegistrazione non definita\n");
  86.         }
  87.        
  88.         if(erroreApplicativo.getService()!=null){
  89.             validate(erroreApplicativo.getService(), motivoErroreValidazione);
  90.         }
  91.        
  92.         validate(erroreApplicativo.getException(),motivoErroreValidazione);
  93.        
  94.         if(motivoErroreValidazione.length()!=size)
  95.             return false;
  96.         else
  97.             return true;

  98.     }
  99.     private static void validate(Dominio dominio,StringBuilder motivoErroreValidazione){
  100.         if(dominio.getId()==null){
  101.             motivoErroreValidazione.append("Dominio.id non definito\n");
  102.         }
  103.         if(dominio.getRole()==null){
  104.             motivoErroreValidazione.append("Dominio.funzione non definito\n");
  105.         }
  106.         if(dominio.getModule()==null){
  107.             motivoErroreValidazione.append("Dominio.modulo non definito\n");
  108.         }
  109.         if(dominio.getOrganization()==null){
  110.             motivoErroreValidazione.append("Dominio.soggetto non definita\n");
  111.         }
  112.         else{
  113.             if(dominio.getOrganization().getType()==null){
  114.                 motivoErroreValidazione.append("Dominio.soggetto.tipo non definita\n");
  115.             }
  116.             if(dominio.getOrganization().getBase()==null){
  117.                 motivoErroreValidazione.append("Dominio.soggetto.nome non definita\n");
  118.             }
  119.         }
  120.     }
  121.     private static void validate(DatiCooperazione datiCooperazione,StringBuilder motivoErroreValidazione){
  122.         if(datiCooperazione.getSender()!=null){
  123.             validate(datiCooperazione.getSender(), motivoErroreValidazione, "mittente");
  124.         }
  125.         if(datiCooperazione.getProvider()!=null){
  126.             validate(datiCooperazione.getProvider(), motivoErroreValidazione , "destinatario");
  127.         }
  128.         if(datiCooperazione.getService()!=null){
  129.             validate(datiCooperazione.getService(), motivoErroreValidazione);
  130.         }
  131.     }
  132.     private static void validate(Soggetto soggetto,StringBuilder motivoErroreValidazione,String tipo){
  133.         if(soggetto.getId()==null){
  134.             motivoErroreValidazione.append("DatiCooperazione."+tipo+".identificativo non definita\n");
  135.         }
  136.         else{
  137.             if(soggetto.getId().getType()==null){
  138.                 motivoErroreValidazione.append("DatiCooperazione."+tipo+".identificativo.tipo non definita\n");
  139.             }
  140.             if(soggetto.getId().getBase()==null){
  141.                 motivoErroreValidazione.append("DatiCooperazione."+tipo+".identificativo.base non definita\n");
  142.             }
  143.         }
  144.         if(soggetto.getDomainId()==null){
  145.             motivoErroreValidazione.append("DatiCooperazione."+tipo+".identificativoPorta non definita\n");
  146.         }
  147.     }
  148.     private static void validate(Servizio servizio,StringBuilder motivoErroreValidazione){
  149.         if(servizio.getBase()==null){
  150.             motivoErroreValidazione.append("DatiCooperazione.servizio.base non definita\n");
  151.         }
  152.         if(servizio.getType()==null){
  153.             motivoErroreValidazione.append("DatiCooperazione.servizio.tipo non definita\n");
  154.         }
  155.     }
  156.     private static void validate(Eccezione eccezione,StringBuilder motivoErroreValidazione){
  157.         if(eccezione==null){
  158.             motivoErroreValidazione.append("Eccezione non definita\n");
  159.         }
  160.         else{
  161.             if(eccezione.getCode()==null){
  162.                 motivoErroreValidazione.append("Eccezione.codice non definito\n");
  163.             }
  164.             else{
  165.                 if(eccezione.getCode().getBase()==null){
  166.                     motivoErroreValidazione.append("Eccezione.codice.base non definito\n");
  167.                 }
  168.                 if(eccezione.getCode().getType()==null){
  169.                     motivoErroreValidazione.append("Eccezione.codice.tipo non definito\n");
  170.                 }
  171.             }
  172.             if(eccezione.getDescription()==null){
  173.                 motivoErroreValidazione.append("Eccezione.descrizione non definito\n");
  174.             }
  175.             if(eccezione.getType()==null){
  176.                 motivoErroreValidazione.append("Eccezione.tipo non definito\n");
  177.             }
  178.         }
  179.     }
  180.    
  181.    
  182.     /* ----- Unmarshall ----- */
  183.    
  184.     /**
  185.      * Ritorna la rappresentazione java
  186.      *
  187.      * @param m byte[]
  188.      * @return ErroreApplicativo
  189.      * @throws XMLUtilsException
  190.      */
  191.     public static ErroreApplicativo getErroreApplicativo(Logger log,byte[] m) throws XMLUtilsException{
  192.         ByteArrayInputStream bin = null;
  193.         try{
  194.             bin = new ByteArrayInputStream(m);
  195.             return XMLUtils.getErroreApplicativo(log,bin);
  196.         }catch(Exception e){
  197.             throw new XMLUtilsException(e.getMessage(),e);
  198.         }finally{
  199.             try{
  200.                 if(bin!=null)
  201.                     bin.close();
  202.             }catch(Exception eClose){
  203.                 // close
  204.             }
  205.         }
  206.     }
  207.    
  208.     /**
  209.      * Ritorna la rappresentazione java
  210.      *
  211.      * @param m File
  212.      * @return ErroreApplicativo
  213.      * @throws XMLUtilsException
  214.      */
  215.     public static ErroreApplicativo getErroreApplicativo(Logger log,File m) throws XMLUtilsException{
  216.         FileInputStream fin = null;
  217.         try{
  218.             fin = new FileInputStream(m);
  219.             return XMLUtils.getErroreApplicativo(log,fin);
  220.         }catch(Exception e){
  221.             throw new XMLUtilsException(e.getMessage(),e);
  222.         }finally{
  223.             try{
  224.                 if(fin!=null)
  225.                     fin.close();
  226.             }catch(Exception eClose){
  227.                 // close
  228.             }
  229.         }
  230.     }
  231.    
  232.     /**
  233.      * Ritorna la rappresentazione java
  234.      *
  235.      * @param m String
  236.      * @return ErroreApplicativo
  237.      * @throws XMLUtilsException
  238.      */
  239.     public static ErroreApplicativo getErroreApplicativo(Logger log,String m) throws XMLUtilsException{
  240.         return XMLUtils.getErroreApplicativo(log,m.getBytes());
  241.     }
  242.    
  243.     /**
  244.      * Ritorna la rappresentazione java
  245.      *
  246.      * @param m InputStream
  247.      * @return ErroreApplicativo
  248.      * @throws XMLUtilsException
  249.      */
  250.     public static ErroreApplicativo getErroreApplicativo(Logger log,InputStream m) throws XMLUtilsException{
  251.         try{
  252.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  253.             byte[]reads = new byte[1024];
  254.             int letti = 0;
  255.             while( (letti=m.read(reads)) != -1){
  256.                 bout.write(reads, 0, letti);
  257.             }
  258.             bout.flush();
  259.             bout.close();
  260.             byte [] xml = bout.toByteArray();
  261.            
  262.             // Validazione XSD
  263.             ByteArrayInputStream binValidazione = new ByteArrayInputStream(xml);
  264.             ValidatoreXSD validatoreXSD = XMLUtils.getValidatoreXSD(log);
  265.             validatoreXSD.valida(binValidazione);
  266.            
  267.             // trasformazione in oggetto ErroreApplicativo
  268.             ByteArrayInputStream binTrasformazione = new ByteArrayInputStream(xml);
  269.             return (ErroreApplicativo) org.openspcoop2.utils.xml.JaxbUtils.xmlToObj(binTrasformazione, ErroreApplicativo.class);
  270.            
  271.         }catch(Exception e){
  272.             throw new XMLUtilsException(e.getMessage(),e);
  273.         }
  274.     }
  275.    
  276.     public static ErroreApplicativo getErroreApplicativoFromJson(Logger log,InputStream is) throws XMLUtilsException{
  277.         try{            
  278.             JsonJacksonDeserializer deserializer = new JsonJacksonDeserializer();
  279.             return deserializer.readErroreApplicativo(is);
  280.         }catch(Exception e){
  281.             throw new XMLUtilsException(e.getMessage(),e);
  282.         }
  283.     }

  284.    
  285.    
  286.    
  287.    
  288.     /* ----- Marshall ----- */
  289.     public static void generateErroreApplicativo(ErroreApplicativo eccezione,File out) throws XMLUtilsException{
  290.         try{
  291.             StringBuilder risultatoValidazione = new StringBuilder();
  292.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  293.                 throw new Exception(risultatoValidazione.toString());
  294.             }
  295.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(out.getName(),XMLUtils.generateErroreApplicativo_engine(eccezione));
  296.         }catch(Exception e){
  297.             throw new XMLUtilsException(e.getMessage(),e);
  298.         }
  299.     }
  300.    
  301.     public static void generateErroreApplicativo(ErroreApplicativo eccezione,String fileName) throws XMLUtilsException{
  302.         try{
  303.             StringBuilder risultatoValidazione = new StringBuilder();
  304.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  305.                 throw new Exception(risultatoValidazione.toString());
  306.             }
  307.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(fileName,XMLUtils.generateErroreApplicativo_engine(eccezione));
  308.         }catch(Exception e){
  309.             throw new XMLUtilsException(e.getMessage(),e);
  310.         }
  311.     }
  312.    
  313.     public static byte[] generateErroreApplicativo(ErroreApplicativo eccezione) throws XMLUtilsException{
  314.         try{
  315.             StringBuilder risultatoValidazione = new StringBuilder();
  316.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  317.                 throw new Exception(risultatoValidazione.toString());
  318.             }
  319.             return XMLUtils.generateErroreApplicativo_engine(eccezione);
  320.         }catch(Exception e){
  321.             throw new XMLUtilsException(e.getMessage(),e);
  322.         }
  323.     }
  324.    
  325.     public static String generateErroreApplicativoAsJson(ErroreApplicativo eccezione) throws XMLUtilsException{
  326.         try{
  327.             StringBuilder risultatoValidazione = new StringBuilder();
  328.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  329.                 throw new Exception(risultatoValidazione.toString());
  330.             }
  331.             return XMLUtils.generateErroreApplicativoAsJson_engine(eccezione);
  332.         }catch(Exception e){
  333.             throw new XMLUtilsException(e.getMessage(),e);
  334.         }
  335.     }

  336.     public static void generateErroreApplicativo(ErroreApplicativo eccezione,OutputStream out) throws XMLUtilsException{
  337.         try{
  338.             StringBuilder risultatoValidazione = new StringBuilder();
  339.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  340.                 throw new Exception(risultatoValidazione.toString());
  341.             }
  342.             out.write(XMLUtils.generateErroreApplicativo_engine(eccezione));
  343.             out.flush();
  344.             out.close();
  345.         }catch(Exception e){
  346.             throw new XMLUtilsException(e.getMessage(),e);
  347.         }
  348.     }
  349.    
  350.     private static byte[] generateErroreApplicativo_engine(ErroreApplicativo eccezione) throws XMLUtilsException{
  351.         try{
  352.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  353.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(bout, ErroreApplicativo.class, eccezione);
  354.             bout.flush();
  355.             bout.close();
  356.             return bout.toByteArray();
  357.         }catch(Exception e){
  358.             throw new XMLUtilsException(e.getMessage(),e);
  359.         }
  360.     }
  361.    
  362.     private static String generateErroreApplicativoAsJson_engine(ErroreApplicativo eccezione) throws XMLUtilsException{
  363.         try{
  364.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  365.             eccezione.writeTo(bout, WriteToSerializerType.JSON_JACKSON);
  366.             bout.flush();
  367.             bout.close();
  368.             return bout.toString();
  369.         }catch(Exception e){
  370.             throw new XMLUtilsException(e.getMessage(),e);
  371.         }
  372.     }
  373.    
  374.    
  375.    
  376.     public static ErroreApplicativo getErroreApplicativo(Logger log,OpenSPCoop2Message msg)throws XMLUtilsException{
  377.         switch (msg.getMessageType()) {
  378.         case SOAP_11:
  379.         case SOAP_12:
  380.             try{
  381.                 return getErroreApplicativo(log, msg.castAsSoap());
  382.             }catch(XMLUtilsException e){
  383.                 throw e;
  384.             }catch(Exception e){
  385.                 throw new XMLUtilsException(e.getMessage(),e);
  386.             }
  387.         case XML:
  388.             try{
  389.                 OpenSPCoop2RestXmlMessage rest = msg.castAsRestXml();
  390.                 if(rest.hasContent()){
  391.                     Element element = rest.getContent();
  392.                     if(XMLUtils.isErroreApplicativo(element)){
  393.                         org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
  394.                         byte [] xml = xmlUtils.toByteArray(element);
  395.                         //System.out.println("XML S: "+new String(xml));
  396.                         ErroreApplicativo errore = XMLUtils.getErroreApplicativo(log,xml);
  397.                         return errore;
  398.                     }
  399.                 }
  400.                 return null;
  401.             }catch(XMLUtilsException e){
  402.                 throw e;
  403.             }catch(Exception e){
  404.                 throw new XMLUtilsException(e.getMessage(),e);
  405.             }
  406.         case JSON:
  407.             try{
  408.                 OpenSPCoop2RestJsonMessage rest = msg.castAsRestJson();
  409.                 if(rest.hasContent()){
  410.                     String json = rest.getContent();
  411.                     try{
  412.                         ErroreApplicativo errore = XMLUtils.getErroreApplicativoFromJson(log, new ByteArrayInputStream(json.getBytes()));
  413.                         return errore;
  414.                     }catch(Exception e){}
  415.                 }
  416.                 return null;
  417.             }catch(Exception e){
  418.                 throw new XMLUtilsException(e.getMessage(),e);
  419.             }
  420.         default:
  421.             return null;
  422.         }
  423.     }
  424.     public static ErroreApplicativo getErroreApplicativo(Logger log,OpenSPCoop2SoapMessage msg)throws XMLUtilsException{
  425.         try{
  426.             if(msg==null)
  427.                 throw new XMLUtilsException("Messaggio non presente");
  428.             SOAPBody soapBody = msg.getSOAPBody();
  429.             if(soapBody==null)
  430.                 throw new XMLUtilsException("SOAPBody non presente");
  431.             SOAPFault faultOriginale = null;
  432.             if(soapBody.hasFault()==false)
  433.                 return null; // casi di buste mal formate, verranno segnalate dal validatore
  434.             else
  435.                 faultOriginale = soapBody.getFault();
  436.             if(faultOriginale==null)
  437.                 throw new XMLUtilsException("SOAPFault is null");
  438.            
  439.             QName nameDetail = new QName("detail");
  440.             Iterator<?> itSF = faultOriginale.getChildElements(nameDetail);
  441.             SOAPElement detailsFaultOriginale = null;
  442.             if(itSF.hasNext()){
  443.                 detailsFaultOriginale = (SOAPElement) itSF.next();
  444.             }
  445.                
  446.             msg.saveChanges();
  447.                
  448.             if(detailsFaultOriginale!=null){
  449.                 Iterator<?> it = detailsFaultOriginale.getChildElements();
  450.                 while (it.hasNext()) {
  451.                     Object o = it.next();
  452.                     if(o instanceof SOAPElement){
  453.                         SOAPElement elem = (SOAPElement) o;
  454.                         try{
  455.                             if(XMLUtils.isErroreApplicativo(elem)){
  456.                                 //System.out.println("ITEM ["+elem.getLocalName()+"] TROVATO");
  457.                                 org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
  458.                                 byte [] xml = xmlUtils.toByteArray(elem);
  459.                                 //System.out.println("XML S: "+new String(xml));
  460.                                 ErroreApplicativo de = XMLUtils.getErroreApplicativo(log,xml);
  461.                                 return de;
  462.                             }
  463.                         }catch(Exception e){
  464.                             e.printStackTrace(System.out);
  465.                         }
  466.                     }
  467.                 }
  468.             }
  469.                
  470.             return null;
  471.         }catch(Exception e){
  472.             throw new XMLUtilsException(e.getMessage(),e);
  473.         }
  474.     }
  475.    
  476.     public static boolean isErroreApplicativo(byte [] doc){
  477.         try{
  478.             org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
  479.             Document docXML = xmlUtils.newDocument(doc);
  480.             Element elemXML = docXML.getDocumentElement();
  481.             return XMLUtils.isErroreApplicativo_engine(elemXML);
  482.         }catch(Exception e){
  483.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  484.             return false;
  485.         }
  486.     }
  487.     public static boolean isErroreApplicativo(Document docXML){
  488.         try{
  489.             Element elemXML = docXML.getDocumentElement();
  490.             return XMLUtils.isErroreApplicativo_engine(elemXML);
  491.         }catch(Exception e){
  492.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  493.             return false;
  494.         }
  495.     }
  496.     public static boolean isErroreApplicativo(Element elemXML){
  497.         return isErroreApplicativo_engine(elemXML);
  498.     }
  499.     public static boolean isErroreApplicativo(Node nodeXml){
  500.         return isErroreApplicativo_engine(nodeXml);
  501.     }
  502.     private static boolean isErroreApplicativo_engine(Node nodeXml){
  503.         try{
  504.             //System.out.println("LOCAL["+Costanti.ROOT_LOCAL_NAME_ERRORE_APPLICATIVO+"]vs["+nodeXml.getLocalName()+"]  NAMESPACE["+Costanti.TARGET_NAMESPACE+"]vs["+nodeXml.getNamespaceURI()+"]");
  505.             if(Costanti.ROOT_LOCAL_NAME_ERRORE_APPLICATIVO.equals(nodeXml.getLocalName()) &&
  506.                     Costanti.TARGET_NAMESPACE.equals(nodeXml.getNamespaceURI() )
  507.                 ){
  508.                 return true;
  509.             }
  510.             else{
  511.                 return false;
  512.             }
  513.         }catch(Exception e){
  514.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  515.             return false;
  516.         }
  517.     }
  518.    
  519. }