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 it.cnipa.schemas._2003.egovit.exception1_0.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.message.OpenSPCoop2SoapMessage;
  33. import org.openspcoop2.utils.beans.WriteToSerializerType;
  34. import org.openspcoop2.utils.xml.AbstractValidatoreXSD;
  35. import org.slf4j.Logger;
  36. import org.w3c.dom.Document;
  37. import org.w3c.dom.Element;
  38. import org.w3c.dom.Node;

  39. import it.cnipa.schemas._2003.egovit.exception1_0.Eccezione;
  40. import it.cnipa.schemas._2003.egovit.exception1_0.EccezioneBusta;
  41. import it.cnipa.schemas._2003.egovit.exception1_0.EccezioneProcessamento;
  42. import it.cnipa.schemas._2003.egovit.exception1_0.MessaggioDiErroreApplicativo;
  43. import it.cnipa.schemas._2003.egovit.exception1_0.utils.serializer.JsonJacksonDeserializer;


  44. /**
  45.  * Classe utilizzata per la generazione MessaggioDiErroreApplicativo
  46.  *
  47.  *
  48.  * @author Poli Andrea (apoli@link.it)
  49.  * @author $Author$
  50.  * @version $Rev$, $Date$
  51.  */

  52. public class XMLUtils  {


  53.     public static boolean validate(MessaggioDiErroreApplicativo erroreApplicativo,StringBuilder motivoErroreValidazione){
  54.        
  55.         int size = motivoErroreValidazione.length();
  56.        
  57.         if(erroreApplicativo.getOraRegistrazione()==null){
  58.             motivoErroreValidazione.append("OraRegistrazione non definita\n");
  59.         }
  60.        
  61.         if(erroreApplicativo.getIdentificativoPorta()==null){
  62.             motivoErroreValidazione.append("IdentificativoPorta non definito\n");
  63.         }
  64.        
  65.         if(erroreApplicativo.getIdentificativoFunzione()==null){
  66.             motivoErroreValidazione.append("IdentificativoFunzione non definito\n");
  67.         }

  68.        
  69.         validate(erroreApplicativo.getEccezione(),motivoErroreValidazione);
  70.        
  71.         if(motivoErroreValidazione.length()!=size)
  72.             return false;
  73.         else
  74.             return true;

  75.     }

  76.     private static void validate(Eccezione eccezione,StringBuilder motivoErroreValidazione){
  77.         if(eccezione==null){
  78.             motivoErroreValidazione.append("Eccezione non definita\n");
  79.         }
  80.         else{
  81.             if(eccezione.getEccezioneBusta()==null && eccezione.getEccezioneProcessamento()==null){
  82.                 motivoErroreValidazione.append("Nessuna eccezione (busta o processamento) definita\n");
  83.             }
  84.             else if(eccezione.getEccezioneBusta()!=null && eccezione.getEccezioneProcessamento()!=null){
  85.                 motivoErroreValidazione.append("Entrambe le eccezioni (busta o processamento) sono definite\n");
  86.             }
  87.             else{
  88.                 if(eccezione.getEccezioneBusta()!=null){
  89.                     validate(eccezione.getEccezioneBusta(),motivoErroreValidazione);
  90.                 }
  91.                 else{
  92.                     validate(eccezione.getEccezioneProcessamento(),motivoErroreValidazione);
  93.                 }
  94.             }
  95.         }
  96.     }
  97.    
  98.     private static void validate(EccezioneBusta eccezione,StringBuilder motivoErroreValidazione){
  99.         if(eccezione==null){
  100.             motivoErroreValidazione.append("EccezioneBusta non definita\n");
  101.         }
  102.         else{
  103.             if(eccezione.getCodiceEccezione()==null){
  104.                 motivoErroreValidazione.append("EccezioneBusta.codiceEccezione non definito\n");
  105.             }
  106.             if(eccezione.getDescrizioneEccezione()==null){
  107.                 motivoErroreValidazione.append("EccezioneBusta.descrizioneEccezione non definito\n");
  108.             }
  109.         }
  110.     }
  111.    
  112.     private static void validate(EccezioneProcessamento eccezione,StringBuilder motivoErroreValidazione){
  113.         if(eccezione==null){
  114.             motivoErroreValidazione.append("EccezioneProcessamento non definita\n");
  115.         }
  116.         else{
  117.             if(eccezione.getCodiceEccezione()==null){
  118.                 motivoErroreValidazione.append("EccezioneProcessamento.codiceEccezione non definito\n");
  119.             }
  120.             if(eccezione.getDescrizioneEccezione()==null){
  121.                 motivoErroreValidazione.append("EccezioneProcessamento.descrizioneEccezione non definito\n");
  122.             }
  123.         }
  124.     }
  125.    
  126.    
  127.    
  128.     /* ----- Unmarshall ----- */
  129.    
  130.     /**
  131.      * Ritorna la rappresentazione java
  132.      *
  133.      * @param m byte[]
  134.      * @return ErroreApplicativo
  135.      * @throws XMLUtilsException
  136.      */
  137.     public static MessaggioDiErroreApplicativo getErroreApplicativo(Logger log,byte[] m) throws XMLUtilsException{
  138.         ByteArrayInputStream bin = null;
  139.         try{
  140.             bin = new ByteArrayInputStream(m);
  141.             return XMLUtils.getErroreApplicativo(log,bin);
  142.         }catch(Exception e){
  143.             throw new XMLUtilsException(e.getMessage(),e);
  144.         }finally{
  145.             try{
  146.                 if(bin!=null)
  147.                     bin.close();
  148.             }catch(Exception eClose){
  149.                 // close
  150.             }
  151.         }
  152.     }
  153.    
  154.     /**
  155.      * Ritorna la rappresentazione java
  156.      *
  157.      * @param m File
  158.      * @return ErroreApplicativo
  159.      * @throws XMLUtilsException
  160.      */
  161.     public static MessaggioDiErroreApplicativo getErroreApplicativo(Logger log,File m) throws XMLUtilsException{
  162.         FileInputStream fin = null;
  163.         try{
  164.             fin = new FileInputStream(m);
  165.             return XMLUtils.getErroreApplicativo(log,fin);
  166.         }catch(Exception e){
  167.             throw new XMLUtilsException(e.getMessage(),e);
  168.         }finally{
  169.             try{
  170.                 if(fin!=null)
  171.                     fin.close();
  172.             }catch(Exception eClose){
  173.                 // close
  174.             }
  175.         }
  176.     }
  177.    
  178.     /**
  179.      * Ritorna la rappresentazione java
  180.      *
  181.      * @param m String
  182.      * @return ErroreApplicativo
  183.      * @throws XMLUtilsException
  184.      */
  185.     public static MessaggioDiErroreApplicativo getErroreApplicativo(Logger log,String m) throws XMLUtilsException{
  186.         return XMLUtils.getErroreApplicativo(log,m.getBytes());
  187.     }
  188.    
  189.     /**
  190.      * Ritorna la rappresentazione java
  191.      *
  192.      * @param m InputStream
  193.      * @return ErroreApplicativo
  194.      * @throws XMLUtilsException
  195.      */
  196.     public static MessaggioDiErroreApplicativo getErroreApplicativo(Logger log,InputStream m) throws XMLUtilsException{
  197.         try{
  198.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  199.             byte[]reads = new byte[1024];
  200.             int letti = 0;
  201.             while( (letti=m.read(reads)) != -1){
  202.                 bout.write(reads, 0, letti);
  203.             }
  204.             bout.flush();
  205.             bout.close();
  206.             byte [] xml = bout.toByteArray();
  207.            
  208.             // Validazione XSD
  209.             ByteArrayInputStream binValidazione = new ByteArrayInputStream(xml);
  210.             AbstractValidatoreXSD validatoreXSD = XSDValidator.getXSDValidator(log);
  211.             validatoreXSD.valida(binValidazione);
  212.            
  213.             // trasformazione in oggetto ErroreApplicativo
  214.             ByteArrayInputStream binTrasformazione = new ByteArrayInputStream(xml);
  215.             return (MessaggioDiErroreApplicativo) org.openspcoop2.utils.xml.JaxbUtils.xmlToObj(binTrasformazione, MessaggioDiErroreApplicativo.class);
  216.            
  217.         }catch(Exception e){
  218.             throw new XMLUtilsException(e.getMessage(),e);
  219.         }
  220.     }
  221.    
  222.     public static MessaggioDiErroreApplicativo getErroreApplicativoFromJson(Logger log,InputStream is) throws XMLUtilsException{
  223.         try{            
  224.             JsonJacksonDeserializer deserializer = new JsonJacksonDeserializer();
  225.             return deserializer.readMessaggioDiErroreApplicativo(is);
  226.         }catch(Exception e){
  227.             throw new XMLUtilsException(e.getMessage(),e);
  228.         }
  229.     }

  230.    
  231.    
  232.    
  233.    
  234.     /* ----- Marshall ----- */
  235.     public static void generateErroreApplicativo(MessaggioDiErroreApplicativo eccezione,File out) throws XMLUtilsException{
  236.         try{
  237.             StringBuilder risultatoValidazione = new StringBuilder();
  238.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  239.                 throw new Exception(risultatoValidazione.toString());
  240.             }
  241.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(out.getName(),XMLUtils.generateErroreApplicativo_engine(eccezione));
  242.         }catch(Exception e){
  243.             throw new XMLUtilsException(e.getMessage(),e);
  244.         }
  245.     }
  246.    
  247.     public static void generateErroreApplicativo(MessaggioDiErroreApplicativo eccezione,String fileName) throws XMLUtilsException{
  248.         try{
  249.             StringBuilder risultatoValidazione = new StringBuilder();
  250.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  251.                 throw new Exception(risultatoValidazione.toString());
  252.             }
  253.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(fileName,XMLUtils.generateErroreApplicativo_engine(eccezione));
  254.         }catch(Exception e){
  255.             throw new XMLUtilsException(e.getMessage(),e);
  256.         }
  257.     }
  258.    
  259.     public static byte[] generateErroreApplicativo(MessaggioDiErroreApplicativo eccezione) throws XMLUtilsException{
  260.         try{
  261.             StringBuilder risultatoValidazione = new StringBuilder();
  262.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  263.                 throw new Exception(risultatoValidazione.toString());
  264.             }
  265.             return XMLUtils.generateErroreApplicativo_engine(eccezione);
  266.         }catch(Exception e){
  267.             throw new XMLUtilsException(e.getMessage(),e);
  268.         }
  269.     }
  270.    
  271.     public static String generateErroreApplicativoAsJson(MessaggioDiErroreApplicativo eccezione) throws XMLUtilsException{
  272.         try{
  273.             StringBuilder risultatoValidazione = new StringBuilder();
  274.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  275.                 throw new Exception(risultatoValidazione.toString());
  276.             }
  277.             return XMLUtils.generateErroreApplicativoAsJson_engine(eccezione);
  278.         }catch(Exception e){
  279.             throw new XMLUtilsException(e.getMessage(),e);
  280.         }
  281.     }

  282.     public static void generateErroreApplicativo(MessaggioDiErroreApplicativo eccezione,OutputStream out) throws XMLUtilsException{
  283.         try{
  284.             StringBuilder risultatoValidazione = new StringBuilder();
  285.             if(XMLUtils.validate(eccezione, risultatoValidazione)==false){
  286.                 throw new Exception(risultatoValidazione.toString());
  287.             }
  288.             out.write(XMLUtils.generateErroreApplicativo_engine(eccezione));
  289.             out.flush();
  290.             out.close();
  291.         }catch(Exception e){
  292.             throw new XMLUtilsException(e.getMessage(),e);
  293.         }
  294.     }
  295.    
  296.     private static byte[] generateErroreApplicativo_engine(MessaggioDiErroreApplicativo eccezione) throws XMLUtilsException{
  297.         try{
  298.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  299.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(bout, MessaggioDiErroreApplicativo.class, eccezione);
  300.             bout.flush();
  301.             bout.close();
  302.             return bout.toByteArray();
  303.         }catch(Exception e){
  304.             throw new XMLUtilsException(e.getMessage(),e);
  305.         }
  306.     }
  307.    
  308.     private static String generateErroreApplicativoAsJson_engine(MessaggioDiErroreApplicativo eccezione) throws XMLUtilsException{
  309.         try{
  310.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  311.             eccezione.writeTo(bout, WriteToSerializerType.JSON_JACKSON);
  312.             bout.flush();
  313.             bout.close();
  314.             return bout.toString();
  315.         }catch(Exception e){
  316.             throw new XMLUtilsException(e.getMessage(),e);
  317.         }
  318.     }
  319.    
  320.    
  321.    
  322.    
  323.     public static MessaggioDiErroreApplicativo getErroreApplicativo(Logger log,OpenSPCoop2SoapMessage msg)throws XMLUtilsException{
  324.         try{
  325.             if(msg==null)
  326.                 throw new XMLUtilsException("Messaggio non presente");
  327.             SOAPBody soapBody = msg.getSOAPBody();
  328.             if(soapBody==null)
  329.                 throw new XMLUtilsException("SOAPBody non presente");
  330.             SOAPFault faultOriginale = null;
  331.             if(soapBody.hasFault()==false)
  332.                 return null; // casi di buste mal formate, verranno segnalate dal validatore
  333.             else
  334.                 faultOriginale = soapBody.getFault();
  335.             if(faultOriginale==null)
  336.                 throw new XMLUtilsException("SOAPFault is null");
  337.            
  338.             QName nameDetail = new QName("detail");
  339.             Iterator<?> itSF = faultOriginale.getChildElements(nameDetail);
  340.             SOAPElement detailsFaultOriginale = null;
  341.             if(itSF.hasNext()){
  342.                 detailsFaultOriginale = (SOAPElement) itSF.next();
  343.             }
  344.                
  345.             msg.saveChanges();
  346.                
  347.             if(detailsFaultOriginale!=null){
  348.                 Iterator<?> it = detailsFaultOriginale.getChildElements();
  349.                 while (it.hasNext()) {
  350.                     Object o = it.next();
  351.                     if(o instanceof SOAPElement){
  352.                         SOAPElement elem = (SOAPElement) o;
  353.                         try{
  354.                             if(XMLUtils.isErroreApplicativo(elem)){
  355.                                 //System.out.println("ITEM ["+elem.getLocalName()+"] TROVATO");
  356.                                 org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
  357.                                 byte [] xml = xmlUtils.toByteArray(elem);
  358.                                 //System.out.println("XML S: "+new String(xml));
  359.                                 MessaggioDiErroreApplicativo de = XMLUtils.getErroreApplicativo(log,xml);
  360.                                 return de;
  361.                             }
  362.                         }catch(Exception e){
  363.                             e.printStackTrace(System.out);
  364.                         }
  365.                     }
  366.                 }
  367.             }
  368.                
  369.             return null;
  370.         }catch(Exception e){
  371.             throw new XMLUtilsException(e.getMessage(),e);
  372.         }
  373.     }
  374.    
  375.     public static boolean isErroreApplicativo(byte [] doc){
  376.         try{
  377.             org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
  378.             Document docXML = xmlUtils.newDocument(doc);
  379.             Element elemXML = docXML.getDocumentElement();
  380.             return XMLUtils.isErroreApplicativo_engine(elemXML);
  381.         }catch(Exception e){
  382.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  383.             return false;
  384.         }
  385.     }
  386.     public static boolean isErroreApplicativo(Document docXML){
  387.         try{
  388.             Element elemXML = docXML.getDocumentElement();
  389.             return XMLUtils.isErroreApplicativo_engine(elemXML);
  390.         }catch(Exception e){
  391.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  392.             return false;
  393.         }
  394.     }
  395.     public static boolean isErroreApplicativo(Element elemXML){
  396.         return isErroreApplicativo_engine(elemXML);
  397.     }
  398.     public static boolean isErroreApplicativo(Node nodeXml){
  399.         return isErroreApplicativo_engine(nodeXml);
  400.     }
  401.     private static boolean isErroreApplicativo_engine(Node nodeXml){
  402.         try{
  403.             //System.out.println("LOCAL["+Costanti.ROOT_LOCAL_NAME_DETTAGLIO_ECCEZIONE+"]vs["+elemXML.getLocalName()+"]  NAMESPACE["+Costanti.TARGET_NAMESPACE+"]vs["+elemXML.getNamespaceURI()+"]");
  404.             if("MessaggioDiErroreApplicativo".equals(nodeXml.getLocalName()) &&
  405.                     ProjectInfo.getInstance().getProjectNamespace().equals(nodeXml.getNamespaceURI() )
  406.                 ){
  407.                 return true;
  408.             }
  409.             else{
  410.                 return false;
  411.             }
  412.         }catch(Exception e){
  413.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  414.             return false;
  415.         }
  416.     }
  417.    
  418. }