DBManager.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */


  20. package org.openspcoop2.core.monitor.rs.server.config;

  21. import java.sql.Connection;
  22. import java.sql.SQLException;
  23. import java.util.Enumeration;

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

  26. import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
  27. import org.openspcoop2.utils.jdbc.JDBCUtilities;
  28. import org.slf4j.Logger;

  29. /**
  30.  * DBManager
  31.  *
  32.  * @author Andrea Poli (apoli@link.it)
  33.  * @author $Author$
  34.  * @version $Rev$, $Date$
  35.  *
  36.  */
  37. public class DBManager {

  38.     private static Logger checkLogger = null;
  39.     private static boolean checkIsClosed = true;
  40.     private static boolean checkAutocommit = true;
  41.     public static boolean isCheckIsClosed() {
  42.         return checkIsClosed;
  43.     }
  44.     public static void setCheckIsClosed(boolean checkIsClosed) {
  45.         DBManager.checkIsClosed = checkIsClosed;
  46.     }
  47.     public static boolean isCheckAutocommit() {
  48.         return checkAutocommit;
  49.     }
  50.     public static void setCheckAutocommit(boolean checkAutocommit) {
  51.         DBManager.checkAutocommit = checkAutocommit;
  52.     }
  53.     public static Logger getCheckLogger() {
  54.         return checkLogger;
  55.     }
  56.     public static void setCheckLogger(Logger checkLogger) {
  57.         DBManager.checkLogger = checkLogger;
  58.     }
  59.    
  60.     /** Logger utilizzato per debug. */
  61.     private static Logger log = null;

  62.     /** DBManager */
  63.     private static DBManager manager = null;

  64.     private static boolean initialized = false;

  65.     /** DataSource dove attingere connessioni della configurazione */

  66.     private ServiceManagerProperties serviceManagerPropertiesConfig;
  67.     public ServiceManagerProperties getServiceManagerPropertiesConfig() {
  68.         return this.serviceManagerPropertiesConfig;
  69.     }
  70.    
  71.     private DataSource dataSourceConfig = null;

  72.     private String dataSourceConfigName = null;
  73.     private java.util.Properties dataSourceConfigContext = null;
  74.     public String getDataSourceConfigName() {
  75.         return this.dataSourceConfigName;
  76.     }

  77.     public java.util.Properties getDataSourceConfigContext() {
  78.         return this.dataSourceConfigContext;
  79.     }
  80.    
  81.     /** DataSource dove attingere connessioni delle tracce */
  82.    
  83.     private ServiceManagerProperties serviceManagerPropertiesTracce;
  84.     public ServiceManagerProperties getServiceManagerPropertiesTracce() {
  85.         return this.serviceManagerPropertiesTracce;
  86.     }
  87.    
  88.     private DataSource dataSourceTracce = null;

  89.     private String dataSourceTracceName = null;
  90.     private java.util.Properties dataSourceTracceContext = null;
  91.     public String getDataSourceTracceName() {
  92.         return this.dataSourceTracceName;
  93.     }

  94.     public java.util.Properties getDataSourceTracceContext() {
  95.         return this.dataSourceTracceContext;
  96.     }
  97.    
  98.     /** DataSource dove attingere connessioni delle statistiche */
  99.    
  100.     private ServiceManagerProperties serviceManagerPropertiesStatistiche;
  101.     public ServiceManagerProperties getServiceManagerPropertiesStatistiche() {
  102.         return this.serviceManagerPropertiesStatistiche;
  103.     }
  104.    
  105.     private DataSource dataSourceStatistiche = null;

  106.     private String dataSourceStatisticheName = null;
  107.     private java.util.Properties dataSourceStatisticheContext = null;
  108.     public String getDataSourceStatisticheName() {
  109.         return this.dataSourceStatisticheName;
  110.     }

  111.     public java.util.Properties getDataSourceStatisticheContext() {
  112.         return this.dataSourceStatisticheContext;
  113.     }
  114.    
  115.    
  116.    
  117.     /**
  118.      * Viene chiamato in causa per istanziare il datasource
  119.      *
  120.      * @param jndiName
  121.      *            Nome JNDI del Datasource
  122.      * @param context
  123.      *            Contesto JNDI da utilizzare
  124.      */
  125.     private DBManager(String jndiNameConfig, java.util.Properties contextConfig, String tipoDBConfig,
  126.             String jndiNameTracce, java.util.Properties contextTracce, String tipoDBTracce,
  127.             String jndiNameStatistiche, java.util.Properties contextStatistiche, String tipoDBStatistiche,
  128.             boolean debug) throws Exception {
  129.         try {
  130.             DBManager.log = LoggerProperties.getLoggerCore();
  131.            
  132.            
  133.             /** DataSource dove attingere connessioni della configurazione */
  134.            
  135.             this.dataSourceConfigName = jndiNameConfig;
  136.             this.dataSourceConfigContext = contextConfig;
  137.            
  138.             if (this.dataSourceConfigContext != null) {
  139.                 DBManager.log.info("Proprieta' di contesto:" + this.dataSourceConfigContext.size());
  140.                 Enumeration<?> en = this.dataSourceConfigContext.keys();
  141.                 while (en.hasMoreElements()) {
  142.                     String key = (String) en.nextElement();
  143.                     DBManager.log.info("\tNome[" + key + "] Valore[" + this.dataSourceConfigContext.getProperty(key) + "]");
  144.                 }
  145.             } else {
  146.                 DBManager.log.info("Proprieta' di contesto non fornite");
  147.             }

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

  149.             InitialContext initC = null;
  150.             if (this.dataSourceConfigContext != null && this.dataSourceConfigContext.size() > 0)
  151.                 initC = new InitialContext(this.dataSourceConfigContext);
  152.             else
  153.                 initC = new InitialContext();
  154.             this.dataSourceConfig = (DataSource) initC.lookup(this.dataSourceConfigName);
  155.             initC.close();
  156.            
  157.             this.serviceManagerPropertiesConfig = new ServiceManagerProperties();
  158.             this.serviceManagerPropertiesConfig.setDatabaseType(tipoDBConfig);
  159.             this.serviceManagerPropertiesConfig.setShowSql(debug);
  160.            
  161.            
  162.             /** DataSource dove attingere connessioni per le tracce */
  163.            
  164.             this.dataSourceTracceName = jndiNameTracce;
  165.             this.dataSourceTracceContext = contextTracce;
  166.            
  167.             if (this.dataSourceTracceContext != null) {
  168.                 DBManager.log.info("Proprieta' di contesto:" + this.dataSourceTracceContext.size());
  169.                 Enumeration<?> en = this.dataSourceTracceContext.keys();
  170.                 while (en.hasMoreElements()) {
  171.                     String key = (String) en.nextElement();
  172.                     DBManager.log.info("\tNome[" + key + "] Valore[" + this.dataSourceTracceContext.getProperty(key) + "]");
  173.                 }
  174.             } else {
  175.                 DBManager.log.info("Proprieta' di contesto non fornite");
  176.             }

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

  178.             initC = null;
  179.             if (this.dataSourceTracceContext != null && this.dataSourceTracceContext.size() > 0)
  180.                 initC = new InitialContext(this.dataSourceTracceContext);
  181.             else
  182.                 initC = new InitialContext();
  183.             this.dataSourceTracce = (DataSource) initC.lookup(this.dataSourceTracceName);
  184.             initC.close();
  185.            
  186.             this.serviceManagerPropertiesTracce = new ServiceManagerProperties();
  187.             this.serviceManagerPropertiesTracce.setDatabaseType(tipoDBTracce);
  188.             this.serviceManagerPropertiesTracce.setShowSql(debug);
  189.            
  190.            
  191.             /** DataSource dove attingere connessioni per le statistiche */
  192.            
  193.             this.dataSourceStatisticheName = jndiNameStatistiche;
  194.             this.dataSourceStatisticheContext = contextStatistiche;
  195.            
  196.             if (this.dataSourceStatisticheContext != null) {
  197.                 DBManager.log.info("Proprieta' di contesto:" + this.dataSourceStatisticheContext.size());
  198.                 Enumeration<?> en = this.dataSourceStatisticheContext.keys();
  199.                 while (en.hasMoreElements()) {
  200.                     String key = (String) en.nextElement();
  201.                     DBManager.log.info("\tNome[" + key + "] Valore[" + this.dataSourceStatisticheContext.getProperty(key) + "]");
  202.                 }
  203.             } else {
  204.                 DBManager.log.info("Proprieta' di contesto non fornite");
  205.             }

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

  207.             initC = null;
  208.             if (this.dataSourceStatisticheContext != null && this.dataSourceStatisticheContext.size() > 0)
  209.                 initC = new InitialContext(this.dataSourceStatisticheContext);
  210.             else
  211.                 initC = new InitialContext();
  212.             this.dataSourceStatistiche = (DataSource) initC.lookup(this.dataSourceStatisticheName);
  213.             initC.close();
  214.            
  215.             this.serviceManagerPropertiesStatistiche = new ServiceManagerProperties();
  216.             this.serviceManagerPropertiesStatistiche.setDatabaseType(tipoDBStatistiche);
  217.             this.serviceManagerPropertiesStatistiche.setShowSql(debug);

  218.         } catch (Exception e) {
  219.             DBManager.log.error("Lookup datasource non riuscita", e);
  220.             throw e;
  221.         }
  222.     }

  223.     /**
  224.      * Il Metodo si occupa di inizializzare il propertiesReader del QueueManager
  225.      *
  226.      */
  227.     public static synchronized boolean initialize(String jndiNameConfig, java.util.Properties contextConfig, String tipoDBConfig,
  228.             String jndiNameTracce, java.util.Properties contextTracce, String tipoDBTracce,
  229.             String jndiNameStatistiche, java.util.Properties contextStatistiche, String tipoDBStatistiche,
  230.             boolean debug) throws Exception {
  231.         try {
  232.             if (DBManager.manager == null) {
  233.                 DBManager.manager = new DBManager(jndiNameConfig, contextConfig, tipoDBConfig,
  234.                         jndiNameTracce, contextTracce, tipoDBTracce,
  235.                         jndiNameStatistiche, contextStatistiche, tipoDBStatistiche,
  236.                         debug);
  237.                 DBManager.setInitialized(true);
  238.             }
  239.             return true;
  240.         } catch (Exception e) {
  241.             DBManager.setInitialized(false);
  242.             DBManager.log.debug("Errore di inizializzazione del Database", e);
  243.             throw e;
  244.         }
  245.     }

  246.     /**
  247.      * Ritorna l'istanza di questo DBManager
  248.      *
  249.      * @return Istanza di DBManager
  250.      */
  251.     public static DBManager getInstance() {
  252.         // spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
  253.         if(DBManager.manager==null) {
  254.             synchronized (DBManager.class) {
  255.                 return DBManager.manager;
  256.             }
  257.         }
  258.         return DBManager.manager;
  259.     }

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

  267.         Connection connectionDB = null;
  268.         try {
  269.             connectionDB = this.dataSourceConfig.getConnection();
  270.         } catch (Exception e) {
  271.             DBManager.log.error("getConnectionConfig from db", e);
  272.             return null;
  273.         }

  274.         return connectionDB;
  275.     }

  276.     /**
  277.      * Viene chiamato in causa per rilasciare una connessione al DB, effettuando
  278.      * precedentemente un commit
  279.      *
  280.      * @param connectionDB
  281.      *            Connessione da rilasciare.
  282.      */
  283.     public void releaseConnectionConfig(java.sql.Connection connectionDB) {
  284.         try {
  285.             JDBCUtilities.closeConnection(checkLogger, connectionDB, checkAutocommit, checkIsClosed);
  286.         } catch (SQLException e) {
  287.             DBManager.log.error("closeConnection config db", e);
  288.         }
  289.     }
  290.    
  291.     /**
  292.      * Viene chiamato in causa per ottenere una connessione al DB
  293.      */
  294.     public java.sql.Connection getConnectionTracce() {
  295.         if (this.dataSourceTracce == null) {
  296.             return null;
  297.         }

  298.         Connection connectionDB = null;
  299.         try {
  300.             connectionDB = this.dataSourceTracce.getConnection();
  301.         } catch (Exception e) {
  302.             DBManager.log.error("getConnectionTracce from db", e);
  303.             return null;
  304.         }

  305.         return connectionDB;
  306.     }

  307.     /**
  308.      * Viene chiamato in causa per rilasciare una connessione al DB, effettuando
  309.      * precedentemente un commit
  310.      *
  311.      * @param connectionDB
  312.      *            Connessione da rilasciare.
  313.      */
  314.     public void releaseConnectionTracce(java.sql.Connection connectionDB) {
  315.         try {
  316.             JDBCUtilities.closeConnection(checkLogger, connectionDB, checkAutocommit, checkIsClosed);
  317.         } catch (SQLException e) {
  318.             DBManager.log.error("closeConnection tracce db", e);
  319.         }
  320.     }

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

  328.         Connection connectionDB = null;
  329.         try {
  330.             connectionDB = this.dataSourceStatistiche.getConnection();
  331.         } catch (Exception e) {
  332.             DBManager.log.error("getConnectionStatistiche from db", e);
  333.             return null;
  334.         }

  335.         return connectionDB;
  336.     }

  337.     /**
  338.      * Viene chiamato in causa per rilasciare una connessione al DB, effettuando
  339.      * precedentemente un commit
  340.      *
  341.      * @param connectionDB
  342.      *            Connessione da rilasciare.
  343.      */
  344.     public void releaseConnectionStatistiche(java.sql.Connection connectionDB) {
  345.         try {
  346.             JDBCUtilities.closeConnection(checkLogger, connectionDB, checkAutocommit, checkIsClosed);
  347.         } catch (SQLException e) {
  348.             DBManager.log.error("closeConnection statistiche db", e);
  349.         }
  350.     }

  351.    
  352.     public static boolean isInitialized() {
  353.         return DBManager.initialized;
  354.     }

  355.     private static void setInitialized(boolean initialized) {
  356.         DBManager.initialized = initialized;
  357.     }
  358. }