PolicyVerifier.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.pdd.core.controllo_traffico.policy;

  21. import java.util.Date;
  22. import java.util.List;

  23. import org.apache.commons.lang.StringUtils;
  24. import org.openspcoop2.core.commons.CoreException;
  25. import org.openspcoop2.core.config.PortaApplicativa;
  26. import org.openspcoop2.core.config.PortaDelegata;
  27. import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
  28. import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
  29. import org.openspcoop2.core.controllo_traffico.beans.ActivePolicy;
  30. import org.openspcoop2.core.controllo_traffico.beans.DatiCollezionati;
  31. import org.openspcoop2.core.controllo_traffico.beans.DatiTransazione;
  32. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  33. import org.openspcoop2.core.controllo_traffico.beans.RisultatoStatistico;
  34. import org.openspcoop2.core.controllo_traffico.beans.RisultatoStato;
  35. import org.openspcoop2.core.controllo_traffico.beans.UniqueIdentifierUtilities;
  36. import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
  37. import org.openspcoop2.core.controllo_traffico.constants.TipoApplicabilita;
  38. import org.openspcoop2.core.controllo_traffico.constants.TipoControlloPeriodo;
  39. import org.openspcoop2.core.controllo_traffico.constants.TipoFinestra;
  40. import org.openspcoop2.core.controllo_traffico.constants.TipoRisorsa;
  41. import org.openspcoop2.core.controllo_traffico.driver.IGestorePolicyAttive;
  42. import org.openspcoop2.core.controllo_traffico.driver.PolicyGroupByActiveThreadsType;
  43. import org.openspcoop2.core.controllo_traffico.utils.PolicyUtilities;
  44. import org.openspcoop2.core.eventi.constants.CodiceEventoControlloTraffico;
  45. import org.openspcoop2.core.eventi.constants.TipoEvento;
  46. import org.openspcoop2.core.id.IDPortaApplicativa;
  47. import org.openspcoop2.core.id.IDPortaDelegata;
  48. import org.openspcoop2.core.id.IDServizio;
  49. import org.openspcoop2.core.id.IDSoggetto;
  50. import org.openspcoop2.core.mapping.MappingErogazionePortaApplicativa;
  51. import org.openspcoop2.core.mapping.MappingFruizionePortaDelegata;
  52. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  53. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  54. import org.openspcoop2.pdd.core.PdDContext;
  55. import org.openspcoop2.pdd.core.controllo_traffico.CategoriaEventoControlloTraffico;
  56. import org.openspcoop2.pdd.core.controllo_traffico.ConfigurazioneGatewayControlloTraffico;
  57. import org.openspcoop2.pdd.core.controllo_traffico.DatiTempiRisposta;
  58. import org.openspcoop2.pdd.core.controllo_traffico.GeneratoreMessaggiErrore;
  59. import org.openspcoop2.pdd.core.controllo_traffico.NotificatoreEventi;
  60. import org.openspcoop2.pdd.core.controllo_traffico.RisultatoVerificaPolicy;
  61. import org.openspcoop2.pdd.core.controllo_traffico.policy.config.PolicyConfiguration;
  62. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.GestorePolicyAttive;
  63. import org.openspcoop2.pdd.core.transazioni.Transaction;
  64. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  65. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  66. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  67. import org.openspcoop2.protocol.sdk.ProtocolException;
  68. import org.openspcoop2.protocol.sdk.state.IState;
  69. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  70. import org.openspcoop2.protocol.utils.PorteNamingUtils;
  71. import org.openspcoop2.utils.date.DateManager;
  72. import org.slf4j.Logger;

  73. /**    
  74.  * PolicyVerifier
  75.  *
  76.  * @author Poli Andrea (poli@link.it)
  77.  * @author $Author$
  78.  * @version $Rev$, $Date$
  79.  */
  80. public class PolicyVerifier {
  81.    
  82.     private PolicyVerifier() {}

  83.     private static List<String> listClusterNodes = null;
  84.     public static List<String> getListClusterNodes() {
  85.         return listClusterNodes;
  86.     }
  87.     public static void setListClusterNodes(List<String> listClusterNodes) {
  88.         PolicyVerifier.listClusterNodes = listClusterNodes;
  89.     }

  90.     public static RisultatoVerificaPolicy verifica(
  91.             ConfigurazionePdDManager configPdDManager, IProtocolFactory<?> protocolFactory,
  92.             IGestorePolicyAttive gestorePolicyAttive, PolicyConfiguration policyConfiguration, Logger logCC,
  93.             ActivePolicy activePolicy,
  94.             IDUnivocoGroupByPolicy datiGroupBy, PdDContext pddContext,
  95.             MsgDiagnostico msgDiag,
  96.             Transaction tr,
  97.             DatiTransazione datiTransazione, boolean isPddCongestionata, DatiTempiRisposta tempiRisposta,
  98.             List<Boolean> pddContextPolicyApplicabile, List<Boolean> pddContextPolicyViolata,
  99.             IState state) throws Exception{
  100.                
  101.         RequestInfo requestInfo = null;
  102.         if(tr!=null) {
  103.             requestInfo = tr.getRequestInfo();
  104.         }
  105.        
  106.         // Tutti i restanti controlli sono effettuati usando il valore di datiCollezionatiReaded, che e' gia' stato modificato
  107.         // Inoltre e' stato re-inserito nella map come oggetto nuovo, quindi il valore dentro il metodo non subira' trasformazioni (essendo stato fatto il clone)
  108.         // E' possibile procedere con l'analisi rispetto al valore che possiedono il counter dentro questo scope.
  109.        
  110.         boolean policyAPI = activePolicy.getInstanceConfiguration().getFiltro()!=null &&
  111.                 activePolicy.getInstanceConfiguration().getFiltro().getNomePorta()!=null &&
  112.                 !"".equals(activePolicy.getInstanceConfiguration().getFiltro().getNomePorta());
  113.         boolean policyGlobale = !policyAPI;
  114.        
  115.         // Registro Threads (NOTA: non i contatori, quelli vegono aggiornati )
  116.         if(pddContext!=null && policyConfiguration!=null) {
  117.             PolicyDateUtils.setGestorePolicyConfigDateIntoContext(pddContext, policyConfiguration.getGestorePolicyConfigDate());
  118.         }
  119.         DatiCollezionati datiCollezionatiReaded = gestorePolicyAttive.getActiveThreadsPolicy(activePolicy,datiTransazione, state).
  120.                 registerStartRequest(logCC,datiTransazione.getIdTransazione(),datiGroupBy,pddContext);

  121.            
  122.         // check fatto solamente nel minuto precedente alla creazione dei nuovi Dati
  123.         Date check = new Date(DateManager.getTimeMillis()-(1000*60));
  124.         if(datiCollezionatiReaded.getCreationDate().after(check)) {
  125.             String uniqueIdMap = null;
  126.             for (PolicyGroupByActiveThreadsType tipo : GestorePolicyAttive.getTipiGestoriAttivi()) {
  127.                 if(!tipo.equals(gestorePolicyAttive.getType())) {
  128.                     if(uniqueIdMap==null) {
  129.                         uniqueIdMap = UniqueIdentifierUtilities.getUniqueId(activePolicy.getInstanceConfiguration());
  130.                     }
  131.                     /**System.out.println("RIPULISCO in '"+tipo+"' ["+uniqueIdMap+"] !!!");*/
  132.                     GestorePolicyAttive.getInstance(tipo).removeActiveThreadsPolicyUnsafe(uniqueIdMap);
  133.                 }
  134.             }
  135.         }
  136.        
  137.    
  138.         // Configuro Risultato
  139.         RisultatoVerificaPolicy risultatoVerificaPolicy = new RisultatoVerificaPolicy();
  140.         risultatoVerificaPolicy.setRisorsa(activePolicy.getTipoRisorsaPolicy());
  141.         risultatoVerificaPolicy.setSimultanee(activePolicy.getConfigurazionePolicy().isSimultanee());
  142.         risultatoVerificaPolicy.setWarningOnly(activePolicy.getInstanceConfiguration().isWarningOnly());
  143.         if(TipoApplicabilita.CONDIZIONALE.equals(activePolicy.getConfigurazionePolicy().getTipoApplicabilita())){
  144.             risultatoVerificaPolicy.setApplicabilitaCongestione(activePolicy.getConfigurazionePolicy().isApplicabilitaConCongestione());
  145.             risultatoVerificaPolicy.setApplicabilitaDegradoPrestazionale(activePolicy.getConfigurazionePolicy().isApplicabilitaDegradoPrestazionale());
  146.             risultatoVerificaPolicy.setApplicabilitaStatoAllarme(activePolicy.getConfigurazionePolicy().isApplicabilitaStatoAllarme());
  147.         }
  148.        
  149.        
  150.         GestoreCacheControlloTraffico gestoreCacheControlloTraffico = GestoreCacheControlloTraffico.getInstance();
  151.        
  152.        
  153.         boolean violazionePolicy = false;
  154.         boolean violazionePolicyWarningOnly = false;
  155.         Date dataEventoPolicyViolated = null;
  156.         String descriptionPolicyViolated = null; // non è definibile una descrizione, poichè si riferisce ad un evento qualsiasi di questo tipo
  157.    
  158.         /**System.out.println("ATTUALI THREADS: "+counter);*/
  159.    
  160.         try{
  161.        
  162.             Date now = datiCollezionatiReaded.getCloneDate(); // Data in cui sono stati prelevati gli intervalli.
  163.            
  164.            
  165.             // Imposto Dati Comuni
  166.             // questa info finisce nel diagnostico di una transazione, che possiede già tutte le informazioni di istanza (fruitore, erogatore, ...)
  167.             // Non serve quindi che aggiungo anche i dati relativi allo specifico group by
  168.             boolean printDati = false;
  169.             String toStringRaggruppamentoSenzaDatiIstanza = PolicyUtilities.toStringGroupBy(activePolicy.getInstanceConfiguration().getGroupBy(), datiGroupBy, printDati);
  170.             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_GRUPPO, toStringRaggruppamentoSenzaDatiIstanza);
  171.            
  172.            
  173.            
  174.                        
  175.             // ************ APPLICABILITA *************
  176.            
  177.             boolean isApplicabile = true;
  178.             String descrizioneNonApplicabile = null;
  179.            
  180.             // verifico che il sistema risulti congestionato prima di applicare la policy
  181.             if(risultatoVerificaPolicy.isApplicabilitaCongestione() &&
  182.                
  183.                 !isPddCongestionata){
  184.                    
  185.                 isApplicabile = false;
  186.                
  187.                 Object oThreshold = pddContext.getObject(GeneratoreMessaggiErrore.PDD_CONTEXT_CONTROLLO_TRAFFICO_THRESHOLD);
  188.                 if(oThreshold!=null){
  189.                     descrizioneNonApplicabile = msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  190.                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_PDD_NON_CONGESTIONATA);
  191.                 }
  192.                 else{
  193.                     descrizioneNonApplicabile = msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  194.                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_PDD_NON_CONGESTIONATA_CONTROLLO_DISABILITATO);
  195.                 }
  196.                
  197.             }
  198.            
  199.             // verifico che il sistema risulti in degrado prestazionale
  200.             String descrizioneDegradoPrestazionaleRilevato = null;
  201.             if(isApplicabile && risultatoVerificaPolicy.isApplicabilitaDegradoPrestazionale()){
  202.                
  203.                 Date leftDate = null;
  204.                 Date rightDate = null;
  205.                 if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getDegradoAvgTimeFinestraOsservazione())){
  206.                     leftDate = datiCollezionatiReaded.getDegradoPrestazionaleLeftDateWindowCurrentInterval();
  207.                     rightDate = datiCollezionatiReaded.getDegradoPrestazionaleRightDateWindowCurrentInterval();
  208.                 }
  209.                 else if(TipoFinestra.PRECEDENTE.equals(activePolicy.getConfigurazionePolicy().getDegradoAvgTimeFinestraOsservazione())){
  210.                     leftDate = datiCollezionatiReaded.getDegradoPrestazionaleLeftDateWindowPrecedentInterval();
  211.                     rightDate = datiCollezionatiReaded.getDegradoPrestazionaleRightDateWindowPrecedentInterval();
  212.                 }
  213.                 else if(TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getDegradoAvgTimeFinestraOsservazione())){
  214.                     leftDate = datiCollezionatiReaded.getDegradoPrestazionaleLeftDateWindowSlidingInterval(now);
  215.                     rightDate = datiCollezionatiReaded.getDegradoPrestazionaleRightDateWindowSlidingInterval(now);
  216.                 }
  217.                 Date checkDate = null;
  218.                
  219.                 long valoreAttuale = 0;
  220.                 if(TipoControlloPeriodo.REALTIME.equals(activePolicy.getConfigurazionePolicy().getDegradoAvgTimeModalitaControllo())){
  221.                     checkDate = now;
  222.                     if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getDegradoAvgTimeFinestraOsservazione())){
  223.                         if(datiCollezionatiReaded.getPolicyDegradoPrestazionaleAvgValue()!=null){
  224.                             valoreAttuale = datiCollezionatiReaded.getPolicyDegradoPrestazionaleAvgValue().longValue();
  225.                         }
  226.                     }
  227.                     else{
  228.                         // TipoFinestra.PRECEDENTE
  229.                         if(datiCollezionatiReaded.getOldPolicyDegradoPrestazionaleAvgValue()!=null){
  230.                             valoreAttuale = datiCollezionatiReaded.getOldPolicyDegradoPrestazionaleAvgValue().longValue();
  231.                         }
  232.                     }
  233.                 }
  234.                 else{
  235.                     RisultatoStatistico risultatoStatistico = gestoreCacheControlloTraffico.readLatenza(
  236.                             TipoRisorsa.TEMPO_MEDIO_RISPOSTA, // Di fatto se gia' è presente in cache, è la stessa informazione calcolata per la risorsa, se i parametri sono gli stessi
  237.                             leftDate,rightDate,
  238.                             activePolicy.getConfigurazionePolicy().getDegradoAvgTimeFinestraOsservazione(),
  239.                             activePolicy.getConfigurazionePolicy().getDegradoAvgTimeTipoIntervalloOsservazioneStatistico(),
  240.                             activePolicy.getConfigurazionePolicy().getDegradoAvgTimeTipoLatenza(),
  241.                             datiTransazione, datiGroupBy, activePolicy.getInstanceConfiguration().getFiltro(),
  242.                             state, requestInfo, protocolFactory);
  243.                     valoreAttuale = risultatoStatistico.getRisultato();
  244.                     checkDate = risultatoStatistico.getDateCheck();
  245.                 }
  246.                
  247.                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_TIPOLOGIA_TEMPO_MEDIO, "Latenza "+
  248.                         activePolicy.getConfigurazionePolicy().getDegradoAvgTimeTipoLatenza().getValue());
  249.                
  250.                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_AVG_TIME_RILEVATO, valoreAttuale+"");
  251.                
  252.                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VALORE_SOGLIA_DEGRADO_PRESTAZIONALE, tempiRisposta.getAvgResponseTime()+"");
  253.                
  254.                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_INTERVALLO_TEMPORALE,
  255.                         PolicyDateUtils.toStringIntervalloTemporale(activePolicy.getConfigurazionePolicy().getDegradoAvgTimeFinestraOsservazione(),
  256.                                 leftDate, rightDate, checkDate,
  257.                                 TipoControlloPeriodo.STATISTIC.equals(activePolicy.getConfigurazionePolicy().getDegradoAvgTimeModalitaControllo())));
  258.                
  259.                 if(valoreAttuale<=tempiRisposta.getAvgResponseTime()){
  260.                    
  261.                     isApplicabile = false;
  262.                                        
  263.                     descrizioneNonApplicabile = msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  264.                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_DEGRADO_PRESTAZIONALE_NON_RILEVATO);
  265.                 }
  266.                 else{
  267.                     descrizioneDegradoPrestazionaleRilevato = msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  268.                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_DEGRADO_PRESTAZIONALE_RILEVATO);
  269.                 }
  270.                
  271.             }
  272.            
  273.             // verifico sullo stato di un allarme
  274.             String descrizioneStatoAllarmeRilevato = null;
  275.             if(isApplicabile && risultatoVerificaPolicy.isApplicabilitaStatoAllarme()){
  276.                
  277.                 if(!((ConfigurazioneGatewayControlloTraffico)activePolicy.getConfigurazioneControlloTraffico()).isNotifierEnabled()){
  278.                     throw new CoreException("Modulo Allarmi non abilitato. La Policy deve essere applicata condizionalmente allo stato di un allarme");
  279.                 }
  280.                
  281.                 RisultatoStato statoAttuale = null;
  282.                 String nomeAllarme = activePolicy.getConfigurazionePolicy().getAllarmeNome();
  283.                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_NOME_ALLARME, nomeAllarme);
  284.                 Integer statoIndicato = activePolicy.getConfigurazionePolicy().getAllarmeStato();
  285.                 boolean notStato = activePolicy.getConfigurazionePolicy().isAllarmeNotStato();
  286.                 try{
  287.                     statoAttuale = gestoreCacheControlloTraffico.getStato(datiTransazione,state,nomeAllarme);
  288.                 }catch(Exception e){
  289.                     isApplicabile = false;
  290.                     descrizioneNonApplicabile = "Recupero stato dell'allarme ["+nomeAllarme+"] non riuscito: "+e.getMessage();
  291.                 }
  292.                 if(statoAttuale!=null){
  293.                    
  294.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_STATO_ALLARME, PolicyUtilities.toString(statoAttuale));
  295.                    
  296.                     boolean match = false;
  297.                     if(notStato){
  298.                         match = statoAttuale.getStato().intValue()!=statoIndicato.intValue();
  299.                         msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_STATO_ALLARME_ATTESO, "stato differente da '"+PolicyUtilities.toString(statoIndicato)+"'");
  300.                     }else{
  301.                         match = statoAttuale.getStato().intValue()==statoIndicato.intValue();
  302.                         msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_STATO_ALLARME_ATTESO, "stato uguale a '"+PolicyUtilities.toString(statoIndicato)+"'");
  303.                     }
  304.                     if(!match){
  305.                         isApplicabile = false;
  306.                        
  307.                         descrizioneNonApplicabile = msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  308.                                 GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_STATO_ALLARME_NON_RILEVATO);
  309.                     }
  310.                     else{
  311.                         descrizioneStatoAllarmeRilevato = msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  312.                                 GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_STATO_ALLARME_RILEVATO);
  313.                     }
  314.                 }
  315.                
  316.             }
  317.            
  318.             // aggiorno contatori
  319.             if(isApplicabile || !activePolicy.getConfigurazioneControlloTraffico().isElaborazioneRealtime_incrementaSoloPolicyApplicabile()){
  320.            
  321.                 DatiCollezionati datiCollezionatiUpdated = gestorePolicyAttive.getActiveThreadsPolicy(activePolicy,datiTransazione, state).
  322.                         updateDatiStartRequestApplicabile(logCC, datiTransazione.getIdTransazione(), datiGroupBy,pddContext);
  323.                 if(datiCollezionatiUpdated!=null) {
  324.                     datiCollezionatiReaded = datiCollezionatiUpdated;
  325.                     now = datiCollezionatiReaded.getCloneDate(); // Data in cui sono stati prelevati gli intervalli.
  326.                 }
  327.                
  328.                 pddContextPolicyApplicabile.add(true);
  329.             }
  330.             else{
  331.                 pddContextPolicyApplicabile.add(false);
  332.             }
  333.            
  334.             // resoconto finale
  335.             if(!isApplicabile){
  336.                 risultatoVerificaPolicy.setNonApplicabile(true);
  337.                 risultatoVerificaPolicy.setDescrizione(descrizioneNonApplicabile);
  338.                                
  339.                 pddContextPolicyViolata.add(false);
  340.                
  341.                 return risultatoVerificaPolicy;
  342.             }

  343.            

  344.            
  345.            
  346.            
  347.            
  348.            
  349.             // ************ VERIFICA POLICY *************
  350.            
  351.             long valoreSoglia = activePolicy.getConfigurazionePolicy().getValore();
  352.             if (activePolicy.getInstanceConfiguration().isRidefinisci()){
  353.                 valoreSoglia = activePolicy.getInstanceConfiguration().getValore();
  354.             }
  355.            
  356.             // ** La quota può essere suddivisa tra i nodi del cluster attivi **
  357.             boolean gestioneClusterSupportata = false;
  358.             long valoreSogliaComplessivoCluster = -1;
  359.             if(activePolicy.getConfigurazionePolicy().isSimultanee() ||
  360.                     TipoControlloPeriodo.REALTIME.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())) {
  361.                
  362.                 switch (activePolicy.getTipoRisorsaPolicy()) {
  363.                
  364.                     case DIMENSIONE_MASSIMA_MESSAGGIO:
  365.                         // non viene viene verificata dal PolicyVerifier
  366.                         break;
  367.                        
  368.                     case NUMERO_RICHIESTE:
  369.                     case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  370.                     case NUMERO_RICHIESTE_FALLITE:
  371.                     case NUMERO_FAULT_APPLICATIVI:
  372.                     case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  373.                     case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
  374.                         gestioneClusterSupportata = true;
  375.                         break;
  376.                        
  377.                     case OCCUPAZIONE_BANDA:
  378.                         gestioneClusterSupportata = false;
  379.                         break;
  380.                        
  381.                     case TEMPO_COMPLESSIVO_RISPOSTA:
  382.                         gestioneClusterSupportata = false;
  383.                         break;
  384.                        
  385.                     case TEMPO_MEDIO_RISPOSTA:
  386.                         gestioneClusterSupportata = false;
  387.                         break;
  388.                 }
  389.                
  390.                 if(!PolicyGroupByActiveThreadsType.LOCAL_DIVIDED_BY_NODES.equals(policyConfiguration.getType())) {
  391.                     gestioneClusterSupportata = false;
  392.                 }
  393.                
  394.                 if(gestioneClusterSupportata && PolicyGroupByActiveThreadsType.LOCAL_DIVIDED_BY_NODES.equals(policyConfiguration.getType()) &&
  395.                         listClusterNodes!=null && !listClusterNodes.isEmpty() && listClusterNodes.size()>1) {
  396.                    
  397.                     if(!policyConfiguration.isLOCAL_DIVIDED_BY_NODES_limit_normalizedQuota()) {
  398.                         risultatoVerificaPolicy.setMaxValueBeforeNormalizing(valoreSoglia);
  399.                     }
  400.                    
  401.                     risultatoVerificaPolicy.setRemainingZeroValue(policyConfiguration.isLOCAL_DIVIDED_BY_NODES_remaining_zeroValue());
  402.                    
  403.                     // La quota indicata verra suddivisa per difetto, e se la divisione non consente di avere un numero maggiore di 0 viene associato il valore 1 ad ogni nodo.
  404.                     long resto = -1;
  405.                     if(!policyConfiguration.isLOCAL_DIVIDED_BY_NODES_limit_roundingDown()) {
  406.                         resto = valoreSoglia % (listClusterNodes.size());
  407.                     }
  408.                     valoreSoglia = valoreSoglia / (listClusterNodes.size());
  409.                     if(policyConfiguration.isLOCAL_DIVIDED_BY_NODES_limit_roundingDown()) {
  410.                         if(valoreSoglia<=0) {
  411.                             valoreSoglia = 1;
  412.                         }
  413.                     }
  414.                     else {
  415.                         if(resto>0) {
  416.                             valoreSoglia = valoreSoglia + 1;
  417.                         }
  418.                     }
  419.                    
  420.                     valoreSogliaComplessivoCluster = valoreSoglia * (listClusterNodes.size());
  421.                    
  422.                 }
  423.                 else {
  424.                     gestioneClusterSupportata = false;
  425.                 }
  426.             }
  427.            
  428.             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VALORE_SOGLIA, valoreSoglia+"");

  429.             boolean rilevataViolazione = false;
  430.            
  431.             switch (activePolicy.getTipoRisorsaPolicy()) {
  432.            
  433.             case DIMENSIONE_MASSIMA_MESSAGGIO:
  434.                 // non viene viene verificata dal PolicyVerifier
  435.                 break;
  436.            
  437.             case NUMERO_RICHIESTE:
  438.             case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  439.             case NUMERO_RICHIESTE_FALLITE:
  440.             case NUMERO_FAULT_APPLICATIVI:
  441.             case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  442.             case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
  443.                
  444.                 if(activePolicy.getConfigurazionePolicy().isSimultanee()){
  445.                    
  446.                     long valoreAttuale = datiCollezionatiReaded.getActiveRequestCounter();
  447.                     if(gestioneClusterSupportata) {
  448.                         //  Gli header 'RateLimit-Remaining' verranno valorizzati per difetto rispetto al numero di nodi attivi.
  449.                         risultatoVerificaPolicy.setActualValue(valoreAttuale*(listClusterNodes.size()));
  450.                         risultatoVerificaPolicy.setMaxValue(valoreSogliaComplessivoCluster);
  451.                     }
  452.                     else {
  453.                         risultatoVerificaPolicy.setActualValue(valoreAttuale);
  454.                         risultatoVerificaPolicy.setMaxValue(valoreSoglia);
  455.                     }
  456.                     if(datiCollezionatiReaded.getRightDateWindowCurrentInterval()!=null) {
  457.                         risultatoVerificaPolicy.setMsBeforeResetCounters(datiCollezionatiReaded.getRightDateWindowCurrentInterval().getTime()-DateManager.getTimeMillis());
  458.                     }
  459.                     if(valoreAttuale>valoreSoglia){
  460.                        
  461.                         /**System.out.println("@@@addThread ERR NUMERO_RICHIESTE SIMULTANEE ["+datiCollezionatiReaded.getActiveRequestCounter()+"]<=["+valoreSoglia
  462.                             +"] WarningOnly["+risultatoVerificaPolicy.isWarningOnly()+"]");*/
  463.                        
  464.                         rilevataViolazione = true;
  465.                         risultatoVerificaPolicy.
  466.                             setDescrizione(msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  467.                                     GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_SIMULTANEE));
  468.                        
  469.                     }
  470.                    
  471.                 }
  472.                 else{
  473.                                    
  474.                     Date leftDate = null;
  475.                     Date rightDate = null;
  476.                     if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  477.                         leftDate = datiCollezionatiReaded.getLeftDateWindowCurrentInterval();
  478.                         rightDate = datiCollezionatiReaded.getRightDateWindowCurrentInterval();
  479.                     }
  480.                     else if(TipoFinestra.PRECEDENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  481.                         leftDate = datiCollezionatiReaded.getLeftDateWindowPrecedentInterval();
  482.                         rightDate = datiCollezionatiReaded.getRightDateWindowPrecedentInterval();
  483.                     }
  484.                     else if(TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  485.                         leftDate = datiCollezionatiReaded.getLeftDateWindowSlidingInterval(now);
  486.                         rightDate = datiCollezionatiReaded.getRightDateWindowSlidingInterval(now);
  487.                     }
  488.                     Date checkDate = null;
  489.                    
  490.                     long valoreAttuale = 0;
  491.                     if(TipoControlloPeriodo.REALTIME.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())){
  492.                         checkDate = now;
  493.                         if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  494.                             if(datiCollezionatiReaded.getPolicyRequestCounter()!=null){
  495.                                 valoreAttuale = datiCollezionatiReaded.getPolicyRequestCounter().longValue();
  496.                                 switch (activePolicy.getTipoRisorsaPolicy()) {
  497.                                 case NUMERO_RICHIESTE:
  498.                                     break;
  499.                                 case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  500.                                 case NUMERO_RICHIESTE_FALLITE:
  501.                                 case NUMERO_FAULT_APPLICATIVI:
  502.                                 case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  503.                                 case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
  504.                                     // se sono in uno tra questi 4 casi il contatore delle richieste in essere viene incrementato solo dopo aver consegnato la risposta (check esito).
  505.                                     // poichè però il controllo sotto è con <= devo considerare la richiesta in essere con '+1'
  506.                                     // altrimenti se ad es. il limite è 3, e sono già passate in passato 3 richieste, la 4 passa.
  507.                                     valoreAttuale = valoreAttuale +1;
  508.                                     break;
  509.                                 default:
  510.                                     break;
  511.                                 }
  512.                             }
  513.                         }
  514.                         else{
  515.                             // TipoFinestra.PRECEDENTE
  516.                             if(datiCollezionatiReaded.getOldPolicyRequestCounter()!=null){
  517.                                 valoreAttuale = datiCollezionatiReaded.getOldPolicyRequestCounter().longValue();
  518.                             }
  519.                         }
  520.                     }
  521.                     else{
  522.                         RisultatoStatistico risultatoStatistico = gestoreCacheControlloTraffico.readNumeroRichieste(activePolicy.getTipoRisorsaPolicy(),
  523.                                 leftDate,rightDate,
  524.                                 activePolicy.getConfigurazionePolicy().getFinestraOsservazione(),
  525.                                 activePolicy.getConfigurazionePolicy().getTipoIntervalloOsservazioneStatistico(),
  526.                                 datiTransazione, datiGroupBy, activePolicy.getInstanceConfiguration().getFiltro(),
  527.                                 state, requestInfo, protocolFactory);
  528.                         valoreAttuale = risultatoStatistico.getRisultato();
  529.                         checkDate = risultatoStatistico.getDateCheck();
  530.                     }
  531.                            
  532.                     if(gestioneClusterSupportata) {
  533.                         //  Gli header 'RateLimit-Remaining' verranno valorizzati per difetto rispetto al numero di nodi attivi.
  534.                         risultatoVerificaPolicy.setActualValue(valoreAttuale*(listClusterNodes.size()));
  535.                         risultatoVerificaPolicy.setMaxValue(valoreSogliaComplessivoCluster);
  536.                     }
  537.                     else {
  538.                         risultatoVerificaPolicy.setActualValue(valoreAttuale);
  539.                         risultatoVerificaPolicy.setMaxValue(valoreSoglia);
  540.                     }
  541.                     if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione()) ||
  542.                             TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  543.                         if(rightDate!=null) {
  544.                             risultatoVerificaPolicy.setMsBeforeResetCounters(rightDate.getTime()-DateManager.getTimeMillis());
  545.                         }
  546.                         if(leftDate!=null && rightDate!=null) {
  547.                             risultatoVerificaPolicy.setMsWindow((rightDate.getTime()+1)-leftDate.getTime());
  548.                         }
  549.                     }
  550.                    
  551.                     if(valoreAttuale>valoreSoglia){
  552.                        
  553.                         /**System.out.println("@@@addThread ERR NUMERO_RICHIESTE ["+valoreAttuale+"]<=["+valoreSoglia
  554.                             +"] WarningOnly["+risultatoVerificaPolicy.isWarningOnly()+"]");*/
  555.                        
  556.                         rilevataViolazione = true;
  557.                        
  558.                         msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VALORE_RILEVATO, valoreAttuale+"");
  559.                        
  560.                         msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_INTERVALLO_TEMPORALE,
  561.                                 PolicyDateUtils.toStringIntervalloTemporale(activePolicy.getConfigurazionePolicy().getFinestraOsservazione(),
  562.                                         leftDate, rightDate, checkDate,
  563.                                         TipoControlloPeriodo.STATISTIC.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())));
  564.                        
  565.                         String codeDiagnostico = null;
  566.                         switch (activePolicy.getTipoRisorsaPolicy()) {
  567.                             case NUMERO_RICHIESTE:
  568.                                 codeDiagnostico = GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE;
  569.                                 break;
  570.                             case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  571.                                 codeDiagnostico = GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO;
  572.                                 break;
  573.                             case NUMERO_RICHIESTE_FALLITE:
  574.                                 codeDiagnostico = GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_FALLITE;
  575.                                 break;
  576.                             case NUMERO_FAULT_APPLICATIVI:
  577.                                 codeDiagnostico = GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_FAULT_APPLICATIVI;
  578.                                 break;
  579.                             case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  580.                                 codeDiagnostico = GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_FALLITE_O_FAULT_APPLICATIVI;
  581.                                 break;
  582.                             case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
  583.                                 codeDiagnostico = GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_O_FAULT_APPLICATIVI;
  584.                                 break;
  585.                             default:
  586.                                 // non può succedere
  587.                                 break;
  588.                         }
  589.                        
  590.                         risultatoVerificaPolicy.
  591.                             setDescrizione(msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL, codeDiagnostico));
  592.                        
  593.                     }
  594.                    
  595.                 }
  596.                
  597.                 break;
  598.                
  599.             case OCCUPAZIONE_BANDA:
  600.                
  601.                 Date leftDate = null;
  602.                 Date rightDate = null;
  603.                 if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  604.                     leftDate = datiCollezionatiReaded.getLeftDateWindowCurrentInterval();
  605.                     rightDate = datiCollezionatiReaded.getRightDateWindowCurrentInterval();
  606.                 }
  607.                 else if(TipoFinestra.PRECEDENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  608.                     leftDate = datiCollezionatiReaded.getLeftDateWindowPrecedentInterval();
  609.                     rightDate = datiCollezionatiReaded.getRightDateWindowPrecedentInterval();
  610.                 }
  611.                 else if(TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  612.                     leftDate = datiCollezionatiReaded.getLeftDateWindowSlidingInterval(now);
  613.                     rightDate = datiCollezionatiReaded.getRightDateWindowSlidingInterval(now);
  614.                 }
  615.                 Date checkDate = null;
  616.                
  617.                 long valoreAttuale = 0;
  618.                 if(TipoControlloPeriodo.REALTIME.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())){
  619.                     checkDate = now;
  620.                     if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  621.                         if(datiCollezionatiReaded.getPolicyCounter()!=null){
  622.                             valoreAttuale = datiCollezionatiReaded.getPolicyCounter().longValue();
  623.                         }
  624.                     }
  625.                     else{
  626.                         // TipoFinestra.PRECEDENTE
  627.                         if(datiCollezionatiReaded.getOldPolicyCounter()!=null){
  628.                             valoreAttuale = datiCollezionatiReaded.getOldPolicyCounter().longValue();
  629.                         }
  630.                     }
  631.                 }
  632.                 else{
  633.                     RisultatoStatistico risultatoStatistico = gestoreCacheControlloTraffico.readOccupazioneBanda(activePolicy.getTipoRisorsaPolicy(),
  634.                             leftDate,rightDate,
  635.                             activePolicy.getConfigurazionePolicy().getFinestraOsservazione(),
  636.                             activePolicy.getConfigurazionePolicy().getTipoIntervalloOsservazioneStatistico(),
  637.                             activePolicy.getConfigurazionePolicy().getValoreTipoBanda(),
  638.                             datiTransazione, datiGroupBy, activePolicy.getInstanceConfiguration().getFiltro(),
  639.                             state, requestInfo, protocolFactory);
  640.                     valoreAttuale = risultatoStatistico.getRisultato();
  641.                     checkDate = risultatoStatistico.getDateCheck();
  642.                     /**System.out.println("LETTO DA STATISTICA "+activePolicy.getConfigurazionePolicy().getTipoIntervalloOsservazioneStatistico()+
  643.                             " check("+org.openspcoop2.utils.date.DateUtils.getSimpleDateFormatMs().format(checkDate)+") intervallo '"+
  644.                             DateUtils.getSimpleDateFormatMs().format(leftDate)+"'-'"+
  645.                             DateUtils.getSimpleDateFormatMs().format(rightDate)+"': "+valoreAttuale);*/
  646.                 }
  647.                        
  648.                 long kb = DatiCollezionati.translateToKb(valoreAttuale);
  649.                
  650.                 risultatoVerificaPolicy.setActualValue(kb);
  651.                 risultatoVerificaPolicy.setMaxValue(valoreSoglia);
  652.                 if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione()) ||
  653.                         TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  654.                     if(rightDate!=null) {
  655.                         risultatoVerificaPolicy.setMsBeforeResetCounters(rightDate.getTime()-DateManager.getTimeMillis());
  656.                     }
  657.                     if(leftDate!=null && rightDate!=null) {
  658.                         risultatoVerificaPolicy.setMsWindow((rightDate.getTime()+1)-leftDate.getTime());
  659.                     }
  660.                 }
  661.                
  662.                 if(kb>valoreSoglia){
  663.                    
  664.                     /**System.out.println("@@@addThread ERR OCCUPAZIONE BANDA ["+kb+"]<=["+valoreSoglia
  665.                         +"] WarningOnly["+risultatoVerificaPolicy.isWarningOnly()+"]");*/
  666.                    
  667.                     rilevataViolazione = true;
  668.                    
  669.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VALORE_RILEVATO, kb+"");
  670.                    
  671.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_INTERVALLO_TEMPORALE,
  672.                             PolicyDateUtils.toStringIntervalloTemporale(activePolicy.getConfigurazionePolicy().getFinestraOsservazione(),
  673.                                     leftDate, rightDate, checkDate,
  674.                                     TipoControlloPeriodo.STATISTIC.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())));
  675.                    
  676.                     risultatoVerificaPolicy.
  677.                         setDescrizione(msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  678.                                 GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_OCCUPAZIONE_BANDA));
  679.                    
  680.                 }
  681.                
  682.                 break;
  683.    
  684.                
  685.             case TEMPO_COMPLESSIVO_RISPOSTA:
  686.                
  687.                 leftDate = null;
  688.                 rightDate = null;
  689.                 if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  690.                     leftDate = datiCollezionatiReaded.getLeftDateWindowCurrentInterval();
  691.                     rightDate = datiCollezionatiReaded.getRightDateWindowCurrentInterval();
  692.                 }
  693.                 else if(TipoFinestra.PRECEDENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  694.                     leftDate = datiCollezionatiReaded.getLeftDateWindowPrecedentInterval();
  695.                     rightDate = datiCollezionatiReaded.getRightDateWindowPrecedentInterval();
  696.                 }
  697.                 else if(TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  698.                     leftDate = datiCollezionatiReaded.getLeftDateWindowSlidingInterval(now);
  699.                     rightDate = datiCollezionatiReaded.getRightDateWindowSlidingInterval(now);
  700.                 }
  701.                 checkDate = null;
  702.                
  703.                 valoreAttuale = 0;
  704.                 if(TipoControlloPeriodo.REALTIME.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())){
  705.                     checkDate = now;
  706.                     if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  707.                         if(datiCollezionatiReaded.getPolicyCounter()!=null){
  708.                             valoreAttuale = datiCollezionatiReaded.getPolicyCounter().longValue();
  709.                         }
  710.                     }
  711.                     else{
  712.                         // TipoFinestra.PRECEDENTE
  713.                         if(datiCollezionatiReaded.getOldPolicyCounter()!=null){
  714.                             valoreAttuale = datiCollezionatiReaded.getOldPolicyCounter().longValue();
  715.                         }
  716.                     }
  717.                 }
  718.                 else{
  719.                     throw new CoreException("Risorsa non utilizzabile con campionamento statistico");
  720.                 }
  721.                        
  722.                 long secondi = DatiCollezionati.translateToSeconds(valoreAttuale);
  723.                
  724.                 risultatoVerificaPolicy.setActualValue(secondi);
  725.                 risultatoVerificaPolicy.setMaxValue(valoreSoglia);
  726.                 if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione()) ||
  727.                         TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  728.                     if(rightDate!=null) {
  729.                         risultatoVerificaPolicy.setMsBeforeResetCounters(rightDate.getTime()-DateManager.getTimeMillis());
  730.                     }
  731.                     if(leftDate!=null && rightDate!=null) {
  732.                         risultatoVerificaPolicy.setMsWindow((rightDate.getTime()+1)-leftDate.getTime());
  733.                     }
  734.                 }
  735.                
  736.                 if(secondi>valoreSoglia){
  737.                    
  738.                     /**System.out.println("@@@addThread ERR TEMPO COMPLESSIVO ["+secondi+"]<=["+valoreSoglia
  739.                         +"] WarningOnly["+risultatoVerificaPolicy.isWarningOnly()+"]");*/
  740.                    
  741.                     rilevataViolazione = true;
  742.                    
  743.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VALORE_RILEVATO, secondi+"");
  744.                    
  745.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_INTERVALLO_TEMPORALE,
  746.                             PolicyDateUtils.toStringIntervalloTemporale(activePolicy.getConfigurazionePolicy().getFinestraOsservazione(),
  747.                                     leftDate, rightDate, checkDate,
  748.                                     TipoControlloPeriodo.STATISTIC.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())));
  749.                                        
  750.                     risultatoVerificaPolicy.
  751.                         setDescrizione(msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  752.                                 GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_TEMPO_COMPLESSIVO));
  753.                    
  754.                 }
  755.                
  756.                 break;
  757.                
  758.                
  759.             case TEMPO_MEDIO_RISPOSTA:
  760.                
  761.                 leftDate = null;
  762.                 rightDate = null;
  763.                 if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  764.                     leftDate = datiCollezionatiReaded.getLeftDateWindowCurrentInterval();
  765.                     rightDate = datiCollezionatiReaded.getRightDateWindowCurrentInterval();
  766.                 }
  767.                 else if(TipoFinestra.PRECEDENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  768.                     leftDate = datiCollezionatiReaded.getLeftDateWindowPrecedentInterval();
  769.                     rightDate = datiCollezionatiReaded.getRightDateWindowPrecedentInterval();
  770.                 }
  771.                 else if(TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  772.                     leftDate = datiCollezionatiReaded.getLeftDateWindowSlidingInterval(now);
  773.                     rightDate = datiCollezionatiReaded.getRightDateWindowSlidingInterval(now);
  774.                 }
  775.                 checkDate = null;
  776.                
  777.                 valoreAttuale = 0;
  778.                 if(TipoControlloPeriodo.REALTIME.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())){
  779.                     checkDate = now;
  780.                     if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  781.                         if(datiCollezionatiReaded.getPolicyAvgValue()!=null){
  782.                             valoreAttuale = datiCollezionatiReaded.getPolicyAvgValue().longValue();
  783.                         }
  784.                     }
  785.                     else{
  786.                         // TipoFinestra.PRECEDENTE
  787.                         if(datiCollezionatiReaded.getOldPolicyAvgValue()!=null){
  788.                             valoreAttuale = datiCollezionatiReaded.getOldPolicyAvgValue().longValue();
  789.                         }
  790.                     }
  791.                 }
  792.                 else{
  793.                     RisultatoStatistico risultatoStatistico = gestoreCacheControlloTraffico.readLatenza(activePolicy.getTipoRisorsaPolicy(),
  794.                             leftDate,rightDate,
  795.                             activePolicy.getConfigurazionePolicy().getFinestraOsservazione(),
  796.                             activePolicy.getConfigurazionePolicy().getTipoIntervalloOsservazioneStatistico(),
  797.                             activePolicy.getConfigurazionePolicy().getValoreTipoLatenza(),
  798.                             datiTransazione, datiGroupBy, activePolicy.getInstanceConfiguration().getFiltro(),
  799.                             state, requestInfo, protocolFactory);
  800.                     valoreAttuale = risultatoStatistico.getRisultato();
  801.                     checkDate = risultatoStatistico.getDateCheck();
  802.                 }
  803.                    
  804.                 risultatoVerificaPolicy.setActualValue(valoreAttuale);
  805.                 risultatoVerificaPolicy.setMaxValue(valoreSoglia);
  806.                 if(TipoFinestra.CORRENTE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione()) ||
  807.                         TipoFinestra.SCORREVOLE.equals(activePolicy.getConfigurazionePolicy().getFinestraOsservazione())){
  808.                     if(rightDate!=null) {
  809.                         risultatoVerificaPolicy.setMsBeforeResetCounters(rightDate.getTime()-DateManager.getTimeMillis());
  810.                     }
  811.                     if(leftDate!=null && rightDate!=null) {
  812.                         risultatoVerificaPolicy.setMsWindow((rightDate.getTime()+1)-leftDate.getTime());
  813.                     }
  814.                 }
  815.                
  816.                 if(valoreAttuale>valoreSoglia){
  817.                    
  818.                     /**System.out.println("@@@addThread ERR TEMPO MEDIO ["+valoreAttuale+"]<=["+valoreSoglia
  819.                         +"] WarningOnly["+risultatoVerificaPolicy.isWarningOnly()+"]");*/
  820.                    
  821.                     rilevataViolazione = true;
  822.                    
  823.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_TIPOLOGIA_TEMPO_MEDIO, "Latenza "+activePolicy.getConfigurazionePolicy().getValoreTipoLatenza().getValue());
  824.                                        
  825.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_AVG_TIME_RILEVATO, valoreAttuale+"");
  826.                        
  827.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_INTERVALLO_TEMPORALE,
  828.                             PolicyDateUtils.toStringIntervalloTemporale(activePolicy.getConfigurazionePolicy().getFinestraOsservazione(),
  829.                                     leftDate, rightDate, checkDate,
  830.                                     TipoControlloPeriodo.STATISTIC.equals(activePolicy.getConfigurazionePolicy().getModalitaControllo())));
  831.                    
  832.                     risultatoVerificaPolicy.
  833.                         setDescrizione(msgDiag.getMessaggio_replaceKeywords(MsgDiagnosticiProperties.MSG_DIAG_ALL,
  834.                                 GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_TEMPO_MEDIO));
  835.                    
  836.                 }
  837.                
  838.                 break;
  839.    
  840.             }
  841.            
  842.             if(rilevataViolazione){
  843.                 TipoEvento tipoEvento = null;
  844.                 if(policyGlobale) {
  845.                     tipoEvento = TipoEvento.RATE_LIMITING_POLICY_GLOBALE;
  846.                 }
  847.                 else {
  848.                     tipoEvento = TipoEvento.RATE_LIMITING_POLICY_API;
  849.                 }
  850.                 if(risultatoVerificaPolicy.isWarningOnly()){
  851.                     violazionePolicyWarningOnly = true;
  852.                     tr.addEventoGestione(tipoEvento.getValue()
  853.                             +"_"+
  854.                             CodiceEventoControlloTraffico.VIOLAZIONE_WARNING_ONLY.getValue()
  855.                             +"_"+
  856.                             PolicyUtilities.getNomeActivePolicy(activePolicy.getInstanceConfiguration().getAlias(), activePolicy.getInstanceConfiguration().getIdActivePolicy())
  857.                         );
  858.                 }
  859.                 else{
  860.                     violazionePolicy = true;
  861.                     tr.addEventoGestione(tipoEvento.getValue()
  862.                             +"_"+
  863.                             CodiceEventoControlloTraffico.VIOLAZIONE.getValue()
  864.                             +"_"+
  865.                             PolicyUtilities.getNomeActivePolicy(activePolicy.getInstanceConfiguration().getAlias(), activePolicy.getInstanceConfiguration().getIdActivePolicy())
  866.                         );
  867.                 }
  868.                 dataEventoPolicyViolated = DateManager.getDate();
  869.                
  870.                 // arricchisco descrizioni con eventuali descrizioni sulla applicabilità
  871.                 if(descrizioneDegradoPrestazionaleRilevato!=null){
  872.                     String separatore = "\n";
  873.                     if(!risultatoVerificaPolicy.getDescrizione().endsWith(".")){
  874.                         separatore = ".\n";
  875.                     }
  876.                     risultatoVerificaPolicy.setDescrizione(risultatoVerificaPolicy.getDescrizione()+separatore+descrizioneDegradoPrestazionaleRilevato);
  877.                 }
  878.                 if(descrizioneStatoAllarmeRilevato!=null){
  879.                     String separatore = "\n";
  880.                     if(!risultatoVerificaPolicy.getDescrizione().endsWith(".")){
  881.                         separatore = ".\n";
  882.                     }
  883.                     risultatoVerificaPolicy.setDescrizione(risultatoVerificaPolicy.getDescrizione()+separatore+descrizioneStatoAllarmeRilevato);
  884.                 }
  885.             }
  886.            
  887.             risultatoVerificaPolicy.setViolata(rilevataViolazione);
  888.            
  889.             pddContextPolicyViolata.add(rilevataViolazione);
  890.            
  891.             return risultatoVerificaPolicy;
  892.                
  893.         }finally{
  894.            
  895.             if(pddContext!=null) {
  896.                 PolicyDateUtils.removeGestorePolicyConfigDateIntoContext(pddContext);
  897.             }
  898.            
  899.             // L'obiettivo è di generare un evento differente per ogni raggruppamento violato di una stessa policy
  900.             // All'interno di una stessa policy ci possono essere gruppi che non sono violati ed altri che lo sono
  901.             // Ad esempio se si raggruppa per soggetto fruitore, ci potranno essere soggetti che la violano, altri no.
  902.             // Si vuole un evento per ogni soggetto che viola la policy
  903.             String idPolicyConGruppo = null;
  904.             String configurazione = null;
  905.             if(violazionePolicy || violazionePolicyWarningOnly) {
  906.                
  907.                 String idAPI = null;
  908.                 if(policyAPI) {
  909.                     idAPI = getIdAPI(activePolicy, protocolFactory, configPdDManager, requestInfo);
  910.                 }
  911.                
  912.                 idPolicyConGruppo = PolicyUtilities.buildIdConfigurazioneEventoPerPolicy(activePolicy, datiGroupBy, idAPI);
  913.                 configurazione = PolicyUtilities.buildConfigurazioneEventoPerPolicy(activePolicy, policyGlobale);
  914.                
  915.             }
  916.            
  917.             if(violazionePolicy){
  918.                 CategoriaEventoControlloTraffico tipoEvento = null;
  919.                 if(policyGlobale) {
  920.                     tipoEvento = CategoriaEventoControlloTraffico.POLICY_GLOBALE;
  921.                 }
  922.                 else {
  923.                     tipoEvento = CategoriaEventoControlloTraffico.POLICY_API;
  924.                 }
  925.                 NotificatoreEventi.getInstance().log(tipoEvento,
  926.                         idPolicyConGruppo, configurazione,
  927.                         dataEventoPolicyViolated, descriptionPolicyViolated);
  928.             }
  929.             if(violazionePolicyWarningOnly){
  930.                 CategoriaEventoControlloTraffico tipoEvento = null;
  931.                 if(policyGlobale) {
  932.                     tipoEvento = CategoriaEventoControlloTraffico.POLICY_GLOBALE_WARNING_ONLY;
  933.                 }
  934.                 else {
  935.                     tipoEvento = CategoriaEventoControlloTraffico.POLICY_API_WARNING_ONLY;
  936.                 }
  937.                 NotificatoreEventi.getInstance().log(tipoEvento,
  938.                         idPolicyConGruppo, configurazione,
  939.                         dataEventoPolicyViolated, descriptionPolicyViolated);
  940.             }
  941.            
  942.         }

  943.     }
  944.    
  945.     public static String getIdAPI(ActivePolicy activePolicy, IProtocolFactory<?> protocolFactory, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo) throws ProtocolException, DriverConfigurazioneException {
  946.         AttivazionePolicy attivazionePolicy = activePolicy.getInstanceConfiguration();
  947.         return getIdAPI(attivazionePolicy, protocolFactory, configPdDManager, requestInfo);
  948.     }
  949.     public static String getIdAPI(AttivazionePolicy attivazionePolicy, IProtocolFactory<?> protocolFactory, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo) throws ProtocolException, DriverConfigurazioneException {
  950.         PorteNamingUtils namingUtils = new PorteNamingUtils(protocolFactory);
  951.        
  952.         String api = null;
  953.        
  954.         if(attivazionePolicy.getFiltro()!=null &&
  955.                 attivazionePolicy.getFiltro().getNomePorta()!=null &&
  956.                 StringUtils.isNotEmpty(attivazionePolicy.getFiltro().getNomePorta()) &&
  957.                 attivazionePolicy.getFiltro().getRuoloPorta()!=null) {
  958.             String nomePorta = attivazionePolicy.getFiltro().getNomePorta();
  959.             if(RuoloPolicy.DELEGATA.equals(attivazionePolicy.getFiltro().getRuoloPorta())) {
  960.                 api = getIdAPIFruizione(nomePorta, configPdDManager, requestInfo, namingUtils);
  961.             }
  962.             else if(RuoloPolicy.APPLICATIVA.equals(attivazionePolicy.getFiltro().getRuoloPorta())) {
  963.                 api = getIdAPIErogazione(nomePorta, configPdDManager, requestInfo, namingUtils);
  964.             }
  965.         }
  966.        
  967.         return api;
  968.     }

  969.     public static PolicyDati getIdAPIFruizione(String nomePorta, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo, IProtocolFactory<?> protocolFactory) throws DriverConfigurazioneException, ProtocolException {
  970.         PorteNamingUtils namingUtils = new PorteNamingUtils(protocolFactory);
  971.         PolicyDati dati = getIdAPIFruizioneEngine(nomePorta, configPdDManager, requestInfo, namingUtils);
  972.         if(protocolFactory!=null) {
  973.             dati.setProfilo(protocolFactory.getProtocol());
  974.         }
  975.         return dati;
  976.     }
  977.     public static String getIdAPIFruizione(String nomePorta, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo, PorteNamingUtils namingUtils) throws DriverConfigurazioneException, ProtocolException {
  978.         return getIdAPIFruizioneEngine(nomePorta, configPdDManager, requestInfo, namingUtils).getIdentificativo();
  979.     }
  980.     private static PolicyDati getIdAPIFruizioneEngine(String nomePorta, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo, PorteNamingUtils namingUtils) throws DriverConfigurazioneException, ProtocolException {
  981.        
  982.         PolicyDati policyDati = new PolicyDati();
  983.         policyDati.setRuoloPorta(RuoloPolicy.DELEGATA);
  984.         policyDati.setNomePorta(nomePorta);
  985.        
  986.         String api = null;
  987.         IDPortaDelegata idPD = new IDPortaDelegata();
  988.         idPD.setNome(nomePorta);
  989.         PortaDelegata pd = configPdDManager.getPortaDelegataSafeMethod(idPD, requestInfo);
  990.         if(pd!=null) {
  991.             IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(pd.getServizio().getTipo(), pd.getServizio().getNome(),
  992.                     pd.getSoggettoErogatore().getTipo(), pd.getSoggettoErogatore().getNome(),
  993.                     pd.getServizio().getVersione());
  994.             policyDati.setIdServizio(idServizio);
  995.            
  996.             IDSoggetto idFruitore = new IDSoggetto(pd.getTipoSoggettoProprietario(), pd.getNomeSoggettoProprietario());
  997.             policyDati.setIdFruitore(idFruitore);
  998.            
  999.             List<MappingFruizionePortaDelegata> list = configPdDManager.getMappingFruizionePortaDelegataList(idFruitore, idServizio, requestInfo);
  1000.             if(list.size()<=1) {
  1001.                 api = namingUtils.normalizePD(nomePorta);
  1002.             }
  1003.             else {
  1004.                 String gruppo = null;
  1005.                 for (MappingFruizionePortaDelegata mapping : list) {
  1006.                     if(mapping.isDefault()) {
  1007.                         api = namingUtils.normalizePD(mapping.getIdPortaDelegata().getNome());
  1008.                     }
  1009.                     if(nomePorta.equals(mapping.getIdPortaDelegata().getNome())) {
  1010.                         gruppo = mapping.getDescrizione();
  1011.                     }
  1012.                 }
  1013.                 api = api + " (gruppo '"+gruppo+"'"+") ";
  1014.                 policyDati.setGruppo(gruppo);
  1015.             }
  1016.         }
  1017.         policyDati.setIdentificativo(api);
  1018.        
  1019.         return policyDati;
  1020.     }
  1021.    
  1022.     public static PolicyDati getIdAPIErogazione(String nomePorta, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo, IProtocolFactory<?> protocolFactory) throws DriverConfigurazioneException, ProtocolException {
  1023.         PorteNamingUtils namingUtils = new PorteNamingUtils(protocolFactory);
  1024.         PolicyDati dati = getIdAPIErogazioneEngine(nomePorta, configPdDManager, requestInfo, namingUtils);
  1025.         if(protocolFactory!=null) {
  1026.             dati.setProfilo(protocolFactory.getProtocol());
  1027.         }
  1028.         return dati;
  1029.     }
  1030.     public static String getIdAPIErogazione(String nomePorta, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo, PorteNamingUtils namingUtils) throws DriverConfigurazioneException, ProtocolException {
  1031.         return getIdAPIErogazioneEngine(nomePorta, configPdDManager, requestInfo, namingUtils).getIdentificativo();
  1032.     }
  1033.     private static PolicyDati getIdAPIErogazioneEngine(String nomePorta, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo, PorteNamingUtils namingUtils) throws DriverConfigurazioneException, ProtocolException {
  1034.        
  1035.         PolicyDati policyDati = new PolicyDati();
  1036.         policyDati.setRuoloPorta(RuoloPolicy.APPLICATIVA);
  1037.         policyDati.setNomePorta(nomePorta);
  1038.        
  1039.         String api = null;
  1040.         IDPortaApplicativa idPA = new IDPortaApplicativa();
  1041.         idPA.setNome(nomePorta);
  1042.         PortaApplicativa pa = configPdDManager.getPortaApplicativaSafeMethod(idPA, requestInfo);
  1043.         if(pa!=null) {
  1044.             IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(pa.getServizio().getTipo(), pa.getServizio().getNome(),
  1045.                     pa.getTipoSoggettoProprietario(), pa.getNomeSoggettoProprietario(),
  1046.                     pa.getServizio().getVersione());
  1047.             policyDati.setIdServizio(idServizio);
  1048.             List<MappingErogazionePortaApplicativa> list = configPdDManager.getMappingErogazionePortaApplicativaList(idServizio, requestInfo);
  1049.             if(list.size()<=1) {
  1050.                 api = namingUtils.normalizePA(nomePorta);
  1051.             }
  1052.             else {
  1053.                 String gruppo = null;
  1054.                 for (MappingErogazionePortaApplicativa mapping : list) {
  1055.                     if(mapping.isDefault()) {
  1056.                         api = namingUtils.normalizePA(mapping.getIdPortaApplicativa().getNome());
  1057.                     }
  1058.                     if(nomePorta.equals(mapping.getIdPortaApplicativa().getNome())) {
  1059.                         gruppo = mapping.getDescrizione();
  1060.                     }
  1061.                 }
  1062.                 api = api + " (gruppo '"+gruppo+"'"+") ";
  1063.                 policyDati.setGruppo(gruppo);
  1064.             }
  1065.         }
  1066.         policyDati.setIdentificativo(api);
  1067.        
  1068.         return policyDati;
  1069.     }
  1070. }