DBConsegneMessageBoxManager.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.pdd.config;

  21. import java.sql.Connection;
  22. import java.sql.Statement;

  23. import javax.sql.DataSource;

  24. import org.openspcoop2.core.commons.CoreException;
  25. import org.openspcoop2.core.commons.IMonitoraggioRisorsa;
  26. import org.openspcoop2.core.constants.Costanti;
  27. import org.openspcoop2.core.constants.CostantiDB;
  28. import org.openspcoop2.core.id.IDSoggetto;
  29. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  30. import org.openspcoop2.utils.LoggerWrapperFactory;
  31. import org.openspcoop2.utils.UtilsAlreadyExistsException;
  32. import org.openspcoop2.utils.datasource.DataSourceFactory;
  33. import org.openspcoop2.utils.datasource.DataSourceParams;
  34. import org.openspcoop2.utils.jdbc.JDBCUtilities;
  35. import org.openspcoop2.utils.resources.GestoreJNDI;
  36. import org.slf4j.Logger;

  37. /**    
  38.  * DBConsegneMessageBoxManager
  39.  *
  40.  * @author Poli Andrea (poli@link.it)
  41.  * @author $Author$
  42.  * @version $Rev$, $Date$
  43.  */
  44. public class DBConsegneMessageBoxManager implements IMonitoraggioRisorsa {

  45.    
  46.     private static DBConsegneMessageBoxManager staticInstanceDBRuntimeManager;
  47.     public static synchronized void initRuntime(DBManager dbManagerRuntimePdD,Logger alog,String tipoDatabase) throws Exception {
  48.         if(staticInstanceDBRuntimeManager==null) {
  49.             staticInstanceDBRuntimeManager = new DBConsegneMessageBoxManager(dbManagerRuntimePdD, alog, tipoDatabase);
  50.         }
  51.     }
  52.     public static synchronized void initRuntime(DBConsegnePreseInCaricoManager dbConsegnePreseInCaricoManager,Logger alog,String tipoDatabase) throws Exception {
  53.         if(staticInstanceDBRuntimeManager==null) {
  54.             staticInstanceDBRuntimeManager = new DBConsegneMessageBoxManager(dbConsegnePreseInCaricoManager, alog, tipoDatabase,false);
  55.         }
  56.     }
  57.     public static synchronized void initRuntime(String nomeDataSource, java.util.Properties context,Logger alog,String tipoDatabase,
  58.             boolean useOp2UtilsDatasource, boolean bindJMX) throws Exception {
  59.         if(staticInstanceDBRuntimeManager==null) {
  60.             staticInstanceDBRuntimeManager = new DBConsegneMessageBoxManager(nomeDataSource, context, alog, tipoDatabase, useOp2UtilsDatasource, bindJMX,
  61.                     false);
  62.         }
  63.     }
  64.     public static DBConsegneMessageBoxManager getInstanceRuntime() {
  65.         // spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
  66.         if (staticInstanceDBRuntimeManager == null) {
  67.             synchronized (DBConsegneMessageBoxManager.class) {
  68.                 if (staticInstanceDBRuntimeManager == null) {
  69.                     return null;
  70.                 }
  71.             }
  72.         }
  73.         return staticInstanceDBRuntimeManager;
  74.     }
  75.    
  76.    
  77.     private static DBConsegneMessageBoxManager staticInstanceDBTransazioniManager;
  78.     public static synchronized void initTransazioni(DBTransazioniManager dbManagerTransazioni,Logger alog,String tipoDatabase) throws Exception {
  79.         if(staticInstanceDBTransazioniManager==null) {
  80.             staticInstanceDBTransazioniManager = new DBConsegneMessageBoxManager(dbManagerTransazioni, alog, tipoDatabase);
  81.         }
  82.     }
  83.     public static synchronized void initTransazioni(DBConsegnePreseInCaricoManager dbConsegnePreseInCaricoManager,Logger alog,String tipoDatabase) throws Exception {
  84.         if(staticInstanceDBTransazioniManager==null) {
  85.             staticInstanceDBTransazioniManager = new DBConsegneMessageBoxManager(dbConsegnePreseInCaricoManager, alog, tipoDatabase, true);
  86.         }
  87.     }
  88.     public static synchronized void initTransazioni(String nomeDataSource, java.util.Properties context,Logger alog,String tipoDatabase,
  89.             boolean useOp2UtilsDatasource, boolean bindJMX) throws Exception {
  90.         if(staticInstanceDBTransazioniManager==null) {
  91.             staticInstanceDBTransazioniManager = new DBConsegneMessageBoxManager(nomeDataSource, context, alog, tipoDatabase, useOp2UtilsDatasource, bindJMX,
  92.                     true);
  93.         }
  94.     }
  95.     public static DBConsegneMessageBoxManager getInstanceTransazioni() {
  96.         // spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
  97.         if (staticInstanceDBTransazioniManager == null) {
  98.             synchronized (DBConsegneMessageBoxManager.class) {
  99.                 if (staticInstanceDBTransazioniManager == null) {
  100.                     return null;
  101.                 }
  102.             }
  103.         }
  104.         return staticInstanceDBTransazioniManager;
  105.     }
  106.    
  107.    
  108.     /** Informazione sui proprietari che hanno richiesto una connessione */
  109.     private static java.util.concurrent.ConcurrentHashMap<String,Resource> risorseInGestioneRuntime = new java.util.concurrent.ConcurrentHashMap<>();
  110.     private static java.util.concurrent.ConcurrentHashMap<String,Resource> risorseInGestioneTransazioni = new java.util.concurrent.ConcurrentHashMap<>();
  111.    
  112.     public static String[] getStatoRisorse_runtime() throws Exception{  
  113.         return DBManager.getStatoRisorse(DBConsegneMessageBoxManager.risorseInGestioneRuntime);
  114.     }
  115.     public static String[] getStatoRisorse_transazioni() throws Exception{  
  116.         return DBManager.getStatoRisorse(DBConsegneMessageBoxManager.risorseInGestioneTransazioni);
  117.     }
  118.    
  119.    
  120.     private String tipoDatabase;
  121.     public String getTipoDatabase() {
  122.         return this.tipoDatabase;
  123.     }

  124.     private Logger log;
  125.    
  126.     private DBManager dbManagerRuntimePdD;
  127.     private DBTransazioniManager dbManagerTransazioni;
  128.     private DBConsegnePreseInCaricoManager dbConsegnePreseInCaricoManager;
  129.     public boolean useDefaultManager() {
  130.         return this.dbManagerRuntimePdD!=null || this.dbManagerTransazioni!=null;
  131.     }
  132.     public boolean useConsegnePreseInCaricoManager() {
  133.         return this.dbConsegnePreseInCaricoManager!=null;
  134.     }
  135.     public boolean useRuntimePdD() {
  136.         if(useDefaultManager()) {
  137.             return this.dbManagerRuntimePdD!=null || this.dbManagerTransazioni.useRuntimePdD();
  138.         }
  139.         else if(useConsegnePreseInCaricoManager()) {
  140.             return this.dbConsegnePreseInCaricoManager.useRuntimePdD();
  141.         }
  142.         return false;
  143.     }
  144.     private DataSource datasourceDedicato;
  145.     private String identita;
  146.    
  147.     private DBConsegneMessageBoxManager(DBManager dbManagerRuntimePdD,Logger alog,String tipoDatabase) throws Exception {
  148.         this(alog, tipoDatabase, false);
  149.         this.dbManagerRuntimePdD = dbManagerRuntimePdD;
  150.     }
  151.     private DBConsegneMessageBoxManager(DBTransazioniManager dbManagerTransazioni,Logger alog,String tipoDatabase) throws Exception {
  152.         this(alog, tipoDatabase, true);
  153.         this.dbManagerTransazioni = dbManagerTransazioni;
  154.     }
  155.     private DBConsegneMessageBoxManager(DBConsegnePreseInCaricoManager dbConsegnePreseInCaricoManager,Logger alog,String tipoDatabase, boolean tracce) throws Exception {
  156.         this(alog, tipoDatabase, tracce);
  157.         this.dbConsegnePreseInCaricoManager = dbConsegnePreseInCaricoManager;
  158.     }

  159.     private DBConsegneMessageBoxManager(String nomeDataSource, java.util.Properties context,Logger alog,String tipoDatabase,
  160.             boolean useOp2UtilsDatasource, boolean bindJMX,
  161.             boolean tracce) throws Exception {
  162.        
  163.         this(alog, tipoDatabase, tracce);
  164.        
  165.         try {
  166.            
  167.             if(useOp2UtilsDatasource){
  168.                 DataSourceParams dsParams = Costanti.getDataSourceParamsPdD(bindJMX, tipoDatabase);
  169.                 try{
  170.                     this.datasourceDedicato = DataSourceFactory.newInstance(nomeDataSource, context, dsParams);
  171.                 }catch(UtilsAlreadyExistsException exists){
  172.                     this.datasourceDedicato = DataSourceFactory.getInstance(nomeDataSource);
  173.                     if(this.datasourceDedicato==null){
  174.                         throw new Exception("Lookup datasource non riuscita ("+exists.getMessage()+")",exists);
  175.                     }
  176.                 }
  177.             }
  178.             else{
  179.                 GestoreJNDI gestoreJNDI = new GestoreJNDI(context);
  180.                 this.datasourceDedicato = (DataSource) gestoreJNDI.lookup(nomeDataSource);
  181.             }
  182.         } catch (Exception ne) {
  183.             this.log.error("Impossibile instanziare il manager: " + ne.getMessage(),ne);
  184.             throw ne;
  185.         }
  186.     }
  187.    
  188.     private DBConsegneMessageBoxManager(Logger alog,String tipoDatabase,boolean tracce) throws Exception {
  189.         this.log = alog;
  190.         this.tipoDatabase = tipoDatabase;
  191.         if(tracce) {
  192.             this.identita = "DBConsegneMessageBoxTransazioniManager";
  193.         }
  194.         else {
  195.             this.identita = "DBConsegneMessageBoxRuntimeManager";
  196.         }
  197.            
  198.     }
  199.     private boolean isIamRuntimeManager() {
  200.         return "DBConsegneMessageBoxRuntimeManager".equals(this.identita);
  201.     }
  202.     private boolean isIamTransazioniManager() {
  203.         return "DBConsegneMessageBoxTransazioniManager".equals(this.identita);
  204.     }
  205.    
  206.    
  207.     public Resource getResource(IDSoggetto idPDD,String modulo,String idTransazione) throws Exception {
  208.         return this.getResource(idPDD, modulo, idTransazione, true);
  209.     }
  210.     public Resource getResource(IDSoggetto idPDD,String modulo,String idTransazione, boolean logError) throws Exception {
  211.         if(this.dbManagerRuntimePdD!=null) {
  212.             /**System.out.println("id ["+idTransazione+"] prendo da dbManager");*/
  213.             return this.dbManagerRuntimePdD.getResource(idPDD, modulo, idTransazione, logError);
  214.         }
  215.         else if(this.dbManagerTransazioni!=null) {
  216.             /**System.out.println("id ["+idTransazione+"] prendo da dbManagerTransazioni");*/
  217.             return this.dbManagerTransazioni.getResource(idPDD, modulo, idTransazione, logError);
  218.         }
  219.         else if(this.dbConsegnePreseInCaricoManager!=null) {
  220.             /**System.out.println("id ["+idTransazione+"] prendo da dbManagerTransazioni");*/
  221.             return this.dbConsegnePreseInCaricoManager.getResource(idPDD, modulo, idTransazione, logError);
  222.         }
  223.         else {
  224.             /**System.out.println("id ["+idTransazione+"] negozio");*/
  225.             try {
  226.                 StringBuilder bf = new StringBuilder();
  227.                 if(idPDD!=null) {
  228.                     bf.append(idPDD.toString());
  229.                     if(modulo!=null) {
  230.                         bf.append(".");
  231.                     }
  232.                 }
  233.                 if(modulo!=null) {
  234.                     bf.append(modulo);
  235.                 }
  236.                 if(bf.length()<=0) {
  237.                     bf.append(this.identita);
  238.                 }
  239.                 Resource risorsa = DBManager.buildResource(this.identita, this.getConnectionFromDatasource(bf.toString(), idTransazione),
  240.                         idPDD, modulo, idTransazione);  
  241.                
  242.                 if(this.isIamRuntimeManager()) {
  243.                     DBConsegneMessageBoxManager.risorseInGestioneRuntime.put(risorsa.getId(), risorsa);
  244.                 }
  245.                 else if(this.isIamTransazioniManager()) {
  246.                     DBConsegneMessageBoxManager.risorseInGestioneTransazioni.put(risorsa.getId(), risorsa);
  247.                 }
  248.                
  249.                 return risorsa;
  250.             }
  251.             catch(Exception e) {
  252.                 this.log.error("Errore durante l'ottenimento di una connessione: "+e.getMessage(),e);
  253.                 throw e;
  254.             }
  255.         }
  256.     }
  257.    
  258.     private Connection getConnectionFromDatasource(String methodName, String idTransazione) throws Exception{
  259.         if(this.datasourceDedicato instanceof org.openspcoop2.utils.datasource.DataSource){
  260.             return ((org.openspcoop2.utils.datasource.DataSource)this.datasourceDedicato).getWrappedConnection(idTransazione, this.identita+"."+methodName);
  261.         }
  262.         else{
  263.             return this.datasourceDedicato.getConnection();
  264.         }
  265.     }
  266.    
  267.     public void releaseResource(IDSoggetto idPDD,String modulo,Resource resource){
  268.         this.releaseResource(idPDD, modulo, resource, true);
  269.     }
  270.     public void releaseResource(IDSoggetto idPDD,String modulo,Resource resource, boolean logError){
  271.         try {
  272.             if(this.dbManagerRuntimePdD!=null) {
  273.                 this.dbManagerRuntimePdD.releaseResource(idPDD, modulo, resource, logError);
  274.             }
  275.             else if(this.dbManagerTransazioni!=null) {
  276.                 this.dbManagerTransazioni.releaseResource(idPDD, modulo, resource, logError);
  277.             }
  278.             else if(this.dbConsegnePreseInCaricoManager!=null) {
  279.                 this.dbConsegnePreseInCaricoManager.releaseResource(idPDD, modulo, resource, logError);
  280.             }
  281.             else {
  282.                 if(resource!=null){
  283.                    
  284.                     if(resource.getResource()!=null){
  285.                         Connection connectionDB = (Connection) resource.getResource();
  286.                         if(connectionDB != null && (!connectionDB.isClosed())){
  287.                             Logger logR = OpenSPCoop2Logger.getLoggerOpenSPCoopResources()!=null ? OpenSPCoop2Logger.getLoggerOpenSPCoopResources() : LoggerWrapperFactory.getLogger(DBConsegneMessageBoxManager.class);
  288.                             boolean checkAutocommit = (OpenSPCoop2Properties.getInstance()==null) || OpenSPCoop2Properties.getInstance().isJdbcCloseConnectionCheckAutocommit();
  289.                             boolean checkIsClosed = (OpenSPCoop2Properties.getInstance()==null) || OpenSPCoop2Properties.getInstance().isJdbcCloseConnectionCheckIsClosed();
  290.                             JDBCUtilities.closeConnection(logR, connectionDB, checkAutocommit, checkIsClosed);
  291.                         }
  292.                     }  
  293.                    
  294.                     if(this.isIamRuntimeManager()) {
  295.                         if(DBConsegneMessageBoxManager.risorseInGestioneRuntime.containsKey(resource.getId())) {
  296.                             DBConsegneMessageBoxManager.risorseInGestioneRuntime.remove(resource.getId());
  297.                         }
  298.                     }
  299.                     else if(this.isIamTransazioniManager()) {
  300.                         if(DBConsegneMessageBoxManager.risorseInGestioneTransazioni.containsKey(resource.getId())) {
  301.                             DBConsegneMessageBoxManager.risorseInGestioneTransazioni.remove(resource.getId());
  302.                         }
  303.                     }

  304.                 }
  305.             }

  306.         }
  307.         catch(Exception e) {
  308.             this.log.error("Errore durante il rilascio di una risorsa: "+e.getMessage(),e);
  309.         }
  310.     }
  311.    
  312.    
  313.    
  314.     /**
  315.      * Metodo che verica la connessione ad una risorsa.
  316.      * Se la connessione non e' presente, viene lanciata una eccezione che contiene il motivo della mancata connessione
  317.      *
  318.      * @throws DriverException eccezione che contiene il motivo della mancata connessione
  319.      */
  320.     @Override
  321.     public void isAlive() throws CoreException{
  322.         if(this.dbManagerRuntimePdD!=null) {
  323.             this.dbManagerRuntimePdD.isAlive();
  324.         }
  325.         else if(this.dbManagerTransazioni!=null) {
  326.             this.dbManagerTransazioni.isAlive();
  327.         }
  328.         else if(this.dbConsegnePreseInCaricoManager!=null) {
  329.             this.dbConsegnePreseInCaricoManager.isAlive();
  330.         }
  331.         else {
  332.             // Verifico la connessione
  333.             Resource resource = null;
  334.             Statement stmtTest = null;
  335.             IDSoggetto idSoggettAlive = new IDSoggetto();
  336.             idSoggettAlive.setCodicePorta(this.identita);
  337.             idSoggettAlive.setTipo(this.identita);
  338.             idSoggettAlive.setNome(this.identita);
  339.             try {
  340.                 try{
  341.                     resource = this.getResource(idSoggettAlive, "CheckIsAlive", null);
  342.                 }catch(Exception e){
  343.                     throw e;
  344.                 }
  345.                 if(resource == null)
  346.                     throw new Exception("Resource is null");
  347.                 if(resource.getResource() == null)
  348.                     throw new Exception("Connessione is null");
  349.                 Connection con = (Connection) resource.getResource();
  350.                 // test:
  351.                 stmtTest = con.createStatement();
  352.                 stmtTest.execute("SELECT * from "+CostantiDB.DB_INFO);
  353.                        
  354.             } catch (Exception e) {
  355.                 throw new CoreException("Connessione al database 'GovWay' ("+this.identita+") non disponibile: "+e.getMessage(),e);
  356.    
  357.             }finally{
  358.                 try{
  359.                     if(stmtTest!=null)
  360.                         stmtTest.close();
  361.                 }catch(Exception e){
  362.                     // close
  363.                 }
  364.                 try{
  365.                     this.releaseResource(idSoggettAlive, "CheckIsAlive", resource);
  366.                 }catch(Exception e){
  367.                     // close
  368.                 }
  369.             }
  370.         }
  371.     }
  372. }