DriverConfigurazioneDB_routingTableDriver.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.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.openspcoop2.core.commons.DBUtils;
import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.core.config.Route;
import org.openspcoop2.core.config.RouteGateway;
import org.openspcoop2.core.config.RouteRegistro;
import org.openspcoop2.core.config.RoutingTable;
import org.openspcoop2.core.config.RoutingTableDefault;
import org.openspcoop2.core.config.RoutingTableDestinazione;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.utils.jdbc.JDBCUtilities;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.SQLObjectFactory;

/**
 * DriverConfigurazioneDB_routingTableDriver
 * 
 * 
 * @author Sandra Giangrandi (sandra@link.it)
 * @author Stefano Corallo (corallo@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class DriverConfigurazioneDB_routingTableDriver {

	private DriverConfigurazioneDB driver = null;
	
	protected DriverConfigurazioneDB_routingTableDriver(DriverConfigurazioneDB driver) {
		this.driver = driver;
	}

	
	protected RoutingTable getRoutingTable() throws DriverConfigurazioneException {

		Connection con = null;
		PreparedStatement stm = null;
		ResultSet rs = null;
		PreparedStatement stmSearch = null;
		ResultSet rsSearch = null;
		String sqlQuery = "";

		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource("getRoutingTable");

			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::getRoutingTable] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);

		try {
			boolean routingEnabled = false;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(CostantiDB.CONFIGURAZIONE);
			sqlQueryObject.addSelectField("*");
			sqlQuery = sqlQueryObject.createSQLQuery();
			this.driver.logDebug("eseguo query per routing enabled : " + DBUtils.formatSQLString(sqlQuery));
			stm = con.prepareStatement(sqlQuery);

			rs = stm.executeQuery();

			if (rs.next()) {
				this.driver.logDebug("ConfigurazionePresente");
				this.driver.logDebug("Risultato query per routing enabled ["+rs.getString("routing_enabled")+"]");
				routingEnabled = CostantiConfigurazione.ABILITATO.equals(DriverConfigurazioneDBLib.getEnumStatoFunzionalita(rs.getString("routing_enabled")));
			}
			rs.close();
			stm.close();
			this.driver.logDebug("RoutingEnabled: "+routingEnabled);

			RoutingTable rt = new RoutingTable();
			rt.setAbilitata(routingEnabled);
			//sia che il routing sia abilitato/disabilitato
			//le rotte possono essere comunque presenti
			//if (routingEnabled) {

			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(CostantiDB.ROUTING);
			sqlQueryObject.addSelectField("*");
			sqlQuery = sqlQueryObject.createSQLQuery();
			this.driver.logDebug("eseguo query per routing table : " + DBUtils.formatSQLString(sqlQuery));
			stm = con.prepareStatement(sqlQuery);

			rs = stm.executeQuery();

			String tipo = null;
			String nome = null;
			String tipoRotta = null;
			String tiposoggrotta = null;
			String nomesoggrotta = null;
			long id_registrorotta = 0;
			boolean is_default = false;
			long idR = 0;

			RoutingTableDefault rtdefault = null;
			Route route = null;
			RouteGateway routeGateway = null;
			RouteRegistro routeRegistro = null;
			RoutingTableDestinazione rtd = null;

			int nroute = 0;
			this.driver.logDebug("Check esistenza rotte....");
			while (rs.next()) {

				this.driver.logDebug("Nuova rotta....["+rs.getInt("is_default")+"]");

				nroute++;
				// nuova route
				route = new Route();

				idR = rs.getLong("id");
				tipo = rs.getString("tipo");
				nome = rs.getString("nome");
				tipoRotta = rs.getString("tiporotta");
				nomesoggrotta = rs.getString("nomesoggrotta");
				tiposoggrotta = rs.getString("tiposoggrotta");
				id_registrorotta = rs.getLong("registrorotta");
				if(rs.getInt("is_default")==1)
					is_default = true;
				else
					is_default = false;

				if (tipoRotta.equalsIgnoreCase("registro")) {
					// e' una rotta registro
					routeRegistro = new RouteRegistro();

					// se e' 0 allora significa ke voglio tutte le rotte
					if (id_registrorotta != 0) {
						// mi serve il nome di questa rotta
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
						sqlQueryObject.addFromTable(CostantiDB.REGISTRI);
						sqlQueryObject.addSelectField("*");
						sqlQueryObject.addWhereCondition("id = ?");
						sqlQuery = sqlQueryObject.createSQLQuery();
						stmSearch = con.prepareStatement(sqlQuery);
						stmSearch.setLong(1, id_registrorotta);

						this.driver.logDebug("eseguo query : " + DBUtils.formatSQLString(sqlQuery, id_registrorotta));

						rsSearch = stmSearch.executeQuery();
						if (rsSearch.next()) {
							routeRegistro.setNome(rsSearch.getString("nome"));

						}
						rsSearch.close();
						stmSearch.close();
					}

					route.setRegistro(routeRegistro);

				} else if (tipoRotta.equalsIgnoreCase("gateway")) {
					// e' una rotta gw
					routeGateway = new RouteGateway();

					routeGateway.setNome(nomesoggrotta);
					routeGateway.setTipo(tiposoggrotta);

					route.setGateway(routeGateway);
				}

				route.setId(idR);

				// e' di default
				if (is_default){
					if(rtdefault==null){
						rtdefault = new RoutingTableDefault();
						rt.setDefault(rtdefault);
					}
					rt.getDefault().addRoute(route);
				}
				else {// allora e' di destinazione
					rtd = new RoutingTableDestinazione();
					rtd.setNome(nome);
					rtd.setTipo(tipo);
					rtd.addRoute(route);
					rt.addDestinazione(rtd);
				}
			}

			this.driver.logDebug("Ci sono " + nroute + " rotte configurate.");
			rs.close();
			stm.close();
			//if (nroute == 0)
			//	throw new DriverConfigurazioneNotFound("[DriverConfigurazioneDB::getRoutingTable] Routing Abilitato ma nessuna route trovata.]");



			//}
			//else {
			//	throw new DriverConfigurazioneNotFound("[DriverConfigurazioneDB::getRoutingTable] Routing Disabilitato]");
			//}

			return rt;


		} catch (SQLException se) {

			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::getRoutingTable] SqlException: " + se.getMessage(),se);
		}catch (Exception se) {

			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::getRoutingTable] Exception: " + se.getMessage(),se);
		} finally {

			//Chiudo statement and resultset
			JDBCUtilities.closeResources(rsSearch, stmSearch);
			JDBCUtilities.closeResources(rs, stm);

			this.driver.closeConnection(con);
		}

	}

	protected void createRoutingTable(RoutingTable routingTable) throws DriverConfigurazioneException {

		if (routingTable == null ||  routingTable.getDefault() == null || routingTable.getDefault().sizeRouteList() == 0)
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::createRoutingTable] Parametri non validi.");

		Connection con = null;
		boolean error = false;

		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource("createRoutingTable");
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::createRoutingTable] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);

		try {
			this.driver.logDebug("CRUDRoutingTable type = 1");
			// creo soggetto
			DriverConfigurazioneDB_routingTableLIB.CRUDRoutingTable(1, routingTable, con);

		} catch (Exception qe) {
			error = true;
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::createRoutingTable] Errore durante la creazione della RoutingTable : " + qe.getMessage(),qe);
		} finally {

			this.driver.closeConnection(error,con);
		}
	}

	protected void updateRoutingTable(RoutingTable routingTable) throws DriverConfigurazioneException {
		if (routingTable == null ||  routingTable.getDefault() == null || routingTable.getDefault().sizeRouteList() == 0)
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::updateRoutingTable] Parametri non validi.");

		Connection con = null;
		boolean error = false;

		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource("updateRoutingTable");
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::createRoutingTable] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);

		try {
			this.driver.logDebug("CRUDRoutingTable type = 2");
			// creo soggetto
			DriverConfigurazioneDB_routingTableLIB.CRUDRoutingTable(2, routingTable, con);

		} catch (Exception qe) {
			error = true;
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::updateRoutingTable] Errore durante la update della RoutingTable : " + qe.getMessage(),qe);
		} finally {

			this.driver.closeConnection(error,con);
		}
	}

	protected void deleteRoutingTable(RoutingTable routingTable) throws DriverConfigurazioneException {
		if (routingTable == null)
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::deleteRoutingTable] Parametri non validi.");

		Connection con = null;
		boolean error = false;

		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource("deleteRoutingTable");
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::deleteRoutingTable] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);

		try {
			this.driver.logDebug("CRUDRoutingTable type = 3");
			// creo soggetto
			DriverConfigurazioneDB_routingTableLIB.CRUDRoutingTable(3, routingTable, con);

		} catch (Exception qe) {
			error = true;
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::deleteRoutingTable] Errore durante la delete della RoutingTable : " + qe.getMessage(),qe);
		} finally {

			this.driver.closeConnection(error,con);
		}
	}

	protected List<RoutingTableDestinazione> routingList(ISearch ricerca) throws DriverConfigurazioneException {
		String nomeMetodo = "routingList";
		int idLista = Liste.ROUTING;
		int offset;
		int limit;
		String search;
		String queryString;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);
		search = (org.openspcoop2.core.constants.Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : ricerca.getSearchString(idLista));


		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		ArrayList<RoutingTableDestinazione> lista = new ArrayList<RoutingTableDestinazione>();

		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource("routingList");
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::" + nomeMetodo + "] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);

		try {

			if (!search.equals("")) {
				//query con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.ROUTING);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition("is_default = 0");
				sqlQueryObject.addWhereCondition(false, sqlQueryObject.getWhereLikeCondition("tipo",search,true,true), sqlQueryObject.getWhereLikeCondition("nome",search,true,true));
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			} else {
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.ROUTING);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition("is_default = 0");
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			risultato = stmt.executeQuery();
			if (risultato.next())
				ricerca.setNumEntries(idLista,risultato.getInt(1));
			risultato.close();
			stmt.close();

			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;

			if (!search.equals("")) { // con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.ROUTING);
				sqlQueryObject.addSelectField("id");
				sqlQueryObject.addSelectField("nome");
				sqlQueryObject.addSelectField("tipo");
				sqlQueryObject.addSelectField("tiporotta");
				sqlQueryObject.addSelectField("is_default");
				sqlQueryObject.addWhereCondition("is_default = 0");
				sqlQueryObject.addWhereCondition(false, sqlQueryObject.getWhereLikeCondition("tipo",search,true,true), sqlQueryObject.getWhereLikeCondition("nome",search,true,true));
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy("tipo");
				sqlQueryObject.addOrderBy("nome");
				sqlQueryObject.setSortType(true);
				sqlQueryObject.setLimit(limit);
				sqlQueryObject.setOffset(offset);
				queryString = sqlQueryObject.createSQLQuery();
			} else {
				// senza search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.ROUTING);
				sqlQueryObject.addSelectField("id");
				sqlQueryObject.addSelectField("nome");
				sqlQueryObject.addSelectField("tipo");
				sqlQueryObject.addSelectField("tiporotta");
				sqlQueryObject.addSelectField("is_default");
				sqlQueryObject.addWhereCondition("is_default = 0");
				sqlQueryObject.addOrderBy("tipo");
				sqlQueryObject.addOrderBy("nome");
				sqlQueryObject.setSortType(true);
				sqlQueryObject.setLimit(limit);
				sqlQueryObject.setOffset(offset);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			risultato = stmt.executeQuery();

			RoutingTableDestinazione rtd;
			while (risultato.next()) {

				rtd = new RoutingTableDestinazione();

				rtd.setId(risultato.getLong("id"));
				rtd.setNome(risultato.getString("nome"));
				rtd.setTipo(risultato.getString("tipo"));
				// Non è necessario popolare rg e rr
				// perchè tanto il metodo che prepara la lista
				// deve solo decidere il tiporotta scelto
				Route tmpR = new Route();
				if ("gateway".equals(risultato.getString("tiporotta"))) {
					RouteGateway rg = new RouteGateway();
					tmpR.setGateway(rg);
				} else {
					RouteRegistro rr = new RouteRegistro();
					tmpR.setRegistro(rr);
				}
				rtd.addRoute(tmpR);

				lista.add(rtd);
			}

			return lista;

		} catch (Exception qe) {
			error = true;
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB::" + nomeMetodo + "] Errore : " + qe.getMessage(),qe);
		} finally {

			//Chiudo statement and resultset
			JDBCUtilities.closeResources(risultato, stmt);

			this.driver.closeConnection(error,con);
		}
	}
}