DBManager.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.monitor.rs.server.config;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Enumeration;

import javax.naming.InitialContext;
import javax.sql.DataSource;

import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
import org.slf4j.Logger;

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

	/** Logger utilizzato per debug. */
	private static Logger log = null;

	/** DBManager */
	private static DBManager manager = null;

	private static boolean initialized = false;

	/** DataSource dove attingere connessioni della configurazione */

	private ServiceManagerProperties serviceManagerPropertiesConfig;
	public ServiceManagerProperties getServiceManagerPropertiesConfig() {
		return this.serviceManagerPropertiesConfig;
	}
	
	private DataSource dataSourceConfig = null;

	private String dataSourceConfigName = null;
	private java.util.Properties dataSourceConfigContext = null;
	public String getDataSourceConfigName() {
		return this.dataSourceConfigName;
	}

	public java.util.Properties getDataSourceConfigContext() {
		return this.dataSourceConfigContext;
	}
	
	/** DataSource dove attingere connessioni delle tracce */
	
	private ServiceManagerProperties serviceManagerPropertiesTracce;
	public ServiceManagerProperties getServiceManagerPropertiesTracce() {
		return this.serviceManagerPropertiesTracce;
	}
	
	private DataSource dataSourceTracce = null;

	private String dataSourceTracceName = null;
	private java.util.Properties dataSourceTracceContext = null;
	public String getDataSourceTracceName() {
		return this.dataSourceTracceName;
	}

	public java.util.Properties getDataSourceTracceContext() {
		return this.dataSourceTracceContext;
	}
	
	/** DataSource dove attingere connessioni delle statistiche */
	
	private ServiceManagerProperties serviceManagerPropertiesStatistiche;
	public ServiceManagerProperties getServiceManagerPropertiesStatistiche() {
		return this.serviceManagerPropertiesStatistiche;
	}
	
	private DataSource dataSourceStatistiche = null;

	private String dataSourceStatisticheName = null;
	private java.util.Properties dataSourceStatisticheContext = null;
	public String getDataSourceStatisticheName() {
		return this.dataSourceStatisticheName;
	}

	public java.util.Properties getDataSourceStatisticheContext() {
		return this.dataSourceStatisticheContext;
	}
	
	
	
	/**
	 * Viene chiamato in causa per istanziare il datasource
	 * 
	 * @param jndiName
	 *            Nome JNDI del Datasource
	 * @param context
	 *            Contesto JNDI da utilizzare
	 */
	private DBManager(String jndiNameConfig, java.util.Properties contextConfig, String tipoDBConfig, 
			String jndiNameTracce, java.util.Properties contextTracce, String tipoDBTracce, 
			String jndiNameStatistiche, java.util.Properties contextStatistiche, String tipoDBStatistiche, 
			boolean debug) throws Exception {
		try {
			DBManager.log = LoggerProperties.getLoggerCore();
			
			
			/** DataSource dove attingere connessioni della configurazione */
			
			this.dataSourceConfigName = jndiNameConfig;
			this.dataSourceConfigContext = contextConfig;
			
			if (this.dataSourceConfigContext != null) {
				DBManager.log.info("Proprieta' di contesto:" + this.dataSourceConfigContext.size());
				Enumeration<?> en = this.dataSourceConfigContext.keys();
				while (en.hasMoreElements()) {
					String key = (String) en.nextElement();
					DBManager.log.info("\tNome[" + key + "] Valore[" + this.dataSourceConfigContext.getProperty(key) + "]");
				}
			} else {
				DBManager.log.info("Proprieta' di contesto non fornite");
			}

			DBManager.log.info("Nome dataSource:" + this.dataSourceConfigName);

			InitialContext initC = null;
			if (this.dataSourceConfigContext != null && this.dataSourceConfigContext.size() > 0)
				initC = new InitialContext(this.dataSourceConfigContext);
			else
				initC = new InitialContext();
			this.dataSourceConfig = (DataSource) initC.lookup(this.dataSourceConfigName);
			initC.close();
			
			this.serviceManagerPropertiesConfig = new ServiceManagerProperties();
			this.serviceManagerPropertiesConfig.setDatabaseType(tipoDBConfig);
			this.serviceManagerPropertiesConfig.setShowSql(debug);
			
			
			/** DataSource dove attingere connessioni per le tracce */
			
			this.dataSourceTracceName = jndiNameTracce;
			this.dataSourceTracceContext = contextTracce;
			
			if (this.dataSourceTracceContext != null) {
				DBManager.log.info("Proprieta' di contesto:" + this.dataSourceTracceContext.size());
				Enumeration<?> en = this.dataSourceTracceContext.keys();
				while (en.hasMoreElements()) {
					String key = (String) en.nextElement();
					DBManager.log.info("\tNome[" + key + "] Valore[" + this.dataSourceTracceContext.getProperty(key) + "]");
				}
			} else {
				DBManager.log.info("Proprieta' di contesto non fornite");
			}

			DBManager.log.info("Nome dataSource:" + this.dataSourceTracceName);

			initC = null;
			if (this.dataSourceTracceContext != null && this.dataSourceTracceContext.size() > 0)
				initC = new InitialContext(this.dataSourceTracceContext);
			else
				initC = new InitialContext();
			this.dataSourceTracce = (DataSource) initC.lookup(this.dataSourceTracceName);
			initC.close();
			
			this.serviceManagerPropertiesTracce = new ServiceManagerProperties();
			this.serviceManagerPropertiesTracce.setDatabaseType(tipoDBTracce);
			this.serviceManagerPropertiesTracce.setShowSql(debug);
			
			
			/** DataSource dove attingere connessioni per le statistiche */
			
			this.dataSourceStatisticheName = jndiNameStatistiche;
			this.dataSourceStatisticheContext = contextStatistiche;
			
			if (this.dataSourceStatisticheContext != null) {
				DBManager.log.info("Proprieta' di contesto:" + this.dataSourceStatisticheContext.size());
				Enumeration<?> en = this.dataSourceStatisticheContext.keys();
				while (en.hasMoreElements()) {
					String key = (String) en.nextElement();
					DBManager.log.info("\tNome[" + key + "] Valore[" + this.dataSourceStatisticheContext.getProperty(key) + "]");
				}
			} else {
				DBManager.log.info("Proprieta' di contesto non fornite");
			}

			DBManager.log.info("Nome dataSource:" + this.dataSourceStatisticheName);

			initC = null;
			if (this.dataSourceStatisticheContext != null && this.dataSourceStatisticheContext.size() > 0)
				initC = new InitialContext(this.dataSourceStatisticheContext);
			else
				initC = new InitialContext();
			this.dataSourceStatistiche = (DataSource) initC.lookup(this.dataSourceStatisticheName);
			initC.close();
			
			this.serviceManagerPropertiesStatistiche = new ServiceManagerProperties();
			this.serviceManagerPropertiesStatistiche.setDatabaseType(tipoDBStatistiche);
			this.serviceManagerPropertiesStatistiche.setShowSql(debug);

		} catch (Exception e) {
			DBManager.log.error("Lookup datasource non riuscita", e);
			throw e;
		}
	}

	/**
	 * Il Metodo si occupa di inizializzare il propertiesReader del QueueManager
	 * 
	 */
	public static synchronized boolean initialize(String jndiNameConfig, java.util.Properties contextConfig, String tipoDBConfig, 
			String jndiNameTracce, java.util.Properties contextTracce, String tipoDBTracce, 
			String jndiNameStatistiche, java.util.Properties contextStatistiche, String tipoDBStatistiche, 
			boolean debug) throws Exception {
		try {
			if (DBManager.manager == null) {
				DBManager.manager = new DBManager(jndiNameConfig, contextConfig, tipoDBConfig, 
						jndiNameTracce, contextTracce, tipoDBTracce,
						jndiNameStatistiche, contextStatistiche, tipoDBStatistiche,
						debug);
				DBManager.setInitialized(true);
			}
			return true;
		} catch (Exception e) {
			DBManager.setInitialized(false);
			DBManager.log.debug("Errore di inizializzazione del Database", e);
			throw e;
		}
	}

	/**
	 * Ritorna l'istanza di questo DBManager
	 * 
	 * @return Istanza di DBManager
	 */
	public static DBManager getInstance() {
		// spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
		if(DBManager.manager==null) {
			synchronized (DBManager.class) {
				return DBManager.manager;
			}
		}
		return DBManager.manager;
	}

	/**
	 * Viene chiamato in causa per ottenere una connessione al DB
	 */
	public java.sql.Connection getConnectionConfig() {
		if (this.dataSourceConfig == null) {
			return null;
		}

		Connection connectionDB = null;
		try {
			connectionDB = this.dataSourceConfig.getConnection();
		} catch (Exception e) {
			DBManager.log.error("getConnectionConfig from db", e);
			return null;
		}

		return connectionDB;
	}

	/**
	 * Viene chiamato in causa per rilasciare una connessione al DB, effettuando
	 * precedentemente un commit
	 * 
	 * @param connectionDB
	 *            Connessione da rilasciare.
	 */
	public void releaseConnectionConfig(java.sql.Connection connectionDB) {
		try {
			if (connectionDB != null) {
				connectionDB.close();
			}
		} catch (SQLException e) {
			DBManager.log.error("closeConnection config db", e);
		}
	}
	
	/**
	 * Viene chiamato in causa per ottenere una connessione al DB
	 */
	public java.sql.Connection getConnectionTracce() {
		if (this.dataSourceTracce == null) {
			return null;
		}

		Connection connectionDB = null;
		try {
			connectionDB = this.dataSourceTracce.getConnection();
		} catch (Exception e) {
			DBManager.log.error("getConnectionTracce from db", e);
			return null;
		}

		return connectionDB;
	}

	/**
	 * Viene chiamato in causa per rilasciare una connessione al DB, effettuando
	 * precedentemente un commit
	 * 
	 * @param connectionDB
	 *            Connessione da rilasciare.
	 */
	public void releaseConnectionTracce(java.sql.Connection connectionDB) {
		try {
			if (connectionDB != null) {
				connectionDB.close();
			}
		} catch (SQLException e) {
			DBManager.log.error("closeConnection tracce db", e);
		}
	}

	/**
	 * Viene chiamato in causa per ottenere una connessione al DB
	 */
	public java.sql.Connection getConnectionStatistiche() {
		if (this.dataSourceStatistiche == null) {
			return null;
		}

		Connection connectionDB = null;
		try {
			connectionDB = this.dataSourceStatistiche.getConnection();
		} catch (Exception e) {
			DBManager.log.error("getConnectionStatistiche from db", e);
			return null;
		}

		return connectionDB;
	}

	/**
	 * Viene chiamato in causa per rilasciare una connessione al DB, effettuando
	 * precedentemente un commit
	 * 
	 * @param connectionDB
	 *            Connessione da rilasciare.
	 */
	public void releaseConnectionStatistiche(java.sql.Connection connectionDB) {
		try {
			if (connectionDB != null) {
				connectionDB.close();
			}
		} catch (SQLException e) {
			DBManager.log.error("closeConnection statistiche db", e);
		}
	}

	
	public static boolean isInitialized() {
		return DBManager.initialized;
	}

	private static void setInitialized(boolean initialized) {
		DBManager.initialized = initialized;
	}
}