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.config.driver;

  21. import java.io.File;
  22. import java.util.ArrayList;
  23. import java.util.Iterator;
  24. import java.util.List;

  25. import org.openspcoop2.core.config.AccessoRegistro;
  26. import org.openspcoop2.core.config.AccessoRegistroRegistro;
  27. import org.openspcoop2.core.config.Attachments;
  28. import org.openspcoop2.core.config.Cache;
  29. import org.openspcoop2.core.config.Configurazione;
  30. import org.openspcoop2.core.config.Connettore;
  31. import org.openspcoop2.core.config.CorrelazioneApplicativa;
  32. import org.openspcoop2.core.config.CorrelazioneApplicativaElemento;
  33. import org.openspcoop2.core.config.CorrelazioneApplicativaRisposta;
  34. import org.openspcoop2.core.config.CorrelazioneApplicativaRispostaElemento;
  35. import org.openspcoop2.core.config.Credenziali;
  36. import org.openspcoop2.core.config.Dump;
  37. import org.openspcoop2.core.config.GestioneErrore;
  38. import org.openspcoop2.core.config.GestioneErroreCodiceTrasporto;
  39. import org.openspcoop2.core.config.GestioneErroreSoapFault;
  40. import org.openspcoop2.core.config.IndirizzoRisposta;
  41. import org.openspcoop2.core.config.InoltroBusteNonRiscontrate;
  42. import org.openspcoop2.core.config.IntegrationManager;
  43. import org.openspcoop2.core.config.InvocazioneCredenziali;
  44. import org.openspcoop2.core.config.InvocazionePorta;
  45. import org.openspcoop2.core.config.InvocazionePortaGestioneErrore;
  46. import org.openspcoop2.core.config.InvocazioneServizio;
  47. import org.openspcoop2.core.config.MessageSecurity;
  48. import org.openspcoop2.core.config.MessageSecurityFlow;
  49. import org.openspcoop2.core.config.MessageSecurityFlowParameter;
  50. import org.openspcoop2.core.config.MessaggiDiagnostici;
  51. import org.openspcoop2.core.config.MtomProcessor;
  52. import org.openspcoop2.core.config.MtomProcessorFlow;
  53. import org.openspcoop2.core.config.MtomProcessorFlowParameter;
  54. import org.openspcoop2.core.config.OpenspcoopAppender;
  55. import org.openspcoop2.core.config.PortaApplicativa;
  56. import org.openspcoop2.core.config.PortaApplicativaAzione;
  57. import org.openspcoop2.core.config.PortaApplicativaServizio;
  58. import org.openspcoop2.core.config.PortaApplicativaServizioApplicativo;
  59. import org.openspcoop2.core.config.PortaApplicativaSoggettoVirtuale;
  60. import org.openspcoop2.core.config.PortaDelegata;
  61. import org.openspcoop2.core.config.PortaDelegataAzione;
  62. import org.openspcoop2.core.config.PortaDelegataServizio;
  63. import org.openspcoop2.core.config.PortaDelegataServizioApplicativo;
  64. import org.openspcoop2.core.config.PortaDelegataSoggettoErogatore;
  65. import org.openspcoop2.core.config.Property;
  66. import org.openspcoop2.core.config.Proprieta;
  67. import org.openspcoop2.core.config.RispostaAsincrona;
  68. import org.openspcoop2.core.config.Risposte;
  69. import org.openspcoop2.core.config.Route;
  70. import org.openspcoop2.core.config.RouteGateway;
  71. import org.openspcoop2.core.config.RouteRegistro;
  72. import org.openspcoop2.core.config.RoutingTable;
  73. import org.openspcoop2.core.config.RoutingTableDefault;
  74. import org.openspcoop2.core.config.RoutingTableDestinazione;
  75. import org.openspcoop2.core.config.ServizioApplicativo;
  76. import org.openspcoop2.core.config.Soggetto;
  77. import org.openspcoop2.core.config.StatoServiziPdd;
  78. import org.openspcoop2.core.config.StatoServiziPddIntegrationManager;
  79. import org.openspcoop2.core.config.StatoServiziPddPortaApplicativa;
  80. import org.openspcoop2.core.config.StatoServiziPddPortaDelegata;
  81. import org.openspcoop2.core.config.TipoFiltroAbilitazioneServizi;
  82. import org.openspcoop2.core.config.Tracciamento;
  83. import org.openspcoop2.core.config.ValidazioneBuste;
  84. import org.openspcoop2.core.config.ValidazioneContenutiApplicativi;
  85. import org.openspcoop2.core.config.constants.AlgoritmoCache;
  86. import org.openspcoop2.core.config.constants.CorrelazioneApplicativaGestioneIdentificazioneFallita;
  87. import org.openspcoop2.core.config.constants.CorrelazioneApplicativaRichiestaIdentificazione;
  88. import org.openspcoop2.core.config.constants.CorrelazioneApplicativaRispostaIdentificazione;
  89. import org.openspcoop2.core.config.constants.CostantiConfigurazione;
  90. import org.openspcoop2.core.config.constants.CredenzialeTipo;
  91. import org.openspcoop2.core.config.constants.FaultIntegrazioneTipo;
  92. import org.openspcoop2.core.config.constants.GestioneErroreComportamento;
  93. import org.openspcoop2.core.config.constants.InvocazioneServizioTipoAutenticazione;
  94. import org.openspcoop2.core.config.constants.PortaApplicativaAzioneIdentificazione;
  95. import org.openspcoop2.core.config.constants.PortaDelegataAzioneIdentificazione;
  96. import org.openspcoop2.core.config.constants.RegistroTipo;
  97. import org.openspcoop2.core.config.constants.Severita;
  98. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  99. import org.openspcoop2.core.config.constants.StatoFunzionalitaConWarning;
  100. import org.openspcoop2.core.config.constants.TipoConnessioneRisposte;
  101. import org.openspcoop2.core.config.constants.ValidazioneBusteTipoControllo;
  102. import org.openspcoop2.core.config.constants.ValidazioneContenutiApplicativiTipo;
  103. import org.openspcoop2.core.constants.CostantiConnettori;
  104. import org.openspcoop2.core.constants.CostantiDB;
  105. import org.openspcoop2.core.constants.TipiConnettore;
  106. import org.openspcoop2.utils.certificate.CertificateUtils;
  107. import org.openspcoop2.utils.certificate.PrincipalType;
  108. import org.openspcoop2.utils.regexp.RegExpUtilities;
  109. import org.openspcoop2.utils.regexp.RegularExpressionEngine;
  110. import org.slf4j.Logger;


  111. /**
  112.  * Validazione Semantica
  113.  *
  114.  * @author $Author$
  115.  * @version $Rev$, $Date$
  116.  */
  117. public class ValidazioneSemantica {

  118.     /** ConfigurazionePdD */
  119.     private org.openspcoop2.core.config.Openspcoop2 configurazione = null;
  120.     /** Lista in cui scrivo le anomalie riscontrate */
  121.     private List<String> errori = new ArrayList<>();
  122.     /** Logger */
  123.     private Logger log = null;
  124.     /** Indicazione se deve essere validata la configurazione */
  125.     private boolean validazioneConfigurazione = false;

  126.     /** Lista di tipi di connettori validi */
  127.     private List<String> tipoConnettori = new ArrayList<>();
  128.     /** Lista dei tipi di connettori ammessi */
  129.     private String getTipoConnettori(){
  130.         StringBuilder bf = new StringBuilder();
  131.         for(int i=0; i<this.tipoConnettori.size(); i++){
  132.             if(i>0)
  133.                 bf.append(",");
  134.             bf.append(this.tipoConnettori.get(i));
  135.         }
  136.         return bf.toString();
  137.     }

  138.     /** Lista di tipi di soggetti validi */
  139.     private List<String> tipoSoggetti = new ArrayList<>();
  140.     /** Lista dei tipi di soggetti ammessi */
  141.     private String getTipoSoggetti(){
  142.         StringBuilder bf = new StringBuilder();
  143.         for(int i=0; i<this.tipoSoggetti.size(); i++){
  144.             if(i>0)
  145.                 bf.append(",");
  146.             bf.append(this.tipoSoggetti.get(i));
  147.         }
  148.         return bf.toString();
  149.     }

  150.     /** Lista di tipi di servizi (soap) validi */
  151.     private List<String> tipoServiziSoap = new ArrayList<>();
  152.     /** Lista dei tipi di servizi ammessi */
  153.     private String getTipoServiziSoap(){  
  154.         StringBuilder bf = new StringBuilder();
  155.         for(int i=0; i<this.tipoServiziSoap.size(); i++){
  156.             if(i>0)
  157.                 bf.append(",");
  158.             bf.append(this.tipoServiziSoap.get(i));
  159.         }
  160.         return bf.toString();
  161.     }
  162.    
  163.     /** Lista di tipi di servizi (rest) validi */
  164.     private List<String> tipoServiziRest = new ArrayList<>();
  165.     /** Lista dei tipi di servizi ammessi */
  166.     private String getTipoServiziRest(){
  167.         StringBuilder bf = new StringBuilder();
  168.         for(int i=0; i<this.tipoServiziRest.size(); i++){
  169.             if(i>0)
  170.                 bf.append(",");
  171.             bf.append(this.tipoServiziRest.get(i));
  172.         }
  173.         return bf.toString();
  174.     }
  175.    
  176.     private String getTipoServizi(){
  177.         StringBuilder bf = new StringBuilder();
  178.        
  179.         String soap = getTipoServiziSoap();
  180.         if(soap!=null && !"".equals(soap)){
  181.             bf.append(soap);
  182.         }
  183.        
  184.         String rest = getTipoServiziRest();
  185.         if(rest!=null && !"".equals(rest)){
  186.             if(bf.length()>0)
  187.                 bf.append(",");
  188.             bf.append(rest);
  189.         }
  190.        
  191.         return bf.toString();
  192.     }
  193.    
  194.     /** Lista di tipi di msg diagnostici appender validi */
  195.     private List<String> tipoMsgDiagnosticiAppender = new ArrayList<>();
  196.     /** Lista dei tipi di msg diagnostici appender ammessi */
  197.     private String getTipoMsgDiagnosticiAppender(){
  198.         StringBuilder bf = new StringBuilder();
  199.         for(int i=0; i<this.tipoMsgDiagnosticiAppender.size(); i++){
  200.             if(i>0)
  201.                 bf.append(",");
  202.             bf.append(this.tipoMsgDiagnosticiAppender.get(i));
  203.         }
  204.         return bf.toString();
  205.     }
  206.    
  207.     /** Lista di tipi di tracciamento appender validi */
  208.     private List<String> tipoTracciamentoAppender = new ArrayList<>();
  209.     /** Lista dei tipi di tracciamento appender ammessi */
  210.     private String getTipoTracciamentoAppender(){
  211.         StringBuilder bf = new StringBuilder();
  212.         for(int i=0; i<this.tipoTracciamentoAppender.size(); i++){
  213.             if(i>0)
  214.                 bf.append(",");
  215.             bf.append(this.tipoTracciamentoAppender.get(i));
  216.         }
  217.         return bf.toString();
  218.     }
  219.    
  220.     /** Lista di tipi di dump appender validi */
  221.     private List<String> tipoDumpAppender = new ArrayList<>();
  222.     /** Lista dei tipi di dump appender ammessi */
  223.     private String getTipoDumpAppender(){
  224.         StringBuilder bf = new StringBuilder();
  225.         for(int i=0; i<this.tipoDumpAppender.size(); i++){
  226.             if(i>0)
  227.                 bf.append(",");
  228.             bf.append(this.tipoDumpAppender.get(i));
  229.         }
  230.         return bf.toString();
  231.     }

  232.     /** Lista di tipi di autenticazione porta delegata validi */
  233.     private List<String> tipoAutenticazionePortaDelegata = new ArrayList<>();
  234.     /** Lista dei tipi di autenticazione porta delegata ammessi */
  235.     private String getTipoAutenticazionePortaDelegata(){
  236.         StringBuilder bf = new StringBuilder();
  237.         for(int i=0; i<this.tipoAutenticazionePortaDelegata.size(); i++){
  238.             if(i>0)
  239.                 bf.append(",");
  240.             bf.append(this.tipoAutenticazionePortaDelegata.get(i));
  241.         }
  242.         return bf.toString();
  243.     }
  244.    
  245.     /** Lista di tipi di autenticazione porta applicativa validi */
  246.     private List<String> tipoAutenticazionePortaApplicativa = new ArrayList<>();
  247.     /** Lista dei tipi di autenticazione porta applicativa ammessi */
  248.     private String getTipoAutenticazionePortaApplicativa(){
  249.         StringBuilder bf = new StringBuilder();
  250.         for(int i=0; i<this.tipoAutenticazionePortaApplicativa.size(); i++){
  251.             if(i>0)
  252.                 bf.append(",");
  253.             bf.append(this.tipoAutenticazionePortaApplicativa.get(i));
  254.         }
  255.         return bf.toString();
  256.     }
  257.    
  258.     /** Lista di tipi di autorizzazione porta delegata validi */
  259.     private List<String> tipoAutorizzazionePortaDelegata = new ArrayList<>();
  260.     /** Lista dei tipi di autorizzazione porta delegata ammessi */
  261.     private String getTipoAutorizzazionePortaDelegata(){
  262.         StringBuilder bf = new StringBuilder();
  263.         for(int i=0; i<this.tipoAutorizzazionePortaDelegata.size(); i++){
  264.             if(i>0)
  265.                 bf.append(",");
  266.             bf.append(this.tipoAutorizzazionePortaDelegata.get(i));
  267.         }
  268.         return bf.toString();
  269.     }
  270.    
  271.     /** Lista di tipi di autorizzazione porta applicativa validi */
  272.     private List<String> tipoAutorizzazionePortaApplicativa = new ArrayList<>();
  273.     /** Lista dei tipi di autorizzazione porta applicativa ammessi */
  274.     private String getTipoAutorizzazionePortaApplicativa(){
  275.         StringBuilder bf = new StringBuilder();
  276.         for(int i=0; i<this.tipoAutorizzazionePortaApplicativa.size(); i++){
  277.             if(i>0)
  278.                 bf.append(",");
  279.             bf.append(this.tipoAutorizzazionePortaApplicativa.get(i));
  280.         }
  281.         return bf.toString();
  282.     }
  283.    
  284.     /** Lista di tipi di autorizzazione per contenuto porta delegata validi */
  285.     private List<String> tipoAutorizzazioneContenutoPortaDelegata = new ArrayList<>();
  286.     /** Lista dei tipi di autorizzazione per contenuto porta delegata  ammessi */
  287.     private String getTipoAutorizzazioneContenutoPortaDelegata(){
  288.         StringBuilder bf = new StringBuilder();
  289.         for(int i=0; i<this.tipoAutorizzazioneContenutoPortaDelegata.size(); i++){
  290.             if(i>0)
  291.                 bf.append(",");
  292.             bf.append(this.tipoAutorizzazioneContenutoPortaDelegata.get(i));
  293.         }
  294.         return bf.toString();
  295.     }
  296.    
  297.     /** Lista di tipi di autorizzazione per contenuto porta applicativa validi */
  298.     private List<String> tipoAutorizzazioneContenutoPortaApplicativa = new ArrayList<>();
  299.     /** Lista dei tipi di autorizzazione per contenuto porta applicativa  ammessi */
  300.     private String getTipoAutorizzazioneContenutoPortaApplicativa(){
  301.         StringBuilder bf = new StringBuilder();
  302.         for(int i=0; i<this.tipoAutorizzazioneContenutoPortaApplicativa.size(); i++){
  303.             if(i>0)
  304.                 bf.append(",");
  305.             bf.append(this.tipoAutorizzazioneContenutoPortaApplicativa.get(i));
  306.         }
  307.         return bf.toString();
  308.     }
  309.    
  310.     /** Lista di tipi di integrazionePD validi */
  311.     private List<String> tipoIntegrazionePD = new ArrayList<>();
  312.     /** Lista dei tipi di integrazionePD ammessi */
  313.     private String getTipoIntegrazionePD(){
  314.         StringBuilder bf = new StringBuilder();
  315.         for(int i=0; i<this.tipoIntegrazionePD.size(); i++){
  316.             if(i>0)
  317.                 bf.append(",");
  318.             bf.append(this.tipoIntegrazionePD.get(i));
  319.         }
  320.         return bf.toString();
  321.     }
  322.    
  323.     /** Lista di tipi di integrazionePA validi */
  324.     private List<String> tipoIntegrazionePA = new ArrayList<>();
  325.     /** Lista dei tipi di integrazionePA ammessi */
  326.     private String getTipoIntegrazionePA(){
  327.         StringBuilder bf = new StringBuilder();
  328.         for(int i=0; i<this.tipoIntegrazionePA.size(); i++){
  329.             if(i>0)
  330.                 bf.append(",");
  331.             bf.append(this.tipoIntegrazionePA.get(i));
  332.         }
  333.         return bf.toString();
  334.     }
  335.    
  336.    

  337.     public ValidazioneSemantica(org.openspcoop2.core.config.Openspcoop2 configurazione,
  338.             String[]tipoConnettori,String[]tipoSoggetti,String[]tipoServiziSoap,String[]tipoServiziRest,
  339.             String[]tipoMsgDiagnosticiAppender,String[]tipoTracciamentoAppender,String[]tipoDumpAppender,
  340.             String[]tipoAutenticazionePortaDelegata,String[]tipoAutenticazionePortaApplicativa,
  341.             String[]tipoAutorizzazionePortaDelegata,String[]tipoAutorizzazionePortaApplicativa,
  342.             String[]tipoAutorizzazioneContenutoPortaDelegata,String[]tipoAutorizzazioneContenutoPortaApplicativa,
  343.             String[]tipoIntegrazionePD,String[]tipoIntegrazionePA,
  344.             boolean validazioneConfigurazione,Logger log) throws DriverConfigurazioneException{
  345.         this.configurazione = configurazione;
  346.         this.log = log;
  347.         this.validazioneConfigurazione = validazioneConfigurazione;
  348.         if(tipoConnettori!=null && tipoConnettori.length>0 ){
  349.             for(int i=0; i<tipoConnettori.length; i++){
  350.                 this.tipoConnettori.add(tipoConnettori[i]);
  351.             }
  352.         }else{
  353.             throw new DriverConfigurazioneException("Tipo di connettori ammissibili non definiti");
  354.         }
  355.         if(tipoSoggetti!=null && tipoSoggetti.length>0 ){
  356.             for(int i=0; i<tipoSoggetti.length; i++){
  357.                 this.tipoSoggetti.add(tipoSoggetti[i]);
  358.             }
  359.         }else{
  360.             throw new DriverConfigurazioneException("Tipo di soggetti ammissibili non definiti");
  361.         }
  362.         boolean tipiSoapNonEsistenti = false;
  363.         if(tipoServiziSoap!=null && tipoServiziSoap.length>0 ){
  364.             for(int i=0; i<tipoServiziSoap.length; i++){
  365.                 this.tipoServiziSoap.add(tipoServiziSoap[i]);
  366.             }
  367.         }else{
  368.             tipiSoapNonEsistenti = true;
  369.         }
  370.         boolean tipiRestNonEsistenti = false;
  371.         if(tipoServiziRest!=null && tipoServiziRest.length>0 ){
  372.             for(int i=0; i<tipoServiziRest.length; i++){
  373.                 this.tipoServiziRest.add(tipoServiziRest[i]);
  374.             }
  375.         }else{
  376.             tipiRestNonEsistenti = true;            
  377.         }
  378.         if(tipiSoapNonEsistenti && tipiRestNonEsistenti){
  379.             throw new DriverConfigurazioneException("Non sono stati configurati tipo di servizi ne per il service binding Soap ne per Rest");
  380.         }
  381.         if(tipoMsgDiagnosticiAppender!=null && tipoMsgDiagnosticiAppender.length>0 ){
  382.             for(int i=0; i<tipoMsgDiagnosticiAppender.length; i++){
  383.                 this.tipoMsgDiagnosticiAppender.add(tipoMsgDiagnosticiAppender[i]);
  384.             }
  385.         }else{
  386.             throw new DriverConfigurazioneException("Tipo di appender ammissibili per i msg diagnostici non definiti");
  387.         }
  388.         if(tipoTracciamentoAppender!=null && tipoTracciamentoAppender.length>0 ){
  389.             for(int i=0; i<tipoTracciamentoAppender.length; i++){
  390.                 this.tipoTracciamentoAppender.add(tipoTracciamentoAppender[i]);
  391.             }
  392.         }else{
  393.             throw new DriverConfigurazioneException("Tipo di appender ammissibili per le traccie non definiti");
  394.         }
  395.         if(tipoDumpAppender!=null && tipoDumpAppender.length>0 ){
  396.             for(int i=0; i<tipoDumpAppender.length; i++){
  397.                 this.tipoDumpAppender.add(tipoDumpAppender[i]);
  398.             }
  399.         }else{
  400.             throw new DriverConfigurazioneException("Tipo di appender ammissibili per il dump non definiti");
  401.         }
  402.         if(tipoAutenticazionePortaDelegata!=null && tipoAutenticazionePortaDelegata.length>0 ){
  403.             for(int i=0; i<tipoAutenticazionePortaDelegata.length; i++){
  404.                 this.tipoAutenticazionePortaDelegata.add(tipoAutenticazionePortaDelegata[i]);
  405.             }
  406.         }else{
  407.             throw new DriverConfigurazioneException("Tipo di processi di autenticazione porta delegata ammissibili non definiti");
  408.         }
  409.         if(tipoAutenticazionePortaApplicativa!=null && tipoAutenticazionePortaApplicativa.length>0 ){
  410.             for(int i=0; i<tipoAutenticazionePortaApplicativa.length; i++){
  411.                 this.tipoAutenticazionePortaApplicativa.add(tipoAutenticazionePortaApplicativa[i]);
  412.             }
  413.         }else{
  414.             throw new DriverConfigurazioneException("Tipo di processi di autenticazione porta applicativa ammissibili non definiti");
  415.         }
  416.         if(tipoAutorizzazionePortaDelegata!=null && tipoAutorizzazionePortaDelegata.length>0 ){
  417.             for(int i=0; i<tipoAutorizzazionePortaDelegata.length; i++){
  418.                 this.tipoAutorizzazionePortaDelegata.add(tipoAutorizzazionePortaDelegata[i]);
  419.             }
  420.         }else{
  421.             throw new DriverConfigurazioneException("Tipo di processi di autorizzazione porta delegata ammissibili non definiti");
  422.         }
  423.         if(tipoAutorizzazionePortaApplicativa!=null && tipoAutorizzazionePortaApplicativa.length>0 ){
  424.             for(int i=0; i<tipoAutorizzazionePortaApplicativa.length; i++){
  425.                 this.tipoAutorizzazionePortaApplicativa.add(tipoAutorizzazionePortaApplicativa[i]);
  426.             }
  427.         }else{
  428.             throw new DriverConfigurazioneException("Tipo di processi di autorizzazione porta applicativa ammissibili non definiti");
  429.         }
  430.         if(tipoAutorizzazioneContenutoPortaDelegata!=null && tipoAutorizzazioneContenutoPortaDelegata.length>0 ){
  431.             for(int i=0; i<tipoAutorizzazioneContenutoPortaDelegata.length; i++){
  432.                 this.tipoAutorizzazioneContenutoPortaDelegata.add(tipoAutorizzazioneContenutoPortaDelegata[i]);
  433.             }
  434.         }else{
  435.             throw new DriverConfigurazioneException("Tipo di processi di autorizzazione contenuto porta delegata ammissibili non definiti");
  436.         }
  437.         if(tipoAutorizzazioneContenutoPortaApplicativa!=null && tipoAutorizzazioneContenutoPortaApplicativa.length>0 ){
  438.             for(int i=0; i<tipoAutorizzazioneContenutoPortaApplicativa.length; i++){
  439.                 this.tipoAutorizzazioneContenutoPortaApplicativa.add(tipoAutorizzazioneContenutoPortaApplicativa[i]);
  440.             }
  441.         }else{
  442.             throw new DriverConfigurazioneException("Tipo di processi di autorizzazione contenuto porta applicativa ammissibili non definiti");
  443.         }
  444.         if(tipoIntegrazionePD!=null && tipoIntegrazionePD.length>0 ){
  445.             for(int i=0; i<tipoIntegrazionePD.length; i++){
  446.                 this.tipoIntegrazionePD.add(tipoIntegrazionePD[i]);
  447.             }
  448.         }else{
  449.             throw new DriverConfigurazioneException("Tipo di integrazione lato PortaDelegata ammissibili non definiti");
  450.         }
  451.         if(tipoIntegrazionePA!=null && tipoIntegrazionePA.length>0 ){
  452.             for(int i=0; i<tipoIntegrazionePA.length; i++){
  453.                 this.tipoIntegrazionePA.add(tipoIntegrazionePA[i]);
  454.             }
  455.         }else{
  456.             throw new DriverConfigurazioneException("Tipo di integrazione lato PortaApplicativa ammissibili non definiti");
  457.         }
  458.     }
  459.     public ValidazioneSemantica(org.openspcoop2.core.config.Openspcoop2 configurazione,
  460.             String[]tipoConnettori,String[]tipoSoggetti,String[]tipoServiziSoap,String[]tipoServiziRest,
  461.             String[]tipoMsgDiagnosticiAppender,String[]tipoTracciamentoAppender,String[]tipoDumpAppender,
  462.             String[]tipoAutenticazionePortaDelegata,String[]tipoAutenticazionePortaApplicativa,
  463.             String[]tipoAutorizzazionePortaDelegata,String[]tipoAutorizzazionePortaApplicativa,
  464.             String[]tipoAutorizzazioneContenutoPortaDelegata,String[]tipoAutorizzazioneContenutoPortaApplicativa,
  465.             String[]tipoIntegrazionePD,String[]tipoIntegrazionePA,
  466.             boolean validazioneConfigurazione) throws DriverConfigurazioneException{
  467.         this(configurazione,tipoConnettori,tipoSoggetti,tipoServiziSoap,tipoServiziRest,tipoMsgDiagnosticiAppender,tipoTracciamentoAppender,tipoDumpAppender,
  468.                 tipoAutenticazionePortaDelegata,tipoAutenticazionePortaApplicativa,
  469.                 tipoAutorizzazionePortaDelegata,tipoAutorizzazionePortaApplicativa,
  470.                 tipoAutorizzazioneContenutoPortaDelegata,tipoAutorizzazioneContenutoPortaApplicativa,
  471.                 tipoIntegrazionePD,tipoIntegrazionePA,
  472.                 validazioneConfigurazione,null);
  473.     }

  474.     private void printMsg(String msg){
  475.         if(this.log == null){
  476.             printMsg(msg);
  477.         }else{
  478.             this.log.debug(msg);
  479.         }
  480.     }


  481.     public void validazioneSemantica(boolean showIDOggettiAnalizzati) throws DriverConfigurazioneException {

  482.         if(showIDOggettiAnalizzati)
  483.             printMsg("\n\n------------------------------------Soggetti("+this.configurazione.sizeSoggettoList()+")-----------------------------------------------------");

  484.         // soggetto
  485.         for(int i=0; i<this.configurazione.sizeSoggettoList();i++){
  486.             Soggetto sogg = this.configurazione.getSoggetto(i);
  487.             if(showIDOggettiAnalizzati)
  488.                 printMsg("Soggetto: "+sogg.getTipo()+"/"+sogg.getNome());
  489.             validaSoggetto(sogg,showIDOggettiAnalizzati);
  490.         }


  491.         if(this.validazioneConfigurazione){
  492.             if(showIDOggettiAnalizzati)
  493.                 printMsg("\n\n------------------------------------Configurazione-----------------------------------------------------");
  494.    
  495.             // Configurazione
  496.             this.validaConfigurazione(this.configurazione.getConfigurazione());
  497.         }


  498.         if(showIDOggettiAnalizzati)
  499.             printMsg("\n\n-----------------------------------------------------------------------------------------");

  500.         // Se è stata trovata almeno un'anomalia, lancio un'eccezione
  501.         if (!this.errori.isEmpty()) {
  502.             StringBuilder stringB = new StringBuilder().append("\n");
  503.             Iterator<String> itE = this.errori.iterator();
  504.             while (itE.hasNext())
  505.                 stringB.append(itE.next()).append("\n");
  506.             throw new DriverConfigurazioneException(stringB.toString());
  507.         }
  508.     }


  509.     private  void validaSoggetto(Soggetto sogg,boolean showIDOggettiAnalizzati) throws DriverConfigurazioneException {

  510.         // required
  511.         if(sogg.getNome()==null){
  512.             this.errori.add("Esiste un soggetto senza nome");
  513.             return;
  514.         }
  515.         if(sogg.getTipo()==null){
  516.             this.errori.add("Esiste un soggetto senza tipo");
  517.             return;
  518.         }
  519.        
  520.         // porte delegate
  521.         for(int j =0; j<sogg.sizePortaDelegataList(); j++){
  522.             PortaDelegata pd = sogg.getPortaDelegata(j);
  523.             if(showIDOggettiAnalizzati)
  524.                 printMsg("\tPorta Delegata: "+pd.getNome());
  525.             validaPortaDelegata(pd, sogg);
  526.         }

  527.         // porte applicative
  528.         for(int j =0; j<sogg.sizePortaApplicativaList(); j++){
  529.             PortaApplicativa pa = sogg.getPortaApplicativa(j);
  530.             if(showIDOggettiAnalizzati)
  531.                 printMsg("\tPortaApplicativa: "+pa.getNome());
  532.             validaPortaApplicativa(pa, sogg);
  533.         }

  534.         // servizi applicativi
  535.         for(int j =0; j<sogg.sizeServizioApplicativoList(); j++){
  536.             ServizioApplicativo sa = sogg.getServizioApplicativo(j);
  537.             if(showIDOggettiAnalizzati)
  538.                 printMsg("\tServizioApplicativo: "+sa.getNome());
  539.             validaServizioApplicativo(sa, sogg);
  540.         }

  541.         // connettori presenti nella root del soggetto
  542.         for(int j=0; j<sogg.sizeConnettoreList();j++){
  543.             Connettore connettore = sogg.getConnettore(j);
  544.             if(showIDOggettiAnalizzati)
  545.                 printMsg("\tConnettore definito nella root del soggetto: "+connettore.getNome());
  546.             this.validaConnettore(connettore, null, sogg);
  547.         }
  548.        
  549.         // 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()
  550.         if(this.tipoSoggetti.contains(sogg.getTipo())==false){
  551.             this.errori.add("Il tipo del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" non è valido (Tipi utilizzabili: "+this.getTipoSoggetti()+")");
  552.         }

  553.         // Nome del soggetto
  554.         try{
  555.             if (!RegularExpressionEngine.isMatch(sogg.getNome(),"^[0-9A-Za-z]+$")) {
  556.                 this.errori.add("Il nome del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" dev'essere formato solo caratteri e cifre");
  557.             }
  558.         }catch(Exception e){
  559.             throw new DriverConfigurazioneException("Errore durante l'analisi tramite espressione regolare del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+": "+e.getMessage(),e);
  560.         }

  561.         // ogni soggetto identificato come coppia tipo/nome, deve essere univoco
  562.         int numS = 0;
  563.         for(int j=0; j<this.configurazione.sizeSoggettoList();j++){
  564.             Soggetto tmpSogg = this.configurazione.getSoggetto(j);
  565.             if (sogg.getNome().equals(tmpSogg.getNome()) && sogg.getTipo().equals(tmpSogg.getTipo()))
  566.                 numS++;
  567.         }
  568.         if (numS > 1)
  569.             this.errori.add("Non può esistere più di un soggetto con nome "+sogg.getNome()+" e tipo "+sogg.getTipo());


  570.         // Controlla che esista SOLO un soggetto che contiene router=true
  571.         if (sogg.getRouter()) {
  572.             int numR = 0;
  573.             for(int j=0; j<this.configurazione.sizeSoggettoList();j++){
  574.                 Soggetto tmpS = this.configurazione.getSoggetto(j);
  575.                 if (tmpS.getRouter())
  576.                     numR++;
  577.             }
  578.             if (numR > 1)
  579.                 this.errori.add("Non può esistere più di un soggetto abilitato alla funzione di Router");
  580.         }
  581.        
  582.         // Controllo che eventuali PdUrlPrefixRewriter o PaUrlPrefixRewriter rispettino l'espressione regolare: [A-Za-z]+:\/\/(.*)
  583.         try{
  584.             if(sogg.getPdUrlPrefixRewriter()!=null){
  585.                 if(RegularExpressionEngine.isMatch(sogg.getPdUrlPrefixRewriter(), "[A-Za-z]+:\\/\\/(.*)")==false){
  586.                     this.errori.add("La funzione PdUrlPrefixRewriter contiene un valore errato che non rispetta l'espressione "+"[A-Za-z]+:\\/\\/(.*)");
  587.                 }
  588.             }
  589.             if(sogg.getPaUrlPrefixRewriter()!=null){
  590.                 if(RegularExpressionEngine.isMatch(sogg.getPaUrlPrefixRewriter(), "[A-Za-z]+:\\/\\/(.*)")==false){
  591.                     this.errori.add("La funzione PaUrlPrefixRewriter contiene un valore errato che non rispetta l'espressione "+"[A-Za-z]+:\\/\\/(.*)");
  592.                 }
  593.             }
  594.         }catch(Exception e){
  595.             throw new DriverConfigurazioneException(e);
  596.         }
  597.     }


  598.     private  void validaPortaDelegata(PortaDelegata pd, Soggetto sogg) throws DriverConfigurazioneException {
  599.        
  600.         if(pd.getNome()==null){
  601.             this.errori.add("Il soggetto ["+sogg.getTipo()+"/"+sogg.getNome()+"] posside una porta delegata che non contiene la definizione del nome");
  602.             return;
  603.         }
  604.        
  605.         String nomePorta = pd.getNome();
  606.         String idPortaDelegata = "("+sogg.getTipo()+"/"+sogg.getNome()+") "+nomePorta;
  607.        
  608.         // La porta delegata viene identificata dal nome.
  609.         // Una volta identificata la sua stringa di identificazione DEVE essere univoca tra tutte le porte delegate di TUTTA la configurazione
  610.         // (e non solo tra quelle del soggetto proprietario)
  611.         int numPD = 0;
  612.         List<String> pdTrovate = new ArrayList<>();
  613.         for(int j=0; j<this.configurazione.sizeSoggettoList();j++){
  614.             Soggetto s = this.configurazione.getSoggetto(j);
  615.             for(int k =0; k<s.sizePortaDelegataList(); k++){
  616.                 PortaDelegata tmpPd = s.getPortaDelegata(k);
  617.                 String tmpNomePorta = tmpPd.getNome();
  618.                 if (nomePorta.equals(tmpNomePorta)){
  619.                     numPD++;
  620.                     pdTrovate.add("("+s.getTipo()+"/"+s.getNome()+") "+tmpPd.getNome());
  621.                 }
  622.             }
  623.         }
  624.         if (numPD > 1)
  625.             this.errori.add("Non può esistere più di una porta delegata con nome "+nomePorta+". Sono state identificate le seguenti porte delegate: "+pdTrovate);

  626.        
  627.         // Il soggetto erogatore deve essere definito. Il tipo e' obbligatorio.
  628.         // Il nome DEVE essere presente solo se identificazione='static'.
  629.         // Il pattern DEVE essere definito solo se identificazione='urlBased' o 'contentBased'.
  630.         if (pd.getSoggettoErogatore() == null)
  631.             this.errori.add("La porta delegata "+idPortaDelegata+" non contiene la definizione del soggetto erogatore");
  632.         else {
  633.             PortaDelegataSoggettoErogatore pdsse = pd.getSoggettoErogatore();
  634.            
  635.             // Tipo
  636.             if (pdsse.getTipo() == null){
  637.                 this.errori.add("Il soggetto erogatore della porta delegata "+idPortaDelegata+" non contiene la definizione del tipo.");
  638.             }
  639.             else if(this.tipoSoggetti.contains(pdsse.getTipo())==false){
  640.                 this.errori.add("Il tipo del soggetto erogatore della porta delegata "+idPortaDelegata+" non è valido (Tipi utilizzabili: "+this.getTipoSoggetti()+")");
  641.             }
  642.            
  643.             // Nome
  644.             if (pdsse.getNome() == null){
  645.                 this.errori.add("Il soggetto erogatore della porta delegata "+idPortaDelegata+" non contiene la definizione del nome");
  646.             }          
  647.         }

  648.         // Il servizio deve essere definito. Il tipo e' obbligatorio.
  649.         // Il nome DEVE essere presente solo se identificazione='static'.
  650.         // Il pattern DEVE essere definito solo se identificazione='urlBased' o 'contentBased'.
  651.         if (pd.getServizio() == null)
  652.             this.errori.add("La porta delegata "+idPortaDelegata+" non contiene la definizione del servizio");
  653.         else {
  654.             PortaDelegataServizio pds = pd.getServizio();
  655.            
  656.             // Tipo
  657.             if (pds.getTipo() == null){
  658.                 this.errori.add("Il servizio della porta delegata "+idPortaDelegata+" non contiene la definizione del tipo.");
  659.             }
  660.             else if(this.tipoServiziSoap.contains(pds.getTipo())==false && this.tipoServiziRest.contains(pds.getTipo())==false){
  661.                 this.errori.add("Il tipo del servizio della porta delegata "+idPortaDelegata+" non è valido (Tipi utilizzabili: "+this.getTipoServizi()+")");
  662.             }
  663.            
  664.             // Nome
  665.             if (pds.getNome() == null){
  666.                 this.errori.add("Il servizio della porta delegata "+idPortaDelegata+" non contiene la definizione del nome");
  667.             }      
  668.         }

  669.        
  670.         // L'azione e' opzionale. Se presente:
  671.         // Il nome DEVE essere presente solo se identificazione='static'.
  672.         // Il pattern DEVE essere definito solo se identificazione='urlBased' o 'contentBased'.
  673.         if (pd.getAzione() != null){
  674.             PortaDelegataAzione pda = pd.getAzione();
  675.            
  676.             // XSD: identificazione: static, urlBased, contentBased, inputBased e soapActionBased
  677.             PortaDelegataAzioneIdentificazione identificazione = pda.getIdentificazione();
  678.             if ((identificazione != null) && !identificazione.equals(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_STATIC) &&
  679.                     !identificazione.equals(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_URL_BASED) &&
  680.                     !identificazione.equals(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_CONTENT_BASED) &&
  681.                     !identificazione.equals(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_HEADER_BASED) &&
  682.                     !identificazione.equals(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_INPUT_BASED) &&
  683.                     !identificazione.equals(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_SOAP_ACTION_BASED) &&
  684.                     !identificazione.equals(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_WSDL_BASED) &&
  685.                     !identificazione.equals(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_DELEGATED_BY)){
  686.                 this.errori.add("La modalita d'identificazione dell'azione della porta delegata "+idPortaDelegata+" deve assumere uno dei seguente valori: "+
  687.                         CostantiConfigurazione.PORTA_DELEGATA_AZIONE_STATIC+", "+
  688.                         CostantiConfigurazione.PORTA_DELEGATA_AZIONE_URL_BASED+", "+
  689.                         CostantiConfigurazione.PORTA_DELEGATA_AZIONE_CONTENT_BASED+", "+
  690.                         CostantiConfigurazione.PORTA_DELEGATA_AZIONE_HEADER_BASED+" o "+
  691.                         CostantiConfigurazione.PORTA_DELEGATA_AZIONE_INPUT_BASED+" o "+
  692.                         CostantiConfigurazione.PORTA_DELEGATA_AZIONE_SOAP_ACTION_BASED+" o "+
  693.                         CostantiConfigurazione.PORTA_DELEGATA_AZIONE_WSDL_BASED+" o "+
  694.                         CostantiConfigurazione.PORTA_DELEGATA_AZIONE_DELEGATED_BY);
  695.             }
  696.             if(identificazione==null){
  697.                 identificazione = CostantiConfigurazione.PORTA_DELEGATA_AZIONE_STATIC;
  698.             }
  699.            
  700.             if(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_STATIC.equals(identificazione)){
  701.                 if (pda.getNome() == null)
  702.                     this.errori.add("L'azione della porta delegata "+idPortaDelegata+" non contiene la definizione del nome, nonostante la modalita' di identificazione sia "+identificazione);
  703.             }
  704.             else if(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_URL_BASED.equals(identificazione) ||
  705.                     CostantiConfigurazione.PORTA_DELEGATA_AZIONE_CONTENT_BASED.equals(identificazione) ||
  706.                     CostantiConfigurazione.PORTA_DELEGATA_AZIONE_HEADER_BASED.equals(identificazione)){
  707.                 if (pda.getPattern() == null)
  708.                     this.errori.add("L'azione della porta delegata "+idPortaDelegata+" non contiene la definizione del pattern, nonostante la modalita' di identificazione sia "+identificazione);
  709.             }
  710.             else if(CostantiConfigurazione.PORTA_DELEGATA_AZIONE_DELEGATED_BY.equals(identificazione)){
  711.                 if (pda.getNomePortaDelegante() == null)
  712.                     this.errori.add("L'azione della porta delegata "+idPortaDelegata+" non contiene la definizione del nome della porta delegante, nonostante la modalita' di identificazione sia "+identificazione);
  713.             }
  714.         }
  715.        
  716.    
  717.         // Check processo di autenticazione della porta delegata
  718.         String autenticazione = CredenzialeTipo.SSL.toString();
  719.         if(pd.getAutenticazione()!=null){
  720.             autenticazione = pd.getAutenticazione();
  721.             if(this.tipoAutenticazionePortaDelegata.contains(pd.getAutenticazione())==false){
  722.                 this.errori.add("Alla porta delegata "+idPortaDelegata+" e' stato associato un processo di autenticazione ["+pd.getAutenticazione()+"] non valido; tipi conosciuti: "+this.getTipoAutenticazionePortaDelegata());
  723.             }
  724.         }
  725.        
  726.         // Autorizzazione
  727.         String autorizzazione = CostantiConfigurazione.AUTORIZZAZIONE_AUTHENTICATED;
  728.         if(pd.getAutorizzazione()!=null){
  729.             autorizzazione = pd.getAutorizzazione();
  730.             if(this.tipoAutorizzazionePortaDelegata.contains(pd.getAutorizzazione())==false){
  731.                 this.errori.add("Alla porta delegata "+idPortaDelegata+" e' stato associato un processo di autorizzazione ["+pd.getAutorizzazione()+"] non valido; tipi conosciuti: "+this.getTipoAutorizzazionePortaDelegata());
  732.             }
  733.         }
  734.        
  735.         if(autorizzazione!=null){
  736.             if(autorizzazione.toLowerCase().contains(CostantiConfigurazione.AUTORIZZAZIONE_AUTHENTICATED) &&
  737.                     autorizzazione.toLowerCase().contains(CostantiConfigurazione.AUTORIZZAZIONE_ROLES)){
  738.                 // Se e' definito un processo di autorizzazione che prevede sia autenticazione che ruoli l'autenticazione deve essere opzionale
  739.                 if(StatoFunzionalita.ABILITATO.equals(pd.getAutenticazioneOpzionale())==false){
  740.                     this.errori.add("Alla porta delegata "+idPortaDelegata+" e' stato associata un'autorizzazione '"+autorizzazione+"' che richiede una autenticazione dei servizi applicativi opzionali");
  741.                 }
  742.             }
  743.             if(autorizzazione.toLowerCase().contains("internal") ||
  744.                     (CostantiConfigurazione.AUTORIZZAZIONE_AUTHENTICATED.equals(autorizzazione))){
  745.                 // Se l'autorizzazione prevede una gestione dei ruoli interni, oppure è solamente basata sull'autenticazione dei chiamanti,
  746.                 // una autenticazione DEVE essere presente e non deve essere opzionale
  747.                 if(CostantiConfigurazione.AUTENTICAZIONE_NONE.equals(autenticazione)){
  748.                     this.errori.add("Alla porta delegata "+idPortaDelegata+" e' stato associata un'autorizzazione '"+autorizzazione+"' che richiede una autenticazione obbligatoria dei servizi applicativi, autenticazione non impostata nella porta delegata");
  749.                 }
  750.                 if(StatoFunzionalita.ABILITATO.equals(pd.getAutenticazioneOpzionale())){
  751.                     if(autorizzazione.toLowerCase().contains("or")==false){
  752.                         this.errori.add("Alla porta delegata "+idPortaDelegata+" e' stato associata un'autorizzazione '"+autorizzazione+"' che richiede una autenticazione obbligatoria dei servizi applicativi, autenticazione impostata come opzionale nella porta delegata");
  753.                     }
  754.                 }
  755.             }
  756.         }

  757.         // Vincoli troppo forti nel caso di configurazione su console, la PdD non parte se la configurazione non e' stata ultimata.
  758. //      if(autorizzazione!=null && autorizzazione.contains(CostantiConfigurazione.AUTORIZZAZIONE_AUTHENTICATED)){
  759. //          if (pd.sizeServizioApplicativoList() == 0){
  760. //              this.errori.add("La porta delegata "+idPortaDelegata+" deve avere almeno un servizio applicativo associato poiche' lo richiede il tipo di autorizzazione indicato: "+autorizzazione);
  761. //          }
  762. //      }
  763. //      if(autorizzazione!=null && autorizzazione.toLowerCase().contains(CostantiConfigurazione.AUTORIZZAZIONE_ROLES.toLowerCase())){
  764. //          if (pd.getRuoli()==null || pd.getRuoli().sizeRuoloList() == 0){
  765. //              this.errori.add("La porta delegata "+idPortaDelegata+" deve avere almeno un ruolo associato poiche' lo richiede il tipo di autorizzazione indicato: "+autorizzazione);
  766. //          }
  767. //      }
  768.        
  769.         // Autorizzazione Contenuto
  770.         if(pd.getAutorizzazioneContenuto()!=null){
  771.             if(this.tipoAutorizzazioneContenutoPortaDelegata.contains(pd.getAutorizzazioneContenuto())==false){
  772.                 this.errori.add("Alla porta delegata "+idPortaDelegata+" e' stato associato un processo di autorizzazione contenuto ["+pd.getAutorizzazioneContenuto()+"] non valido; tipi conosciuti: "+this.getTipoAutorizzazioneContenutoPortaDelegata());
  773.             }
  774.         }
  775.        
  776.         // Check servizi applicativi
  777.         for(int i=0; i<pd.sizeServizioApplicativoList(); i++){
  778.             // Servizio Applicativo puo' avere solo meta informazioni
  779.             PortaDelegataServizioApplicativo pdSa = pd.getServizioApplicativo(i);
  780.             ServizioApplicativo sa = null;
  781.             if(pdSa.getNome()==null){
  782.                 this.errori.add("La porta delegata "+idPortaDelegata+" ha associato un servizio applicativo per cui non e' stato definito il nome");
  783.                 continue;
  784.             }
  785.             else{
  786.                 // servizio applicativo definito nella root del soggetto
  787.                 if(existsServizioApplicativo(pdSa.getNome(), sogg)==false){
  788.                     this.errori.add("La porta delegata "+idPortaDelegata+" ha associato un riferimento ad un servizio applicativo ["+pdSa.getNome()+"] che non risulta registrato nel soggetto "+sogg.getTipo()+"/"+sogg.getNome());
  789.                     continue;
  790.                 }
  791.                 else{
  792.                     // Prelevo servizio applicativo per conformita con l'utilizzo nella porta delegata
  793.                     sa = this.getServizioApplicativo(pdSa.getNome(), sogg);
  794.                     if(sa==null) {
  795.                         this.errori.add("La porta delegata "+idPortaDelegata+" ha associato un riferimento ad un servizio applicativo ["+pdSa.getNome()+"] che non risulta registrato nel soggetto "+sogg.getTipo()+"/"+sogg.getNome());
  796.                         continue;
  797.                     }
  798.                 }
  799.             }
  800.            
  801.             // Validazione conformita' con porta delegata
  802.             if(CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_NONE.equals(autenticazione)==false){
  803.                 if(sa.getInvocazionePorta()==null){
  804.                     this.errori.add("La porta delegata "+idPortaDelegata+" possiede un meccanismo di autenticazione ["+autenticazione+"]: il servizio applicativo "+sa.getNome() +" non contiene la definizione dell'elemento invocazione porta");
  805.                 }
  806.                 else if(sa.getInvocazionePorta().sizeCredenzialiList()<=0){
  807.                     this.errori.add("La porta delegata "+idPortaDelegata+" possiede un meccanismo di autenticazione ["+autenticazione+"]: il servizio applicativo "+sa.getNome() +" non contiene la definizione di credenziali di accesso");
  808.                 }
  809.                 else{
  810.                     if(CostantiConfigurazione.CREDENZIALE_BASIC.equals(autenticazione) ||
  811.                             CostantiConfigurazione.CREDENZIALE_APIKEY.equals(autenticazione) ||
  812.                             CostantiConfigurazione.CREDENZIALE_SSL.equals(autenticazione)  ||
  813.                             CostantiConfigurazione.CREDENZIALE_PRINCIPAL.equals(autenticazione)){
  814.                         boolean trovato = false;
  815.                         for(int k=0; k<sa.getInvocazionePorta().sizeCredenzialiList(); k++){
  816.                             if(autenticazione.equals(sa.getInvocazionePorta().getCredenziali(k).getTipo().getValue())){
  817.                                 trovato=true;
  818.                                 break;
  819.                             }
  820.                         }
  821.                         if(!trovato){
  822.                             this.errori.add("La porta delegata "+idPortaDelegata+" possiede un meccanismo di autenticazione ["+autenticazione+"]: il servizio applicativo "+sa.getNome() +" non contiene la definizione di credenziali di accesso compatibili");
  823.                         }
  824.                     }
  825.                 }
  826.             }
  827.         }

  828.         // Valida SetProtocolProperties
  829.         for (int j=0; j<pd.sizeProprietaList();j++) {
  830.             Proprieta ssp = pd.getProprieta(j);
  831.             validaProtocolProperty(ssp, "PortaDelegata_"+idPortaDelegata);
  832.         }
  833.        
  834.         // Valida MessageSecurity
  835.         MessageSecurity messageSecurity = pd.getMessageSecurity();
  836.         if (messageSecurity != null)
  837.             validaMessageSecurity(messageSecurity,"PortaDelegata_"+idPortaDelegata);

  838.         // Valida MTOM
  839.         MtomProcessor mtom = pd.getMtomProcessor();
  840.         if (mtom != null)
  841.             validaMTOM(mtom,"PortaDelegata_"+idPortaDelegata);
  842.        
  843.         // Valida ValidazioneContenutiApplicativi
  844.         ValidazioneContenutiApplicativi vca = pd.getValidazioneContenutiApplicativi();
  845.         if (vca != null)
  846.             validazioneValidazioneContenutiApplicativi(vca, "PortaDelegata_"+idPortaDelegata);
  847.            
  848.         // CorrelazioneApplicativa:
  849.         String idRisorsa = "Porta delegata "+idPortaDelegata;
  850.         validaCorrelazioneApplicativaRichiesta(idRisorsa,pd.getCorrelazioneApplicativa(),true);
  851.         validaCorrelazioneApplicativaRisposta(idRisorsa,pd.getCorrelazioneApplicativaRisposta(),true);

  852.         // XSD: ricevuta-asincrona-simmetrica: abilitato, disabilitato
  853.         StatoFunzionalita ricAsiSim = pd.getRicevutaAsincronaSimmetrica();
  854.         if ((ricAsiSim != null) && !ricAsiSim.equals(CostantiConfigurazione.ABILITATO) && !ricAsiSim.equals(CostantiConfigurazione.DISABILITATO))
  855.             this.errori.add("La ricevuta asincrona simmetrica della porta delegata "+idPortaDelegata+" deve assumere i valori: "+
  856.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  857.         // XSD: ricevuta-asincrona-asimmetrica: abilitato, disabilitato
  858.         StatoFunzionalita ricAsiAsim = pd.getRicevutaAsincronaAsimmetrica();
  859.         if ((ricAsiAsim != null) && !ricAsiAsim.equals(CostantiConfigurazione.ABILITATO) && !ricAsiAsim.equals(CostantiConfigurazione.DISABILITATO))
  860.             this.errori.add("La ricevuta asincrona asimmetrica della porta delegata "+idPortaDelegata+" deve assumere i valori: "+
  861.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  862.         // Integrazione
  863.         String integrazione = pd.getIntegrazione();
  864.         if(integrazione!=null){
  865.             String [] tipiIntegrazione = integrazione.split(",");
  866.             if(tipiIntegrazione==null || tipiIntegrazione.length<=0){
  867.                 this.errori.add("La porta delegata "+idPortaDelegata+" possiede un valore nel campo 'integrazione' non valido: "+integrazione);
  868.             }
  869.             else {
  870.                 for(int p=0;p<tipiIntegrazione.length;p++){
  871.                     String tipoI = tipiIntegrazione[p].trim();
  872.                     if(this.tipoIntegrazionePD.contains(tipoI)==false){
  873.                         this.errori.add("La porta delegata "+idPortaDelegata+" possiede un tipo di integrazione ["+tipoI+"] non valido: valori utilizzabili sono: "+this.getTipoIntegrazionePD());
  874.                     }
  875.                 }
  876.             }
  877.         }
  878.        
  879.         // XSD: allega-body: abilitato, disabilitato
  880.         StatoFunzionalita allegaBody = pd.getAllegaBody();
  881.         if ((allegaBody != null) && !allegaBody.equals(CostantiConfigurazione.ABILITATO) && !allegaBody.equals(CostantiConfigurazione.DISABILITATO))
  882.             this.errori.add("La funzionalita' di allega-boxy della porta delegata "+idPortaDelegata+" deve assumere i valori: "+
  883.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  884.         // XSD: scarta-body: abilitato, disabilitato
  885.         StatoFunzionalita scartaBody = pd.getScartaBody();
  886.         if ((scartaBody != null) && !scartaBody.equals(CostantiConfigurazione.ABILITATO) && !scartaBody.equals(CostantiConfigurazione.DISABILITATO))
  887.             this.errori.add("La funzionalita' di scarta-boxy della porta delegata "+idPortaDelegata+" deve assumere i valori: "+
  888.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  889.         // XSD: gestione-manifest: abilitato, disabilitato
  890.         StatoFunzionalita gestMan = pd.getGestioneManifest();
  891.         if ((gestMan != null) && !gestMan.equals(CostantiConfigurazione.ABILITATO) && !gestMan.equals(CostantiConfigurazione.DISABILITATO))
  892.             this.errori.add("La funzionalita' di gestioneManifest della porta delegata "+idPortaDelegata+" deve assumere i valori: "+
  893.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  894.        
  895.         // XSD: stateless: abilitato, disabilitato
  896.         StatoFunzionalita stateless = pd.getStateless();
  897.         if ((stateless != null) && !stateless.equals(CostantiConfigurazione.ABILITATO) && !stateless.equals(CostantiConfigurazione.DISABILITATO))
  898.             this.errori.add("La funzionalita' 'stateless' della porta delegata "+idPortaDelegata+" deve assumere i valori: "+
  899.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  900.        
  901.         // XSD: local-forward: abilitato, disabilitato
  902.         StatoFunzionalita localForward = null;
  903.         if(pd.getLocalForward()!=null){
  904.             localForward = pd.getLocalForward().getStato();
  905.         }
  906.         if ((localForward != null) && !localForward.equals(CostantiConfigurazione.ABILITATO) && !localForward.equals(CostantiConfigurazione.DISABILITATO))
  907.             this.errori.add("La funzionalita' 'local-forward' della porta delegata "+idPortaDelegata+" deve assumere i valori: "+
  908.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  909.        
  910.         // ruoli
  911.         if(pd.getRuoli()!=null){
  912.             for (int i = 0; i < pd.getRuoli().sizeRuoloList(); i++) {
  913.                 String nomeRuolo = pd.getRuoli().getRuolo(i).getNome();
  914.                 try{
  915.                     if (!RegularExpressionEngine.isMatch(nomeRuolo,"^[0-9A-Za-z_]+$")) {
  916.                         this.errori.add("Il ruolo ["+nomeRuolo+"] della porta delegata "+idPortaDelegata+" dev'essere formato solo da caratteri, cifre e '_'");
  917.                     }
  918.                 }catch(Exception e){
  919.                     throw new DriverConfigurazioneException("Errore durante l'analisi tramite espressione regolare del nome del ruolo "+nomeRuolo+" della porta delegata "+idPortaDelegata+" :" +e.getMessage(),e);
  920.                 }
  921.             }
  922.             // Ogni ruolo deve avere un nome diverso!
  923.             for (int i = 0; i < pd.getRuoli().sizeRuoloList(); i++) {
  924.                 int numRuolo = 0;
  925.                 String tmpRuolo = pd.getRuoli().getRuolo(i).getNome();
  926.                 for (int j = 0; j < pd.getRuoli().sizeRuoloList(); j++) {
  927.                     String checkRuolo = pd.getRuoli().getRuolo(j).getNome();
  928.                     if (checkRuolo.equals(tmpRuolo))
  929.                         numRuolo++;
  930.                 }
  931.                 if (numRuolo > 1)
  932.                     this.errori.add("Non può esistere più di un ruolo con nome "+tmpRuolo+". Trovate "+numRuolo+" occorrenze nella porta delegata "+idPortaDelegata);
  933.             }
  934.         }
  935.     }

  936.     private  void validaPortaApplicativa(PortaApplicativa pa, Soggetto sogg) throws DriverConfigurazioneException {
  937.        
  938.         if(pa.getNome()==null){
  939.             this.errori.add("Il soggetto ["+sogg.getTipo()+"/"+sogg.getNome()+"] posside una porta applicativa che non contiene la definizione del nome");
  940.             return;
  941.         }
  942.        
  943.         String nomePorta = pa.getNome();
  944.         String idPortaApplicativa = "("+sogg.getTipo()+"/"+sogg.getNome()+") "+nomePorta;
  945.        
  946.         // La porta applicativa viene identificata dal nome.
  947.         // Una volta identificata la sua stringa di identificazione DEVE essere univoca tra tutte le porte applicative di TUTTA la configurazione
  948.         // (e non solo tra quelle del soggetto proprietario)
  949.         int numPD = 0;
  950.         List<String> paTrovate = new ArrayList<>();
  951.         for(int j=0; j<this.configurazione.sizeSoggettoList();j++){
  952.             Soggetto s = this.configurazione.getSoggetto(j);
  953.             for(int k =0; k<s.sizePortaApplicativaList(); k++){
  954.                 PortaApplicativa tmpPa = s.getPortaApplicativa(k);
  955.                 String tmpNomePorta = tmpPa.getNome();
  956.                 if (nomePorta.equals(tmpNomePorta)){
  957.                     numPD++;
  958.                     paTrovate.add("("+s.getTipo()+"/"+s.getNome()+") "+tmpPa.getNome());
  959.                 }
  960.             }
  961.         }
  962.         if (numPD > 1)
  963.             this.errori.add("Non può esistere più di una porta applicativa con nome "+nomePorta+". Sono state identificate le seguenti porte applicative: "+paTrovate);

  964.        
  965.        
  966.        
  967.         // Il vincolo è stato eliminato nella versione 3.0
  968.         @SuppressWarnings("unused")
  969.         boolean checkIDPA = true; // Info per sapere se abbiamo abbastanza informazioni per costruire l'id
  970.        
  971.         // SoggettoVirtuale
  972.         if(pa.getSoggettoVirtuale()!=null){
  973.            
  974.             PortaApplicativaSoggettoVirtuale sv = pa.getSoggettoVirtuale();
  975.            
  976.             if(sv.getTipo()==null){
  977.                 this.errori.add("La porta applicativa ["+idPortaApplicativa+"] possiede la definizione di un soggetto virtuale per cui non e' stato definito il tipo");
  978.                 checkIDPA = false;
  979.             }
  980.             else if(this.tipoSoggetti.contains(sv.getTipo())==false){
  981.                 this.errori.add("La porta applicativa ["+idPortaApplicativa+"] possiede la definizione di un soggetto virtuale per cui e' stato definito un tipo non valido (Tipi utilizzabili: "+this.getTipoSoggetti()+")");
  982.             }
  983.            
  984.             if(sv.getNome()==null){
  985.                 this.errori.add("La porta applicativa ["+idPortaApplicativa+"] possiede la definizione di un soggetto virtuale per cui non e' stato definito il nome");
  986.                 checkIDPA = false;
  987.             }
  988.            
  989.         }
  990.        
  991.         // Servizio
  992.         if(pa.getServizio()!=null){
  993.            
  994.             PortaApplicativaServizio serv = pa.getServizio();
  995.            
  996.             if(serv.getTipo()==null){
  997.                 this.errori.add("La porta applicativa ["+idPortaApplicativa+"] possiede la definizione di un servizio erogato per cui non e' stato definito il tipo");
  998.                 checkIDPA = false;
  999.             }
  1000.             else if(this.tipoServiziSoap.contains(serv.getTipo())==false && this.tipoServiziRest.contains(serv.getTipo())==false){
  1001.                 this.errori.add("La porta applicativa ["+idPortaApplicativa+"] possiede la definizione di un servizio erogato per cui e' stato definito un tipo non valido (Tipi utilizzabili: "+this.getTipoServizi()+")");
  1002.             }
  1003.            
  1004.             if(serv.getNome()==null){
  1005.                 this.errori.add("La porta applicativa ["+idPortaApplicativa+"] possiede la definizione di un servizio erogato per cui non e' stato definito il nome");
  1006.                 checkIDPA = false;
  1007.             }
  1008.            
  1009.         }else{
  1010.            
  1011.             this.errori.add("La porta applicativa ["+idPortaApplicativa+"] non possiede la definizione del servizio erogato");
  1012.            
  1013.         }
  1014.        
  1015.         // Azione
  1016.         if(pa.getAzione()!=null){
  1017.            
  1018.             PortaApplicativaAzione pda = pa.getAzione();
  1019.            
  1020.             // XSD: identificazione: static, urlBased, contentBased, inputBased e soapActionBased
  1021.             PortaApplicativaAzioneIdentificazione identificazione = pda.getIdentificazione();
  1022.             if ((identificazione != null) && !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_STATIC) &&
  1023.                     !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_URL_BASED) &&
  1024.                     !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_CONTENT_BASED) &&
  1025.                     !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_HEADER_BASED) &&
  1026.                     !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_PROTOCOL_BASED) &&
  1027.                     !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_INPUT_BASED) &&
  1028.                     !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_SOAP_ACTION_BASED) &&
  1029.                     !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_WSDL_BASED) &&
  1030.                     !identificazione.equals(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_DELEGATED_BY)){
  1031.                 this.errori.add("La modalita d'identificazione dell'azione della porta applicativa "+idPortaApplicativa+" deve assumere uno dei seguente valori: "+
  1032.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_STATIC+", "+
  1033.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_URL_BASED+", "+
  1034.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_CONTENT_BASED+", "+
  1035.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_HEADER_BASED+" o "+
  1036.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_PROTOCOL_BASED+" o "+
  1037.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_INPUT_BASED+" o "+
  1038.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_SOAP_ACTION_BASED+" o "+
  1039.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_WSDL_BASED+" o "+
  1040.                         CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_DELEGATED_BY);
  1041.             }
  1042.             if(identificazione==null){
  1043.                 identificazione = CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_STATIC;
  1044.             }
  1045.            
  1046.             if(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_STATIC.equals(identificazione)){
  1047.                 if (pda.getNome() == null){
  1048.                     this.errori.add("L'azione della porta applicativa "+idPortaApplicativa+" non contiene la definizione del nome, nonostante la modalita' di identificazione sia "+identificazione);
  1049.                     checkIDPA = false;
  1050.                 }
  1051.             }
  1052.             else if(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_URL_BASED.equals(identificazione) ||
  1053.                     CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_CONTENT_BASED.equals(identificazione) ||
  1054.                     CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_HEADER_BASED.equals(identificazione)){
  1055.                 if (pda.getPattern() == null){
  1056.                     this.errori.add("L'azione della porta applicativa "+idPortaApplicativa+" non contiene la definizione del pattern, nonostante la modalita' di identificazione sia "+identificazione);
  1057.                     checkIDPA = false;
  1058.                 }
  1059.             }  
  1060.             else if(CostantiConfigurazione.PORTA_APPLICATIVA_AZIONE_DELEGATED_BY.equals(identificazione)){
  1061.                 if (pda.getNomePortaDelegante() == null) {
  1062.                     this.errori.add("L'azione della porta delegata "+idPortaApplicativa+" non contiene la definizione del nome della porta delegante, nonostante la modalita' di identificazione sia "+identificazione);
  1063.                     checkIDPA = false;
  1064.                 }
  1065.             }
  1066.            
  1067.         }
  1068.        
  1069.         // Servizi Applicativi
  1070.         if(pa.sizeServizioApplicativoList()<1){
  1071.             this.errori.add("Alla porta applicativa ["+idPortaApplicativa+"] non sono stati associati servizi applicativi");
  1072.         }
  1073.         else{
  1074.             for(int i=0; i<pa.sizeServizioApplicativoList(); i++){
  1075.                 // Servizio Applicativo puo' avere solo meta informazioni
  1076.                 PortaApplicativaServizioApplicativo paSa = pa.getServizioApplicativo(i);
  1077.                 ServizioApplicativo sa = null;
  1078.                 if(paSa.getNome()==null){
  1079.                     this.errori.add("La porta applicativa "+idPortaApplicativa+" ha associato un servizio applicativo per cui non e' stato definito il nome");
  1080.                     continue;
  1081.                 }
  1082.                 else{
  1083.                     // servizio applicativo definito nella root del soggetto
  1084.                     if(existsServizioApplicativo(paSa.getNome(), sogg)==false){
  1085.                         this.errori.add("La porta applicativa "+idPortaApplicativa+" ha associato un riferimento ad un servizio applicativo ["+paSa.getNome()+"] che non risulta registrato nel soggetto "+sogg.getTipo()+"/"+sogg.getNome());
  1086.                         continue;
  1087.                     }
  1088.                     else{
  1089.                         // Prelevo servizio applicativo per conformita con l'utilizzo nella porta applicativa
  1090.                         sa = this.getServizioApplicativo(paSa.getNome(), sogg);
  1091.                     }
  1092.                 }
  1093.                
  1094.                 // Validazione conformita' con porta applicativa
  1095.                 if(sa.getInvocazioneServizio()==null){
  1096.                     this.errori.add("La porta applicativa "+idPortaApplicativa+" ha associato un servizio applicativo ["+sa.getNome()+"] per cui non e' stato definito l'elemento invocazione servizio");
  1097.                 }
  1098.                 else{
  1099.                     boolean connettore = false;
  1100.                     boolean get = false;
  1101.                     if(sa.getInvocazioneServizio().getConnettore()!=null && !CostantiConfigurazione.DISABILITATO.equals(sa.getInvocazioneServizio().getConnettore().getTipo())){
  1102.                         connettore = true;
  1103.                     }
  1104.                     if(sa.getInvocazioneServizio().getGetMessage()!=null && CostantiConfigurazione.ABILITATO.equals(sa.getInvocazioneServizio().getGetMessage())){
  1105.                         get = true;
  1106.                     }
  1107.                     if(!connettore && !get){
  1108.                         this.errori.add("La porta applicativa "+idPortaApplicativa+" ha associato un servizio applicativo ["+sa.getNome()+"] per cui non e' stato definito ne una consegna trasparente (tramite connettore) ne il servizio di message box (tramite IntegrationManager)");
  1109.                     }
  1110.                 }
  1111.             }
  1112.         }

  1113.         // Check processo di autenticazione della porta delegata
  1114.         String autenticazione = CredenzialeTipo.SSL.toString();
  1115.         if(pa.getAutenticazione()!=null){
  1116.             autenticazione = pa.getAutenticazione();
  1117.             if(this.tipoAutenticazionePortaApplicativa.contains(pa.getAutenticazione())==false){
  1118.                 this.errori.add("Alla porta applicativa "+idPortaApplicativa+" e' stato associato un processo di autenticazione ["+pa.getAutenticazione()+"] non valido; tipi conosciuti: "+this.getTipoAutenticazionePortaApplicativa());
  1119.             }
  1120.         }
  1121.        
  1122.         // Autorizzazione
  1123.         String autorizzazione = CostantiConfigurazione.AUTORIZZAZIONE_AUTHENTICATED;
  1124.         if(pa.getAutorizzazione()!=null){
  1125.             autorizzazione = pa.getAutorizzazione();
  1126.             if(this.tipoAutorizzazionePortaApplicativa.contains(pa.getAutorizzazione())==false){
  1127.                 this.errori.add("Alla porta applicativa "+idPortaApplicativa+" e' stato associato un processo di autorizzazione ["+pa.getAutorizzazione()+"] non valido; tipi conosciuti: "+this.getTipoAutorizzazionePortaApplicativa());
  1128.             }
  1129.         }
  1130.        
  1131.         if(autorizzazione!=null){
  1132.        
  1133.             // Questi vincoli non valgono in spcoop e nello sdi
  1134.             if("gw".equals(sogg.getTipo())){
  1135.                 if(autorizzazione.toLowerCase().contains(CostantiConfigurazione.AUTORIZZAZIONE_AUTHENTICATED) &&
  1136.                         autorizzazione.toLowerCase().contains(CostantiConfigurazione.AUTORIZZAZIONE_ROLES)){
  1137.                     // Se e' definito un processo di autorizzazione che prevede sia autenticazione che ruoli l'autenticazione deve essere opzionale
  1138.                     if(StatoFunzionalita.ABILITATO.equals(pa.getAutenticazioneOpzionale())==false){
  1139.                         this.errori.add("Alla porta applicativa "+idPortaApplicativa+" e' stato associata un'autorizzazione '"+autorizzazione+"' che richiede una autenticazione dei soggetti opzionali");
  1140.                     }
  1141.                 }
  1142.                 if(autorizzazione.toLowerCase().contains("internal") ||
  1143.                         (CostantiConfigurazione.AUTORIZZAZIONE_AUTHENTICATED.equals(autorizzazione))){
  1144.                     // Se l'autorizzazione prevede una gestione dei ruoli interni, oppure è solamente basata sull'autenticazione dei chiamanti,
  1145.                     // una autenticazione DEVE essere presente e non deve essere opzionale
  1146.                     if(CostantiConfigurazione.AUTENTICAZIONE_NONE.equals(autenticazione)){
  1147.                         this.errori.add("Alla porta applicativa "+idPortaApplicativa+" e' stato associata un'autorizzazione '"+autorizzazione+"' che richiede una autenticazione obbligatoria dei soggetti, autenticazione non impostata nella porta applicativa");
  1148.                     }
  1149.                     if(StatoFunzionalita.ABILITATO.equals(pa.getAutenticazioneOpzionale())){
  1150.                         if(autorizzazione.toLowerCase().contains("or")==false){
  1151.                             this.errori.add("Alla porta applicativa "+idPortaApplicativa+" e' stato associata un'autorizzazione '"+autorizzazione+"' che richiede una autenticazione obbligatoria dei soggetti, autenticazione impostata come opzionale nella porta applicativa");
  1152.                         }
  1153.                     }
  1154.                 }
  1155.             }
  1156.            
  1157.         }

  1158.         // Vincoli troppo forti nel caso di configurazione su console, la PdD non parte se la configurazione non e' stata ultimata.
  1159. //      if(autorizzazione!=null && autorizzazione.toLowerCase().contains(CostantiConfigurazione.AUTORIZZAZIONE_ROLES.toLowerCase())){
  1160. //          if (pa.getRuoli()==null || pa.getRuoli().sizeRuoloList() == 0){
  1161. //              this.errori.add("La porta applicativa "+idPortaApplicativa+" deve avere almeno un ruolo associato poiche' lo richiede il tipo di autorizzazione indicato: "+autorizzazione);
  1162. //          }
  1163. //      }
  1164.        
  1165.         // Autorizzazione Contenuto
  1166.         if(pa.getAutorizzazioneContenuto()!=null){
  1167.             if(this.tipoAutorizzazioneContenutoPortaApplicativa.contains(pa.getAutorizzazioneContenuto())==false){
  1168.                 this.errori.add("Alla porta applicativa "+idPortaApplicativa+" e' stato associato un processo di autorizzazione contenuto ["+pa.getAutorizzazioneContenuto()+"] non valido; tipi conosciuti: "+this.getTipoAutorizzazioneContenutoPortaApplicativa());
  1169.             }
  1170.         }
  1171.        
  1172.         // Valida SetProtocolProperties
  1173.         for (int j=0; j<pa.sizeProprietaList();j++) {
  1174.             Proprieta ssp = pa.getProprieta(j);
  1175.             validaProtocolProperty(ssp, "PortaApplicativa_"+idPortaApplicativa);
  1176.         }

  1177.         // Valida MessageSecurity
  1178.         MessageSecurity messageSecurity = pa.getMessageSecurity();
  1179.         if (messageSecurity != null)
  1180.             validaMessageSecurity(messageSecurity,"PortaApplicativa_"+idPortaApplicativa);

  1181.         // Valida MTOM
  1182.         MtomProcessor mtom = pa.getMtomProcessor();
  1183.         if (mtom != null)
  1184.             validaMTOM(mtom,"PortaApplicativa_"+idPortaApplicativa);

  1185.         // Valida ValidazioneContenutiApplicativi
  1186.         ValidazioneContenutiApplicativi vca = pa.getValidazioneContenutiApplicativi();
  1187.         if (vca != null)
  1188.             validazioneValidazioneContenutiApplicativi(vca, "PortaApplicativa_"+idPortaApplicativa);

  1189.         // CorrelazioneApplicativa:
  1190.         String idRisorsa = "Porta applicativa "+idPortaApplicativa;
  1191.         validaCorrelazioneApplicativaRichiesta(idRisorsa,pa.getCorrelazioneApplicativa(),false);
  1192.         validaCorrelazioneApplicativaRisposta(idRisorsa,pa.getCorrelazioneApplicativaRisposta(),false);
  1193.                
  1194.         // Il nome della porta applicativa (obbligatorio) deve essere univoco tra i nomi delle porte applicative del soggetto.
  1195.         int numPA = 0;
  1196.         for (int j=0; j<sogg.sizePortaApplicativaList(); j++) {
  1197.             PortaApplicativa tmpPa = sogg.getPortaApplicativa(j);
  1198.             if (pa.getNome().equals(tmpPa.getNome()))
  1199.                 numPA++;
  1200.         }
  1201.         if (numPA > 1)
  1202.             this.errori.add("Non può esistere più di una porta applicativa del soggetto "+sogg.getTipo()+"/"+sogg.getNome()+" con nome "+pa.getNome());
  1203.    
  1204.         //Check univocita' anche per valori soggetto (virtuale), servizio e azione
  1205.         // Il vincolo è stato eliminato nella versione 3.0
  1206. //      String idPortaA = null;
  1207. //      if(checkIDPA == false){
  1208. //          
  1209. //          if(pa.getSoggettoVirtuale()!=null){
  1210. //              idPortaA = pa.getSoggettoVirtuale().getTipo()+"/"+pa.getSoggettoVirtuale().getNome();
  1211. //          }
  1212. //          else{
  1213. //              idPortaA = sogg.getTipo()+"/"+sogg.getNome();
  1214. //          }
  1215. //          idPortaA = idPortaA +"_" + pa.getServizio().getTipo()+"/"+pa.getServizio().getNome();
  1216. //          if(pa.getAzione()!=null){
  1217. //              idPortaA = idPortaA +"_" +pa.getAzione().getNome();
  1218. //          }
  1219. //          
  1220. //          int cont = 0;
  1221. //          for(int i=0; i<sogg.sizePortaApplicativaList(); i++){
  1222. //              PortaApplicativa tmp = sogg.getPortaApplicativa(i);
  1223. //              String idTMPPA = null;
  1224. //              if(tmp.getSoggettoVirtuale()!=null){
  1225. //                  if(tmp.getSoggettoVirtuale().getTipo()==null)
  1226. //                      continue; // PA malformata, verra segnalata
  1227. //                  if(tmp.getSoggettoVirtuale().getNome()==null)
  1228. //                      continue; // PA malformata, verra segnalata
  1229. //                  idTMPPA = tmp.getSoggettoVirtuale().getTipo()+"/"+tmp.getSoggettoVirtuale().getNome();
  1230. //              }
  1231. //              else{
  1232. //                  idTMPPA = sogg.getTipo()+"/"+sogg.getNome();
  1233. //              }
  1234. //              if(tmp.getServizio()==null)
  1235. //                  continue; // PA malformata, verra segnalata
  1236. //              if(tmp.getServizio().getTipo()==null)
  1237. //                  continue; // PA malformata, verra segnalata
  1238. //              if(tmp.getServizio().getNome()==null)
  1239. //                  continue; // PA malformata, verra segnalata
  1240. //              idTMPPA = idTMPPA +"_" + tmp.getServizio().getTipo()+"/"+tmp.getServizio().getNome();
  1241. //              if(tmp.getAzione()!=null){
  1242. //                  if(tmp.getAzione().getNome()==null){
  1243. //                      continue; // PA malformata, verra segnalata
  1244. //                  }
  1245. //                  idTMPPA = idTMPPA +"_" +pa.getAzione().getNome();
  1246. //              }
  1247. //              if(idPortaA.equals(idTMPPA)){
  1248. //                  cont++;
  1249. //              }
  1250. //          }
  1251. //          
  1252. //          if(cont>1){
  1253. //              if(pa.getSoggettoVirtuale()!=null)
  1254. //                  this.errori.add("Non può esistere più di una porta applicativa (con soggetto virtuale) che mappa il servizio: "+idPortaA);
  1255. //              else
  1256. //                  this.errori.add("Non può esistere più di una porta applicativa che mappa il servizio: "+idPortaA);
  1257. //          }
  1258. //      }
  1259.        
  1260.        
  1261.         // XSD: ricevuta-asincrona-simmetrica: abilitato, disabilitato
  1262.         StatoFunzionalita ricAsiSim = pa.getRicevutaAsincronaSimmetrica();
  1263.         if ((ricAsiSim != null) && !ricAsiSim.equals(CostantiConfigurazione.ABILITATO) && !ricAsiSim.equals(CostantiConfigurazione.DISABILITATO))
  1264.             this.errori.add("La ricevuta asincrona simmetrica della porta applicativa "+idPortaApplicativa+" deve assumere i valori: "+
  1265.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  1266.         // XSD: ricevuta-asincrona-asimmetrica: abilitato, disabilitato
  1267.         StatoFunzionalita ricAsiAsim = pa.getRicevutaAsincronaAsimmetrica();
  1268.         if ((ricAsiAsim != null) && !ricAsiAsim.equals(CostantiConfigurazione.ABILITATO) && !ricAsiAsim.equals(CostantiConfigurazione.DISABILITATO))
  1269.             this.errori.add("La ricevuta asincrona asimmetrica della porta applicativa "+idPortaApplicativa+" deve assumere i valori: "+
  1270.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  1271.         // Integrazione
  1272.         String integrazione = pa.getIntegrazione();
  1273.         if(integrazione!=null){
  1274.             String [] tipiIntegrazione = integrazione.split(",");
  1275.             if(tipiIntegrazione==null || tipiIntegrazione.length<=0){
  1276.                 this.errori.add("La porta applicativa "+idPortaApplicativa+" possiede un valore nel campo 'integrazione' non valido: "+integrazione);
  1277.             }
  1278.             else {
  1279.                 for(int p=0;p<tipiIntegrazione.length;p++){
  1280.                     String tipoI = tipiIntegrazione[p].trim();
  1281.                     if(this.tipoIntegrazionePA.contains(tipoI)==false){
  1282.                         this.errori.add("La porta applicativa "+idPortaApplicativa+" possiede un tipo di integrazione ["+tipoI+"] non valido: valori utilizzabili sono: "+this.getTipoIntegrazionePA());
  1283.                     }
  1284.                 }
  1285.             }
  1286.         }
  1287.        
  1288.         // XSD: allega-body: abilitato, disabilitato
  1289.         StatoFunzionalita allegaBody = pa.getAllegaBody();
  1290.         if ((allegaBody != null) && !allegaBody.equals(CostantiConfigurazione.ABILITATO) && !allegaBody.equals(CostantiConfigurazione.DISABILITATO))
  1291.             this.errori.add("La funzionalita' di allega-boxy della porta applicativa "+idPortaApplicativa+" deve assumere i valori: "+
  1292.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  1293.         // XSD: scarta-body: abilitato, disabilitato
  1294.         StatoFunzionalita scartaBody = pa.getScartaBody();
  1295.         if ((scartaBody != null) && !scartaBody.equals(CostantiConfigurazione.ABILITATO) && !scartaBody.equals(CostantiConfigurazione.DISABILITATO))
  1296.             this.errori.add("La funzionalita' di scarta-boxy della porta applicativa "+idPortaApplicativa+" deve assumere i valori: "+
  1297.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  1298.         // XSD: gestione-manifest: abilitato, disabilitato
  1299.         StatoFunzionalita gestMan = pa.getGestioneManifest();
  1300.         if ((gestMan != null) && !gestMan.equals(CostantiConfigurazione.ABILITATO) && !gestMan.equals(CostantiConfigurazione.DISABILITATO))
  1301.             this.errori.add("La funzionalita' di gestioneManifest della porta applicativa "+idPortaApplicativa+" deve assumere i valori: "+
  1302.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1303.        
  1304.         // XSD: stateless: abilitato, disabilitato
  1305.         StatoFunzionalita stateless = pa.getStateless();
  1306.         if ((stateless != null) && !stateless.equals(CostantiConfigurazione.ABILITATO) && !stateless.equals(CostantiConfigurazione.DISABILITATO))
  1307.             this.errori.add("La funzionalita' 'stateless' della porta applicativa "+idPortaApplicativa+" deve assumere i valori: "+
  1308.                     CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1309.        
  1310.         // ruoli
  1311.         if(pa.getRuoli()!=null){
  1312.             for (int i = 0; i < pa.getRuoli().sizeRuoloList(); i++) {
  1313.                 String nomeRuolo = pa.getRuoli().getRuolo(i).getNome();
  1314.                 try{
  1315.                     if (!RegularExpressionEngine.isMatch(nomeRuolo,"^[0-9A-Za-z_]+$")) {
  1316.                         this.errori.add("Il ruolo ["+nomeRuolo+"] della porta applicativa "+idPortaApplicativa+" dev'essere formato solo da caratteri, cifre e '_'");
  1317.                     }
  1318.                 }catch(Exception e){
  1319.                     throw new DriverConfigurazioneException("Errore durante l'analisi tramite espressione regolare del nome del ruolo "+nomeRuolo+" della porta applicativa "+idPortaApplicativa+" :" +e.getMessage(),e);
  1320.                 }
  1321.             }
  1322.             // Ogni ruolo deve avere un nome diverso!
  1323.             for (int i = 0; i < pa.getRuoli().sizeRuoloList(); i++) {
  1324.                 int numRuolo = 0;
  1325.                 String tmpRuolo = pa.getRuoli().getRuolo(i).getNome();
  1326.                 for (int j = 0; j < pa.getRuoli().sizeRuoloList(); j++) {
  1327.                     String checkRuolo = pa.getRuoli().getRuolo(j).getNome();
  1328.                     if (checkRuolo.equals(tmpRuolo))
  1329.                         numRuolo++;
  1330.                 }
  1331.                 if (numRuolo > 1)
  1332.                     this.errori.add("Non può esistere più di un ruolo con nome "+tmpRuolo+". Trovate "+numRuolo+" occorrenze nella porta applicativa "+idPortaApplicativa);
  1333.             }
  1334.         }
  1335.     }

  1336.     private void validaServizioApplicativo(ServizioApplicativo sa, Soggetto sogg) throws DriverConfigurazioneException {
  1337.         // NOTA: Se checkForAutorizzazione = true, il servizio DEVE possedere l'elemento invocazione porta con ALMENO una credenziale

  1338.         if(sa.getNome()==null){
  1339.             this.errori.add("Esiste un ServizioApplicativo del soggetto ["+sogg.getTipo()+"/"+sogg.getNome()+"] per cui non e' stato definito il nome");
  1340.             return;
  1341.         }
  1342.        
  1343.         String idServizioApplicativo = sogg.getTipo()+"/"+sogg.getNome()+"_"+sa.getNome();
  1344.        
  1345.         if(sa.getInvocazionePorta()==null && sa.getRispostaAsincrona()==null  && sa.getInvocazioneServizio()==null){
  1346.             this.errori.add("Il ServizioApplicativo ["+idServizioApplicativo+"] non contiene ne la definizione dell'elemento invocazione porta, ne la definizione della risposta asincrona, ne la definizione dell'elemento invocazione servizio");
  1347.             return;
  1348.         }
  1349.        
  1350.         // InvocazionePorta
  1351.         InvocazionePorta ip = sa.getInvocazionePorta();
  1352.         if (ip != null) {
  1353.            
  1354.             // Valida Credenziali
  1355.             if(ip.sizeCredenzialiList()<1){
  1356.                 this.errori.add("Il ServizioApplicativo ["+idServizioApplicativo+"] non contiene credenziali di accesso, nonostante abbia definito l'elemento invocazione porta");
  1357.             }
  1358.             for (int j=0; j<ip.sizeCredenzialiList(); j++) {
  1359.                 Credenziali c = ip.getCredenziali(j);
  1360.                 this.validaCredenziale(c, "servizio applicativo ["+idServizioApplicativo+"] (invocazione porta)");
  1361.             }
  1362.            
  1363.             // XSD: invio-per-riferimento: abilitato, disabilitato
  1364.             StatoFunzionalita invRif = ip.getInvioPerRiferimento();
  1365.             if ((invRif != null) && !invRif.equals(CostantiConfigurazione.ABILITATO) && !invRif.equals(CostantiConfigurazione.DISABILITATO))
  1366.                 this.errori.add("L'invio per riferimento dell'invocazione porta del servizio applicativo ["+idServizioApplicativo+"] deve assumere i valori: "+
  1367.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1368.            
  1369.             // XSD: sbustamento-informazioni-protocollo: abilitato, disabilitato
  1370.             StatoFunzionalita sbustamentoInfoProtocollo = ip.getSbustamentoInformazioniProtocollo();
  1371.             if ((sbustamentoInfoProtocollo != null) && !sbustamentoInfoProtocollo.equals(CostantiConfigurazione.ABILITATO) && !sbustamentoInfoProtocollo.equals(CostantiConfigurazione.DISABILITATO))
  1372.                 this.errori.add("L'indicazione di sbustamento informazioni di protcollo dell'invocazione porta del servizio applicativo ["+idServizioApplicativo+"] deve assumere i valori: "+
  1373.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1374.            
  1375.             InvocazionePortaGestioneErrore ipge = ip.getGestioneErrore();
  1376.             if (ipge != null) {
  1377.                
  1378.                 // XSD: fault: soap, xml
  1379.                 FaultIntegrazioneTipo fault = ipge.getFault();
  1380.                 if ((fault != null) && !fault.equals(FaultIntegrazioneTipo.SOAP) && !fault.equals(FaultIntegrazioneTipo.XML))
  1381.                     this.errori.add("Il fault della gestione errore dell'invocazione porta del servizio applicativo ["+idServizioApplicativo+"] deve assumere i valori: "+
  1382.                             CostantiConfigurazione.ERRORE_APPLICATIVO_SOAP+" o "+CostantiConfigurazione.ERRORE_APPLICATIVO_XML);

  1383.                 // XSD: generic-fault-code: abilitato, disabilitato
  1384.                 StatoFunzionalita genFault = ipge.getGenericFaultCode();
  1385.                 if ((genFault != null) && !genFault.equals(CostantiConfigurazione.ABILITATO) && !genFault.equals(CostantiConfigurazione.DISABILITATO))
  1386.                     this.errori.add("Il generic-fault-code della gestione errore dell'invocazione porta del servizio applicativo ["+idServizioApplicativo+"] deve assumere i valori: "+
  1387.                             CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1388.             }

  1389.             // ruoli
  1390.             if(ip.getRuoli()!=null){
  1391.                 for (int i = 0; i < ip.getRuoli().sizeRuoloList(); i++) {
  1392.                     String nomeRuolo = ip.getRuoli().getRuolo(i).getNome();
  1393.                     try{
  1394.                         if (!RegularExpressionEngine.isMatch(nomeRuolo,"^[0-9A-Za-z_]+$")) {
  1395.                             this.errori.add("Il ruolo ["+nomeRuolo+"] dell'invocazione porta del servizio applicativo ["+idServizioApplicativo+"] dev'essere formato solo da caratteri, cifre e '_'");
  1396.                         }
  1397.                     }catch(Exception e){
  1398.                         throw new DriverConfigurazioneException("Errore durante l'analisi tramite espressione regolare del nome del ruolo "+nomeRuolo+" dell'invocazione porta del servizio applicativo ["+idServizioApplicativo+"] :" +e.getMessage(),e);
  1399.                     }
  1400.                 }
  1401.                 // Ogni ruolo deve avere un nome diverso!
  1402.                 for (int i = 0; i < ip.getRuoli().sizeRuoloList(); i++) {
  1403.                     int numRuolo = 0;
  1404.                     String tmpRuolo = ip.getRuoli().getRuolo(i).getNome();
  1405.                     for (int j = 0; j < ip.getRuoli().sizeRuoloList(); j++) {
  1406.                         String checkRuolo = ip.getRuoli().getRuolo(j).getNome();
  1407.                         if (checkRuolo.equals(tmpRuolo))
  1408.                             numRuolo++;
  1409.                     }
  1410.                     if (numRuolo > 1)
  1411.                         this.errori.add("Non può esistere più di un ruolo con nome "+tmpRuolo+". Trovate "+numRuolo+" occorrenze nell'invocazione porta del servizio applicativo ["+idServizioApplicativo+"]");
  1412.                 }
  1413.             }
  1414.         }

  1415.         // InvocazioneServizio
  1416.         if (sa.getInvocazioneServizio() != null) {
  1417.             InvocazioneServizio is = sa.getInvocazioneServizio();
  1418.            
  1419.             // Valida Credenziali
  1420.             InvocazioneCredenziali c = is.getCredenziali();
  1421.             if (c != null)
  1422.                 this.validaCredenziale(c, "servizio applicativo ["+idServizioApplicativo+"] (invocazione servizio)");
  1423.                
  1424.             // Autenticazione
  1425.             // XSD: autenticazione: basic, ssl, none
  1426.             InvocazioneServizioTipoAutenticazione auth = is.getAutenticazione();
  1427.             if ((auth != null) && !auth.equals(CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_BASIC) &&
  1428.                     !auth.equals(CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_NONE))
  1429.                 this.errori.add("L'autenticazione dell'invocazione servizio del servizio applicativo "+idServizioApplicativo+" deve assumere uno dei seguenti valori: "+
  1430.                         CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_BASIC.toString()+" o "+CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_NONE.toString());
  1431.             if(CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_BASIC.equals(auth)){
  1432.                 if(c==null){
  1433.                     this.errori.add("L'autenticazione "+CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_BASIC.toString()+" dell'invocazione servizio del servizio applicativo "+idServizioApplicativo+" richiede la presenza di credenziali");
  1434.                 }
  1435.             }

  1436.             // Valida il connettore.
  1437.             Connettore conn = is.getConnettore();
  1438.             if (conn != null)
  1439.                 this.validaConnettore(conn, "servizio applicativo ["+idServizioApplicativo+"] (invocazione servizio)", sogg);
  1440.                
  1441.             // Valida GestioneErrore
  1442.             GestioneErrore ge = is.getGestioneErrore();
  1443.             if (ge != null)
  1444.                 this.validaGestioneErrore(ge, "servizio applicativo ["+idServizioApplicativo+"] (invocazione servizio)");

  1445.             boolean connettore = false;
  1446.             boolean get = false;
  1447.             if(is.getConnettore()!=null && !CostantiConfigurazione.DISABILITATO.equals(is.getConnettore().getTipo())){
  1448.                 connettore = true;
  1449.             }
  1450.             if(is.getGetMessage()!=null && CostantiConfigurazione.ABILITATO.equals(is.getGetMessage())){
  1451.                 get = true;
  1452.             }
  1453.             if(!connettore && !get){
  1454.                 this.errori.add("Il servizio Applicativo "+idServizioApplicativo+" possiede un elemento invocazione servizio per cui non e' stato definito ne una consegna trasparente (tramite connettore) ne il servizio di message box (tramite IntegrationManager)");
  1455.             }
  1456.            
  1457.                        
  1458.             // XSD: get-message: abilitato, disabilitato
  1459.             StatoFunzionalita getMsg = is.getGetMessage();
  1460.             if ((getMsg != null) && !getMsg.equals(CostantiConfigurazione.ABILITATO) && !getMsg.equals(CostantiConfigurazione.DISABILITATO))
  1461.                 this.errori.add("Il get-message dell'invocazione servizio del servizio applicativo "+idServizioApplicativo+" deve assumere i valori: "+
  1462.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  1463.             // XSD: invio-per-riferimento: abilitato, disabilitato
  1464.             StatoFunzionalita invRif = is.getInvioPerRiferimento();
  1465.             if ((invRif != null) && !invRif.equals(CostantiConfigurazione.ABILITATO) && !invRif.equals(CostantiConfigurazione.DISABILITATO))
  1466.                 this.errori.add("La funzionalita' di invio per riferimento dell'invocazione servizio del servizio applicativo "+idServizioApplicativo+" deve assumere i valori: "+
  1467.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1468.            
  1469.             // XSD: risposta-per-riferimento: abilitato, disabilitato
  1470.             StatoFunzionalita rispRif = is.getRispostaPerRiferimento();
  1471.             if ((rispRif != null) && !rispRif.equals(CostantiConfigurazione.ABILITATO) && !rispRif.equals(CostantiConfigurazione.DISABILITATO))
  1472.                 this.errori.add("La funzionalita' di risposta per riferimento dell'invocazione servizio del servizio applicativo "+idServizioApplicativo+" deve assumere i valori: "+
  1473.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  1474.             // XSD: sbustamento-soap: abilitato, disabilitato
  1475.             StatoFunzionalita sbustamentoSOAP = is.getSbustamentoSoap();
  1476.             if ((sbustamentoSOAP != null) && !sbustamentoSOAP.equals(CostantiConfigurazione.ABILITATO) && !sbustamentoSOAP.equals(CostantiConfigurazione.DISABILITATO))
  1477.                 this.errori.add("L'indicazione di sbustamento SOAP dell'invocazione servizio del servizio applicativo ["+idServizioApplicativo+"] deve assumere i valori: "+
  1478.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1479.            
  1480.             // XSD: sbustamento-informazioni-protocollo: abilitato, disabilitato
  1481.             StatoFunzionalita sbustamentoInfoProtocollo = is.getSbustamentoInformazioniProtocollo();
  1482.             if ((sbustamentoInfoProtocollo != null) && !sbustamentoInfoProtocollo.equals(CostantiConfigurazione.ABILITATO) && !sbustamentoInfoProtocollo.equals(CostantiConfigurazione.DISABILITATO))
  1483.                 this.errori.add("L'indicazione di sbustamento informazioni di protcollo dell'invocazione servizio del servizio applicativo ["+idServizioApplicativo+"] deve assumere i valori: "+
  1484.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1485.            
  1486.         }

  1487.         // RispostaAsincrona
  1488.         if (sa.getRispostaAsincrona() != null) {
  1489.            
  1490.             RispostaAsincrona ra = sa.getRispostaAsincrona();
  1491.            
  1492.             // Valida Credenziali
  1493.             InvocazioneCredenziali c = ra.getCredenziali();
  1494.             if (c != null)
  1495.                 this.validaCredenziale(c, "servizio applicativo ["+idServizioApplicativo+"] (risposta asincrona)");
  1496.                
  1497.             // Autenticazione
  1498.             // XSD: autenticazione: basic, ssl, none
  1499.             InvocazioneServizioTipoAutenticazione auth = ra.getAutenticazione();
  1500.             if ((auth != null) && !auth.equals(CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_BASIC) &&
  1501.                     !auth.equals(CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_NONE))
  1502.                 this.errori.add("L'autenticazione della risposta asincrona del servizio applicativo "+idServizioApplicativo+" deve assumere uno dei seguenti valori: "+
  1503.                         CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_BASIC.toString()+" o "+CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_NONE.toString());
  1504.             if(CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_BASIC.equals(auth)){
  1505.                 if(c==null){
  1506.                     this.errori.add("L'autenticazione "+CostantiConfigurazione.INVOCAZIONE_SERVIZIO_AUTENTICAZIONE_BASIC+" della risposta asincrona del servizio applicativo "+idServizioApplicativo+" richiede la presenza di credenziali");
  1507.                 }
  1508.             }

  1509.             // Valida il connettore.
  1510.             Connettore conn = ra.getConnettore();
  1511.             if (conn != null)
  1512.                 this.validaConnettore(conn, "servizio applicativo ["+idServizioApplicativo+"] (risposta asincrona)", sogg);
  1513.                
  1514.             // Valida GestioneErrore
  1515.             GestioneErrore ge = ra.getGestioneErrore();
  1516.             if (ge != null)
  1517.                 this.validaGestioneErrore(ge, "servizio applicativo ["+idServizioApplicativo+"] (risposta asincrona)");

  1518.             boolean connettore = false;
  1519.             boolean get = false;
  1520.             if(ra.getConnettore()!=null && !CostantiConfigurazione.DISABILITATO.equals(ra.getConnettore().getTipo())){
  1521.                 connettore = true;
  1522.             }
  1523.             if(ra.getGetMessage()!=null && CostantiConfigurazione.ABILITATO.equals(ra.getGetMessage())){
  1524.                 get = true;
  1525.             }
  1526.             if(!connettore && !get){
  1527.                 this.errori.add("Il servizio Applicativo "+idServizioApplicativo+" possiede un elemento risposta asincrona per cui non e' stato definito ne una consegna trasparente (tramite connettore) ne il servizio di message box (tramite IntegrationManager)");
  1528.             }
  1529.            
  1530.                        
  1531.             // XSD: get-message: abilitato, disabilitato
  1532.             StatoFunzionalita getMsg = ra.getGetMessage();
  1533.             if ((getMsg != null) && !getMsg.equals(CostantiConfigurazione.ABILITATO) && !getMsg.equals(CostantiConfigurazione.DISABILITATO))
  1534.                 this.errori.add("Il get-message della risposta asincrona del servizio applicativo "+idServizioApplicativo+" deve assumere i valori: "+
  1535.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  1536.             // XSD: invio-per-riferimento: abilitato, disabilitato
  1537.             StatoFunzionalita invRif = ra.getInvioPerRiferimento();
  1538.             if ((invRif != null) && !invRif.equals(CostantiConfigurazione.ABILITATO) && !invRif.equals(CostantiConfigurazione.DISABILITATO))
  1539.                 this.errori.add("La funzionalita' di invio per riferimento della risposta asincrona del servizio applicativo "+idServizioApplicativo+" deve assumere i valori: "+
  1540.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1541.            
  1542.             // XSD: risposta-per-riferimento: abilitato, disabilitato
  1543.             StatoFunzionalita rispRif = ra.getRispostaPerRiferimento();
  1544.             if ((rispRif != null) && !rispRif.equals(CostantiConfigurazione.ABILITATO) && !rispRif.equals(CostantiConfigurazione.DISABILITATO))
  1545.                 this.errori.add("La funzionalita' di risposta per riferimento della risposta asincrona del servizio applicativo "+idServizioApplicativo+" deve assumere i valori: "+
  1546.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);

  1547.             // XSD: sbustamento-soap: abilitato, disabilitato
  1548.             StatoFunzionalita sbustamentoSOAP = ra.getSbustamentoSoap();
  1549.             if ((sbustamentoSOAP != null) && !sbustamentoSOAP.equals(CostantiConfigurazione.ABILITATO) && !sbustamentoSOAP.equals(CostantiConfigurazione.DISABILITATO))
  1550.                 this.errori.add("L'indicazione di sbustamento SOAP della risposta asincrona del servizio applicativo ["+idServizioApplicativo+"] deve assumere i valori: "+
  1551.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1552.            
  1553.             // XSD: sbustamento-informazioni-protocollo: abilitato, disabilitato
  1554.             StatoFunzionalita sbustamentoInfoProtocollo = ra.getSbustamentoInformazioniProtocollo();
  1555.             if ((sbustamentoInfoProtocollo != null) && !sbustamentoInfoProtocollo.equals(CostantiConfigurazione.ABILITATO) && !sbustamentoInfoProtocollo.equals(CostantiConfigurazione.DISABILITATO))
  1556.                 this.errori.add("L'indicazione di sbustamento informazioni di protcollo della risposta asincrona del servizio applicativo ["+idServizioApplicativo+"] deve assumere i valori: "+
  1557.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  1558.            
  1559.         }

  1560.         // UNICITA: i servizi applicativi definiti nella radice del soggetto devono possedere un nome univoco
  1561.         int numSA = 0;
  1562.         for (int j=0; j<sogg.sizeServizioApplicativoList(); j++) {
  1563.             ServizioApplicativo tmpSA = sogg.getServizioApplicativo(j);
  1564.             if (sa.getNome().equals(tmpSA.getNome())){
  1565.                 numSA++;
  1566.             }
  1567.         }
  1568.         if (numSA > 1)
  1569.             this.errori.add("Non può esistere più di un servizio applicativo con nome "+sa.getNome()+" associato al soggetto "+sogg.getTipo()+"/"+sogg.getNome());
  1570.     }

  1571.     private  void validaConnettore(Connettore conn, String identificativoElementoInternoSoggetto, Soggetto soggetto) throws DriverConfigurazioneException {

  1572.         // Valida il connettore
  1573.         // 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.
  1574.         // 1. i connettori definiti nella radice del registro devono possedere un nome univoco
  1575.         // 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.
  1576.         // 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.
  1577.         // 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.
  1578.         // 5. Se il connettore e' di tipo 'disabilitato' non deve possedere property

  1579.         String nomeConn = conn.getNome();
  1580.         String tipoConn = conn.getTipo();

  1581.         String idSoggetto = soggetto.getTipo()+"/"+soggetto.getNome();
  1582.        
  1583.         // required
  1584.         if(nomeConn==null){
  1585.             if(identificativoElementoInternoSoggetto==null)
  1586.                 this.errori.add("Esiste un connettore nella radice del soggetto["+idSoggetto+"] per cui non è definito il nome");
  1587.             else
  1588.                 this.errori.add("Esiste un connettore del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") per cui non è definito il nome");
  1589.             return;
  1590.         }

  1591.         if(identificativoElementoInternoSoggetto==null){

  1592.             // 1. i connettori definiti nella radice del soggetto devono possedere un nome univoco
  1593.             int numC = 0;
  1594.             for(int j=0; j<soggetto.sizeConnettoreList();j++){
  1595.                 Connettore tmpC = soggetto.getConnettore(j);
  1596.                 if (nomeConn.equals(tmpC.getNome()))
  1597.                     numC++;
  1598.             }
  1599.             if (numC > 1)
  1600.                 this.errori.add("Non può esistere più di un connettore con nome "+nomeConn+" definito come elemento radice del soggetto["+idSoggetto+"]");
  1601.         }

  1602.         else{
  1603.             if (tipoConn == null) {
  1604.                 // Cerco il connettore nella root del registro
  1605.                 conn = null;
  1606.                 for (int j=0; j<soggetto.sizeConnettoreList();j++) {
  1607.                     Connettore connettore = soggetto.getConnettore(j);
  1608.                     if (nomeConn.equals(connettore.getNome())) {
  1609.                         conn = connettore;
  1610.                         break;
  1611.                     }
  1612.                 }
  1613.             }
  1614.             if (conn == null)
  1615.                 this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") non corrisponde a nessuno dei connettori registrati");
  1616.             else {
  1617.                 tipoConn = conn.getTipo();
  1618.             }
  1619.         }

  1620.         // 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.
  1621.         if(this.tipoConnettori.contains(tipoConn)==false){
  1622.             if(identificativoElementoInternoSoggetto==null){
  1623.                 this.errori.add("Il tipo ["+tipoConn+"] del connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], non è valido (Tipi conosciuti: "+this.getTipoConnettori()+")");
  1624.             }else{
  1625.                 this.errori.add("Il tipo ["+tipoConn+"] del connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") non è valido (Tipi conosciuti: "+this.getTipoConnettori()+")");
  1626.             }
  1627.         }
  1628.         else{

  1629.             List<Property> cps = conn.getPropertyList();
  1630.             Property[] cpArray = null;
  1631.             if(cps.size()>0){
  1632.                 cpArray = cps.toArray(new Property[cps.size()]);
  1633.             }
  1634.             if(cpArray!=null){
  1635.                 // Check generale sulle proprietà
  1636.                 for (int j=0; j<cpArray.length;j++) {
  1637.                     Property cp = cpArray[j];
  1638.                     if(cp.getNome()==null){
  1639.                         if(identificativoElementoInternoSoggetto==null){
  1640.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], possiede una proprietà per cui non è definito il nome");
  1641.                         }else{
  1642.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") possiede una proprietà per cui non è definito il nome");
  1643.                         }
  1644.                         return;
  1645.                     }
  1646.                     if(cp.getValore()==null){
  1647.                         if(identificativoElementoInternoSoggetto==null){
  1648.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], possiede una proprietà per cui non è definito il valore");
  1649.                         }else{
  1650.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") possiede una proprietà per cui non è definito il valore");
  1651.                         }
  1652.                         return;
  1653.                     }
  1654.                 }
  1655.             }

  1656.             // Connettore HTTP
  1657.             if (tipoConn.equals(TipiConnettore.HTTP.getNome())) {
  1658.                 String urlConn = null;
  1659.                 for (int j=0; j<cpArray.length;j++) {
  1660.                     Property cp = cpArray[j];
  1661.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTP_LOCATION)) {
  1662.                         urlConn = cp.getValore();
  1663.                         break;
  1664.                     }
  1665.                 }
  1666.                 if (urlConn == null){
  1667.                     if(identificativoElementoInternoSoggetto==null){
  1668.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo http, ma non ha una url definita");
  1669.                     }else{
  1670.                         this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo http, ma non ha una url definita");
  1671.                     }
  1672.                 }
  1673.                 else{
  1674.                     try{
  1675.                         RegExpUtilities.validateUrl(urlConn, true);
  1676.                     }catch(Exception e){
  1677.                         if(identificativoElementoInternoSoggetto==null){
  1678.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo http, ma non ha una url valida: "+e.getMessage());
  1679.                         }else{
  1680.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo http, ma non ha una url valida: "+e.getMessage());
  1681.                         }
  1682.                     }
  1683.                 }
  1684.             }

  1685.             // Connettore JMS
  1686.             else if (tipoConn.equals(TipiConnettore.JMS.getNome())) {
  1687.                 String jmsNome = null, jmsTipo = null, jmsConnFact = null, jmsSendAs = null;
  1688.                 for (int j=0; j<cpArray.length;j++) {
  1689.                     Property cp = cpArray[j];
  1690.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_JMS_NOME))
  1691.                         jmsNome = cp.getValore();
  1692.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_JMS_TIPO))
  1693.                         jmsTipo = cp.getValore();
  1694.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_JMS_CONNECTION_FACTORY))
  1695.                         jmsConnFact = cp.getValore();
  1696.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_JMS_SEND_AS))
  1697.                         jmsSendAs = cp.getValore();
  1698.                 }
  1699.                 if (jmsNome == null){
  1700.                     if(identificativoElementoInternoSoggetto==null){
  1701.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo jms, ma non ha un nome coda/topic definito");
  1702.                     }else{
  1703.                         this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo jms, ma non ha un nome coda/topic definito");
  1704.                     }
  1705.                 }
  1706.                 if (jmsTipo == null){
  1707.                     if(identificativoElementoInternoSoggetto==null){
  1708.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo jms, ma non ha un tipo coda/topic definito");
  1709.                     }else{
  1710.                         this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo jms, ma non ha un tipo coda/topic definito");
  1711.                     }
  1712.                 }else{
  1713.                     if (!jmsTipo.equals(CostantiConnettori.CONNETTORE_JMS_TIPO_QUEUE) && !jmsTipo.equals(CostantiConnettori.CONNETTORE_JMS_TIPO_TOPIC)){
  1714.                         if(identificativoElementoInternoSoggetto==null){
  1715.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo jms, ma non ha un tipo coda/topic valido (valori assumibili sono topic/queue)");
  1716.                         }else{
  1717.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo jms, ma non ha un tipo coda/topic valido (valori assumibili sono topic/queue)");
  1718.                         }
  1719.                     }
  1720.                 }
  1721.                 if (jmsConnFact == null){
  1722.                     if(identificativoElementoInternoSoggetto==null){
  1723.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo jms, ma non ha una connection factory definita");
  1724.                     }else{
  1725.                         this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo jms, ma non ha una connection factory definita");
  1726.                     }
  1727.                 }
  1728.                 if (jmsSendAs == null){
  1729.                     if(identificativoElementoInternoSoggetto==null){
  1730.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo jms, ma non ha un tipo di messaggio (sendAs) definito");
  1731.                     }else{
  1732.                         this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo jms, ma non ha un tipo di messaggio (sendAs) definito");
  1733.                     }
  1734.                 }else{
  1735.                     if (!jmsSendAs.equals(CostantiConnettori.CONNETTORE_JMS_SEND_AS_TEXT_MESSAGE) && !jmsSendAs.equals(CostantiConnettori.CONNETTORE_JMS_SEND_AS_BYTES_MESSAGE)){
  1736.                         if(identificativoElementoInternoSoggetto==null){
  1737.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo jms, ma non ha un tipo di messaggio (sendAs) (valori assumibili sono TextMessage/BytesMessage)");
  1738.                         }else{
  1739.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo jms, ma non ha un tipo di messaggio (sendAs) (valori assumibili sono TextMessage/BytesMessage)");
  1740.                         }
  1741.                     }
  1742.                 }
  1743.             }

  1744.             // Connettore HTTPS
  1745.             else if (tipoConn.equals(TipiConnettore.HTTPS.getNome())) {
  1746.                 String urlConn = null;
  1747.                 String trustStoreLocation = null;
  1748.                 String trustStorePassword = null;
  1749.                 String keyStoreLocation = null;
  1750.                 String keyStorePassword = null;
  1751.                 String keyPassword = null;
  1752.                 String hostNameVerifier = null;
  1753.                 for (int j=0; j<cpArray.length;j++) {
  1754.                     Property cp = cpArray[j];
  1755.                     if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_LOCATION)) {
  1756.                         urlConn = cp.getValore();
  1757.                     }
  1758.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_TRUST_STORE_LOCATION)) {
  1759.                         trustStoreLocation = cp.getValore();
  1760.                     }
  1761.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_TRUST_STORE_PASSWORD)) {
  1762.                         trustStorePassword = cp.getValore();
  1763.                     }
  1764.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_KEY_STORE_LOCATION)) {
  1765.                         keyStoreLocation = cp.getValore();
  1766.                     }
  1767.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_KEY_STORE_PASSWORD)) {
  1768.                         keyStorePassword = cp.getValore();
  1769.                     }
  1770.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_KEY_PASSWORD)) {
  1771.                         keyPassword = cp.getValore();
  1772.                     }
  1773.                     else if (cp.getNome().equals(CostantiDB.CONNETTORE_HTTPS_HOSTNAME_VERIFIER)) {
  1774.                         hostNameVerifier = cp.getValore();
  1775.                     }
  1776.                 }
  1777.                 if (urlConn == null){
  1778.                     if(identificativoElementoInternoSoggetto==null){
  1779.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo http, ma non ha una url definita");
  1780.                     }else{
  1781.                         this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo http, ma non ha una url definita");
  1782.                     }
  1783.                 }
  1784.                 else{
  1785.                     try{
  1786.                         RegExpUtilities.validateUrl(urlConn, true);
  1787.                     }catch(Exception e){
  1788.                         if(identificativoElementoInternoSoggetto==null){
  1789.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo http, ma non ha una url valida: "+e.getMessage());
  1790.                         }else{
  1791.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo http, ma non ha una url valida: "+e.getMessage());
  1792.                         }
  1793.                     }
  1794.                 }
  1795.                 if (trustStoreLocation != null){
  1796.                     File f = new File(trustStoreLocation);
  1797.                     if(f.exists()==false){
  1798.                         if(identificativoElementoInternoSoggetto==null){
  1799.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un truststore "+trustStoreLocation+" che non esiste");
  1800.                         }else{
  1801.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un truststore "+trustStoreLocation+" che non esiste");
  1802.                         }
  1803.                     }
  1804.                     else if(f.isFile()==false){
  1805.                         if(identificativoElementoInternoSoggetto==null){
  1806.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un truststore "+trustStoreLocation+" che non e' un file");
  1807.                         }else{
  1808.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un truststore "+trustStoreLocation+" che non e' un file");
  1809.                         }
  1810.                     }
  1811.                     else if(f.canRead()==false){
  1812.                         if(identificativoElementoInternoSoggetto==null){
  1813.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un truststore "+trustStoreLocation+" che non e' accessibile (permessi in lettura non forniti)");
  1814.                         }else{
  1815.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un truststore "+trustStoreLocation+" che non e' accessibile (permessi in lettura non forniti)");
  1816.                         }
  1817.                     }
  1818.                     else if(trustStorePassword==null){
  1819.                         if(identificativoElementoInternoSoggetto==null){
  1820.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un truststore "+trustStoreLocation+" per cui non e' stata specificata una password");
  1821.                         }else{
  1822.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un truststore "+trustStoreLocation+" per cui non e' stata specificata una password");
  1823.                         }
  1824.                     }
  1825.                 }
  1826.                 if (keyStoreLocation != null){
  1827.                     File f = new File(keyStoreLocation);
  1828.                     if(f.exists()==false){
  1829.                         if(identificativoElementoInternoSoggetto==null){
  1830.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un keystore "+keyStoreLocation+" che non esiste");
  1831.                         }else{
  1832.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un keystore "+keyStoreLocation+" che non esiste");
  1833.                         }
  1834.                     }
  1835.                     else if(f.isFile()==false){
  1836.                         if(identificativoElementoInternoSoggetto==null){
  1837.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un keystore "+keyStoreLocation+" che non e' un file");
  1838.                         }else{
  1839.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un keystore "+keyStoreLocation+" che non e' un file");
  1840.                         }
  1841.                     }
  1842.                     else if(f.canRead()==false){
  1843.                         if(identificativoElementoInternoSoggetto==null){
  1844.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un keystore "+keyStoreLocation+" che non e' accessibile (permessi in lettura non forniti)");
  1845.                         }else{
  1846.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un keystore "+keyStoreLocation+" che non e' accessibile (permessi in lettura non forniti)");
  1847.                         }
  1848.                     }
  1849.                     else if(keyStorePassword==null){
  1850.                         if(identificativoElementoInternoSoggetto==null){
  1851.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un keystore "+keyStoreLocation+" per cui non e' stata specificata una password");
  1852.                         }else{
  1853.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un keystore "+keyStoreLocation+" per cui non e' stata specificata una password");
  1854.                         }
  1855.                     }
  1856.                     else if(keyPassword==null){
  1857.                         if(identificativoElementoInternoSoggetto==null){
  1858.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], definisce un keystore "+keyStoreLocation+" per cui non e' stata specificata una password per la chiave privata");
  1859.                         }else{
  1860.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") definisce un keystore "+keyStoreLocation+" per cui non e' stata specificata una password per la chiave privata");
  1861.                         }
  1862.                     }
  1863.                 }
  1864.                 if(hostNameVerifier!=null){
  1865.                     try{
  1866.                         Boolean.parseBoolean(hostNameVerifier);
  1867.                     }catch(Exception e){
  1868.                         if(identificativoElementoInternoSoggetto==null){
  1869.                             this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], associa un valore non valido  alla proprieta' 'hostNameVerifier'; valori utilizzabili: true e false");
  1870.                         }else{
  1871.                             this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") associa un valore non valido  alla proprieta' 'hostNameVerifier'; valori utilizzabili: true e false");
  1872.                         }
  1873.                     }
  1874.                 }
  1875.             }
  1876.            
  1877.             else if (tipoConn.equals(TipiConnettore.DISABILITATO.getNome())) {
  1878.                 if (cpArray != null) {
  1879.                     if(identificativoElementoInternoSoggetto==null){
  1880.                         this.errori.add("Il connettore "+nomeConn+", definito nella radice del soggetto["+idSoggetto+"], è di tipo disabilitato, ma ha delle properties definite");
  1881.                     }else{
  1882.                         this.errori.add("Il connettore "+nomeConn+" del "+identificativoElementoInternoSoggetto+" (Soggetto:"+idSoggetto+") è di tipo disabilitato, ma ha delle properties definite");
  1883.                     }
  1884.                 }
  1885.             }
  1886.         }
  1887.     }

  1888.     private void validaCorrelazioneApplicativaRichiesta(String identificativoRisorsa,CorrelazioneApplicativa ca,boolean portaDelegata) throws DriverConfigurazioneException{
  1889.         // UNICITA: i nomi definiti nella correlazione devono possedere un nome univoco. Puo' esistere anche UN SOLO elemento senza nome
  1890.         // Se identificazione='urlBased' o 'contentBased' il pattern e' obbligatorio.
  1891.         if (ca != null) {
  1892.            
  1893.             // Scadenza
  1894.             if(ca.getScadenza()!=null){
  1895.                 try{
  1896.                     Long.parseLong(ca.getScadenza());
  1897.                 }catch(Exception e){
  1898.                     this.errori.add("Il valore associato alla scadenza della correlazione applicativa inserita nella "+identificativoRisorsa+" dev'essere un numero intero");
  1899.                 }
  1900.             }
  1901.            
  1902.             // Minimo numero di elementi
  1903.             if(ca.sizeElementoList()<1){
  1904.                 this.errori.add(identificativoRisorsa+" che possiede la definizione di una correlazione applicativa senza elementi?");
  1905.             }
  1906.            
  1907.             // Controllo che l'elemento null, equivalga solo all'ultimo elemento della configurazione
  1908.             for (int j=0; j<ca.sizeElementoList();j++) {
  1909.                 CorrelazioneApplicativaElemento cae = ca.getElemento(j);
  1910.                 if(cae.getNome()==null && j!=(ca.sizeElementoList()-1)){
  1911.                     this.errori.add(identificativoRisorsa+" che possiede la definizione di una correlazione applicativa ("+(j+1)+") con un elemento '*' (match qualsiasi contenuto) definito non come ultima regola di correlazione");
  1912.                 }
  1913.             }
  1914.            
  1915.             // Elementi
  1916.             for (int j=0; j<ca.sizeElementoList();j++) {
  1917.                 CorrelazioneApplicativaElemento cae = ca.getElemento(j);
  1918.                 int numE = 0;
  1919.                 for(int k=0; k<ca.sizeElementoList();k++){
  1920.                     CorrelazioneApplicativaElemento tmpCae = ca.getElemento(k);
  1921.                     if(cae.getNome()==null){
  1922.                         if(tmpCae.getNome()==null)
  1923.                             numE++;
  1924.                     }else{
  1925.                         if ((cae.getNome()).equals(tmpCae.getNome()))
  1926.                             numE++;
  1927.                     }
  1928.                 }
  1929.                 if (numE > 1){
  1930.                     String nome = "*";
  1931.                     if(cae.getNome()!=null){
  1932.                         nome = cae.getNome();
  1933.                     }
  1934.                     this.errori.add("Non può esistere più di un elemento di correlazione applicativa con nome "+nome+ " ("+identificativoRisorsa+")");
  1935.                 }
  1936.                
  1937.                 CorrelazioneApplicativaRichiestaIdentificazione identificazione = cae.getIdentificazione();
  1938.                 if ((identificazione != null) && !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_DISABILITATO) &&
  1939.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_URL_BASED) &&
  1940.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_CONTENT_BASED) &&
  1941.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_INPUT_BASED) &&
  1942.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_HEADER_BASED) &&
  1943.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_TEMPLATE) &&
  1944.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_FREEMARKER_TEMPLATE) &&
  1945.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_VELOCITY_TEMPLATE)){
  1946.                     this.errori.add("La modalita d'identificazione della correlazione applicativa ("+(j+1)+") nella "+identificativoRisorsa+" deve assumere uno dei seguente valori: "+
  1947.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_DISABILITATO+","+
  1948.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_URL_BASED+","+
  1949.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_CONTENT_BASED+" o "+
  1950.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_INPUT_BASED+" o "+
  1951.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_HEADER_BASED+" o "+
  1952.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_TEMPLATE+" o "+
  1953.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_FREEMARKER_TEMPLATE+" o "+
  1954.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_VELOCITY_TEMPLATE);
  1955.                 }
  1956.                 if(identificazione==null){
  1957.                     identificazione = CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_CONTENT_BASED;
  1958.                 }
  1959.                
  1960.                 if(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_URL_BASED.equals(identificazione) || CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RICHIESTA_CONTENT_BASED.equals(identificazione)){
  1961.                     if (cae.getPattern() == null)
  1962.                         this.errori.add("La correlazione applicativa ("+(j+1)+") della "+identificativoRisorsa+" non contiene la definizione del pattern, nonostante la modalita' di identificazione sia "+identificazione);
  1963.                 }  
  1964.                
  1965.                 CorrelazioneApplicativaGestioneIdentificazioneFallita identificazioneFallita = cae.getIdentificazioneFallita();
  1966.                 if ((identificazioneFallita != null) && !identificazioneFallita.equals(CostantiConfigurazione.BLOCCA) &&
  1967.                         !identificazioneFallita.equals(CostantiConfigurazione.ACCETTA)){
  1968.                     this.errori.add("Il comportamento in caso di identificazione fallita della correlazione applicativa ("+(j+1)+") nella "+identificativoRisorsa+" deve assumere uno dei seguente valori: "+
  1969.                             CostantiConfigurazione.BLOCCA+" o "+
  1970.                             CostantiConfigurazione.ACCETTA);
  1971.                 }
  1972.                
  1973.                 StatoFunzionalita riusoIdentificatore = cae.getRiusoIdentificativo();
  1974.                 if ((riusoIdentificatore != null) && !riusoIdentificatore.equals(CostantiConfigurazione.ABILITATO) &&
  1975.                         !riusoIdentificatore.equals(CostantiConfigurazione.DISABILITATO)){
  1976.                     this.errori.add("Il comportamento per il riuso dell'id della correlazione applicativa ("+(j+1)+") nella "+identificativoRisorsa+" deve assumere uno dei seguente valori: "+
  1977.                             CostantiConfigurazione.ABILITATO+" o "+
  1978.                             CostantiConfigurazione.DISABILITATO);
  1979.                 }
  1980.                
  1981.                
  1982.             }
  1983.         }
  1984.     }
  1985.    
  1986.     private void validaCorrelazioneApplicativaRisposta(String identificativoRisorsa,CorrelazioneApplicativaRisposta ca,boolean portaDelegata) throws DriverConfigurazioneException{
  1987.         // UNICITA: i nomi definiti nella correlazione devono possedere un nome univoco. Puo' esistere anche UN SOLO elemento senza nome
  1988.         // Se identificazione='urlBased' o 'contentBased' il pattern e' obbligatorio.
  1989.         if (ca != null) {
  1990.            
  1991.             // Minimo numero di elementi
  1992.             if(ca.sizeElementoList()<1){
  1993.                 this.errori.add(identificativoRisorsa+" che possiede la definizione di una correlazione applicativa senza elementi?");
  1994.             }
  1995.            
  1996.             // Controllo che l'elemento null, equivalga solo all'ultimo elemento della configurazione
  1997.             for (int j=0; j<ca.sizeElementoList();j++) {
  1998.                 CorrelazioneApplicativaRispostaElemento cae = ca.getElemento(j);
  1999.                 if(cae.getNome()==null && j!=(ca.sizeElementoList()-1)){
  2000.                     this.errori.add(identificativoRisorsa+" che possiede la definizione di una correlazione applicativa ("+(j+1)+") con un elemento '*' (match qualsiasi contenuto) definito non come ultima regola di correlazione");
  2001.                 }
  2002.             }
  2003.            
  2004.             // Elementi
  2005.             for (int j=0; j<ca.sizeElementoList();j++) {
  2006.                 CorrelazioneApplicativaRispostaElemento cae = ca.getElemento(j);
  2007.                 int numE = 0;
  2008.                 for(int k=0; k<ca.sizeElementoList();k++){
  2009.                     CorrelazioneApplicativaRispostaElemento tmpCae = ca.getElemento(k);
  2010.                     if(cae.getNome()==null){
  2011.                         if(tmpCae.getNome()==null)
  2012.                             numE++;
  2013.                     }else{
  2014.                         if ((cae.getNome()).equals(tmpCae.getNome()))
  2015.                             numE++;
  2016.                     }
  2017.                 }
  2018.                 if (numE > 1){
  2019.                     String nome = "*";
  2020.                     if(cae.getNome()!=null){
  2021.                         nome = cae.getNome();
  2022.                     }
  2023.                     this.errori.add("Non può esistere più di un elemento di correlazione applicativa con nome "+nome+ " ("+identificativoRisorsa+")");
  2024.                 }
  2025.                
  2026.                 CorrelazioneApplicativaRispostaIdentificazione identificazione = cae.getIdentificazione();
  2027.                 if ((identificazione != null) && !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_DISABILITATO)  &&
  2028.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_CONTENT_BASED) &&
  2029.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_INPUT_BASED) &&
  2030.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_HEADER_BASED) &&
  2031.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_TEMPLATE) &&
  2032.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_FREEMARKER_TEMPLATE) &&
  2033.                         !identificazione.equals(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_VELOCITY_TEMPLATE)){
  2034.                     this.errori.add("La modalita d'identificazione della correlazione applicativa ("+(j+1)+") nella "+identificativoRisorsa+" deve assumere uno dei seguente valori: "+
  2035.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_DISABILITATO+","+
  2036.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_CONTENT_BASED+" o "+
  2037.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_INPUT_BASED+" o "+
  2038.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_HEADER_BASED+" o "+
  2039.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_TEMPLATE+" o "+
  2040.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_FREEMARKER_TEMPLATE+" o "+
  2041.                             CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_VELOCITY_TEMPLATE);
  2042.                 }
  2043.                 if(identificazione==null){
  2044.                     identificazione = CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_CONTENT_BASED;
  2045.                 }
  2046.                
  2047.                 if(CostantiConfigurazione.CORRELAZIONE_APPLICATIVA_RISPOSTA_CONTENT_BASED.equals(identificazione)){
  2048.                     if (cae.getPattern() == null)
  2049.                         this.errori.add("La correlazione applicativa ("+(j+1)+") della "+identificativoRisorsa+" non contiene la definizione del pattern, nonostante la modalita' di identificazione sia "+identificazione);
  2050.                 }  
  2051.                
  2052.                 CorrelazioneApplicativaGestioneIdentificazioneFallita identificazioneFallita = cae.getIdentificazioneFallita();
  2053.                 if ((identificazioneFallita != null) && !identificazioneFallita.equals(CostantiConfigurazione.BLOCCA) &&
  2054.                         !identificazioneFallita.equals(CostantiConfigurazione.ACCETTA)){
  2055.                     this.errori.add("Il comportamento in caso di identificazione fallita della correlazione applicativa ("+(j+1)+") nella "+identificativoRisorsa+" deve assumere uno dei seguente valori: "+
  2056.                             CostantiConfigurazione.BLOCCA+" o "+
  2057.                             CostantiConfigurazione.ACCETTA);
  2058.                 }
  2059.                
  2060.             }
  2061.         }
  2062.     }
  2063.    
  2064.     private void validaConfigurazione(Configurazione configurazione) throws DriverConfigurazioneException {
  2065.        
  2066.         // 1.  Valida accesso registro
  2067.         // Ogni registro deve avere un nome univoco.
  2068.         AccessoRegistro ar = null;
  2069.         if(configurazione.getAccessoRegistro()==null){
  2070.             this.errori.add("Non è stato configurato un accesso ad un registro dei servizi");
  2071.         }else{
  2072.             ar = configurazione.getAccessoRegistro();
  2073.             if(ar.sizeRegistroList()<=0){
  2074.                 this.errori.add("Non è stato configurato un accesso ad un registro dei servizi");
  2075.                 ar = null;
  2076.             }else{
  2077.                 for (int j=0; j<ar.sizeRegistroList(); j++) {
  2078.                     AccessoRegistroRegistro arr = ar.getRegistro(j);
  2079.                     String nomeArr = arr.getNome();
  2080.                    
  2081.                     // required
  2082.                     if(nomeArr==null){
  2083.                         this.errori.add("E' presente la configurazione di accesso ad un registro dei servizi anonimo; deve obbligatoriamente essere associato un nome ad un registro dei servizi");
  2084.                     }
  2085.                     else{
  2086.                         int numAR = 0;
  2087.                         for(int k=0; k<ar.sizeRegistroList();k++){
  2088.                             AccessoRegistroRegistro tmpArr = ar.getRegistro(k);
  2089.                             if (nomeArr.equals(tmpArr.getNome()))
  2090.                                 numAR++;
  2091.                         }
  2092.                         if (numAR > 1)
  2093.                             this.errori.add("Non può esistere più di un registro dei servizi con nome "+nomeArr);
  2094.                     }

  2095.                     // XSD: tipo: xml, uddi, web, db, ws
  2096.                     RegistroTipo tipo = arr.getTipo();
  2097.                     if ((tipo != null) && !tipo.equals(CostantiConfigurazione.REGISTRO_XML) &&
  2098.                             !tipo.equals(CostantiConfigurazione.REGISTRO_UDDI) &&
  2099.                             !tipo.equals(CostantiConfigurazione.REGISTRO_WEB) &&
  2100.                             !tipo.equals(CostantiConfigurazione.REGISTRO_DB) &&
  2101.                             !tipo.equals(CostantiConfigurazione.REGISTRO_WS))
  2102.                         this.errori.add("Il tipo del registro "+nomeArr+" non è valido; deve assumere uno dei seguenti tipi: "+CostantiConfigurazione.REGISTRO_XML.toString()+","+
  2103.                                 CostantiConfigurazione.REGISTRO_UDDI.toString()+","+CostantiConfigurazione.REGISTRO_WEB.toString()+","+CostantiConfigurazione.REGISTRO_DB.toString()+","+
  2104.                                 CostantiConfigurazione.REGISTRO_WS.toString());
  2105.                    
  2106.                     // required
  2107.                     if(arr.getLocation()==null){
  2108.                         this.errori.add("Per la configurazione di accesso al registro dei servizi ["+nomeArr+"] non è stata fornita la location");
  2109.                     }
  2110.                    
  2111.                     // User e Password
  2112.                     if(arr.getPassword()!=null && arr.getUser()==null){
  2113.                         this.errori.add("Per la configurazione di accesso al registro dei servizi ["+nomeArr+"] non è stata fornito un username, ma è stato specificata una password?");
  2114.                     }
  2115.                 }

  2116.                 Cache arc = ar.getCache();
  2117.                 if (arc != null) {
  2118.                    
  2119.                     validaCache(arc, "Registro dei Servizi");
  2120.                    
  2121.                 }
  2122.             }
  2123.         }
  2124.        
  2125.        


  2126.         // 2.  Valida routing table
  2127.         // Ogni destinazione deve possedere un tipo/nome univoco.
  2128.         // Le rotte hanno i seguenti vincoli:
  2129.         // Registro.
  2130.         // Il nome di un registro (se presente) deve essere uno tra i registro definiti nella sezione AccessoRegistro.
  2131.         // Le rotte di tipo registro vengono identificate dal nome (dove il nome non presente e' il caso particolare registro NULL).
  2132.         // Ogni registro deve possedere un nome univoco
  2133.         // Gateway.
  2134.         // Ogni tipo/nome deve essere univoco.
  2135.         RoutingTable rt = configurazione.getRoutingTable();
  2136.         if (rt != null) {
  2137.            
  2138.             // Rotta di default
  2139.             if(rt.getDefault()==null){
  2140.                 this.errori.add("(RoutingTable abilitata) Non è stata definita una rotta di default");
  2141.             }
  2142.             else if(rt.getDefault().sizeRouteList()==0){
  2143.                 this.errori.add("(RoutingTable abilitata) Non è stata definita una rotta tra quelle di default");
  2144.             }
  2145.             else{
  2146.                 RoutingTableDefault rtDefault = rt.getDefault();
  2147.                 for(int i=0; i<rtDefault.sizeRouteList(); i++){
  2148.                     Route r = rtDefault.getRoute(i);
  2149.                     this.validaRotta(r, "[RottaDefault]", ar);
  2150.                    
  2151.                     if(r.getRegistro()!=null){
  2152.                         // Controllo diversita' delle rotte di default
  2153.                         int numRR = 0;
  2154.                         for(int h=0; h<rtDefault.sizeRouteList();h++){
  2155.                             Route tmpR = rtDefault.getRoute(h);
  2156.                             if(tmpR.getRegistro()!=null){
  2157.                                 RouteRegistro tmpRR = tmpR.getRegistro();
  2158.                                 if(r.getRegistro().getNome()==null){
  2159.                                     if(tmpRR.getNome()==null)
  2160.                                         numRR++;
  2161.                                 }else{
  2162.                                     if (r.getRegistro().getNome().equals(tmpRR.getNome()))
  2163.                                         numRR++;
  2164.                                 }
  2165.                             }
  2166.                         }
  2167.                         if (numRR > 1){
  2168.                             String nome = "TuttiRegistri";
  2169.                             if(r.getRegistro().getNome()!=null)
  2170.                                 nome = r.getRegistro().getNome();
  2171.                             this.errori.add("(RoutingTableAbilitata) Non può esistere più di una rotta di default, che utilizzi il registro "+nome);
  2172.                         }
  2173.                     }
  2174.                    
  2175.                     if(r.getGateway()!=null && r.getGateway().getTipo()!=null && r.getGateway().getNome()!=null){
  2176.                         // Controllo diversita' delle rotte di tipo gateway
  2177.                         RouteGateway rg = r.getGateway();
  2178.                         String idRG = rg.getTipo()+"/"+rg.getNome();
  2179.                         int numRG = 0;
  2180.                         for(int h=0; h<rtDefault.sizeRouteList();h++){
  2181.                             Route tmpR = rtDefault.getRoute(h);
  2182.                             if(tmpR.getGateway()!=null && tmpR.getGateway().getTipo()!=null && tmpR.getGateway().getNome()!=null) {
  2183.                                 RouteGateway tmpRG = tmpR.getGateway();
  2184.                                 String tmpIdRG = tmpRG.getTipo()+"/"+tmpRG.getNome();
  2185.                                 if (idRG.equals(tmpIdRG))
  2186.                                     numRG++;
  2187.                             }
  2188.                         }
  2189.                         if (numRG > 1)
  2190.                             this.errori.add("(RoutingTableAbilitata) Non può esistere più di una rotta di default di tipo gateway con identificativo soggetto "+idRG);
  2191.                     }
  2192.                 }
  2193.             }
  2194.            
  2195.             // Destinazioni statiche
  2196.             for (int j=0; j<rt.sizeDestinazioneList(); j++) {
  2197.                 RoutingTableDestinazione rtd = rt.getDestinazione(j);
  2198.                
  2199.                 // required
  2200.                 if(rtd.getTipo()==null){
  2201.                     this.errori.add("(RoutingTable abilitata) E' stata definita una rotta di destinazone statica, senza aver specificato il tipo");
  2202.                 }
  2203.                 else if(rtd.getNome()==null){
  2204.                     this.errori.add("(RoutingTable abilitata) E' stata definita una rotta di destinazone statica, senza aver specificato il nome");
  2205.                 }
  2206.                 else{
  2207.                    
  2208.                     String idDest = rtd.getTipo()+"/"+rtd.getNome();
  2209.                    
  2210.                     // Verifico che non esista piu' di una rotta statica con stesso id
  2211.                     int numD = 0;
  2212.                     for(int k=0; k<rt.sizeDestinazioneList();k++){
  2213.                         RoutingTableDestinazione tmpRtd = rt.getDestinazione(k);
  2214.                         String tmpIdDest = tmpRtd.getTipo()+"/"+tmpRtd.getNome();
  2215.                         if (idDest.equals(tmpIdDest))
  2216.                             numD++;
  2217.                     }
  2218.                     if (numD > 1)
  2219.                         this.errori.add("(RoutingTable abilitata)  Non può esistere più di una rotta di destinazione statico con identificativo soggetto"+idDest);
  2220.                    
  2221.                     // Verifico rotte presenti nella destinazione statica
  2222.                     for(int k=0; k<rtd.sizeRouteList();k++){
  2223.                         Route r = rtd.getRoute(k);
  2224.                    
  2225.                         // Valida rotta
  2226.                         this.validaRotta(r, "[RottaDestinazioneStatica("+idDest+")]", ar);

  2227.                         if(r.getRegistro()!=null){
  2228.                             // Controllo diversita' delle rotte di destinazione statica per questo soggetto
  2229.                             int numRR = 0;
  2230.                             for(int h=0; h<rtd.sizeRouteList();h++){
  2231.                                 Route tmpR = rtd.getRoute(h);
  2232.                                 if(tmpR.getRegistro()!=null){
  2233.                                     RouteRegistro tmpRR = tmpR.getRegistro();
  2234.                                     if(r.getRegistro().getNome()==null){
  2235.                                         if(tmpRR.getNome()==null)
  2236.                                             numRR++;
  2237.                                     }else{
  2238.                                         if (r.getRegistro().getNome().equals(tmpRR.getNome()))
  2239.                                             numRR++;
  2240.                                     }
  2241.                                 }
  2242.                             }
  2243.                             if (numRR > 1){
  2244.                                 String nome = "TuttiRegistri";
  2245.                                 if(r.getRegistro().getNome()!=null)
  2246.                                     nome = r.getRegistro().getNome();
  2247.                                 this.errori.add("(RoutingTableAbilitata) Non può esistere più di una rotta per la destinazione statica ["+idDest+"], che utilizzi il registro "+nome);
  2248.                             }
  2249.                         }
  2250.                        
  2251.                         if(r.getGateway()!=null && r.getGateway().getTipo()!=null && r.getGateway().getNome()!=null){
  2252.                             // Controllo diversita' delle rotte di tipo gateway
  2253.                             RouteGateway rg = r.getGateway();
  2254.                             String idRG = rg.getTipo()+"/"+rg.getNome();
  2255.                             int numRG = 0;
  2256.                             for(int h=0; h<rtd.sizeRouteList();h++){
  2257.                                 Route tmpR = rtd.getRoute(h);
  2258.                                 if(tmpR.getGateway()!=null && tmpR.getGateway().getTipo()!=null && tmpR.getGateway().getNome()!=null) {
  2259.                                     RouteGateway tmpRG = tmpR.getGateway();
  2260.                                     String tmpIdRG = tmpRG.getTipo()+"/"+tmpRG.getNome();
  2261.                                     if (idRG.equals(tmpIdRG))
  2262.                                         numRG++;
  2263.                                 }
  2264.                             }
  2265.                             if (numRG > 1)
  2266.                                 this.errori.add("(RoutingTableAbilitata) Non può esistere più di una rotta per la destinazione statica ["+idDest+"] di tipo gateway con identificativo soggetto "+idRG);
  2267.                         }
  2268.                     }
  2269.                    
  2270.                 }
  2271.             }
  2272.         }

  2273.        
  2274.         // Validazione Accesso Configurazione
  2275.         if(configurazione.getAccessoConfigurazione()!=null){
  2276.             if(configurazione.getAccessoConfigurazione().getCache()!=null){
  2277.                 this.validaCache(configurazione.getAccessoConfigurazione().getCache(), "ConfigurazionePdD");
  2278.             }
  2279.         }
  2280.        
  2281.         // Validazione Dati Accesso Autorizzazione
  2282.         if(configurazione.getAccessoDatiAutorizzazione()!=null){
  2283.             if(configurazione.getAccessoDatiAutorizzazione().getCache()!=null){
  2284.                 this.validaCache(configurazione.getAccessoDatiAutorizzazione().getCache(), "DatiAutorizzazione");
  2285.             }
  2286.         }
  2287.        
  2288.        
  2289.         // ValidazioneBuste
  2290.         ValidazioneBuste vbe = configurazione.getValidazioneBuste();
  2291.         if (vbe != null) {
  2292.             // XSD: stato: abilitato, disabilitato, warningOnly
  2293.             StatoFunzionalitaConWarning statoBuste = vbe.getStato();
  2294.             if ((statoBuste != null) && !statoBuste.equals(CostantiConfigurazione.STATO_CON_WARNING_ABILITATO) &&
  2295.                     !statoBuste.equals(CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO) &&
  2296.                     !statoBuste.equals(CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY))
  2297.                 this.errori.add("Lo stato della validazione buste deve possedere uno dei seguenti valori: "+CostantiConfigurazione.STATO_CON_WARNING_ABILITATO+
  2298.                         ", "+CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO+
  2299.                         " o "+CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY);

  2300.             // XSD: controllo: normale, rigido
  2301.             ValidazioneBusteTipoControllo controllo = vbe.getControllo();
  2302.             if ((controllo != null) && !controllo.equals(CostantiConfigurazione.VALIDAZIONE_PROTOCOL_LIVELLO_NORMALE) &&
  2303.                     !controllo.equals(CostantiConfigurazione.VALIDAZIONE_PROTOCOL_LIVELLO_RIGIDO))
  2304.                 this.errori.add("Il controllo della validazione buste deve possedere uno dei seguenti valori: "+CostantiConfigurazione.VALIDAZIONE_PROTOCOL_LIVELLO_NORMALE+
  2305.                         " o "+CostantiConfigurazione.VALIDAZIONE_PROTOCOL_LIVELLO_RIGIDO);

  2306.             // XSD: profilo-collaborazione: abilitato, disabilitato
  2307.             StatoFunzionalita profColl = vbe.getProfiloCollaborazione();
  2308.             if ((profColl != null) && !profColl.equals(CostantiConfigurazione.ABILITATO) && !profColl.equals(CostantiConfigurazione.DISABILITATO))
  2309.                 this.errori.add("Il profilo di collaborazione della validazione buste deve possedere i valori "+CostantiConfigurazione.ABILITATO+
  2310.                         " o "+CostantiConfigurazione.DISABILITATO);

  2311.             // XSD: manifest-attachments: abilitato, disabilitato
  2312.             StatoFunzionalita manifest = vbe.getManifestAttachments();
  2313.             if ((manifest != null) && !manifest.equals("abilitato") && !manifest.equals("disabilitato"))
  2314.                 this.errori.add("Il manifest-attachments della validazione buste deve possedere i valori "+CostantiConfigurazione.ABILITATO+
  2315.                         " o "+CostantiConfigurazione.DISABILITATO);
  2316.         }
  2317.    
  2318.        
  2319.         // ValidazioneContenutiApplicativi
  2320.         if(configurazione.getValidazioneContenutiApplicativi()!=null)
  2321.             this.validazioneValidazioneContenutiApplicativi(configurazione.getValidazioneContenutiApplicativi(),"ConfigurazioneGeneralePdD");
  2322.        
  2323.    
  2324.         // Indirizzo Telematico
  2325.         IndirizzoRisposta it = configurazione.getIndirizzoRisposta();
  2326.         if (it != null) {
  2327.             // XSD: utilizzo: abilitato, disabilitato
  2328.             StatoFunzionalita utilizzo = it.getUtilizzo();
  2329.             if ((utilizzo != null) && !utilizzo.equals(CostantiConfigurazione.ABILITATO) && !utilizzo.equals(CostantiConfigurazione.DISABILITATO))
  2330.                 this.errori.add("L'utilizzo dell'indirizzo per la risposta nella configurazione generale della PdD deve assumere i valori: "+
  2331.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  2332.         }
  2333.        
  2334.         // Attachments
  2335.         Attachments attachments = configurazione.getAttachments();
  2336.         if (attachments != null) {
  2337.             // XSD: utilizzo: abilitato, disabilitato
  2338.             StatoFunzionalita gestione = attachments.getGestioneManifest();
  2339.             if ((gestione != null) && !gestione.equals(CostantiConfigurazione.ABILITATO) && !gestione.equals(CostantiConfigurazione.DISABILITATO))
  2340.                 this.errori.add("La gestione dei manifest degli attachments nella configurazione generale della PdD deve assumere i valori: "+
  2341.                         CostantiConfigurazione.ABILITATO+" o "+CostantiConfigurazione.DISABILITATO);
  2342.         }
  2343.        
  2344.         // Risposte
  2345.         Risposte rs = configurazione.getRisposte();
  2346.         if (rs != null) {
  2347.             // XSD: connessione: new, reply
  2348.             TipoConnessioneRisposte connessione = rs.getConnessione();
  2349.             if ((connessione != null) && !connessione.equals(CostantiConfigurazione.NEW_CONNECTION) && !connessione.equals(CostantiConfigurazione.CONNECTION_REPLY))
  2350.                 this.errori.add("La connessione delle risposte nella configurazione generale della PdD deve assumere i valori:"+
  2351.                         CostantiConfigurazione.CONNECTION_REPLY+" o "+CostantiConfigurazione.NEW_CONNECTION);
  2352.         }
  2353.        
  2354.        
  2355.         // Inoltro Buste non riscontrate
  2356.         if(configurazione.getInoltroBusteNonRiscontrate()==null){
  2357.             this.errori.add("Definizione della cadenza delle buste non riscontrate non presente nella configurazione generale della PdD");
  2358.         }else{
  2359.             InoltroBusteNonRiscontrate inoltro = configurazione.getInoltroBusteNonRiscontrate();
  2360.             if(inoltro.getCadenza()==null){
  2361.                 this.errori.add("Definizione della cadenza delle buste non riscontrate non presente nella configurazione generale della PdD");
  2362.             }else{
  2363.                 try{
  2364.                     Long.parseLong(inoltro.getCadenza());
  2365.                 }catch(Exception e){
  2366.                     this.errori.add("Il valore associato alla cadenza delle buste non riscontrate, presente nella configurazione generale della PdD, dev'essere un numero intero");
  2367.                 }
  2368.             }
  2369.         }
  2370.        
  2371.        
  2372.        
  2373.         // 3.  Valida mssaggi diagnostici
  2374.         // Ogni elemento definito nelle proprieta' di un OpenSPCoopProperties deve avere un nome univoco.
  2375.         MessaggiDiagnostici md = configurazione.getMessaggiDiagnostici();
  2376.         if (md != null) {
  2377.             for (int j=0; j<md.sizeOpenspcoopAppenderList(); j++) {
  2378.                 OpenspcoopAppender oa = md.getOpenspcoopAppender(j);
  2379.                
  2380.                 // Controllo tipo
  2381.                 if(oa.getTipo()==null){
  2382.                     this.errori.add("E' stato definito un appender dei msg diagnostici per cui non e' stato definito il tipo");
  2383.                 }
  2384.                 else {
  2385.                    
  2386.                     // Controllo tipo
  2387.                     if(this.tipoMsgDiagnosticiAppender.contains(oa.getTipo())==false){
  2388.                         this.errori.add("E' stato definito un appender dei msg diagnostici per cui e' stato definito un tipo["+oa.getTipo()+"] non valido, valori ammessi sono: "+this.getTipoMsgDiagnosticiAppender());
  2389.                     }
  2390.                    
  2391.                     for(int k=0; k<oa.sizePropertyList();k++){
  2392.                         Property oap = oa.getProperty(k);
  2393.                        
  2394.                         if(oap.getNome()==null){
  2395.                            
  2396.                         }
  2397.                         else if(oap.getValore()==null){
  2398.                             this.errori.add("E' stato definito un appender["+oa.getTipo()+"] dei msg diagnostici per cui esiste una proprieta' senza un valore?");
  2399.                         }
  2400.                         else{
  2401.                             // Controllo univocita' nome
  2402.                             String nomeOap = oap.getNome();
  2403.                             int numOap = 0;
  2404.                             for(int h=0; h<oa.sizePropertyList();h++){
  2405.                                 Property tmpOap = oa.getProperty(h);
  2406.                                 if (nomeOap.equals(tmpOap.getNome()))
  2407.                                     numOap++;
  2408.                             }
  2409.                             if (numOap > 1)
  2410.                                 this.errori.add("Non può esistere più di una proprietà con nome "+nomeOap +" per lo stesso appender["+oa.getTipo()+"] dei msg diagnostici");
  2411.                         }
  2412.                     }
  2413.                 }
  2414.                
  2415.             }

  2416.             // XSD:: off, fatal, errorProtocol, errorIntegration, infoProtocol, infoIntegration, debugLow, debugMedium, debugHigh, all
  2417.             Severita severita = md.getSeverita();
  2418.             if ((severita != null) && !severita.equals(Severita.OFF) && !severita.equals(Severita.FATAL) &&
  2419.                     !severita.equals(Severita.ERROR_PROTOCOL) && !severita.equals(Severita.ERROR_INTEGRATION) &&
  2420.                     !severita.equals(Severita.INFO_PROTOCOL) && !severita.equals(Severita.INFO_INTEGRATION) &&
  2421.                     !severita.equals(Severita.DEBUG_LOW) && !severita.equals(Severita.DEBUG_MEDIUM) && !severita.equals(Severita.DEBUG_HIGH) &&
  2422.                     !severita.equals(Severita.ALL))
  2423.                 this.errori.add("L'opzione 'severita' della configurazione dei messaggi diagnostici nella configurazione generale della PdD deve assumere uno dei seguenti valori: off, fatal, errorProtocol, errorIntegration, infoProtocol, infoIntegration, debugLow, debugMedium, debugHigh, all");

  2424.             // XSD: openspcoop: off, fatal, errorProtocol, errorIntegration, infoProtocol, infoIntegration, debugLow, debugMedium, debugHigh, all
  2425.             Severita severitaLog4j = md.getSeveritaLog4j();
  2426.             if ((severitaLog4j != null) && !severitaLog4j.equals(Severita.OFF) && !severitaLog4j.equals(Severita.FATAL) &&
  2427.                     !severitaLog4j.equals(Severita.ERROR_PROTOCOL) && !severitaLog4j.equals(Severita.ERROR_INTEGRATION) &&
  2428.                     !severitaLog4j.equals(Severita.INFO_PROTOCOL) && !severitaLog4j.equals(Severita.INFO_INTEGRATION) &&
  2429.                     !severitaLog4j.equals(Severita.DEBUG_LOW) && !severitaLog4j.equals(Severita.DEBUG_MEDIUM) && !severitaLog4j.equals(Severita.DEBUG_HIGH) &&
  2430.                     !severitaLog4j.equals(Severita.ALL))
  2431.             this.errori.add("L'opzione 'severita-log4j' della configurazione dei messaggi diagnostici nella configurazione generale della PdD deve assumere uno dei seguenti valori: off, fatal, errorProtocol, errorIntegration, infoProtocol, infoIntegration, debugLow, debugMedium, debugHigh, all");
  2432.         }
  2433.         else{
  2434.             this.errori.add("Non e' stata definita la configurazione dei messaggi diagnostici nella configurazione generale della PdD");
  2435.         }
  2436.        
  2437.         // 4.  Valida tracciamento
  2438.         // Ogni elemento definito nelle proprieta' di un OpenSPCoopProperties deve avere un nome univoco.
  2439.         Tracciamento t = configurazione.getTracciamento();
  2440.         if (t != null) {
  2441.             for (int j=0; j<t.sizeOpenspcoopAppenderList(); j++) {
  2442.                 OpenspcoopAppender oa = t.getOpenspcoopAppender(j);
  2443.                
  2444.                 // Controllo tipo
  2445.                 if(oa.getTipo()==null){
  2446.                     this.errori.add("E' stato definito un appender delle tracce per cui non e' stato definito il tipo");
  2447.                 }
  2448.                 else {
  2449.                    
  2450.                     // Controllo tipo
  2451.                     if(this.tipoTracciamentoAppender.contains(oa.getTipo())==false){
  2452.                         this.errori.add("E' stato definito un appender delle tracce per cui e' stato definito un tipo["+oa.getTipo()+"] non valido, valori ammessi sono: "+this.getTipoTracciamentoAppender());
  2453.                     }
  2454.                
  2455.                     for(int k=0; k<oa.sizePropertyList();k++){
  2456.                         Property oap = oa.getProperty(k);
  2457.                        
  2458.                         if(oap.getNome()==null){
  2459.                             this.errori.add("E' stato definito un appender["+oa.getTipo()+"] delle tracce per cui esiste una proprieta' senza un nome?");
  2460.                         }
  2461.                         else if(oap.getValore()==null){
  2462.                             this.errori.add("E' stato definito un appender["+oa.getTipo()+"] delle tracce per cui esiste una proprieta' senza un valore?");
  2463.                         }
  2464.                         else{
  2465.                             // Controllo univocita' nome
  2466.                             String nomeOap = oap.getNome();
  2467.                             int numOap = 0;
  2468.                             for(int h=0; h<oa.sizePropertyList();h++){
  2469.                                 Property tmpOap = oa.getProperty(h);
  2470.                                 if (nomeOap.equals(tmpOap.getNome()))
  2471.                                     numOap++;
  2472.                             }
  2473.                             if (numOap > 1)
  2474.                                 this.errori.add("Non può esistere più di una proprietà con nome "+nomeOap+" per lo stesso appender["+oa.getTipo()+"] delle tracce");
  2475.                         }
  2476.                     }
  2477.                    
  2478.                 }
  2479.             }

  2480.             // XSD: buste: abilitato, disabilitato
  2481.             StatoFunzionalita tracciamentoBuste = t.getStato();
  2482.             if ((tracciamentoBuste != null) && !tracciamentoBuste.equals(CostantiConfigurazione.ABILITATO) && !tracciamentoBuste.equals(CostantiConfigurazione.DISABILITATO))
  2483.                 this.errori.add("Il valore 'buste' della configurazione per il tracciamento delle buste deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2484.                         " o "+CostantiConfigurazione.DISABILITATO);

  2485.         }

  2486.        
  2487.         // 5.  Valida dump
  2488.         // Ogni elemento definito nelle proprieta' di un OpenSPCoopProperties deve avere un nome univoco.
  2489.         Dump d = configurazione.getDump();
  2490.         if (d != null) {
  2491.             for (int j=0; j<d.sizeOpenspcoopAppenderList(); j++) {
  2492.                 OpenspcoopAppender oa = d.getOpenspcoopAppender(j);
  2493.                
  2494.                 // Controllo tipo
  2495.                 if(oa.getTipo()==null){
  2496.                     this.errori.add("E' stato definito un appender del dump per cui non e' stato definito il tipo");
  2497.                 }
  2498.                 else {
  2499.                    
  2500.                     // Controllo tipo
  2501.                     if(this.tipoDumpAppender.contains(oa.getTipo())==false){
  2502.                         this.errori.add("E' stato definito un appender del dump per cui e' stato definito un tipo["+oa.getTipo()+"] non valido, valori ammessi sono: "+this.getTipoDumpAppender());
  2503.                     }
  2504.                
  2505.                     for(int k=0; k<oa.sizePropertyList();k++){
  2506.                         Property oap = oa.getProperty(k);
  2507.                        
  2508.                         if(oap.getNome()==null){
  2509.                             this.errori.add("E' stato definito un appender["+oa.getTipo()+"] del dump per cui esiste una proprieta' senza un nome?");
  2510.                         }
  2511.                         else if(oap.getValore()==null){
  2512.                             this.errori.add("E' stato definito un appender["+oa.getTipo()+"] del dump per cui esiste una proprieta' senza un valore?");
  2513.                         }
  2514.                         else{
  2515.                             // Controllo univocita' nome
  2516.                             String nomeOap = oap.getNome();
  2517.                             int numOap = 0;
  2518.                             for(int h=0; h<oa.sizePropertyList();h++){
  2519.                                 Property tmpOap = oa.getProperty(h);
  2520.                                 if (nomeOap.equals(tmpOap.getNome()))
  2521.                                     numOap++;
  2522.                             }
  2523.                             if (numOap > 1)
  2524.                                 this.errori.add("Non può esistere più di una proprietà con nome "+nomeOap+" per lo stesso appender["+oa.getTipo()+"] delle tracce");
  2525.                         }
  2526.                     }
  2527.                    
  2528.                 }
  2529.             }

  2530.             // XSD: buste: abilitato, disabilitato
  2531.             StatoFunzionalita statoDump = d.getStato();
  2532.             if ((statoDump != null) && !statoDump.equals(CostantiConfigurazione.ABILITATO) && !statoDump.equals(CostantiConfigurazione.DISABILITATO))
  2533.                 this.errori.add("Il valore 'buste' della configurazione per il tracciamento delle buste deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2534.                         " o "+CostantiConfigurazione.DISABILITATO);


  2535.         }
  2536.        

  2537.         // Gestione Errore
  2538.         if(configurazione.getGestioneErrore()!=null){
  2539.             if(configurazione.getGestioneErrore().getComponenteCooperazione()!=null){
  2540.                 validaGestioneErrore(configurazione.getGestioneErrore().getComponenteCooperazione(),"ConfigurazioneGenerale-GestioneErroreComponenteCooperazione");
  2541.             }
  2542.             if(configurazione.getGestioneErrore().getComponenteIntegrazione()!=null){
  2543.                 validaGestioneErrore(configurazione.getGestioneErrore().getComponenteIntegrazione(),"ConfigurazioneGenerale-GestioneErroreComponenteIntegrazione");
  2544.             }
  2545.         }
  2546.                
  2547.        
  2548.         // IntegrationManager
  2549.         IntegrationManager im = configurazione.getIntegrationManager();
  2550.         if (im != null && im.getAutenticazione()!=null){
  2551.             String[]v = im.getAutenticazione().split(",");
  2552.             if(v!=null && v.length>0){
  2553.                 for(int l=0;l<v.length;l++){
  2554.                     if(this.tipoAutenticazionePortaDelegata.contains(v[l].trim())==false){
  2555.                         this.errori.add("Processo di autenticazione["+v[l].trim()+"] associato al servizio di IntegrationManager non conosciuto, valori ammessi: "+this.getTipoAutenticazionePortaDelegata());
  2556.                     }
  2557.                 }
  2558.             }
  2559.         }

  2560.         // Servizi
  2561.         StatoServiziPdd s = configurazione.getStatoServiziPdd();
  2562.         if(s!=null){
  2563.            
  2564.             // PortaDelegata
  2565.             if(s.getPortaDelegata()!=null){
  2566.                 StatoServiziPddPortaDelegata sPD = s.getPortaDelegata();
  2567.                
  2568.                 StatoFunzionalita portaDelegata = sPD.getStato();
  2569.                 // XSD: abilitato, disabilitato
  2570.                 if ((portaDelegata != null) && !portaDelegata.equals(CostantiConfigurazione.ABILITATO) && !portaDelegata.equals(CostantiConfigurazione.DISABILITATO))
  2571.                     this.errori.add("Il valore 'stato' della configurazione per quanto concerne i servizi attivi sulla porta (PD) deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2572.                             " o "+CostantiConfigurazione.DISABILITATO);
  2573.                
  2574.                 validaFiltriStatoServiziPdD("FiltroAbilitazione", sPD.getFiltroAbilitazioneList());
  2575.                 validaFiltriStatoServiziPdD("FiltroDisabilitazione", sPD.getFiltroDisabilitazioneList());
  2576.             }
  2577.            
  2578.             // PortaApplicativa
  2579.             if(s.getPortaApplicativa()!=null){
  2580.                 StatoServiziPddPortaApplicativa sPA = s.getPortaApplicativa();
  2581.                
  2582.                 StatoFunzionalita portaApplicativa = sPA.getStato();
  2583.                 // XSD: abilitato, disabilitato
  2584.                 if ((portaApplicativa != null) && !portaApplicativa.equals(CostantiConfigurazione.ABILITATO) && !portaApplicativa.equals(CostantiConfigurazione.DISABILITATO))
  2585.                     this.errori.add("Il valore 'porta_applicativa' della configurazione per quanto concerne i servizi attivi sulla porta (PA) deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2586.                             " o "+CostantiConfigurazione.DISABILITATO);
  2587.                
  2588.                 validaFiltriStatoServiziPdD("FiltroAbilitazione", sPA.getFiltroAbilitazioneList());
  2589.                 validaFiltriStatoServiziPdD("FiltroDisabilitazione", sPA.getFiltroDisabilitazioneList());
  2590.             }
  2591.            
  2592.             // IntegrationManager
  2593.             if(s.getIntegrationManager()!=null){
  2594.                 StatoServiziPddIntegrationManager sIM = s.getIntegrationManager();
  2595.                
  2596.                 StatoFunzionalita integrationManager = sIM.getStato();
  2597.                 // XSD: abilitato, disabilitato
  2598.                 if ((integrationManager != null) && !integrationManager.equals(CostantiConfigurazione.ABILITATO) && !integrationManager.equals(CostantiConfigurazione.DISABILITATO))
  2599.                     this.errori.add("Il valore 'integration_manager' della configurazione per quanto concerne i servizi attivi sulla porta (IM) assumere i valori "+CostantiConfigurazione.ABILITATO+
  2600.                             " o "+CostantiConfigurazione.DISABILITATO);
  2601.             }
  2602.            
  2603.         }
  2604.        
  2605.     }

  2606.     private void validaCache(Cache cache, String posizione){
  2607.         // Dimensione
  2608.         if(cache.getDimensione()!=null){
  2609.             try{
  2610.                 Integer.parseInt(cache.getDimensione());
  2611.             }catch(Exception e){
  2612.                 this.errori.add("Il valore associato alla dimensione della cache ["+posizione+"] dev'essere un numero intero");
  2613.             }
  2614.         }
  2615.        
  2616.         // XSD: algoritmo: lru, mru
  2617.         AlgoritmoCache algoritmo = cache.getAlgoritmo();
  2618.         if ((algoritmo != null) && !algoritmo.equals(CostantiConfigurazione.CACHE_LRU) && !algoritmo.equals(CostantiConfigurazione.CACHE_MRU))
  2619.             this.errori.add("L'algoritmo dell'accesso alla cache ["+posizione+"] dev'essere "+CostantiConfigurazione.CACHE_LRU+" o "+CostantiConfigurazione.CACHE_MRU);
  2620.        
  2621.         // ItemIdleTime
  2622.         if(cache.getItemIdleTime()!=null){
  2623.             try{
  2624.                 Long.parseLong(cache.getItemIdleTime());
  2625.             }catch(Exception e){
  2626.                 this.errori.add("Il valore associato all'item-idle-time della cache  ["+posizione+"] dev'essere un numero intero");
  2627.             }
  2628.         }
  2629.        
  2630.         // ItemLifeSecond
  2631.         if(cache.getItemLifeSecond()!=null){
  2632.             try{
  2633.                 Long.parseLong(cache.getItemLifeSecond());
  2634.             }catch(Exception e){
  2635.                 this.errori.add("Il valore associato all'item-life-seconds della cache ["+posizione+"] dev'essere un numero intero");
  2636.             }
  2637.         }
  2638.     }
  2639.    
  2640.     private void validaFiltriStatoServiziPdD(String tipologiaFiltri,List<TipoFiltroAbilitazioneServizi> lista){
  2641.         if(lista!=null){
  2642.             for (int j = 0; j < lista.size(); j++) {
  2643.                 @SuppressWarnings("unused")
  2644.                 TipoFiltroAbilitazioneServizi filtro = lista.get(j);
  2645.                
  2646. //              if ((filtro.getTipoSoggettoFruitore() != null) && !filtro.getTipoSoggettoFruitore().equals(CostantiConfigurazione.ABILITATO) && !filtro.getTipoSoggettoFruitore().equals(CostantiConfigurazione.DISABILITATO))
  2647. //                  this.errori.add("Il valore 'tipo_soggetto_fruitore' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2648. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2649. //              if ((filtro.getSoggettoFruitore() != null) && !filtro.getSoggettoFruitore().equals(CostantiConfigurazione.ABILITATO) && !filtro.getSoggettoFruitore().equals(CostantiConfigurazione.DISABILITATO))
  2650. //                  this.errori.add("Il valore 'soggetto_fruitore' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2651. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2652. //              if ((filtro.getIdentificativoPortaFruitore() != null) && !filtro.getIdentificativoPortaFruitore().equals(CostantiConfigurazione.ABILITATO) && !filtro.getIdentificativoPortaFruitore().equals(CostantiConfigurazione.DISABILITATO))
  2653. //                  this.errori.add("Il valore 'identificativo_porta_fruitore' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2654. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2655. //              
  2656. //              if ((filtro.getTipoSoggettoErogatore() != null) && !filtro.getTipoSoggettoErogatore().equals(CostantiConfigurazione.ABILITATO) && !filtro.getTipoSoggettoErogatore().equals(CostantiConfigurazione.DISABILITATO))
  2657. //                  this.errori.add("Il valore 'tipo_soggetto_erogatore' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2658. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2659. //              if ((filtro.getSoggettoErogatore() != null) && !filtro.getSoggettoErogatore().equals(CostantiConfigurazione.ABILITATO) && !filtro.getSoggettoErogatore().equals(CostantiConfigurazione.DISABILITATO))
  2660. //                  this.errori.add("Il valore 'soggetto_erogatore' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2661. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2662. //              if ((filtro.getIdentificativoPortaErogatore() != null) && !filtro.getIdentificativoPortaErogatore().equals(CostantiConfigurazione.ABILITATO) && !filtro.getIdentificativoPortaErogatore().equals(CostantiConfigurazione.DISABILITATO))
  2663. //                  this.errori.add("Il valore 'identificativo_porta_erogatore' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2664. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2665. //              
  2666. //              if ((filtro.getTipoServizio() != null) && !filtro.getTipoServizio().equals(CostantiConfigurazione.ABILITATO) && !filtro.getTipoServizio().equals(CostantiConfigurazione.DISABILITATO))
  2667. //                  this.errori.add("Il valore 'tipo_servizio' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2668. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2669. //              if ((filtro.getServizio() != null) && !filtro.getServizio().equals(CostantiConfigurazione.ABILITATO) && !filtro.getServizio().equals(CostantiConfigurazione.DISABILITATO))
  2670. //                  this.errori.add("Il valore 'servizio' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2671. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2672. //              
  2673. //              if ((filtro.getAzione() != null) && !filtro.getAzione().equals(CostantiConfigurazione.ABILITATO) && !filtro.getAzione().equals(CostantiConfigurazione.DISABILITATO))
  2674. //                  this.errori.add("Il valore 'azione' del filtro["+j+"] (tipologia:"+tipologiaFiltri+") della configurazione per quanto concerne  i servizi attivi sulla porta deve assumere i valori "+CostantiConfigurazione.ABILITATO+
  2675. //                          " o "+CostantiConfigurazione.DISABILITATO);
  2676.             }
  2677.         }
  2678.     }
  2679.    
  2680.     private void validaRotta(Route route,String tipo,AccessoRegistro ar) throws DriverConfigurazioneException{
  2681.         if(route.getGateway()==null && route.getRegistro()==null){
  2682.             this.errori.add("(RoutingTable) è stata definita una rotta "+tipo+" senza aver specificato ne un Gateway ne un Registro");
  2683.         }
  2684.         else if(route.getGateway()!=null && route.getRegistro()!=null){
  2685.             this.errori.add("(RoutingTable) è stata definita una rotta "+tipo+" che possiede sia un Gateway che un Registro (Solo un tipo deve essere selezionato)");
  2686.         }
  2687.         else if(route.getGateway()!=null){
  2688.             if(route.getGateway().getNome()==null){
  2689.                 this.errori.add("(RoutingTable) è stata definita una rotta "+tipo+" senza aver specificato il nome del soggetto Gateway");
  2690.             }
  2691.             if(route.getGateway().getTipo()==null){
  2692.                 this.errori.add("(RoutingTable) è stata definita una rotta "+tipo+" senza aver specificato il tipo del soggetto Gateway");
  2693.             }
  2694.         }else {
  2695.             if(route.getRegistro().getNome()!=null){
  2696.                 if(ar!=null){
  2697.                     // Il nome del registro non è obbligatorio: se non definito equivale a cercare in tutti
  2698.                     boolean trovato = false;
  2699.                     for(int i=0; i<ar.sizeRegistroList();i++){
  2700.                         if (ar.getRegistro(i).getNome().equals(route.getRegistro().getNome())){
  2701.                             trovato = true;
  2702.                             break;
  2703.                         }
  2704.                     }
  2705.                     if(!trovato){
  2706.                         this.errori.add("(RoutingTable) è stata definita una rotta "+tipo+" per cui è stata specificato un registro ["+route.getRegistro().getNome()+"] non esistente neella configurazione");
  2707.                     }
  2708.                 }else{
  2709.                     // errore gestito nella validazione della configurazione di accesso al registro
  2710.                 }
  2711.             }
  2712.         }
  2713.     }
  2714.    
  2715.     private  void validaMessageSecurity(MessageSecurity messageSecurity,String idOggetto) throws DriverConfigurazioneException {
  2716.         // Ogni elemento definito nella RequestFlow deve avere un nome univoco.
  2717.         // Ogni elemento definito nella ResponseFlow deve avere un nome univoco.
  2718.         if(messageSecurity.getRequestFlow()!=null){
  2719.             MessageSecurityFlow messageSecurityFlow = messageSecurity.getRequestFlow();
  2720.             for (int j=0; j<messageSecurityFlow.sizeParameterList();j++) {
  2721.                 MessageSecurityFlowParameter securityParameter = messageSecurityFlow.getParameter(j);
  2722.                
  2723.                 if(securityParameter.getNome()==null){
  2724.                     this.errori.add("("+idOggetto+" MessageSecurity) Nella request-flow esiste una proprieta' per cui non e' stato definito il nome");
  2725.                 }
  2726.                 if(securityParameter.getValore()==null){
  2727.                     this.errori.add("("+idOggetto+" MessageSecurity) Nella request-flow esiste una proprieta' per cui non e' stato definito il valore");
  2728.                 }
  2729.                
  2730.                 int numRF = 0;
  2731.                 for(int k=0; k<messageSecurityFlow.sizeParameterList();k++){
  2732.                     MessageSecurityFlowParameter tmpSecurityParameter = messageSecurityFlow.getParameter(k);
  2733.                     if ((securityParameter.getNome()).equals(tmpSecurityParameter.getNome()))
  2734.                         numRF++;
  2735.                 }
  2736.                 if (numRF > 1)
  2737.                     this.errori.add("("+idOggetto+" MessageSecurity) Nella request-flow non può esistere più di una proprieta' con lo stess nome "+securityParameter.getNome());
  2738.             }
  2739.         }
  2740.         if(messageSecurity.getResponseFlow()!=null){
  2741.             MessageSecurityFlow messageSecurityFlow = messageSecurity.getResponseFlow();
  2742.             for (int j=0; j<messageSecurityFlow.sizeParameterList();j++) {
  2743.                 MessageSecurityFlowParameter securityParameter = messageSecurityFlow.getParameter(j);
  2744.                
  2745.                 if(securityParameter.getNome()==null){
  2746.                     this.errori.add("("+idOggetto+" MessageSecurity) Nella response-flow esiste una proprieta' per cui non e' stato definito il nome");
  2747.                 }
  2748.                 if(securityParameter.getValore()==null){
  2749.                     this.errori.add("("+idOggetto+" MessageSecurity) Nella response-flow esiste una proprieta' per cui non e' stato definito il valore");
  2750.                 }
  2751.                
  2752.                 int numRF = 0;
  2753.                 for(int k=0; k<messageSecurityFlow.sizeParameterList();k++){
  2754.                     MessageSecurityFlowParameter tmpSecurityParameter = messageSecurityFlow.getParameter(k);
  2755.                     if ((securityParameter.getNome()).equals(tmpSecurityParameter.getNome()))
  2756.                         numRF++;
  2757.                 }
  2758.                 if (numRF > 1)
  2759.                     this.errori.add("("+idOggetto+" MessageSecurity) Nella response-flow non può esistere più di una proprieta' con lo stess nome "+securityParameter.getNome());
  2760.             }
  2761.         }
  2762.     }
  2763.    
  2764.     private  void validaMTOM(MtomProcessor mtomProcessor,String idOggetto) throws DriverConfigurazioneException {
  2765.         // Ogni elemento definito nella RequestFlow deve avere un nome univoco.
  2766.         // Ogni elemento definito nella ResponseFlow deve avere un nome univoco.
  2767.         if(mtomProcessor.getRequestFlow()!=null){
  2768.             MtomProcessorFlow mtomtFlow = mtomProcessor.getRequestFlow();
  2769.             for (int j=0; j<mtomtFlow.sizeParameterList();j++) {
  2770.                 MtomProcessorFlowParameter mtomtFlowParameter = mtomtFlow.getParameter(j);
  2771.                
  2772.                 if(mtomtFlowParameter.getNome()==null){
  2773.                     this.errori.add("("+idOggetto+" MTOM-Processor) Nella request-flow esiste una proprieta' per cui non e' stato definito il nome");
  2774.                 }
  2775.                 if(mtomtFlowParameter.getPattern()==null){
  2776.                     this.errori.add("("+idOggetto+" MTOM-Processor) Nella request-flow esiste una proprieta' per cui non e' stato definito il valore");
  2777.                 }
  2778.                
  2779.                 int numRF = 0;
  2780.                 for(int k=0; k<mtomtFlow.sizeParameterList();k++){
  2781.                     MtomProcessorFlowParameter tmpMtomtFlowParameter = mtomtFlow.getParameter(k);
  2782.                     if ((mtomtFlowParameter.getNome()).equals(tmpMtomtFlowParameter.getNome()))
  2783.                         numRF++;
  2784.                 }
  2785.                 if (numRF > 1)
  2786.                     this.errori.add("("+idOggetto+" MTOM-Processor) Nella request-flow non può esistere più di una proprieta' con lo stess nome "+mtomtFlowParameter.getNome());
  2787.             }
  2788.         }
  2789.         if(mtomProcessor.getResponseFlow()!=null){
  2790.             MtomProcessorFlow mtomFlow = mtomProcessor.getResponseFlow();
  2791.             for (int j=0; j<mtomFlow.sizeParameterList();j++) {
  2792.                 MtomProcessorFlowParameter mtomtFlowParameter = mtomFlow.getParameter(j);
  2793.                
  2794.                 if(mtomtFlowParameter.getNome()==null){
  2795.                     this.errori.add("("+idOggetto+" MTOM-Processor) Nella response-flow esiste una proprieta' per cui non e' stato definito il nome");
  2796.                 }
  2797.                 if(mtomtFlowParameter.getPattern()==null){
  2798.                     this.errori.add("("+idOggetto+" MTOM-Processor) Nella response-flow esiste una proprieta' per cui non e' stato definito il valore");
  2799.                 }
  2800.                
  2801.                 int numRF = 0;
  2802.                 for(int k=0; k<mtomFlow.sizeParameterList();k++){
  2803.                     MtomProcessorFlowParameter tmpMtomtFlowParameter = mtomFlow.getParameter(k);
  2804.                     if ((mtomtFlowParameter.getNome()).equals(tmpMtomtFlowParameter.getNome()))
  2805.                         numRF++;
  2806.                 }
  2807.                 if (numRF > 1)
  2808.                     this.errori.add("("+idOggetto+" MTOM-Processor) Nella response-flow non può esistere più di una proprieta' con lo stess nome "+mtomtFlowParameter.getNome());
  2809.             }
  2810.         }
  2811.     }

  2812.     private  void validazioneValidazioneContenutiApplicativi(ValidazioneContenutiApplicativi vca,String tipo) throws DriverConfigurazioneException {
  2813.         // Se stato = disabilitato, il tipo puo' non  essere presente
  2814.         // Se stato = abilitato o warningOnly il tipo deve essere presente con uno dei valori definiti nel xsd
  2815.         StatoFunzionalitaConWarning stato = vca.getStato();
  2816.         if ((stato != null) && !stato.equals(CostantiConfigurazione.STATO_CON_WARNING_ABILITATO) &&
  2817.                 !stato.equals(CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO) &&
  2818.                 !stato.equals(CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY))
  2819.             this.errori.add("Lo stato della validazione contenuti applicativi ("+tipo+") deve possedere uno dei seguenti valori: "+CostantiConfigurazione.STATO_CON_WARNING_ABILITATO+
  2820.                     ", "+CostantiConfigurazione.STATO_CON_WARNING_DISABILITATO+
  2821.                     " o "+CostantiConfigurazione.STATO_CON_WARNING_WARNING_ONLY);
  2822.            
  2823.         ValidazioneContenutiApplicativiTipo tipoV = vca.getTipo();
  2824.         // XSD: tipo: wsdl, openspcoop, xsd
  2825.         if ((tipoV != null) && !tipoV.equals(CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_OPENSPCOOP) &&
  2826.                 !tipoV.equals(CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE) &&
  2827.                 !tipoV.equals(CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_XSD))
  2828.             this.errori.add("Il tipo di validazione contenuti applicativi da attuare ("+tipo+") deve possedere uno dei seguenti valori: " +
  2829.                     CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_XSD+", "+
  2830.                     CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_INTERFACE+" o "+
  2831.                     CostantiConfigurazione.VALIDAZIONE_CONTENUTI_APPLICATIVI_OPENSPCOOP);
  2832.     }

  2833.     private  void validaProtocolProperty(Proprieta ssp, String oggetto) throws DriverConfigurazioneException {
  2834.         // Controlli sui valori definiti nell'xsd.

  2835.         if(ssp.getNome()==null){
  2836.             this.errori.add("Esiste una ProprietaProtocollo della porta "+oggetto+" che non contiene la definizione del nome");
  2837.         }
  2838.         if(ssp.getValore()==null){
  2839.             this.errori.add("Esiste una ProprietaProtocollo della porta "+oggetto+" che non contiene la definizione del valore");
  2840.         }
  2841.        
  2842.         // XSD: valore: mittente, tipoMittente, destinatario, tipoDestinatario, servizio, tipoServizio, azione, identificativo
  2843.         String valore = ssp.getValore();
  2844.         if(valore==null){
  2845.             this.errori.add("Il valore della ProprietaProtocollo "+ssp.getNome()+" della porta applicativa "+oggetto+" non e' valorizzato");
  2846.         }
  2847.         // Il check sopra esclude la possibilita' di avere un qualsiasi valore, possibilita' offerta anche dall'interfaccia grafica
  2848.         /*
  2849.         if ((valore != null) && !valore.equals(ProprietaProtocolloValore.MITTENTE.toString()) &&
  2850.                 !valore.equals(ProprietaProtocolloValore.TIPO_MITTENTE.toString()) &&
  2851.                 !valore.equals(ProprietaProtocolloValore.DESTINATARIO.toString()) &&
  2852.                 !valore.equals(ProprietaProtocolloValore.TIPO_DESTINATARIO.toString()) &&
  2853.                 !valore.equals(ProprietaProtocolloValore.SERVIZIO.toString()) &&
  2854.                 !valore.equals(ProprietaProtocolloValore.TIPO_SERVIZIO.toString()) &&
  2855.                 !valore.equals(ProprietaProtocolloValore.AZIONE.toString()) &&
  2856.                 !valore.equals(ProprietaProtocolloValore.IDENTIFICATIVO.toString()))
  2857.             this.errori.add("Il valore della ProprietaProtocollo "+ssp.getNome()+" della porta applicativa "+oggetto+" dev'essere mittente, tipoMittente, destinatario, tipoDestinatario, servizio, tipoServizio, azione o identificativo");
  2858.             */
  2859.     }

  2860.     private  void validaCredenziale(Credenziali c, String oggetto) throws DriverConfigurazioneException {
  2861.         // Se il tipo e' basic, username e password sono OBBLIGATORI
  2862.        
  2863.         CredenzialeTipo tipo = CostantiConfigurazione.CREDENZIALE_SSL;
  2864.         if(c.getTipo()!=null){
  2865.             tipo = c.getTipo();
  2866.         }
  2867.         if ( !tipo.equals(CostantiConfigurazione.CREDENZIALE_BASIC) &&
  2868.                 !tipo.equals(CostantiConfigurazione.CREDENZIALE_APIKEY) &&
  2869.                 !tipo.equals(CostantiConfigurazione.CREDENZIALE_SSL) &&
  2870.                 !tipo.equals(CostantiConfigurazione.CREDENZIALE_PRINCIPAL) &&
  2871.                 !tipo.equals(CostantiConfigurazione.CREDENZIALE_TOKEN)  )
  2872.             this.errori.add("Il tipo delle credenziali del "+oggetto+" deve possedere i valori: "+
  2873.                 CostantiConfigurazione.CREDENZIALE_BASIC.toString()+" o "+
  2874.                 CostantiConfigurazione.CREDENZIALE_APIKEY.toString()+" o "+
  2875.                     CostantiConfigurazione.CREDENZIALE_SSL.toString()+" o "+
  2876.                     CostantiConfigurazione.CREDENZIALE_PRINCIPAL.toString()+" o "+
  2877.                     CostantiConfigurazione.CREDENZIALE_TOKEN.toString());
  2878.        
  2879.        
  2880.         if (c.getTipo().equals(CostantiConfigurazione.CREDENZIALE_BASIC)) {
  2881.             if ((c.getUser() == null) || (c.getUser().equals("")) || (c.getPassword() == null) || (c.getPassword().equals("")))
  2882.                 this.errori.add("Le credenziali di tipo basic del "+oggetto+" devono avere username e password valorizzati");
  2883.         }
  2884.         if (c.getTipo().equals(CostantiConfigurazione.CREDENZIALE_APIKEY)) {
  2885.             if ((c.getUser() == null) || (c.getUser().equals("")) || (c.getPassword() == null) || (c.getPassword().equals("")))
  2886.                 this.errori.add("Le credenziali di tipo apikey del "+oggetto+" devono avere username e password valorizzati");
  2887.         }

  2888.         // Se il tipo e' ssl, subject e' OBBLIGATORIO
  2889.         if (c.getTipo().equals(CostantiConfigurazione.CREDENZIALE_SSL)){
  2890.             if (
  2891.                     (c.getSubject() == null || c.getSubject().equals(""))
  2892.                     &&
  2893.                     c.getCertificate()==null
  2894.             ){
  2895.                 this.errori.add("Le credenziali di tipo ssl del "+oggetto+" devono avere subject o certificate valorizzato");
  2896.             }else{
  2897.                 if(c.getSubject()!=null && !"".equals(c.getSubject())) {
  2898.                     try{
  2899.                         CertificateUtils.validaPrincipal(c.getSubject(), PrincipalType.SUBJECT);
  2900.                     }catch(Exception e){
  2901.                         this.errori.add("Le credenziali di tipo ssl del "+oggetto+" possiedono un subject non valido: "+e.getMessage());
  2902.                     }
  2903.                 }
  2904.                 if(c.getIssuer()!=null && !"".equals(c.getIssuer())) {
  2905.                     try{
  2906.                         CertificateUtils.validaPrincipal(c.getIssuer(), PrincipalType.ISSUER);
  2907.                     }catch(Exception e){
  2908.                         this.errori.add("Le credenziali di tipo ssl del "+oggetto+" possiedono un issuer non valido: "+e.getMessage());
  2909.                     }
  2910.                 }
  2911.             }
  2912.         }
  2913.            
  2914.         // Se il tipo e' principal, user e' OBBLIGATORIO
  2915.         if (c.getTipo().equals(CostantiConfigurazione.CREDENZIALE_PRINCIPAL)){
  2916.             if ((c.getUser() == null) || (c.getUser().equals(""))){
  2917.                 this.errori.add("Le credenziali di tipo principal del "+oggetto+" devono avere user valorizzato");
  2918.             }
  2919.         }
  2920.        
  2921.         // Se il tipo e' token, user e token_policy e' OBBLIGATORIO
  2922.         if (c.getTipo().equals(CostantiConfigurazione.CREDENZIALE_TOKEN)){
  2923.             if ((c.getUser() == null) || (c.getUser().equals(""))){
  2924.                 this.errori.add("Le credenziali di tipo token del "+oggetto+" devono avere user valorizzato");
  2925.             }
  2926.             if ((c.getTokenPolicy() == null) || (c.getTokenPolicy().equals(""))){
  2927.                 this.errori.add("Le credenziali di tipo token del "+oggetto+" devono avere token-policy valorizzato");
  2928.             }
  2929.         }
  2930.        
  2931.     }
  2932.    
  2933.     private  void validaCredenziale(InvocazioneCredenziali c, String oggetto) throws DriverConfigurazioneException {
  2934.         // Se il tipo e' basic, username e password sono OBBLIGATORI
  2935.        
  2936.         if ((c.getUser() == null) || (c.getUser().equals("")) || (c.getPassword() == null) || (c.getPassword().equals("")))
  2937.             this.errori.add("Le credenziali di tipo basic del "+oggetto+" devono avere username e password valorizzati");
  2938.        
  2939.     }

  2940.     private void validaGestioneErrore(GestioneErrore ge,String tipo) throws DriverConfigurazioneException {
  2941.        
  2942.         // Ogni elemento codice-trasporto DEVE possedere ALMENO o un valore minimo o un valore massimo.
  2943.         for(int j=0; j<ge.sizeCodiceTrasportoList();j++){
  2944.             GestioneErroreCodiceTrasporto gect = ge.getCodiceTrasporto(j);
  2945.             if (gect.getValoreMinimo() == null || gect.getValoreMassimo() == null)
  2946.                 this.errori.add("Gli elementi codice-trasporto devono possedere almeno un valore minimo o un valore massimo");

  2947.             if (gect.getValoreMinimo()!=null && gect.getValoreMinimo().longValue() <0){
  2948.                 this.errori.add("Il valore minimo di un codice-trasporto associato alla gestione errore ("+tipo+"), dev'essere un numero intero >= 0 (Attualemente:"+gect.getValoreMinimo().longValue()+")");
  2949.             }
  2950.             if (gect.getValoreMassimo()!=null && gect.getValoreMassimo().longValue() <=0){
  2951.                 this.errori.add("Il valore massimo di un codice-trasporto associato alla gestione errore ("+tipo+"), dev'essere un numero intero > 0 (Attualemente:"+gect.getValoreMassimo().longValue()+")");
  2952.             }
  2953.             if (gect.getValoreMassimo()!=null && gect.getValoreMinimo().longValue()>=0 &&
  2954.                     gect.getValoreMinimo()!=null && gect.getValoreMassimo().longValue()>0){
  2955.                 if(gect.getValoreMassimo().longValue()<gect.getValoreMinimo().longValue()){
  2956.                     this.errori.add("Il valore massimo di un codice-trasporto associato alla gestione errore ("+tipo+"), dev'essere un numero intero maggiore del valore associate al valore minimo (Attualemente max:"+gect.getValoreMassimo().longValue()+" min:"+gect.getValoreMinimo().longValue()+")");
  2957.                 }
  2958.             }
  2959.            
  2960.             // XSD: comportamento: accetta, rispedisci
  2961.             GestioneErroreComportamento comportamento = gect.getComportamento();
  2962.             if(comportamento==null){
  2963.                 this.errori.add("Non e' stato definito il comportamento di adottato per la gestione errore ("+tipo+") per un codice-trasporto");
  2964.             }else{
  2965.                 if ( !comportamento.equals(CostantiConfigurazione.GESTIONE_ERRORE_ACCETTA_MSG) && !comportamento.equals(CostantiConfigurazione.GESTIONE_ERRORE_RISPEDISCI_MSG))
  2966.                     this.errori.add("Il comportamento associato alla gestione errore ("+tipo+"-CodiceTrasporto) deve assumere uno dei seguenti valori: "+
  2967.                             CostantiConfigurazione.GESTIONE_ERRORE_ACCETTA_MSG+" o "+CostantiConfigurazione.GESTIONE_ERRORE_RISPEDISCI_MSG);
  2968.             }
  2969.            
  2970.             // Cadenza rispedizione
  2971.             if(gect.getCadenzaRispedizione()!=null){
  2972.                 try{
  2973.                     Long.parseLong(gect.getCadenzaRispedizione());
  2974.                 }catch(Exception e){
  2975.                     this.errori.add("Il valore della cadenza di rispedizione associato alla gestione errore ("+tipo+") per un codice-trasporto, dev'essere un numero intero");
  2976.                 }
  2977.             }
  2978.         }

  2979.         // Ogni elemento soap-fault deve essere univoco. L'elemento viene identificato dalla tripla (fault-actor,fault-code,fault-string). In caso alcuni dei tre attributi (anche tutti) non sono definiti, per il controllo di univocita' devono essere considerati come elementi speciali 'NULL'
  2980.         for(int j=0; j<ge.sizeSoapFaultList();j++){
  2981.            
  2982.             GestioneErroreSoapFault gesf = ge.getSoapFault(j);
  2983.            
  2984.             String identificativo = "";
  2985.             if (gesf.getFaultActor() == null)
  2986.                 identificativo = "NULL-";
  2987.             else
  2988.                 identificativo = gesf.getFaultActor()+"-";
  2989.             if (gesf.getFaultCode() == null)
  2990.                 identificativo = identificativo+"NULL-";
  2991.             else
  2992.                 identificativo = identificativo+""+gesf.getFaultCode()+"-";
  2993.             if (gesf.getFaultString() == null)
  2994.                 identificativo = identificativo+"NULL";
  2995.             else
  2996.                 identificativo = identificativo+""+gesf.getFaultString();
  2997.             int numSF = 0;
  2998.             for (int k=0; k<ge.sizeSoapFaultList(); k++) {
  2999.                 GestioneErroreSoapFault tmpGesf = ge.getSoapFault(k);
  3000.                 String tmpId = "";
  3001.                 if (tmpGesf.getFaultActor() == null)
  3002.                     tmpId = "NULL-";
  3003.                 else
  3004.                     tmpId = tmpGesf.getFaultActor()+"-";
  3005.                 if (tmpGesf.getFaultCode() == null)
  3006.                     tmpId = tmpId+"NULL-";
  3007.                 else
  3008.                     tmpId = tmpId+""+tmpGesf.getFaultCode()+"-";
  3009.                 if (tmpGesf.getFaultString() == null)
  3010.                     tmpId = tmpId+"NULL";
  3011.                 else
  3012.                     tmpId = tmpId+""+tmpGesf.getFaultString();
  3013.                 if (identificativo.equals(tmpId))
  3014.                     numSF++;
  3015.             }
  3016.             if (numSF > 1)
  3017.                 this.errori.add("Non può esistere più di un elemento soap-fault con identificativo "+identificativo+" associato alla gestione errore ("+tipo+")");

  3018.             // XSD: comportamento: accetta, rispedisci
  3019.             GestioneErroreComportamento comportamento = gesf.getComportamento();
  3020.             if(comportamento==null){
  3021.                 this.errori.add("Non e' stato definito il comportamento di adottato per la gestione errore ("+tipo+") per un soap-fault");
  3022.             }else{
  3023.                 if ( !comportamento.equals(CostantiConfigurazione.GESTIONE_ERRORE_ACCETTA_MSG) && !comportamento.equals(CostantiConfigurazione.GESTIONE_ERRORE_RISPEDISCI_MSG))
  3024.                     this.errori.add("Il comportamento associato alla gestione errore ("+tipo+"-SoapFault) deve assumere uno dei seguenti valori: "+
  3025.                             CostantiConfigurazione.GESTIONE_ERRORE_ACCETTA_MSG+" o "+CostantiConfigurazione.GESTIONE_ERRORE_RISPEDISCI_MSG);
  3026.             }
  3027.            
  3028.             // Cadenza rispedizione
  3029.             if(gesf.getCadenzaRispedizione()!=null){
  3030.                 try{
  3031.                     Long.parseLong(gesf.getCadenzaRispedizione());
  3032.                 }catch(Exception e){
  3033.                     this.errori.add("Il valore della cadenza di rispedizione associato alla gestione errore ("+tipo+") per un soap-fault, dev'essere un numero intero");
  3034.                 }
  3035.             }
  3036.         }

  3037.        
  3038.         // XSD: comportamento: accetta, rispedisci
  3039.         GestioneErroreComportamento comportamento = ge.getComportamento();
  3040.         if(comportamento==null){
  3041.             this.errori.add("Non e' stato definito il comportamento di default adottato per la gestione errore ("+tipo+")");
  3042.         }else{
  3043.             if (!comportamento.equals(CostantiConfigurazione.GESTIONE_ERRORE_ACCETTA_MSG) && !comportamento.equals(CostantiConfigurazione.GESTIONE_ERRORE_RISPEDISCI_MSG))
  3044.                 this.errori.add("Il comportamento di default associato alla gestione errore ("+tipo+") deve assumere uno dei seguenti valori: "+
  3045.                         CostantiConfigurazione.GESTIONE_ERRORE_ACCETTA_MSG+" o "+CostantiConfigurazione.GESTIONE_ERRORE_RISPEDISCI_MSG);
  3046.         }
  3047.        
  3048.         // Cadenza rispedizione
  3049.         if(ge.getCadenzaRispedizione()!=null){
  3050.             try{
  3051.                 Long.parseLong(ge.getCadenzaRispedizione());
  3052.             }catch(Exception e){
  3053.                 this.errori.add("Il valore della cadenza di rispedizione di default associato alla gestione errore ("+tipo+"), dev'essere un numero intero");
  3054.             }
  3055.         }
  3056.     }







  3057.     /* ------------------ UTILITY ------------------------------*/

  3058.     /*
  3059.     private boolean existsSoggetto(String tipo,String nome){
  3060.         return this.getSoggetto(tipo, nome)!=null;
  3061.     }
  3062.     private Soggetto getSoggetto(String tipo,String nome){
  3063.         for(int j=0; j<this.configurazione.sizeSoggettoList();j++){
  3064.             Soggetto ss = this.configurazione.getSoggetto(j);
  3065.             if (tipo.equals(ss.getTipo()) && nome.equals(ss.getNome())) {
  3066.                 return ss;
  3067.             }
  3068.         }
  3069.         return null;
  3070.     }*/
  3071.    
  3072.     private boolean existsServizioApplicativo(String nome,Soggetto soggetto){
  3073.         return this.getServizioApplicativo(nome,soggetto)!=null;
  3074.     }
  3075.     private ServizioApplicativo getServizioApplicativo(String nome,Soggetto soggetto){
  3076.         for(int j=0; j<soggetto.sizeServizioApplicativoList();j++){
  3077.             ServizioApplicativo sa = soggetto.getServizioApplicativo(j);
  3078.             if (nome.equals(sa.getNome())) {
  3079.                 return sa;
  3080.             }
  3081.         }
  3082.         return null;
  3083.     }

  3084. }