GeneratoreMessaggiErrore.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;

  21. import java.util.List;

  22. import org.openspcoop2.core.controllo_traffico.constants.TipoErrore;
  23. import org.openspcoop2.message.constants.ServiceBinding;
  24. import org.openspcoop2.pdd.core.PdDContext;
  25. import org.openspcoop2.pdd.core.handlers.HandlerException;
  26. import org.openspcoop2.protocol.basic.Costanti;
  27. import org.openspcoop2.protocol.sdk.Context;
  28. import org.openspcoop2.protocol.sdk.ProtocolException;
  29. import org.openspcoop2.protocol.sdk.constants.EsitoTransazioneName;
  30. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  31. import org.openspcoop2.protocol.utils.ErroriProperties;
  32. import org.openspcoop2.utils.Map;
  33. import org.openspcoop2.utils.MapKey;
  34. import org.openspcoop2.utils.transport.http.HttpConstants;
  35. import org.slf4j.Logger;

  36. /**    
  37.  * GeneratoreMessaggiErrore
  38.  *
  39.  * @author Poli Andrea (poli@link.it)
  40.  * @author $Author$
  41.  * @version $Rev$, $Date$
  42.  */
  43. public class GeneratoreMessaggiErrore {
  44.    
  45.     private GeneratoreMessaggiErrore() {}

  46.    
  47.     // identificativi diagnostici parziali per policy violate
  48.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_SIMULTANEE = "controlloTraffico.policy.violata.risorsaNumeroRichieste.simultaneo";
  49.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE = "controlloTraffico.policy.violata.risorsaNumeroRichieste";
  50.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_OCCUPAZIONE_BANDA = "controlloTraffico.policy.violata.risorsaOccupazioneBanda";
  51.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_TEMPO_COMPLESSIVO = "controlloTraffico.policy.violata.risorsaTempoComplessivo";
  52.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_TEMPO_MEDIO = "controlloTraffico.policy.violata.risorsaTempoMedio";
  53.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO = "controlloTraffico.policy.violata.risorsaNumeroRichiesteCompletateConSuccesso";
  54.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_FALLITE = "controlloTraffico.policy.violata.risorsaNumeroRichiesteFallite";
  55.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_FAULT_APPLICATIVI = "controlloTraffico.policy.violata.risorsaNumeroFaultApplicativi";
  56.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_FALLITE_O_FAULT_APPLICATIVI= "controlloTraffico.policy.violata.risorsaNumeroRichiesteFalliteOFaultApplicativi";
  57.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_VIOLATA_NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_O_FAULT_APPLICATIVI = "controlloTraffico.policy.violata.risorsaNumeroRichiesteCompletateConSuccessoOFaultApplicativi";
  58.    
  59.     // identificativi diagnostici parziali per applicabilità policy
  60.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_PDD_NON_CONGESTIONATA = "controlloTraffico.policy.applicabilita.nonCongestionato";
  61.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_PDD_NON_CONGESTIONATA_CONTROLLO_DISABILITATO = "controlloTraffico.policy.applicabilita.controlloCongestioneDisabilitato";
  62.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_DEGRADO_PRESTAZIONALE_RILEVATO = "controlloTraffico.policy.applicabilita.degradoPrestazionale.rilevato";
  63.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_DEGRADO_PRESTAZIONALE_NON_RILEVATO = "controlloTraffico.policy.applicabilita.degradoPrestazionale.nonRilevato";
  64.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_STATO_ALLARME_RILEVATO = "controlloTraffico.policy.applicabilita.statoAllarme.rilevato";
  65.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_POLICY_APPLICABILITA_STATO_ALLARME_NON_RILEVATO = "controlloTraffico.policy.applicabilita.statoAllarme.nonRilevato";
  66.    
  67.     // identificativi diagnostici
  68.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_MAXREQUESTS_VIOLATED = "controlloTraffico.maxRequestsViolated";
  69.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_MAXREQUESTS_VIOLATED_WARNING_ONLY = "controlloTraffico.maxRequestsViolatedWarningOnly";
  70.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_PDD_CONGESTIONATA = "controlloTraffico.pddCongestionata";
  71.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_IN_CORSO = "controlloTraffico.policy.controlloInCorso";
  72.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_TERMINATO_CON_SUCCESSO = "controlloTraffico.policy.controlloTerminato.richiestaNonBloccata";
  73.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_CONTROLLO_TERMINATO_CON_ERRORE = "controlloTraffico.policy.controlloTerminato.richiestaBloccata";
  74.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_DISABILITATA = "controlloTraffico.policy.disabilitata";
  75.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_FILTRATA = "controlloTraffico.policy.filtrata";
  76.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_NON_APPLICABILE = "controlloTraffico.policy.nonApplicabile";
  77.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_VIOLATA = "controlloTraffico.policy.violata";
  78.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_VIOLATA_WARNING_ONLY = "controlloTraffico.policy.violataWarningOnly";
  79.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_RISPETTATA = "controlloTraffico.policy.rispettata";
  80.     public static final String MSG_DIAGNOSTICO_INTERCEPTOR_CONTROLLO_TRAFFICO_POLICY_IN_ERRORE = "controlloTraffico.policy.inErrore";
  81.    
  82.    
  83.    
  84.    
  85.     // ** KEYWORDS
  86.     public static final String TEMPLATE_MAX_THREADS_THRESHOLD = "@CT_MAX_THREADS_THRESHOLD@"; // numero massimo di richieste simultanee configurate sul sistema
  87.     public static final String TEMPLATE_CONTROLLO_TRAFFICO_THRESHOLD = "@CT_THRESHOLD@"; // soglia in % che indica quando attivare il controllo del traffico
  88.     public static final String TEMPLATE_ACTIVE_THREADS = "@CT_ACTIVE_THREADS@"; // threads attivi
  89.     public static final String TEMPLATE_NUMERO_POLICY = "@CT_POLICIES@"; // numero di policy configurate
  90.     public static final String TEMPLATE_NUMERO_POLICY_DISABILITATE = "@CT_DISABLED_POLICIES@"; // numero di policy disabilitate
  91.     public static final String TEMPLATE_NUMERO_POLICY_FILTRATE = "@CT_FILTERED_POLICIES@"; // numero di policy filtrate
  92.     public static final String TEMPLATE_NUMERO_POLICY_NON_APPLICATE = "@CT_NOT_APPLICABLED_POLICIES@"; // numero di policy non applicabili
  93.     public static final String TEMPLATE_NUMERO_POLICY_RISPETTATE = "@CT_RESPECTED_POLICIES@"; // numero di policy rispettate
  94.     public static final String TEMPLATE_NUMERO_POLICY_VIOLATE = "@CT_VIOLATED_POLICIES@"; // numero di policy violate
  95.     public static final String TEMPLATE_NUMERO_POLICY_VIOLATE_WARNING_ONLY = "@CT_VIOLATED_WARNING_ONLY_POLICIES@"; // numero di policy violate in warning only mode
  96.     public static final String TEMPLATE_NUMERO_POLICY_IN_ERRORE = "@CT_ERROR_POLICIES@"; // numero di policy la cui verifica ha provocato un errore
  97.    
  98.     // ** KEYWORDS UTILIZZATE SOLAMENTE IN CONDIZIONI DI ERRORE O DEBUG
  99.     // sono i diagnostici emessi dai moduli ricezione contenuti o buste
  100.     public static final String TEMPLATE_POLICY_ACTIVE_ID = "@CT_POLICY_ACTIVE_ID@"; // identificativo della policy attivata
  101.     public static final String TEMPLATE_POLICY_ACTIVE_TIPO = "@CT_POLICY_ACTIVE_TIPO@"; // tipo della policy attivata (Globale/API)
  102.     public static final String TEMPLATE_POLICY_ACTIVE_ALIAS = "@CT_POLICY_ACTIVE_ALIAS@"; // alias della policy attivata
  103.     public static final String TEMPLATE_POLICY_ACTIVE_RISORSA = "@CT_POLICY_ACTIVE_RISORSA@"; // risorsa in fase di valutazione (es. NumeroRichieste, OccupazioneBanda...)
  104.     public static final String TEMPLATE_POLICY_ACTIVE_CONTINUE = "@CT_POLICY_ACTIVE_CONTINUE@"; //  true/false; indica se la valutazione delle policy per la stessa risorsa deve continuare o meno
  105.     public static final String TEMPLATE_POLICY_VIOLATA_MOTIVO = "@CT_POLICY_ERROR_MSG@"; // errore di violazione riscontrato sulla policy
  106.     public static final String TEMPLATE_POLICY_FILTRATA_MOTIVO = "@CT_POLICY_FILTERED_REASON@"; // motivo di filtro della policy
  107.     public static final String TEMPLATE_POLICY_NON_APPLICABILE_MOTIVO = "@CT_POLICY_NOT_APPLICABLED_REASON@"; // motivo della mancata applicabilità
  108.    
  109.     public static final String TEMPLATE_POLICY_FILTRATA_MOTIVO_FILTRO = "i dati della transazione non rispettano i criteri di filtro impostati: ";
  110.     public static final String TEMPLATE_POLICY_FILTRATA_MOTIVO_BREAK = "rilevata precedente policy soddisfatta";
  111.     public static final String TEMPLATE_POLICY_FILTRATA_MOTIVO_BREAK_VIOLATA = "rilevata precedente policy violata";
  112.    
  113.     // sono i diagnostici di "appoggio" registrati nel modulo 'all' utilizzati per generare l'errore
  114.     public static final String TEMPLATE_POLICY_VALORE_SOGLIA = "@CT_SOGLIA@"; // valore della soglia di una policy
  115.     public static final String TEMPLATE_POLICY_TIPOLOGIA_TEMPO_MEDIO = "@CT_TIPOLOGIA_TEMPO_MEDIO@"; // tipologia di tempo medio (servizio, totale...)
  116.     public static final String TEMPLATE_POLICY_VALORE_RILEVATO =  "@CT_RILEVATO@"; // contatore rilevato
  117.     public static final String TEMPLATE_POLICY_AVG_TIME_RILEVATO = "@CT_AVG_TIME_RILEVATO@"; // tempo medio rilevato
  118.     public static final String TEMPLATE_POLICY_VALORE_SOGLIA_DEGRADO_PRESTAZIONALE = "@CT_DEGRADO_SOGLIA@"; // valore di soglia per il degrado prestazionale
  119.     public static final String TEMPLATE_POLICY_GRUPPO = "@CT_DATI_IDENTIFICATIVI_GRUPPO@"; // raggruppamento
  120.     public static final String TEMPLATE_POLICY_INTERVALLO_TEMPORALE = "@CT_INTERVALLO_TEMPORALE@"; // intervallo temporale configurato
  121.     public static final String TEMPLATE_POLICY_NOME_ALLARME = "@CT_NOME_ALLARME@"; // nome dell'allarme utilizzata nelle condizioni di applicabilità
  122.     public static final String TEMPLATE_POLICY_STATO_ALLARME = "@CT_STATO_ALLARME@"; // stato dell'allarme
  123.     public static final String TEMPLATE_POLICY_STATO_ALLARME_ATTESO = "@CT_STATO_ALLARME_ATTESO@"; // stato dell'allarme atteso
  124.    

  125.    
  126.     private static final String SISTEMA_NON_DISPONIBILE = "Servizio Temporaneamente Non Erogabile";
  127.        
  128.     private static final String ERRORE_PROCESSAMENTO_CODE = "CC00";
  129.     private static final String MAX_THREADS_VIOLATED_CODE = "CC01";
  130.    
  131.     private static final String ERRORE_GENERICO_DURANTE_VERIFICA = "ERR-";
  132.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_UNKNOW_TIPO = "CP00";
  133.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_SIMULTANEE_CODE = "CP01";
  134.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_CODE = "CP02";
  135.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_OCCUPAZIONE_BANDA_CODE = "CP03";
  136.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_TEMPO_COMPLESSIVO_CODE = "CP04";
  137.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_TEMPO_MEDIO_CODE = "CP05";
  138.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_CODE = "CP06";
  139.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_FALLITE_CODE = "CP07";
  140.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_FAULT_APPLICATIVI_CODE = "CP08";
  141.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_FALLITE_O_FAULT_APPLICATIVI_CODE = "CP09";
  142.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_DIMENSIONE_MASSIMA_MESSAGGIO_CODE = "CP10";
  143.     private static final String CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_O_FAULT_APPLICATIVI_CODE = "CP11";
  144.     private static final String APPLICABILITA_CONGESTIONE_CODE = "-CC";
  145.     private static final String APPLICABILITA_DEGRADO_CODE = "-DP";
  146.     private static final String APPLICABILITA_STATO_ALLARME_CODE = "-SA";
  147.    
  148.    
  149.    
  150.     /* ***** EVENTI UTILI PER RICONOSCERE L'ESITO DELLA TRANSAZIONE ****** */
  151.    
  152.     public static final MapKey<String> PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE = org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE;
  153.    
  154.     private static final String PDD_CONTEXT_VALUE_GENERIC_ERROR = "controlloTrafficoGenericError";
  155.     public static void addPddContextInfoControlloTrafficoGenericError(PdDContext pddContext){
  156.         pddContext.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_GENERIC_ERROR);
  157.     }
  158.    
  159.     private static final String PDD_CONTEXT_VALUE_MAX_THREADS_VIOLATO = "controlloTrafficoNumeroMassimoRichiesteSimultaneeViolato";
  160.     private static final String PDD_CONTEXT_VALUE_MAX_THREADS_VIOLATO_WARNING_ONLY = "controlloTrafficoNumeroMassimoRichiesteSimultaneeViolatoWarningOnly";
  161.     public static void addPddContextInfoControlloTrafficoMaxThreadsViolated(PdDContext pddContext, boolean warningOnly){
  162.         if(warningOnly){
  163.             pddContext.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_MAX_THREADS_VIOLATO_WARNING_ONLY);
  164.         }
  165.         else{
  166.             pddContext.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_MAX_THREADS_VIOLATO);
  167.         }
  168.     }
  169.    
  170.     private static final String PDD_CONTEXT_VALUE_POLICY_VIOLATA = org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_POLICY_VIOLATA;
  171.     private static final String PDD_CONTEXT_VALUE_POLICY_VIOLATA_WARNING_ONLY = org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_POLICY_VIOLATA_WARNING_ONLY;
  172.     private static final String PDD_CONTEXT_VALUE_POLICY_IN_ERRORE = org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_POLICY_IN_ERRORE;
  173.     public static void addPddContextInfoControlloTrafficoPolicyViolated(PdDContext pddContext, boolean warningOnly){
  174.         addContextInfoControlloTrafficoPolicyViolated(pddContext, warningOnly);
  175.     }
  176.     public static void addContextInfoControlloTrafficoPolicyViolated(Context context, boolean warningOnly){
  177.         if(warningOnly){
  178.             context.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_POLICY_VIOLATA_WARNING_ONLY);
  179.         }
  180.         else{
  181.             context.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_POLICY_VIOLATA);
  182.         }
  183.     }
  184.    
  185.     public static void addPddContextInfoControlloTrafficoPolicyInError(PdDContext pddContext, EsitoTransazioneName esito){
  186.         pddContext.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_POLICY_IN_ERRORE);
  187.         pddContext.addObject(org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_POLICY_IN_ERROR_ESITO, esito);
  188.     }
  189.    
  190.     public static final MapKey<String> PDD_CONTEXT_MAX_THREADS_THRESHOLD = Map.newMapKey("CT_MAX_THREADS_THRESHOLD"); // numero massimo di richieste simultanee configurate sul sistema
  191.     public static final MapKey<String> PDD_CONTEXT_CONTROLLO_TRAFFICO_THRESHOLD = Map.newMapKey("CT_THRESHOLD"); // soglia in % che indica quando attivare il controllo del traffico
  192.    
  193.     public static final MapKey<String> PDD_CONTEXT_ACTIVE_THREADS = Map.newMapKey("CT_ACTIVE_THREADS"); // threads attivi
  194.     public static final MapKey<String> PDD_CONTEXT_NUMERO_POLICY = Map.newMapKey("CT_POLICIES"); // numero di policy configurate
  195.     public static final MapKey<String> PDD_CONTEXT_NUMERO_POLICY_DISABILITATE = Map.newMapKey("CT_DISABLED_POLICIES"); // numero di policy disabilitate
  196.     public static final MapKey<String> PDD_CONTEXT_NUMERO_POLICY_FILTRATE = Map.newMapKey("CT_FILTERED_POLICIES"); // numero di policy filtrate
  197.     public static final MapKey<String> PDD_CONTEXT_NUMERO_POLICY_NON_APPLICATE = Map.newMapKey("CT_NOT_APPLICABLED_POLICIES"); // numero di policy non applicabili
  198.     public static final MapKey<String> PDD_CONTEXT_NUMERO_POLICY_RISPETTATE = Map.newMapKey("CT_RESPECTED_POLICIES"); // numero di policy rispettate
  199.     public static final MapKey<String> PDD_CONTEXT_NUMERO_POLICY_VIOLATE = Map.newMapKey("CT_VIOLATED_POLICIES"); // numero di policy violate
  200.     public static final MapKey<String> PDD_CONTEXT_NUMERO_POLICY_VIOLATE_WARNING_ONLY = Map.newMapKey("CT_VIOLATED_WARNING_ONLY_POLICIES"); // numero di policy violate in warning only mode
  201.     public static final MapKey<String> PDD_CONTEXT_NUMERO_POLICY_IN_ERRORE = Map.newMapKey("CT_ERROR_POLICIES"); // numero di policy la cui verifica ha provocato un errore
  202.    
  203.     private static final String PDD_CONTEXT_VALUE_CONNECTION_TIMEOUT = org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_CONNECTION_TIMEOUT;
  204.     private static final String PDD_CONTEXT_VALUE_REQUEST_READ_TIMEOUT = org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_REQUEST_READ_TIMEOUT;
  205.     private static final String PDD_CONTEXT_VALUE_RESPONSE_READ_TIMEOUT = org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_RESPONSE_READ_TIMEOUT;
  206.     private static final String PDD_CONTEXT_VALUE_READ_TIMEOUT = org.openspcoop2.core.controllo_traffico.constants.Costanti.PDD_CONTEXT_VALUE_READ_TIMEOUT;
  207.     public static boolean addPddContextInfoControlloTrafficoConnectionTimeout(Context pddContext){
  208.         if(alreadyExistsPddContextInfoControlloTrafficoTimeout(pddContext, PDD_CONTEXT_VALUE_CONNECTION_TIMEOUT)) {
  209.             return false;
  210.         }
  211.         pddContext.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_CONNECTION_TIMEOUT);
  212.         return true;
  213.     }
  214.     public static boolean addPddContextInfoControlloTrafficoReadRequestTimeout(Context pddContext, boolean checkAll){
  215.         if(checkAll) {
  216.             if(alreadyExistsPddContextInfoControlloTrafficoTimeout(pddContext,
  217.                     PDD_CONTEXT_VALUE_READ_TIMEOUT, PDD_CONTEXT_VALUE_RESPONSE_READ_TIMEOUT, PDD_CONTEXT_VALUE_REQUEST_READ_TIMEOUT)) {
  218.                 return false;
  219.             }
  220.         }
  221.         else if(alreadyExistsPddContextInfoControlloTrafficoTimeout(pddContext, PDD_CONTEXT_VALUE_REQUEST_READ_TIMEOUT)) {
  222.             return false;
  223.         }
  224.         pddContext.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_REQUEST_READ_TIMEOUT);
  225.         return true;
  226.     }
  227.     public static boolean addPddContextInfoControlloTrafficoReadResponseTimeout(Context pddContext, boolean checkAll){
  228.         if(checkAll) {
  229.             if(alreadyExistsPddContextInfoControlloTrafficoTimeout(pddContext,
  230.                     PDD_CONTEXT_VALUE_READ_TIMEOUT, PDD_CONTEXT_VALUE_RESPONSE_READ_TIMEOUT, PDD_CONTEXT_VALUE_REQUEST_READ_TIMEOUT)) {
  231.                 return false;
  232.             }
  233.         }
  234.         else if(alreadyExistsPddContextInfoControlloTrafficoTimeout(pddContext, PDD_CONTEXT_VALUE_RESPONSE_READ_TIMEOUT)) {
  235.             return false;
  236.         }
  237.         pddContext.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_RESPONSE_READ_TIMEOUT);
  238.         return true;
  239.     }
  240.     public static boolean addPddContextInfoControlloTrafficoReadTimeout(Context pddContext, boolean checkAll){
  241.         if(checkAll) {
  242.             if(alreadyExistsPddContextInfoControlloTrafficoTimeout(pddContext,
  243.                     PDD_CONTEXT_VALUE_READ_TIMEOUT, PDD_CONTEXT_VALUE_RESPONSE_READ_TIMEOUT, PDD_CONTEXT_VALUE_REQUEST_READ_TIMEOUT)) {
  244.                 return false;
  245.             }
  246.         }
  247.         else if(alreadyExistsPddContextInfoControlloTrafficoTimeout(pddContext, PDD_CONTEXT_VALUE_READ_TIMEOUT)) {
  248.             return false;
  249.         }
  250.         pddContext.addObject(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE, PDD_CONTEXT_VALUE_READ_TIMEOUT);
  251.         return true;
  252.     }
  253.     private static boolean alreadyExistsPddContextInfoControlloTrafficoTimeout(Context pddContext, String ... valore) {
  254.         if(valore!=null && valore.length>0) {
  255.             for (String v : valore) {
  256.                 if(alreadyExistsPddContextInfoControlloTrafficoTimeout(pddContext, v)) {
  257.                     return true;
  258.                 }
  259.             }
  260.         }
  261.         return false;
  262.     }
  263.     private static boolean alreadyExistsPddContextInfoControlloTrafficoTimeout(Context pddContext, String valore) {
  264.         if(pddContext.containsKey(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE)) {
  265.             String tipo = (String) pddContext.get(PDD_CONTEXT_NAME_CONTROLLO_TRAFFICO_VIOLAZIONE);
  266.             if(tipo!=null) {
  267.                 return valore.equals(tipo);
  268.             }
  269.         }
  270.         return false;
  271.     }
  272.    
  273.     /* ***** FAULT ****** */
  274.    
  275.     public static HandlerException getErroreProcessamento(Exception e,
  276.             PdDContext pddContext){
  277.                
  278.         if(pddContext!=null) {
  279.             // nop
  280.         }
  281.        
  282.         HandlerException he = new HandlerException( SISTEMA_NON_DISPONIBILE + " [" + ERRORE_PROCESSAMENTO_CODE + "]" , e);
  283.         he.setCustomizedResponse(true);
  284.         he.setCustomizedResponseAs4xxCode(false);
  285.         he.setCustomizedResponseCode(ERRORE_PROCESSAMENTO_CODE);
  286.        
  287.         return he;

  288.     }
  289.    
  290.     public static HandlerException getMaxThreadsViolated(String messaggioErroreInChiaro, boolean erroreGenerico,
  291.             PdDContext pddContext){
  292.        
  293.         if(pddContext!=null) {
  294.             // nop
  295.         }
  296.        
  297.         HandlerException he =  null;
  298.        
  299.         if(erroreGenerico){
  300.             he = new HandlerException( SISTEMA_NON_DISPONIBILE + " [" + MAX_THREADS_VIOLATED_CODE + "]" );
  301.         }
  302.         else{
  303.             he = new HandlerException( messaggioErroreInChiaro );
  304.         }
  305.        
  306.         he.setCustomizedResponse(true);
  307.         he.setCustomizedResponseAs4xxCode(true);
  308.         he.setCustomizedResponseCode(MAX_THREADS_VIOLATED_CODE);
  309.         he.setIntegrationFunctionError(IntegrationFunctionError.TOO_MANY_REQUESTS);
  310.                        
  311.         return he;
  312.     }
  313.    
  314.     public static HandlerException getControlloTrafficoPolicyViolated(List<RisultatoVerificaPolicy> policyViolate, boolean erroreGenerico,
  315.             PdDContext pddContext){
  316.        
  317.         if(pddContext!=null) {
  318.             // nop
  319.         }
  320.        
  321.         HandlerException he =  null;
  322.        
  323.         StringBuilder bf = new StringBuilder();
  324.         if(!erroreGenerico){
  325.             bf.append("Rilevate "+policyViolate.size()+" policy violate:\n");
  326.         }
  327.         boolean limitExceededConditionalCongestion = false;
  328.         boolean limitExceededConditionalDeteriorationPerformance = false;
  329.         boolean limitExceeded = false;
  330.         boolean tooManyRequestsConditionalCongestion = false;
  331.         boolean tooManyRequestsConditionalDeteriorationPerformance = false;
  332.         boolean tooManyRequests = false;
  333.                
  334.         for (int i = 0; i < policyViolate.size(); i++) {
  335.             RisultatoVerificaPolicy risultato = policyViolate.get(i);
  336.            
  337.             if(!risultato.isErroreGenerico()) {
  338.                 if(risultato.isSimultanee()) {
  339.                     if(risultato.isApplicabilitaCongestione()) {
  340.                         tooManyRequestsConditionalCongestion = true;
  341.                     }
  342.                     else if(risultato.isApplicabilitaDegradoPrestazionale()) {
  343.                         tooManyRequestsConditionalDeteriorationPerformance = true;
  344.                     }
  345.                     else if(risultato.isApplicabilitaStatoAllarme()) {
  346.                         tooManyRequestsConditionalDeteriorationPerformance = true; // fare IntegrationFunctionError apposito
  347.                     }
  348.                     else {
  349.                         tooManyRequests = true;
  350.                     }
  351.                 }
  352.                 else {
  353.                     if(risultato.isApplicabilitaCongestione()) {
  354.                         limitExceededConditionalCongestion = true;
  355.                     }
  356.                     else if(risultato.isApplicabilitaDegradoPrestazionale()) {
  357.                         limitExceededConditionalDeteriorationPerformance = true;
  358.                     }
  359.                     else if(risultato.isApplicabilitaStatoAllarme()) {
  360.                         limitExceededConditionalDeteriorationPerformance = true; // fare IntegrationFunctionError apposito
  361.                     }
  362.                     else {
  363.                         limitExceeded = true;
  364.                     }
  365.                 }
  366.             }
  367.             else {
  368.                 tooManyRequests = true; // viene scelto questo
  369.             }
  370.            
  371.             if(erroreGenerico){
  372.                
  373.                 if(i>0){
  374.                     bf.append(",");
  375.                 }
  376.                
  377.                 bf.append(toCode(risultato));
  378.                
  379.             }
  380.             else{
  381.                
  382.                 if(i>0){
  383.                     bf.append("\n");
  384.                 }
  385.                
  386.                 if(risultato.isErroreGenerico()){
  387.                     bf.append("\tPolicy-"+(i+1)+" (Errore interno) "+risultato.getDescrizione());
  388.                 }
  389.                 else{
  390.                     bf.append("\tPolicy-"+(i+1)+" (Violata) "+risultato.getDescrizione());
  391.                 }
  392.             }
  393.         }
  394.        
  395.         if(erroreGenerico){
  396.             he = new HandlerException( SISTEMA_NON_DISPONIBILE + " [" + bf.toString() + "]" );
  397.         }
  398.         else{
  399.             he = new HandlerException( bf.toString() );
  400.         }
  401.        
  402.         he.setCustomizedResponse(true);
  403.         he.setCustomizedResponseAs4xxCode(true);
  404.         StringBuilder bfCode = new StringBuilder();
  405.         for (int i = 0; i < policyViolate.size(); i++) {
  406.             RisultatoVerificaPolicy risultato = policyViolate.get(i);
  407.             if(i>0){
  408.                 bfCode.append("_");
  409.             }
  410.             bfCode.append(toCode(risultato));
  411.         }
  412.         he.setCustomizedResponseCode(bfCode.toString());
  413.        
  414.         if(limitExceeded) {
  415.             // prevale poiche' il client non potra rispedire
  416.             he.setIntegrationFunctionError(IntegrationFunctionError.LIMIT_EXCEEDED);
  417.         }
  418.         else if(limitExceededConditionalCongestion) {
  419.             he.setIntegrationFunctionError(IntegrationFunctionError.LIMIT_EXCEEDED_CONDITIONAL_CONGESTION);
  420.         }
  421.         else if(limitExceededConditionalDeteriorationPerformance) {
  422.             he.setIntegrationFunctionError(IntegrationFunctionError.LIMIT_EXCEEDED_CONDITIONAL_DETERIORATION_PERFORMANCE);
  423.         }
  424.         else if(tooManyRequests) {
  425.             he.setIntegrationFunctionError(IntegrationFunctionError.TOO_MANY_REQUESTS);
  426.         }
  427.         else if(tooManyRequestsConditionalCongestion) {
  428.             he.setIntegrationFunctionError(IntegrationFunctionError.TOO_MANY_REQUESTS_CONDITIONAL_CONGESTION);
  429.         }
  430.         else if(tooManyRequestsConditionalDeteriorationPerformance) {
  431.             he.setIntegrationFunctionError(IntegrationFunctionError.TOO_MANY_REQUESTS_CONDITIONAL_DETERIORATION_PERFORMANCE);
  432.         }
  433.         else {
  434.             he.setIntegrationFunctionError(IntegrationFunctionError.TOO_MANY_REQUESTS);
  435.         }
  436.        
  437.         return he;
  438.     }

  439.     private static String toCode(RisultatoVerificaPolicy risultato) {
  440.         StringBuilder bf = new StringBuilder();
  441.         if(risultato.isErroreGenerico()){
  442.             bf.append(ERRORE_GENERICO_DURANTE_VERIFICA);
  443.         }
  444.        
  445.         if(risultato.getRisorsa()==null){
  446.             bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_UNKNOW_TIPO);
  447.         }
  448.         else{
  449.             switch (risultato.getRisorsa()) {
  450.             case NUMERO_RICHIESTE:
  451.                 if(risultato.isSimultanee()){
  452.                     bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_SIMULTANEE_CODE);
  453.                 }
  454.                 else{
  455.                     bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_CODE);
  456.                 }
  457.                 break;
  458.             case DIMENSIONE_MASSIMA_MESSAGGIO:
  459.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_DIMENSIONE_MASSIMA_MESSAGGIO_CODE);
  460.                 break;
  461.             case OCCUPAZIONE_BANDA:
  462.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_OCCUPAZIONE_BANDA_CODE);
  463.                 break;
  464.             case TEMPO_COMPLESSIVO_RISPOSTA:
  465.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_TEMPO_COMPLESSIVO_CODE);
  466.                 break;
  467.             case TEMPO_MEDIO_RISPOSTA:
  468.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_TEMPO_MEDIO_CODE);
  469.                 break;
  470.             case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  471.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_CODE);
  472.                 break;
  473.             case NUMERO_RICHIESTE_FALLITE:
  474.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_FALLITE_CODE);
  475.                 break;
  476.             case NUMERO_FAULT_APPLICATIVI:
  477.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_FAULT_APPLICATIVI_CODE);
  478.                 break;
  479.             case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  480.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_FALLITE_O_FAULT_APPLICATIVI_CODE);
  481.                 break;
  482.             case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:
  483.                 bf.append(CONTROLLO_TRAFFICO_POLICY_VIOLATED_NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_O_FAULT_APPLICATIVI_CODE);
  484.                 break;
  485.             }
  486.            
  487.             if(risultato.isApplicabilitaCongestione()){
  488.                 bf.append(APPLICABILITA_CONGESTIONE_CODE);
  489.             }
  490.             if(risultato.isApplicabilitaDegradoPrestazionale()){
  491.                 bf.append(APPLICABILITA_DEGRADO_CODE);
  492.             }
  493.             if(risultato.isApplicabilitaStatoAllarme()){
  494.                 bf.append(APPLICABILITA_STATO_ALLARME_CODE);
  495.             }
  496.         }
  497.         return bf.toString();
  498.     }
  499.    
  500.     public static void configureHandlerExceptionByTipoErrore(ServiceBinding serviceBinding, HandlerException he, TipoErrore tipoErroreParam,boolean includiDescrizioneErrore,Logger log) throws ProtocolException {

  501.         TipoErrore tipoErrore = tipoErroreParam;
  502.         if(ServiceBinding.REST.equals(serviceBinding)) {
  503.             tipoErrore = TipoErrore.FAULT; // in rest il codice http viene auto-gestito correttamente
  504.         }
  505.        
  506.         if(he==null) {
  507.             throw new ProtocolException("HandlerException is null");
  508.         }
  509.        
  510.         switch (tipoErrore) {
  511.         case HTTP_429:
  512.             if(includiDescrizioneErrore) {
  513.                 he.setResponseContentType(HttpConstants.CONTENT_TYPE_HTML);
  514.                
  515.                 String tipo = null;
  516.                 if(he.getIntegrationFunctionError()!=null) {
  517.                     switch (he.getIntegrationFunctionError()) {
  518.                     case LIMIT_EXCEEDED:
  519.                     case LIMIT_EXCEEDED_CONDITIONAL_CONGESTION:
  520.                     case LIMIT_EXCEEDED_CONDITIONAL_DETERIORATION_PERFORMANCE:
  521.                         tipo = CostantiControlloTraffico.HTML_429_LIMIT_EXCEEDED_ERROR;
  522.                         break;
  523.                     case TOO_MANY_REQUESTS:
  524.                     case TOO_MANY_REQUESTS_CONDITIONAL_CONGESTION:
  525.                     case TOO_MANY_REQUESTS_CONDITIONAL_DETERIORATION_PERFORMANCE:
  526.                         tipo = CostantiControlloTraffico.HTML_429_TOO_MANY_REQUESTS_ERROR;
  527.                         break;
  528.                     default:
  529.                         tipo = CostantiControlloTraffico.HTML_429_TOO_MANY_REQUESTS_ERROR;
  530.                         break;
  531.                     }
  532.                 }
  533.                 else {
  534.                     tipo = CostantiControlloTraffico.HTML_429_TOO_MANY_REQUESTS_ERROR;
  535.                 }
  536.                
  537.                 String msgErrore = null;
  538.                 ErroriProperties erroriProperties = ErroriProperties.getInstance(log);
  539.                 boolean genericDetails = true;
  540.                 IntegrationFunctionError functionError = IntegrationFunctionError.TOO_MANY_REQUESTS;
  541.                 if(he.getIntegrationFunctionError()!=null) {
  542.                     functionError = he.getIntegrationFunctionError();
  543.                 }
  544.                 /**if(!genericDetails && erroriProperties.isForceGenericDetails(functionError)) {
  545.                     genericDetails = true;
  546.                 }*/
  547.                 if (Costanti.isTRANSACTION_FORCE_SPECIFIC_ERROR_DETAILS()) {
  548.                     genericDetails = false;
  549.                 }
  550.                 if(!genericDetails) {
  551.                     msgErrore = he.getMessage();
  552.                 }
  553.                 else {
  554.                     msgErrore = erroriProperties.getGenericDetails(functionError);
  555.                 }
  556.                
  557.                 String html = tipo
  558.                         .replace(CostantiControlloTraffico.HTML_ERROR_MESSAGE_TEMPLATE, msgErrore);
  559.                 he.setResponse(html.getBytes());
  560.             }
  561.             else {
  562.                 he.setEmptyResponse(true);
  563.             }
  564.             he.setResponseCode("429");
  565.             break;
  566.         case HTTP_503:
  567.             if(includiDescrizioneErrore) {
  568.                 he.setResponseContentType(HttpConstants.CONTENT_TYPE_HTML);
  569.                 String html = CostantiControlloTraffico.HTML_503_ERROR
  570.                         .replace(CostantiControlloTraffico.HTML_ERROR_MESSAGE_TEMPLATE, he.getMessage());
  571.                 he.setResponse(html.getBytes());
  572.             }
  573.             else {
  574.                 he.setEmptyResponse(true);
  575.             }
  576.             he.setResponseCode("503");
  577.             break;
  578.         case HTTP_500:
  579.             if(includiDescrizioneErrore) {
  580.                 he.setResponseContentType(HttpConstants.CONTENT_TYPE_HTML);
  581.                 String html = CostantiControlloTraffico.HTML_500_ERROR
  582.                         .replace(CostantiControlloTraffico.HTML_ERROR_MESSAGE_TEMPLATE, he.getMessage());
  583.                 he.setResponse(html.getBytes());
  584.             }
  585.             else {
  586.                 he.setEmptyResponse(true);
  587.             }
  588.             he.setResponseCode("500");
  589.             break;
  590.         case FAULT:
  591.             if(!includiDescrizioneErrore) {
  592.                 he.setCustomizedResponse(false);
  593.             }
  594.             break;
  595.         }
  596.     }
  597.    
  598. }