ConfigurazioneTracciamento.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.logger.transazioni;

import java.io.File;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.core.config.ConfigurazioneTracciamentoPorta;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaDelegata;
import org.openspcoop2.core.config.PortaTracciamento;
import org.openspcoop2.core.config.Tracciamento;
import org.openspcoop2.core.config.TracciamentoConfigurazioneFiletrace;
import org.openspcoop2.core.config.TracciamentoConfigurazioneFiletraceConnector;
import org.openspcoop2.core.config.Transazioni;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.utils.TracciamentoCompatibilitaFiltroEsiti;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.utils.EsitiConfigUtils;
import org.slf4j.Logger;

/**
 * ConfigurazioneTracciamento
 * 
 * @author Andrea Poli (apoli@link.it)
 * @author Giuliano Pintori (pintori@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 * 
 */
public class ConfigurazioneTracciamento {

	private Logger log;
	
	private TracciamentoCompatibilitaFiltroEsiti regole;

	private boolean dbEnabled = false;
		
	private TracciamentoConfigurazioneFiletrace configurazioneFileTrace;
	private boolean fileTraceEnabled = false;
	private File fileTraceConfig = null;
	private boolean fileTraceConfigGlobal = true;
	private TracciamentoConfigurazioneFiletraceConnector fileTraceConfigDumpIn;
	private TracciamentoConfigurazioneFiletraceConnector fileTraceConfigDumpOut;
	
	private String esitiConfig;
	private List<String> esitiDaRegistrare;
	
	private Transazioni informazioniSalvareTransazioni;
	public Transazioni getInformazioniSalvareTransazioni() {
		return this.informazioniSalvareTransazioni;
	}
	
	private OpenSPCoop2Properties op2Properties;
	
	private ConfigurazionePdDManager configPdDManager;
	private boolean isConfig=false;
	private boolean isPD=false;
	private PortaDelegata pd;
	private boolean isPA=false;
	private PortaApplicativa pa;
	
	public ConfigurazioneTracciamento(Logger log, ConfigurazionePdDManager configPdDManager, PortaDelegata pd) throws DriverConfigurazioneException, CoreException {
		this.pd = pd;
		this.isPD = true;
		this.init(
				log, configPdDManager,
				(pd!=null ? pd.getTracciamento() : null));
	}
	public ConfigurazioneTracciamento(Logger log, ConfigurazionePdDManager configPdDManager, PortaApplicativa pa) throws DriverConfigurazioneException, CoreException {
		this.pa = pa;
		this.isPA = true;
		this.init(
				log, configPdDManager,
				(pa!=null ? pa.getTracciamento() : null));
	}
	public ConfigurazioneTracciamento(Logger log, ConfigurazionePdDManager configPdDManager, TipoPdD tipoPdD) throws DriverConfigurazioneException, CoreException {
		this.isConfig = true;
		if(tipoPdD==null) {
			throw new CoreException("TipoPdD non indicato");
		}
		switch (tipoPdD) {
		case DELEGATA:
			this.isPD = true;
			break;
		case APPLICATIVA:
			this.isPA = true;
			break;
		default:
			break;
		}
		this.init(
				log, configPdDManager,
				null);
	}
	private void init(Logger log, ConfigurazionePdDManager configPdDManager, PortaTracciamento porta) throws DriverConfigurazioneException, CoreException {
		
		this.log = log;
		this.configPdDManager = configPdDManager;
		this.op2Properties = OpenSPCoop2Properties.getInstance();
		
		Tracciamento configTracciamento = this.configPdDManager.getOpenSPCoopAppenderTracciamento();
		ConfigurazioneTracciamentoPorta config = null;
		if(this.isPA) {
			config = configTracciamento.getPortaApplicativa();
		}
		if(this.isPD) {
			config = configTracciamento.getPortaDelegata();
		} 
		
		if(porta!=null && StatoFunzionalita.ABILITATO.equals(porta.getStato())) {
			// ridefinito
			this.regole = new TracciamentoCompatibilitaFiltroEsiti(porta.getDatabase(), porta.getFiletrace());
			this.configurazioneFileTrace = porta.getFiletraceConfig();
			this.esitiConfig = porta.getEsiti();
			this.informazioniSalvareTransazioni = porta.getTransazioni();
		}
		else {
			this.regole = new TracciamentoCompatibilitaFiltroEsiti(config!=null ? config.getDatabase() : null, 
					config!=null ? config.getFiletrace() : null);
			if(config!=null) {
				this.configurazioneFileTrace = config.getFiletraceConfig();
				this.esitiConfig = config.getEsiti();
				this.informazioniSalvareTransazioni = config.getTransazioni();
			}
		}
		
		this.initDB();
		
		this.initFileTrace();
	}
	
	
	public TracciamentoCompatibilitaFiltroEsiti getRegole() {
		return this.regole;
	}
	

