DriverRegistroServiziDB_soggettiSearchDriver.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.registry.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.apache.commons.lang.StringUtils;
import org.openspcoop2.core.commons.DBUtils;
import org.openspcoop2.core.commons.Filtri;
import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.core.commons.SearchUtils;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.constants.TipoPdD;
import org.openspcoop2.core.id.IDFruizione;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.CredenzialiSoggetto;
import org.openspcoop2.core.registry.Proprieta;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.constants.CostantiRegistroServizi;
import org.openspcoop2.core.registry.constants.PddTipologia;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.utils.jdbc.JDBCUtilities;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.LikeConfig;
import org.openspcoop2.utils.sql.SQLObjectFactory;
import org.openspcoop2.utils.sql.SQLQueryObjectException;

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

	private DriverRegistroServiziDB driver = null;
	
	protected DriverRegistroServiziDB_soggettiSearchDriver(DriverRegistroServiziDB driver) {
		this.driver = driver;
	}
	
	

	protected List<String> soggettiRuoliList(long idSoggetto, ISearch ricerca) throws DriverRegistroServiziException {
		String nomeMetodo = "soggettiRuoliList";
		int idLista = Liste.SOGGETTI_RUOLI;
		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;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<String> listIdRuoli = null;
		try {

			if (!search.equals("")) {
				//query con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_RUOLI);
				sqlQueryObject.addFromTable(CostantiDB.RUOLI);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_soggetto");
				sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_ruolo");
				sqlQueryObject.addWhereLikeCondition(CostantiDB.RUOLI+".nome", search, true, true);	
				
				sqlQueryObject.setSelectDistinct(true);
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			} else {
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_RUOLI);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_soggetto");

				sqlQueryObject.setSelectDistinct(true);
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idSoggetto);

			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.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_RUOLI);
				sqlQueryObject.addFromTable(CostantiDB.RUOLI);
				sqlQueryObject.addSelectField(CostantiDB.RUOLI+".nome");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_soggetto");
				sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_ruolo");
				sqlQueryObject.addWhereLikeCondition(CostantiDB.RUOLI+".nome", search, true, true);	
				
				sqlQueryObject.setSelectDistinct(true);
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy(CostantiDB.RUOLI+".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.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_RUOLI);
				sqlQueryObject.addFromTable(CostantiDB.RUOLI);
				sqlQueryObject.addSelectField(CostantiDB.RUOLI+".nome");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_soggetto");
				sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_ruolo");
				
				sqlQueryObject.setSelectDistinct(true);
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy(CostantiDB.RUOLI+".nome");
				sqlQueryObject.setSortType(true);
				sqlQueryObject.setLimit(limit);
				sqlQueryObject.setOffset(offset);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idSoggetto);

			risultato = stmt.executeQuery();

			listIdRuoli = new ArrayList<>();
			while (risultato.next()) {

				listIdRuoli.add(risultato.getString(1));

			}

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

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

			this.driver.closeConnection(error,con);
		}
		
		return listIdRuoli;
	}
	
	protected List<Proprieta> soggettiProprietaList(long idSoggetto, ISearch ricerca) throws DriverRegistroServiziException {
		String nomeMetodo = "soggettiRuoliList";
		int idLista = Liste.SOGGETTI_PROP;
		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;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<Proprieta> lista = null;
		try {

			if (!search.equals("")) {
				//query con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_PROPS);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_PROPS+".id_soggetto");
				sqlQueryObject.addWhereLikeCondition(CostantiDB.SOGGETTI_PROPS+".nome", search, true, true);	
				
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			} else {
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_PROPS);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_PROPS+".id_soggetto");

				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idSoggetto);

			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.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_PROPS);
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_PROPS+".id");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_PROPS+".nome");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_PROPS+".valore");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_PROPS+".enc_value");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_PROPS+".id_soggetto");
				sqlQueryObject.addWhereLikeCondition(CostantiDB.SOGGETTI_PROPS+".nome", search, true, true);	
				
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy(CostantiDB.SOGGETTI_PROPS+".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.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_PROPS);
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_PROPS+".id");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_PROPS+".nome");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_PROPS+".valore");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_PROPS+".enc_value");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id=?");
				sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_PROPS+".id_soggetto");
				
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy(CostantiDB.SOGGETTI_PROPS+".nome");
				sqlQueryObject.setSortType(true);
				sqlQueryObject.setLimit(limit);
				sqlQueryObject.setOffset(offset);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idSoggetto);

			risultato = stmt.executeQuery();

			lista = new ArrayList<>();
			while (risultato.next()) {
				Proprieta proprieta = new Proprieta();
				proprieta.setId(risultato.getLong("id"));
				proprieta.setNome(risultato.getString("nome"));
				proprieta.setValore(risultato.getString("valore"));
				
				String plainValue = risultato.getString("valore");
				String encValue = risultato.getString("enc_value");
				if(encValue!=null && StringUtils.isNotEmpty(encValue)) {
					proprieta.setValore(encValue);
				}
				else {
					proprieta.setValore(plainValue);
				}
				
				lista.add(proprieta);
			}

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

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

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

	protected List<Soggetto> soggettiRegistroListByTipo(String tipoSoggetto,ISearch ricerca) throws DriverRegistroServiziException{
		return soggettiRegistroList("", tipoSoggetto, ricerca);
	}

	protected List<Soggetto> soggettiRegistroList(String superuser, ISearch ricerca) throws DriverRegistroServiziException {
		return soggettiRegistroList(superuser, null, ricerca);
	}

	private List<Soggetto> soggettiRegistroList(String superuser, String tipoSoggetto,ISearch ricerca) throws DriverRegistroServiziException {
		String nomeMetodo = "soggettiRegistroList";
		int idLista = Liste.SOGGETTI;
		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));

		String filterProtocollo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_PROTOCOLLO);
		String filterProtocolli = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_PROTOCOLLI);
		List<String> tipoSoggettiProtocollo = null;
		try {
			tipoSoggettiProtocollo = Filtri.convertToTipiSoggetti(filterProtocollo, filterProtocolli);
		}catch(Exception e) {
			throw new DriverRegistroServiziException(e.getMessage(),e);
		}
		
		String filterDominio = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_DOMINIO);
		PddTipologia pddTipologia = null;
		if(filterDominio!=null && !"".equals(filterDominio)) {
			pddTipologia = PddTipologia.toPddTipologia(filterDominio);
		}
		
		String filterSoggettoDefaultTmp = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_SOGGETTO_DEFAULT);
		boolean filterSoggettoDefault = false;
		if(filterSoggettoDefaultTmp!=null) {
			filterSoggettoDefault = "true".equalsIgnoreCase(filterSoggettoDefaultTmp.trim());
		}
		
		String filterTipoCredenziali = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_TIPO_CREDENZIALI);
		String filterCredenziale = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_CREDENZIALE);
		String filterCredenzialeIssuer = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_CREDENZIALE_ISSUER);
		if(filterCredenzialeIssuer!=null && "".equals(filterCredenzialeIssuer)) {
			filterCredenzialeIssuer = null;
		}
		if(filterCredenzialeIssuer!=null && !"ssl".equals(filterTipoCredenziali)) {
			filterCredenzialeIssuer = null;
		}
		
		String filterRuolo = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_RUOLO);
		
		boolean isFilterTipologiaErogatore = true;
		boolean isFilterTipologiaFruitore = true;
		String filterTipologia = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_TIPO_SOGGETTO);
		if(filterTipologia!=null && !"".equals(filterTipologia)) {
			if(CostantiRegistroServizi.SOGGETTO_TIPOLOGIA_EROGATORE.equals(filterTipologia)) {
				isFilterTipologiaFruitore = false;
			}
			else if(CostantiRegistroServizi.SOGGETTO_TIPOLOGIA_FRUITORE.equals(filterTipologia)) {
				isFilterTipologiaErogatore = false;
			}
		}
		
		boolean isFilterGruppoErogazione = false;
		boolean isFilterGruppoFruizione = false;
		String filterGruppo = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_GRUPPO);
		if(filterGruppo!=null && !"".equals(filterGruppo)) {
			isFilterGruppoErogazione = true;
			isFilterGruppoFruizione = true;
		}

		TipoPdD apiContesto = null;
		String filterApiContesto = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_API_CONTESTO);
		if(filterApiContesto!=null && !"".equals(filterApiContesto)) {
			apiContesto = TipoPdD.toTipoPdD(filterApiContesto);
			if(TipoPdD.APPLICATIVA.equals(apiContesto)) {
				isFilterGruppoFruizione = false;
			}
			else if(TipoPdD.DELEGATA.equals(apiContesto)) {
				isFilterGruppoErogazione = false;
			}
			else {
				apiContesto = null;
			}
		}
		
		String filterApiImplementazione = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_API_IMPLEMENTAZIONE);
		IDServizio apiImplementazioneErogazione = null;
		IDFruizione apiImplementazioneFruizione = null;
		if(filterApiImplementazione!=null && !"".equals(filterApiImplementazione)) {
			if(TipoPdD.APPLICATIVA.equals(apiContesto)) {
				try {
					apiImplementazioneErogazione = IDServizio.toIDServizio(filterApiImplementazione);
					isFilterGruppoErogazione=false; // non ha piu' senso ho selezionato una erogazione puntuale
				}catch(Exception e) {
					throw new DriverRegistroServiziException("Filtro API Implementazione '"+filterApiImplementazione+"' non valido: "+e.getMessage(),e);
				}
			}
			else if(TipoPdD.DELEGATA.equals(apiContesto)) {
				try {
					apiImplementazioneFruizione = IDFruizione.toIDFruizione(filterApiImplementazione);
					isFilterGruppoFruizione=false; // non ha piu' senso ho selezionato una fruizione puntuale
				}catch(Exception e) {
					throw new DriverRegistroServiziException("Filtro API Implementazione '"+filterApiImplementazione+"' non valido: "+e.getMessage(),e);
				}
			}
		}
		
		String filtroProprietaNome = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_PROPRIETA_NOME);
		String filtroProprietaValore = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_PROPRIETA_VALORE);
		if((filtroProprietaNome!=null && "".equals(filtroProprietaNome))) {
			filtroProprietaNome=null;
		}
		if((filtroProprietaValore!=null && "".equals(filtroProprietaValore))) {
			filtroProprietaValore=null;
		}
		boolean filtroProprieta = filtroProprietaNome!=null || filtroProprietaValore!=null;
		
		this.driver.logDebug("search : " + search);
		this.driver.logDebug("filterProtocollo : " + filterProtocollo);
		this.driver.logDebug("filterProtocolli : " + filterProtocolli);
		this.driver.logDebug("filterDominio : " + filterDominio);
		this.driver.logDebug("filterSoggettoDefault : " + filterSoggettoDefault);
		this.driver.logDebug("filterRuolo : " + filterRuolo);
		this.driver.logDebug("filterTipoCredenziali : " + filterTipoCredenziali);
		this.driver.logDebug("filterCredenziale : " + filterCredenziale);
		this.driver.logDebug("filterCredenzialeIssuer : " + filterCredenzialeIssuer);
		this.driver.logDebug("filterTipologiaSoggetto : " + filterTipologia);
		this.driver.logDebug("filterGruppo : " + filterGruppo);
		this.driver.logDebug("filterApiContesto : " + filterApiContesto);
		this.driver.logDebug("filterApiImplementazione : " + filterApiImplementazione);
		this.driver.logDebug("filtroProprietaNome : " + filtroProprietaNome);
		this.driver.logDebug("filtroProprietaValore : " + filtroProprietaValore);
		
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet risultato = null;
		ArrayList<Soggetto> lista = new ArrayList<Soggetto>();

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {

			/* === Filtro Dominio === */
			
			ISQLQueryObject sqlQueryObjectPdd = null;
			if(pddTipologia!=null && PddTipologia.ESTERNO.equals(pddTipologia)) {
				ISQLQueryObject sqlQueryObjectExistsPdd = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObjectExistsPdd.addSelectField(CostantiDB.PDD+".nome");
				sqlQueryObjectExistsPdd.addFromTable(CostantiDB.PDD);
				sqlQueryObjectExistsPdd.setANDLogicOperator(true);
				sqlQueryObjectExistsPdd.addWhereCondition(CostantiDB.PDD+".nome="+CostantiDB.SOGGETTI+".server");
				sqlQueryObjectExistsPdd.addWhereCondition(CostantiDB.PDD+".tipo=?");
				
				sqlQueryObjectPdd = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObjectPdd.setANDLogicOperator(false);
				sqlQueryObjectPdd.addWhereIsNullCondition(CostantiDB.SOGGETTI+".server");
				sqlQueryObjectPdd.addWhereExistsCondition(false, sqlQueryObjectExistsPdd);
			}	
			
			
			/* === Filtro Tipologia, Gruppo, Tipo Erogazione/Fruizione, Implementazione API === */
			
			List<String> existsConditions = new ArrayList<>();
			List<Object> existsParameters = new ArrayList<>();
			String alias_CT = "ct";
			String alias_ALLARMI = "alarm";
			String alias_PD = "pd";
			String alias_PA_SOGGETTI = "pasog";
			String alias_PA = "pa";
			String alias_PA_TRASFORMAZIONI_SOGGETTI = "patsog";
			String alias_PA_TRASFORMAZIONI = "pat";
			String alias_SERVIZI = "s";
			String alias_ACCORDI = "a";
			String alias_ACCORDI_GRUPPI = "ag";
			String alias_GRUPPI = "g";
			String alias_SOGGETTI = "sProprietario";
			
			
			// ** erogatore **
			
			if(isFilterTipologiaErogatore) {
			
				// indipedente da fruizione o erogazione
				if(apiContesto==null) {
					
					if(!isFilterTipologiaFruitore || (isFilterGruppoFruizione || isFilterGruppoErogazione) ) {
						ISQLQueryObject sqlQueryObjectErogatore = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
						sqlQueryObjectErogatore.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
						if(isFilterGruppoFruizione) {
							sqlQueryObjectErogatore.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
							sqlQueryObjectErogatore.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
							sqlQueryObjectErogatore.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
						}
						sqlQueryObjectErogatore.addSelectAliasField(alias_SERVIZI, "id", alias_SERVIZI+"id");
						sqlQueryObjectErogatore.setANDLogicOperator(true);
						sqlQueryObjectErogatore.addWhereCondition(alias_SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
						if(isFilterGruppoFruizione) {
							sqlQueryObjectErogatore.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectErogatore.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectErogatore.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
							sqlQueryObjectErogatore.addWhereCondition(alias_GRUPPI+".nome = ?");
							existsParameters.add(filterGruppo);
						}
						existsConditions.add(sqlQueryObjectErogatore.getWhereExistsCondition(false, sqlQueryObjectErogatore));
					}
					
				}
				else {
					
					// erogatore sulle porte delegate
					if(TipoPdD.DELEGATA.equals(apiContesto) || apiImplementazioneFruizione!=null) {
						ISQLQueryObject sqlQueryObjectErogatorePorteDelegate = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
						sqlQueryObjectErogatorePorteDelegate.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
						if(isFilterGruppoFruizione) {
							sqlQueryObjectErogatorePorteDelegate.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
							sqlQueryObjectErogatorePorteDelegate.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
							sqlQueryObjectErogatorePorteDelegate.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
						}
						if(TipoPdD.DELEGATA.equals(apiContesto) || apiImplementazioneFruizione!=null) {
							sqlQueryObjectErogatorePorteDelegate.addFromTable(CostantiDB.PORTE_DELEGATE,alias_PD);
							if(apiImplementazioneFruizione!=null) {
								sqlQueryObjectErogatorePorteDelegate.addFromTable(CostantiDB.SOGGETTI,alias_SOGGETTI);
							}
						}
						sqlQueryObjectErogatorePorteDelegate.addSelectAliasField(alias_SERVIZI, "id", alias_SERVIZI+"id");
						sqlQueryObjectErogatorePorteDelegate.setANDLogicOperator(true);
						sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
						if(isFilterGruppoFruizione) {
							sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
							sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_GRUPPI+".nome = ?");
							existsParameters.add(filterGruppo);
						}
						if(TipoPdD.DELEGATA.equals(apiContesto) || apiImplementazioneFruizione!=null) {
							sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_PD+".id_servizio = "+alias_SERVIZI+".id");
							if(apiImplementazioneFruizione!=null) {
								sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_PD+".id_soggetto = "+alias_SOGGETTI+".id");
								sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_SOGGETTI+".tipo_soggetto = ?");
								sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_SOGGETTI+".nome_soggetto = ?");
								sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_PD+".tipo_soggetto_erogatore = ?");
								sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_PD+".nome_soggetto_erogatore = ?");
								sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_PD+".tipo_servizio = ?");
								sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_PD+".nome_servizio = ?");
								sqlQueryObjectErogatorePorteDelegate.addWhereCondition(alias_PD+".versione_servizio = ?");
								existsParameters.add(apiImplementazioneFruizione.getIdFruitore().getTipo());
								existsParameters.add(apiImplementazioneFruizione.getIdFruitore().getNome());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getSoggettoErogatore().getTipo());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getSoggettoErogatore().getNome());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getTipo());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getNome());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getVersione());
							}
						}					
						existsConditions.add(sqlQueryObjectErogatorePorteDelegate.getWhereExistsCondition(false, sqlQueryObjectErogatorePorteDelegate));
					} 
					
					// erogatore sulle porte applicative
					
					else if(TipoPdD.APPLICATIVA.equals(apiContesto) || apiImplementazioneErogazione!=null) {
						ISQLQueryObject sqlQueryObjectErogatorePorteApplicative = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
						sqlQueryObjectErogatorePorteApplicative.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
						if(isFilterGruppoErogazione) {
							sqlQueryObjectErogatorePorteApplicative.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
							sqlQueryObjectErogatorePorteApplicative.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
							sqlQueryObjectErogatorePorteApplicative.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
						}
						if(TipoPdD.APPLICATIVA.equals(apiContesto) || apiImplementazioneErogazione!=null) {
							sqlQueryObjectErogatorePorteApplicative.addFromTable(CostantiDB.PORTE_APPLICATIVE,alias_PA);
						}
						sqlQueryObjectErogatorePorteApplicative.addSelectAliasField(alias_SERVIZI, "id", alias_SERVIZI+"id");
						sqlQueryObjectErogatorePorteApplicative.setANDLogicOperator(true);
						sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
						if(isFilterGruppoErogazione) {
							sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
							sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_GRUPPI+".nome = ?");
							existsParameters.add(filterGruppo);
						}
						if(TipoPdD.APPLICATIVA.equals(apiContesto) || apiImplementazioneErogazione!=null) {
							sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_PA+".id_servizio = "+alias_SERVIZI+".id");
							if(apiImplementazioneErogazione!=null) {
								sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_PA+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
								sqlQueryObjectErogatorePorteApplicative.addWhereCondition(CostantiDB.SOGGETTI+".tipo_soggetto = ?");
								sqlQueryObjectErogatorePorteApplicative.addWhereCondition(CostantiDB.SOGGETTI+".nome_soggetto = ?");
								sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_PA+".tipo_servizio = ?");
								sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_PA+".servizio = ?");
								sqlQueryObjectErogatorePorteApplicative.addWhereCondition(alias_PA+".versione_servizio = ?");
								existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getTipo());
								existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getNome());
								existsParameters.add(apiImplementazioneErogazione.getTipo());
								existsParameters.add(apiImplementazioneErogazione.getNome());
								existsParameters.add(apiImplementazioneErogazione.getVersione());
							}
						}					
						existsConditions.add(sqlQueryObjectErogatorePorteApplicative.getWhereExistsCondition(false, sqlQueryObjectErogatorePorteApplicative));
					} 
				}
			}
			

			
			// ** fruitore **
			
			if(isFilterTipologiaFruitore) {
				
				// porte delegate proprietario
				if( (!isFilterTipologiaErogatore && apiContesto==null) || isFilterGruppoFruizione || TipoPdD.DELEGATA.equals(apiContesto) || apiImplementazioneFruizione!=null) {
					ISQLQueryObject sqlQueryObjectProprietrioPorteDelegate = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObjectProprietrioPorteDelegate.addFromTable(CostantiDB.PORTE_DELEGATE,alias_PD);
					if(isFilterGruppoFruizione) {
						sqlQueryObjectProprietrioPorteDelegate.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
						sqlQueryObjectProprietrioPorteDelegate.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
						sqlQueryObjectProprietrioPorteDelegate.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
						sqlQueryObjectProprietrioPorteDelegate.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
					}
					if(apiImplementazioneFruizione!=null) {
						sqlQueryObjectProprietrioPorteDelegate.addFromTable(CostantiDB.SOGGETTI,alias_SOGGETTI);
					}
					sqlQueryObjectProprietrioPorteDelegate.addSelectAliasField(alias_PD, "id", alias_PD+"id");
					sqlQueryObjectProprietrioPorteDelegate.setANDLogicOperator(true);
					sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_PD+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
					if(isFilterGruppoFruizione) {
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_PD+".id_servizio = "+alias_SERVIZI+".id");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_GRUPPI+".nome = ?");
						existsParameters.add(filterGruppo);
					}
					if(apiImplementazioneFruizione!=null) {
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(CostantiDB.SOGGETTI+".tipo_soggetto = ?");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(CostantiDB.SOGGETTI+".nome_soggetto = ?");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_PD+".tipo_soggetto_erogatore = ?");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_PD+".nome_soggetto_erogatore = ?");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_PD+".tipo_servizio = ?");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_PD+".nome_servizio = ?");
						sqlQueryObjectProprietrioPorteDelegate.addWhereCondition(alias_PD+".versione_servizio = ?");
						existsParameters.add(apiImplementazioneFruizione.getIdFruitore().getTipo());
						existsParameters.add(apiImplementazioneFruizione.getIdFruitore().getNome());
						existsParameters.add(apiImplementazioneFruizione.getIdServizio().getSoggettoErogatore().getTipo());
						existsParameters.add(apiImplementazioneFruizione.getIdServizio().getSoggettoErogatore().getNome());
						existsParameters.add(apiImplementazioneFruizione.getIdServizio().getTipo());
						existsParameters.add(apiImplementazioneFruizione.getIdServizio().getNome());
						existsParameters.add(apiImplementazioneFruizione.getIdServizio().getVersione());
					}
					
					existsConditions.add(sqlQueryObjectProprietrioPorteDelegate.getWhereExistsCondition(false, sqlQueryObjectProprietrioPorteDelegate));
				} 
				
				// autorizzazioni soggetti porte applicative
				if( (!isFilterTipologiaErogatore && apiContesto==null) || isFilterGruppoErogazione || TipoPdD.APPLICATIVA.equals(apiContesto) || apiImplementazioneErogazione!=null) {
					ISQLQueryObject sqlQueryObjectAutorizzazioniPorteApplicative = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObjectAutorizzazioniPorteApplicative.addFromTable(CostantiDB.PORTE_APPLICATIVE_SOGGETTI,alias_PA_SOGGETTI);
					sqlQueryObjectAutorizzazioniPorteApplicative.addFromTable(CostantiDB.PORTE_APPLICATIVE,alias_PA);
					if(isFilterGruppoErogazione) {
						sqlQueryObjectAutorizzazioniPorteApplicative.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
						sqlQueryObjectAutorizzazioniPorteApplicative.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
						sqlQueryObjectAutorizzazioniPorteApplicative.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
						sqlQueryObjectAutorizzazioniPorteApplicative.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
					}
					if(apiImplementazioneErogazione!=null) {
						sqlQueryObjectAutorizzazioniPorteApplicative.addFromTable(CostantiDB.SOGGETTI,alias_SOGGETTI);
					}
					sqlQueryObjectAutorizzazioniPorteApplicative.addSelectAliasField(alias_PA_SOGGETTI, "id", alias_PA_SOGGETTI+"id");
					sqlQueryObjectAutorizzazioniPorteApplicative.setANDLogicOperator(true);
					sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_PA_SOGGETTI+".tipo_soggetto = "+CostantiDB.SOGGETTI+".tipo_soggetto");
					sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_PA_SOGGETTI+".nome_soggetto = "+CostantiDB.SOGGETTI+".nome_soggetto");
					sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_PA_SOGGETTI+".id_porta = "+alias_PA+".id");
					if(isFilterGruppoErogazione) {
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_PA+".id_servizio = "+alias_SERVIZI+".id");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_GRUPPI+".nome = ?");
						existsParameters.add(filterGruppo);
					}
					if(apiImplementazioneErogazione!=null) {
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_PA+".id_soggetto = "+alias_SOGGETTI+".id");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_SOGGETTI+".tipo_soggetto = ?");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_SOGGETTI+".nome_soggetto = ?");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_PA+".tipo_servizio = ?");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_PA+".servizio = ?");
						sqlQueryObjectAutorizzazioniPorteApplicative.addWhereCondition(alias_PA+".versione_servizio = ?");
						existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getTipo());
						existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getNome());
						existsParameters.add(apiImplementazioneErogazione.getTipo());
						existsParameters.add(apiImplementazioneErogazione.getNome());
						existsParameters.add(apiImplementazioneErogazione.getVersione());
					}
					
					existsConditions.add(sqlQueryObjectAutorizzazioniPorteApplicative.getWhereExistsCondition(false, sqlQueryObjectAutorizzazioniPorteApplicative));
				} 
				
				// controllo del traffico (fruitore)
				
				// Controllo del traffico sulle porte delegate
				// e' cablato il soggetto fruitore e il proprietrio della porta delegata
				/*
				if( (!isFilterTipologiaErogatore && apiContesto==null) || isFilterGruppoFruizione  || TipoPdD.DELEGATA.equals(apiContesto) || apiImplementazioneFruizione!=null) {
					ISQLQueryObject sqlQueryObjectControlloTrafficoPorteDelegate = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObjectControlloTrafficoPorteDelegate.addFromTable(CostantiDB.CONTROLLO_TRAFFICO_ACTIVE_POLICY,alias_CT);
					if(isFilterGruppoFruizione || apiImplementazioneFruizione!=null) {
						sqlQueryObjectControlloTrafficoPorteDelegate.addFromTable(CostantiDB.PORTE_DELEGATE,alias_PD);
						if(isFilterGruppoFruizione) {
							sqlQueryObjectControlloTrafficoPorteDelegate.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
							sqlQueryObjectControlloTrafficoPorteDelegate.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
							sqlQueryObjectControlloTrafficoPorteDelegate.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
							sqlQueryObjectControlloTrafficoPorteDelegate.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
						}
						if(apiImplementazioneFruizione!=null) {
							sqlQueryObjectControlloTrafficoPorteDelegate.addFromTable(CostantiDB.SOGGETTI,alias_SOGGETTI);
						}
					}
					sqlQueryObjectControlloTrafficoPorteDelegate.addSelectAliasField(alias_CT, "id", alias_CT+"id");
					sqlQueryObjectControlloTrafficoPorteDelegate.setANDLogicOperator(true);
					sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_CT+".filtro_tipo_fruitore = "+CostantiDB.SOGGETTI+".tipo_soggetto");
					sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_CT+".filtro_nome_fruitore = "+CostantiDB.SOGGETTI+".nome_soggetto");
					sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_CT+".filtro_ruolo = 'delegata'");
					if(isFilterGruppoFruizione || apiImplementazioneFruizione!=null) {
						sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_CT+".filtro_porta = "+alias_PD+".nome_porta");
						if(isFilterGruppoFruizione) {
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_PD+".id_servizio = "+alias_SERVIZI+".id");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_GRUPPI+".nome = ?");
							existsParameters.add(filterGruppo);
						}
						if(apiImplementazioneFruizione!=null) {
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_PD+".id_soggetto = "+alias_SOGGETTI+".id");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_SOGGETTI+".tipo_soggetto = ?");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_SOGGETTI+".nome_soggetto = ?");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_PD+".tipo_soggetto_erogatore = ?");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_PD+".nome_soggetto_erogatore = ?");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_PD+".tipo_servizio = ?");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_PD+".nome_servizio = ?");
							sqlQueryObjectControlloTrafficoPorteDelegate.addWhereCondition(alias_PD+".versione_servizio = ?");
							existsParameters.add(apiImplementazioneFruizione.getIdFruitore().getTipo());
							existsParameters.add(apiImplementazioneFruizione.getIdFruitore().getNome());
							existsParameters.add(apiImplementazioneFruizione.getIdServizio().getSoggettoErogatore().getTipo());
							existsParameters.add(apiImplementazioneFruizione.getIdServizio().getSoggettoErogatore().getNome());
							existsParameters.add(apiImplementazioneFruizione.getIdServizio().getTipo());
							existsParameters.add(apiImplementazioneFruizione.getIdServizio().getNome());
							existsParameters.add(apiImplementazioneFruizione.getIdServizio().getVersione());
						}
					}
					
					existsConditions.add(sqlQueryObjectControlloTrafficoPorteDelegate.getWhereExistsCondition(false, sqlQueryObjectControlloTrafficoPorteDelegate));
				} 
				*/
				
				// Controllo del traffico sulle porte applicative
				if( (!isFilterTipologiaErogatore && apiContesto==null) || isFilterGruppoErogazione  || TipoPdD.APPLICATIVA.equals(apiContesto) || apiImplementazioneErogazione!=null) {
					ISQLQueryObject sqlQueryObjectControlloTrafficoPorteApplicative = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObjectControlloTrafficoPorteApplicative.addFromTable(CostantiDB.CONTROLLO_TRAFFICO_ACTIVE_POLICY,alias_CT);
					if(isFilterGruppoErogazione || apiImplementazioneErogazione!=null) {
						sqlQueryObjectControlloTrafficoPorteApplicative.addFromTable(CostantiDB.PORTE_APPLICATIVE,alias_PA);
						if(isFilterGruppoErogazione) {
							sqlQueryObjectControlloTrafficoPorteApplicative.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
							sqlQueryObjectControlloTrafficoPorteApplicative.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
							sqlQueryObjectControlloTrafficoPorteApplicative.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
							sqlQueryObjectControlloTrafficoPorteApplicative.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
						}
						if(apiImplementazioneErogazione!=null) {
							sqlQueryObjectControlloTrafficoPorteApplicative.addFromTable(CostantiDB.SOGGETTI,alias_SOGGETTI);
						}
					}
					sqlQueryObjectControlloTrafficoPorteApplicative.addSelectAliasField(alias_CT, "id", alias_CT+"id");
					sqlQueryObjectControlloTrafficoPorteApplicative.setANDLogicOperator(true);
					sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_CT+".filtro_tipo_fruitore = "+CostantiDB.SOGGETTI+".tipo_soggetto");
					sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_CT+".filtro_nome_fruitore = "+CostantiDB.SOGGETTI+".nome_soggetto");
					sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_CT+".filtro_ruolo = 'applicativa'");
					if(isFilterGruppoErogazione || apiImplementazioneErogazione!=null) {
						sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_CT+".filtro_porta = "+alias_PA+".nome_porta");
						if(isFilterGruppoErogazione) {
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_PA+".id_servizio = "+alias_SERVIZI+".id");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_GRUPPI+".nome = ?");
							existsParameters.add(filterGruppo);
						}
						if(apiImplementazioneErogazione!=null) {
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_PA+".id_soggetto = "+alias_SOGGETTI+".id");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_SOGGETTI+".tipo_soggetto = ?");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_SOGGETTI+".nome_soggetto = ?");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_PA+".tipo_servizio = ?");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_PA+".servizio = ?");
							sqlQueryObjectControlloTrafficoPorteApplicative.addWhereCondition(alias_PA+".versione_servizio = ?");
							existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getTipo());
							existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getNome());
							existsParameters.add(apiImplementazioneErogazione.getTipo());
							existsParameters.add(apiImplementazioneErogazione.getNome());
							existsParameters.add(apiImplementazioneErogazione.getVersione());
						}
					}
					
					existsConditions.add(sqlQueryObjectControlloTrafficoPorteApplicative.getWhereExistsCondition(false, sqlQueryObjectControlloTrafficoPorteApplicative));
				} 
				
				if(CostantiDB.isAllarmiEnabled()) {
					
					// allarmi (fruitore)
					
					// Allarmi sulle porte delegate
					// e' cablato il soggetto fruitore e il proprietrio della porta delegata
					/*
					if( (!isFilterTipologiaErogatore && apiContesto==null) || isFilterGruppoFruizione  || TipoPdD.DELEGATA.equals(apiContesto) || apiImplementazioneFruizione!=null) {
						ISQLQueryObject sqlQueryObjectPorteDelegate = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
						sqlQueryObjectPorteDelegate.addFromTable(CostantiDB.ALLARMI,alias_ALLARMI);
						if(isFilterGruppoFruizione || apiImplementazioneFruizione!=null) {
							sqlQueryObjectPorteDelegate.addFromTable(CostantiDB.PORTE_DELEGATE,alias_PD);
							if(isFilterGruppoFruizione) {
								sqlQueryObjectPorteDelegate.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
								sqlQueryObjectPorteDelegate.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
								sqlQueryObjectPorteDelegate.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
								sqlQueryObjectPorteDelegate.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
							}
							if(apiImplementazioneFruizione!=null) {
								sqlQueryObjectPorteDelegate.addFromTable(CostantiDB.SOGGETTI,alias_SOGGETTI);
							}
						}
						sqlQueryObjectPorteDelegate.addSelectAliasField(alias_ALLARMI, "id", alias_ALLARMI+"id");
						sqlQueryObjectPorteDelegate.setANDLogicOperator(true);
						sqlQueryObjectPorteDelegate.addWhereCondition(alias_ALLARMI+".filtro_tipo_fruitore = "+CostantiDB.SOGGETTI+".tipo_soggetto");
						sqlQueryObjectPorteDelegate.addWhereCondition(alias_ALLARMI+".filtro_nome_fruitore = "+CostantiDB.SOGGETTI+".nome_soggetto");
						sqlQueryObjectPorteDelegate.addWhereCondition(alias_ALLARMI+".filtro_ruolo = 'delegata'");
						if(isFilterGruppoFruizione || apiImplementazioneFruizione!=null) {
							sqlQueryObjectPorteDelegate.addWhereCondition(alias_ALLARMI+".filtro_porta = "+alias_PD+".nome_porta");
							if(isFilterGruppoFruizione) {
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_PD+".id_servizio = "+alias_SERVIZI+".id");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_GRUPPI+".nome = ?");
								existsParameters.add(filterGruppo);
							}
							if(apiImplementazioneFruizione!=null) {
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_PD+".id_soggetto = "+alias_SOGGETTI+".id");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_SOGGETTI+".tipo_soggetto = ?");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_SOGGETTI+".nome_soggetto = ?");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_PD+".tipo_soggetto_erogatore = ?");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_PD+".nome_soggetto_erogatore = ?");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_PD+".tipo_servizio = ?");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_PD+".nome_servizio = ?");
								sqlQueryObjectPorteDelegate.addWhereCondition(alias_PD+".versione_servizio = ?");
								existsParameters.add(apiImplementazioneFruizione.getIdFruitore().getTipo());
								existsParameters.add(apiImplementazioneFruizione.getIdFruitore().getNome());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getSoggettoErogatore().getTipo());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getSoggettoErogatore().getNome());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getTipo());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getNome());
								existsParameters.add(apiImplementazioneFruizione.getIdServizio().getVersione());
							}
						}
						
						existsConditions.add(sqlQueryObjectPorteDelegate.getWhereExistsCondition(false, sqlQueryObjectPorteDelegate));
					} 
					*/
					
					// Allarmi sulle porte applicative
					if( (!isFilterTipologiaErogatore && apiContesto==null) || isFilterGruppoErogazione  || TipoPdD.APPLICATIVA.equals(apiContesto) || apiImplementazioneErogazione!=null) {
						ISQLQueryObject sqlQueryObjectPorteApplicative = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
						sqlQueryObjectPorteApplicative.addFromTable(CostantiDB.ALLARMI,alias_ALLARMI);
						if(isFilterGruppoErogazione || apiImplementazioneErogazione!=null) {
							sqlQueryObjectPorteApplicative.addFromTable(CostantiDB.PORTE_APPLICATIVE,alias_PA);
							if(isFilterGruppoErogazione) {
								sqlQueryObjectPorteApplicative.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
								sqlQueryObjectPorteApplicative.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
								sqlQueryObjectPorteApplicative.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
								sqlQueryObjectPorteApplicative.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
							}
							if(apiImplementazioneErogazione!=null) {
								sqlQueryObjectPorteApplicative.addFromTable(CostantiDB.SOGGETTI,alias_SOGGETTI);
							}
						}
						sqlQueryObjectPorteApplicative.addSelectAliasField(alias_ALLARMI, "id", alias_ALLARMI+"id");
						sqlQueryObjectPorteApplicative.setANDLogicOperator(true);
						sqlQueryObjectPorteApplicative.addWhereCondition(alias_ALLARMI+".filtro_tipo_fruitore = "+CostantiDB.SOGGETTI+".tipo_soggetto");
						sqlQueryObjectPorteApplicative.addWhereCondition(alias_ALLARMI+".filtro_nome_fruitore = "+CostantiDB.SOGGETTI+".nome_soggetto");
						sqlQueryObjectPorteApplicative.addWhereCondition(alias_ALLARMI+".filtro_ruolo = 'applicativa'");
						if(isFilterGruppoErogazione || apiImplementazioneErogazione!=null) {
							sqlQueryObjectPorteApplicative.addWhereCondition(alias_ALLARMI+".filtro_porta = "+alias_PA+".nome_porta");
							if(isFilterGruppoErogazione) {
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_PA+".id_servizio = "+alias_SERVIZI+".id");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_GRUPPI+".nome = ?");
								existsParameters.add(filterGruppo);
							}
							if(apiImplementazioneErogazione!=null) {
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_PA+".id_soggetto = "+alias_SOGGETTI+".id");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_SOGGETTI+".tipo_soggetto = ?");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_SOGGETTI+".nome_soggetto = ?");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_PA+".tipo_servizio = ?");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_PA+".servizio = ?");
								sqlQueryObjectPorteApplicative.addWhereCondition(alias_PA+".versione_servizio = ?");
								existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getTipo());
								existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getNome());
								existsParameters.add(apiImplementazioneErogazione.getTipo());
								existsParameters.add(apiImplementazioneErogazione.getNome());
								existsParameters.add(apiImplementazioneErogazione.getVersione());
							}
						}
						
						existsConditions.add(sqlQueryObjectPorteApplicative.getWhereExistsCondition(false, sqlQueryObjectPorteApplicative));
					} 
				}
				
				// porte_applicative trasformazioni
				
				if((!isFilterTipologiaErogatore && apiContesto==null) ||  isFilterGruppoErogazione  || TipoPdD.APPLICATIVA.equals(apiContesto) || apiImplementazioneErogazione!=null) {
					ISQLQueryObject sqlQueryObjectTrasformazioniPorteApplicative = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObjectTrasformazioniPorteApplicative.addFromTable(CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTI,alias_PA_TRASFORMAZIONI_SOGGETTI);
					sqlQueryObjectTrasformazioniPorteApplicative.addFromTable(CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI,alias_PA_TRASFORMAZIONI);
					sqlQueryObjectTrasformazioniPorteApplicative.addFromTable(CostantiDB.PORTE_APPLICATIVE,alias_PA);
					if(isFilterGruppoErogazione) {
						sqlQueryObjectTrasformazioniPorteApplicative.addFromTable(CostantiDB.SERVIZI,alias_SERVIZI);
						sqlQueryObjectTrasformazioniPorteApplicative.addFromTable(CostantiDB.ACCORDI,alias_ACCORDI);
						sqlQueryObjectTrasformazioniPorteApplicative.addFromTable(CostantiDB.ACCORDI_GRUPPI,alias_ACCORDI_GRUPPI);
						sqlQueryObjectTrasformazioniPorteApplicative.addFromTable(CostantiDB.GRUPPI,alias_GRUPPI);
					}
					if(apiImplementazioneErogazione!=null) {
						sqlQueryObjectTrasformazioniPorteApplicative.addFromTable(CostantiDB.SOGGETTI,alias_SOGGETTI);
					}
					sqlQueryObjectTrasformazioniPorteApplicative.addSelectAliasField(alias_PA_TRASFORMAZIONI_SOGGETTI, "id", alias_PA_TRASFORMAZIONI_SOGGETTI+"id");
					sqlQueryObjectTrasformazioniPorteApplicative.setANDLogicOperator(true);
					sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA_TRASFORMAZIONI_SOGGETTI+".tipo_soggetto = "+CostantiDB.SOGGETTI+".tipo_soggetto");
					sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA_TRASFORMAZIONI_SOGGETTI+".nome_soggetto = "+CostantiDB.SOGGETTI+".nome_soggetto");
					sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA_TRASFORMAZIONI_SOGGETTI+".id_trasformazione = "+alias_PA_TRASFORMAZIONI+".id");
					sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA_TRASFORMAZIONI+".id_porta = "+alias_PA+".id");
					if(isFilterGruppoErogazione) {
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA+".id_servizio = "+alias_SERVIZI+".id");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_SERVIZI+".id_accordo = "+alias_ACCORDI+".id");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_accordo = "+alias_ACCORDI+".id");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_ACCORDI_GRUPPI+".id_gruppo = "+alias_GRUPPI+".id");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_GRUPPI+".nome = ?");
						existsParameters.add(filterGruppo);
					}
					if(apiImplementazioneErogazione!=null) {
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA+".id_soggetto = "+alias_SOGGETTI+".id");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_SOGGETTI+".tipo_soggetto = ?");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_SOGGETTI+".nome_soggetto = ?");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA+".tipo_servizio = ?");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA+".servizio = ?");
						sqlQueryObjectTrasformazioniPorteApplicative.addWhereCondition(alias_PA+".versione_servizio = ?");
						existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getTipo());
						existsParameters.add(apiImplementazioneErogazione.getSoggettoErogatore().getNome());
						existsParameters.add(apiImplementazioneErogazione.getTipo());
						existsParameters.add(apiImplementazioneErogazione.getNome());
						existsParameters.add(apiImplementazioneErogazione.getVersione());
					}
					
					existsConditions.add(sqlQueryObjectTrasformazioniPorteApplicative.getWhereExistsCondition(false, sqlQueryObjectTrasformazioniPorteApplicative));
				} 
			}
			

	
			
			
			
			
			
			if (!search.equals("")) {
				//query con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addSelectCountField("*", "cont");
				if(filterSoggettoDefault) {
					sqlQueryObject.addWhereCondition("is_default = ?");
				}
				if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
					sqlQueryObject.addWhereCondition("superuser = ?");
				if(tipoSoggetto!=null){
					sqlQueryObject.addWhereCondition("tipo_soggetto=?");
					sqlQueryObject.addWhereLikeCondition("nome_soggetto", search, true, true);	
				}
				else{
					sqlQueryObject.addWhereCondition(false, 
							sqlQueryObject.getWhereLikeCondition("tipo_soggetto", search, true, true),
							sqlQueryObject.getWhereLikeCondition("nome_soggetto", search, true, true));
				}
				if(tipoSoggetto==null && tipoSoggettiProtocollo!=null && tipoSoggettiProtocollo.size()>0) {
					sqlQueryObject.addWhereINCondition("tipo_soggetto", true, tipoSoggettiProtocollo.toArray(new String[1]));
				}
				if(pddTipologia!=null) {
					if(PddTipologia.ESTERNO.equals(pddTipologia)) {						
						sqlQueryObject.addWhereCondition(sqlQueryObjectPdd.createSQLConditions());							
					}
					else {
						sqlQueryObject.addFromTable(CostantiDB.PDD);
						sqlQueryObject.addWhereCondition(true,CostantiDB.PDD+".nome="+CostantiDB.SOGGETTI+".server",CostantiDB.PDD+".tipo=?");
					}
				}
				if(filterRuolo!=null && !"".equals(filterRuolo)) {
					sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_RUOLI);
					sqlQueryObject.addFromTable(CostantiDB.RUOLI);
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_soggetto");
					sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_ruolo");
					sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".nome=?");
				}
				if(filterTipoCredenziali!=null && !"".equals(filterTipoCredenziali)) {
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".tipoauth = ?");
					if(filterCredenziale!=null && !"".equals(filterCredenziale)) {
						if(CostantiConfigurazione.CREDENZIALE_SSL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereCondition(false, 
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".cn_subject", filterCredenziale, 
											LikeConfig.contains(true,true)),
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".subject", filterCredenziale, 
											LikeConfig.contains(true,true)));
						}
						else if(CostantiConfigurazione.CREDENZIALE_BASIC.toString().equals(filterTipoCredenziali) || 
								CostantiConfigurazione.CREDENZIALE_PRINCIPAL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereLikeCondition(CostantiDB.SOGGETTI+".utente", 
									filterCredenziale, LikeConfig.contains(true,true));
						}
					}
					if(filterCredenzialeIssuer!=null && !"".equals(filterCredenzialeIssuer)) {
						if(CostantiConfigurazione.CREDENZIALE_SSL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereCondition(false, 
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".cn_issuer", filterCredenzialeIssuer, 
											LikeConfig.contains(true,true)),
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".issuer", filterCredenzialeIssuer, 
											LikeConfig.contains(true,true)));
						}
					}
				}
				if(!existsConditions.isEmpty()) {
					sqlQueryObject.addWhereCondition(false, existsConditions.toArray(new String[1]));
				}
				if(filtroProprieta) {
					DBUtils.setFiltriProprietaSoggetto(sqlQueryObject, this.driver.tipoDB, 
							filtroProprietaNome, filtroProprietaValore);
				}
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			} else {
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addSelectCountField("*", "cont");
				if(filterSoggettoDefault) {
					sqlQueryObject.addWhereCondition("is_default = ?");
				}
				if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
					sqlQueryObject.addWhereCondition("superuser = ?");
				if(tipoSoggetto!=null)
					sqlQueryObject.addWhereCondition("tipo_soggetto=?");
				if(tipoSoggetto==null && tipoSoggettiProtocollo!=null && tipoSoggettiProtocollo.size()>0) {
					sqlQueryObject.addWhereINCondition("tipo_soggetto", true, tipoSoggettiProtocollo.toArray(new String[1]));
				}
				if(pddTipologia!=null) {
					if(PddTipologia.ESTERNO.equals(pddTipologia)) {
						sqlQueryObject.addWhereCondition(sqlQueryObjectPdd.createSQLConditions());							
					}
					else {
						sqlQueryObject.addFromTable(CostantiDB.PDD);
						sqlQueryObject.addWhereCondition(true,CostantiDB.PDD+".nome="+CostantiDB.SOGGETTI+".server",CostantiDB.PDD+".tipo=?");
					}
				}
				if(filterRuolo!=null && !"".equals(filterRuolo)) {
					sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_RUOLI);
					sqlQueryObject.addFromTable(CostantiDB.RUOLI);
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_soggetto");
					sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_ruolo");
					sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".nome=?");
				}
				if(filterTipoCredenziali!=null && !"".equals(filterTipoCredenziali)) {
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".tipoauth = ?");
					if(filterCredenziale!=null && !"".equals(filterCredenziale)) {
						if(CostantiConfigurazione.CREDENZIALE_SSL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereCondition(false, 
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".cn_subject", filterCredenziale, 
											LikeConfig.contains(true,true)),
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".subject", filterCredenziale, 
											LikeConfig.contains(true,true)));
						}
						else if(CostantiConfigurazione.CREDENZIALE_BASIC.toString().equals(filterTipoCredenziali) || 
								CostantiConfigurazione.CREDENZIALE_PRINCIPAL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereLikeCondition(CostantiDB.SOGGETTI+".utente", 
									filterCredenziale, LikeConfig.contains(true,true));
						}
					}
					if(filterCredenzialeIssuer!=null && !"".equals(filterCredenzialeIssuer)) {
						if(CostantiConfigurazione.CREDENZIALE_SSL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereCondition(false, 
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".cn_issuer", filterCredenzialeIssuer, 
											LikeConfig.contains(true,true)),
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".issuer", filterCredenzialeIssuer, 
											LikeConfig.contains(true,true)));
						}
					}
				}
				if(!existsConditions.isEmpty()) {
					sqlQueryObject.addWhereCondition(false, existsConditions.toArray(new String[1]));
				}
				if(filtroProprieta) {
					DBUtils.setFiltriProprietaSoggetto(sqlQueryObject, this.driver.tipoDB, 
							filtroProprietaNome, filtroProprietaValore);
				}
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			int index = 1;
			if(filterSoggettoDefault) {
				stmt.setInt(index++, 1);
			}
			if(this.driver.useSuperUser && superuser!=null && (!superuser.equals(""))){
				stmt.setString(index++, superuser);
			}
			if (!search.equals("")) {
				if(tipoSoggetto!=null){
					stmt.setString(index++, tipoSoggetto);
				}
			}else{
				if(tipoSoggetto!=null) 
					stmt.setString(index++, tipoSoggetto);
			}
			if(pddTipologia!=null) {
				stmt.setString(index++, pddTipologia.toString());
			}
			if(filterRuolo!=null && !"".equals(filterRuolo)) {
				stmt.setString(index++, filterRuolo);
			}
			if(filterTipoCredenziali!=null && !"".equals(filterTipoCredenziali)) {
				stmt.setString(index++, filterTipoCredenziali);
//				if(filterCredenziale!=null && !"".equals(filterCredenziale)) {
//					// like
//				}
			}
			if(existsParameters!=null && !existsParameters.isEmpty()) {
				for (Object object : existsParameters) {
					if(object instanceof String) {
						stmt.setString(index++, (String) object);
					}
					else {
						stmt.setInt(index++, (Integer) object);
					}
				}
			}
			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.SOGGETTI);
				sqlQueryObject.addSelectAliasField(CostantiDB.SOGGETTI,"id","identificativoSoggetto");
				sqlQueryObject.addSelectField("nome_soggetto");
				sqlQueryObject.addSelectField("tipo_soggetto");
				sqlQueryObject.addSelectAliasField(CostantiDB.SOGGETTI,"descrizione","descrizioneSoggetto");
				sqlQueryObject.addSelectField("identificativo_porta");
				sqlQueryObject.addSelectField("server");
				sqlQueryObject.addSelectField("id_connettore");
				sqlQueryObject.addSelectField("codice_ipa");
				sqlQueryObject.addSelectField("tipoauth");
				
				if(filterSoggettoDefault) {
					sqlQueryObject.addWhereCondition("is_default = ?");
				}
				if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
					sqlQueryObject.addWhereCondition("superuser = ?");
				if(tipoSoggetto!=null){
					sqlQueryObject.addWhereCondition("tipo_soggetto=?");
					sqlQueryObject.addWhereLikeCondition("nome_soggetto", search, true, true);	
				}
				else{
					sqlQueryObject.addWhereCondition(false, 
							sqlQueryObject.getWhereLikeCondition("tipo_soggetto", search, true, true),
							sqlQueryObject.getWhereLikeCondition("nome_soggetto", search, true, true));
				}
				if(tipoSoggetto==null && tipoSoggettiProtocollo!=null && tipoSoggettiProtocollo.size()>0) {
					sqlQueryObject.addWhereINCondition("tipo_soggetto", true, tipoSoggettiProtocollo.toArray(new String[1]));
				}
				if(pddTipologia!=null) {
					if(PddTipologia.ESTERNO.equals(pddTipologia)) {
						sqlQueryObject.addWhereCondition(sqlQueryObjectPdd.createSQLConditions());									
					}
					else {
						sqlQueryObject.addFromTable(CostantiDB.PDD);
						sqlQueryObject.addWhereCondition(true,CostantiDB.PDD+".nome="+CostantiDB.SOGGETTI+".server",CostantiDB.PDD+".tipo=?");
					}
				}
				if(filterRuolo!=null && !"".equals(filterRuolo)) {
					sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_RUOLI);
					sqlQueryObject.addFromTable(CostantiDB.RUOLI);
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_soggetto");
					sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_ruolo");
					sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".nome=?");
				}
				if(filterTipoCredenziali!=null && !"".equals(filterTipoCredenziali)) {
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".tipoauth = ?");
					if(filterCredenziale!=null && !"".equals(filterCredenziale)) {
						if(CostantiConfigurazione.CREDENZIALE_SSL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereCondition(false, 
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".cn_subject", filterCredenziale, 
											LikeConfig.contains(true,true)),
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".subject", filterCredenziale, 
											LikeConfig.contains(true,true)));
						}
						else if(CostantiConfigurazione.CREDENZIALE_BASIC.toString().equals(filterTipoCredenziali) || 
								CostantiConfigurazione.CREDENZIALE_PRINCIPAL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereLikeCondition(CostantiDB.SOGGETTI+".utente", 
									filterCredenziale, LikeConfig.contains(true,true));
						}
					}
					if(filterCredenzialeIssuer!=null && !"".equals(filterCredenzialeIssuer)) {
						if(CostantiConfigurazione.CREDENZIALE_SSL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereCondition(false, 
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".cn_issuer", filterCredenzialeIssuer, 
											LikeConfig.contains(true,true)),
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".issuer", filterCredenzialeIssuer, 
											LikeConfig.contains(true,true)));
						}
					}
				}
				if(!existsConditions.isEmpty()) {
					sqlQueryObject.addWhereCondition(false, existsConditions.toArray(new String[1]));
				}
				if(filtroProprieta) {
					DBUtils.setFiltriProprietaSoggetto(sqlQueryObject, this.driver.tipoDB, 
							filtroProprietaNome, filtroProprietaValore);
				}
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy("nome_soggetto");
				sqlQueryObject.addOrderBy("tipo_soggetto");
				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.SOGGETTI);
				sqlQueryObject.addSelectAliasField(CostantiDB.SOGGETTI,"id","identificativoSoggetto");
				sqlQueryObject.addSelectField("nome_soggetto");
				sqlQueryObject.addSelectField("tipo_soggetto");
				sqlQueryObject.addSelectAliasField(CostantiDB.SOGGETTI,"descrizione","descrizioneSoggetto");
				sqlQueryObject.addSelectField("identificativo_porta");
				sqlQueryObject.addSelectField("server");
				sqlQueryObject.addSelectField("id_connettore");
				sqlQueryObject.addSelectField("codice_ipa");
				sqlQueryObject.addSelectField("tipoauth");
				
				if(filterSoggettoDefault) {
					sqlQueryObject.addWhereCondition("is_default = ?");
				}
				if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
					sqlQueryObject.addWhereCondition("superuser = ?");
				if(tipoSoggetto!=null)
					sqlQueryObject.addWhereCondition("tipo_soggetto=?");
				if(tipoSoggetto==null && tipoSoggettiProtocollo!=null && tipoSoggettiProtocollo.size()>0) {
					sqlQueryObject.addWhereINCondition("tipo_soggetto", true, tipoSoggettiProtocollo.toArray(new String[1]));
				}
				if(pddTipologia!=null) {
					if(PddTipologia.ESTERNO.equals(pddTipologia)) {
						sqlQueryObject.addWhereCondition(sqlQueryObjectPdd.createSQLConditions());									
					}
					else {
						sqlQueryObject.addFromTable(CostantiDB.PDD);
						sqlQueryObject.addWhereCondition(true,CostantiDB.PDD+".nome="+CostantiDB.SOGGETTI+".server",CostantiDB.PDD+".tipo=?");
					}
				}
				if(filterRuolo!=null && !"".equals(filterRuolo)) {
					sqlQueryObject.addFromTable(CostantiDB.SOGGETTI_RUOLI);
					sqlQueryObject.addFromTable(CostantiDB.RUOLI);
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_soggetto");
					sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".id="+CostantiDB.SOGGETTI_RUOLI+".id_ruolo");
					sqlQueryObject.addWhereCondition(CostantiDB.RUOLI+".nome=?");
				}
				if(filterTipoCredenziali!=null && !"".equals(filterTipoCredenziali)) {
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".tipoauth = ?");
					if(filterCredenziale!=null && !"".equals(filterCredenziale)) {
						if(CostantiConfigurazione.CREDENZIALE_SSL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereCondition(false, 
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".cn_subject", filterCredenziale, 
											LikeConfig.contains(true,true)),
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".subject", filterCredenziale, 
											LikeConfig.contains(true,true)));
						}
						else if(CostantiConfigurazione.CREDENZIALE_BASIC.toString().equals(filterTipoCredenziali) || 
								CostantiConfigurazione.CREDENZIALE_PRINCIPAL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereLikeCondition(CostantiDB.SOGGETTI+".utente", 
									filterCredenziale, LikeConfig.contains(true,true));
						}
					}
					if(filterCredenzialeIssuer!=null && !"".equals(filterCredenzialeIssuer)) {
						if(CostantiConfigurazione.CREDENZIALE_SSL.toString().equals(filterTipoCredenziali)) {
							sqlQueryObject.addWhereCondition(false, 
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".cn_issuer", filterCredenzialeIssuer, 
											LikeConfig.contains(true,true)),
									sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI+".issuer", filterCredenzialeIssuer, 
											LikeConfig.contains(true,true)));
						}
					}
				}
				if(!existsConditions.isEmpty()) {
					sqlQueryObject.addWhereCondition(false, existsConditions.toArray(new String[1]));
				}
				if(filtroProprieta) {
					DBUtils.setFiltriProprietaSoggetto(sqlQueryObject, this.driver.tipoDB, 
							filtroProprietaNome, filtroProprietaValore);
				}
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy("nome_soggetto");
				sqlQueryObject.addOrderBy("tipo_soggetto");
				sqlQueryObject.setSortType(true);
				sqlQueryObject.setLimit(limit);
				sqlQueryObject.setOffset(offset);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			index = 1;
			if(filterSoggettoDefault) {
				stmt.setInt(index++, 1);
			}
			if(this.driver.useSuperUser && superuser!=null && (!superuser.equals(""))){
				stmt.setString(index++, superuser);
			}
			if (!search.equals("")) {
				if(tipoSoggetto!=null){
					stmt.setString(index++, tipoSoggetto);
				}
			}else{
				if(tipoSoggetto!=null) 
					stmt.setString(index++, tipoSoggetto);
			}
			if(pddTipologia!=null) {
				stmt.setString(index++, pddTipologia.toString());
			}
			if(filterRuolo!=null && !"".equals(filterRuolo)) {
				stmt.setString(index++, filterRuolo);
			}
			if(filterTipoCredenziali!=null && !"".equals(filterTipoCredenziali)) {
				stmt.setString(index++, filterTipoCredenziali);
//				if(filterCredenziale!=null && !"".equals(filterCredenziale)) {
//					// like
//				}
			}
			if(existsParameters!=null && !existsParameters.isEmpty()) {
				for (Object object : existsParameters) {
					if(object instanceof String) {
						stmt.setString(index++, (String) object);
					}
					else {
						stmt.setInt(index++, (Integer) object);
					}
				}
			}
			risultato = stmt.executeQuery();

			Soggetto sog;
			while (risultato.next()) {

				sog = new Soggetto();
				sog.setId(risultato.getLong("identificativoSoggetto"));
				sog.setNome(risultato.getString("nome_soggetto"));
				sog.setTipo(risultato.getString("tipo_soggetto"));
				sog.setDescrizione(risultato.getString("descrizioneSoggetto"));
				sog.setIdentificativoPorta(risultato.getString("identificativo_porta"));
				sog.setPortaDominio(risultato.getString("server"));
				sog.setCodiceIpa(risultato.getString("codice_ipa"));

				long idConnettore = risultato.getLong("id_connettore");
				sog.setConnettore(this.driver.getConnettore(idConnettore, con));

				String tipoAuth = risultato.getString("tipoauth");
				if(tipoAuth != null && !tipoAuth.equals("")){
					CredenzialiSoggetto credenziali = new CredenzialiSoggetto();
					credenziali.setTipo(DriverRegistroServiziDB_LIB.getEnumCredenzialeTipo(tipoAuth));
					sog.addCredenziali( credenziali );
				}
				
				lista.add(sog);

			}

			return lista;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected List<IDSoggetto> idSoggettiRegistroListByTipo(String tipoSoggetto,ISearch ricerca) throws DriverRegistroServiziException{
		return idSoggettiRegistroList("", tipoSoggetto, ricerca);
	}

	protected List<IDSoggetto> idSoggettiRegistroList(String superuser, ISearch ricerca) throws DriverRegistroServiziException {
		return idSoggettiRegistroList(superuser, null, ricerca);
	}
	
	private List<IDSoggetto> idSoggettiRegistroList(String superuser, String tipoSoggetto, ISearch ricerca) throws DriverRegistroServiziException {
		String nomeMetodo = "idSoggettiRegistroList";
		int idLista = Liste.SOGGETTI;
		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));

		String filterProtocollo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_PROTOCOLLO);
		String filterProtocolli = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_PROTOCOLLI);
		List<String> tipoSoggettiProtocollo = null;
		try {
			tipoSoggettiProtocollo = Filtri.convertToTipiSoggetti(filterProtocollo, filterProtocolli);
		}catch(Exception e) {
			throw new DriverRegistroServiziException(e.getMessage(),e);
		}
		
		String filterDominio = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_DOMINIO);
		PddTipologia pddTipologia = null;
		if(filterDominio!=null && !"".equals(filterDominio)) {
			pddTipologia = PddTipologia.toPddTipologia(filterDominio);
		}
		
		this.driver.logDebug("search : " + search);
		this.driver.logDebug("filterProtocollo : " + filterProtocollo);
		this.driver.logDebug("filterProtocolli : " + filterProtocolli);
		
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet risultato = null;
		ArrayList<IDSoggetto> lista = new ArrayList<>();

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {
			/* === Filtro Dominio === */
			
			ISQLQueryObject sqlQueryObjectPdd = null;
			if(pddTipologia!=null && PddTipologia.ESTERNO.equals(pddTipologia)) {
				ISQLQueryObject sqlQueryObjectExistsPdd = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObjectExistsPdd.addSelectField(CostantiDB.PDD+".nome");
				sqlQueryObjectExistsPdd.addFromTable(CostantiDB.PDD);
				sqlQueryObjectExistsPdd.setANDLogicOperator(true);
				sqlQueryObjectExistsPdd.addWhereCondition(CostantiDB.PDD+".nome="+CostantiDB.SOGGETTI+".server");
				sqlQueryObjectExistsPdd.addWhereCondition(CostantiDB.PDD+".tipo=?");
				
				sqlQueryObjectPdd = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObjectPdd.setANDLogicOperator(false);
				sqlQueryObjectPdd.addWhereIsNullCondition(CostantiDB.SOGGETTI+".server");
				sqlQueryObjectPdd.addWhereExistsCondition(false, sqlQueryObjectExistsPdd);
			}

			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
			sqlQueryObject.addSelectCountField("*", "cont");
			
			// creazione sqlQueryObject
			impostaFiltriRicercaSqlQueryObjectIdSoggettiList(superuser, tipoSoggetto, search, tipoSoggettiProtocollo, sqlQueryObject, pddTipologia, sqlQueryObjectPdd);
			sqlQueryObject.setANDLogicOperator(true);
			queryString = sqlQueryObject.createSQLQuery();
			
			stmt = con.prepareStatement(queryString);
			// setParameters
			setParametersIdSoggettiList(superuser, tipoSoggetto, search, pddTipologia, stmt);

			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;
			
			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
			sqlQueryObject.addSelectField("nome_soggetto");
			sqlQueryObject.addSelectField("tipo_soggetto");
			
			// creazione sqlQueryObject
			impostaFiltriRicercaSqlQueryObjectIdSoggettiList(superuser, tipoSoggetto, search, tipoSoggettiProtocollo, sqlQueryObject, pddTipologia, sqlQueryObjectPdd);
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addOrderBy("nome_soggetto");
			sqlQueryObject.addOrderBy("tipo_soggetto");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();

			stmt = con.prepareStatement(queryString);
			// setParameters
			setParametersIdSoggettiList(superuser, tipoSoggetto, search, pddTipologia, stmt);
			risultato = stmt.executeQuery();

			IDSoggetto sog;
			while (risultato.next()) {

				sog = new IDSoggetto();
				sog.setNome(risultato.getString("nome_soggetto"));
				sog.setTipo(risultato.getString("tipo_soggetto"));
				lista.add(sog);

			}

			return lista;

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

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

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

	private void setParametersIdSoggettiList(String superuser, String tipoSoggetto, String search, PddTipologia pddTipologia, PreparedStatement stmt) throws SQLException {
		int index = 1;
		
		// superuser
		if(this.driver.useSuperUser && superuser!=null && (!superuser.equals(""))){
			stmt.setString(index++, superuser);
		}
		
		// tipoSoggettiProtocollo in like
		
		// pddTipologia
		if(pddTipologia!=null && !PddTipologia.ESTERNO.equals(pddTipologia)) {
			stmt.setString(index++, pddTipologia.toString());
		}
		
		// tipoSoggetto
		if (!search.equals("")) {
			if(tipoSoggetto!=null){
				stmt.setString(index, tipoSoggetto); // index++ eliminato per segnalazione sonar
			}
		}else{
			if(tipoSoggetto!=null) 
				stmt.setString(index, tipoSoggetto); // index++ eliminato per segnalazione sonar
		}
	}

	private void impostaFiltriRicercaSqlQueryObjectIdSoggettiList(String superuser, String tipoSoggetto, String search, List<String> tipoSoggettiProtocollo,
			ISQLQueryObject sqlQueryObject, PddTipologia pddTipologia, ISQLQueryObject sqlQueryObjectPdd) throws SQLQueryObjectException {
		// superuser
		if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
			sqlQueryObject.addWhereCondition("superuser = ?");
		
		// tipoSoggettiProtocollo
		if(tipoSoggetto==null && tipoSoggettiProtocollo!=null && !tipoSoggettiProtocollo.isEmpty()) {
			sqlQueryObject.addWhereINCondition("tipo_soggetto", true, tipoSoggettiProtocollo.toArray(new String[1]));
		}
		
		// pddTipologia
		if(pddTipologia!=null) {
			if(PddTipologia.ESTERNO.equals(pddTipologia)) {						
				sqlQueryObject.addWhereCondition(sqlQueryObjectPdd.createSQLConditions());							
			}
			else {
				sqlQueryObject.addFromTable(CostantiDB.PDD);
				sqlQueryObject.addWhereCondition(true,CostantiDB.PDD+".nome="+CostantiDB.SOGGETTI+".server",CostantiDB.PDD+".tipo=?");
			}
		}
		
		// tipoSoggetto
		if (!search.equals("")) {
			//query con search
			
			if(tipoSoggetto!=null){
				sqlQueryObject.addWhereCondition("tipo_soggetto=?");
				sqlQueryObject.addWhereLikeCondition("nome_soggetto", search, true, true);	
			}
			else{
				sqlQueryObject.addWhereCondition(false, 
						sqlQueryObject.getWhereLikeCondition("tipo_soggetto", search, true, true),
						sqlQueryObject.getWhereLikeCondition("nome_soggetto", search, true, true));
			}
		} else {
			if(tipoSoggetto!=null)
				sqlQueryObject.addWhereCondition("tipo_soggetto=?");
		}
	}
}