ConnettoreUtilities.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 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.Iterator;
import java.util.Map;

import org.openspcoop2.core.config.AccessoConfigurazionePdD;
import org.openspcoop2.core.config.Connettore;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.constants.CostantiConnettori;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.controllo_traffico.ConfigurazioneGenerale;
import org.openspcoop2.core.controllo_traffico.beans.DatiTransazione;
import org.openspcoop2.core.id.IDPortaApplicativa;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.handlers.InRequestProtocolContext;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.protocol.sdk.state.RequestInfo;

/**     
 * ConnettoreUtilities
 *
 * @author Poli Andrea (poli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ConnettoreUtilities {
	
	private ConnettoreUtilities() {}

	public static DatiTempiRisposta readDatiGlobaliTimeout(ConfigurazionePdDManager configPdDManager, TipoPdD tipoPdD, RequestInfo requestInfo, OpenSPCoop2Properties properties) throws DriverConfigurazioneException {
		// Prelevo la configurazione del Controllo del Traffico
		
		AccessoConfigurazionePdD accessoConfigurazione = null;
		try {
			accessoConfigurazione = properties.getAccessoConfigurazionePdD();
		}catch(Exception e) {
			throw new DriverConfigurazioneException(e.getMessage(),e);
		}
		
		ConfigurazioneGenerale configurazioneGenerale = null;
		if(accessoConfigurazione!=null && CostantiConfigurazione.CONFIGURAZIONE_DB.equalsIgnoreCase(accessoConfigurazione.getTipo())) {
			try {
				configurazioneGenerale = configPdDManager.getConfigurazioneControlloTraffico(requestInfo);
			}catch(DriverConfigurazioneNotFound notFound) {
				// ignore
			}
		}
		
		if(TipoPdD.DELEGATA.equals(tipoPdD)){
			return readDatiGlobaliTimeoutFruizione(configurazioneGenerale, properties);
		}
		else{
			return readDatiGlobaliTimeoutErogazione(configurazioneGenerale, properties);
		}
	
	}
	private static DatiTempiRisposta readDatiGlobaliTimeoutFruizione(ConfigurazioneGenerale configurazioneGenerale, OpenSPCoop2Properties properties) {
		DatiTempiRisposta datiTempiRisposta = new DatiTempiRisposta();
		if(configurazioneGenerale!=null && configurazioneGenerale.getTempiRispostaFruizione()!=null) {
			if(configurazioneGenerale.getTempiRispostaFruizione().getConnectionTimeout()!=null) {
				datiTempiRisposta.setConnectionTimeout(configurazioneGenerale.getTempiRispostaFruizione().getConnectionTimeout());
			}
			else {
				datiTempiRisposta.setConnectionTimeout(properties.getConnectionTimeout_inoltroBuste());
			}
			if(configurazioneGenerale.getTempiRispostaFruizione().getReadTimeout()!=null) {
				datiTempiRisposta.setReadConnectionTimeout(configurazioneGenerale.getTempiRispostaFruizione().getReadTimeout());
			}
			else {
				datiTempiRisposta.setReadConnectionTimeout(properties.getReadConnectionTimeout_inoltroBuste());
			}
		}
		else {
			datiTempiRisposta.setConnectionTimeout(properties.getConnectionTimeout_inoltroBuste());
			datiTempiRisposta.setReadConnectionTimeout(properties.getReadConnectionTimeout_inoltroBuste());
		}
		return datiTempiRisposta;
	}
	private static DatiTempiRisposta readDatiGlobaliTimeoutErogazione(ConfigurazioneGenerale configurazioneGenerale, OpenSPCoop2Properties properties) {
		DatiTempiRisposta datiTempiRisposta = new DatiTempiRisposta();
		if(configurazioneGenerale!=null && configurazioneGenerale.getTempiRispostaErogazione()!=null) {
			if(configurazioneGenerale.getTempiRispostaErogazione().getConnectionTimeout()!=null) {
				datiTempiRisposta.setConnectionTimeout(configurazioneGenerale.getTempiRispostaErogazione().getConnectionTimeout());
			}
			else {
				datiTempiRisposta.setConnectionTimeout(properties.getConnectionTimeout_consegnaContenutiApplicativi());
			}
			if(configurazioneGenerale.getTempiRispostaErogazione().getReadTimeout()!=null) {
				datiTempiRisposta.setReadConnectionTimeout(configurazioneGenerale.getTempiRispostaErogazione().getReadTimeout());
			}
			else {
				datiTempiRisposta.setReadConnectionTimeout(properties.getReadConnectionTimeout_consegnaContenutiApplicativi());
			}
		}
		else {
			datiTempiRisposta.setConnectionTimeout(properties.getConnectionTimeout_consegnaContenutiApplicativi());
			datiTempiRisposta.setReadConnectionTimeout(properties.getReadConnectionTimeout_consegnaContenutiApplicativi());
		}
		return datiTempiRisposta;
	}
	
	public static DatiTempiRisposta readDatiTempiRisposta(TipoPdD tipoPdD, RequestInfo requestInfo) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		// Prelevo la configurazione del Controllo del Traffico
		ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance();
		ConfigurazioneGenerale configurazioneGenerale = configPdDManager.getConfigurazioneControlloTraffico(requestInfo);		
		
		
		// Imposto i valori di default
		DatiTempiRisposta datiTempiRisposta = new DatiTempiRisposta();
		if(TipoPdD.DELEGATA.equals(tipoPdD)){
			datiTempiRisposta.setConnectionTimeout(configurazioneGenerale.getTempiRispostaFruizione().getConnectionTimeout());
			datiTempiRisposta.setReadConnectionTimeout(configurazioneGenerale.getTempiRispostaFruizione().getReadTimeout());
			datiTempiRisposta.setAvgResponseTime(configurazioneGenerale.getTempiRispostaFruizione().getTempoMedioRisposta());
		}
		else{
			datiTempiRisposta.setConnectionTimeout(configurazioneGenerale.getTempiRispostaErogazione().getConnectionTimeout());
			datiTempiRisposta.setReadConnectionTimeout(configurazioneGenerale.getTempiRispostaErogazione().getReadTimeout());
			datiTempiRisposta.setAvgResponseTime(configurazioneGenerale.getTempiRispostaErogazione().getTempoMedioRisposta());
		}
	
		return datiTempiRisposta;
	}
	
	public static void mergeTempiRisposta(DatiTempiRisposta datiTempiRisposta, Map<String, String> properties){
		// Leggo i valori se fossero ridefiniti sul connettore
		if(properties!=null && properties.size()>0){
			
			Integer connectionTimeout = null; 
			Integer readTimeout = null; 
			Integer avgResponseTime = null; 
			Iterator<String> keys = properties.keySet().iterator();
			while (keys.hasNext()) {
				String key = keys.next();
				if(key.equals(CostantiConnettori.CONNETTORE_CONNECTION_TIMEOUT)){
					connectionTimeout = Integer.parseInt(properties.get(key));
				}
				else if(key.endsWith(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT)){
					readTimeout = Integer.parseInt(properties.get(key));
				}
				else if(key.endsWith(CostantiConnettori.CONNETTORE_TEMPO_MEDIO_RISPOSTA)){
					avgResponseTime = Integer.parseInt(properties.get(key));
				}
			}
			if(connectionTimeout!=null){
				datiTempiRisposta.setConnectionTimeout(connectionTimeout);
			}
			if(readTimeout!=null){
				datiTempiRisposta.setReadConnectionTimeout(readTimeout);
			}
			if(avgResponseTime!=null){
				datiTempiRisposta.setAvgResponseTime(avgResponseTime);
			}
		}
		
	}
	
	public static DatiTempiRisposta getDatiTempiRisposta(InRequestProtocolContext context, DatiTransazione datiTransazione, RequestInfo requestInfo) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		
		DatiTempiRisposta datiTempiRisposta = readDatiTempiRisposta(context.getTipoPorta(), requestInfo);
		
		ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance();
		
		if(TipoPdD.DELEGATA.equals(context.getTipoPorta())){
			
			setDatiTempiRispostaFruizione(configPdDManager, datiTempiRisposta,
					context, datiTransazione, requestInfo);
			
		}
		else{
			
			setDatiTempiRispostaErogazione(configPdDManager, datiTempiRisposta,
					context, requestInfo);
			
		}
		
		return datiTempiRisposta;
		
	}
	
	private static void setDatiTempiRispostaFruizione(ConfigurazionePdDManager configPdDManager, DatiTempiRisposta datiTempiRisposta,
			InRequestProtocolContext context, DatiTransazione datiTransazione, RequestInfo requestInfo) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		try{
			Connettore connettore = configPdDManager.getForwardRoute(datiTransazione.getSoggettoFruitore(),datiTransazione.getIdServizio(),false, requestInfo);
			mergeTempiRisposta(datiTempiRisposta, connettore.getProperties());
		}catch(Exception e){
			// registro solamente l'errore su log.
			// sicuramente avverrà un errore durante la gestione del messaggio
			try{
				OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(OpenSPCoop2Properties.getInstance().isControlloTrafficoDebug()).error(e.getMessage(),e);
			}catch(Exception eLogger){
				context.getLogCore().error(e.getMessage(),e);
			}
		}
	}
	
	private static void setDatiTempiRispostaErogazione(ConfigurazionePdDManager configPdDManager, DatiTempiRisposta datiTempiRisposta,
			InRequestProtocolContext context, RequestInfo requestInfo) throws DriverConfigurazioneException, DriverConfigurazioneNotFound{
		try{
			if(context.getIntegrazione()!=null && context.getIntegrazione().getIdPA()!=null) {
				IDPortaApplicativa idPA = context.getIntegrazione().getIdPA();
				PortaApplicativa pa = configPdDManager.getPortaApplicativa(idPA, requestInfo);
				if(pa.sizeServizioApplicativoList()>0) {
					IDServizioApplicativo idSA = new IDServizioApplicativo();
					idSA.setIdSoggettoProprietario(new IDSoggetto(pa.getTipoSoggettoProprietario(), pa.getNomeSoggettoProprietario()));
					idSA.setNome(pa.getServizioApplicativo(0).getNome()); // uso il primo
							
					ServizioApplicativo sa = configPdDManager.getServizioApplicativo(idSA, requestInfo);
					setConnettoreDatiTempiRispostaErogazione(context, sa, datiTempiRisposta);
				}
			}
		}catch(Exception e){
			// registro solamente l'errore su log.
			// sicuramente avverrà un errore durante la gestione del messaggio
			try{
				OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(OpenSPCoop2Properties.getInstance().isControlloTrafficoDebug()).error(e.getMessage(),e);
			}catch(Exception eLogger){
				context.getLogCore().error(e.getMessage(),e);
			}
		}
	}
	private static void setConnettoreDatiTempiRispostaErogazione(InRequestProtocolContext context, ServizioApplicativo sa, DatiTempiRisposta datiTempiRisposta) {
		
		Connettore connettore = null;
		
		String scenarioCooperazione = context.getProtocollo().getScenarioCooperazione();
		if(scenarioCooperazione!=null){
			if(org.openspcoop2.protocol.engine.constants.Costanti.SCENARIO_CONSEGNA_CONTENUTI_APPLICATIVI.equals(scenarioCooperazione) ||
					org.openspcoop2.protocol.engine.constants.Costanti.SCENARIO_ASINCRONO_SIMMETRICO_CONSEGNA_RISPOSTA.equals(scenarioCooperazione) ||
					org.openspcoop2.protocol.engine.constants.Costanti.SCENARIO_ASINCRONO_ASIMMETRICO_POLLING.equals(scenarioCooperazione) ){
				if(sa.getRispostaAsincrona()!=null){
					connettore = sa.getRispostaAsincrona().getConnettore();
				}
			}else{
				if(sa.getInvocazioneServizio()!=null){
					connettore = sa.getInvocazioneServizio().getConnettore();
				}
			}
		}
		
		if(connettore!=null){
			mergeTempiRisposta(datiTempiRisposta, connettore.getProperties());
		}
		
	}
}