ValidazioneSemantica.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.registry.driver;

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

  27. import org.openspcoop2.core.constants.CostantiConnettori;
  28. import org.openspcoop2.core.constants.CostantiDB;
  29. import org.openspcoop2.core.constants.TipiConnettore;
  30. import org.openspcoop2.core.id.IDAccordo;
  31. import org.openspcoop2.core.id.IDAccordoCooperazione;
  32. import org.openspcoop2.core.registry.AccordoCooperazione;
  33. import org.openspcoop2.core.registry.AccordoCooperazionePartecipanti;
  34. import org.openspcoop2.core.registry.AccordoServizioParteComune;
  35. import org.openspcoop2.core.registry.AccordoServizioParteComuneServizioComposto;
  36. import org.openspcoop2.core.registry.AccordoServizioParteComuneServizioCompostoServizioComponente;
  37. import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
  38. import org.openspcoop2.core.registry.Azione;
  39. import org.openspcoop2.core.registry.ConfigurazioneServizio;
  40. import org.openspcoop2.core.registry.ConfigurazioneServizioAzione;
  41. import org.openspcoop2.core.registry.Connettore;
  42. import org.openspcoop2.core.registry.CredenzialiSoggetto;
  43. import org.openspcoop2.core.registry.Documento;
  44. import org.openspcoop2.core.registry.Fruitore;
  45. import org.openspcoop2.core.registry.IdSoggetto;
  46. import org.openspcoop2.core.registry.Message;
  47. import org.openspcoop2.core.registry.MessagePart;
  48. import org.openspcoop2.core.registry.Operation;
  49. import org.openspcoop2.core.registry.PortType;
  50. import org.openspcoop2.core.registry.PortaDominio;
  51. import org.openspcoop2.core.registry.Property;
  52. import org.openspcoop2.core.registry.Resource;
  53. import org.openspcoop2.core.registry.Ruolo;
  54. import org.openspcoop2.core.registry.Scope;
  55. import org.openspcoop2.core.registry.Soggetto;
  56. import org.openspcoop2.core.registry.constants.BindingStyle;
  57. import org.openspcoop2.core.registry.constants.BindingUse;
  58. import org.openspcoop2.core.registry.constants.CostantiRegistroServizi;
  59. import org.openspcoop2.core.registry.constants.CredenzialeTipo;
  60. import org.openspcoop2.core.registry.constants.ProfiloCollaborazione;
  61. import org.openspcoop2.core.registry.constants.RuoliDocumento;
  62. import org.openspcoop2.core.registry.constants.ServiceBinding;
  63. import org.openspcoop2.core.registry.constants.StatoFunzionalita;
  64. import org.openspcoop2.core.registry.constants.TipiDocumentoCoordinamento;
  65. import org.openspcoop2.core.registry.constants.TipiDocumentoLivelloServizio;
  66. import org.openspcoop2.core.registry.constants.TipiDocumentoSemiformale;
  67. import org.openspcoop2.core.registry.constants.TipiDocumentoSicurezza;
  68. import org.openspcoop2.utils.certificate.CertificateUtils;
  69. import org.openspcoop2.utils.certificate.PrincipalType;
  70. import org.openspcoop2.utils.regexp.RegularExpressionEngine;
  71. import org.openspcoop2.utils.transport.http.HttpUtilities;
  72. import org.slf4j.Logger;


  73. /**
  74.  * Validazione Semantica
  75.  *
  76.  * @author Sandra Giangrandi (sandra@link.it)
  77.  * @author $Author$
  78.  * @version $Rev$, $Date$
  79.  */
  80. public class ValidazioneSemantica {

  81.     /** Registro servizi */
  82.     private org.openspcoop2.core.registry.RegistroServizi registro = null;
  83.     /** Lista in cui scrivo le anomalie riscontrate */
  84.     private List<String> errori = new ArrayList<>();
  85.     /** Logger */
  86.     private Logger log = null;
  87.     /** Controllo url */
  88.     private boolean checkEsistenzaFileDefinitoTramiteURI = false;
  89.    
  90.     // Factory
  91.     private IDAccordoFactory idAccordoFactory = IDAccordoFactory.getInstance();
  92.     private IDAccordoCooperazioneFactory idAccordoCooperazioneFactory = IDAccordoCooperazioneFactory.getInstance();
  93.     private IDServizioFactory idServizioFactory = IDServizioFactory.getInstance();


  94.     /** Lista di tipi di connettori validi */
  95.     private List<String> tipoConnettori = new ArrayList<>();
  96.     /** Lista dei tipi di connettori ammessi */
  97.     private String getTipoConnettori(){
  98.         StringBuilder bf = new StringBuilder();
  99.         for(int i=0; i<this.tipoConnettori.size(); i++){
  100.             if(i>0)
  101.                 bf.append(",");
  102.             bf.append(this.tipoConnettori.get(i));
  103.         }
  104.         return bf.toString();
  105.     }

  106.     /** Lista di tipi di soggetti validi */
  107.     private List<String> tipoSoggetti = new ArrayList<>();
  108.     /** Lista dei tipi di soggetti ammessi */
  109.     private String getTipoSoggetti(){
  110.         StringBuilder bf = new StringBuilder();
  111.         for(int i=0; i<this.tipoSoggetti.size(); i++){
  112.             if(i>0)
  113.                 bf.append(",");
  114.             bf.append(this.tipoSoggetti.get(i));
  115.         }
  116.         return bf.toString();
  117.     }

  118.     /** Lista di tipi di servizi SOAP validi */
  119.     private List<String> tipoServiziSoap = new ArrayList<>();
  120.     /** Lista dei tipi di servizi SOAP ammessi */
  121.     private String getTipoServiziSoap(){
  122.         StringBuilder bf = new StringBuilder();
  123.         for(int i=0; i<this.tipoServiziSoap.size(); i++){
  124.             if(i>0)
  125.                 bf.append(",");
  126.             bf.append(this.tipoServiziSoap.get(i));
  127.         }
  128.         return bf.toString();
  129.     }
  130.    
  131.     /** Lista di tipi di servizi REST validi */
  132.     private List<String> tipoServiziRest = new ArrayList<>();
  133.     /** Lista dei tipi di servizi REST ammessi */
  134.     private String getTipoServiziRest(){
  135.         StringBuilder bf = new StringBuilder();
  136.         for(int i=0; i<this.tipoServiziRest.size(); i++){
  137.             if(i>0)
  138.                 bf.append(",");
  139.             bf.append(this.tipoServiziRest.get(i));
  140.         }
  141.         return bf.toString();
  142.     }


  143.     public ValidazioneSemantica(org.openspcoop2.core.registry.RegistroServizi registro,boolean checkEsistenzaFileDefinitoTramiteURI,
  144.             String[]tipoConnettori,String[]tipoSoggetti,String [] tipiServiziSoapValidi, String [] tipiServiziRestValidi,Logger log) throws DriverRegistroServiziException{
  145.         this.registro = registro;
  146.         this.checkEsistenzaFileDefinitoTramiteURI = checkEsistenzaFileDefinitoTramiteURI;
  147.         this.log = log;
  148.         if(tipoConnettori!=null && tipoConnettori.length>0 ){
  149.             for(int i=0; i<tipoConnettori.length; i++){
  150.                 this.tipoConnettori.add(tipoConnettori[i]);
  151.             }
  152.         }else{
  153.             throw new DriverRegistroServiziException("Tipo di connettori ammissibili non definiti");
  154.         }
  155.        
  156.         if(tipoSoggetti!=null && tipoSoggetti.length>0 ){
  157.             for(int i=0; i<tipoSoggetti.length; i++){
  158.                 this.tipoSoggetti.add(tipoSoggetti[i]);
  159.             }
  160.         }else{
  161.             throw new DriverRegistroServiziException("Tipo di soggetti ammissibili non definiti");
  162.         }
  163.        
  164.         boolean tipiSoapNonEsistenti = false;
  165.         if(tipiServiziSoapValidi!=null && tipiServiziSoapValidi.length>0 ){
  166.             for(int i=0; i<tipiServiziSoapValidi.length; i++){
  167.                 this.tipoServiziSoap.add(tipiServiziSoapValidi[i]);
  168.             }
  169.         }else{
  170.             tipiSoapNonEsistenti = true;
  171.         }
  172.        
  173.         boolean tipiRestNonEsistenti = false;
  174.         if(tipiServiziRestValidi!=null && tipiServiziRestValidi.length>0 ){
  175.             for(int i=0; i<tipiServiziRestValidi.length; i++){
  176.                 this.tipoServiziRest.add(tipiServiziRestValidi[i]);
  177.             }
  178.         }else{
  179.             tipiRestNonEsistenti = true;
  180.         }
  181.        
  182.         if(tipiSoapNonEsistenti && tipiRestNonEsistenti){
  183.             throw new DriverRegistroServiziException("Almeno dei tipo di servizi Soap o Rest ammissibili devono essere definiti");
  184.         }
  185.     }
  186.    
  187.    
  188.    
  189.     public ValidazioneSemantica(org.openspcoop2.core.registry.RegistroServizi registro,boolean checkEsistenzaFileDefinitoTramiteURI,
  190.             String[]tipoConnettori,String[]tipoSoggetti,String [] tipiServiziSoapValidi, String [] tipiServiziRestValidi) throws DriverRegistroServiziException{
  191.         this(registro,checkEsistenzaFileDefinitoTramiteURI,tipoConnettori,tipoSoggetti,tipiServiziSoapValidi,tipiServiziRestValidi,null);
  192.     }

  193.     private void printMsg(String msg){
  194.         if(this.log == null){
  195.             System.out.println(msg);
  196.         }else{
  197.             this.log.debug(msg);
  198.         }
  199.     }

  200.     private Map<String, ServiceBinding> mappingAccordiToServiceBinding;

  201.     public void validazioneSemantica(boolean showIDOggettiAnalizzati) throws DriverRegistroServiziException {

  202.         if(showIDOggettiAnalizzati)
  203.             printMsg("---------------------------------------AccordiCooperazione("+this.registro.sizeAccordoCooperazioneList()+")--------------------------------------------------");

  204.         // accordi di Cooperazione
  205.         for(int i=0; i<this.registro.sizeAccordoCooperazioneList();i++){
  206.             AccordoCooperazione ac = this.registro.getAccordoCooperazione(i);
  207.             if(showIDOggettiAnalizzati)
  208.                 printMsg("Accordo di cooperazione: "+this.idAccordoCooperazioneFactory.getUriFromAccordo(ac));
  209.             validaAccordoCooperazione(ac);
  210.         }

  211.         if(showIDOggettiAnalizzati)
  212.             printMsg("\n\n------------------------------------AccordiServizioParteComune("+this.registro.sizeAccordoServizioParteComuneList()+")-----------------------------------------------------");

  213.         // accordi di servizio
  214.         this.mappingAccordiToServiceBinding = new HashMap<String, ServiceBinding>();
  215.         for(int i=0; i<this.registro.sizeAccordoServizioParteComuneList();i++){
  216.             AccordoServizioParteComune as = this.registro.getAccordoServizioParteComune(i);
  217.             if(showIDOggettiAnalizzati)
  218.                 printMsg("Accordo di servizio parte comune: "+this.idAccordoFactory.getUriFromAccordo(as));
  219.             validaAccordoServizioParteComune(as);
  220.             this.mappingAccordiToServiceBinding.put(this.idAccordoFactory.getUriFromAccordo(as), as.getServiceBinding());
  221.         }

  222.         if(showIDOggettiAnalizzati)
  223.             printMsg("\n\n------------------------------------Soggetti("+this.registro.sizeSoggettoList()+")-----------------------------------------------------");

  224.         // soggetto
  225.         for(int i=0; i<this.registro.sizeSoggettoList();i++){
  226.             Soggetto sogg = this.registro.getSoggetto(i);
  227.             if(showIDOggettiAnalizzati)
  228.                 printMsg("Soggetto: "+sogg.getTipo()+"/"+sogg.getNome());
  229.             validaSoggetto(sogg,showIDOggettiAnalizzati);
  230.         }

  231.         if(showIDOggettiAnalizzati)
  232.             printMsg("\n\n------------------------------------Porte di Dominio("+this.registro.sizePortaDominioList()+")-----------------------------------------------------");

  233.         // porta di dominio
  234.         for(int i=0; i<this.registro.sizePortaDominioList();i++){
  235.             PortaDominio pd = this.registro.getPortaDominio(i);
  236.             if(showIDOggettiAnalizzati)
  237.                 printMsg("Porta di dominio: "+pd.getNome());
  238.             validaPortaDominio(pd);
  239.         }
  240.        
  241.         if(showIDOggettiAnalizzati)
  242.             printMsg("\n\n------------------------------------Ruoli("+this.registro.sizeRuoloList()+")-----------------------------------------------------");

  243.         // ruoli
  244.         for(int i=0; i<this.registro.sizeRuoloList();i++){
  245.             Ruolo ruolo = this.registro.getRuolo(i);
  246.             if(showIDOggettiAnalizzati)
  247.                 printMsg("Ruolo: "+ruolo.getNome());
  248.             validaRuolo(ruolo);
  249.         }
  250.        
  251.         if(showIDOggettiAnalizzati)
  252.             printMsg("\n\n------------------------------------Scope("+this.registro.sizeScopeList()+")-----------------------------------------------------");

  253.         // scope
  254.         for(int i=0; i<this.registro.sizeScopeList();i++){
  255.             Scope scope = this.registro.getScope(i);
  256.             if(showIDOggettiAnalizzati)
  257.                 printMsg("Scope: "+scope.getNome());
  258.             validaScope(scope);
  259.         }

  260.         if(showIDOggettiAnalizzati)
  261.             printMsg("\n\n------------------------------------Connettori("+this.registro.sizeConnettoreList()+")-----------------------------------------------------");

  262.         // connettori
  263.         for(int i=0; i<this.registro.sizeConnettoreList();i++){
  264.             Connettore con = this.registro.getConnettore(i);
  265.             if(showIDOggettiAnalizzati)
  266.                 printMsg("Connettore: "+con.getNome());
  267.             validaConnettore(con,null,null);
  268.         }

  269.         if(showIDOggettiAnalizzati)
  270.             printMsg("\n\n-----------------------------------------------------------------------------------------");

  271.         // Se è stata trovata almeno un'anomalia, lancio un'eccezione
  272.         if (!this.errori.isEmpty()) {
  273.             StringBuilder stringB = new StringBuilder().append("\n");
  274.             Iterator<String> itE = this.errori.iterator();
  275.             while (itE.hasNext())
  276.                 stringB.append(itE.next()).append("\n");
  277.             throw new DriverRegistroServiziException(stringB.toString());
  278.         }
  279.     }



  280.     private void validaAccordoCooperazione(AccordoCooperazione ac) throws DriverRegistroServiziException {

  281.         // required
  282.         if(ac.getNome()==null){
  283.             this.errori.add("Esiste un accordo di cooperazione senza nome");
  284.             return;
  285.         }
  286.        
  287.         IDAccordoCooperazione idAccordoCooperazione = this.idAccordoCooperazioneFactory.getIDAccordoFromAccordo(ac);
  288.         String uriAC = this.idAccordoCooperazioneFactory.getUriFromIDAccordo(idAccordoCooperazione);

  289.         // Devi controllare che 'soggetto-referente' deve puntare (attraverso tipo/nome) ad un soggetto realmente esistente
  290.         IdSoggetto acsr = ac.getSoggettoReferente();
  291.         if (acsr != null) {
  292.             // required
  293.             if(acsr.getTipo()==null){
  294.                 this.errori.add("Tipo di un soggetto referente dell'accordo cooperazione "+uriAC+" non definito");
  295.             }
  296.             else if(acsr.getNome()==null){
  297.                 this.errori.add("Nome di un soggetto referente dell'accordo cooperazione "+uriAC+" non definito");
  298.             }else{
  299.                 // check esistenza
  300.                 if (!this.existsSoggetto(acsr.getTipo(), acsr.getNome()))
  301.                     this.errori.add("Il soggetto referente ["+acsr.getTipo()+"/"+acsr.getNome()+"] dell'accordo cooperazione "+uriAC+" non corrisponde a nessuno dei soggetti registrati");
  302.             }
  303.         }

  304.         // Controllo elenco soggetti partecipanti
  305.         if(ac.getElencoPartecipanti()!=null){
  306.             AccordoCooperazionePartecipanti partecipanti = ac.getElencoPartecipanti();
  307.             for(int i=0; i<partecipanti.sizeSoggettoPartecipanteList(); i++){
  308.                 IdSoggetto partecipante = partecipanti.getSoggettoPartecipante(i);
  309.                 // required
  310.                 if(partecipante.getTipo()==null){
  311.                     this.errori.add("Tipo di un soggetto partecipante dell'accordo cooperazione "+uriAC+" non definito");
  312.                 }
  313.                 else if(partecipante.getNome()==null){
  314.                     this.errori.add("Nome di un soggetto partecipante dell'accordo cooperazione "+uriAC+" non definito");
  315.                 }
  316.                 else{
  317.                     // check esistenza
  318.                     if (!this.existsSoggetto(partecipante.getTipo(),partecipante.getNome()))
  319.                         this.errori.add("Il soggetto partecipante ["+partecipante.getTipo()+"/"+partecipante.getNome()+"] dell'accordo cooperazione "+uriAC+" non corrisponde a nessuno dei soggetti registrati");
  320.                 }
  321.             }
  322.             if(partecipanti.sizeSoggettoPartecipanteList()<2){
  323.                 this.errori.add("L'accordo di cooperazione ["+uriAC+"] non possiede il numero minimo di soggetti partecipanti (2)");
  324.             }
  325.         }
  326.         else{
  327.             this.errori.add("L'accordo di cooperazione ["+uriAC+"] non possiede soggetti partecipanti (attesi almeno 2)");
  328.         }

  329.         // Allegati
  330.         for(int i=0; i<ac.sizeAllegatoList(); i++){
  331.             Documento allegato = ac.getAllegato(i);
  332.             this.validateDocumento(allegato, RuoliDocumento.allegato,"accordoCooperazione["+uriAC+"]");
  333.         }
  334.         // SpecificheSemiformali
  335.         for(int i=0; i<ac.sizeSpecificaSemiformaleList(); i++){
  336.             Documento specificaSemiformale = ac.getSpecificaSemiformale(i);
  337.             this.validateDocumento(specificaSemiformale, RuoliDocumento.specificaSemiformale,"accordoCooperazione["+uriAC+"]");
  338.         }

  339.         // Il nome dell'accordo di cooperazione ha gli stessi vincoli del nome di un accordo di servizio.
  340.         // Il nome deve contenere solo lettere e numeri e '_' '-' '.'
  341.         try{
  342.             if (!RegularExpressionEngine.isMatch(ac.getNome(),"^[0-9A-Za-z_\\-\\.]+$")) {
  343.                 this.errori.add("Il nome dell'accordo di cooperazione ["+uriAC+"] dev'essere formato solo caratteri, cifre, '_' , '-' e '.'");
  344.             }
  345.         }catch(Exception e){
  346.             throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome dell'accordo di cooperazione ["+uriAC+"]: "+e.getMessage(),e);
  347.         }

  348.         // Ogni accordo di cooperazione deve possedere un nome diverso
  349.         int numAc = 0;
  350.         for(int j=0; j<this.registro.sizeAccordoCooperazioneList();j++){
  351.             AccordoCooperazione tmpAc = this.registro.getAccordoCooperazione(j);
  352.             if (this.idAccordoCooperazioneFactory.getUriFromAccordo(ac).equals(this.idAccordoCooperazioneFactory.getUriFromAccordo(tmpAc)))
  353.                 numAc++;
  354.         }
  355.         if (numAc > 1)
  356.             this.errori.add("Non può esistere più di un accordo di cooperazione con uri "+uriAC);
  357.     }

  358.     private void validaAccordoServizioParteComune(AccordoServizioParteComune as) throws DriverRegistroServiziException {

  359.         // required
  360.         if(as.getNome()==null){
  361.             this.errori.add("Esiste un accordo di servizio senza nome");
  362.             return;
  363.         }
  364.        
  365.         IDAccordo idAccordoServizio = this.idAccordoFactory.getIDAccordoFromAccordo(as);
  366.         String uriAS = this.idAccordoFactory.getUriFromIDAccordo(idAccordoServizio);
  367.         AccordoServizioParteComuneServizioComposto assc = as.getServizioComposto();
  368.         if (assc != null) {
  369.             uriAS = "servizio composto ["+uriAS+"]";
  370.         }else{
  371.             uriAS = "accordo di servizio ["+uriAS+"]";
  372.         }

  373.         // Devi controllare che 'soggetto-referente' deve puntare (attraverso tipo/nome) ad un soggetto realmente esistente
  374.         IdSoggetto assr = as.getSoggettoReferente();
  375.         if (assr != null) {
  376.             // required
  377.             if(assr.getTipo()==null){
  378.                 this.errori.add("Tipo di un soggetto referente nel "+uriAS+" non definito");
  379.             }
  380.             else if(assr.getNome()==null){
  381.                 this.errori.add("Nome di un soggetto referente nel "+uriAS+" non definito");
  382.             }
  383.             else{
  384.                 // esistenza
  385.                 if (!this.existsSoggetto(assr.getTipo(), assr.getNome()))
  386.                     this.errori.add("Il soggetto referente ["+assr.getTipo()+"/"+assr.getNome()+"] nel "+uriAS+" non corrisponde a nessuno dei soggetti registrati");
  387.             }
  388.         }

  389.         // Se presente 'servizio-composto' devono essere visionati i servizi componenti interni. Per ogni servizio componente deve essere controllato che l'accordo di servizio esista realmente e in caso viene definito anche il port type, che questo esista realmente. Inoltre deve essere controllato che il ws-bpel, se presente, sia una URI valida (usa la classe java java.net.URI, il costruttore se non riesce a costruire ritorna errore) o un path ad un file locale falido (utilizza la classe java.io.File e il metodo exists() ).
  390.         if (assc != null) {
  391.             for (int j = 0; j < assc.sizeServizioComponenteList(); j++) {
  392.                 AccordoServizioParteComuneServizioCompostoServizioComponente asscsc = assc.getServizioComponente(j);

  393.                 // required
  394.                 if(asscsc.getTipo()==null){
  395.                     this.errori.add("Tipo di un servizio componente nel "+uriAS+" non definito");
  396.                 }
  397.                 else if(asscsc.getNome()==null){
  398.                     this.errori.add("Nome di un servizio componente nel "+uriAS+" non definito");
  399.                 }
  400.                 else if(asscsc.getVersione()==null){
  401.                     this.errori.add("Versione di un servizio componente nel "+uriAS+" non definito");
  402.                 }
  403.                 else if(asscsc.getTipoSoggetto()==null){
  404.                     this.errori.add("Tipo dell'erogatore di un servizio componente nel "+uriAS+" non definito");
  405.                 }
  406.                 else if(asscsc.getNomeSoggetto()==null){
  407.                     this.errori.add("Nome dell'erogatore di un servizio componente nel "+uriAS+" non definito");
  408.                 }
  409.                 else {
  410.                     // Check servizio
  411.                     if (!this.existsAccordoServizioParteSpecifica(asscsc.getTipo(), asscsc.getNome(), asscsc.getVersione(),
  412.                             asscsc.getTipoSoggetto(), asscsc.getNomeSoggetto()))
  413.                         this.errori.add("Il servizio componente ["+asscsc.getTipo()+"/"+asscsc.getNome()+":"+asscsc.getVersione()+
  414.                                 "] erogato dal soggetto ["+asscsc.getTipoSoggetto()+"/"+asscsc.getNomeSoggetto()+
  415.                                 "], referenziato nel "+uriAS+", non corrisponde a nessun servizio registrato");
  416.                 }

  417.                 // Check azione associata al servizio
  418.                 if(asscsc.getAzione()!=null){
  419.                     AccordoServizioParteSpecifica serv = this.getAccordoServizioParteSpecifica(asscsc.getTipo(), asscsc.getNome(), asscsc.getVersione(), asscsc.getTipoSoggetto(), asscsc.getNomeSoggetto());
  420.                     if(serv!=null && this.existsAccordoServizioParteComune(serv.getAccordoServizioParteComune())){
  421.                         AccordoServizioParteComune asServizioComposto = this.getAccordoServizioParteComune(serv.getAccordoServizioParteComune());
  422.                         if(serv.getPortType()!=null){
  423.                             if(this.existsPortType_AccordoServizioParteComune(asServizioComposto, serv.getPortType()) ){
  424.                                 PortType pt = this.getPortType_AccordoServizioParteComune(asServizioComposto, serv.getPortType());
  425.                                 if(this.existsAzione_PortType_AccordoServizio(pt, asscsc.getAzione())==false){
  426.                                     this.errori.add("Il servizio componente ["+asscsc.getTipo()+"/"+asscsc.getNome()+"] erogato dal soggetto ["+asscsc.getTipoSoggetto()+"/"+asscsc.getNomeSoggetto()+
  427.                                             "], referenziato nel "+uriAS+", utilizza un'azione ["+asscsc.getAzione()+"] che non risulta definita nell'accordo di servizio ["+serv.getAccordoServizioParteComune()+"] implementato dal servizio componente (istanziato per il servizio ["+serv.getPortType()+"])");
  428.                                 }
  429.                             }else{
  430.                                 this.errori.add("Il servizio componente ["+asscsc.getTipo()+"/"+asscsc.getNome()+"] erogato dal soggetto ["+asscsc.getTipoSoggetto()+"/"+asscsc.getNomeSoggetto()+
  431.                                         "], referenziato nel "+uriAS+", implementa un accordo di servizio ["+serv.getAccordoServizioParteComune()+"] che e' istanziato per uno specifico servizio ["+serv.getPortType()+"] che non risulta registrato");
  432.                             }
  433.                         }else{
  434.                             if(this.existsAzione_AccordoServizioParteComune(asServizioComposto, asscsc.getAzione())==false &&
  435.                                     this.existsResource_AccordoServizioParteComune(asServizioComposto, asscsc.getAzione())==false){
  436.                                 this.errori.add("Il servizio componente ["+asscsc.getTipo()+"/"+asscsc.getNome()+"] erogato dal soggetto ["+asscsc.getTipoSoggetto()+"/"+asscsc.getNomeSoggetto()+
  437.                                         "], referenziato nel "+uriAS+", utilizza un'azione ["+asscsc.getAzione()+"] che non risulta definita nell'accordo di servizio ["+serv.getAccordoServizioParteComune()+"] implementato dal servizio componente");
  438.                             }
  439.                         }
  440.                     }else{
  441.                         if(serv==null) {
  442.                             this.errori.add("Il servizio componente ["+asscsc.getTipo()+"/"+asscsc.getNome()+"] erogato dal soggetto ["+asscsc.getTipoSoggetto()+"/"+asscsc.getNomeSoggetto()+
  443.                                     "], referenziato nel "+uriAS+" non risulta registrato");
  444.                         }
  445.                         else {
  446.                             this.errori.add("Il servizio componente ["+asscsc.getTipo()+"/"+asscsc.getNome()+"] erogato dal soggetto ["+asscsc.getTipoSoggetto()+"/"+asscsc.getNomeSoggetto()+
  447.                                 "], referenziato nel "+uriAS+", implementa un accordo di servizio ["+serv.getAccordoServizioParteComune()+"] che non risulta registrato");
  448.                         }
  449.                     }
  450.                 }
  451.             }

  452.             // SpecificheCoordinamento
  453.             for(int i=0; i<assc.sizeSpecificaCoordinamentoList(); i++){
  454.                 Documento specificaCoordinamento = assc.getSpecificaCoordinamento(i);
  455.                 this.validateDocumento(specificaCoordinamento, RuoliDocumento.specificaCoordinamento,uriAS);
  456.             }

  457.             // required
  458.             if(assc.getAccordoCooperazione()==null){
  459.                 this.errori.add("Nome dell'accordo di cooperazione implementato nel "+uriAS+" non definito");
  460.             }
  461.             else{
  462.                 // Nome accordo di cooperazione
  463.                 if(this.existsAccordoCooperazione(assc.getAccordoCooperazione())==false){
  464.                     this.errori.add("L'accordo di cooperazione ["+assc.getAccordoCooperazione()+"] referenziato nel "+uriAS+" non corrisponde a nessuno degli accordi di cooperazione registrati");
  465.                 }
  466.             }
  467.         }


  468.         // Azioni
  469.         for (int j = 0; j < as.sizeAzioneList(); j++) {
  470.             Azione az = as.getAzione(j);

  471.             // required
  472.             if(az.getNome()==null){
  473.                 this.errori.add("Non è stato definito il nome di un'azione nel "+uriAS);
  474.                 continue;
  475.             }
  476.            
  477.             // Il nome deve contenere solo lettere e numeri e '_' '-' '.'
  478.             try{
  479.                 if (!RegularExpressionEngine.isMatch(az.getNome(),"^[_A-Za-z][\\-\\._A-Za-z0-9]*$")) {
  480.                     this.errori.add("Il nome dell'azione ["+az.getNome()+"] nel "+uriAS+" non e' valido; puo' iniziare solo con un carattere [A-Za-z] o il simbolo '_' e dev'essere formato solo da caratteri, cifre, '_' , '-' e '.'");
  481.                 }
  482.             }catch(Exception e){
  483.                 throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome dell'azione ["+az.getNome()+"] nel "+uriAS+ " :" +e.getMessage(),e);
  484.             }
  485.                
  486.             // ogni azione presente nell'accordo di servizio deve possedere un nome diverso
  487.             int numAz = 0;
  488.             for(int k=0; k<as.sizeAzioneList();k++){
  489.                 Azione tmpAz = as.getAzione(k);
  490.                 if (az.getNome().equals(tmpAz.getNome()))
  491.                     numAz++;
  492.             }
  493.             if (numAz > 1)
  494.                 this.errori.add("Non può esistere più di un'azione con nome "+az.getNome()+" nel "+uriAS);

  495.             // Se presente attributo 'correlata', deve controllare che esista nell'accordo un altra azione che possieda come nome il valore presente nell'attributo.
  496.             String correlata = az.getCorrelata();
  497.             if (correlata != null) {
  498.                 if(this.existsAzione_AccordoServizioParteComune(as, correlata)==false ){
  499.                     this.errori.add("L'azione ["+correlata+"] correlata all'azione "+az.getNome()+" nel "+uriAS+" non corrisponde a nessuna delle azioni registrate");
  500.                 }
  501.             }

  502.             // XSD: profilo-collaborazione: oneway, sincrono, asincronoSimmetrico, asincronoAsimmetrico
  503.             ProfiloCollaborazione profColl = az.getProfiloCollaborazione();
  504.             if (profColl != null && !profColl.equals(CostantiRegistroServizi.ONEWAY)
  505.                     && !profColl.equals(CostantiRegistroServizi.SINCRONO)
  506.                     && !profColl.equals(CostantiRegistroServizi.ASINCRONO_SIMMETRICO) &&
  507.                     !profColl.equals(CostantiRegistroServizi.ASINCRONO_ASIMMETRICO))
  508.                 this.errori.add("Il profilo di collaborazione dell'azione "+az.getNome()+" nel "+uriAS+" deve possedere un profilo "+CostantiRegistroServizi.ONEWAY
  509.                         +", "+CostantiRegistroServizi.SINCRONO+", "+CostantiRegistroServizi.ASINCRONO_SIMMETRICO+" o "+CostantiRegistroServizi.ASINCRONO_ASIMMETRICO);
  510.             // XSD: filtro-duplicati: abilitato, disabilitato
  511.             StatoFunzionalita filtroDup = az.getFiltroDuplicati();
  512.             if (filtroDup != null && !filtroDup.equals(CostantiRegistroServizi.ABILITATO) && !filtroDup.equals(CostantiRegistroServizi.DISABILITATO))
  513.                 this.errori.add("Il filtro duplicati dell'azione "+az.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  514.             // XSD: conferma-ricezione: abilitato, disabilitato
  515.             StatoFunzionalita confRic = az.getConfermaRicezione();
  516.             if (confRic != null && !confRic.equals(CostantiRegistroServizi.ABILITATO) && !confRic.equals(CostantiRegistroServizi.DISABILITATO))
  517.                 this.errori.add("La conferma ricezione dell'azione "+az.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  518.             // XSD: id-collaborazione: abilitato, disabilitato
  519.             StatoFunzionalita idColl = az.getIdCollaborazione();
  520.             if (idColl != null && !idColl.equals(CostantiRegistroServizi.ABILITATO) && !idColl.equals(CostantiRegistroServizi.DISABILITATO))
  521.                 this.errori.add("L'id collaborazione dell'azione "+az.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  522.             // XSD: consegna-in-ordine: abilitato, disabilitato
  523.             StatoFunzionalita consOrd = az.getConsegnaInOrdine();
  524.             if (consOrd != null && !consOrd.equals(CostantiRegistroServizi.ABILITATO) && !consOrd.equals(CostantiRegistroServizi.DISABILITATO))
  525.                 this.errori.add("La consegna in ordine dell'azione "+az.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  526.             // Scadenza
  527.             if(az.getScadenza()!=null){
  528.                 try{
  529.                     Integer.parseInt(az.getScadenza());
  530.                 }catch(Exception e){
  531.                     this.errori.add("Il valore associato alla scadenza dell'azione "+az.getNome()+" nel "+uriAS+" dev'essere un numero intero");
  532.                 }
  533.             }
  534.         }


  535.         // Port Types
  536.         for (int j = 0; j < as.sizePortTypeList(); j++) {
  537.             PortType pt = as.getPortType(j);
  538.            
  539.             // required
  540.             if(pt.getNome()==null){
  541.                 this.errori.add("Non è stato definito il nome di un servizio nel "+uriAS);
  542.                 continue;
  543.             }
  544.            
  545.             // Il nome deve contenere solo lettere e numeri e '_' '-' '.'
  546.             try{
  547.                 if (!RegularExpressionEngine.isMatch(pt.getNome(),"^[_A-Za-z][\\-\\._A-Za-z0-9]*$")) {
  548.                     this.errori.add("Il nome del servizio ["+pt.getNome()+"] nel "+uriAS+" non e' valido; puo' iniziare solo con un carattere [A-Za-z] o il simbolo '_' e dev'essere formato solo da caratteri, cifre, '_' , '-' e '.'");
  549.                 }
  550.             }catch(Exception e){
  551.                 throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome del servizio ["+pt.getNome()+"] nel "+uriAS+" :" +e.getMessage(),e);
  552.             }

  553.             // ogni port type presente nell'accordo di servizio deve possedere un nome diverso
  554.             int numPt = 0;
  555.             for(int k=0; k<as.sizePortTypeList();k++){
  556.                 PortType tmpPt = as.getPortType(k);
  557.                 if (pt.getNome().equals(tmpPt.getNome()))
  558.                     numPt++;
  559.             }
  560.             if (numPt > 1)
  561.                 this.errori.add("Non può esistere più di un port-type con nome "+pt.getNome()+" nel "+uriAS);

  562.             // XSD: style: document, rpc
  563.             BindingStyle style = pt.getStyle();
  564.             if ((style != null) && !style.equals(CostantiRegistroServizi.WSDL_STYLE_DOCUMENT) && !style.equals(CostantiRegistroServizi.WSDL_STYLE_RPC))
  565.                 this.errori.add("Lo style del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.WSDL_STYLE_DOCUMENT+" o "+CostantiRegistroServizi.WSDL_STYLE_RPC+"");
  566.             // XSD: profilo-collaborazione: oneway, sincrono, asincronoSimmetrico, asincronoAsimmetrico
  567.             ProfiloCollaborazione profColl = pt.getProfiloCollaborazione();
  568.             if (profColl != null && !profColl.equals(CostantiRegistroServizi.ONEWAY)
  569.                     && !profColl.equals(CostantiRegistroServizi.SINCRONO)
  570.                     && !profColl.equals(CostantiRegistroServizi.ASINCRONO_SIMMETRICO) &&
  571.                     !profColl.equals(CostantiRegistroServizi.ASINCRONO_ASIMMETRICO))
  572.                 this.errori.add("Il profilo di collaborazione del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere un profilo "+CostantiRegistroServizi.ONEWAY
  573.                         +", "+CostantiRegistroServizi.SINCRONO+", "+CostantiRegistroServizi.ASINCRONO_SIMMETRICO+" o "+CostantiRegistroServizi.ASINCRONO_ASIMMETRICO);
  574.             // XSD: filtro-duplicati: abilitato, disabilitato
  575.             StatoFunzionalita filtroDup = pt.getFiltroDuplicati();
  576.             if (filtroDup != null && !filtroDup.equals(CostantiRegistroServizi.ABILITATO) && !filtroDup.equals(CostantiRegistroServizi.DISABILITATO))
  577.                 this.errori.add("Il filtro duplicati del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  578.             // XSD: conferma-ricezione: abilitato, disabilitato
  579.             StatoFunzionalita confRic = pt.getConfermaRicezione();
  580.             if (confRic != null && !confRic.equals(CostantiRegistroServizi.ABILITATO) && !confRic.equals(CostantiRegistroServizi.DISABILITATO))
  581.                 this.errori.add("La conferma ricezione del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  582.             // XSD: id-collaborazione: abilitato, disabilitato
  583.             StatoFunzionalita idColl = pt.getIdCollaborazione();
  584.             if (idColl != null && !idColl.equals(CostantiRegistroServizi.ABILITATO) && !idColl.equals(CostantiRegistroServizi.DISABILITATO))
  585.                 this.errori.add("L'id collaborazione del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  586.             // XSD: consegna-in-ordine: abilitato, disabilitato
  587.             StatoFunzionalita consOrd = pt.getConsegnaInOrdine();
  588.             if (consOrd != null && !consOrd.equals(CostantiRegistroServizi.ABILITATO) && !consOrd.equals(CostantiRegistroServizi.DISABILITATO))
  589.                 this.errori.add("La consegna in ordine del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  590.             // Scadenza
  591.             if(pt.getScadenza()!=null){
  592.                 try{
  593.                     Integer.parseInt(pt.getScadenza());
  594.                 }catch(Exception e){
  595.                     this.errori.add("Il valore associato alla scadenza del servizio "+pt.getNome()+" nel "+uriAS+" dev'essere un numero intero");
  596.                 }
  597.             }

  598.             // Operations
  599.             for(int k=0; k<pt.sizeAzioneList();k++){
  600.                 Operation op = pt.getAzione(k);

  601.                 //  required
  602.                 if(op.getNome()==null){
  603.                     this.errori.add("Non è stato definito il nome di un'azione del servizio "+pt.getNome()+" nel "+uriAS);
  604.                     continue;
  605.                 }
  606.                
  607.                 // Il nome deve contenere solo lettere e numeri e '_' '-' '.'
  608.                 try{
  609.                     if (!RegularExpressionEngine.isMatch(op.getNome(),"^[_A-Za-z][\\-\\._A-Za-z0-9]*$")) {
  610.                         this.errori.add("Il nome dell'azione "+op.getNome()+" nel "+uriAS+" puo' iniziare solo con un carattere [A-Za-z] o il simbolo '_' e dev'essere formato solo da caratteri, cifre, '_' , '-' e '.'");
  611.                     }
  612.                 }catch(Exception e){
  613.                     throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome dell'azione "+op.getNome()+" nel "+uriAS+" :" +e.getMessage(),e);
  614.                 }

  615.                 // ogni azione di un port type presente nell'accordo di servizio deve possedere un nome diverso
  616.                 int numOp = 0;
  617.                 for(int h=0; h<pt.sizeAzioneList();h++){
  618.                     Operation tmpOp = pt.getAzione(h);
  619.                     if (op.getNome().equals(tmpOp.getNome()))
  620.                         numOp++;
  621.                 }
  622.                 if (numOp > 1)
  623.                     this.errori.add("Non può esistere più di un'azione con nome "+op.getNome()+" nel "+uriAS);

  624.                 // Se presente attributo 'correlata', deve controllare che esista nell'accordo un altra azione che possieda come nome il valore presente nell'attributo.
  625.                 String correlata = op.getCorrelata();
  626.                 String correlataServizio = op.getCorrelataServizio();
  627.                 if (correlata != null && correlataServizio!=null) {
  628.                     if(this.existsPortType_AccordoServizioParteComune(as, correlataServizio)==false){
  629.                         this.errori.add("Il servizio ["+correlataServizio+"] correlata all'azione "+op.getNome()+" nel servizio "+pt.getNome()+" non corrisponde a nessuno dei servizi registrati nel "+uriAS);
  630.                     }
  631.                     PortType ptCorrelata = this.getPortType_AccordoServizioParteComune(as, correlataServizio);
  632.                     if(this.existsAzione_PortType_AccordoServizio(ptCorrelata, correlata)==false){
  633.                         this.errori.add("L'azione ["+correlata+"] correlata all'azione "+op.getNome()+" nel servizio "+pt.getNome()+" non corrisponde a nessuna delle azioni registrate nel servizio correlato ["+correlataServizio+"] nel "+uriAS);
  634.                     }
  635.                 }
  636.                 else if (correlata != null){
  637.                     if(this.existsAzione_PortType_AccordoServizio(pt, correlata)==false){
  638.                         this.errori.add("L'azione ["+correlata+"] correlata all'azione "+op.getNome()+" nel servizio "+pt.getNome()+" non corrisponde a nessuna delle azioni registrate nel "+uriAS);
  639.                     }
  640.                 }else if(correlataServizio!=null){
  641.                     this.errori.add("L'azione "+op.getNome()+" nel servizio "+pt.getNome()+" del "+uriAS+" contiene una correlazione verso un altro servizio ["+correlataServizio+"] senza pero' aver definito l'azione correlata");
  642.                 }

  643.                 // XSD: style: document, rpc
  644.                 style = op.getStyle();
  645.                 if ((style != null) && !style.equals(CostantiRegistroServizi.WSDL_STYLE_DOCUMENT) && !style.equals(CostantiRegistroServizi.WSDL_STYLE_RPC))
  646.                     this.errori.add("Lo style dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.WSDL_STYLE_DOCUMENT+" o "+CostantiRegistroServizi.WSDL_STYLE_RPC+"");
  647.                 // XSD: profilo-collaborazione: oneway, sincrono, asincronoSimmetrico, asincronoAsimmetrico
  648.                 profColl = op.getProfiloCollaborazione();
  649.                 if (profColl != null && !profColl.equals(CostantiRegistroServizi.ONEWAY)
  650.                         && !profColl.equals(CostantiRegistroServizi.SINCRONO)
  651.                         && !profColl.equals(CostantiRegistroServizi.ASINCRONO_SIMMETRICO) &&
  652.                         !profColl.equals(CostantiRegistroServizi.ASINCRONO_ASIMMETRICO))
  653.                     this.errori.add("Il profilo di collaborazione dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere un profilo "+CostantiRegistroServizi.ONEWAY
  654.                             +", "+CostantiRegistroServizi.SINCRONO+", "+CostantiRegistroServizi.ASINCRONO_SIMMETRICO+" o "+CostantiRegistroServizi.ASINCRONO_ASIMMETRICO);
  655.                 // XSD: filtro-duplicati: abilitato, disabilitato
  656.                 filtroDup = op.getFiltroDuplicati();
  657.                 if (filtroDup != null && !filtroDup.equals(CostantiRegistroServizi.ABILITATO) && !filtroDup.equals(CostantiRegistroServizi.DISABILITATO))
  658.                     this.errori.add("Il filtro duplicati dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  659.                 // XSD: conferma-ricezione: abilitato, disabilitato
  660.                 confRic = op.getConfermaRicezione();
  661.                 if (confRic != null && !confRic.equals(CostantiRegistroServizi.ABILITATO) && !confRic.equals(CostantiRegistroServizi.DISABILITATO))
  662.                     this.errori.add("La conferma ricezione del dell'azione "+op.getNome()+ " servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  663.                 // XSD: id-collaborazione: abilitato, disabilitato
  664.                 idColl = op.getIdCollaborazione();
  665.                 if (idColl != null && !idColl.equals(CostantiRegistroServizi.ABILITATO) && !idColl.equals(CostantiRegistroServizi.DISABILITATO))
  666.                     this.errori.add("L'id collaborazione dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  667.                 // XSD: consegna-in-ordine: abilitato, disabilitato
  668.                 consOrd = op.getConsegnaInOrdine();
  669.                 if (consOrd != null && !consOrd.equals(CostantiRegistroServizi.ABILITATO) && !consOrd.equals(CostantiRegistroServizi.DISABILITATO))
  670.                     this.errori.add("La consegna in ordine ddell'azione "+op.getNome()+ " el servizio "+pt.getNome()+" nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  671.                 // Scadenza
  672.                 if(op.getScadenza()!=null){
  673.                     try{
  674.                         Integer.parseInt(op.getScadenza());
  675.                     }catch(Exception e){
  676.                         this.errori.add("Il valore associato alla scadenza dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+" dev'essere un numero intero");
  677.                     }
  678.                 }

  679.                 // XSD: message-use: literal, encoded
  680.                 Message mi = op.getMessageInput();
  681.                 if (mi != null) {
  682.                     BindingUse useI = mi.getUse();
  683.                     if ((useI != null) && !useI.equals(CostantiRegistroServizi.WSDL_USE_LITERAL) && !useI.equals(CostantiRegistroServizi.WSDL_USE_ENCODED))
  684.                         this.errori.add("L'uso del message-input dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+" dev'essere "+CostantiRegistroServizi.WSDL_USE_ENCODED+" o "+CostantiRegistroServizi.WSDL_USE_LITERAL);
  685.                     for(int l=0;l<mi.sizePartList();l++){
  686.                         MessagePart part = mi.getPart(l);
  687.                         if(part.getName()==null){
  688.                             this.errori.add("Non è stato definito il name del message-input dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS);
  689.                         }
  690.                         if(part.getElementName()!=null && part.getTypeName()!=null){
  691.                             this.errori.add("Nella definizione del message-input sono stati definiti sia parametri di tipologia 'element' che parametri di tipologia 'type', solo una delle due tipologie è ammessa (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  692.                         }else if(part.getElementName()==null && part.getTypeName()==null){
  693.                             this.errori.add("Nella definizione del message-input non sono stati definiti ne parametri di tipologia 'element' che parametri di tipologia 'type' (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  694.                         }else{
  695.                             if(part.getElementName()!=null && part.getElementNamespace()==null){
  696.                                 this.errori.add("Nella definizione del message-input è stata definita una tipologia 'element' che non presenta la definizione del namespace (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  697.                             }
  698.                             if(part.getElementName()==null && part.getElementNamespace()!=null){
  699.                                 this.errori.add("Nella definizione del message-input è stata definita una tipologia 'element' che non presenta la definizione dell'element name (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  700.                             }
  701.                             if(part.getTypeName()!=null && part.getTypeNamespace()==null){
  702.                                 this.errori.add("Nella definizione del message-input è stata definita una tipologia 'type' che non presenta la definizione del namespace (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  703.                             }
  704.                             if(part.getTypeName()==null && part.getTypeNamespace()!=null){
  705.                                 this.errori.add("Nella definizione del message-input è stata definita una tipologia 'type' che non presenta la definizione del type name (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  706.                             }
  707.                         }
  708.                     }
  709.                 }
  710.                 Message mo = op.getMessageOutput();
  711.                 if (mo != null) {
  712.                     BindingUse useO = mo.getUse();
  713.                     if ((useO != null) && !useO.equals(CostantiRegistroServizi.WSDL_USE_LITERAL) && !useO.equals(CostantiRegistroServizi.WSDL_USE_ENCODED))
  714.                         this.errori.add("L'uso del message-output dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+" dev'essere "+CostantiRegistroServizi.WSDL_USE_ENCODED+" o "+CostantiRegistroServizi.WSDL_USE_LITERAL);
  715.                     for(int l=0;l<mo.sizePartList();l++){
  716.                         MessagePart part = mo.getPart(l);
  717.                         if(part.getName()==null){
  718.                             this.errori.add("Non è stato definito il name del message-output dell'azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS);
  719.                         }
  720.                         if(part.getElementName()!=null && part.getTypeName()!=null){
  721.                             this.errori.add("Nella definizione del message-output sono stati definiti sia parametri di tipologia 'element' che parametri di tipologia 'type', solo una delle due tipologie è ammessa (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  722.                         }else if(part.getElementName()==null && part.getTypeName()==null){
  723.                             this.errori.add("Nella definizione del message-output non sono stati definiti ne parametri di tipologia 'element' che parametri di tipologia 'type' (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  724.                         }else{
  725.                             if(part.getElementName()!=null && part.getElementNamespace()==null){
  726.                                 this.errori.add("Nella definizione del message-output è stata definita una tipologia 'element' che non presenta la definizione del namespace (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  727.                             }
  728.                             if(part.getElementName()==null && part.getElementNamespace()!=null){
  729.                                 this.errori.add("Nella definizione del message-output è stata definita una tipologia 'element' che non presenta la definizione dell'element name (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  730.                             }
  731.                             if(part.getTypeName()!=null && part.getTypeNamespace()==null){
  732.                                 this.errori.add("Nella definizione del message-output è stata definita una tipologia 'type' che non presenta la definizione del namespace (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  733.                             }
  734.                             if(part.getTypeName()==null && part.getTypeNamespace()!=null){
  735.                                 this.errori.add("Nella definizione del message-output è stata definita una tipologia 'type' che non presenta la definizione del type name (azione "+op.getNome()+ " del servizio "+pt.getNome()+" nel "+uriAS+")");
  736.                             }
  737.                         }
  738.                     }
  739.                 }
  740.             }

  741.         }


  742.         // Allegati
  743.         for(int i=0; i<as.sizeAllegatoList(); i++){
  744.             Documento allegato = as.getAllegato(i);
  745.             this.validateDocumento(allegato, RuoliDocumento.allegato,uriAS);
  746.         }
  747.         // SpecificheSemiformali
  748.         for(int i=0; i<as.sizeSpecificaSemiformaleList(); i++){
  749.             Documento specificaSemiformale = as.getSpecificaSemiformale(i);
  750.             this.validateDocumento(specificaSemiformale, RuoliDocumento.specificaSemiformale,uriAS);
  751.         }

  752.         // Il nome dell'accordo deve possedere i stessi vincoli presenti per il nome di un accordo inserito nell'interfaccia grafica regserv.
  753.         // Il nome deve contenere solo lettere e numeri e '_' '-' '.'1
  754.         try{
  755.             if (!RegularExpressionEngine.isMatch(as.getNome(),"^[0-9A-Za-z_\\-\\.]+$")) {
  756.                 this.errori.add("Il nome nel "+uriAS+" dev'essere formato solo caratteri, cifre, '_' , '-' e '.'");
  757.             }
  758.         }catch(Exception e){
  759.             throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome nel "+uriAS+" :" +e.getMessage(),e);
  760.         }

  761.         // XSD: profilo-collaborazione: oneway, sincrono, asincronoSimmetrico, asincronoAsimmetrico
  762.         ProfiloCollaborazione profColl = as.getProfiloCollaborazione();
  763.         if(profColl==null){
  764.             this.errori.add("Il profilo di collaborazione nel "+uriAS+" non è definito; deve possedere un profilo "+CostantiRegistroServizi.ONEWAY
  765.                     +", "+CostantiRegistroServizi.SINCRONO+", "+CostantiRegistroServizi.ASINCRONO_SIMMETRICO+" o "+CostantiRegistroServizi.ASINCRONO_ASIMMETRICO);
  766.         }else{
  767.             if ( !profColl.equals(CostantiRegistroServizi.ONEWAY)
  768.                     && !profColl.equals(CostantiRegistroServizi.SINCRONO)
  769.                     && !profColl.equals(CostantiRegistroServizi.ASINCRONO_SIMMETRICO) &&
  770.                     !profColl.equals(CostantiRegistroServizi.ASINCRONO_ASIMMETRICO))
  771.                 this.errori.add("Il profilo di collaborazione nel "+uriAS+" deve possedere un profilo "+CostantiRegistroServizi.ONEWAY
  772.                         +", "+CostantiRegistroServizi.SINCRONO+", "+CostantiRegistroServizi.ASINCRONO_SIMMETRICO+" o "+CostantiRegistroServizi.ASINCRONO_ASIMMETRICO);
  773.         }
  774.         // XSD: filtro-duplicati: abilitato, disabilitato
  775.         StatoFunzionalita filtroDup = as.getFiltroDuplicati();
  776.         if ( filtroDup!=null && !filtroDup.equals(CostantiRegistroServizi.ABILITATO) && !filtroDup.equals(CostantiRegistroServizi.DISABILITATO))
  777.             this.errori.add("Il filtro duplicati nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  778.         // XSD: conferma-ricezione: abilitato, disabilitato
  779.         StatoFunzionalita confRic = as.getConfermaRicezione();
  780.         if (confRic!=null && !confRic.equals(CostantiRegistroServizi.ABILITATO) && !confRic.equals(CostantiRegistroServizi.DISABILITATO))
  781.             this.errori.add("La conferma ricezione nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  782.         // XSD: id-collaborazione: abilitato, disabilitato
  783.         StatoFunzionalita idColl = as.getIdCollaborazione();
  784.         if (idColl!=null && !idColl.equals(CostantiRegistroServizi.ABILITATO) && !idColl.equals(CostantiRegistroServizi.DISABILITATO))
  785.             this.errori.add("L'id collaborazione nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  786.         // XSD: consegna-in-ordine: abilitato, disabilitato
  787.         StatoFunzionalita consOrd = as.getConsegnaInOrdine();
  788.         if (consOrd!=null && !consOrd.equals(CostantiRegistroServizi.ABILITATO) && !consOrd.equals(CostantiRegistroServizi.DISABILITATO))
  789.             this.errori.add("La consegna in ordine nel "+uriAS+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  790.         // Scadenza
  791.         if(as.getScadenza()!=null){
  792.             try{
  793.                 Integer.parseInt(as.getScadenza());
  794.             }catch(Exception e){
  795.                 this.errori.add("Il valore associato alla scadenza nel "+uriAS+" dev'essere un numero intero");
  796.             }
  797.         }


  798.         // Se presenti i wsdl e le specifiche di conversazione (in tutto sono 7) devi controllare che siano URI valide o un path ad un file locale.
  799.         if(as.getWsdlConcettuale()!=null){
  800.             try{
  801.                 HttpUtilities.validateUri(as.getWsdlConcettuale(),this.checkEsistenzaFileDefinitoTramiteURI);
  802.             }catch(Exception e){
  803.                 this.errori.add("Il wsdl concettuale nel "+uriAS+" non è valido: "+e.getMessage());
  804.             }
  805.         }
  806.         if(as.getWsdlDefinitorio()!=null){
  807.             try{
  808.                 HttpUtilities.validateUri(as.getWsdlDefinitorio(),this.checkEsistenzaFileDefinitoTramiteURI);
  809.             }catch(Exception e){
  810.                 this.errori.add("Il wsdl definitorio nel "+uriAS+" non è valido: "+e.getMessage());
  811.             }
  812.         }
  813.         if(as.getWsdlLogicoErogatore()!=null){
  814.             try{
  815.                 HttpUtilities.validateUri(as.getWsdlLogicoErogatore(),this.checkEsistenzaFileDefinitoTramiteURI);
  816.             }catch(Exception e){
  817.                 this.errori.add("Il wsdl logico erogatore nel "+uriAS+" non è valido: "+e.getMessage());
  818.             }
  819.         }
  820.         if(as.getWsdlLogicoFruitore()!=null){
  821.             try{
  822.                 HttpUtilities.validateUri(as.getWsdlLogicoFruitore(),this.checkEsistenzaFileDefinitoTramiteURI);
  823.             }catch(Exception e){
  824.                 this.errori.add("Il wsdl logico fruitore nel "+uriAS+" non è valido: "+e.getMessage());
  825.             }
  826.         }
  827.         if(as.getSpecificaConversazioneConcettuale()!=null){
  828.             try{
  829.                 HttpUtilities.validateUri(as.getSpecificaConversazioneConcettuale(),this.checkEsistenzaFileDefinitoTramiteURI);
  830.             }catch(Exception e){
  831.                 this.errori.add("Il wsdl concettuale nel "+uriAS+" non è valido: "+e.getMessage());
  832.             }
  833.         }
  834.         if(as.getSpecificaConversazioneErogatore()!=null){
  835.             try{
  836.                 HttpUtilities.validateUri(as.getSpecificaConversazioneErogatore(),this.checkEsistenzaFileDefinitoTramiteURI);
  837.             }catch(Exception e){
  838.                 this.errori.add("Il wsdl definitorio nel "+uriAS+" non è valido: "+e.getMessage());
  839.             }
  840.         }
  841.         if(as.getSpecificaConversazioneFruitore()!=null){
  842.             try{
  843.                 HttpUtilities.validateUri(as.getSpecificaConversazioneFruitore(),this.checkEsistenzaFileDefinitoTramiteURI);
  844.             }catch(Exception e){
  845.                 this.errori.add("Il wsdl logico erogatore nel "+uriAS+" non è valido: "+e.getMessage());
  846.             }
  847.         }

  848.         // Se utilizzo senza azioni e' false, devi controllare che esista almeno un'azione presente nell'accordo di servizio.
  849.         if (!as.getUtilizzoSenzaAzione()) {
  850.             if ( (as.sizeAzioneList() == 0) && (as.sizePortTypeList()==0)) {
  851.                 this.errori.add("Il "+uriAS+" non prevede l'utilizzo senza azioni, quindi dev'essere definita almeno un'azione o almeno un servizio (con relative azioni)");
  852.             }
  853.         }

  854.         // Ogni accordo di servizio deve possedere un nome diverso
  855.         int numAs = 0;
  856.         for(int j=0; j<this.registro.sizeAccordoServizioParteComuneList();j++){
  857.             AccordoServizioParteComune tmpAs = this.registro.getAccordoServizioParteComune(j);
  858.             if (this.idAccordoFactory.getUriFromAccordo(tmpAs).equals(this.idAccordoFactory.getUriFromAccordo(as)))
  859.                 numAs++;
  860.         }
  861.         if (numAs > 1)
  862.             this.errori.add("Non può esistere più di un accordo di servizio (o servizio composto) con nome "+this.idAccordoFactory.getUriFromAccordo(as));
  863.     }

  864.     private  void validaSoggetto(Soggetto sogg,boolean showIDOggettiAnalizzati) throws DriverRegistroServiziException {

  865.         // required
  866.         if(sogg.getNome()==null){
  867.             this.errori.add("Esiste un soggetto senza nome");
  868.             return;
  869.         }
  870.         if(sogg.getTipo()==null){
  871.             this.errori.add("Esiste un soggetto senza tipo");
  872.             return;
  873.         }
  874.        
  875.         // Valida il connettore
  876.         Connettore conn = sogg.getConnettore();
  877.         if (conn != null){
  878.             validaConnettore(conn, "soggetto", sogg.getTipo()+"/"+sogg.getNome());
  879.         }

  880.         // Valida i servizi
  881.         for (int j=0; j<sogg.sizeAccordoServizioParteSpecificaList(); j++) {
  882.             AccordoServizioParteSpecifica serv = sogg.getAccordoServizioParteSpecifica(j);
  883.             if(showIDOggettiAnalizzati){
  884.                 String uriServizio = this.idServizioFactory.getUriFromAccordo(serv);
  885.                 printMsg("\tServizio: "+uriServizio);
  886.             }
  887.             serv.setTipoSoggettoErogatore(sogg.getTipo());
  888.             serv.setNomeSoggettoErogatore(sogg.getNome());
  889.             validaAccordoServizioParteSpecifica(serv, sogg);
  890.         }

  891.         // Il tipo del soggetto deve essere uno tra quelli definiti in govway.properties. Ci puoi accedere attraverso il comando: org.openspcoop.pdd.config.OpenSPCoopProperties.getInstance().getTipiSoggetti()
  892.         if(this.tipoSoggetti.contains(sogg.getTipo())==false){
  893.             this.errori.add("Il tipo del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" non è valido (Tipi utilizzabili: "+this.getTipoSoggetti()+")");
  894.         }

  895.         // Nome del soggetto
  896.         try{
  897.             if (!RegularExpressionEngine.isMatch(sogg.getNome(),"^[0-9A-Za-z]+$")) {
  898.                 if(!sogg.getNome().endsWith("_serialNumberDifferente")) { // test
  899.                     this.errori.add("Il nome del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" dev'essere formato solo caratteri e cifre");
  900.                 }
  901.             }
  902.         }catch(Exception e){
  903.             throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" :" +e.getMessage(),e);
  904.         }

  905.         // ogni soggetto identificato come coppia tipo/nome, deve essere univoco
  906.         int numS = 0;
  907.         for(int j=0; j<this.registro.sizeSoggettoList();j++){
  908.             Soggetto tmpSogg = this.registro.getSoggetto(j);
  909.             if (sogg.getNome().equals(tmpSogg.getNome()) && sogg.getTipo().equals(tmpSogg.getTipo()))
  910.                 numS++;
  911.         }
  912.         if (numS > 1)
  913.             this.errori.add("Non può esistere più di un soggetto con nome "+sogg.getNome()+" e tipo "+sogg.getTipo());

  914.         // l'elemento portaDominio di un soggetto, se presente, deve puntare ad una porta di dominio presente nel registro
  915.         if(sogg.getPortaDominio()!=null){
  916.             if(this.existsPortaDominio(sogg.getPortaDominio())==false){
  917.                 this.errori.add("La porta di dominio ["+sogg.getPortaDominio()+"] del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" non corrisponde a nessuna delle porte di dominio registrate");
  918.             }
  919.         }
  920.        
  921.         // credenziali
  922.         if(sogg.sizeCredenzialiList()>0){
  923.             int i = 0;
  924.             for (CredenzialiSoggetto credenziale : sogg.getCredenzialiList()) {
  925.                 this.validaCredenziale(credenziale, "soggetto "+sogg.getTipo()+"/"+sogg.getNome() +" (credenziale-i"+i+")");
  926.                 i++;
  927.             }
  928.         }
  929.        
  930.         // ruoli
  931.         if(sogg.getRuoli()!=null){
  932.             for (int i = 0; i < sogg.getRuoli().sizeRuoloList(); i++) {
  933.                 String nomeRuolo = sogg.getRuoli().getRuolo(i).getNome();
  934.                 try{
  935.                     if (!RegularExpressionEngine.isMatch(nomeRuolo,"^[0-9A-Za-z_]+$")) {
  936.                         this.errori.add("Il ruolo ["+nomeRuolo+"] del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" dev'essere formato solo da caratteri, cifre e '_'");
  937.                     }
  938.                 }catch(Exception e){
  939.                     throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome del ruolo "+nomeRuolo+" del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" :" +e.getMessage(),e);
  940.                 }
  941.             }
  942.             // Ogni ruolo deve avere un nome diverso!
  943.             for (int i = 0; i < sogg.getRuoli().sizeRuoloList(); i++) {
  944.                 int numRuolo = 0;
  945.                 String tmpRuolo = sogg.getRuoli().getRuolo(i).getNome();
  946.                 for (int j = 0; j < sogg.getRuoli().sizeRuoloList(); j++) {
  947.                     String checkRuolo = sogg.getRuoli().getRuolo(j).getNome();
  948.                     if (checkRuolo.equals(tmpRuolo))
  949.                         numRuolo++;
  950.                 }
  951.                 if (numRuolo > 1)
  952.                     this.errori.add("Non può esistere più di un ruolo con nome "+tmpRuolo+". Trovate "+numRuolo+" occorrenze nel soggetto "+sogg.getTipo()+"/"+sogg.getNome());
  953.             }
  954.         }

  955.     }
  956.    
  957.     private  void validaCredenziale(CredenzialiSoggetto c, String oggetto) throws DriverRegistroServiziException {
  958.         // Se il tipo e' basic, username e password sono OBBLIGATORI
  959.        
  960.         CredenzialeTipo tipo = CredenzialeTipo.SSL;
  961.         if(c.getTipo()!=null){
  962.             tipo = c.getTipo();
  963.         }
  964.         if ( !tipo.equals(CredenzialeTipo.BASIC) &&
  965.                 !tipo.equals(CredenzialeTipo.APIKEY) &&
  966.                 !tipo.equals(CredenzialeTipo.SSL) &&
  967.                 !tipo.equals(CredenzialeTipo.PRINCIPAL))
  968.             this.errori.add("Il tipo delle credenziali del "+oggetto+" deve possedere i valori: "+
  969.                     CredenzialeTipo.BASIC.toString()+" o "+
  970.                     CredenzialeTipo.APIKEY.toString()+" o "+
  971.                     CredenzialeTipo.SSL.toString()+" o "+
  972.                     CredenzialeTipo.PRINCIPAL.toString());
  973.        
  974.        
  975.         if (c.getTipo().equals(CredenzialeTipo.BASIC)) {
  976.             if ((c.getUser() == null) || (c.getUser().equals("")) || (c.getPassword() == null) || (c.getPassword().equals("")))
  977.                 this.errori.add("Le credenziali di tipo basic del "+oggetto+" devono avere username e password valorizzati");
  978.         }
  979.         if (c.getTipo().equals(CredenzialeTipo.APIKEY)) {
  980.             if ((c.getUser() == null) || (c.getUser().equals("")) || (c.getPassword() == null) || (c.getPassword().equals("")))
  981.                 this.errori.add("Le credenziali di tipo apikey del "+oggetto+" devono avere username e password valorizzati");
  982.         }

  983.         // Se il tipo e' ssl, subject e' OBBLIGATORIO
  984.         if (c.getTipo().equals(CredenzialeTipo.SSL)){
  985.             if (
  986.                     (c.getSubject() == null || c.getSubject().equals(""))
  987.                     &&
  988.                     c.getCertificate()==null
  989.             ){
  990.                 this.errori.add("Le credenziali di tipo ssl del "+oggetto+" devono avere subject valorizzato");
  991.             }else{
  992.                 if(c.getSubject()!=null && !"".equals(c.getSubject())) {
  993.                     try{
  994.                         CertificateUtils.validaPrincipal(c.getSubject(), PrincipalType.SUBJECT);
  995.                     }catch(Exception e){
  996.                         this.errori.add("Le credenziali di tipo ssl del "+oggetto+" possiedono un subject non valido: "+e.getMessage());
  997.                     }
  998.                 }
  999.                 if(c.getIssuer()!=null && !"".equals(c.getIssuer())) {
  1000.                     try{
  1001.                         CertificateUtils.validaPrincipal(c.getIssuer(), PrincipalType.ISSUER);
  1002.                     }catch(Exception e){
  1003.                         this.errori.add("Le credenziali di tipo ssl del "+oggetto+" possiedono un issuer non valido: "+e.getMessage());
  1004.                     }
  1005.                 }
  1006.             }
  1007.         }
  1008.            
  1009.         // Se il tipo e' principal, user e' OBBLIGATORIO
  1010.         if (c.getTipo().equals(CredenzialeTipo.PRINCIPAL)){
  1011.             if ((c.getUser() == null) || (c.getUser().equals(""))){
  1012.                 this.errori.add("Le credenziali di tipo principal del "+oggetto+" devono avere user valorizzato");
  1013.             }
  1014.         }
  1015.        
  1016.     }

  1017.     private  void validaAccordoServizioParteSpecifica(AccordoServizioParteSpecifica asps, Soggetto sogg) throws DriverRegistroServiziException {
  1018.        
  1019.         // required    
  1020.         if(asps.getTipo()==null){
  1021.             this.errori.add("Non e' stato fornito un tipo per l'accordo di servizio parte specifica");
  1022.             return;
  1023.         }
  1024.        
  1025.         // required    
  1026.         if(asps.getNome()==null){
  1027.             this.errori.add("Non e' stato fornito un nome per l'accordo di servizio parte specifica");
  1028.             return;
  1029.         }
  1030.        
  1031.         // required    
  1032.         if(asps.getVersione()==null){
  1033.             this.errori.add("Non e' stato fornito una versione per l'accordo di servizio parte specifica");
  1034.             return;
  1035.         }
  1036.        
  1037.         String uriServizio = this.idServizioFactory.getUriFromAccordo(asps);
  1038.        
  1039.         ConfigurazioneServizio serv = asps.getConfigurazioneServizio();
  1040.         if(serv!=null){
  1041.        
  1042.             // Il connettore, se presente, deve essere validato.
  1043.             Connettore conn = serv.getConnettore();
  1044.             if (conn != null){
  1045.                 validaConnettore(conn, "servizio", uriServizio);
  1046.             }else{
  1047.                 if(sogg.getConnettore()==null || CostantiRegistroServizi.DISABILITATO.equals(sogg.getConnettore().getTipo())){
  1048.                     this.errori.add("Il servizio ["+uriServizio+"] deve obbligatoriamente definire un connettore, poiche' il soggetto erogatore non ne possiede uno");
  1049.                 }
  1050.             }
  1051.    
  1052.             // Azione di un servizio
  1053.             for(int k=0; k<serv.sizeConfigurazioneAzioneList();k++){
  1054.                 ConfigurazioneServizioAzione az = serv.getConfigurazioneAzione(k);
  1055.                
  1056.                 if(az.sizeAzioneList()<=0){
  1057.                     this.errori.add("Esiste una configurazione delle azioni del servizio "+uriServizio+" per cui non è definito una azione");
  1058.                     continue;
  1059.                 }
  1060.                
  1061.                 for (String azione : az.getAzioneList()) {
  1062.                    
  1063.                     // 1. ogni azione di un servizio deve essere univoca
  1064.                     int numA = 0;
  1065.                     for (int h=0; h<serv.sizeConfigurazioneAzioneList(); h++) {
  1066.                         ConfigurazioneServizioAzione tmpSsa = serv.getConfigurazioneAzione(h);
  1067.                         for (String azioneCheck : tmpSsa.getAzioneList()) {
  1068.                             if (azione.equals(azioneCheck))
  1069.                                 numA++;
  1070.                         }
  1071.                     }
  1072.                     if (numA > 1)
  1073.                         this.errori.add("Non può esistere più di un'azione con nome "+azione+" nel servizio "+uriServizio);
  1074.                    
  1075.                     // L'azione deve esistere nell'accordo implementato dal servizio
  1076.                     if(this.existsAccordoServizioParteComune(asps.getAccordoServizioParteComune())){
  1077.                         AccordoServizioParteComune as = this.getAccordoServizioParteComune(asps.getAccordoServizioParteComune());
  1078.                         if(as!=null && ServiceBinding.SOAP.equals(as.getServiceBinding())) {
  1079.                             if(asps.getPortType()!=null){
  1080.                                 if(this.existsPortType_AccordoServizioParteComune(as, asps.getPortType()) ){
  1081.                                     PortType pt = this.getPortType_AccordoServizioParteComune(as, asps.getPortType());
  1082.                                     if(this.existsAzione_PortType_AccordoServizio(pt, azione)==false){
  1083.                                         this.errori.add("Il servizio ["+uriServizio+
  1084.                                                 "], utilizza un'azione ["+azione+"] che non risulta definita nell'accordo di servizio ["+
  1085.                                                 asps.getAccordoServizioParteComune()+"] implementato dal servizio (istanziato per il servizio ["+asps.getPortType()+"])");
  1086.                                     }
  1087.                                 }else{
  1088.                                     // Caso gestito nel seguito di questo metodo
  1089.                                 }
  1090.                             }else{
  1091.                                 if(this.existsAzione_AccordoServizioParteComune(as, azione)==false){
  1092.                                     this.errori.add("Il servizio ["+uriServizio+
  1093.                                             "], utilizza un'azione ["+azione+"] che non risulta definita nell'accordo di servizio ["+asps.getAccordoServizioParteComune()+"] implementato dal servizio");
  1094.                                 }
  1095.                             }
  1096.                         }
  1097.                         else {
  1098.                             if(as==null) {
  1099.                                 this.errori.add("API '"+asps.getAccordoServizioParteComune()+"' non trovata");
  1100.                             }
  1101.                             else {
  1102.                                 if(this.existsResource_AccordoServizioParteComune(as, azione)==false){
  1103.                                     this.errori.add("Il servizio ["+uriServizio+
  1104.                                         "], utilizza una risorsa ["+azione+"] che non risulta definita nell'accordo di servizio ["+asps.getAccordoServizioParteComune()+"] implementato dal servizio");
  1105.                                 }
  1106.                             }
  1107.                         }
  1108.                     }else{
  1109.                         // Caso gestito nel seguito di questo metodo
  1110.                     }
  1111.                    
  1112.                 }
  1113.                
  1114.                 // Deve almeno o essere definito un connettore o essere definito i fruitori
  1115.                 if( (az.getConnettore()==null || CostantiRegistroServizi.DISABILITATO.equals(az.getConnettore().getTipo())) ){
  1116.                     this.errori.add("Non può esistere una configurazione delle azioni nel servizio "+uriServizio+" che non definisce ne al suo interno un connettore");
  1117.                 }
  1118.                
  1119.                 // Validazione connettore azione
  1120.                 conn = az.getConnettore();
  1121.                 if(conn!=null){
  1122.                     this.validaConnettore(conn, "Azioni ["+az.getAzioneList()+"] ridefinite nel Servizio", uriServizio);
  1123.                 }

  1124.             }
  1125.         }

  1126.         // Fruitore di un servizio
  1127.         for(int k=0; k<asps.sizeFruitoreList();k++){
  1128.             Fruitore fru = asps.getFruitore(k);
  1129.        
  1130.             if(fru.getTipo()==null){
  1131.                 this.errori.add("Esiste un fruitore del servizio ["+uriServizio+"] per cui non è definito il tipo");
  1132.                 continue;
  1133.             }
  1134.             if(fru.getNome()==null){
  1135.                 this.errori.add("Esiste un fruitore del servizio ["+uriServizio+"] per cui non è definito il nome");
  1136.                 continue;
  1137.             }
  1138.                        
  1139.             // 3. Il tipo e il nome deve puntare ad un soggetto realmente esistente nel registro dei servizi.
  1140.             if(this.existsSoggetto(fru.getTipo(), fru.getNome())==false){
  1141.                 this.errori.add("Il fruitore "+fru.getTipo()+"/"+fru.getNome()+" del servizio "+uriServizio+" non corrisponde a nessuno dei soggetti registrati");
  1142.             }
  1143.                
  1144.             // 1. ogni fruitore (identificato dalla coppia tipo/nome) di un servizio deve essere univoco
  1145.             int numF = 0;
  1146.             for (int h=0; h<asps.sizeFruitoreList(); h++) {
  1147.                 Fruitore tmpF = asps.getFruitore(h);
  1148.                 if (fru.getNome().equals(tmpF.getNome()) && fru.getTipo().equals(tmpF.getTipo()))
  1149.                     numF++;
  1150.             }
  1151.             if (numF > 1)
  1152.                 this.errori.add("Non può esistere più di un fruitore con nome "+fru.getNome()+" e tipo "+fru.getTipo()+" per il servizio "+uriServizio);
  1153.            
  1154.             // 2.  Il connettore, se presente, deve essere validato. NOTA: che il connettore puo' essere definito all'interno del servizio o direttamente nella root del registro dei servizi. In tal caso all'interno del servizio vi e' solo il nome del connettore. La validazione deve tenere conto di cio, e quindi se vi e' presente solo il nome, deve prima cercare il connettore nella root e poi validarlo come descritto nel paragrafo apposta.
  1155.             Connettore conn = fru.getConnettore();
  1156.             if (conn != null)
  1157.                 validaConnettore(conn, "fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio", uriServizio);
  1158.            
  1159.             // 3. Azione di una fruizione di servizio
  1160.             for(int j=0; j<fru.sizeConfigurazioneAzioneList();j++){
  1161.                 ConfigurazioneServizioAzione az = fru.getConfigurazioneAzione(j);
  1162.                
  1163.                 if(az.sizeAzioneList()<=0){
  1164.                     this.errori.add("Esiste una configurazione delle azioni del fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio "+uriServizio+" per cui non è definito una azione");
  1165.                     continue;
  1166.                 }
  1167.                
  1168.                 for (String azione : az.getAzioneList()) {
  1169.                    
  1170.                     // 1. ogni azione di un servizio deve essere univoca
  1171.                     int numA = 0;
  1172.                     for (int h=0; h<fru.sizeConfigurazioneAzioneList(); h++) {
  1173.                         ConfigurazioneServizioAzione tmpSsa = fru.getConfigurazioneAzione(h);
  1174.                         for (String azioneCheck : tmpSsa.getAzioneList()) {
  1175.                             if (azione.equals(azioneCheck))
  1176.                                 numA++;
  1177.                         }
  1178.                     }
  1179.                     if (numA > 1)
  1180.                         this.errori.add("Non può esistere più di un'azione con nome "+azione+" nel fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio "+uriServizio);
  1181.                    
  1182.                     // L'azione deve esistere nell'accordo implementato dal servizio
  1183.                     if(this.existsAccordoServizioParteComune(asps.getAccordoServizioParteComune())){
  1184.                         AccordoServizioParteComune as = this.getAccordoServizioParteComune(asps.getAccordoServizioParteComune());
  1185.                         if(ServiceBinding.SOAP.equals(as.getServiceBinding())) {
  1186.                             if(asps.getPortType()!=null){
  1187.                                 if(this.existsPortType_AccordoServizioParteComune(as, asps.getPortType()) ){
  1188.                                     PortType pt = this.getPortType_AccordoServizioParteComune(as, asps.getPortType());
  1189.                                     if(this.existsAzione_PortType_AccordoServizio(pt, azione)==false){
  1190.                                         this.errori.add("Il fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio ["+uriServizio+
  1191.                                                 "], utilizza un'azione ["+azione+"] che non risulta definita nell'accordo di servizio ["+
  1192.                                                 asps.getAccordoServizioParteComune()+"] implementato dal servizio (istanziato per il servizio ["+asps.getPortType()+"])");
  1193.                                     }
  1194.                                 }else{
  1195.                                     // Caso gestito nel seguito di questo metodo
  1196.                                 }
  1197.                             }else{
  1198.                                 if(this.existsAzione_AccordoServizioParteComune(as, azione)==false){
  1199.                                     this.errori.add("Il fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio ["+uriServizio+
  1200.                                             "], utilizza un'azione ["+azione+"] che non risulta definita nell'accordo di servizio ["+asps.getAccordoServizioParteComune()+"] implementato dal servizio");
  1201.                                 }
  1202.                             }
  1203.                         }
  1204.                         else {
  1205.                             if(this.existsResource_AccordoServizioParteComune(as, azione)==false){
  1206.                                 this.errori.add("Il fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio ["+uriServizio+
  1207.                                         "], utilizza una risorsa ["+azione+"] che non risulta definita nell'accordo di servizio ["+asps.getAccordoServizioParteComune()+"] implementato dal servizio");
  1208.                             }
  1209.                         }
  1210.                     }else{
  1211.                         // Caso gestito nel seguito di questo metodo
  1212.                     }
  1213.                    
  1214.                 }
  1215.                
  1216.                 // Deve almeno o essere definito un connettore o essere definito i fruitori
  1217.                 if( (az.getConnettore()==null || CostantiRegistroServizi.DISABILITATO.equals(az.getConnettore().getTipo())) ){
  1218.                     this.errori.add("Non può esistere una configurazione delle azioni nel fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio "+uriServizio+" che non definisce ne al suo interno un connettore");  
  1219.                 }
  1220.                
  1221.                 // Validazione connettore azione
  1222.                 conn = az.getConnettore();
  1223.                 if(conn!=null){
  1224.                     this.validaConnettore(conn, "Azioni ["+az.getAzioneList()+"] ridefinite nel fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del Servizio", uriServizio);
  1225.                 }

  1226.             }
  1227.            
  1228.             // Wsdl
  1229.             if(fru.getWsdlImplementativoErogatore()!=null){
  1230.                 try{
  1231.                     HttpUtilities.validateUri(fru.getWsdlImplementativoErogatore(),this.checkEsistenzaFileDefinitoTramiteURI);
  1232.                 }catch(Exception e){
  1233.                     this.errori.add("Il wsdl implementativo erogatore del fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio "+uriServizio+" non è valido: "+e.getMessage());
  1234.                 }
  1235.             }
  1236.             if(fru.getWsdlImplementativoFruitore()!=null){
  1237.                 try{
  1238.                     HttpUtilities.validateUri(fru.getWsdlImplementativoFruitore(),this.checkEsistenzaFileDefinitoTramiteURI);
  1239.                 }catch(Exception e){
  1240.                     this.errori.add("Il wsdl implementativo fruitore del fruitore ["+fru.getTipo()+"/"+fru.getNome()+"] del servizio "+uriServizio+" non è valido: "+e.getMessage());
  1241.                 }
  1242.             }
  1243.            
  1244.         }

  1245.        
  1246.         // Allegati
  1247.         for(int i=0; i<asps.sizeAllegatoList(); i++){
  1248.             Documento allegato = asps.getAllegato(i);
  1249.             this.validateDocumento(allegato, RuoliDocumento.allegato,"Servizio["+uriServizio+"]");
  1250.         }
  1251.         // SpecificheSemiformali
  1252.         for(int i=0; i<asps.sizeSpecificaSemiformaleList(); i++){
  1253.             Documento specificaSemiformale = asps.getSpecificaSemiformale(i);
  1254.             this.validateDocumento(specificaSemiformale, RuoliDocumento.specificaSemiformale,"Servizio["+uriServizio+"]");
  1255.         }
  1256.         // SpecificheLivelliServizio
  1257.         for(int i=0; i<asps.sizeSpecificaLivelloServizioList(); i++){
  1258.             Documento specificaLivelloServizio = asps.getSpecificaLivelloServizio(i);
  1259.             this.validateDocumento(specificaLivelloServizio, RuoliDocumento.specificaLivelloServizio,"Servizio["+uriServizio+"]");
  1260.         }
  1261.         // SpecificheSicurezza
  1262.         for(int i=0; i<asps.sizeSpecificaSicurezzaList(); i++){
  1263.             Documento specificaSicurezza = asps.getSpecificaSicurezza(i);
  1264.             this.validateDocumento(specificaSicurezza, RuoliDocumento.specificaSicurezza,"Servizio["+uriServizio+"]");
  1265.         }
  1266.        
  1267.        
  1268.         // Il tipo deve essere uno tra quelli definiti in govway.properties. Ci puoi accedere attraverso il comando: org.openspcoop.pdd.config.OpenSPCoopProperties.getInstance().getTipiServizi()
  1269.         ServiceBinding binding = this.mappingAccordiToServiceBinding.get(this.idAccordoFactory.normalizeUri(asps.getAccordoServizioParteComune()));
  1270.         if(binding==null){
  1271.             this.errori.add("Il servizio "+uriServizio+" implementa un accordo parte comune ["+asps.getAccordoServizioParteComune()+"] non esistente");
  1272.         }
  1273.         if(ServiceBinding.SOAP.equals(binding)){
  1274.             if(this.tipoServiziSoap.contains(asps.getTipo())==false){
  1275.                 this.errori.add("Il tipo del servizio "+uriServizio+" non è valido (tipi utilizzabili: "+this.getTipoServiziSoap()+")");
  1276.             }
  1277.         }
  1278.         else{
  1279.             if(this.tipoServiziRest.contains(asps.getTipo())==false){
  1280.                 this.errori.add("Il tipo del servizio "+uriServizio+" non è valido (tipi utilizzabili: "+this.getTipoServiziRest()+")");
  1281.             }
  1282.         }

  1283.         // Il nome del servizio deve possedere i stessi vincoli presenti per il nome di un servizio inserito nell'interfaccia grafica regserv.
  1284.         // Il nome deve contenere solo lettere e numeri e '_' '-' '.'
  1285.         try{
  1286.             if (!RegularExpressionEngine.isMatch(asps.getNome(),"^[0-9A-Za-z_\\-\\.]+$")) {
  1287.                 this.errori.add("Il nome del servizio "+uriServizio+" dev'essere formato solo caratteri, cifre, '_' , '-' e '.'");
  1288.             }
  1289.         }catch(Exception e){
  1290.             throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del servizio "+uriServizio+" :" +e.getMessage(),e);
  1291.         }
  1292.    
  1293.         if(asps.getAccordoServizioParteComune()==null){
  1294.             this.errori.add("Il Servizio "+uriServizio+" non implementa un accordo di servizio");
  1295.         }else{
  1296.             // Il nome di un accordo di servizio deve puntare ad un accordo realmente esistente.
  1297.             if(this.existsAccordoServizioParteComune(asps.getAccordoServizioParteComune())==false){
  1298.                 this.errori.add("L'accordo servizio "+asps.getAccordoServizioParteComune()+" del servizio "+uriServizio+" non corrisponde a nessuno degli accordi servizio registrati");
  1299.             }
  1300.             else{
  1301.                 // Il nome di un port type, se presente, deve puntare ad un porttype definito dentro l'accordo di servizio del punto 7.
  1302.                 String nomePT = asps.getPortType();
  1303.                 if (nomePT != null) {
  1304.                     AccordoServizioParteComune as = this.getAccordoServizioParteComune(asps.getAccordoServizioParteComune());
  1305.                     if(this.existsPortType_AccordoServizioParteComune(as, nomePT)==false){
  1306.                         this.errori.add("Il servizio "+nomePT+" del servizio "+uriServizio+" non corrisponde a nessuno dei servizi dell'accordo servizio implementato ["+asps.getAccordoServizioParteComune()+"]");
  1307.                     }
  1308.                 }
  1309.             }
  1310.         }
  1311.            
  1312.        
  1313.         // ogni servizio identificato dalla quintupla tipo/nome/versione del servizio e tipo/nome del soggetto erogatore, deve essere univoco
  1314.         int numS = 0;
  1315.         for (int j=0; j<sogg.sizeAccordoServizioParteSpecificaList(); j++) {
  1316.             AccordoServizioParteSpecifica tmpS = sogg.getAccordoServizioParteSpecifica(j);
  1317.             if (asps.getNome().equals(tmpS.getNome()) &&
  1318.                     asps.getTipo().equals(tmpS.getTipo()) &&
  1319.                     (asps.getVersione().intValue() == tmpS.getVersione().intValue()) &&
  1320.                     asps.getNomeSoggettoErogatore().equals(tmpS.getNomeSoggettoErogatore()) &&
  1321.                     asps.getTipoSoggettoErogatore().equals(tmpS.getTipoSoggettoErogatore()) )
  1322.                 numS++;
  1323.         }
  1324.         if (numS > 1)
  1325.             this.errori.add("Non può esistere più di un servizio con tipo:"+asps.getTipo()+", nome:"+asps.getNome()+", versione:"+asps.getVersione()+
  1326.                     " tipoSoggettoErogatore:"+asps.getTipoSoggettoErogatore()+" e nomeSoggettoErogatore "+asps.getNomeSoggettoErogatore());

  1327.            
  1328.         // Wsdl
  1329.         if(asps.getWsdlImplementativoErogatore()!=null){
  1330.             try{
  1331.                 HttpUtilities.validateUri(asps.getWsdlImplementativoErogatore(),this.checkEsistenzaFileDefinitoTramiteURI);
  1332.             }catch(Exception e){
  1333.                 this.errori.add("Il wsdl implementativo erogatore del servizio "+uriServizio+" non è valido: "+e.getMessage());
  1334.             }
  1335.         }
  1336.         if(asps.getWsdlImplementativoFruitore()!=null){
  1337.             try{
  1338.                 HttpUtilities.validateUri(asps.getWsdlImplementativoFruitore(),this.checkEsistenzaFileDefinitoTramiteURI);
  1339.             }catch(Exception e){
  1340.                 this.errori.add("Il wsdl implementativo fruitore del servizio "+uriServizio+" non è valido: "+e.getMessage());
  1341.             }
  1342.         }
  1343.        

  1344.         // XSD: filtro-duplicati: abilitato, disabilitato
  1345.         StatoFunzionalita filtroDup = asps.getFiltroDuplicati();
  1346.         if ( filtroDup != null && !filtroDup.equals(CostantiRegistroServizi.ABILITATO) && !filtroDup.equals(CostantiRegistroServizi.DISABILITATO))
  1347.             this.errori.add("Il filtro duplicati del servizio "+uriServizio+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  1348.         // XSD: conferma-ricezione: abilitato, disabilitato
  1349.         StatoFunzionalita confRic = asps.getConfermaRicezione();
  1350.         if (confRic != null && !confRic.equals(CostantiRegistroServizi.ABILITATO) && !confRic.equals(CostantiRegistroServizi.DISABILITATO))
  1351.             this.errori.add("La conferma ricezione del servizio "+uriServizio+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  1352.         // XSD: id-collaborazione: abilitato, disabilitato
  1353.         StatoFunzionalita idColl = asps.getIdCollaborazione();
  1354.         if (idColl != null && !idColl.equals(CostantiRegistroServizi.ABILITATO) && !idColl.equals(CostantiRegistroServizi.DISABILITATO))
  1355.             this.errori.add("L'id collaborazione del servizio "+uriServizio+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  1356.         // XSD: consegna-in-ordine: abilitato, disabilitato
  1357.         StatoFunzionalita consOrd = asps.getConsegnaInOrdine();
  1358.         if (consOrd != null && !consOrd.equals(CostantiRegistroServizi.ABILITATO) && !consOrd.equals(CostantiRegistroServizi.DISABILITATO))
  1359.             this.errori.add("La consegna in ordine del servizio "+uriServizio+" deve possedere il valore "+CostantiRegistroServizi.ABILITATO+" o "+CostantiRegistroServizi.DISABILITATO);
  1360.         // Scadenza
  1361.         if(asps.getScadenza()!=null){
  1362.             try{
  1363.                 Integer.parseInt(asps.getScadenza());
  1364.             }catch(Exception e){
  1365.                 this.errori.add("Il valore associato alla scadenza del servizio "+uriServizio+" dev'essere un numero intero");
  1366.             }
  1367.         }

  1368.     }

  1369.     private  void validaPortaDominio(PortaDominio pdd) throws DriverRegistroServiziException {
  1370.        
  1371.         // required
  1372.         if(pdd.getNome()==null){
  1373.             this.errori.add("Esiste una porta di dominio senza nome");
  1374.             return;
  1375.         }
  1376.        
  1377.         // Controllo sul nome
  1378.         try{
  1379.             if (!RegularExpressionEngine.isMatch(pdd.getNome(),"^[0-9A-Za-z_\\-\\.]+$")) {
  1380.                 this.errori.add("Il nome della porta di dominio dev'essere formato solo da caratteri, cifre, '_' , '-' e '.'");
  1381.             }
  1382.         }catch(Exception e){
  1383.             throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome della porta di dominio :" +e.getMessage(),e);
  1384.         }  
  1385.        
  1386.         // XSD: client-auth: abilitato, disabilitato
  1387.         StatoFunzionalita clA = pdd.getClientAuth();
  1388.         if ((clA != null) && !clA.equals("abilitato") && !clA.equals("disabilitato"))
  1389.             this.errori.add("Il client-auth della porta di dominio "+pdd.getNome()+" dev'essere abilitato o disabilitato");
  1390.        
  1391.         // se presente 'client-auth=abilitato' il subject deve essere fornito
  1392.         if (pdd.getClientAuth() != null && pdd.getClientAuth().equals("abilitato") && (pdd.getSubject() == null || pdd.getSubject().equals("")))
  1393.             this.errori.add("Il subject della porta di dominio "+pdd.getNome()+" dev'essere fornito quando client-auth è abilitato");

  1394.         // Ogni porta di dominio deve avere un nome diverso!
  1395.         int numPd = 0;
  1396.         for(int j=0; j<this.registro.sizePortaDominioList();j++){
  1397.             PortaDominio tmpPd = this.registro.getPortaDominio(j);
  1398.             if (pdd.getNome().equals(tmpPd.getNome()))
  1399.                 numPd++;
  1400.         }
  1401.         if (numPd > 1)
  1402.             this.errori.add("Non può esistere più di una porta di dominio con nome "+pdd.getNome());
  1403.    
  1404.     }
  1405.    
  1406.     private  void validaRuolo(Ruolo ruolo) throws DriverRegistroServiziException {
  1407.        
  1408.         // required
  1409.         if(ruolo.getNome()==null){
  1410.             this.errori.add("Esiste un ruolo senza nome");
  1411.             return;
  1412.         }
  1413.        
  1414.         // Controllo sul nome
  1415.         try{
  1416.             if (!RegularExpressionEngine.isMatch(ruolo.getNome(),"^[0-9A-Za-z_]+$")) {
  1417.                 this.errori.add("Il nome del ruolo dev'essere formato solo da caratteri, cifre e '_'");
  1418.             }
  1419.         }catch(Exception e){
  1420.             throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome del ruolo :" +e.getMessage(),e);
  1421.         }  
  1422.        
  1423.         // Ogni ruolo deve avere un nome diverso!
  1424.         int numRuolo = 0;
  1425.         for(int j=0; j<this.registro.sizeRuoloList();j++){
  1426.             Ruolo tmpRuolo = this.registro.getRuolo(j);
  1427.             if (ruolo.getNome().equals(tmpRuolo.getNome()))
  1428.                 numRuolo++;
  1429.         }
  1430.         if (numRuolo > 1)
  1431.             this.errori.add("Non può esistere più di un ruolo con nome "+ruolo.getNome());
  1432.    
  1433.     }
  1434.    
  1435.     private  void validaScope(Scope scope) throws DriverRegistroServiziException {
  1436.        
  1437.         // required
  1438.         if(scope.getNome()==null){
  1439.             this.errori.add("Esiste uno scope senza nome");
  1440.             return;
  1441.         }
  1442.        
  1443.         // Controllo sul nome
  1444.         try{
  1445.             if (!RegularExpressionEngine.isMatch(scope.getNome(),"^[0-9A-Za-z_]+$")) {
  1446.                 this.errori.add("Il nome dello scope dev'essere formato solo da caratteri, cifre e '_'");
  1447.             }
  1448.         }catch(Exception e){
  1449.             throw new DriverRegistroServiziException("Errore durante l'analisi tramite espressione regolare del nome dello scope :" +e.getMessage(),e);
  1450.         }  
  1451.        
  1452.         // Ogni scope deve avere un nome diverso!
  1453.         int numScope = 0;
  1454.         for(int j=0; j<this.registro.sizeScopeList();j++){
  1455.             Scope tmpScope = this.registro.getScope(j);
  1456.             if (scope.getNome().equals(tmpScope.getNome()))
  1457.                 numScope++;
  1458.         }
  1459.         if (numScope > 1)
  1460.             this.errori.add("Non può esistere più di uno scope con nome "+scope.getNome());
  1461.    
  1462.     }

  1463.     private  void validaConnettore(Connettore conn, String oggetto, String tipoEnomeOggetto) throws DriverRegistroServiziException {

  1464.         // Valida il connettore
  1465.         // NOTA: che il connettore puo' essere definito all'interno dell'oggetto o direttamente nella root del registro dei servizi. In tal caso all'interno dell'oggetto vi e' solo il nome del connettore. La validazione deve tenere conto di cio, e quindi se vi e' presente solo il nome, deve prima cercare il connettore nella root e poi validarlo.
  1466.         // 1. i connettori definiti nella radice del registro devono possedere un nome univoco
  1467.         // 2. Il connettore deve possedere un tipo definito. Il tipo di connettore definito deve essere validato utilizzando il seguente metodo: org.openspcoop.pdd.config.ClassNameProperties.getInstance().getConnettore(tipo). Se il metodo ritorna null, il tipo di connettore non e' valido.
  1468.         // 3. Se il connettore e' di tipo http deve possedere i stessi vincoli presenti per un connettore http inserito nell'interfaccia grafica regserv, e cioe deve possedere le property che servono ad un connettore http.
  1469.         // 4. Se il connettore e' di tipo jms deve possedere i stessi vincoli presenti per un connettore jms inserito nell'interfaccia grafica regserv, e cioe deve possedere le property che servono ad un connettore jms.
  1470.         // 5. Se il connettore e' di tipo 'disabilitato' non deve possedere property

  1471.         String nomeConn = conn.getNome();
  1472.         String tipoConn = conn.getTipo();

  1473.         // required
  1474.         if(nomeConn==null){
  1475.             if(oggetto==null)
  1476.                 this.errori.add("Esiste un connettore nella radice del registro per cui non è definito il nome");
  1477.             else
  1478.                 this.errori.add("Esiste un connettore del "+oggetto+" "+tipoEnomeOggetto+" per cui non è definito il nome");
  1479.             return;
  1480.         }
  1481.        
  1482.         if(oggetto==null){

  1483.             // 1. i connettori definiti nella radice del registro devono possedere un nome univoco
  1484.             int numC = 0;
  1485.             for(int j=0; j<this.registro.sizeConnettoreList();j++){
  1486.                 Connettore tmpC = this.registro.getConnettore(j);
  1487.                 if (nomeConn.equals(tmpC.getNome()))
  1488.                     numC++;
  1489.             }
  1490.             if (numC > 1)
  1491.                 this.errori.add("Non può esistere più di un connettore con nome "+nomeConn+" definito come elemento radice del registro servizi");
  1492.         }

  1493.         else{
  1494.             if (tipoConn == null) {
  1495.                 // Cerco il connettore nella root del registro
  1496.                 conn = null;
  1497.                 for (int j=0; j<this.registro.sizeConnettoreList();j++) {
  1498.                     Connettore connettore = this.registro.getConnettore(j);
  1499.                     if (nomeConn.equals(connettore.getNome())) {
  1500.                         conn = connettore;
  1501.                         break;
  1502.                     }
  1503.                 }
  1504.             }
  1505.             if (conn == null)
  1506.                 this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" non corrisponde a nessuno dei connettori registrati");
  1507.             else {
  1508.                 tipoConn = conn.getTipo();
  1509.             }
  1510.         }

  1511.         // 2. Il connettore deve possedere un tipo definito. Il tipo di connettore definito deve essere validato utilizzando il seguente metodo: org.openspcoop.pdd.config.ClassNameProperties.getInstance().getConnettore(tipo). Se il metodo ritorna null, il tipo di connettore non e' valido.
  1512.         if(this.tipoConnettori.contains(tipoConn)==false){
  1513.             if(oggetto==null){
  1514.                 this.errori.add("Il tipo ["+tipoConn+"] del connettore "+nomeConn+", definito nella radice del registro, non è valido (Tipi conosciuti: "+this.getTipoConnettori()+")");
  1515.             }else{
  1516.                 this.errori.add("Il tipo ["+tipoConn+"] del connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" non è valido (Tipi conosciuti: "+this.getTipoConnettori()+")");
  1517.             }
  1518.         }
  1519.         else{

  1520.             // Check generale sulle proprietà
  1521.             for (int j=0; j<conn.sizePropertyList();j++) {
  1522.                 Property cp = conn.getProperty(j);
  1523.                 if(cp.getNome()==null){
  1524.                     if(oggetto==null){
  1525.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, possiede una proprietà per cui non è definito il nome");
  1526.                     }else{
  1527.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" possiede una proprietà per cui non è definito il nome");
  1528.                     }
  1529.                     return;
  1530.                 }
  1531.                 if(cp.getValore()==null){
  1532.                     if(oggetto==null){
  1533.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, possiede una proprietà per cui non è definito il valore");
  1534.                     }else{
  1535.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" possiede una proprietà per cui non è definito il valore");
  1536.                     }
  1537.                     return;
  1538.                 }
  1539.             }
  1540.            
  1541.             // Connettore HTTP
  1542.             if (tipoConn.equals(TipiConnettore.HTTP.getNome())) {
  1543.                 String urlConn = null;
  1544.                 for (int j=0; j<conn.sizePropertyList();j++) {
  1545.                     Property cp = conn.getProperty(j);
  1546.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTP_LOCATION)) {
  1547.                         urlConn = cp.getValore();
  1548.                         break;
  1549.                     }
  1550.                 }
  1551.                 if (urlConn == null){
  1552.                     if(oggetto==null){
  1553.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo http, ma non ha una url definita");
  1554.                     }else{
  1555.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo http, ma non ha una url definita");
  1556.                     }
  1557.                 }
  1558.                 else{
  1559.                     try{
  1560.                         this.validaUrl(urlConn);
  1561.                     }catch(Exception e){
  1562.                         if(oggetto==null){
  1563.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo http, ma non ha una url valida: "+e.getMessage());
  1564.                         }else{
  1565.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo http, ma non ha una url valida: "+e.getMessage());
  1566.                         }
  1567.                     }
  1568.                 }
  1569.             }

  1570.             // Connettore JMS
  1571.             else if (tipoConn.equals(TipiConnettore.JMS.getNome())) {
  1572.                 String jmsNome = null, jmsTipo = null, jmsConnFact = null, jmsSendAs = null;
  1573.                 for (int j=0; j<conn.sizePropertyList();j++) {
  1574.                     Property cp = conn.getProperty(j);
  1575.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_JMS_NOME))
  1576.                         jmsNome = cp.getValore();
  1577.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_JMS_TIPO))
  1578.                         jmsTipo = cp.getValore();
  1579.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_JMS_CONNECTION_FACTORY))
  1580.                         jmsConnFact = cp.getValore();
  1581.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_JMS_SEND_AS))
  1582.                         jmsSendAs = cp.getValore();
  1583.                 }
  1584.                 if (jmsNome == null){
  1585.                     if(oggetto==null){
  1586.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo jms, ma non ha un nome coda/topic definito");
  1587.                     }else{
  1588.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo jms, ma non ha un nome coda/topic definito");
  1589.                     }
  1590.                 }
  1591.                 if (jmsTipo == null){
  1592.                     if(oggetto==null){
  1593.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo jms, ma non ha un tipo coda/topic definito");
  1594.                     }else{
  1595.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo jms, ma non ha un tipo coda/topic definito");
  1596.                     }
  1597.                 }else{
  1598.                     if (!jmsTipo.equals(CostantiConnettori.CONNETTORE_JMS_TIPO_QUEUE) && !jmsTipo.equals(CostantiConnettori.CONNETTORE_JMS_TIPO_TOPIC)){
  1599.                         if(oggetto==null){
  1600.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo jms, ma non ha un tipo coda/topic valido (valori assumibili sono topic/queue)");
  1601.                         }else{
  1602.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo jms, ma non ha un tipo coda/topic valido (valori assumibili sono topic/queue)");
  1603.                         }
  1604.                     }
  1605.                 }
  1606.                 if (jmsConnFact == null){
  1607.                     if(oggetto==null){
  1608.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo jms, ma non ha una connection factory definita");
  1609.                     }else{
  1610.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo jms, ma non ha una connection factory definita");
  1611.                     }
  1612.                 }
  1613.                 if (jmsSendAs == null){
  1614.                     if(oggetto==null){
  1615.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo jms, ma non ha un tipo di messaggio (sendAs) definito");
  1616.                     }else{
  1617.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo jms, ma non ha un tipo di messaggio (sendAs) definito");
  1618.                     }
  1619.                 }else{
  1620.                     if (!jmsSendAs.equals(CostantiConnettori.CONNETTORE_JMS_SEND_AS_TEXT_MESSAGE) && !jmsSendAs.equals(CostantiConnettori.CONNETTORE_JMS_SEND_AS_BYTES_MESSAGE)){
  1621.                         if(oggetto==null){
  1622.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo jms, ma non ha un tipo di messaggio (sendAs) (valori assumibili sono TextMessage/BytesMessage)");
  1623.                         }else{
  1624.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo jms, ma non ha un tipo di messaggio (sendAs) (valori assumibili sono TextMessage/BytesMessage)");
  1625.                         }
  1626.                     }
  1627.                 }
  1628.             }

  1629.             // Connettore HTTPS
  1630.             else if (tipoConn.equals(TipiConnettore.HTTPS.getNome())) {
  1631.                 String urlConn = null;
  1632.                 String trustStoreLocation = null;
  1633.                 String trustStorePassword = null;
  1634.                 String keyStoreLocation = null;
  1635.                 String keyStorePassword = null;
  1636.                 String keyPassword = null;
  1637.                 String hostNameVerifier = null;
  1638.                 for (int j=0; j<conn.sizePropertyList();j++) {
  1639.                     Property cp = conn.getProperty(j);
  1640.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_LOCATION)) {
  1641.                         urlConn = cp.getValore();
  1642.                     }
  1643.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_TRUST_STORE_LOCATION)) {
  1644.                         trustStoreLocation = cp.getValore();
  1645.                     }
  1646.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_TRUST_STORE_PASSWORD)) {
  1647.                         trustStorePassword = cp.getValore();
  1648.                     }
  1649.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_KEY_STORE_LOCATION)) {
  1650.                         keyStoreLocation = cp.getValore();
  1651.                     }
  1652.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_KEY_STORE_PASSWORD)) {
  1653.                         keyStorePassword = cp.getValore();
  1654.                     }
  1655.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_KEY_PASSWORD)) {
  1656.                         keyPassword = cp.getValore();
  1657.                     }
  1658.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_HOSTNAME_VERIFIER)) {
  1659.                         hostNameVerifier = cp.getValore();
  1660.                     }
  1661.                 }
  1662.                 if (urlConn == null){
  1663.                     if(oggetto==null){
  1664.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo http, ma non ha una url definita");
  1665.                     }else{
  1666.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo http, ma non ha una url definita");
  1667.                     }
  1668.                 }
  1669.                 else{
  1670.                     try{
  1671.                         this.validaUrl(urlConn);
  1672.                     }catch(Exception e){
  1673.                         if(oggetto==null){
  1674.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo http, ma non ha una url valida: "+e.getMessage());
  1675.                         }else{
  1676.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo http, ma non ha una url valida: "+e.getMessage());
  1677.                         }
  1678.                     }
  1679.                 }
  1680.                 if (trustStoreLocation != null){
  1681.                     File f = new File(trustStoreLocation);
  1682.                     if(f.exists()==false){
  1683.                         if(oggetto==null){
  1684.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un truststore "+trustStoreLocation+" che non esiste");
  1685.                         }else{
  1686.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un truststore "+trustStoreLocation+" che non esiste");
  1687.                         }
  1688.                     }
  1689.                     else if(f.isFile()==false){
  1690.                         if(oggetto==null){
  1691.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un truststore "+trustStoreLocation+" che non e' un file");
  1692.                         }else{
  1693.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un truststore "+trustStoreLocation+" che non e' un file");
  1694.                         }
  1695.                     }
  1696.                     else if(f.canRead()==false){
  1697.                         if(oggetto==null){
  1698.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un truststore "+trustStoreLocation+" che non e' accessibile (permessi in lettura non forniti)");
  1699.                         }else{
  1700.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un truststore "+trustStoreLocation+" che non e' accessibile (permessi in lettura non forniti)");
  1701.                         }
  1702.                     }
  1703.                     else if(trustStorePassword==null){
  1704.                         if(oggetto==null){
  1705.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un truststore "+trustStoreLocation+" per cui non e' stata specificata una password");
  1706.                         }else{
  1707.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un truststore "+trustStoreLocation+" per cui non e' stata specificata una password");
  1708.                         }
  1709.                     }
  1710.                 }
  1711.                 if (keyStoreLocation != null){
  1712.                     File f = new File(keyStoreLocation);
  1713.                     if(f.exists()==false){
  1714.                         if(oggetto==null){
  1715.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un keystore "+keyStoreLocation+" che non esiste");
  1716.                         }else{
  1717.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un keystore "+keyStoreLocation+" che non esiste");
  1718.                         }
  1719.                     }
  1720.                     else if(f.isFile()==false){
  1721.                         if(oggetto==null){
  1722.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un keystore "+keyStoreLocation+" che non e' un file");
  1723.                         }else{
  1724.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un keystore "+keyStoreLocation+" che non e' un file");
  1725.                         }
  1726.                     }
  1727.                     else if(f.canRead()==false){
  1728.                         if(oggetto==null){
  1729.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un keystore "+keyStoreLocation+" che non e' accessibile (permessi in lettura non forniti)");
  1730.                         }else{
  1731.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un keystore "+keyStoreLocation+" che non e' accessibile (permessi in lettura non forniti)");
  1732.                         }
  1733.                     }
  1734.                     else if(keyStorePassword==null){
  1735.                         if(oggetto==null){
  1736.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un keystore "+keyStoreLocation+" per cui non e' stata specificata una password");
  1737.                         }else{
  1738.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un keystore "+keyStoreLocation+" per cui non e' stata specificata una password");
  1739.                         }
  1740.                     }
  1741.                     else if(keyPassword==null){
  1742.                         if(oggetto==null){
  1743.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, definisce un keystore "+keyStoreLocation+" per cui non e' stata specificata una password per la chiave privata");
  1744.                         }else{
  1745.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" definisce un keystore "+keyStoreLocation+" per cui non e' stata specificata una password per la chiave privata");
  1746.                         }
  1747.                     }
  1748.                 }
  1749.                 if(hostNameVerifier!=null){
  1750.                     try{
  1751.                         Boolean.parseBoolean(hostNameVerifier);
  1752.                     }catch(Exception e){
  1753.                         if(oggetto==null){
  1754.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, associa un valore non valido  alla proprieta' 'hostNameVerifier'; valori utilizzabili: true e false");
  1755.                         }else{
  1756.                             this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" associa un valore non valido  alla proprieta' 'hostNameVerifier'; valori utilizzabili: true e false");
  1757.                         }
  1758.                     }
  1759.                 }
  1760.             }
  1761.            
  1762.             else if (tipoConn.equals(TipiConnettore.DISABILITATO.getNome())) {
  1763.                 if (conn.sizePropertyList()>0) {
  1764.                     if(oggetto==null){
  1765.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del registro, è di tipo disabilitato, ma ha delle properties definite");
  1766.                     }else{
  1767.                         this.errori.add("Il connettore "+nomeConn+" del "+oggetto+" "+tipoEnomeOggetto+" è di tipo disabilitato, ma ha delle properties definite");
  1768.                     }
  1769.                 }
  1770.             }
  1771.         }
  1772.     }

  1773.     private void validateDocumento(Documento doc,RuoliDocumento ruolo,String oggetto) {

  1774.         if(doc.getTipo()==null){
  1775.             this.errori.add("Esiste un documento con ruolo ("+ruolo.toString()+") per l'oggetto "+oggetto+" per cui non è definito il tipo");
  1776.             return;
  1777.         }
  1778.         if(doc.getFile()==null){
  1779.             this.errori.add("Esiste un documento con ruolo ("+ruolo.toString()+") per l'oggetto "+oggetto+" per cui non è definito il file");
  1780.             return;
  1781.         }
  1782.        
  1783.         String idDocumento = "("+ruolo.toString()+")("+doc.getTipo()+")("+doc.getFile()+") ";

  1784.         // analizzo tipo
  1785.         if(RuoliDocumento.allegato.toString().equals(ruolo.toString())){
  1786.             // Allegato vale qualsiasi tipo
  1787.         }else if(RuoliDocumento.specificaSemiformale.toString().equals(ruolo.toString())){
  1788.             if(TipiDocumentoSemiformale.toEnumConstant(doc.getTipo())==null){
  1789.                 String [] tipi = TipiDocumentoSemiformale.toStringArray();
  1790.                 StringBuilder bf = new StringBuilder();
  1791.                 for(int i=0; i<tipi.length; i++){
  1792.                     if(i>0)
  1793.                         bf.append(",");
  1794.                     bf.append(tipi[i]);
  1795.                 }
  1796.                 this.errori.add(idDocumento+" tipo non utilizzabile in una specifica semiformale (oggetto: "+oggetto+"), valori ammessi: ");
  1797.             }
  1798.         }else if(RuoliDocumento.specificaCoordinamento.toString().equals(ruolo.toString())){
  1799.             if(TipiDocumentoCoordinamento.toEnumConstant(doc.getTipo())==null){
  1800.                 String [] tipi = TipiDocumentoCoordinamento.toStringArray();
  1801.                 StringBuilder bf = new StringBuilder();
  1802.                 for(int i=0; i<tipi.length; i++){
  1803.                     if(i>0)
  1804.                         bf.append(",");
  1805.                     bf.append(tipi[i]);
  1806.                 }
  1807.                 this.errori.add(idDocumento+" tipo non utilizzabile in una specifica di coordinamento (oggetto: "+oggetto+"), valori ammessi: ");
  1808.             }
  1809.         }else if(RuoliDocumento.specificaLivelloServizio.toString().equals(ruolo.toString())){
  1810.             if(TipiDocumentoLivelloServizio.toEnumConstant(doc.getTipo())==null){
  1811.                 String [] tipi = TipiDocumentoLivelloServizio.toStringArray();
  1812.                 StringBuilder bf = new StringBuilder();
  1813.                 for(int i=0; i<tipi.length; i++){
  1814.                     if(i>0)
  1815.                         bf.append(",");
  1816.                     bf.append(tipi[i]);
  1817.                 }
  1818.                 this.errori.add(idDocumento+" tipo non utilizzabile in una specifica dei livelli di servizio (oggetto: "+oggetto+"), valori ammessi: ");
  1819.             }
  1820.         }else if(RuoliDocumento.specificaSicurezza.toString().equals(ruolo.toString())){
  1821.             if(TipiDocumentoSicurezza.toEnumConstant(doc.getTipo())==null){
  1822.                 String [] tipi = TipiDocumentoSicurezza.toStringArray();
  1823.                 StringBuilder bf = new StringBuilder();
  1824.                 for(int i=0; i<tipi.length; i++){
  1825.                     if(i>0)
  1826.                         bf.append(",");
  1827.                     bf.append(tipi[i]);
  1828.                 }
  1829.                 this.errori.add(idDocumento+" tipo non utilizzabile in una specifica di sicurezza (oggetto: "+oggetto+"), valori ammessi: ");
  1830.             }
  1831.         }else{
  1832.             this.errori.add((idDocumento+" ruolo non conosciuto (oggetto: "+oggetto+"): "+ruolo.toString()));
  1833.         }

  1834.         // Validazione url
  1835.         try{
  1836.             HttpUtilities.validateUri(doc.getFile(),this.checkEsistenzaFileDefinitoTramiteURI);
  1837.         }catch(Exception e){
  1838.             this.errori.add(idDocumento+" file non valido (oggetto: "+oggetto+"): "+e.getMessage());
  1839.         }
  1840.     }







  1841.     /* ------------------ UTILITY ------------------------------*/

  1842.     private void validaUrl(String url) throws java.net.MalformedURLException {
  1843.         java.net.URL testUrl = new java.net.URL(url);
  1844.         testUrl.toString();
  1845.     }

  1846.     private boolean existsAccordoCooperazione(String uriAccordo) throws DriverRegistroServiziException{
  1847.         return this.getAccordoCooperazione(uriAccordo)!=null;
  1848.     }
  1849.     private AccordoCooperazione getAccordoCooperazione(String uriAccordo) throws DriverRegistroServiziException{
  1850.         for(int j=0; j<this.registro.sizeAccordoCooperazioneList();j++){
  1851.             AccordoCooperazione ac = this.registro.getAccordoCooperazione(j);
  1852.             if (this.idAccordoCooperazioneFactory.getUriFromAccordo(ac).equals(uriAccordo)) {
  1853.                 return ac;
  1854.             }
  1855.         }
  1856.         return null;
  1857.     }

  1858.     private boolean existsAccordoServizioParteComune(String uriAccordo) throws DriverRegistroServiziException{
  1859.         return this.getAccordoServizioParteComune(uriAccordo)!=null;
  1860.     }
  1861.     private AccordoServizioParteComune getAccordoServizioParteComune(String uriAccordo) throws DriverRegistroServiziException{
  1862.         for(int j=0; j<this.registro.sizeAccordoServizioParteComuneList();j++){
  1863.             AccordoServizioParteComune as = this.registro.getAccordoServizioParteComune(j);
  1864.             if (this.idAccordoFactory.getUriFromAccordo(as).equals(this.idAccordoFactory.normalizeUri(uriAccordo))) {
  1865.                 return as;
  1866.             }
  1867.         }
  1868.         return null;
  1869.     }

  1870.     private boolean existsResource_AccordoServizioParteComune(AccordoServizioParteComune as, String azione) throws DriverRegistroServiziException{
  1871.         return this.getResource_AccordoServizioParteComune(as, azione)!=null;
  1872.     }
  1873.     private Resource getResource_AccordoServizioParteComune(AccordoServizioParteComune as, String azione) throws DriverRegistroServiziException{
  1874.         for(int j=0; j<as.sizeResourceList();j++){
  1875.             Resource r = as.getResource(j);
  1876.             if(r.getNome().equals(azione))
  1877.                 return r;
  1878.         }
  1879.         return null;
  1880.     }
  1881.    
  1882.     private boolean existsAzione_AccordoServizioParteComune(AccordoServizioParteComune as, String azione) throws DriverRegistroServiziException{
  1883.         return this.getAzione_AccordoServizioParteComune(as, azione)!=null;
  1884.     }
  1885.     private Azione getAzione_AccordoServizioParteComune(AccordoServizioParteComune as, String azione) throws DriverRegistroServiziException{
  1886.         for(int j=0; j<as.sizeAzioneList();j++){
  1887.             Azione az = as.getAzione(j);
  1888.             if(az.getNome().equals(azione))
  1889.                 return az;
  1890.         }
  1891.         return null;
  1892.     }

  1893.     private boolean existsPortType_AccordoServizioParteComune(AccordoServizioParteComune as, String porttype) throws DriverRegistroServiziException{
  1894.         return this.getPortType_AccordoServizioParteComune(as, porttype)!=null;
  1895.     }
  1896.     private PortType getPortType_AccordoServizioParteComune(AccordoServizioParteComune as, String porttype) throws DriverRegistroServiziException{
  1897.         for(int j=0; j<as.sizePortTypeList();j++){
  1898.             PortType pt = as.getPortType(j);
  1899.             if(pt.getNome().equals(porttype))
  1900.                 return pt;
  1901.         }
  1902.         return null;
  1903.     }

  1904.     private boolean existsAzione_PortType_AccordoServizio(PortType pt, String azione) throws DriverRegistroServiziException{
  1905.         return this.getAzione_PortType_AccordoServizio(pt, azione)!=null;
  1906.     }
  1907.     private Operation getAzione_PortType_AccordoServizio(PortType pt, String azione) throws DriverRegistroServiziException{
  1908.         for(int j=0; j<pt.sizeAzioneList();j++){
  1909.             Operation az = pt.getAzione(j);
  1910.             if(az.getNome().equals(azione))
  1911.                 return az;
  1912.         }
  1913.         return null;
  1914.     }

  1915.     private boolean existsPortaDominio(String nome){
  1916.         return this.getPortaDominio(nome)!=null;
  1917.     }
  1918.     private PortaDominio getPortaDominio(String nome){
  1919.         for(int j=0; j<this.registro.sizePortaDominioList();j++){
  1920.             PortaDominio pdd = this.registro.getPortaDominio(j);
  1921.             if (nome.equals(pdd.getNome())) {
  1922.                 return pdd;
  1923.             }
  1924.         }
  1925.         return null;
  1926.     }

  1927.     private boolean existsSoggetto(String tipo,String nome){
  1928.         return this.getSoggetto(tipo, nome)!=null;
  1929.     }
  1930.     private Soggetto getSoggetto(String tipo,String nome){
  1931.         for(int j=0; j<this.registro.sizeSoggettoList();j++){
  1932.             Soggetto ss = this.registro.getSoggetto(j);
  1933.             if (tipo.equals(ss.getTipo()) && nome.equals(ss.getNome())) {
  1934.                 return ss;
  1935.             }
  1936.         }
  1937.         return null;
  1938.     }

  1939.     private boolean existsAccordoServizioParteSpecifica(String tipo,String nome,Integer versione, String tipoSoggetto,String nomeSoggetto){
  1940.         return this.getAccordoServizioParteSpecifica(tipo, nome, versione, tipoSoggetto, nomeSoggetto)!=null;
  1941.     }
  1942.     private AccordoServizioParteSpecifica getAccordoServizioParteSpecifica(String tipo,String nome,Integer versione, String tipoSoggetto,String nomeSoggetto){
  1943.         for(int j=0; j<this.registro.sizeSoggettoList();j++){
  1944.             Soggetto ss = this.registro.getSoggetto(j);
  1945.             if (tipoSoggetto.equals(ss.getTipo()) && nomeSoggetto.equals(ss.getNome())) {
  1946.                 for(int h=0; h<ss.sizeAccordoServizioParteSpecificaList();h++){
  1947.                     AccordoServizioParteSpecifica serv = ss.getAccordoServizioParteSpecifica(h);
  1948.                     if (tipo.equals(serv.getTipo()) &&
  1949.                             nome.equals(serv.getNome()) &&
  1950.                             versione.intValue() == serv.getVersione().intValue()) {
  1951.                         return serv;
  1952.                     }
  1953.                 }
  1954.             }
  1955.         }
  1956.         return null;
  1957.     }
  1958. }