ValidazioneDocumenti.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.protocol.basic.validator;

  21. import java.io.ByteArrayOutputStream;
  22. import java.io.File;
  23. import java.io.FileInputStream;
  24. import java.util.ArrayList;
  25. import java.util.Iterator;
  26. import java.util.List;
  27. import java.util.Map;

  28. import javax.xml.namespace.QName;

  29. import org.openspcoop2.core.registry.AccordoCooperazione;
  30. import org.openspcoop2.core.registry.AccordoServizioParteComune;
  31. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  32. import org.openspcoop2.core.registry.Documento;
  33. import org.openspcoop2.core.registry.Fruitore;
  34. import org.openspcoop2.core.registry.constants.ServiceBinding;
  35. import org.openspcoop2.core.registry.constants.TipiDocumentoConversazione;
  36. import org.openspcoop2.core.registry.constants.TipiDocumentoCoordinamento;
  37. import org.openspcoop2.core.registry.constants.TipiDocumentoInterfaccia;
  38. import org.openspcoop2.core.registry.constants.TipiDocumentoLivelloServizio;
  39. import org.openspcoop2.core.registry.constants.TipiDocumentoSemiformale;
  40. import org.openspcoop2.core.registry.constants.TipiDocumentoSicurezza;
  41. import org.openspcoop2.protocol.basic.BasicComponentFactory;
  42. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  43. import org.openspcoop2.protocol.sdk.ProtocolException;
  44. import org.openspcoop2.protocol.sdk.validator.IValidazioneDocumenti;
  45. import org.openspcoop2.protocol.sdk.validator.ValidazioneResult;
  46. import org.openspcoop2.utils.CopyStream;
  47. import org.openspcoop2.utils.json.JSONUtils;
  48. import org.openspcoop2.utils.json.YAMLUtils;
  49. import org.openspcoop2.utils.rest.ApiFactory;
  50. import org.openspcoop2.utils.rest.ApiFormats;
  51. import org.openspcoop2.utils.rest.ApiReaderConfig;
  52. import org.openspcoop2.utils.rest.IApiReader;
  53. import org.openspcoop2.utils.rest.ParseWarningException;
  54. import org.openspcoop2.utils.rest.api.Api;
  55. import org.openspcoop2.utils.transport.http.HttpUtilities;
  56. import org.openspcoop2.utils.wsdl.DefinitionWrapper;
  57. import org.openspcoop2.utils.wsdl.WSDLUtilities;
  58. import org.openspcoop2.utils.xacml.MarshallUtilities;
  59. import org.openspcoop2.utils.xml.AbstractXMLUtils;
  60. import org.openspcoop2.utils.xml.XMLUtils;
  61. import org.openspcoop2.utils.xml.XSDUtils;
  62. import org.w3c.dom.Document;

  63. /**
  64.  * ValidazioneDocumenti
  65.  *
  66.  * @author Poli Andrea (apoli@link.it)
  67.  * @author $Author$
  68.  * @version $Rev$, $Date$
  69.  */
  70. public class ValidazioneDocumenti extends BasicComponentFactory implements IValidazioneDocumenti{

  71.     protected AbstractXMLUtils xmlUtils = null;
  72.     protected XSDUtils xsdUtils = null;
  73.     protected WSDLUtilities wsdlUtilities = null;
  74.     protected JSONUtils jsonUtils = null;
  75.     protected YAMLUtils yamlUtils = null;
  76.    
  77.     public ValidazioneDocumenti(IProtocolFactory<?> factory) throws ProtocolException{
  78.         super(factory);
  79.         this.xmlUtils = XMLUtils.getInstance();
  80.         this.xsdUtils = new XSDUtils(this.xmlUtils);
  81.         this.wsdlUtilities = WSDLUtilities.getInstance(this.xmlUtils);
  82.         this.jsonUtils = JSONUtils.getInstance();
  83.         this.yamlUtils = YAMLUtils.getInstance();
  84.     }

  85.     @Override
  86.     public ValidazioneResult validaSpecificaInterfaccia(
  87.             AccordoServizioParteComune accordoServizioParteComune) {

  88.         String objectInEsame = null;
  89.         ValidazioneResult result = new ValidazioneResult();
  90.         result.setEsito(false);

  91.         if(ServiceBinding.SOAP.equals(accordoServizioParteComune.getServiceBinding())) {

  92.             // interfaccia wsdl Definitoria
  93.             try{
  94.                 objectInEsame = "[InterfacciaWSDL Definitoria] ";
  95.    
  96.                 byte[]wsdlDefinitorio = null;
  97.                 if(accordoServizioParteComune.getByteWsdlDefinitorio()!=null){
  98.                     wsdlDefinitorio = accordoServizioParteComune.getByteWsdlDefinitorio();
  99.                 }
  100.                 else if(accordoServizioParteComune.getWsdlDefinitorio()!=null){
  101.                     wsdlDefinitorio = this.readDocumento(accordoServizioParteComune.getWsdlDefinitorio());      
  102.                 }
  103.                 if(wsdlDefinitorio!=null){
  104.                     // Verifico che sia un documento xml valido
  105.                     this.xmlUtils.newDocument(wsdlDefinitorio);
  106.                     // Verifico che sia un xsd, leggendone il targetNamespace
  107.                     this.xsdUtils.getTargetNamespace(wsdlDefinitorio);              
  108.                 }  
  109.             }catch(Exception e){
  110.                 result.setMessaggioErrore(objectInEsame+" Documento non valido: "+e.getMessage());
  111.                 result.setException(e);
  112.                 return result;
  113.             }
  114.    
  115.    
  116.             // interfaccia wsdl Concettuale
  117.             try{
  118.                 objectInEsame = "[InterfacciaWSDL Concettuale] ";
  119.    
  120.                 byte[]wsdlConcettuale = null;
  121.                 if(accordoServizioParteComune.getByteWsdlConcettuale()!=null){
  122.                     wsdlConcettuale = accordoServizioParteComune.getByteWsdlConcettuale();
  123.                 }
  124.                 else if(accordoServizioParteComune.getWsdlConcettuale()!=null){
  125.                     wsdlConcettuale = this.readDocumento(accordoServizioParteComune.getWsdlConcettuale());      
  126.                 }
  127.                 if(wsdlConcettuale!=null){
  128.                     // Verifico che sia un documento xml valido
  129.                     Document d = this.xmlUtils.newDocument(wsdlConcettuale);
  130.                     // Verifico che sia un wsdl, leggendone il targetNamespace
  131.                     this.wsdlUtilities.getTargetNamespace(wsdlConcettuale);
  132.                     // Costruisco wsdl
  133.                     this.wsdlUtilities.removeSchemiIntoTypes(d);
  134.                     DefinitionWrapper wsdl = new DefinitionWrapper(d,this.xmlUtils,false,false);
  135.                     // Valido
  136.                     wsdl.valida(false);
  137.                 }
  138.             }catch(Exception e){
  139.                 result.setMessaggioErrore(objectInEsame+" Documento non valido: "+e.getMessage());
  140.                 result.setException(e);
  141.                 return result;
  142.             }  
  143.    
  144.    
  145.             // interfaccia wsdl Erogatore
  146.             try{
  147.                 objectInEsame = "[InterfacciaWSDL Erogatore] ";
  148.    
  149.                 byte[]wsdlErogatore = null;
  150.                 if(accordoServizioParteComune.getByteWsdlLogicoErogatore()!=null){
  151.                     wsdlErogatore = accordoServizioParteComune.getByteWsdlLogicoErogatore();
  152.                 }
  153.                 else if(accordoServizioParteComune.getWsdlLogicoErogatore()!=null){
  154.                     wsdlErogatore = this.readDocumento(accordoServizioParteComune.getWsdlLogicoErogatore());        
  155.                 }
  156.                 if(wsdlErogatore!=null){
  157.                     // Verifico che sia un documento xml valido
  158.                     Document d = this.xmlUtils.newDocument(wsdlErogatore);
  159.                     // Verifico che sia un wsdl, leggendone il targetNamespace
  160.                     this.wsdlUtilities.getTargetNamespace(wsdlErogatore);
  161.                     // Costruisco wsdl
  162.                     this.wsdlUtilities.removeSchemiIntoTypes(d);
  163.                     DefinitionWrapper wsdl = new DefinitionWrapper(d, this.xmlUtils,false,false);
  164.                     // Valido
  165.                     wsdl.valida(false);
  166.                 }  
  167.             }catch(Exception e){
  168.                 result.setMessaggioErrore(objectInEsame+" Documento non valido: "+e.getMessage());
  169.                 result.setException(e);
  170.                 return result;
  171.             }
  172.    
  173.    
  174.             // interfaccia wsdl Fruitore
  175.             try{
  176.                 objectInEsame = "[InterfacciaWSDL Fruitore] ";
  177.    
  178.                 byte[]wsdlFruitore = null;
  179.                 if(accordoServizioParteComune.getByteWsdlLogicoFruitore()!=null){
  180.                     wsdlFruitore = accordoServizioParteComune.getByteWsdlLogicoFruitore();
  181.                 }
  182.                 else if(accordoServizioParteComune.getWsdlLogicoFruitore()!=null){
  183.                     wsdlFruitore = this.readDocumento(accordoServizioParteComune.getWsdlLogicoFruitore());      
  184.                 }
  185.                 if(wsdlFruitore!=null){
  186.                     // Verifico che sia un documento xml valido
  187.                     Document d = this.xmlUtils.newDocument(wsdlFruitore);
  188.                     // Verifico che sia un wsdl, leggendone il targetNamespace
  189.                     this.wsdlUtilities.getTargetNamespace(wsdlFruitore);
  190.                     // Costruisco wsdl
  191.                     this.wsdlUtilities.removeSchemiIntoTypes(d);
  192.                     DefinitionWrapper wsdl = new DefinitionWrapper(d,this.xmlUtils,false,false);
  193.                     // Valido
  194.                     wsdl.valida(false);
  195.                 }  
  196.             }catch(Exception e){
  197.                 result.setMessaggioErrore(objectInEsame+" Documento non valido: "+e.getMessage());
  198.                 result.setException(e);
  199.                 return result;
  200.             }
  201.            
  202.         }
  203.         else {
  204.            
  205.            
  206.             // interfaccia
  207.             try{
  208.                
  209.                 byte[]wsdlConcettuale = null;
  210.                 if(accordoServizioParteComune.getByteWsdlConcettuale()!=null){
  211.                     wsdlConcettuale = accordoServizioParteComune.getByteWsdlConcettuale();
  212.                 }
  213.                 else if(accordoServizioParteComune.getWsdlConcettuale()!=null){
  214.                     wsdlConcettuale = this.readDocumento(accordoServizioParteComune.getWsdlConcettuale());      
  215.                 }
  216.                 if(wsdlConcettuale!=null){
  217.                
  218.                     if(accordoServizioParteComune.getFormatoSpecifica()!=null) {
  219.                        
  220.                         ApiFormats format = null;
  221.                         switch (accordoServizioParteComune.getFormatoSpecifica()) {
  222.                         case WADL:
  223.                             objectInEsame = "[Interfaccia WADL] ";
  224.                             format=ApiFormats.WADL;
  225.                             break;
  226.                         case SWAGGER_2:
  227.                             objectInEsame = "[Interfaccia Swagger 2] ";
  228.                             format=ApiFormats.SWAGGER_2;
  229.                             break;
  230.                         case OPEN_API_3:
  231.                             objectInEsame = "[Interfaccia OpenAPI 3] ";
  232.                             format=ApiFormats.OPEN_API_3;
  233.                             break;
  234.                         default:
  235.                             // altre interfacce non supportate per rest
  236.                             break;
  237.                         }
  238.                        
  239.                         ApiReaderConfig config = new ApiReaderConfig();
  240.                         config.setProcessInclude(false);
  241.                         IApiReader apiReader = ApiFactory.newApiReader(format);
  242.                         apiReader.init(this.log, wsdlConcettuale, config);
  243.                         Api api = apiReader.read();
  244.                         try {
  245.                             api.validate();
  246.                         }catch(ParseWarningException warning) {
  247.                             result.setEsito(true);
  248.                             result.setMessaggioWarning(objectInEsame+" Documento contenente anomalie: "+warning.getMessage());
  249.                             return result;
  250.                         }
  251.                     }
  252.                    

  253.                 }
  254.             }
  255.             catch(Exception e){
  256.                 result.setMessaggioErrore(objectInEsame+" Documento non valido: "+e.getMessage());
  257.                 result.setException(e);
  258.                 return result;
  259.             }  
  260.            
  261.         }


  262.         // result
  263.         result.setEsito(true);
  264.         return result;
  265.     }

  266.     @Override
  267.     public ValidazioneResult validaSpecificaConversazione(
  268.             AccordoServizioParteComune accordoServizioParteComune) {
  269.         ValidazioneResult result = new ValidazioneResult();
  270.         result.setEsito(true);
  271.         return result;
  272.     }

  273.     @Override
  274.     public ValidazioneResult validaSpecificaInterfaccia(
  275.             AccordoServizioParteSpecifica accordoServizioParteSpecifica,
  276.             AccordoServizioParteComune accordoServizioParteComune) {

  277.         ValidazioneResult result = new ValidazioneResult();
  278.         result.setEsito(false);

  279.         // Raccolta wsdl
  280.         String tipoWsdl = null;
  281.         byte[]wsdlImplementativoFruitore = null;
  282.         byte[]wsdlImplementativoErogatore = null;
  283.         byte[]wsdlLogicoFruitore = null;
  284.         byte[]wsdlLogicoErogatore = null;
  285.         try{
  286.             tipoWsdl = "ImplementativoFruitore";
  287.             if(accordoServizioParteSpecifica.getByteWsdlImplementativoFruitore()!=null){
  288.                 wsdlImplementativoFruitore = accordoServizioParteSpecifica.getByteWsdlImplementativoFruitore();
  289.             }
  290.             else if(accordoServizioParteSpecifica.getWsdlImplementativoFruitore()!=null){
  291.                 wsdlImplementativoFruitore = this.readDocumento(accordoServizioParteSpecifica.getWsdlImplementativoFruitore());    
  292.             }

  293.             tipoWsdl = "ImplementativoErogatore";
  294.             if(accordoServizioParteSpecifica.getByteWsdlImplementativoErogatore()!=null){
  295.                 wsdlImplementativoErogatore = accordoServizioParteSpecifica.getByteWsdlImplementativoErogatore();
  296.             }
  297.             else if(accordoServizioParteSpecifica.getWsdlImplementativoErogatore()!=null){
  298.                 wsdlImplementativoErogatore = this.readDocumento(accordoServizioParteSpecifica.getWsdlImplementativoErogatore());      
  299.             }

  300.             tipoWsdl = "LogicoFruitore";
  301.             if(accordoServizioParteComune.getByteWsdlLogicoFruitore()!=null){
  302.                 wsdlLogicoFruitore = accordoServizioParteComune.getByteWsdlLogicoFruitore();
  303.             }
  304.             else if(accordoServizioParteComune.getWsdlLogicoFruitore()!=null){
  305.                 wsdlLogicoFruitore = this.readDocumento(accordoServizioParteComune.getWsdlLogicoFruitore());        
  306.             }

  307.             tipoWsdl = "LogicoErogatore";
  308.             if(accordoServizioParteComune.getByteWsdlLogicoErogatore()!=null){
  309.                 wsdlLogicoErogatore = accordoServizioParteComune.getByteWsdlLogicoErogatore();
  310.             }
  311.             else if(accordoServizioParteComune.getWsdlLogicoErogatore()!=null){
  312.                 wsdlLogicoErogatore = this.readDocumento(accordoServizioParteComune.getWsdlLogicoErogatore());      
  313.             }
  314.         }catch(Exception e){
  315.             result.setMessaggioErrore("Raccolta wsdl "+tipoWsdl+" non riuscita: "+e.getMessage());
  316.             result.setException(e);
  317.             return result;
  318.         }

  319.        
  320.        
  321.        

  322.         // WSDL Erogatore
  323.         List<String> portTypesWSDL_erogatore = new ArrayList<>();
  324.         tipoWsdl = "LogicoErogatore";
  325.         try{
  326.             if(wsdlLogicoErogatore!=null){
  327.                 Document dParteComune = this.xmlUtils.newDocument(wsdlLogicoErogatore);
  328.                 this.wsdlUtilities.removeSchemiIntoTypes(dParteComune);
  329.                 DefinitionWrapper wsdlParteCoumune = new DefinitionWrapper(dParteComune,this.xmlUtils,false,false);

  330.                 Iterator<?> it = wsdlParteCoumune.getAllPortTypes().keySet().iterator();
  331.                 while(it.hasNext()){
  332.                     javax.xml.namespace.QName pt = (javax.xml.namespace.QName) it.next();
  333.                     portTypesWSDL_erogatore.add(pt.getLocalPart());
  334.                 }
  335.             }

  336.         }catch(Exception e){
  337.             result.setMessaggioErrore("Lettura wsdl "+tipoWsdl+" (identificazione port types) non riuscita: "+e.getMessage());
  338.             result.setException(e);
  339.             return result;
  340.         }
  341.         if(portTypesWSDL_erogatore.size()==0){
  342.             if(wsdlImplementativoErogatore!=null){
  343.                 result.setMessaggioErrore("Per poter fornire un WSDL Implementativo Erogatore, è necessario prima definire un wsdl logico erogatore valido nell'accordo di servizio parte comune");
  344.                 return result;
  345.             }
  346.         }
  347.        
  348.        
  349.        
  350.        
  351.         // WSDL Fruitore
  352.         List<String> portTypesWSDL_fruitore = new ArrayList<>();
  353.         tipoWsdl = "LogicoFruitore";
  354.         try{
  355.             if(wsdlLogicoFruitore!=null){
  356.                 Document dParteComune = this.xmlUtils.newDocument(wsdlLogicoFruitore);
  357.                 this.wsdlUtilities.removeSchemiIntoTypes(dParteComune);
  358.                 DefinitionWrapper wsdlParteCoumune = new DefinitionWrapper(dParteComune,this.xmlUtils,false,false);

  359.                 Iterator<?> it = wsdlParteCoumune.getAllPortTypes().keySet().iterator();
  360.                 while(it.hasNext()){
  361.                     javax.xml.namespace.QName pt = (javax.xml.namespace.QName) it.next();
  362.                     portTypesWSDL_fruitore.add(pt.getLocalPart());
  363.                 }
  364.             }

  365.         }catch(Exception e){
  366.             result.setMessaggioErrore("Lettura wsdl "+tipoWsdl+" (identificazione port types) non riuscita: "+e.getMessage());
  367.             result.setException(e);
  368.             return result;
  369.         }
  370.         if(portTypesWSDL_fruitore.size()==0){
  371.             if(wsdlImplementativoFruitore!=null){
  372.                 result.setMessaggioErrore("Per poter fornire un WSDL Implementativo Fruitore, è necessario prima definire un wsdl logico fruitore valido nell'accordo di servizio parte comune");
  373.                 return result;
  374.             }
  375.         }

  376.        
  377.        
  378.        
  379.        
  380.         // Check Presenza WSDL Implementativo
  381.         // Check spostato nello stato finale
  382. //      if(wsdlImplementativoErogatore==null &&
  383. //              wsdlImplementativoFruitore==null){
  384. //          result.setMessaggioErrore("Non è presente alcun WSDL implementativo");
  385. //          return result;
  386. //      }
  387.         if(wsdlImplementativoErogatore!=null &&
  388.                 wsdlImplementativoFruitore!=null){
  389.             result.setMessaggioErrore("Non è possibile definire sia il WSDL implementativo erogatore che il WSDL implementativo fruitore");
  390.             return result;
  391.         }
  392.        
  393.        
  394.        
  395.        

  396.         // Check WSDL Implementativo erogatore
  397.         try{
  398.             if(wsdlImplementativoErogatore!=null){
  399.                 // Verifico che sia un documento xml valido
  400.                 Document d = this.xmlUtils.newDocument(wsdlImplementativoErogatore);
  401.                 // Verifico che sia un wsdl, leggendone il targetNamespace
  402.                 this.wsdlUtilities.getTargetNamespace(wsdlImplementativoErogatore);
  403.                 // Costruisco wsdl
  404.                 this.wsdlUtilities.removeSchemiIntoTypes(d);
  405.                 DefinitionWrapper wsdlParteSpecifica = new DefinitionWrapper(d,this.xmlUtils,false,false);
  406.                 // Valida Bindings
  407.                 wsdlParteSpecifica.validaBinding(portTypesWSDL_erogatore);
  408.                 // Check presenza al massimo di un solo port type riferito dai vari binding
  409.                 checkPortTypeInBinding(wsdlParteSpecifica);
  410.             }
  411.         }catch(Exception e){
  412.             result.setMessaggioErrore("WSDL Implementativo Erogatore non valido: "+e.getMessage());
  413.             result.setException(e);
  414.             return result;
  415.         }
  416.        
  417.        
  418.        
  419.        
  420.         // Check WSDL Implementativo fruitore
  421.         try{
  422.             if(wsdlImplementativoFruitore!=null){
  423.                 // Verifico che sia un documento xml valido
  424.                 Document d = this.xmlUtils.newDocument(wsdlImplementativoFruitore);
  425.                 // Verifico che sia un wsdl, leggendone il targetNamespace
  426.                 this.wsdlUtilities.getTargetNamespace(wsdlImplementativoFruitore);
  427.                 // Costruisco wsdl
  428.                 this.wsdlUtilities.removeSchemiIntoTypes(d);
  429.                 DefinitionWrapper wsdlParteSpecifica = new DefinitionWrapper(d,this.xmlUtils,false,false);
  430.                 // Valida Bindings
  431.                 wsdlParteSpecifica.validaBinding(portTypesWSDL_fruitore);
  432.                 // Check presenza al massimo di un solo port type riferito dai vari binding
  433.                 checkPortTypeInBinding(wsdlParteSpecifica);
  434.             }
  435.         }catch(Exception e){
  436.             result.setMessaggioErrore("WSDL Implementativo Fruitore non valido: "+e.getMessage());
  437.             result.setException(e);
  438.             return result;
  439.         }

  440.        
  441.        
  442.         // result
  443.         result.setEsito(true);
  444.         return result;
  445.     }
  446.     private void checkPortTypeInBinding(DefinitionWrapper wsdlParteSpecifica) throws Exception{
  447.         Map<QName,QName> mapBindingToPortTypeImplemented = wsdlParteSpecifica.getMapPortTypesImplementedBinding();
  448.         List<String> portTypes = new ArrayList<>();
  449.         StringBuilder bf = new StringBuilder();
  450.         for (QName binding : mapBindingToPortTypeImplemented.keySet()) {
  451.             QName portType = mapBindingToPortTypeImplemented.get(binding);
  452.             String portTypeName = portType.getLocalPart();
  453.             if(portTypes.contains(portTypeName)==false){
  454.                 portTypes.add(portTypeName);
  455.                 if(bf.length()>0){
  456.                     bf.append(",");
  457.                 }
  458.                 bf.append(portTypeName);
  459.             }
  460.         }
  461.        
  462.         if(portTypes.size()>1){
  463.             throw new Exception("Trovato più di un port type implementato dai binding presenti: "+bf.toString());
  464.         }
  465.     }

  466.    
  467.     @Override
  468.     public ValidazioneResult validaSpecificaInterfaccia(Fruitore fruitore, AccordoServizioParteSpecifica accordoServizioParteSpecifica , AccordoServizioParteComune accordoServizioParteComune){
  469.         AccordoServizioParteSpecifica as = new AccordoServizioParteSpecifica();
  470.         as.setByteWsdlImplementativoErogatore(fruitore.getByteWsdlImplementativoErogatore());
  471.         as.setByteWsdlImplementativoFruitore(fruitore.getByteWsdlImplementativoFruitore());
  472.         as.setWsdlImplementativoErogatore(fruitore.getWsdlImplementativoErogatore());
  473.         as.setWsdlImplementativoFruitore(fruitore.getWsdlImplementativoFruitore());
  474.         return this.validaSpecificaInterfaccia(as, accordoServizioParteComune);
  475.     }
  476.    
  477.     @Override
  478.     public ValidazioneResult valida(Documento documento) {
  479.        
  480.         ValidazioneResult result = new ValidazioneResult();
  481.         result.setEsito(false);
  482.                
  483.         if(documento.getTipo()!=null) {
  484.             if(TipiDocumentoInterfaccia.WSDL.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  485.                     TipiDocumentoConversazione.WSBL.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  486.                     TipiDocumentoConversazione.BPEL.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  487.                     TipiDocumentoCoordinamento.BPEL.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  488.                     TipiDocumentoCoordinamento.WSCDL.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  489.                     TipiDocumentoLivelloServizio.WSAGREEMENT.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  490.                     TipiDocumentoLivelloServizio.WSLA.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  491.                     TipiDocumentoSemiformale.XML.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  492.                     TipiDocumentoSicurezza.WSPOLICY.toString().toLowerCase().equals(documento.getTipo().toLowerCase()) ||
  493.                     TipiDocumentoSicurezza.XACML_POLICY.toString().toLowerCase().equals(documento.getTipo().toLowerCase())
  494.             ){
  495.                 // Valido che sia un documento XML corretto.
  496.                 try{
  497.                    
  498.                     byte[]doc = null;
  499.                     if(documento.getByteContenuto()!=null){
  500.                         doc = documento.getByteContenuto();
  501.                     }
  502.                     else if(documento.getFile()!=null){
  503.                         doc = this.readDocumento(documento.getFile());      
  504.                     }
  505.                     if(doc!=null){
  506.                         // Verifico che sia un documento xml valido
  507.                         this.xmlUtils.newDocument(doc);    
  508.                     }  
  509.                    
  510.                     if(TipiDocumentoSicurezza.XACML_POLICY.toString().toLowerCase().equals(documento.getTipo().toLowerCase())){
  511.                         if(MarshallUtilities.unmarshallPolicy(doc)==null) {
  512.                             throw new Exception("Policy non corretta");
  513.                         }
  514.                     }
  515.                    
  516.                 }catch(Exception e){
  517.                     result.setMessaggioErrore("Documento "+documento.getFile()+" (ruolo:"+documento.getRuolo()+") non valido: "+e.getMessage());
  518.                     result.setException(e);
  519.                     return result;
  520.                 }
  521.             }
  522.             else if(TipiDocumentoSemiformale.XSD.toString().toLowerCase().equals(documento.getTipo().toLowerCase())){
  523.                 // Valido che sia un documento XSD corretto.
  524.                 try{
  525.                    
  526.                     byte[]doc = null;
  527.                     if(documento.getByteContenuto()!=null){
  528.                         doc = documento.getByteContenuto();
  529.                     }
  530.                     else if(documento.getFile()!=null){
  531.                         doc = this.readDocumento(documento.getFile());      
  532.                     }
  533.                     if(doc!=null){
  534.                         // Verifico che sia un documento valido
  535.                         this.xmlUtils.newDocument(doc);
  536.                         if(this.xsdUtils.isXSDSchema(doc)==false) {
  537.                             throw new Exception("non riconosciuto come documento xsd");
  538.                         }
  539.                     }  
  540.                 }catch(Exception e){
  541.                     result.setMessaggioErrore("Documento "+documento.getFile()+" (ruolo:"+documento.getRuolo()+") non valido: "+e.getMessage());
  542.                     result.setException(e);
  543.                     return result;
  544.                 }
  545.             }
  546.             else if(TipiDocumentoSemiformale.JSON.toString().toLowerCase().equals(documento.getTipo().toLowerCase())){
  547.                 // Valido che sia un documento JSON corretto.
  548.                 try{
  549.                    
  550.                     byte[]doc = null;
  551.                     if(documento.getByteContenuto()!=null){
  552.                         doc = documento.getByteContenuto();
  553.                     }
  554.                     else if(documento.getFile()!=null){
  555.                         doc = this.readDocumento(documento.getFile());      
  556.                     }
  557.                     if(doc!=null){
  558.                         // Verifico che sia un documento valido
  559.                         this.jsonUtils.getAsNode(doc);
  560.                         if(this.jsonUtils.isJson(doc)==false) {
  561.                             throw new Exception("non riconosciuto come documento json");
  562.                         }
  563.                     }  
  564.                 }catch(Exception e){
  565.                     result.setMessaggioErrore("Documento "+documento.getFile()+" (ruolo:"+documento.getRuolo()+") non valido: "+e.getMessage());
  566.                     result.setException(e);
  567.                     return result;
  568.                 }
  569.             }
  570.             else if(TipiDocumentoSemiformale.YAML.toString().toLowerCase().equals(documento.getTipo().toLowerCase())){
  571.                 // Valido che sia un documento YAML corretto.
  572.                 try{
  573.                    
  574.                     byte[]doc = null;
  575.                     if(documento.getByteContenuto()!=null){
  576.                         doc = documento.getByteContenuto();
  577.                     }
  578.                     else if(documento.getFile()!=null){
  579.                         doc = this.readDocumento(documento.getFile());      
  580.                     }
  581.                     if(doc!=null){
  582.                         // Verifico che sia un documento valido
  583.                         this.yamlUtils.getAsNode(doc);
  584.                         if(this.yamlUtils.isYaml(doc)==false) {
  585.                             throw new Exception("non riconosciuto come documento yaml");
  586.                         }
  587.                     }  
  588.                 }catch(Exception e){
  589.                     result.setMessaggioErrore("Documento "+documento.getFile()+" (ruolo:"+documento.getRuolo()+") non valido: "+e.getMessage());
  590.                     result.setException(e);
  591.                     return result;
  592.                 }
  593.             }
  594.         }
  595.        
  596.         // result
  597.         result.setEsito(true);
  598.         return result;
  599.     }

  600.     @Override
  601.     public ValidazioneResult validaDocumenti(
  602.             AccordoServizioParteComune accordoServizioParteComune) {
  603. //      // wsdl
  604. //      ValidazioneDocumentiResult v = this.validaInterfacciaWsdlParteComune(accordoServizioParteComune);
  605. //      if(v.isEsito()==false){
  606. //          return v;
  607. //      }
  608. //      
  609. //      // conversazione
  610. //      v = this.validaSpecificaConversazione(accordoServizioParteComune);
  611. //      if(v.isEsito()==false){
  612. //          return v;
  613. //      }
  614.        
  615.         // allegati
  616.         for (int i = 0; i < accordoServizioParteComune.sizeAllegatoList(); i++) {
  617.             ValidazioneResult v = this.valida(accordoServizioParteComune.getAllegato(i));
  618.             if(v.isEsito()==false){
  619.                 return v;
  620.             }
  621.         }
  622.        
  623.         // specifica semiformale
  624.         for (int i = 0; i < accordoServizioParteComune.sizeSpecificaSemiformaleList(); i++) {
  625.             ValidazioneResult v = this.valida(accordoServizioParteComune.getSpecificaSemiformale(i));
  626.             if(v.isEsito()==false){
  627.                 return v;
  628.             }
  629.         }
  630.        
  631.         // servizio composto
  632.         if(accordoServizioParteComune.getServizioComposto()!=null){
  633.             for (int i = 0; i < accordoServizioParteComune.getServizioComposto().sizeSpecificaCoordinamentoList(); i++) {
  634.                 ValidazioneResult v = this.valida(accordoServizioParteComune.getServizioComposto().getSpecificaCoordinamento(i));
  635.                 if(v.isEsito()==false){
  636.                     return v;
  637.                 }
  638.             }
  639.         }
  640.        
  641.         ValidazioneResult result = new ValidazioneResult();
  642.         result.setEsito(true);
  643.         return result;
  644.     }

  645.     @Override
  646.     public ValidazioneResult validaDocumenti(
  647.             AccordoServizioParteSpecifica accordoServizioParteSpecifica) {
  648.        
  649.         // allegati
  650.         for (int i = 0; i < accordoServizioParteSpecifica.sizeAllegatoList(); i++) {
  651.             ValidazioneResult v = this.valida(accordoServizioParteSpecifica.getAllegato(i));
  652.             if(v.isEsito()==false){
  653.                 return v;
  654.             }
  655.         }
  656.        
  657.         // specifica semiformale
  658.         for (int i = 0; i < accordoServizioParteSpecifica.sizeSpecificaSemiformaleList(); i++) {
  659.             ValidazioneResult v = this.valida(accordoServizioParteSpecifica.getSpecificaSemiformale(i));
  660.             if(v.isEsito()==false){
  661.                 return v;
  662.             }
  663.         }
  664.        
  665.         // specifica livello servizio
  666.         for (int i = 0; i < accordoServizioParteSpecifica.sizeSpecificaLivelloServizioList(); i++) {
  667.             ValidazioneResult v = this.valida(accordoServizioParteSpecifica.getSpecificaLivelloServizio(i));
  668.             if(v.isEsito()==false){
  669.                 return v;
  670.             }
  671.         }
  672.        
  673.         // specifica sicurezza
  674.         for (int i = 0; i < accordoServizioParteSpecifica.sizeSpecificaSicurezzaList(); i++) {
  675.             ValidazioneResult v = this.valida(accordoServizioParteSpecifica.getSpecificaSicurezza(i));
  676.             if(v.isEsito()==false){
  677.                 return v;
  678.             }
  679.         }
  680.        
  681.         ValidazioneResult result = new ValidazioneResult();
  682.         result.setEsito(true);
  683.         return result;
  684.     }

  685.     @Override
  686.     public ValidazioneResult validaDocumenti(
  687.             AccordoCooperazione accordoCooperazione) {
  688.        
  689.         // allegati
  690.         for (int i = 0; i < accordoCooperazione.sizeAllegatoList(); i++) {
  691.             ValidazioneResult v = this.valida(accordoCooperazione.getAllegato(i));
  692.             if(v.isEsito()==false){
  693.                 return v;
  694.             }
  695.         }
  696.        
  697.         // specifica semiformale
  698.         for (int i = 0; i < accordoCooperazione.sizeSpecificaSemiformaleList(); i++) {
  699.             ValidazioneResult v = this.valida(accordoCooperazione.getSpecificaSemiformale(i));
  700.             if(v.isEsito()==false){
  701.                 return v;
  702.             }
  703.         }
  704.                
  705.         ValidazioneResult result = new ValidazioneResult();
  706.         result.setEsito(true);
  707.         return result;
  708.        
  709.     }



  710.     protected byte[] readDocumento(String fileName) throws ProtocolException{

  711.         ByteArrayOutputStream bout = new ByteArrayOutputStream();
  712.         try{
  713.             if(fileName.startsWith("http://") || fileName.startsWith("file://")){
  714.                 byte[] file = HttpUtilities.requestHTTPFile(fileName);
  715.                 if(file==null)
  716.                     throw new Exception("byte[] is null");
  717.                 else
  718.                     bout.write(file);
  719.             }else{
  720.                 File f = new File(fileName);
  721.                 if(f.exists()){
  722.                     FileInputStream file = null;
  723.                     try{
  724.                         file = new FileInputStream(f);
  725. //                      byte [] reads = new byte[Utilities.DIMENSIONE_BUFFER];
  726. //                      int letti = 0;
  727. //                      while( (letti=file.read(reads)) >=0 ){
  728. //                          bout.write(reads,0,letti);
  729. //                      }
  730.                         CopyStream.copy(file, bout);
  731.                     }finally{
  732.                         try{
  733.                             if(file!=null){
  734.                                 file.close();
  735.                             }
  736.                         }catch(Exception eClose){
  737.                             // close
  738.                         }
  739.                     }      
  740.                 }
  741.                 else{
  742.                     throw new Exception("File ["+fileName+"] non esistente");
  743.                 }
  744.             }
  745.             bout.flush();
  746.             bout.close();
  747.             if(bout.size()>0){
  748.                 return bout.toByteArray();
  749.             }

  750.         }catch(Exception e){
  751.             this.log.warn("File "+fileName+", lettura documento non riuscita:",e);
  752.         }  

  753.         throw new ProtocolException("Contenuto non letto?? File ["+fileName+"]");
  754.     }
  755. }