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.utils.EsitiProperties;
  76. import org.openspcoop2.utils.Utilities;
  77. import org.slf4j.Logger;

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

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

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

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

  287.            
  288.             try{
  289.                

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

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

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

  787.             }
  788.            
  789.         }

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

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

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

  1216. }