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.diagnostica.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 org.slf4j.Logger;
  28. import org.openspcoop2.core.diagnostica.DominioDiagnostico;
  29. import org.openspcoop2.core.diagnostica.MessaggioDiagnostico;
  30. import org.openspcoop2.core.diagnostica.Protocollo;
  31. import org.openspcoop2.core.diagnostica.constants.CostantiDiagnostica;
  32. import org.openspcoop2.core.diagnostica.utils.serializer.JsonJacksonDeserializer;
  33. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  34. import org.openspcoop2.message.xml.ValidatoreXSD;
  35. import org.openspcoop2.utils.beans.WriteToSerializerType;
  36. import org.w3c.dom.Document;
  37. import org.w3c.dom.Element;
  38. import org.w3c.dom.Node;


  39. /**
  40.  * Classe utilizzata per la generazione dei diagnostici generati dalla PdD
  41.  *
  42.  *
  43.  * @author Poli Andrea (apoli@link.it)
  44.  * @author $Author$
  45.  * @version $Rev$, $Date$
  46.  */

  47. public class XMLUtils  {
  48.    
  49.     private XMLUtils() {}

  50.     /** Validatore XSD */
  51.     static ValidatoreXSD validatoreXSD = null;
  52.     private static synchronized void initValidatoreXSD(Logger log) throws Exception{
  53.         if(XMLUtils.validatoreXSD==null){
  54.             XMLUtils.validatoreXSD = new ValidatoreXSD(OpenSPCoop2MessageFactory.getDefaultMessageFactory(), log,XMLUtils.class.getResourceAsStream("/openspcoopDiagnostica.xsd"));
  55.         }
  56.     }
  57.     public static ValidatoreXSD getValidatoreXSD(Logger log) throws Exception{
  58.         if(XMLUtils.validatoreXSD==null){
  59.             initValidatoreXSD(log);
  60.         }
  61.         return XMLUtils.validatoreXSD;
  62.     }
  63.     public static boolean validate(MessaggioDiagnostico messaggioDiagnostico,StringBuilder motivoErroreValidazione){
  64.        
  65.         int size = motivoErroreValidazione.length();
  66.        
  67.         if(messaggioDiagnostico.getDominio()==null){
  68.             motivoErroreValidazione.append("Dominio non definito\n");
  69.         }
  70.         else{
  71.             validate(messaggioDiagnostico.getDominio(), motivoErroreValidazione);
  72.         }
  73.        
  74.         if(messaggioDiagnostico.getOraRegistrazione()==null){
  75.             motivoErroreValidazione.append("OraRegistrazione non definita\n");
  76.         }
  77.        
  78.         if(messaggioDiagnostico.getCodice()==null){
  79.             motivoErroreValidazione.append("Codice non definito\n");
  80.         }
  81.        
  82.         if(messaggioDiagnostico.getMessaggio()==null){
  83.             motivoErroreValidazione.append("Messaggio non definito\n");
  84.         }
  85.        
  86.         if(messaggioDiagnostico.getSeverita()==null){
  87.             motivoErroreValidazione.append("Severita non definito\n");
  88.         }
  89.        
  90.         if(messaggioDiagnostico.getProtocollo()!=null){ // sara' null per i messaggi di servizio emessi dalla PdD
  91.             validate(messaggioDiagnostico.getProtocollo(), motivoErroreValidazione);
  92.         }
  93.        
  94.         return motivoErroreValidazione.length()==size;

  95.     }
  96.     private static void validate(DominioDiagnostico dominio,StringBuilder motivoErroreValidazione){
  97.         if(dominio.getIdentificativoPorta()==null){
  98.             motivoErroreValidazione.append("Dominio.identificativoPorta non definito\n");
  99.         }
  100.         if(dominio.getModulo()==null){
  101.             motivoErroreValidazione.append("Dominio.modulo non definito\n");
  102.         }
  103.         if(dominio.getSoggetto()==null){
  104.             motivoErroreValidazione.append("Dominio.soggetto non definita\n");
  105.         }
  106.         else{
  107.             if(dominio.getSoggetto().getTipo()==null){
  108.                 motivoErroreValidazione.append("Dominio.soggetto.tipo non definita\n");
  109.             }
  110.             if(dominio.getSoggetto().getBase()==null){
  111.                 motivoErroreValidazione.append("Dominio.soggetto.nome non definita\n");
  112.             }
  113.         }
  114.     }
  115.     private static void validate(Protocollo protocollo,StringBuilder motivoErroreValidazione){
  116.         if(protocollo.getIdentificativo()==null){
  117.             motivoErroreValidazione.append("Protocollo.identificativo non definito\n");
  118.         }
  119.     }
  120.    
  121.    
  122.    
  123.     /* ----- Unmarshall ----- */
  124.    
  125.     /**
  126.      * Ritorna la rappresentazione java
  127.      *
  128.      * @param m byte[]
  129.      * @return DettaglioEccezione
  130.      * @throws XMLUtilsException
  131.      */
  132.     public static MessaggioDiagnostico getMessaggioDiagnostico(Logger log,byte[] m) throws XMLUtilsException{
  133.         try (ByteArrayInputStream bin = new ByteArrayInputStream(m);){
  134.             return XMLUtils.getMessaggioDiagnostico(log,bin);
  135.         }catch(Exception e){
  136.             throw new XMLUtilsException(e.getMessage(),e);
  137.         }
  138.     }
  139.    
  140.     /**
  141.      * Ritorna la rappresentazione java
  142.      *
  143.      * @param m File
  144.      * @return DettaglioEccezione
  145.      * @throws XMLUtilsException
  146.      */
  147.     public static MessaggioDiagnostico getMessaggioDiagnostico(Logger log,File m) throws XMLUtilsException{
  148.         try (FileInputStream fin = new FileInputStream(m);){
  149.             return XMLUtils.getMessaggioDiagnostico(log,fin);
  150.         }catch(Exception e){
  151.             throw new XMLUtilsException(e.getMessage(),e);
  152.         }
  153.     }
  154.    
  155.     /**
  156.      * Ritorna la rappresentazione java
  157.      *
  158.      * @param m String
  159.      * @return DettaglioEccezione
  160.      * @throws XMLUtilsException
  161.      */
  162.     public static MessaggioDiagnostico getMessaggioDiagnostico(Logger log,String m) throws XMLUtilsException{
  163.         return XMLUtils.getMessaggioDiagnostico(log,m.getBytes());
  164.     }
  165.    
  166.     /**
  167.      * Ritorna la rappresentazione java
  168.      *
  169.      * @param m InputStream
  170.      * @return DettaglioEccezione
  171.      * @throws XMLUtilsException
  172.      */
  173.     public static MessaggioDiagnostico getMessaggioDiagnostico(Logger log,InputStream m) throws XMLUtilsException{
  174.         try{
  175.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  176.             byte[]reads = new byte[1024];
  177.             int letti = 0;
  178.             while( (letti=m.read(reads)) != -1){
  179.                 bout.write(reads, 0, letti);
  180.             }
  181.             bout.flush();
  182.             bout.close();
  183.             byte [] xml = bout.toByteArray();
  184.            
  185.             // Validazione XSD
  186.             ByteArrayInputStream binValidazione = new ByteArrayInputStream(xml);
  187.             ValidatoreXSD validatoreXSD = XMLUtils.getValidatoreXSD(log);
  188.             validatoreXSD.valida(binValidazione);
  189.            
  190.             // trasformazione in oggetto DettaglioEccezione
  191.             ByteArrayInputStream binTrasformazione = new ByteArrayInputStream(xml);
  192.             return (MessaggioDiagnostico) org.openspcoop2.utils.xml.JaxbUtils.xmlToObj(binTrasformazione, MessaggioDiagnostico.class);
  193.            
  194.         }catch(Exception e){
  195.             throw new XMLUtilsException(e.getMessage(),e);
  196.         }
  197.     }

  198.     public static MessaggioDiagnostico getMessaggioDiagnosticoFromJson(Logger log,InputStream is) throws XMLUtilsException{
  199.         try{            
  200.             if(log!=null) {
  201.                 //nop
  202.             }
  203.             JsonJacksonDeserializer deserializer = new JsonJacksonDeserializer();
  204.             return deserializer.readMessaggioDiagnostico(is);
  205.         }catch(Exception e){
  206.             throw new XMLUtilsException(e.getMessage(),e);
  207.         }
  208.     }
  209.    
  210.    
  211.    
  212.    
  213.     /* ----- Marshall ----- */
  214.     public static void generateMessaggioDiagnostico(MessaggioDiagnostico messaggioDiagnostico,File out) throws XMLUtilsException{
  215.         generateMessaggioDiagnostico(messaggioDiagnostico, out, false, false);
  216.     }
  217.     public static void generateMessaggioDiagnostico(MessaggioDiagnostico messaggioDiagnostico,File out,boolean prettyDocument, boolean omitXmlDeclaration) throws XMLUtilsException{
  218.         try{
  219.             StringBuilder risultatoValidazione = new StringBuilder();
  220.             if(!XMLUtils.validate(messaggioDiagnostico, risultatoValidazione)){
  221.                 throw new XMLUtilsException(risultatoValidazione.toString());
  222.             }
  223.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(out.getName(),XMLUtils.generateMessaggioDiagnosticoEngine(messaggioDiagnostico, prettyDocument, omitXmlDeclaration));
  224.         }catch(Exception e){
  225.             throw new XMLUtilsException(e.getMessage(),e);
  226.         }
  227.     }
  228.    
  229.     public static void generateMessaggioDiagnostico(MessaggioDiagnostico messaggioDiagnostico,String fileName) throws XMLUtilsException{
  230.         generateMessaggioDiagnostico(messaggioDiagnostico, fileName, false, false);
  231.     }
  232.     public static void generateMessaggioDiagnostico(MessaggioDiagnostico messaggioDiagnostico,String fileName,boolean prettyDocument, boolean omitXmlDeclaration) throws XMLUtilsException{
  233.         try{
  234.             StringBuilder risultatoValidazione = new StringBuilder();
  235.             if(!XMLUtils.validate(messaggioDiagnostico, risultatoValidazione)){
  236.                 throw new XMLUtilsException(risultatoValidazione.toString());
  237.             }
  238.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(fileName,XMLUtils.generateMessaggioDiagnosticoEngine(messaggioDiagnostico, prettyDocument, omitXmlDeclaration));
  239.         }catch(Exception e){
  240.             throw new XMLUtilsException(e.getMessage(),e);
  241.         }
  242.     }
  243.    
  244.     public static byte[] generateMessaggioDiagnostico(MessaggioDiagnostico messaggioDiagnostico) throws XMLUtilsException{
  245.         return generateMessaggioDiagnostico(messaggioDiagnostico,false, false);
  246.     }
  247.     public static byte[] generateMessaggioDiagnostico(MessaggioDiagnostico messaggioDiagnostico,boolean prettyDocument, boolean omitXmlDeclaration) throws XMLUtilsException{
  248.         try{
  249.             StringBuilder risultatoValidazione = new StringBuilder();
  250.             if(!XMLUtils.validate(messaggioDiagnostico, risultatoValidazione)){
  251.                 throw new XMLUtilsException(risultatoValidazione.toString());
  252.             }
  253.             return XMLUtils.generateMessaggioDiagnosticoEngine(messaggioDiagnostico, prettyDocument, omitXmlDeclaration);
  254.         }catch(Exception e){
  255.             throw new XMLUtilsException(e.getMessage(),e);
  256.         }
  257.     }

  258.     public static void generateMessaggioDiagnostico(MessaggioDiagnostico messaggioDiagnostico,OutputStream out) throws XMLUtilsException{
  259.         generateMessaggioDiagnostico(messaggioDiagnostico, out, false, false);
  260.     }
  261.     public static void generateMessaggioDiagnostico(MessaggioDiagnostico messaggioDiagnostico,OutputStream out,boolean prettyDocument, boolean omitXmlDeclaration) throws XMLUtilsException{
  262.         try{
  263.             StringBuilder risultatoValidazione = new StringBuilder();
  264.             if(!XMLUtils.validate(messaggioDiagnostico, risultatoValidazione)){
  265.                 throw new XMLUtilsException(risultatoValidazione.toString());
  266.             }
  267.             out.write(XMLUtils.generateMessaggioDiagnosticoEngine(messaggioDiagnostico, prettyDocument, omitXmlDeclaration));
  268.             out.flush();
  269.             out.close();
  270.         }catch(Exception e){
  271.             throw new XMLUtilsException(e.getMessage(),e);
  272.         }
  273.     }
  274.    
  275.     public static String generateMessaggioDiagnosticoAsJson(MessaggioDiagnostico messaggioDiagnostico) throws XMLUtilsException{
  276.         return generateMessaggioDiagnosticoAsJson(messaggioDiagnostico, false);
  277.     }
  278.     public static String generateMessaggioDiagnosticoAsJson(MessaggioDiagnostico messaggioDiagnostico,boolean prettyDocument) throws XMLUtilsException{
  279.         try{
  280.             StringBuilder risultatoValidazione = new StringBuilder();
  281.             if(!XMLUtils.validate(messaggioDiagnostico, risultatoValidazione)){
  282.                 throw new XMLUtilsException(risultatoValidazione.toString());
  283.             }
  284.             return XMLUtils.generateMessaggioDiagnosticoAsJsonEngine(messaggioDiagnostico, prettyDocument);
  285.         }catch(Exception e){
  286.             throw new XMLUtilsException(e.getMessage(),e);
  287.         }
  288.     }
  289.    
  290.     private static byte[] generateMessaggioDiagnosticoEngine(MessaggioDiagnostico messaggioDiagnostico,boolean prettyDocument, boolean omitXmlDeclaration) throws XMLUtilsException{
  291.         try{
  292.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  293.             org.openspcoop2.utils.xml.JaxbUtils.objToXml(bout, MessaggioDiagnostico.class, messaggioDiagnostico, prettyDocument, omitXmlDeclaration);
  294.             return bout.toByteArray();
  295.         }catch(Exception e){
  296.             throw new XMLUtilsException(e.getMessage(),e);
  297.         }
  298.     }
  299.    
  300.     private static String generateMessaggioDiagnosticoAsJsonEngine(MessaggioDiagnostico messaggioDiagnostico,boolean prettyDocument) throws XMLUtilsException{
  301.         try{
  302.             ByteArrayOutputStream bout = new ByteArrayOutputStream();
  303.             messaggioDiagnostico.writeTo(bout, WriteToSerializerType.JSON_JACKSON, prettyDocument);
  304.             bout.flush();
  305.             bout.close();
  306.             return bout.toString();
  307.         }catch(Exception e){
  308.             throw new XMLUtilsException(e.getMessage(),e);
  309.         }
  310.     }
  311.    
  312.    
  313.    
  314.    
  315.     public static boolean isMessaggioDiagnostico(byte [] doc){
  316.         try{
  317.             org.openspcoop2.message.xml.MessageXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
  318.             Document docXML = xmlUtils.newDocument(doc);
  319.             Element elemXML = docXML.getDocumentElement();
  320.             return XMLUtils.isMessaggioDiagnostico_engine(elemXML);
  321.         }catch(Exception e){
  322.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  323.             return false;
  324.         }
  325.     }
  326.     public static boolean isMessaggioDiagnostico(Document docXML){
  327.         try{
  328.             Element elemXML = docXML.getDocumentElement();
  329.             return XMLUtils.isMessaggioDiagnostico_engine(elemXML);
  330.         }catch(Exception e){
  331.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  332.             return false;
  333.         }
  334.     }
  335.     public static boolean isMessaggioDiagnostico(Element elemXML){
  336.         return isMessaggioDiagnostico_engine(elemXML);
  337.     }
  338.     public static boolean isMessaggioDiagnostico(Node nodeXml){
  339.         return isMessaggioDiagnostico_engine(nodeXml);
  340.     }
  341.     private static boolean isMessaggioDiagnostico_engine(Node nodeXml){
  342.         try{
  343.             //System.out.println("LOCAL["+Costanti.ROOT_LOCAL_NAME_DETTAGLIO_ECCEZIONE+"]vs["+elemXML.getLocalName()+"]  NAMESPACE["+Costanti.TARGET_NAMESPACE+"]vs["+elemXML.getNamespaceURI()+"]");
  344.             if(CostantiDiagnostica.ROOT_LOCAL_NAME_MESSAGGIO_DIAGNOSTICO.equals(nodeXml.getLocalName()) &&
  345.                     CostantiDiagnostica.TARGET_NAMESPACE.equals(nodeXml.getNamespaceURI() )
  346.                 ){
  347.                 return true;
  348.             }
  349.             else{
  350.                 return false;
  351.             }
  352.         }catch(Exception e){
  353.             //System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
  354.             return false;
  355.         }
  356.     }
  357.    
  358. }