ValidazioneSemanticaMainProcessor.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.core.config.driver.utils;

import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;

import org.apache.logging.log4j.Level;
import org.openspcoop2.core.config.driver.ValidazioneSemantica;
import org.openspcoop2.core.config.driver.db.DriverConfigurazioneDB;
import org.openspcoop2.core.config.driver.xml.DriverConfigurazioneXML;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.openspcoop2.utils.Utilities;
import org.openspcoop2.utils.resources.FileSystemUtilities;
import org.openspcoop2.utils.resources.Loader;
import org.slf4j.Logger;

/**
 * Validazione Semantica
 * 
 * @author Sandra Giangrandi (sandra@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class ValidazioneSemanticaMainProcessor {

		/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception  {
		// TODO Auto-generated method stub
		
		if (args.length  < 4) {
			String errorMsg = "ERROR, Usage:  java ValidazioneSemanticaMainProcessor commonProperties tipoConfigurazione proprietaConfigurazione validazioneConfigurazione";
			System.err.println(errorMsg);
			throw new Exception(errorMsg);
		}

		// Inizializzo logger
//		System.out.println("LUNGHEZZA: "+args.length);
//		for (int i = 0; i < args.length; i++) {
//			System.out.println("ARG["+i+"]=["+args[i]+"]");
//		}
		try{
			if(args.length==5){
				LoggerWrapperFactory.setLogConfiguration(args[4]);
			}else{
				URL url = ValidazioneSemanticaMainProcessor.class.getResource("/validator.log4j2.properties");
				if(url!=null){
					LoggerWrapperFactory.setLogConfiguration(url);
				}
				else{
					File logFile = FileSystemUtilities.createTempFile("testValidazioneSemanticaConfigurazione_", ".log");
					System.out.println("LogMessages write in "+logFile.getAbsolutePath());
					LoggerWrapperFactory.setDefaultLogConfiguration(Level.ALL, false, null, logFile, "%p <%d{dd-MM-yyyy HH:mm:ss}> %C.%M(%L): %m %n %n");
				}
			}
		}catch(Exception e) {
			String errorMsg = "Errore durante il caricamento del file di log: "+e.getMessage();
			System.err.println(errorMsg);
			System.out.println("Args.length: "+args.length);
			for (int i = 0; i < args.length; i++) {
				System.out.println("Arg["+i+"]=["+args[i]+"]");
			}
			throw new Exception(errorMsg,e);
		}	
		Logger log = LoggerWrapperFactory.getLogger("validatoreDatiConfigurazione");
		
		
		java.util.Properties commonProperties = new java.util.Properties();
		try{
			try(FileInputStream fin = new FileInputStream(args[0])){
				commonProperties.load(fin);
			}
		}catch(java.io.IOException e) {
			String errorMsg = "Errore durante il caricamento del file di properties ["+args[0]+"] : "+e.getMessage();
			log.error(errorMsg,e);
			throw new Exception(errorMsg,e);
		}
		
		java.util.Properties reader = new java.util.Properties();
		try{
			try(FileInputStream fin = new FileInputStream(args[2])){
				reader.load(fin);
			}
		}catch(java.io.IOException e) {
			String errorMsg = "Errore durante il caricamento del file di properties ["+args[2]+"] : "+e.getMessage();
			log.error(errorMsg,e);
			throw new Exception(errorMsg,e);
		}
		
				
		// Lettura configurazione
		org.openspcoop2.core.config.Openspcoop2 configurazione = null;
		Connection connectionDB = null;
		String tipoConfigurazione = args[1];
		boolean validaSezioneConfigurazione = Boolean.parseBoolean(args[2]);
		
		if("xml".equals(tipoConfigurazione)){
			
			// Configurazione XML
			String path = reader.getProperty("openspcoop2.configurazione.xml");
			if(path==null){
				throw new Exception("Non e' stato definito il path dove localizzare la configurazione xml");
			}else{
				path = path.trim();
			}
			
			DriverConfigurazioneXML driver = new DriverConfigurazioneXML(path,log);
			if(driver.create)
				log.info("Inizializzata Configurazione PdD XML");
			else
				throw new Exception("ConfigurazionePdD XML non inizializzata");
			
			configurazione = driver.getImmagineCompletaConfigurazionePdD();

		}
		else if("db".equals(tipoConfigurazione)){
			
			// Configurazione DB
			
			// Database
			String tipoDatabase = reader.getProperty("openspcoop2.configurazione.db.tipo");
			if(tipoDatabase==null){
				throw new Exception("Non e' stato definito il tipo di database");
			}else{
				tipoDatabase = tipoDatabase.trim();
			}
			
			String dataSource = reader.getProperty("openspcoop2.configurazione.db.dataSource");
			if(dataSource!=null){
				dataSource = dataSource.trim();
				java.util.Properties context = Utilities.readProperties("openspcoop2.configurazione.db.context.",reader);
				
				DriverConfigurazioneDB driver = new DriverConfigurazioneDB(dataSource,context,log,tipoDatabase);
				if(driver.create)
					log.info("Inizializzata Configurazione DB");
				else
					throw new Exception("Configurazione DB non inizializzata");
				
				configurazione = driver.getImmagineCompletaConfigurazionePdD();
				
			}else{
				String connection = reader.getProperty("openspcoop2.configurazione.db.url");
				if(connection==null){
					throw new Exception("Non e' stata definita una destinazione ne attraverso un datasource, ne attraverso una connessione diretta");
				}
				connection = connection.trim();
				String driverJDBC = reader.getProperty("openspcoop2.configurazione.db.driver");
				if(driverJDBC==null){
					throw new Exception("Connessione diretta: non e' stato definito il Driver");
				}
				driverJDBC =driverJDBC.trim();
				String username = reader.getProperty("openspcoop2.configurazione.db.user");
				String password = reader.getProperty("openspcoop2.configurazione.db.password");
				if(username!=null){
					username = username.trim();
				}
				if(password!=null){
					password = password.trim();
				}
				
				// Carico driver JDBC
				Loader.getInstance().newInstance(driverJDBC);
				
				try{
					if(username!=null){
						connectionDB = DriverManager.getConnection(connection, username, password); 
					}else{
						connectionDB = DriverManager.getConnection(connection); 
					}
					
					DriverConfigurazioneDB driver = new DriverConfigurazioneDB(connectionDB,log,tipoDatabase);
					if(driver.create)
						log.info("Inizializzata Configurazione DB");
					else
						throw new Exception("Configurazione DB non inizializzata");
					
					configurazione = driver.getImmagineCompletaConfigurazionePdD();
					
				}finally{
					try{
						if(connectionDB!=null)
							connectionDB.close();
					}catch(Exception e){
						// close
					}
				}
			}	
			
		}
		else{
			throw new Exception("Tipo di configurazione ["+tipoConfigurazione+"] non gestita");
		}
		

		// VALIDAZIONE SEMANTICA
		try{
			String tipiConnettori = commonProperties.getProperty("openspcoop2.tipiConnettori");
			if(tipiConnettori==null){
				throw new Exception("Non sono stati definiti i tipi di connettori supportati");
			}else{
				tipiConnettori = tipiConnettori.trim();
			}
			String [] tipoConnettoriArray = tipiConnettori.split(",");
			for (int i = 0; i < tipoConnettoriArray.length; i++) {
				tipoConnettoriArray[i]=tipoConnettoriArray[i].trim();
			}
			
			String tipiSoggetti = commonProperties.getProperty("openspcoop2.tipiSoggetti");
			if(tipiSoggetti==null){
				throw new Exception("Non sono stati definiti i tipi di soggetti supportati");
			}else{
				tipiSoggetti = tipiSoggetti.trim();
			}
			String [] tipoSoggettiArray = tipiSoggetti.split(",");
			for (int i = 0; i < tipoSoggettiArray.length; i++) {
				tipoSoggettiArray[i]=tipoSoggettiArray[i].trim();
			}
			
			String tipiServiziSoap = commonProperties.getProperty("openspcoop2.tipiServizi.soap");
			if(tipiServiziSoap==null){
				throw new Exception("Non sono stati definiti i tipi di Servizi supportati");
			}else{
				tipiServiziSoap = tipiServiziSoap.trim();
			}
			String [] tipoServiziSoapArray = tipiServiziSoap.split(",");
			for (int i = 0; i < tipoServiziSoapArray.length; i++) {
				tipoServiziSoapArray[i]=tipoServiziSoapArray[i].trim();
			}
			
			String tipiServiziRest = commonProperties.getProperty("openspcoop2.tipiServizi.rest");
			if(tipiServiziRest==null){
				throw new Exception("Non sono stati definiti i tipi di Servizi supportati");
			}else{
				tipiServiziRest = tipiServiziRest.trim();
			}
			String [] tipoServiziRestArray = tipiServiziRest.split(",");
			for (int i = 0; i < tipoServiziRestArray.length; i++) {
				tipoServiziRestArray[i]=tipoServiziRestArray[i].trim();
			}
			
			String tipiDiagnosticiAppender = commonProperties.getProperty("openspcoop2.diagnostici.appender");
			if(tipiDiagnosticiAppender==null){
				throw new Exception("Non sono stati definiti i tipi di appender supportati (diagnostici)");
			}else{
				tipiDiagnosticiAppender = tipiDiagnosticiAppender.trim();
			}
			String [] tipiDiagnosticiAppenderArray = tipiDiagnosticiAppender.split(",");
			for (int i = 0; i < tipiDiagnosticiAppenderArray.length; i++) {
				tipiDiagnosticiAppenderArray[i]=tipiDiagnosticiAppenderArray[i].trim();
			}
			
			String tipiTracceAppender = commonProperties.getProperty("openspcoop2.tracce.appender");
			if(tipiTracceAppender==null){
				throw new Exception("Non sono stati definiti i tipi di appender supportati (tracce)");
			}else{
				tipiTracceAppender = tipiTracceAppender.trim();
			}
			String [] tipiTracceAppenderArray = tipiTracceAppender.split(",");
			for (int i = 0; i < tipiTracceAppenderArray.length; i++) {
				tipiTracceAppenderArray[i]=tipiTracceAppenderArray[i].trim();
			}
			
			String tipiDumpAppender = commonProperties.getProperty("openspcoop2.dump.appender");
			if(tipiDumpAppender==null){
				throw new Exception("Non sono stati definiti i tipi di appender supportati (dump)");
			}else{
				tipiDumpAppender = tipiDumpAppender.trim();
			}
			String [] tipiDumpAppenderArray = tipiDumpAppender.split(",");
			for (int i = 0; i < tipiDumpAppenderArray.length; i++) {
				tipiDumpAppenderArray[i]=tipiDumpAppenderArray[i].trim();
			}
			
			String tipiAutenticazionePortaDelegata = commonProperties.getProperty("openspcoop2.autenticazione.pd");
			if(tipiAutenticazionePortaDelegata==null){
				throw new Exception("Non sono stati definiti i tipi di autenticazione per la porta delegata supportati");
			}else{
				tipiAutenticazionePortaDelegata = tipiAutenticazionePortaDelegata.trim();
			}
			String [] tipiAutenticazionePortaDelegataArray = tipiAutenticazionePortaDelegata.split(",");
			for (int i = 0; i < tipiAutenticazionePortaDelegataArray.length; i++) {
				tipiAutenticazionePortaDelegataArray[i]=tipiAutenticazionePortaDelegataArray[i].trim();
			}
			
			String tipiAutenticazionePortaApplicativa = commonProperties.getProperty("openspcoop2.autenticazione.pa");
			if(tipiAutenticazionePortaApplicativa==null){
				throw new Exception("Non sono stati definiti i tipi di autenticazione per la porta applicativa supportati");
			}else{
				tipiAutenticazionePortaApplicativa = tipiAutenticazionePortaApplicativa.trim();
			}
			String [] tipiAutenticazionePortaApplicativaArray = tipiAutenticazionePortaApplicativa.split(",");
			for (int i = 0; i < tipiAutenticazionePortaApplicativaArray.length; i++) {
				tipiAutenticazionePortaApplicativaArray[i]=tipiAutenticazionePortaApplicativaArray[i].trim();
			}
			
			String tipiAutorizzazionePortaDelegata = commonProperties.getProperty("openspcoop2.autorizzazione.pd");
			if(tipiAutorizzazionePortaDelegata==null){
				throw new Exception("Non sono stati definiti i tipi di autorizzazione per la porta delegata supportati");
			}else{
				tipiAutorizzazionePortaDelegata = tipiAutorizzazionePortaDelegata.trim();
			}
			String [] tipiAutorizzazionePortaDelegataArray = tipiAutorizzazionePortaDelegata.split(",");
			for (int i = 0; i < tipiAutorizzazionePortaDelegataArray.length; i++) {
				tipiAutorizzazionePortaDelegataArray[i]=tipiAutorizzazionePortaDelegataArray[i].trim();
			}
			
			String tipiAutorizzazionePortaApplicativa = commonProperties.getProperty("openspcoop2.autorizzazione.pa");
			if(tipiAutorizzazionePortaApplicativa==null){
				throw new Exception("Non sono stati definiti i tipi di autorizzazione per la porta applicativa supportati");
			}else{
				tipiAutorizzazionePortaApplicativa = tipiAutorizzazionePortaApplicativa.trim();
			}
			String [] tipiAutorizzazionePortaApplicativaArray = tipiAutorizzazionePortaApplicativa.split(",");
			for (int i = 0; i < tipiAutorizzazionePortaApplicativaArray.length; i++) {
				tipiAutorizzazionePortaApplicativaArray[i]=tipiAutorizzazionePortaApplicativaArray[i].trim();
			}
			
			String tipiAutorizzazioneContenutiPortaDelegata = commonProperties.getProperty("openspcoop2.autorizzazioneContenuto.pd");
			if(tipiAutorizzazioneContenutiPortaDelegata==null){
				throw new Exception("Non sono stati definiti i tipi di autorizzazione contenuti per la porta delegata supportati");
			}else{
				tipiAutorizzazioneContenutiPortaDelegata = tipiAutorizzazioneContenutiPortaDelegata.trim();
			}
			String [] tipiAutorizzazioneContenutiPortaDelegataArray = tipiAutorizzazioneContenutiPortaDelegata.split(",");
			for (int i = 0; i < tipiAutorizzazioneContenutiPortaDelegataArray.length; i++) {
				tipiAutorizzazioneContenutiPortaDelegataArray[i]=tipiAutorizzazioneContenutiPortaDelegataArray[i].trim();
			}
			
			String tipiAutorizzazioneContenutiPortaApplicativa = commonProperties.getProperty("openspcoop2.autorizzazioneContenuto.pa");
			if(tipiAutorizzazioneContenutiPortaApplicativa==null){
				throw new Exception("Non sono stati definiti i tipi di autorizzazione contenuti per la porta applicativa supportati");
			}else{
				tipiAutorizzazioneContenutiPortaApplicativa = tipiAutorizzazioneContenutiPortaApplicativa.trim();
			}
			String [] tipiAutorizzazioneContenutiPortaApplicativaArray = tipiAutorizzazioneContenutiPortaApplicativa.split(",");
			for (int i = 0; i < tipiAutorizzazioneContenutiPortaApplicativaArray.length; i++) {
				tipiAutorizzazioneContenutiPortaApplicativaArray[i]=tipiAutorizzazioneContenutiPortaApplicativaArray[i].trim();
			}
			
			String tipiIntegrazionePD = commonProperties.getProperty("openspcoop2.integrazione.pd");
			if(tipiIntegrazionePD==null){
				throw new Exception("Non sono stati definiti i tipi di Integrazione supportati (PD)");
			}else{
				tipiIntegrazionePD = tipiIntegrazionePD.trim();
			}
			String [] tipiIntegrazionePDArray = tipiIntegrazionePD.split(",");
			for (int i = 0; i < tipiIntegrazionePDArray.length; i++) {
				tipiIntegrazionePDArray[i]=tipiIntegrazionePDArray[i].trim();
			}
			
			String tipiIntegrazionePA = commonProperties.getProperty("openspcoop2.integrazione.pa");
			if(tipiIntegrazionePA==null){
				throw new Exception("Non sono stati definiti i tipi di Integrazione supportati (PA)");
			}else{
				tipiIntegrazionePA = tipiIntegrazionePA.trim();
			}
			String [] tipiIntegrazionePAArray = tipiIntegrazionePA.split(",");
			for (int i = 0; i < tipiIntegrazionePAArray.length; i++) {
				tipiIntegrazionePAArray[i]=tipiIntegrazionePAArray[i].trim();
			}
						
			ValidazioneSemantica validatore = new ValidazioneSemantica(configurazione,tipoConnettoriArray,
					tipoSoggettiArray,tipoServiziSoapArray,tipoServiziRestArray,
					tipiDiagnosticiAppenderArray,tipiTracceAppenderArray,tipiDumpAppenderArray,
					tipiAutenticazionePortaDelegataArray,tipiAutenticazionePortaApplicativaArray,
					tipiAutorizzazionePortaDelegataArray,tipiAutorizzazionePortaApplicativaArray,
					tipiAutorizzazioneContenutiPortaDelegataArray,tipiAutorizzazioneContenutiPortaApplicativaArray,
					tipiIntegrazionePDArray,tipiIntegrazionePAArray,
					validaSezioneConfigurazione,log);
			
			validatore.validazioneSemantica(true);
		}catch(Exception e){
			log.error("Errore: "+e.getMessage());
			throw e;
			//e.printStackTrace(System.out);
		}
		
	}

	
}