AccordoServizioParteComuneServiziCompostiCore.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.web.ctrlstat.servlet.apc;

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

import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.id.IDAccordoCooperazione;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteComuneServizioCompostoServizioComponente;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.db.DriverRegistroServiziDB;
import org.openspcoop2.core.registry.driver.db.IDAccordoDB;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.web.ctrlstat.core.ControlStationCore;
import org.openspcoop2.web.ctrlstat.core.UtilitiesSQLQuery;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationDB;
import org.openspcoop2.web.ctrlstat.driver.DriverControlStationException;
import org.openspcoop2.web.ctrlstat.servlet.ConsoleHelper;
import org.openspcoop2.web.ctrlstat.servlet.aps.AccordiServizioParteSpecificaCore;

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

	protected AccordoServizioParteComuneServiziCompostiCore(ControlStationCore core) throws DriverControlStationException {
		super(core);
	}
	
	public List<IDAccordoDB> idAccordiServizioCompostiList(String superuser, ISearch ricerca, 
			boolean soloAccordiConsistentiRest, boolean soloAccordiConsistentiSoap) throws DriverRegistroServiziException {
		Connection con = null;
		String nomeMetodo = "idAccordiServizioCompostiList";
		DriverControlStationDB driver = null;

		try {
			// prendo una connessione
			con = ControlStationCore.dbM.getConnection();
			// istanzio il driver
			driver = new DriverControlStationDB(con, null, this.tipoDB);

			return driver.getDriverRegistroServiziDB().idAccordiServizioCompostiList(superuser, ricerca, 
					soloAccordiConsistentiRest, soloAccordiConsistentiSoap);
		} catch (DriverRegistroServiziException e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw e;
		} catch (Exception e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw new DriverRegistroServiziException(getPrefixError(nomeMetodo,  e), e);
		} finally {
			ControlStationCore.dbM.releaseConnection(con);
		}
	}
	
	public List<AccordoServizioParteComune> accordiServizioServiziComponentiConSoggettoErogatore(IDSoggetto idSoggetto) throws DriverRegistroServiziException {
		Connection con = null;
		String nomeMetodo = "accordiServizio_serviziComponentiConSoggettoErogatore";
		DriverRegistroServiziDB driver = null;

		try {
			// prendo una connessione
			con = ControlStationCore.dbM.getConnection();
			// istanzio il driver
			driver = new DriverRegistroServiziDB(con, ControlStationCore.log, this.tipoDB);

			return driver.accordiServizio_serviziComponentiConSoggettoErogatore(idSoggetto);
		} catch (DriverRegistroServiziException e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw e;
		} catch (Exception e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw new DriverRegistroServiziException(getPrefixError(nomeMetodo,  e), e);
		} finally {
			ControlStationCore.dbM.releaseConnection(con);
		}
	}

	public List<AccordoServizioParteComune> accordiServizioServiziComponenti(IDServizio idServizio) throws DriverRegistroServiziException {
		Connection con = null;
		String nomeMetodo = "accordiServizio_serviziComponenti";
		DriverRegistroServiziDB driver = null;

		try {
			// prendo una connessione
			con = ControlStationCore.dbM.getConnection();
			// istanzio il driver
			driver = new DriverRegistroServiziDB(con, ControlStationCore.log, this.tipoDB);

			return driver.accordiServizio_serviziComponenti(idServizio);
		} catch (DriverRegistroServiziException e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw e;
		} catch (Exception e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw new DriverRegistroServiziException(getPrefixError(nomeMetodo,  e), e);
		} finally {
			ControlStationCore.dbM.releaseConnection(con);
		}
	}

	public List<AccordoServizioParteComune> accordiServizioWithAccordoCooperazione(IDAccordoCooperazione idAccordoCooperazione) throws DriverRegistroServiziException {
		Connection con = null;
		String nomeMetodo = "accordiServizioWithAccordoCooperazione";
		DriverRegistroServiziDB driver = null;

		try {
			// prendo una connessione
			con = ControlStationCore.dbM.getConnection();
			// istanzio il driver
			driver = new DriverRegistroServiziDB(con, ControlStationCore.log, this.tipoDB);

			return driver.accordiServizioWithAccordoCooperazione(idAccordoCooperazione);
		} catch (DriverRegistroServiziException e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw e;
		} catch (Exception e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw new DriverRegistroServiziException(getPrefixError(nomeMetodo,  e), e);
		} finally {
			ControlStationCore.dbM.releaseConnection(con);
		}
	}


	public List<AccordoServizioParteComuneServizioCompostoServizioComponente> accordiComponentiList(long idAccordo, ISearch ricerca) throws DriverRegistroServiziException {
		Connection con = null;
		String nomeMetodo = "accordiComponentiList";
		DriverControlStationDB driver = null;

		try {
			// prendo una connessione
			con = ControlStationCore.dbM.getConnection();
			// istanzio il driver
			driver = new DriverControlStationDB(con, null, this.tipoDB);

			return driver.getDriverRegistroServiziDB().accordiComponentiList(idAccordo, ricerca);
		} catch (Exception e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
			throw new DriverRegistroServiziException(getPrefixError(nomeMetodo,  e), e);
		} finally {
			ControlStationCore.dbM.releaseConnection(con);
		}
	}

	public List<String[]> getAccordiServizioCompostoLabels(AccordoServizioParteComune as, long idAccordoLong, String userLogin, 
			List<String> tipiServiziCompatibili, List<String> tipiSoggettiCompatibili, ConsoleHelper helper){
		String[] serviziList = null;
		String[] serviziListLabel = null;
		Connection con = null;
		String nomeMetodo = "getAccordiServizioCompostoLabels";
		PreparedStatement stmt = null;
		ResultSet risultato = null;
		try{

			AccordiServizioParteSpecificaCore apsCore = new AccordiServizioParteSpecificaCore(this);

			con = ControlStationCore.dbM.getConnection();

			// Servizi
			ISQLQueryObject sqlQueryObject = (new UtilitiesSQLQuery()).getSQLQueryObject();
			sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
			sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
			sqlQueryObject.addFromTable(CostantiDB.ACCORDI_SERVIZI_COMPOSTO);
			sqlQueryObject.addSelectCountField(CostantiDB.SERVIZI + ".id", "tot", true);
			sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_SERVIZI_COMPOSTO+".id_accordo=?");
			sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_accordo<>?");
			if(as.getPrivato()==null || !as.getPrivato()){
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".privato=?");
			}
			sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SERVIZI+".id_soggetto");
			if( !isVisioneOggettiGlobale(userLogin)){
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".superuser = ?");
			}
			sqlQueryObject.setANDLogicOperator(true);

			//voglio i servizi che non sono gia' stati usati come componenti
			ISQLQueryObject sqlQueryObjectNotExist = (new UtilitiesSQLQuery()).getSQLQueryObject();
			sqlQueryObjectNotExist.addFromTable(CostantiDB.ACCORDI_SERVIZI_COMPONENTI);
			sqlQueryObjectNotExist.addWhereCondition(CostantiDB.ACCORDI_SERVIZI_COMPONENTI+".id_servizio_composto="+CostantiDB.ACCORDI_SERVIZI_COMPOSTO+".id");
			sqlQueryObjectNotExist.addWhereCondition(CostantiDB.ACCORDI_SERVIZI_COMPONENTI+".id_servizio_componente="+CostantiDB.SERVIZI+".id");
			sqlQueryObjectNotExist.setANDLogicOperator(true);

			sqlQueryObject.addWhereExistsCondition(true, sqlQueryObjectNotExist);

			String queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idAccordoLong);
			stmt.setLong(2, idAccordoLong);
			int index = 3;
			if(as.getPrivato()==null || !as.getPrivato()){
				stmt.setInt(index, 0);
				index++;
			}
			if( !isVisioneOggettiGlobale(userLogin)){
				stmt.setString(index, userLogin);
				index++;
			}
			risultato = stmt.executeQuery();
			int totServ = 0;
			if (risultato.next()) {
				totServ = risultato.getInt("tot");
			}
			risultato.close();
			stmt.close();

			List<String> serviziL = new ArrayList<>();
			List<String> serviziLabelL = new ArrayList<>();
			serviziL.add("-1");
			serviziLabelL.add("-");

			if (totServ != 0) {
				// Servizi
				sqlQueryObject = (new UtilitiesSQLQuery()).getSQLQueryObject();					
				sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.ACCORDI_SERVIZI_COMPOSTO);
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI, "id","idServizio");
				sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_SERVIZI_COMPOSTO+".id_accordo=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_accordo<>?");
				if(as.getPrivato()==null || !as.getPrivato()){
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".privato=?");
				}
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SERVIZI+".id_soggetto");
				if( !isVisioneOggettiGlobale(userLogin)){
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".superuser = ?");
				}
				sqlQueryObject.setANDLogicOperator(true);

				//voglio i servizi che non sono gia' stati usati come componenti
				sqlQueryObjectNotExist = (new UtilitiesSQLQuery()).getSQLQueryObject();
				sqlQueryObjectNotExist.addFromTable(CostantiDB.ACCORDI_SERVIZI_COMPONENTI);
				sqlQueryObjectNotExist.addWhereCondition(CostantiDB.ACCORDI_SERVIZI_COMPONENTI+".id_servizio_composto="+CostantiDB.ACCORDI_SERVIZI_COMPOSTO+".id");
				sqlQueryObjectNotExist.addWhereCondition(CostantiDB.ACCORDI_SERVIZI_COMPONENTI+".id_servizio_componente="+CostantiDB.SERVIZI+".id");
				sqlQueryObjectNotExist.setANDLogicOperator(true);

				sqlQueryObject.addWhereExistsCondition(true, sqlQueryObjectNotExist);

				queryString = sqlQueryObject.createSQLQuery();
				stmt = con.prepareStatement(queryString);
				stmt.setLong(1, idAccordoLong);
				stmt.setLong(2, idAccordoLong);
				index = 3;
				if(as.getPrivato()==null || !as.getPrivato()){
					stmt.setInt(index, 0);
					index++;
				}
				if( !isVisioneOggettiGlobale(userLogin)){
					stmt.setString(index, userLogin);
					index++;
				}
				risultato = stmt.executeQuery();
				while (risultato.next()) {
					long idServizio = risultato.getLong("idServizio");
					AccordoServizioParteSpecifica asps =  apsCore.getAccordoServizioParteSpecifica(idServizio);
					
					if(tipiServiziCompatibili.contains(asps.getTipo()) && tipiSoggettiCompatibili.contains(asps.getTipoSoggettoErogatore())){
						serviziL.add(""+idServizio);
						serviziLabelL.add(helper.getLabelIdServizio(asps));
					}
				}
				risultato.close();
				stmt.close();

				serviziList = serviziL.toArray(new String[1]);
				serviziListLabel = serviziLabelL.toArray(new String[1]);
			}
		}catch (Exception e) {
			ControlStationCore.logError(getPrefixError(nomeMetodo,  e), e);
		} finally{
			try {
				if(risultato!=null) {
					risultato.close();
				}
			}catch(Exception t) {
				// ignore
			}
			try {
				if(stmt!=null) {
					stmt.close();
				}
			}catch(Exception t) {
				// ignore
			}
			ControlStationCore.dbM.releaseConnection(con);
		}

		List<String[]> toRet = new ArrayList<>();
		toRet.add(serviziList);
		toRet.add(serviziListLabel);

		return toRet;
	}
}