DimensioneMessaggiConfigurationUtils.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.pdd.core.controllo_traffico;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import org.apache.commons.lang.StringUtils;
- import org.openspcoop2.core.commons.CoreException;
- import org.openspcoop2.core.config.PortaApplicativa;
- import org.openspcoop2.core.config.PortaDelegata;
- import org.openspcoop2.core.config.Proprieta;
- import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
- import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
- import org.openspcoop2.core.constants.TipoPdD;
- import org.openspcoop2.core.controllo_traffico.AttivazionePolicy;
- import org.openspcoop2.core.controllo_traffico.ConfigurazionePolicy;
- import org.openspcoop2.core.controllo_traffico.ElencoIdPolicyAttive;
- import org.openspcoop2.core.controllo_traffico.IdActivePolicy;
- import org.openspcoop2.core.controllo_traffico.beans.DatiTransazione;
- import org.openspcoop2.core.controllo_traffico.beans.UniqueIdentifierUtilities;
- import org.openspcoop2.core.controllo_traffico.constants.TipoRisorsaPolicyAttiva;
- import org.openspcoop2.core.controllo_traffico.utils.PolicyUtilities;
- import org.openspcoop2.core.id.IDPortaApplicativa;
- import org.openspcoop2.core.id.IDPortaDelegata;
- import org.openspcoop2.message.OpenSPCoop2Message;
- import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
- import org.openspcoop2.pdd.config.CostantiProprieta;
- import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
- import org.openspcoop2.pdd.core.PdDContext;
- import org.openspcoop2.pdd.core.controllo_traffico.policy.InterceptorPolicyUtilities;
- import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyFiltroApplicativoUtilities;
- import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyVerifier;
- import org.openspcoop2.protocol.sdk.IProtocolFactory;
- import org.openspcoop2.protocol.sdk.ProtocolException;
- import org.openspcoop2.protocol.sdk.state.RequestInfo;
- import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
- import org.slf4j.Logger;
- /**
- * DimensioneMessaggiConfigurationUtils
- *
- * @author Poli Andrea (poli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class DimensioneMessaggiConfigurationUtils {
- private DimensioneMessaggiConfigurationUtils() {}
-
- private static void logDebug(Logger log, String msg) {
- if(log!=null) {
- log.debug(msg);
- }
- }
-
- public static SoglieDimensioneMessaggi readSoglieDimensioneMessaggi(TipoPdD tipoPdD, String nomePorta,
- DatiTransazione datiTransazione, Logger log,
- URLProtocolContext urlProtocolContext, RequestInfo requestInfo, PdDContext pddContext,
- IProtocolFactory<?> protocolFactory) throws CoreException {
-
- OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
- ConfigurazioneGatewayControlloTraffico configurazioneControlloTraffico = op2Properties.getConfigurazioneControlloTraffico();
- ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance();
-
- SoglieDimensioneMessaggi soglie = null;
-
- Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttive = null;
- boolean mapFromRequestInfo = false;
- try{
-
- if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
- if(requestInfo.getRequestRateLimitingConfig().getNomePorta()==null && nomePorta!=null) {
- requestInfo.getRequestRateLimitingConfig().setDatiPorta(tipoPdD, nomePorta,
- datiTransazione!=null ? datiTransazione.getIdServizio() : null,
- datiTransazione!=null ? datiTransazione.getSoggettoFruitore() : null);
- }
- if(requestInfo.getRequestRateLimitingConfig().getMapPolicyAttive_dimensioneMessaggi()!=null) {
- mapPolicyAttive = requestInfo.getRequestRateLimitingConfig().getMapPolicyAttive_dimensioneMessaggi();
- mapFromRequestInfo = true;
- }
- }
-
- if(!mapFromRequestInfo) {
-
- mapPolicyAttive = new HashMap<>();
-
- if(tipoPdD!=null && nomePorta!=null) {
- Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttiveAPI = null;
- try {
- mapPolicyAttiveAPI = configPdDManager.getElencoIdPolicyAttiveAPIDimensioneMessaggio(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(),
- tipoPdD, nomePorta);
- }catch(DriverConfigurazioneNotFound notFound) {
- // ignore
- }
- if(mapPolicyAttiveAPI!=null && !mapPolicyAttiveAPI.isEmpty()) {
- Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttiveAPI.keySet().iterator();
- while (it.hasNext()) {
- TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
- ElencoIdPolicyAttive elencoPolicyAttiveAPI = mapPolicyAttiveAPI.get(tipoRisorsaPolicyAttiva);
- if(elencoPolicyAttiveAPI!=null) {
- ElencoIdPolicyAttive cloned = (ElencoIdPolicyAttive) elencoPolicyAttiveAPI.clone(); // altrimenti dopo aggiungendo quelle globali si modifica l'oggetto in cache
- mapPolicyAttive.put(tipoRisorsaPolicyAttiva, cloned);
- }
- }
- }
- }
-
- Map<TipoRisorsaPolicyAttiva, ElencoIdPolicyAttive> mapPolicyAttiveGlobali = null;
- try {
- mapPolicyAttiveGlobali = configPdDManager.getElencoIdPolicyAttiveGlobaliDimensioneMessaggio(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache());
- }catch(DriverConfigurazioneNotFound notFound) {
- // ignore
- }
- if(mapPolicyAttiveGlobali!=null && !mapPolicyAttiveGlobali.isEmpty()) {
- Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttiveGlobali.keySet().iterator();
- while (it.hasNext()) {
- TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
- ElencoIdPolicyAttive elencoPolicyAttiveGlobali = mapPolicyAttiveGlobali.get(tipoRisorsaPolicyAttiva);
-
- if(mapPolicyAttive.containsKey(tipoRisorsaPolicyAttiva)) {
- ElencoIdPolicyAttive elencoPolicyAttiveCloned = mapPolicyAttive.get(tipoRisorsaPolicyAttiva); // gia' clonato per l'api sopra
- for (IdActivePolicy idActivePolicyGlobale : elencoPolicyAttiveGlobali.getIdActivePolicyList()) {
- elencoPolicyAttiveCloned.addIdActivePolicy(idActivePolicyGlobale);
- }
- }
- else {
- ElencoIdPolicyAttive cloned = (ElencoIdPolicyAttive) elencoPolicyAttiveGlobali.clone(); // per non modificare l'oggetto in cache
- mapPolicyAttive.put(tipoRisorsaPolicyAttiva, cloned);
- }
- }
- }
-
- if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
- requestInfo.getRequestRateLimitingConfig().setMapPolicyAttive_dimensioneMessaggi(mapPolicyAttive);
- }
- }
- }catch(Exception e){
- throw new CoreException("Configurazione non disponibile: "+e.getMessage(), e);
- }
-
- try{
- if(mapPolicyAttive!=null && !mapPolicyAttive.isEmpty()){
-
- int policyTotali = 0;
- int policyDisabilitate = 0;
- int policyFiltrate = 0;
- /**int policyNonApplicabili = 0;*/
- int policyRispettate = 0;
- /**int policyViolate = 0;*/
- /**int policyViolateWarningOnly = 0;*/
- int policyInErrore = 0;
-
- Iterator<TipoRisorsaPolicyAttiva> it = mapPolicyAttive.keySet().iterator();
- while (it.hasNext()) {
- TipoRisorsaPolicyAttiva tipoRisorsaPolicyAttiva = it.next();
-
- if(!TipoRisorsaPolicyAttiva.DIMENSIONE_MASSIMA_MESSAGGIO.equals(tipoRisorsaPolicyAttiva)) {
- // non dovrebbe capitare mai
- continue;
- }
-
- ElencoIdPolicyAttive elencoPolicyAttivePerRisorsa = mapPolicyAttive.get(tipoRisorsaPolicyAttiva);
-
- boolean policyRispettataCheRichiedeBreak = false;
- boolean policyViolataBreak = false;
-
- for (IdActivePolicy idActive : elencoPolicyAttivePerRisorsa.getIdActivePolicyList()) {
-
- policyTotali++;
-
- try{
-
- if(idActive.isEnabled()){
-
- // Prelevo la configurazione del Controllo del Traffico per quanto concerne le policy attive
- AttivazionePolicy attivazionePolicy = null;
- try {
- String id = UniqueIdentifierUtilities.getUniqueId(idActive);
- if(mapFromRequestInfo) {
- attivazionePolicy = requestInfo.getRequestRateLimitingConfig().getAttivazionePolicy_dimensioneMessaggi(id);
- }
- if(attivazionePolicy==null) {
- attivazionePolicy = configPdDManager.getAttivazionePolicy(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(), id);
- if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
- requestInfo.getRequestRateLimitingConfig().addAttivazionePolicy_dimensioneMessaggi(id, attivazionePolicy);
- }
- }
- }catch(DriverConfigurazioneNotFound notFound) {
- throw new CoreException("Istanza di Policy con id ["+idActive.getNome()+"] non esistente: "+notFound.getMessage(),notFound);
- }
- if(attivazionePolicy==null){
- throw new CoreException("Istanza di Policy con id ["+idActive.getNome()+"] non esistente?");
- }
- String alias = PolicyUtilities.getNomeActivePolicy(attivazionePolicy.getAlias(), attivazionePolicy.getIdActivePolicy());
-
- // Verifico se un eventuale filtro configurato per la policy matcha con i dati della transazione
- boolean matchFiltro = !policyRispettataCheRichiedeBreak && !policyViolataBreak && InterceptorPolicyUtilities.filter(attivazionePolicy.getFiltro(), datiTransazione, null, requestInfo);
- if(matchFiltro){
-
- if(attivazionePolicy.getFiltro().isEnabled() && attivazionePolicy.getFiltro().isInformazioneApplicativaEnabled()){
-
- // Verifico Filtro Applicativo
- OpenSPCoop2Message message = null;
- String soapActionParam = null;
- String valorePresente = PolicyFiltroApplicativoUtilities.getValore(log,
- attivazionePolicy.getFiltro().getInformazioneApplicativaTipo(),
- attivazionePolicy.getFiltro().getInformazioneApplicativaNome(),
- datiTransazione, true,
- message, urlProtocolContext, soapActionParam, pddContext,
- null);
- if(valorePresente==null || !valorePresente.equals(attivazionePolicy.getFiltro().getInformazioneApplicativaValore())){
-
- policyFiltrate++;
-
- // Emetto Diagnostico Policy Filtrata
- if(valorePresente==null){
- valorePresente = "n.d.";
- }
- logDebug(log,"Filtro Applicativo atteso ["+
- attivazionePolicy.getFiltro().getInformazioneApplicativaValore()+"] differente da quello estratto dalla transazione ["+
- valorePresente+"]");
-
- matchFiltro = false;
-
- }
-
- }
-
- if(matchFiltro){
-
- if(soglie==null) {
- soglie = new SoglieDimensioneMessaggi();
- }
- long sogliaRichiesta = -1;
- long sogliaRisposta = -1;
- if(attivazionePolicy.isRidefinisci()) {
- if(attivazionePolicy.getValore2()!=null) {
- sogliaRichiesta = attivazionePolicy.getValore2();
- }
- if(attivazionePolicy.getValore()!=null) {
- sogliaRisposta = attivazionePolicy.getValore();
- }
- }
- else {
-
- // Prelevo la configurazione del Controllo del Traffico per quanto concerne le policy istanziata
- ConfigurazionePolicy configurazionePolicy = null;
- try {
- String id = idActive.getIdPolicy();
- if(mapFromRequestInfo) {
- configurazionePolicy = requestInfo.getRequestRateLimitingConfig().getConfigurazionePolicy_dimensioneMessaggi(id);
- }
- if(configurazionePolicy==null) {
- configurazionePolicy = configPdDManager.getConfigurazionePolicy(configurazioneControlloTraffico.isPolicyReadedWithDynamicCache(), id);
- if(requestInfo!=null && requestInfo.getRequestRateLimitingConfig()!=null) {
- requestInfo.getRequestRateLimitingConfig().addConfigurazionePolicy_dimensioneMessaggi(id, configurazionePolicy);
- }
- }
- }catch(DriverConfigurazioneNotFound notFound) {
- throw new CoreException("Policy con id ["+idActive.getIdPolicy()+"] non esistente: "+notFound.getMessage(),notFound);
- }
- if(configurazionePolicy==null){
- throw new CoreException("Policy con id ["+idActive.getIdPolicy()+"] non esistente?");
- }
-
- if(configurazionePolicy.getValore2()!=null) {
- sogliaRichiesta = configurazionePolicy.getValore2();
- }
- if(configurazionePolicy.getValore()!=null) {
- sogliaRisposta = configurazionePolicy.getValore();
- }
- }
-
- if(sogliaRichiesta>0) {
- boolean updateRichiesta = false;
- if(soglie.getRichiesta()==null
- ||
- (sogliaRichiesta<soglie.getRichiesta().getSogliaKb())
- ) {
- updateRichiesta = true;
- }
- if(updateRichiesta) {
- soglie.setRichiesta(build(sogliaRichiesta, attivazionePolicy, protocolFactory, configPdDManager, requestInfo, tipoPdD, nomePorta));
- }
- }
-
- if(sogliaRisposta>0) {
- boolean updateRisposta = false;
- if(soglie.getRisposta()==null
- ||
- (sogliaRisposta<soglie.getRisposta().getSogliaKb())
- ) {
- updateRisposta = true;
- }
- if(updateRisposta) {
- soglie.setRisposta(build(sogliaRisposta, attivazionePolicy, protocolFactory, configPdDManager, requestInfo, tipoPdD, nomePorta));
- }
- }
-
- policyRispettate++;
-
- if(!attivazionePolicy.isContinuaValutazione()) {
- policyRispettataCheRichiedeBreak = true;
- }
- }
-
- }
- else{
-
- policyFiltrate++;
-
- // Emetto Diagnostico Policy Filtrata
- if(policyRispettataCheRichiedeBreak) {
- logDebug(log,"[policy: "+alias+"] "+GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_BREAK);
- }
- else if(policyViolataBreak) {
- logDebug(log,"[policy: "+alias+"] "+GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_BREAK_VIOLATA);
- }
- else {
- logDebug(log,"[policy: "+alias+"] "+GeneratoreMessaggiErrore.TEMPLATE_POLICY_FILTRATA_MOTIVO_FILTRO+ PolicyUtilities.toStringFilter(attivazionePolicy.getFiltro()));
- }
-
- }
-
- }
- else{
-
- policyDisabilitate++;
-
- // Emetto Diagnostico Policy Disabilitata
- logDebug(log,"[policy: "+idActive.getNome()+"] policy disabilitata");
-
- }
-
- }
- catch(Throwable e){
-
- policyInErrore++;
- // Emetto Diagnostico Policy in Errore
- log.error("Errore durante il controllo della policy con id["+idActive.getNome()+"]: "+e.getMessage(),e);
-
- }
- }
-
- }
-
- logDebug(log,"Valutazione policy totali["+policyTotali+"] disabilitate["+policyDisabilitate+"] filtrate["+policyFiltrate+"] utilizzate["+policyRispettate+"] inErrore["+policyInErrore+"]");
-
- }
- }catch(Exception e){
- throw new CoreException("Errore durante l'identificazione dei limiti sulla dimensione dei messaggi: "+e.getMessage(), e);
- }
-
- if(soglie!=null &&
- (soglie.getRichiesta()==null || soglie.getRisposta()==null)
- ){
- soglie = null;
- }
-
- return soglie;
- }
-
- private static SogliaDimensioneMessaggio build(long sogliaKb, AttivazionePolicy attivazionePolicy, IProtocolFactory<?> protocolFactory, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo,
- TipoPdD tipoPdD, String nomePorta) throws ProtocolException, DriverConfigurazioneException {
- SogliaDimensioneMessaggio soglia = new SogliaDimensioneMessaggio();
- soglia.setSogliaKb(sogliaKb);
-
- OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
- soglia.setUseContentLengthHeader(op2Properties.isLimitedInputStreamUseContentLength());
- soglia.setUseContentLengthHeaderAcceptZeroValue(op2Properties.isLimitedInputStreamUseContentLengthAcceptZeroValue());
-
- boolean policyPorta = attivazionePolicy.getFiltro()!=null && attivazionePolicy.getFiltro().getEnabled() &&
- attivazionePolicy.getFiltro().getNomePorta()!=null &&
- attivazionePolicy.getFiltro().getRuoloPorta()!=null;
- soglia.setPolicyGlobale(!policyPorta);
- soglia.setNomePolicy(PolicyUtilities.getNomeActivePolicy(attivazionePolicy.getAlias(), attivazionePolicy.getIdActivePolicy()));
-
- String idPolicyConGruppo = null;
- String configurazione = null;
- String idAPI = null;
- if(!soglia.isPolicyGlobale()) {
- idAPI = PolicyVerifier.getIdAPI(attivazionePolicy, protocolFactory, configPdDManager, requestInfo);
- }
- idPolicyConGruppo = PolicyUtilities.buildIdConfigurazioneEventoPerPolicy(attivazionePolicy, null, idAPI);
- configurazione = PolicyUtilities.buildConfigurazioneEventoPerPolicy(attivazionePolicy, soglia.isPolicyGlobale());
- soglia.setIdPolicyConGruppo(idPolicyConGruppo);
- soglia.setConfigurazione(configurazione);
-
- IDPortaDelegata idPD = null;
- IDPortaApplicativa idPA = null;
- if(tipoPdD!=null && nomePorta!=null && StringUtils.isNotEmpty(nomePorta)) {
- if(TipoPdD.DELEGATA.equals(tipoPdD)) {
- idPD = new IDPortaDelegata();
- idPD.setNome(nomePorta);
- }
- else {
- idPA = new IDPortaApplicativa();
- idPA.setNome(nomePorta);
- }
- }
- else if(policyPorta) {
- if(org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy.DELEGATA.equals(attivazionePolicy.getFiltro().getRuoloPorta())) {
- idPD = new IDPortaDelegata();
- idPD.setNome(attivazionePolicy.getFiltro().getNomePorta());
- }
- else {
- idPA = new IDPortaApplicativa();
- idPA.setNome(attivazionePolicy.getFiltro().getNomePorta());
- }
- }
-
- List<Proprieta> listP = null;
- if(idPD!=null) {
- listP = readProperties(idPD, configPdDManager, requestInfo);
- }
- else {
- listP = readProperties(idPA, configPdDManager, requestInfo);
- }
-
- if(listP!=null && !listP.isEmpty()) {
- soglia.setUseContentLengthHeader(CostantiProprieta.isRateLimitingUseHttpContentLength(listP, soglia.isUseContentLengthHeader()));
- soglia.setUseContentLengthHeaderAcceptZeroValue(CostantiProprieta.isRateLimitingUseHttpContentLengthAcceptZeroValue(listP, soglia.isUseContentLengthHeaderAcceptZeroValue()));
- }
-
- return soglia;
- }
- private static List<Proprieta> readProperties(IDPortaDelegata idPD, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo) throws DriverConfigurazioneException {
- List<Proprieta> listP = null;
- PortaDelegata pd = configPdDManager.getPortaDelegataSafeMethod(idPD, requestInfo);
- if(pd!=null) {
- listP = pd.getProprieta();
- }
- return listP;
- }
- private static List<Proprieta> readProperties(IDPortaApplicativa idPA, ConfigurazionePdDManager configPdDManager, RequestInfo requestInfo) throws DriverConfigurazioneException {
- List<Proprieta> listP = null;
- PortaApplicativa pa = configPdDManager.getPortaApplicativaSafeMethod(idPA, requestInfo);
- if(pa!=null) {
- listP = pa.getProprieta();
- }
- return listP;
- }
-
- }