	private void initDB() {
		this.dbEnabled = this.regole.isTracciamentoDBEnabled();
	}
	public boolean isDbEnabled() {
		return this.dbEnabled;
	}
	
	
	
	private void initFileTrace() throws DriverConfigurazioneException, CoreException {
		if(this.regole.isTracciamentoFileTraceEnabled()) {
			if(this.regole.isTracciamentoFileTraceEnabledByExternalProperties()){
				this.initFileTraceExternalConfig();
			}
			else {
				this.fileTraceEnabled = true;
				initFileTraceInternalConfig();
				initFileTraceInternalDumpConfig();
			}
		}
		else {
			initFileTraceExternalConfig();
			if(!this.fileTraceEnabled) {
				this.fileTraceEnabled = false;
				this.fileTraceConfig = null;
				this.fileTraceConfigDumpIn = null;
				this.fileTraceConfigDumpOut = null;
			}
		}
	}
	private void initFileTraceExternalConfig() throws DriverConfigurazioneException, CoreException {
		this.fileTraceEnabled = this.op2Properties.isTransazioniFileTraceEnabled();
		if(this.fileTraceEnabled) {
			this.fileTraceConfig = this.op2Properties.getTransazioniFileTraceConfig();
		}
		
		if(!this.isConfig) {
			initFileTraceExternalConfigPorta();
		}
	}
	private boolean initFileTraceByExternalPropertyPort = false;
	public boolean isInitFileTraceByExternalPropertyPort() {
		return this.initFileTraceByExternalPropertyPort;
	}
	private void initFileTraceExternalConfigPorta() throws DriverConfigurazioneException, CoreException {
		if(this.isPA && this.pa!=null) {
			this.fileTraceEnabled = this.configPdDManager.isTransazioniFileTraceEnabled(this.pa);
			if(this.fileTraceEnabled) {
				this.initFileTraceByExternalPropertyPort = true;
				initFileTraceExternalConfigPortaApplicativa();
			}
			else {
				this.fileTraceConfig = null;
			}
		}
		else if(this.isPD && this.pd!=null) {
			this.fileTraceEnabled = this.configPdDManager.isTransazioniFileTraceEnabled(this.pd);
			if(this.fileTraceEnabled) {
				this.initFileTraceByExternalPropertyPort = true;
				initFileTraceExternalConfigPortaDelegata();
			}
			else {
				this.fileTraceConfig = null;
			}
		}
	}
	private void initFileTraceExternalConfigPortaApplicativa() throws DriverConfigurazioneException, CoreException {
		this.fileTraceConfig = this.configPdDManager.getFileTraceConfig(this.pa);
		this.fileTraceConfigGlobal = this.op2Properties.isTransazioniFileTraceEnabled() && 
				this.op2Properties.getTransazioniFileTraceConfig().getAbsolutePath().equals(this.fileTraceConfig.getAbsolutePath());
		
		initFileTraceConfigPortaApplicativaDefaultDumpIn();
		initFileTraceConfigPortaApplicativaDefaultDumpOut();
		
	}
	private void initFileTraceExternalConfigPortaDelegata() throws DriverConfigurazioneException, CoreException {
		this.fileTraceConfig = this.configPdDManager.getFileTraceConfig(this.pd);
		this.fileTraceConfigGlobal = this.op2Properties.isTransazioniFileTraceEnabled() && 
				this.op2Properties.getTransazioniFileTraceConfig().getAbsolutePath().equals(this.fileTraceConfig.getAbsolutePath());
		
		initFileTraceConfigPortaDelegataDefaultDumpIn();
		initFileTraceConfigPortaDelegataDefaultDumpOut();
	}
	private void initFileTraceInternalConfig() throws DriverConfigurazioneException, CoreException {
		if(this.configurazioneFileTrace!=null && this.configurazioneFileTrace.getConfig()!=null && StringUtils.isNotEmpty(this.configurazioneFileTrace.getConfig())) {
			this.fileTraceConfig = ConfigurazioneTracciamento.toFileTraceConfig(this.configurazioneFileTrace.getConfig(), this.op2Properties.getRootDirectory(),true);
			this.fileTraceConfigGlobal = this.op2Properties.isTransazioniFileTraceEnabled() && 
					this.op2Properties.getTransazioniFileTraceConfig().getAbsolutePath().equals(this.fileTraceConfig.getAbsolutePath());
		}
		else {
			// utilizzo la configurazione di default
			this.fileTraceConfig = this.op2Properties.getTransazioniFileTraceConfig();
			if(!this.isConfig) {
				if(this.isPA && this.pa!=null) {
					this.fileTraceConfig = this.configPdDManager.getFileTraceConfig(this.pa);
					this.fileTraceConfigGlobal = this.op2Properties.isTransazioniFileTraceEnabled() && 
							this.op2Properties.getTransazioniFileTraceConfig().getAbsolutePath().equals(this.fileTraceConfig.getAbsolutePath());
				}
				else if(this.isPD && this.pd!=null) {
					this.fileTraceConfig = this.configPdDManager.getFileTraceConfig(this.pd);
					this.fileTraceConfigGlobal = this.op2Properties.isTransazioniFileTraceEnabled() && 
							this.op2Properties.getTransazioniFileTraceConfig().getAbsolutePath().equals(this.fileTraceConfig.getAbsolutePath());
				}
			}
		}
	}
	private void initFileTraceInternalDumpConfig() throws DriverConfigurazioneException {
		if(this.configurazioneFileTrace!=null && this.configurazioneFileTrace.getDumpIn()!=null) {
			this.fileTraceConfigDumpIn = this.configurazioneFileTrace.getDumpIn();
			this.fileTraceConfigDumpOut = this.configurazioneFileTrace.getDumpOut();
		}
		else {
			if(this.isConfig) {
				// utilizzo la configurazione di default
				if(this.isPA && this.pa!=null) {
					initFileTraceConfigPortaApplicativaDefaultDumpIn();
					initFileTraceConfigPortaApplicativaDefaultDumpOut();
				}
				else if(this.isPD && this.pd!=null) {
					initFileTraceConfigPortaDelegataDefaultDumpIn();
					initFileTraceConfigPortaDelegataDefaultDumpOut();
				}
			}
			else {
				initFileTraceInternalDumpConfigPorte();
			}
		}
	}
	private void initFileTraceInternalDumpConfigPorte() throws DriverConfigurazioneException {
		if(this.isPA && this.pa!=null) {
			if(this.pa.getTracciamento()!=null && this.pa.getTracciamento().getFiletraceConfig()!=null) {
				this.fileTraceConfigDumpIn = this.pa.getTracciamento().getFiletraceConfig().getDumpIn(); 
				this.fileTraceConfigDumpOut = this.pa.getTracciamento().getFiletraceConfig().getDumpOut(); 
			}
			else {
				initFileTraceConfigPortaApplicativaDefaultDumpIn();
				initFileTraceConfigPortaApplicativaDefaultDumpOut();
			}
		}
		else if(this.isPD && this.pd!=null) {
			if(this.pd.getTracciamento()!=null && this.pd.getTracciamento().getFiletraceConfig()!=null) {
				this.fileTraceConfigDumpIn = this.pd.getTracciamento().getFiletraceConfig().getDumpIn(); 
				this.fileTraceConfigDumpOut = this.pd.getTracciamento().getFiletraceConfig().getDumpOut(); 
			}
			else {
				initFileTraceConfigPortaDelegataDefaultDumpIn();
				initFileTraceConfigPortaDelegataDefaultDumpOut();
			}
		}
	}
	private void initFileTraceConfigPortaApplicativaDefaultDumpIn() throws DriverConfigurazioneException {
		boolean fileTraceHeaders = this.configPdDManager.isTransazioniFileTraceDumpBinarioHeadersEnabled(this.pa);
		boolean fileTracePayload = this.configPdDManager.isTransazioniFileTraceDumpBinarioPayloadEnabled(this.pa);
		this.fileTraceConfigDumpIn = new TracciamentoConfigurazioneFiletraceConnector();
		this.fileTraceConfigDumpIn.setStato((fileTraceHeaders || fileTracePayload) ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
		this.fileTraceConfigDumpIn.setHeader(fileTraceHeaders ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
		this.fileTraceConfigDumpIn.setPayload(fileTracePayload ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);		
	}
	private void initFileTraceConfigPortaApplicativaDefaultDumpOut() throws DriverConfigurazioneException {
		boolean fileTraceHeaders = this.configPdDManager.isTransazioniFileTraceDumpBinarioConnettoreHeadersEnabled(this.pa);
		boolean fileTracePayload = this.configPdDManager.isTransazioniFileTraceDumpBinarioConnettorePayloadEnabled(this.pa);
		this.fileTraceConfigDumpOut = new TracciamentoConfigurazioneFiletraceConnector();
		this.fileTraceConfigDumpOut.setStato((fileTraceHeaders || fileTracePayload) ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
		this.fileTraceConfigDumpOut.setHeader(fileTraceHeaders ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
		this.fileTraceConfigDumpOut.setPayload(fileTracePayload ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
	}
	private void initFileTraceConfigPortaDelegataDefaultDumpIn() throws DriverConfigurazioneException {
		boolean fileTraceHeaders = this.configPdDManager.isTransazioniFileTraceDumpBinarioHeadersEnabled(this.pd);
		boolean fileTracePayload = this.configPdDManager.isTransazioniFileTraceDumpBinarioPayloadEnabled(this.pd);
		this.fileTraceConfigDumpIn = new TracciamentoConfigurazioneFiletraceConnector();
		this.fileTraceConfigDumpIn.setStato((fileTraceHeaders || fileTracePayload) ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
		this.fileTraceConfigDumpIn.setHeader(fileTraceHeaders ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
		this.fileTraceConfigDumpIn.setPayload(fileTracePayload ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
	}
	private void initFileTraceConfigPortaDelegataDefaultDumpOut() throws DriverConfigurazioneException {
		boolean fileTraceHeaders = this.configPdDManager.isTransazioniFileTraceDumpBinarioConnettoreHeadersEnabled(this.pd);
		boolean fileTracePayload = this.configPdDManager.isTransazioniFileTraceDumpBinarioConnettorePayloadEnabled(this.pd);
		this.fileTraceConfigDumpOut = new TracciamentoConfigurazioneFiletraceConnector();
		this.fileTraceConfigDumpOut.setStato((fileTraceHeaders || fileTracePayload) ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
		this.fileTraceConfigDumpOut.setHeader(fileTraceHeaders ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
		this.fileTraceConfigDumpOut.setPayload(fileTracePayload ? StatoFunzionalita.ABILITATO : StatoFunzionalita.DISABILITATO);
	}
	
	public boolean isFileTraceEnabled() {
		return this.fileTraceEnabled;
	}
	public File getFileTraceConfig() {
		return this.fileTraceConfig;
	}
	public boolean isFileTraceConfigGlobal() {
		return this.fileTraceConfigGlobal;
	}
	public TracciamentoConfigurazioneFiletraceConnector getFileTraceConfigDumpIn() {
		return this.fileTraceConfigDumpIn;
	}
	public TracciamentoConfigurazioneFiletraceConnector getFileTraceConfigDumpOut() {
		return this.fileTraceConfigDumpOut;
	}
	public boolean isTransazioniFileTraceDumpBinarioPayloadEnabled(){
		return this.fileTraceConfigDumpIn!=null && StatoFunzionalita.ABILITATO.equals(this.fileTraceConfigDumpIn.getStato()) && 
				StatoFunzionalita.ABILITATO.equals(this.fileTraceConfigDumpIn.getPayload());
	}
	public boolean isTransazioniFileTraceDumpBinarioHeaderEnabled(){
		return this.fileTraceConfigDumpIn!=null && StatoFunzionalita.ABILITATO.equals(this.fileTraceConfigDumpIn.getStato()) && 
				StatoFunzionalita.ABILITATO.equals(this.fileTraceConfigDumpIn.getHeader());
	}
	public boolean isTransazioniFileTraceDumpBinarioConnettorePayloadEnabled(){
		return this.fileTraceConfigDumpOut!=null && StatoFunzionalita.ABILITATO.equals(this.fileTraceConfigDumpOut.getStato()) && 
				StatoFunzionalita.ABILITATO.equals(this.fileTraceConfigDumpOut.getPayload());
	}
	public boolean isTransazioniFileTraceDumpBinarioConnettoreHeaderEnabled(){
		return this.fileTraceConfigDumpOut!=null && StatoFunzionalita.ABILITATO.equals(this.fileTraceConfigDumpOut.getStato()) && 
				StatoFunzionalita.ABILITATO.equals(this.fileTraceConfigDumpOut.getHeader());
	}
	public static File toFileTraceConfig(String name, String rootDir, boolean check) throws CoreException {
		File getTransazioniFileTraceConfig = new File(name);
		if(!getTransazioniFileTraceConfig.exists() &&
			rootDir!=null && !"".equals(rootDir)) {
			getTransazioniFileTraceConfig = new File(rootDir, name);
		}
		
		if(check) {
			if(!getTransazioniFileTraceConfig.exists()) {
				throw ConfigurazioneTracciamentoUtils.newCoreExceptionNotExists(getTransazioniFileTraceConfig, false);
			}
			if(getTransazioniFileTraceConfig.isDirectory()) {
				throw ConfigurazioneTracciamentoUtils.newCoreExceptionNotFile(getTransazioniFileTraceConfig, false);
			}
			if(!getTransazioniFileTraceConfig.canRead()) {
				throw ConfigurazioneTracciamentoUtils.newCoreExceptionCannotRead(getTransazioniFileTraceConfig, false);
			}
		}
		return getTransazioniFileTraceConfig;
	}
	
	public List<String> getEsitiDaRegistrare(StringBuilder bf) throws ProtocolException{
		if(this.regole.isFilterEnabled()) {
			if(this.esitiDaRegistrare==null) {
				this.esitiDaRegistrare = EsitiConfigUtils.getRegistrazioneEsiti(this.esitiConfig, this.log, bf);
			}
		}
		else {
			this.esitiDaRegistrare = null;
		}
		return this.esitiDaRegistrare;
	}
	public String getTipoFiltroEsiti() {
		StringBuilder sb = new StringBuilder();
		if(this.regole.isFilterDBEnabled()) {
			sb.append("db");
		}
		if(this.regole.isFilterFileTraceEnabled()) {
			if(sb.length()>0) {
				sb.append(",");
			}
			sb.append("db");
		}
		return sb.toString();
	}
	public boolean isFiltroEsitiDB() {
		return this.regole.isFilterDBEnabled();
	}
	public boolean isFiltroEsitiFileTrace() {
		return this.regole.isFilterFileTraceEnabled();
	}
	
}