InRequestProtocolHandlerGestioneControlloTraffico.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.handler;

  21. import java.security.SecureRandom;
  22. import java.util.ArrayList;
  23. import java.util.HashMap;
  24. import java.util.Iterator;
  25. import java.util.List;
  26. import java.util.Map;
  27. import java.util.Properties;

  28. import org.openspcoop2.core.commons.CoreException;
  29. import org.openspcoop2.core.config.PortaApplicativa;
  30. import org.openspcoop2.core.config.PortaDelegata;
  31. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  32. import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
  33. import org.openspcoop2.core.controllo_traffico.ConfigurazioneGenerale;
  34. import org.openspcoop2.core.controllo_traffico.ConfigurazionePolicy;
  35. import org.openspcoop2.core.controllo_traffico.ElencoIdPolicyAttive;
  36. import org.openspcoop2.core.controllo_traffico.IdActivePolicy;
  37. import org.openspcoop2.core.controllo_traffico.beans.DatiTransazione;
  38. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  39. import org.openspcoop2.core.controllo_traffico.beans.UniqueIdentifierUtilities;
  40. import org.openspcoop2.core.controllo_traffico.constants.Costanti;
  41. import org.openspcoop2.core.controllo_traffico.constants.TipoErrore;
  42. import org.openspcoop2.core.controllo_traffico.constants.TipoRisorsa;
  43. import org.openspcoop2.core.controllo_traffico.constants.TipoRisorsaPolicyAttiva;
  44. import org.openspcoop2.core.controllo_traffico.driver.IGestorePolicyAttive;
  45. import org.openspcoop2.core.controllo_traffico.utils.PolicyUtilities;
  46. import org.openspcoop2.core.eventi.constants.CodiceEventoControlloTraffico;
  47. import org.openspcoop2.core.eventi.constants.TipoEvento;
  48. import org.openspcoop2.message.constants.ServiceBinding;
  49. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  50. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  51. import org.openspcoop2.pdd.core.PdDContext;
  52. import org.openspcoop2.pdd.core.controllo_traffico.ConfigurazioneGatewayControlloTraffico;
  53. import org.openspcoop2.pdd.core.controllo_traffico.ConnettoreUtilities;
  54. import org.openspcoop2.pdd.core.controllo_traffico.CostantiControlloTraffico;
  55. import org.openspcoop2.pdd.core.controllo_traffico.DatiTempiRisposta;
  56. import org.openspcoop2.pdd.core.controllo_traffico.GeneratoreMessaggiDiagnostici;
  57. import org.openspcoop2.pdd.core.controllo_traffico.GeneratoreMessaggiErrore;
  58. import org.openspcoop2.pdd.core.controllo_traffico.GestoreControlloTraffico;
  59. import org.openspcoop2.pdd.core.controllo_traffico.RisultatoVerificaPolicy;
  60. import org.openspcoop2.pdd.core.controllo_traffico.StatoTraffico;
  61. import org.openspcoop2.pdd.core.controllo_traffico.policy.InterceptorPolicyUtilities;
  62. import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyFiltroApplicativoUtilities;
  63. import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyVerifier;
  64. import org.openspcoop2.pdd.core.controllo_traffico.policy.config.PolicyConfiguration;
  65. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.GestorePolicyAttive;
  66. import org.openspcoop2.pdd.core.handlers.HandlerException;
  67. import org.openspcoop2.pdd.core.handlers.InRequestProtocolContext;
  68. import org.openspcoop2.pdd.core.transazioni.Transaction;
  69. import org.openspcoop2.pdd.core.transazioni.TransactionDeletedException;
  70. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  71. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  72. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  73. import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
  74. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  75. import org.openspcoop2.protocol.sdk.state.StateMessage;
  76. import org.openspcoop2.protocol.utils.EsitiProperties;
  77. import org.openspcoop2.utils.Utilities;
  78. import org.slf4j.Logger;

  79. /**    
  80.  * InRequestProtocolHandlerGestioneControlloTraffico
  81.  *
  82.  * @author Poli Andrea (poli@link.it)
  83.  * @author $Author$
  84.  * @version $Rev$, $Date$
  85.  */
  86. public class InRequestProtocolHandlerGestioneControlloTraffico {

  87.     private static java.util.Random rndEngine = null;
  88.     private static synchronized void initRandom() {
  89.         if(rndEngine==null) {
  90.             rndEngine = new SecureRandom();
  91.         }
  92.     }
  93.     public static java.util.Random getRandom() {
  94.         if(rndEngine==null) {
  95.             initRandom();
  96.         }
  97.         return rndEngine;
  98.     }
  99.    
  100.     public void process(InRequestProtocolContext context, Transaction tr) throws HandlerException{
  101.        
  102.         Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttive = null;
  103.         boolean mapFromRequestInfo = false;
  104.        
  105.         DatiTransazione datiTransazione = null;
  106.                
  107.         IGestorePolicyAttive gestorePolicyGlobale = null;
  108.         IGestorePolicyAttive gestorePolicyPorta = null;
  109.         PolicyConfiguration policyConfigurationGlobale = null;
  110.         PolicyConfiguration policyConfigurationPorta = null;
  111.         PolicyConfiguration policyConfigurationHeaderHttp = null;
  112.        
  113.         GestoreControlloTraffico gestoreControlloTraffico = null;
  114.         ConfigurazionePdDManager configPdDManager = null;
  115.        
  116.         TipoErrore tipoErrore = TipoErrore.FAULT;
  117.         boolean includiDescrizioneErrore = true;
  118.        
  119.         ConfigurazioneGatewayControlloTraffico configurazioneControlloTraffico = null;
  120.        
  121.         Logger log = null;
  122.        
  123.         ServiceBinding serviceBinding = ServiceBinding.REST;
  124.        
  125.         RequestInfo requestInfo = null;
  126.         if(context!=null && context.getPddContext()!=null && context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)){
  127.             requestInfo = (RequestInfo) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  128.         }
  129.        
  130.         boolean registerThread = true;
  131.         OpenSPCoop2Properties op2Properties = null;
  132.         try{
  133.            
  134.             // ConfigurazioneControlloTraffico
  135.             op2Properties = OpenSPCoop2Properties.getInstance();
  136.             configurazioneControlloTraffico =  op2Properties.getConfigurazioneControlloTraffico();
  137.            
  138.             // Logger
  139.             log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(op2Properties.isControlloTrafficoDebug());
  140.            
  141.             if(context==null) {
  142.                 throw new CoreException("InRequestProtocolContext is null");
  143.             }
  144.            
  145.             // Leggo i dati del servizio
  146.             datiTransazione = InterceptorPolicyUtilities.readDatiTransazione(context);
  147.             registerThread = InterceptorPolicyUtilities.checkRegisterThread(datiTransazione);
  148.             // Se registerThread == false, sicuramente la richiesta non verra' veicolata fuori e terminerà con un errore all'interno della PdD.

  149.             if(context!=null && context.getMessaggio()!=null && context.getMessaggio().getServiceBinding()!=null) {
  150.                 serviceBinding = context.getMessaggio().getServiceBinding();
  151.             }
  152.            
  153.             if(registerThread){            
  154.                
  155.                 configPdDManager = ConfigurazionePdDManager.getInstance(context.getStato());
  156.                                
  157.                 // Prelevo la configurazione del Controllo del Traffico per quanto concerne le policy attive
  158.                
  159.                 if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
  160.                     if(requestInfo.getRequestRateLimitingConfig().getNomePorta()==null && datiTransazione!=null) {
  161.                         requestInfo.getRequestRateLimitingConfig().setDatiPorta(context.getTipoPorta(), datiTransazione.getNomePorta(),
  162.                                 datiTransazione.getIdServizio(),
  163.                                 datiTransazione.getSoggettoFruitore());
  164.                     }
  165.                     if(requestInfo.getRequestRateLimitingConfig().getMapPolicyAttive()!=null) {
  166.                         mapPolicyAttive = requestInfo.getRequestRateLimitingConfig().getMapPolicyAttive();
  167.                         mapFromRequestInfo = true;
  168.                     }
  169.                 }
  170.                
  171.                 if(!mapFromRequestInfo) {
  172.                
  173.                     mapPolicyAttive = new HashMap<>();
  174.                    
  175.                     Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttiveAPI = null;
  176.                     try {
  177.                         mapPolicyAttiveAPI = configPdDManager.getElencoIdPolicyAttiveAPI(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(),
  178.                                 context.getTipoPorta(), datiTransazione.getNomePorta());
  179.                     }catch(DriverConfigurazioneNotFound notFound) {
  180.                         // ignore
  181.                     }
  182.                     if(mapPolicyAttiveAPI!=null && !mapPolicyAttiveAPI.isEmpty()) {
  183.                         Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttiveAPI.keySet().iterator();
  184.                         while (it.hasNext()) {
  185.                             TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
  186.                             ElencoIdPolicyAttive elencoPolicyAttiveAPI = mapPolicyAttiveAPI.get(tipoRisorsaPolicyAttiva);
  187.                             if(elencoPolicyAttiveAPI!=null) {
  188.                                 ElencoIdPolicyAttive cloned = (ElencoIdPolicyAttive) elencoPolicyAttiveAPI.clone(); // altrimenti dopo aggiungendo quelle globali si modifica l'oggetto in cache
  189.                                 mapPolicyAttive.put(tipoRisorsaPolicyAttiva, cloned);
  190.                             }
  191.                         }
  192.                     }
  193.    
  194.                     Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttiveGlobali = null;
  195.                     try {
  196.                         mapPolicyAttiveGlobali = configPdDManager.getElencoIdPolicyAttiveGlobali(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache());
  197.                     }catch(DriverConfigurazioneNotFound notFound) {
  198.                         // ignore
  199.                     }
  200.                     if(mapPolicyAttiveGlobali!=null && !mapPolicyAttiveGlobali.isEmpty()) {
  201.                         Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttiveGlobali.keySet().iterator();
  202.                         while (it.hasNext()) {
  203.                             TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
  204.                             ElencoIdPolicyAttive elencoPolicyAttiveGlobali = mapPolicyAttiveGlobali.get(tipoRisorsaPolicyAttiva);
  205.                            
  206.                             if(mapPolicyAttive.containsKey(tipoRisorsaPolicyAttiva)) {
  207.                                 ElencoIdPolicyAttive elencoPolicyAttiveCloned = mapPolicyAttive.get(tipoRisorsaPolicyAttiva); // gia' clonato per l'api sopra
  208.                                 for (IdActivePolicy idActivePolicyGlobale : elencoPolicyAttiveGlobali.getIdActivePolicyList()) {
  209.                                     elencoPolicyAttiveCloned.addIdActivePolicy(idActivePolicyGlobale);
  210.                                 }
  211.                             }
  212.                             else {
  213.                                 ElencoIdPolicyAttive cloned = (ElencoIdPolicyAttive) elencoPolicyAttiveGlobali.clone(); // per non modificare l'oggetto in cache
  214.                                 mapPolicyAttive.put(tipoRisorsaPolicyAttiva, cloned);
  215.                             }
  216.                         }
  217.                     }
  218.                    
  219.                     if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
  220.                         requestInfo.getRequestRateLimitingConfig().setMapPolicyAttive(mapPolicyAttive);
  221.                     }
  222.                
  223.                 }

  224.                
  225.                 // ** ConfigurazionePolicy per gestore **
  226.                
  227.                 policyConfigurationGlobale = configPdDManager.getConfigurazionePolicyRateLimitingGlobali(requestInfo);
  228.                 context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_POLICY_CONFIG_GLOBALE, policyConfigurationGlobale);
  229.                                
  230.                 PolicyConfiguration policyConfigurationApiInternal = null;
  231.                 if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPD()!=null){
  232.                     PortaDelegata pd = configPdDManager.getPortaDelegata(context.getIntegrazione().getIdPD(),requestInfo);
  233.                     policyConfigurationApiInternal = new PolicyConfiguration(pd.getProprietaRateLimitingList());
  234.                 }
  235.                 else if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPA()!=null){
  236.                     PortaApplicativa pa = configPdDManager.getPortaApplicativa(context.getIntegrazione().getIdPA(),requestInfo);
  237.                     policyConfigurationApiInternal = new PolicyConfiguration(pa.getProprietaRateLimitingList());
  238.                 }
  239.                 if(policyConfigurationApiInternal==null) {
  240.                     throw new CoreException("Policy configuration not found");
  241.                 }
  242.                 else {
  243.                     if(policyConfigurationApiInternal.isGestionePolicyRidefinita()) {
  244.                         policyConfigurationPorta = policyConfigurationApiInternal;
  245.                     }
  246.                     else {
  247.                         policyConfigurationPorta = policyConfigurationGlobale;
  248.                     }
  249.                 }
  250.                 context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_POLICY_CONFIG_PORTA, policyConfigurationPorta);
  251.                
  252.                 // ** ConfigurazionePolicy per header http **
  253.                 if(policyConfigurationApiInternal.isGestioneHttpHeadersRidefinita()) {
  254.                     policyConfigurationHeaderHttp = policyConfigurationApiInternal;
  255.                 }
  256.                 else {
  257.                     policyConfigurationHeaderHttp = policyConfigurationGlobale;
  258.                 }
  259.                
  260.                 // Gestore delle Policy
  261.                 gestorePolicyPorta = GestorePolicyAttive.getInstance(policyConfigurationPorta.getType());
  262.                 gestorePolicyGlobale = GestorePolicyAttive.getInstance(policyConfigurationGlobale.getType());
  263.                
  264.                 // Gestore del Traffico
  265.                 gestoreControlloTraffico = GestoreControlloTraffico.getInstance();
  266.                
  267.                 // Configurazione Generale del RateLimiting
  268.                 ConfigurazioneGenerale configurazioneGenerale = configPdDManager.getConfigurazioneControlloTraffico(requestInfo);      
  269.                 if(configurazioneGenerale.getRateLimiting()!=null){
  270.                     if(configurazioneGenerale.getRateLimiting().getTipoErrore()!=null) {
  271.                         TipoErrore tipoErrorTmp = TipoErrore.toEnumConstant(configurazioneGenerale.getRateLimiting().getTipoErrore());
  272.                         if(tipoErrorTmp!=null) {
  273.                             tipoErrore = tipoErrorTmp;
  274.                         }
  275.                     }
  276.                     includiDescrizioneErrore = configurazioneGenerale.getRateLimiting().isTipoErroreIncludiDescrizione();
  277.                 }
  278.                
  279.             }
  280.            
  281.             /**System.out.println("PROCESS registerThread["+registerThread+"] datiControlloTraffico["+(datiControlloTraffico!=null)+"]");*/
  282.            
  283.         }catch(Exception e){
  284.             throw new HandlerException("Configurazione non disponibile: "+e.getMessage(), e);
  285.         }
  286.        
  287.         if(registerThread){

  288.            
  289.             try{
  290.                

  291.                 MsgDiagnostico msgDiag = this.buildMsgDiagnostico(context);
  292.                
  293.                 // Verifico se la Pdd è congestionata ed emetto l'opportuno diagnostico
  294.                 boolean pddCongestionata =
  295.                         isCondizioneCongestionamentoPortaDominio(context, gestoreControlloTraffico, msgDiag, tr);
  296.                
  297.                
  298.                 // Effettuo controllo di rate limiting
  299.                 if(mapPolicyAttive!=null && !mapPolicyAttive.isEmpty()){
  300.                                    
  301.                     // Emetto Diagnostico  Controllo di RateLimiting
  302.                     msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_IN_CORSO);
  303.                    
  304.                     int policyTotali = 0;
  305.                     int policyDisabilitate = 0;
  306.                     int policyFiltrate = 0;
  307.                     int policyNonApplicabili = 0;
  308.                     int policyRispettate = 0;
  309.                     int policyViolate = 0;
  310.                     int policyViolateWarningOnly = 0;
  311.                     int policyInErrore = 0;
  312.                    
  313.                     List<RisultatoVerificaPolicy> policyBloccanti = new ArrayList<>();
  314.                    
  315.                     List<String> pddContextUniqueIdsPolicy = new ArrayList<>();
  316.                     List<IDUnivocoGroupByPolicy> pddContextIdUnivociGroupBy = new ArrayList<>();
  317.                     List<Boolean> pddContextPolicyApplicabile = new ArrayList<>();
  318.                     List<Boolean> pddContextPolicyViolata = new ArrayList<>();
  319.                     List<String> pddContextApi = new ArrayList<>();
  320.                    
  321.                     DatiTempiRisposta datiTempiRisposta = null;
  322.                    
  323.                     // NOTA: Questo blocco che gestisce la raccolta delle policy soddisfatte e violate per generare gli opportuni header potrebbe essere riscritto utilizzando TipoRisorsaPolicyAttiva
  324.                     // Per adesso non viene modificato.
  325.                     List<RisultatoVerificaPolicy> risultatiVerificaPolicyViolate = new ArrayList<>();
  326.                     Map<TipoRisorsa,List<RisultatoVerificaPolicy>> risultatiVerificaPolicyRispettate = new HashMap<>();
  327.                     for (TipoRisorsa tipoRisorsa : TipoRisorsa.values()) {
  328.                         risultatiVerificaPolicyRispettate.put(tipoRisorsa, new ArrayList<>());
  329.                     }
  330.                    
  331.                     try{
  332.                        
  333.                         Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttive.keySet().iterator();
  334.                         while (it.hasNext()) {
  335.                             TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
  336.                             ElencoIdPolicyAttive elencoPolicyAttivePerRisorsa = mapPolicyAttive.get(tipoRisorsaPolicyAttiva);
  337.                        
  338.                             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_RISORSA, tipoRisorsaPolicyAttiva.getValue());
  339.                            
  340.                             boolean policyRispettataCheRichiedeBreak = false;
  341.                             boolean policyViolataBreak = false;
  342.                            
  343.                             for (IdActivePolicy idActive : elencoPolicyAttivePerRisorsa.getIdActivePolicyList()) {
  344.                                
  345.                                 policyTotali++;
  346.                                
  347.                                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_ID, idActive.getNome());
  348.                                                        
  349.                                 try{
  350.                                
  351.                                     if(idActive.isEnabled()){
  352.                                    
  353.                                         // Prelevo la configurazione del Controllo del Traffico per quanto concerne le policy attive
  354.                                         AttivazionePolicy attivazionePolicy = null;
  355.                                         try {
  356.                                             String id = UniqueIdentifierUtilities.getUniqueId(idActive);
  357.                                             if(mapFromRequestInfo) {
  358.                                                 attivazionePolicy = requestInfo.getRequestRateLimitingConfig().getAttivazionePolicy(id);
  359.                                             }
  360.                                             if(attivazionePolicy==null) {
  361.                                                 attivazionePolicy = configPdDManager.getAttivazionePolicy(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(), id);
  362.                                                 if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
  363.                                                     requestInfo.getRequestRateLimitingConfig().addAttivazionePolicy(id, attivazionePolicy);
  364.                                                 }
  365.                                             }
  366.                                         }catch(DriverConfigurazioneNotFound notFound) {
  367.                                             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_ALIAS, idActive.getNome());
  368.                                             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_TIPO, "");
  369.                                             throw new CoreException("Istanza di Policy con id ["+idActive.getNome()+"] non esistente: "+notFound.getMessage(),notFound);
  370.                                         }
  371.                                         if(attivazionePolicy==null){
  372.                                             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_ALIAS, idActive.getNome());
  373.                                             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_TIPO, "");
  374.                                             throw new CoreException("Istanza di Policy con id ["+idActive.getNome()+"] non esistente?");
  375.                                         }
  376.                                        
  377.                                         msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_ALIAS,
  378.                                                 PolicyUtilities.getNomeActivePolicy(attivazionePolicy.getAlias(), attivazionePolicy.getIdActivePolicy()));
  379.                                         if(attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().getNomePorta()!=null && !"".equals(attivazionePolicy.getFiltro().getNomePorta())) {
  380.                                             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_TIPO, Costanti.POLICY_API);
  381.                                         }
  382.                                         else {
  383.                                             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_TIPO, Costanti.POLICY_GLOBALE);
  384.                                         }
  385.                                        
  386.                                        
  387.                                         // Verifico se un eventuale filtro configurato per la policy matcha con i dati della transazione
  388.                                         boolean matchFiltro = !policyRispettataCheRichiedeBreak && !policyViolataBreak && InterceptorPolicyUtilities.filter(attivazionePolicy.getFiltro(), datiTransazione, context.getStato(), requestInfo);
  389.                                         if(matchFiltro){
  390.                                            
  391.                                             if(attivazionePolicy.getFiltro().isEnabled() && attivazionePolicy.getFiltro().isInformazioneApplicativaEnabled()){
  392.                                            
  393.                                                 // Verifico Filtro Applicativo
  394.                                                 String valorePresente = PolicyFiltroApplicativoUtilities.getValore(log,
  395.                                                         attivazionePolicy.getFiltro().getInformazioneApplicativaTipo(),
  396.                                                         attivazionePolicy.getFiltro().getInformazioneApplicativaNome(),
  397.                                                         context, datiTransazione, true);
  398.                                                 if(valorePresente==null || valorePresente.equals(attivazionePolicy.getFiltro().getInformazioneApplicativaValore())==false){
  399.                                                    
  400.                                                     policyFiltrate++;
  401.                                                    
  402.                                                     // Emetto Diagnostico Policy Filtrata
  403.                                                     if(valorePresente==null){
  404.                                                         valorePresente = "n.d.";
  405.                                                     }
  406.                                                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO, "Filtro Applicativo atteso ["+
  407.                                                             attivazionePolicy.getFiltro().getInformazioneApplicativaValore()+"] differente da quello estratto dalla transazione ["+
  408.                                                             valorePresente+"]");
  409.                                                     GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  410.                                                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_FILTRATA, log);
  411.                                                    
  412.                                                     matchFiltro = false;
  413.                                                    
  414.                                                 }
  415.                                                
  416.                                             }
  417.                                            
  418.                                             if(matchFiltro){
  419.                                                    
  420.                                                 // Prelevo la configurazione del Controllo del Traffico per quanto concerne le policy istanziata
  421.                                                 ConfigurazionePolicy configurazionePolicy = null;
  422.                                                 try {
  423.                                                     String id = idActive.getIdPolicy();
  424.                                                     if(mapFromRequestInfo) {
  425.                                                         configurazionePolicy = requestInfo.getRequestRateLimitingConfig().getConfigurazionePolicy(id);
  426.                                                     }
  427.                                                     if(configurazionePolicy==null) {
  428.                                                         configurazionePolicy = configPdDManager.getConfigurazionePolicy(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(), id);
  429.                                                         if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
  430.                                                             requestInfo.getRequestRateLimitingConfig().addConfigurazionePolicy(id, configurazionePolicy);
  431.                                                         }
  432.                                                     }
  433.                                                 }catch(DriverConfigurazioneNotFound notFound) {
  434.                                                     throw new CoreException("Policy con id ["+idActive.getIdPolicy()+"] non esistente: "+notFound.getMessage(),notFound);
  435.                                                 }
  436.                                                 if(configurazionePolicy==null){
  437.                                                     throw new CoreException("Policy con id ["+idActive.getIdPolicy()+"] non esistente?");
  438.                                                 }
  439.                                                
  440.                                                 org.openspcoop2.core.controllo_traffico.beans.ActivePolicy activePolicy =
  441.                                                         new org.openspcoop2.core.controllo_traffico.beans.ActivePolicy();
  442.                                                 activePolicy.setInstanceConfiguration(attivazionePolicy);
  443.                                                 activePolicy.setConfigurazionePolicy(configurazionePolicy);
  444.                                                 activePolicy.setTipoRisorsaPolicy(TipoRisorsa.toEnumConstant(configurazionePolicy.getRisorsa(), true));
  445.                                                 activePolicy.setConfigurazioneControlloTraffico(configurazioneControlloTraffico);
  446.                                                
  447.                                                
  448.                                                 // Creo Gruppo
  449.                                                 IDUnivocoGroupByPolicy idUnivocoGroupBy = InterceptorPolicyUtilities.convertToID(log,
  450.                                                         datiTransazione, attivazionePolicy.getGroupBy(), context);
  451.                                                 pddContextIdUnivociGroupBy.add(idUnivocoGroupBy);
  452.                                                 pddContextUniqueIdsPolicy.add(UniqueIdentifierUtilities.getUniqueId(attivazionePolicy));
  453.                                                
  454.                                                 // Se la Policy richiede una condizione di applicabilità per degrado prestazionale
  455.                                                 // e non ho ancora recuperato l'informazione sui tempi lo faccio adesso
  456.                                                 if(datiTempiRisposta==null){
  457.                                                     datiTempiRisposta = ConnettoreUtilities.getDatiTempiRisposta(context, datiTransazione, requestInfo);
  458.                                                 }
  459.                                                                                            
  460.                                                 // Verifico rispetto ai dati collezionati
  461.                                                
  462.                                                 IGestorePolicyAttive gestorePolicy = null;
  463.                                                 PolicyConfiguration policyConfiguration = null;
  464.                                                 if(attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().getNomePorta()!=null && !"".equals(attivazionePolicy.getFiltro().getNomePorta())) {
  465.                                                     gestorePolicy = gestorePolicyPorta;
  466.                                                     policyConfiguration = policyConfigurationPorta;
  467.                                                     TipoRisorsaPolicyAttiva tipoRisorsaPolicy = TipoRisorsaPolicyAttiva.getTipo(activePolicy.getTipoRisorsaPolicy(), configurazionePolicy.isSimultanee());
  468.                                                     if(!gestorePolicy.getType().isSupportedResource(tipoRisorsaPolicy)) {
  469.                                                         // caso in cui viene configurata una policy su una specifica erogazione/fruizione, senza che nella porta stessa venga ridefinito un gestore specifico, e a livello di configurazione globale viene poi impostato un gestore non compatibile
  470.                                                         log.error("Riscontrata policy '"+attivazionePolicy.getIdActivePolicy()+"' (alias:"+attivazionePolicy.getAlias()+") non compatibile con il tipo di gestore '"+gestorePolicy.getType()+"'; verrà utilizzato il gestore di default");
  471.                                                         policyConfiguration = new PolicyConfiguration(true);
  472.                                                         gestorePolicy = GestorePolicyAttive.getInstance(policyConfiguration.getType());
  473.                                                         pddContextApi.add(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_DEFAULT);
  474.                                                     }
  475.                                                     else {
  476.                                                         pddContextApi.add(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_API);
  477.                                                     }
  478.                                                 }
  479.                                                 else {
  480.                                                     gestorePolicy = gestorePolicyGlobale;
  481.                                                     policyConfiguration = policyConfigurationGlobale;
  482.                                                     pddContextApi.add(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT_VALUE_GLOBAL);
  483.                                                 }
  484.                                                
  485.                                                 RisultatoVerificaPolicy risultatoVerifica = PolicyVerifier.verifica(
  486.                                                         configPdDManager, context.getProtocolFactory(),
  487.                                                         gestorePolicy, policyConfiguration, log,
  488.                                                         activePolicy,
  489.                                                         idUnivocoGroupBy, context.getPddContext(),
  490.                                                         msgDiag, tr, datiTransazione, pddCongestionata, datiTempiRisposta,
  491.                                                         pddContextPolicyApplicabile, pddContextPolicyViolata,
  492.                                                         context.getStato());
  493.                                                
  494.                                                 // Gestisco Risultato Verifica
  495.                                                 if(risultatoVerifica.isErroreGenerico()){
  496.                                                    
  497.                                                     policyInErrore++;
  498.                                                    
  499.                                                     // Emetto Diagnostico Policy in Errore
  500.                                                     log.error("Errore durante il controllo della policy con id["+idActive.getNome()+"]: "+risultatoVerifica.getDescrizione());
  501.                                                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VIOLATA_MOTIVO, risultatoVerifica.getDescrizione());
  502.                                                     GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  503.                                                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_IN_ERRORE, log);
  504.                                                    
  505.                                                     // Aggiungo tra le policy bloccanti
  506.                                                     policyBloccanti.add(risultatoVerifica);
  507.                                                    
  508.                                                 }
  509.                                                 else if(risultatoVerifica.isNonApplicabile()){
  510.                                                    
  511.                                                     policyNonApplicabili++;
  512.                                                    
  513.                                                     // Emetto Diagnostico Policy  Non Applicabile
  514.                                                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_NON_APPLICABILE_MOTIVO, risultatoVerifica.getDescrizione());
  515.                                                     GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  516.                                                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_NON_APPLICABILE, log);
  517.                                                    
  518.                                                 }
  519.                                                 else if(risultatoVerifica.isViolata()){
  520.                                                
  521.                                                     risultatiVerificaPolicyViolate.add(risultatoVerifica);
  522.                                                    
  523.                                                     if(risultatoVerifica.isWarningOnly()){
  524.        
  525.                                                         policyViolateWarningOnly++;
  526.                                                        
  527.                                                         // Emetto Diagnostico Policy Violata in Warning Only
  528.                                                         msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VIOLATA_MOTIVO, risultatoVerifica.getDescrizione());
  529.                                                         GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  530.                                                                 GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_VIOLATA_WARNING_ONLY, log);
  531.                                                        
  532.                                                     }
  533.                                                     else{
  534.                                                    
  535.                                                         policyViolate++;
  536.                                                        
  537.                                                         // Emetto Diagnostico Policy Violata
  538.                                                         msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VIOLATA_MOTIVO, risultatoVerifica.getDescrizione());
  539.                                                         GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  540.                                                                 GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_VIOLATA, log);
  541.                                                        
  542.                                                         // Aggiungo tra le policy bloccanti
  543.                                                         policyBloccanti.add(risultatoVerifica);
  544.                                                        
  545.                                                     }
  546.                                                    
  547.                                                     policyViolataBreak = true;
  548.                                                 }
  549.                                                 else{
  550.                                                    
  551.                                                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_ACTIVE_CONTINUE, attivazionePolicy.isContinuaValutazione()+"");
  552.                                                                                                        
  553.                                                     risultatiVerificaPolicyRispettate.get(risultatoVerifica.getRisorsa()).add(risultatoVerifica);
  554.                                                    
  555.                                                     // Emetto Diagnostico Policy Rispettata
  556.                                                     GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  557.                                                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_RISPETTATA, log);
  558.                                                    
  559.                                                     policyRispettate++;
  560.                                                    
  561.                                                     if(!attivazionePolicy.isContinuaValutazione()) {
  562.                                                         policyRispettataCheRichiedeBreak = true;
  563.                                                     }
  564.                                                    
  565.                                                 }
  566.                                                
  567.                                             }
  568.                                            
  569.                                         }
  570.                                         else{
  571.                                            
  572.                                             policyFiltrate++;
  573.                                            
  574.                                             // Emetto Diagnostico Policy Filtrata
  575.                                             if(policyRispettataCheRichiedeBreak) {
  576.                                                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO,
  577.                                                         GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_BREAK);
  578.                                             }
  579.                                             else if(policyViolataBreak) {
  580.                                                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO,
  581.                                                         GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_BREAK_VIOLATA);
  582.                                             }
  583.                                             else {
  584.                                                 msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO,
  585.                                                         GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_FILTRO+ PolicyUtilities.toStringFilter(attivazionePolicy.getFiltro()));
  586.                                             }
  587.                                             GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  588.                                                     GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_FILTRATA, log);
  589.                                            
  590.                                         }
  591.                                        
  592.                                     }
  593.                                     else{
  594.                                        
  595.                                         policyDisabilitate++;
  596.                                        
  597.                                         // Emetto Diagnostico Policy Disabilitata
  598.                                         GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  599.                                                 GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_DISABILITATA, log);
  600.                                        
  601.                                     }
  602.                                    
  603.                                 }
  604.                                 catch(Throwable e){
  605.                                    
  606.                                     policyInErrore++;
  607.                                    
  608.                                     // Messaggio di Errore
  609.                                     Throwable tConMessaggio = Utilities.getInnerNotEmptyMessageException(e);
  610.                                     String eMessaggio = tConMessaggio.getMessage();
  611.                                     if(eMessaggio==null || "".equals(eMessaggio) || "null".equalsIgnoreCase(eMessaggio)){
  612.                                         eMessaggio = "Internal Error"; // molto probabilmente si tratta di un null Pointer. Lo si vedra' nel logger
  613.                                     }
  614.                                    
  615.                                     // Emetto Diagnostico Policy in Errore
  616.                                     log.error("Errore durante il controllo della policy con id["+idActive.getNome()+"]: "+eMessaggio,e);
  617.                                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_POLICY_VIOLATA_MOTIVO, eMessaggio);
  618.                                     GeneratoreMessaggiDiagnostici.emitDiagnostic(msgDiag,
  619.                                             GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_IN_ERRORE, log);
  620.                                    
  621.                                     // Aggiungo tra le policy bloccanti
  622.                                     RisultatoVerificaPolicy policyError = new RisultatoVerificaPolicy();
  623.                                     policyError.setErroreGenerico(true);
  624.                                     policyError.setDescrizione(eMessaggio);
  625.                                     policyBloccanti.add(policyError);
  626.                                    
  627.                                 }
  628.                                
  629.                                 // Effettuo clean dei dati dinamici della policy
  630.                                 GeneratoreMessaggiDiagnostici.cleanPolicyValues(msgDiag);
  631.                                
  632.                                
  633.                             } // -- fine for delle policy di una risorsa
  634.                            
  635.                         } // -- fine iterazione per tipo di risorsa
  636.                        
  637.                     }finally{
  638.                         if(!pddContextIdUnivociGroupBy.isEmpty()){
  639.                             context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_GROUP_BY_CONDITION, pddContextIdUnivociGroupBy);
  640.                             context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_UNIQUE_ID_POLICY,pddContextUniqueIdsPolicy);
  641.                             context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_POLICY_APPLICABILE,pddContextPolicyApplicabile);
  642.                             context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_POLICY_VIOLATA,pddContextPolicyViolata);
  643.                             context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_LIST_API_OR_GLOBAL_OR_DEFAULT,pddContextApi);
  644.                         }
  645.                     }

  646.                     // Gestione header HTTP da aggiungere alla transazione
  647.                    
  648.                     Properties headerTrasportoRateLimiting = new Properties();
  649.                     if(!risultatiVerificaPolicyViolate.isEmpty()) {
  650.                         // calcolo tempo maggiore
  651.                         long ms = -1;
  652.                         Map<TipoRisorsa,List<RisultatoVerificaPolicy>> risultatiVerificaPolicyViolateMap = new HashMap<>();
  653.                         for (RisultatoVerificaPolicy risultatoVerificaPolicy : risultatiVerificaPolicyViolate) {
  654.                            
  655.                             List<RisultatoVerificaPolicy> l = null;
  656.                             if(risultatiVerificaPolicyViolateMap.containsKey(risultatoVerificaPolicy.getRisorsa())) {
  657.                                 l = risultatiVerificaPolicyViolateMap.get(risultatoVerificaPolicy.getRisorsa());
  658.                             }
  659.                             else {
  660.                                 l = new ArrayList<>();
  661.                                 risultatiVerificaPolicyViolateMap.put(risultatoVerificaPolicy.getRisorsa(), l);
  662.                             }
  663.                             l.add(risultatoVerificaPolicy);
  664.                            
  665.                             if(risultatoVerificaPolicy.getMsBeforeResetCounters()!=null) {
  666.                                 long tmp = risultatoVerificaPolicy.getMsBeforeResetCounters().longValue();
  667.                                 if(tmp>ms) {
  668.                                     ms = tmp;
  669.                                 }
  670.                             }
  671.                         }
  672.                         if(ms>0) {
  673.                             // trasformo in secondi
  674.                             long sec = -1;
  675.                             if(ms>1000) {
  676.                                 // trasformo in secondi
  677.                                 sec = ms / 1000;
  678.                             }
  679.                             else if(ms>0) {
  680.                                 // genero comunque l'header approssimando l'intervallo al secondo + backoff
  681.                                 sec=1;
  682.                             }

  683.                             if(!policyConfigurationHeaderHttp.isDisabledHttpHeaders_retryAfter()) {
  684.                            
  685.                                 // aggiungo backoff
  686.                                 if(!policyConfigurationHeaderHttp.isForceDisabledHttpHeaders_retryAfter_backoff()) {
  687.                                     if(policyConfigurationHeaderHttp.getForceHttpHeaders_retryAfter_backoff()>0) {
  688.                                         sec = sec + getRandom().nextInt(policyConfigurationHeaderHttp.getForceHttpHeaders_retryAfter_backoff());
  689.                                     }
  690.                                     else {
  691.                                         if(op2Properties.getControlloTrafficoRetryAfterHeaderRandomBackoff()!=null && op2Properties.getControlloTrafficoRetryAfterHeaderRandomBackoff()>0) {
  692.                                             sec = sec + getRandom().nextInt(op2Properties.getControlloTrafficoRetryAfterHeaderRandomBackoff());
  693.                                         }
  694.                                     }
  695.                                 }
  696.                                 String [] headers = op2Properties.getControlloTrafficoRetryAfterHeader();
  697.                                 if(headers!=null && headers.length>0) {
  698.                                     for (String header : headers) {
  699.                                         headerTrasportoRateLimiting.put(header, sec+"");
  700.                                     }
  701.                                 }
  702.                             }
  703.                         }
  704.                         if(risultatiVerificaPolicyViolateMap.size()>0) {
  705.                             // produco anche i normali header
  706.                             gestioneHeaderRateLimit(risultatiVerificaPolicyViolateMap, headerTrasportoRateLimiting, op2Properties, policyConfigurationHeaderHttp);
  707.                         }
  708.                     }
  709.                     else if(risultatiVerificaPolicyRispettate.size()>0) {
  710.                         gestioneHeaderRateLimit(risultatiVerificaPolicyRispettate, headerTrasportoRateLimiting, op2Properties, policyConfigurationHeaderHttp);
  711.                     }
  712.                        
  713.                     //Aggiungo nel pddContext e poi li recupero nei servizi
  714.                     if(headerTrasportoRateLimiting.size()>0) {
  715.                         context.getPddContext().addObject(CostantiControlloTraffico.PDD_CONTEXT_HEADER_RATE_LIMITING,headerTrasportoRateLimiting);
  716.                     }
  717.                    
  718.                    
  719.                     // Emetto Diagnostico Terminazione Controllo Rate limiting
  720.                    
  721.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY, policyTotali+"");
  722.                     context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY, policyTotali);
  723.                                        
  724.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_DISABILITATE, policyDisabilitate+"");
  725.                     context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_DISABILITATE, policyDisabilitate);
  726.                    
  727.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_FILTRATE, policyFiltrate+"");
  728.                     context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_FILTRATE, policyFiltrate);
  729.                    
  730.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_NON_APPLICATE, policyNonApplicabili+"");
  731.                     context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_NON_APPLICATE, policyNonApplicabili);
  732.                    
  733.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_RISPETTATE, policyRispettate+"");
  734.                     context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_RISPETTATE, policyRispettate);
  735.                    
  736.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_VIOLATE, policyViolate+"");
  737.                     context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_VIOLATE, policyViolate);
  738.                    
  739.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_VIOLATE_WARNING_ONLY, policyViolateWarningOnly+"");
  740.                     context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_VIOLATE_WARNING_ONLY, policyViolateWarningOnly);
  741.                    
  742.                     msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_NUMERO_POLICY_IN_ERRORE, policyInErrore+"");
  743.                     context.getPddContext().addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_NUMERO_POLICY_IN_ERRORE, policyInErrore);
  744.                    
  745.                     if(policyViolate>0 || policyInErrore>0){
  746.                         msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_TERMINATO_CON_ERRORE);
  747.                        
  748.                         if(policyInErrore>0) {
  749.                             EsitoTransazioneName esito = op2Properties.getControlloTrafficoEsitiPolicyElaborazioneInErrore(EsitiProperties.getInstance(log, context.getProtocolFactory()));
  750.                             if(EsitoTransazioneName.CONTROLLO_TRAFFICO_POLICY_VIOLATA.equals(esito)) {
  751.                                 GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoPolicyViolated(context.getPddContext(), false);
  752.                             }
  753.                             else {
  754.                                 GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoPolicyInError(context.getPddContext(), esito);
  755.                             }
  756.                         }
  757.                         else {
  758.                             GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoPolicyViolated(context.getPddContext(), false);
  759.                         }
  760.                        
  761.                         HandlerException he = GeneratoreMessaggiErrore.getControlloTrafficoPolicyViolated(policyBloccanti,
  762.                                 configurazioneControlloTraffico.isErroreGenerico(), context.getPddContext());
  763.                         he.setEmettiDiagnostico(false);
  764.                         GeneratoreMessaggiErrore.configureHandlerExceptionByTipoErrore(serviceBinding, he, tipoErrore, includiDescrizioneErrore,log);
  765.                         throw he;
  766.                     }
  767.                     else if(policyViolateWarningOnly>0){
  768.                        
  769.                         GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoPolicyViolated(context.getPddContext(), true);
  770.                        
  771.                         msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_TERMINATO_CON_SUCCESSO);
  772.                        
  773.                     }
  774.                     else{
  775.                         msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_TERMINATO_CON_SUCCESSO);
  776.                     }
  777.                 }
  778.                    
  779.             }
  780.             catch(HandlerException e){
  781.                 throw e;
  782.             }
  783.             catch(Exception e){
  784.                    
  785.                 GeneratoreMessaggiErrore.addPddContextInfoControlloTrafficoGenericError(context.getPddContext());
  786.                
  787.                 throw GeneratoreMessaggiErrore.getErroreProcessamento(e, context.getPddContext());

  788.             }
  789.            
  790.         }

  791.     }
  792.    
  793.     private void gestioneHeaderRateLimit(Map<TipoRisorsa,List<RisultatoVerificaPolicy>> risultatiVerificaPolicy, Properties headerTrasportoRateLimiting,
  794.             OpenSPCoop2Properties op2Properties,
  795.             PolicyConfiguration policyConfigurationPorta) {
  796.        
  797.         if(policyConfigurationPorta.isDisabledHttpHeaders()) {
  798.             return;
  799.         }
  800.        
  801.         for (TipoRisorsa tipoRisorsa : risultatiVerificaPolicy.keySet()) {

  802.             List<RisultatoVerificaPolicy> risultato = risultatiVerificaPolicy.get(tipoRisorsa);
  803.             // in presenza di piu' policy dello stesso tipo considero la policy che termina più lontano nel tempo: NO Sbagliato poiche' se una ha un numero minore non va bene.
  804.             // Prendo a questo punto quella con il minore limite.
  805.            
  806.             RisultatoVerificaPolicy risultatoUtilizzato = null;
  807.             RisultatoVerificaPolicy risultatoUtilizzatoSimultanee = null;
  808.             List<RisultatoVerificaPolicy> altrePolicy = new ArrayList<>();
  809.             List<RisultatoVerificaPolicy> altrePolicySimultanee = new ArrayList<>();
  810.            
  811.             for (RisultatoVerificaPolicy risultatoVerificaPolicy : risultato) {
  812.                 if(TipoRisorsa.NUMERO_RICHIESTE.equals(tipoRisorsa) && risultatoVerificaPolicy.isSimultanee()) {
  813.                     if(risultatoUtilizzatoSimultanee==null) {
  814.                         risultatoUtilizzatoSimultanee = risultatoVerificaPolicy;
  815.                     }
  816.                     else {
  817.                         long numeroRimasti = -1;
  818.                         if(risultatoUtilizzatoSimultanee.getMaxValue()!=null) {
  819.                             numeroRimasti = risultatoUtilizzatoSimultanee.getMaxValue().longValue();
  820.                         }
  821.                         long numeroCheck = -1;
  822.                         if(risultatoVerificaPolicy.getMaxValue()!=null) {
  823.                             numeroCheck = risultatoVerificaPolicy.getMaxValue().longValue();
  824.                         }
  825.                         boolean switchPolicy = false;
  826.                         if(numeroCheck>0) {
  827.                             if(numeroRimasti>0) {
  828.                                 if(numeroCheck<numeroRimasti) {
  829.                                     altrePolicySimultanee.add(risultatoUtilizzatoSimultanee);
  830.                                     risultatoUtilizzatoSimultanee = risultatoVerificaPolicy;
  831.                                     switchPolicy = true;
  832.                                 }
  833.                             }
  834.                             else {
  835.                                 altrePolicySimultanee.add(risultatoUtilizzatoSimultanee);
  836.                                 risultatoUtilizzatoSimultanee = risultatoVerificaPolicy;
  837.                                 switchPolicy = true;
  838.                             }
  839.                         }
  840.                         if(!switchPolicy) {
  841.                             altrePolicySimultanee.add(risultatoVerificaPolicy);
  842.                         }
  843.                     }
  844.                 }
  845.                 else {
  846.                     if(risultatoUtilizzato==null) {
  847.                         risultatoUtilizzato = risultatoVerificaPolicy;
  848.                     }
  849.                     else {
  850.                         long numeroRimasti = -1;
  851.                         if(risultatoUtilizzato.getMaxValue()!=null) {
  852.                             numeroRimasti = risultatoUtilizzato.getMaxValue().longValue();
  853.                         }
  854.                         long numeroCheck = -1;
  855.                         if(risultatoVerificaPolicy.getMaxValue()!=null) {
  856.                             numeroCheck = risultatoVerificaPolicy.getMaxValue().longValue();
  857.                         }
  858.                         boolean switchPolicy = false;
  859.                         if(numeroCheck>0) {
  860.                             if(numeroRimasti>0) {
  861.                                 if(numeroCheck<numeroRimasti) {
  862.                                     altrePolicy.add(risultatoUtilizzato);
  863.                                     risultatoUtilizzato = risultatoVerificaPolicy;
  864.                                     switchPolicy = true;
  865.                                 }
  866.                             }
  867.                             else {
  868.                                 altrePolicy.add(risultatoUtilizzato);
  869.                                 risultatoUtilizzato = risultatoVerificaPolicy;
  870.                                 switchPolicy = true;
  871.                             }
  872.                         }
  873.                         if(!switchPolicy) {
  874.                             altrePolicy.add(risultatoVerificaPolicy);
  875.                         }
  876.                     }
  877.                 }
  878.             }
  879.            
  880.             if(!policyConfigurationPorta.isDisabledHttpHeaders_limit() && risultatoUtilizzatoSimultanee!=null &&
  881.                 risultatoUtilizzatoSimultanee.getMaxValue()!=null) {
  882.                 try {
  883.                     String [] headers = op2Properties.getControlloTrafficoNumeroRichiesteSimultaneeHeaderLimit();
  884.                     if(headers!=null && headers.length>0) {
  885.                         for (String header : headers) {
  886.                             headerTrasportoRateLimiting.put(header, risultatoUtilizzatoSimultanee.getMaxValue().longValue()+"");
  887.                         }
  888.                     }
  889.                 }catch(Exception e) {
  890.                     // errore non dovrebbe succedere
  891.                 }
  892.                
  893.                 if(risultatoUtilizzatoSimultanee.getActualValue()!=null) {
  894.                     long rimanenti = risultatoUtilizzatoSimultanee.getMaxValue().longValue() - risultatoUtilizzatoSimultanee.getActualValue().longValue();
  895.                     if(rimanenti<0) {  // gli attuali conteggia anche quelle bloccate
  896.                         rimanenti = 0;
  897.                     }
  898.                     try {
  899.                         String [] headers = op2Properties.getControlloTrafficoNumeroRichiesteSimultaneeHeaderRemaining();
  900.                         if(headers!=null && headers.length>0) {
  901.                             for (String header : headers) {
  902.                                 headerTrasportoRateLimiting.put(header, rimanenti+"");
  903.                             }
  904.                         }
  905.                     }catch(Exception e) {
  906.                         // errore non dovrebbe succedere
  907.                     }
  908.                 }
  909.             }
  910.            
  911.             if(risultatoUtilizzato!=null &&
  912.                 risultatoUtilizzato.getMaxValue()!=null) {
  913.                    
  914.                 if(!policyConfigurationPorta.isDisabledHttpHeaders_limit()) {
  915.                     try {
  916.                         String [] headers = null;
  917.                         boolean windows = false;
  918.                         switch (tipoRisorsa) {
  919.                         case DIMENSIONE_MASSIMA_MESSAGGIO:
  920.                             // non viene usata
  921.                             break;
  922.                         case NUMERO_RICHIESTE:
  923.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteHeaderLimit();
  924.                             windows = op2Properties.getControlloTrafficoNumeroRichiesteHeaderLimitWindows();
  925.                             break;
  926.                         case OCCUPAZIONE_BANDA:
  927.                             headers = op2Properties.getControlloTrafficoOccupazioneBandaHeaderLimit();
  928.                             windows = op2Properties.getControlloTrafficoOccupazioneBandaHeaderLimitWindows();
  929.                             break;
  930.                         case TEMPO_MEDIO_RISPOSTA:
  931.                             headers = op2Properties.getControlloTrafficoTempoMedioRispostaHeaderLimit();
  932.                             windows = op2Properties.getControlloTrafficoTempoMedioRispostaHeaderLimitWindows();
  933.                             break;
  934.                         case TEMPO_COMPLESSIVO_RISPOSTA:
  935.                             headers = op2Properties.getControlloTrafficoTempoComplessivoRispostaHeaderLimit();
  936.                             windows = op2Properties.getControlloTrafficoTempoComplessivoRispostaHeaderLimitWindows();
  937.                             break;
  938.                         case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  939.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoHeaderLimit();
  940.                             windows = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoHeaderLimitWindows();
  941.                             break;
  942.                         case NUMERO_RICHIESTE_FALLITE:
  943.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteHeaderLimit();
  944.                             windows = op2Properties.getControlloTrafficoNumeroRichiesteFalliteHeaderLimitWindows();
  945.                             break;
  946.                         case NUMERO_FAULT_APPLICATIVI:
  947.                             headers = op2Properties.getControlloTrafficoNumeroFaultApplicativiHeaderLimit();
  948.                             windows = op2Properties.getControlloTrafficoNumeroFaultApplicativiHeaderLimitWindows();
  949.                             break;
  950.                         case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  951.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteOFaultApplicativiHeaderLimit();
  952.                             windows = op2Properties.getControlloTrafficoNumeroRichiesteFalliteOFaultApplicativiHeaderLimitWindows();
  953.                             break;
  954.                         case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
  955.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoOFaultApplicativiHeaderLimit();
  956.                             windows = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoOFaultApplicativiHeaderLimitWindows();
  957.                             break;
  958.                         }
  959.                        
  960.                         if(policyConfigurationPorta.isForceHttpHeaders_limit_no_windows()) {
  961.                             windows = false;
  962.                         }
  963.                         else if(policyConfigurationPorta.isForceHttpHeaders_limit_windows()) {
  964.                             windows = true;
  965.                         }
  966.                        
  967.                         if(headers!=null && headers.length>0) {
  968.                            
  969.                             Long maxValue = risultatoUtilizzato.getMaxValueBeforeNormalizing()!=null ? risultatoUtilizzato.getMaxValueBeforeNormalizing() : risultatoUtilizzato.getMaxValue();
  970.                            
  971.                             StringBuilder sb = new StringBuilder("");
  972.                             if(windows && risultatoUtilizzato.getMsWindow()!=null && maxValue!=null) {
  973.                                 long ms = risultatoUtilizzato.getMsWindow();
  974.                                 long sec = -1;
  975.                                 if(ms>1000) {
  976.                                     // trasformo in secondi
  977.                                     sec = ms / 1000;
  978.                                 }
  979.                                 if(sec>0) {
  980.                                     sb.append(", ").append(maxValue.longValue()).append(";w=").append(sec);
  981.                                 }
  982.                                 if(!altrePolicy.isEmpty()) {
  983.                                     for (RisultatoVerificaPolicy r : altrePolicy) {
  984.                                        
  985.                                         Long maxValueR = r.getMaxValueBeforeNormalizing()!=null ? r.getMaxValueBeforeNormalizing() : r.getMaxValue();
  986.                                        
  987.                                         if(r.getMsWindow()!=null && maxValueR!=null) {
  988.                                             ms = r.getMsWindow();
  989.                                             sec = -1;
  990.                                             if(ms>1000) {
  991.                                                 // trasformo in secondi
  992.                                                 sec = ms / 1000;
  993.                                             }
  994.                                             if(sec>0) {
  995.                                                 sb.append(", ").append(maxValueR.longValue()).append(";w=").append(sec);
  996.                                             }
  997.                                         }
  998.                                     }
  999.                                 }
  1000.                             }
  1001.                            
  1002.                             for (String header : headers) {
  1003.                                 headerTrasportoRateLimiting.put(header, maxValue.longValue()+""+sb.toString());
  1004.                             }
  1005.                         }
  1006.                     }catch(Exception e) {
  1007.                         // errore non dovrebbe succedere
  1008.                     }
  1009.                 }
  1010.                
  1011.                 if(!policyConfigurationPorta.isDisabledHttpHeaders_remaining() && risultatoUtilizzato.getActualValue()!=null) {
  1012.                     long rimanenti = risultatoUtilizzato.getMaxValue().longValue() - risultatoUtilizzato.getActualValue().longValue();
  1013.                     if(rimanenti<0) {  // gli attuali conteggia anche quelle bloccate
  1014.                         rimanenti = 0;
  1015.                     }
  1016.                     if(rimanenti==0 && !risultatoUtilizzato.isViolata() && !risultatoUtilizzato.isRemainingZeroValue()) {
  1017.                         rimanenti = 1; // gestione cluster
  1018.                     }
  1019.                     try {
  1020.                         String [] headers = null;
  1021.                         switch (tipoRisorsa) {
  1022.                         case DIMENSIONE_MASSIMA_MESSAGGIO:
  1023.                             // non viene usata
  1024.                             break;
  1025.                         case NUMERO_RICHIESTE:
  1026.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteHeaderRemaining();
  1027.                             break;
  1028.                         case OCCUPAZIONE_BANDA:
  1029.                             headers = op2Properties.getControlloTrafficoOccupazioneBandaHeaderRemaining();
  1030.                             break;
  1031.                         case TEMPO_MEDIO_RISPOSTA:
  1032.                             // non ha senso
  1033.                             /**headers = op2Properties.getControlloTrafficoTempoMedioRispostaHeaderRemaining();*/
  1034.                             break;
  1035.                         case TEMPO_COMPLESSIVO_RISPOSTA:
  1036.                             headers = op2Properties.getControlloTrafficoTempoComplessivoRispostaHeaderRemaining();
  1037.                             break;
  1038.                         case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  1039.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoHeaderRemaining();
  1040.                             break;
  1041.                         case NUMERO_RICHIESTE_FALLITE:
  1042.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteHeaderRemaining();
  1043.                             break;
  1044.                         case NUMERO_FAULT_APPLICATIVI:
  1045.                             headers = op2Properties.getControlloTrafficoNumeroFaultApplicativiHeaderRemaining();
  1046.                             break;
  1047.                         case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  1048.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteOFaultApplicativiHeaderRemaining();
  1049.                             break;
  1050.                         case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
  1051.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoOFaultApplicativiHeaderRemaining();
  1052.                             break;
  1053.                         }
  1054.                         if(headers!=null && headers.length>0) {
  1055.                             for (String header : headers) {
  1056.                                 headerTrasportoRateLimiting.put(header, rimanenti+"");
  1057.                             }
  1058.                         }
  1059.                     }catch(Exception e) {
  1060.                         // errore non dovrebbe succedere
  1061.                     }
  1062.                 }
  1063.             }
  1064.             if(!policyConfigurationPorta.isDisabledHttpHeaders_reset() && risultatoUtilizzato!=null && risultatoUtilizzato.getMsBeforeResetCounters()!=null) {
  1065.                
  1066.                 long ms = risultatoUtilizzato.getMsBeforeResetCounters().longValue();
  1067.                 long sec = -1;
  1068.                 if(ms>1000) {
  1069.                     // trasformo in secondi
  1070.                     sec = ms / 1000;
  1071.                 }
  1072.                 else if(ms>0) {
  1073.                     // genero comunque l'header approssimando l'intervallo al secondo
  1074.                     sec=1;
  1075.                 }
  1076.                
  1077.                 if(sec>0) {
  1078.                     try {
  1079.                         String [] headers = null;
  1080.                         switch (tipoRisorsa) {
  1081.                         case DIMENSIONE_MASSIMA_MESSAGGIO:
  1082.                             // non viene usata
  1083.                             break;
  1084.                         case NUMERO_RICHIESTE:
  1085.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteHeaderReset();
  1086.                             break;
  1087.                         case OCCUPAZIONE_BANDA:
  1088.                             headers = op2Properties.getControlloTrafficoOccupazioneBandaHeaderReset();
  1089.                             break;
  1090.                         case TEMPO_MEDIO_RISPOSTA:
  1091.                             headers = op2Properties.getControlloTrafficoTempoMedioRispostaHeaderReset();
  1092.                             break;
  1093.                         case TEMPO_COMPLESSIVO_RISPOSTA:
  1094.                             headers = op2Properties.getControlloTrafficoTempoComplessivoRispostaHeaderReset();
  1095.                             break;
  1096.                         case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  1097.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoHeaderReset();
  1098.                             break;
  1099.                         case NUMERO_RICHIESTE_FALLITE:
  1100.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteHeaderReset();
  1101.                             break;
  1102.                         case NUMERO_FAULT_APPLICATIVI:
  1103.                             headers = op2Properties.getControlloTrafficoNumeroFaultApplicativiHeaderReset();
  1104.                             break;
  1105.                         case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  1106.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteFalliteOFaultApplicativiHeaderReset();
  1107.                             break;
  1108.                         case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
  1109.                             headers = op2Properties.getControlloTrafficoNumeroRichiesteCompletateConSuccessoOFaultApplicativiHeaderReset();
  1110.                             break;
  1111.                         }
  1112.                        
  1113.                         if(headers!=null && headers.length>0) {
  1114.                             for (String header : headers) {
  1115.                                 headerTrasportoRateLimiting.put(header, sec+"");
  1116.                             }
  1117.                         }
  1118.                     }catch(Exception e) {
  1119.                         // errore non dovrebbe succedere
  1120.                     }
  1121.                 }
  1122.             }
  1123.         }
  1124.        
  1125.     }

  1126.    
  1127.     private boolean isCondizioneCongestionamentoPortaDominio(InRequestProtocolContext context,
  1128.             GestoreControlloTraffico gestoreControlloCongestione,
  1129.             MsgDiagnostico msgDiag, Transaction tr) throws TransactionDeletedException{
  1130.        
  1131.         if(context==null) {
  1132.             throw new TransactionDeletedException("Context is null");
  1133.         }
  1134.        
  1135.         PdDContext pddContext = context.getPddContext();
  1136.        
  1137.         boolean isPddCongestionataInformazioneIdentificataDalThread = false;
  1138.         Object oPddCongestionataThread = pddContext.getObject(CostantiControlloTraffico.PDD_CONTEXT_PDD_CONGESTIONATA);
  1139.         if(oPddCongestionataThread instanceof Boolean){
  1140.             isPddCongestionataInformazioneIdentificataDalThread = (Boolean) oPddCongestionataThread;
  1141.         }
  1142.        
  1143.         String idTransazione = null;
  1144.         if(context.getPddContext()!=null && context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE)) {
  1145.             idTransazione = (String) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.ID_TRANSAZIONE);
  1146.         }
  1147.        
  1148.         boolean sync = true;
  1149.         if(context.getStato() instanceof StateMessage) {
  1150.             StateMessage state = (StateMessage) context.getStato();
  1151.             if(state.getConnectionDB()!=null) {
  1152.                 /**System.out.println("SYNC FALSE CONNECTION FOUND!");*/
  1153.                 sync=false;
  1154.             }
  1155.         }
  1156.         StatoTraffico statoControlloCongestione = gestoreControlloCongestione.getStatoControlloTraffico(idTransazione,sync);
  1157.         if(statoControlloCongestione.isPddCongestionata()!=isPddCongestionataInformazioneIdentificataDalThread){
  1158.             /**System.out.println("Rilevata differenza tra controllo del traffico attivo PREINHANDLER ["+controlloTrafficoAttivoThread+"] e stato attuale["+statoControlloCongestione.getControlloTraffico()+"]");*/
  1159.             pddContext.removeObject(CostantiControlloTraffico.PDD_CONTEXT_PDD_CONGESTIONATA);
  1160.             pddContext.addObject(CostantiControlloTraffico.PDD_CONTEXT_PDD_CONGESTIONATA, statoControlloCongestione.isPddCongestionata());
  1161.         }
  1162.        
  1163.         // Aggiungo al msgDiag i valori delle tre costanti poichè mi servirà anche per diagnostici durante la verifica delle policy.
  1164.         // Vanno aggiunti anche se la pdd non risulta congestionata
  1165.        
  1166.         msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_ACTIVE_THREADS, statoControlloCongestione.getActiveThreads()+"");
  1167.         pddContext.addObject(GeneratoreMessaggiErrore.PDD_CONTEXT_ACTIVE_THREADS, statoControlloCongestione.getActiveThreads());
  1168.        
  1169.         Object oMaxThreads = pddContext.getObject(GeneratoreMessaggiErrore.PDD_CONTEXT_MAX_THREADS_THRESHOLD);
  1170.         if(oMaxThreads!=null){
  1171.             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_MAX_THREADS_THRESHOLD, oMaxThreads.toString());
  1172.         }
  1173.        
  1174.         Object oThreshold = pddContext.getObject(GeneratoreMessaggiErrore.PDD_CONTEXT_CONTROLLO_TRAFFICO_THRESHOLD);
  1175.         if(oThreshold!=null){
  1176.             msgDiag.addKeyword(GeneratoreMessaggiErrore.TEMPLATE_CONTROLLO_TRAFFICO_THRESHOLD, oThreshold.toString());
  1177.         }
  1178.        
  1179.         if(statoControlloCongestione.isPddCongestionata()){
  1180.             // Emetto qua il diagnostico che la porta è congestionata.
  1181.             // Potrei emetterlo anche nel preInHandler, però lo emetto anzi qua perche viene poi usato qua la condizione per capire se attivare o meno una policy.
  1182.            
  1183.            
  1184.             // Aggiunto come evento della transazione l'informazione che la PdD è congestionata
  1185.             tr.addEventoGestione(TipoEvento.CONTROLLO_TRAFFICO_SOGLIA_CONGESTIONE.getValue()+"_"+CodiceEventoControlloTraffico.VIOLAZIONE.getValue());
  1186.            
  1187.            
  1188.             // Emetto Diagnostico Controllo del Traffico Attivato
  1189.             msgDiag.logPersonalizzato(GeneratoreMessaggiErrore.MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_PDD_CONGESTIONATA);
  1190.            
  1191.         }
  1192.        
  1193.         return statoControlloCongestione.isPddCongestionata();
  1194.     }
  1195.    
  1196.    
  1197.     // Ritorna un MsgDiagnostico generator
  1198.     private MsgDiagnostico buildMsgDiagnostico(InRequestProtocolContext context) throws HandlerException{
  1199.         MsgDiagnostico msgDiag = null;
  1200.         try{
  1201.             String nomePorta = null;
  1202.             if(context.getIntegrazione()!=null) {
  1203.                 if(context.getIntegrazione().getIdPA()!=null) {
  1204.                     nomePorta = context.getIntegrazione().getIdPA().getNome();
  1205.                 }
  1206.                 else if(context.getIntegrazione().getIdPD()!=null) {
  1207.                     nomePorta = context.getIntegrazione().getIdPD().getNome();
  1208.                 }
  1209.             }
  1210.            
  1211.             RequestInfo requestInfo = null;
  1212.             if(context.getPddContext()!=null && context.getPddContext().containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  1213.                 requestInfo = (RequestInfo) context.getPddContext().getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  1214.             }
  1215.            
  1216.             msgDiag = MsgDiagnostico.newInstance(context.getTipoPorta(),context.getIdModulo(),nomePorta, requestInfo);
  1217.             msgDiag.setPddContext(context.getPddContext(), context.getProtocolFactory());
  1218.             if(org.openspcoop2.core.constants.TipoPdD.DELEGATA.equals(context.getTipoPorta())){
  1219.                 msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_CONTENUTI_APPLICATIVI);
  1220.             }
  1221.             else{
  1222.                 msgDiag.setPrefixMsgPersonalizzati(MsgDiagnosticiProperties.MSG_DIAG_RICEZIONE_BUSTE);
  1223.             }
  1224.         }catch(Exception e){
  1225.             throw new HandlerException("Generazione Messaggio Diagnostico non riuscita: "+e.getMessage(), e);
  1226.         }
  1227.         return msgDiag;
  1228.     }
  1229.    

  1230. }