DriverRegistroServiziDB_accordiParteSpecificaSearchDriver.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.util.ArrayList;
import java.util.List;

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.constants.CostantiDB;
import org.openspcoop2.core.constants.TipiConnettore;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Fruitore;
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.constants.TipologiaServizio;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.utils.jdbc.JDBCUtilities;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.SQLObjectFactory;

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

	private DriverRegistroServiziDB driver = null;
	
	protected DriverRegistroServiziDB_accordiParteSpecificaSearchDriver(DriverRegistroServiziDB driver) {
		this.driver = driver;
	}
		
	protected List<AccordoServizioParteSpecifica> serviziList(String superuser,ISearch ricerca) throws DriverRegistroServiziException {
		String nomeMetodo = "serviziList";
		int idLista = Liste.SERVIZI;
		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));
		ricerca.getSearchString(idLista);

		this.driver.logDebug("search : " + search);

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

		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource("serviziList");
				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 {

			if (!search.equals("")) {
				//query con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addWhereLikeCondition("nome_servizio", search, true, true);
				if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
					sqlQueryObject.addWhereCondition("superuser = ?");

				queryString = sqlQueryObject.createSQLQuery();
			} else {
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.setANDLogicOperator(true);
				if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
					sqlQueryObject.addWhereCondition("superuser = ?");
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
				stmt.setString(1, superuser);
			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.SERVIZI);
				sqlQueryObject.addSelectField("id");
				sqlQueryObject.addSelectField("nome_servizio");
				sqlQueryObject.addSelectField("tipo_servizio");
				sqlQueryObject.addSelectField("versione_servizio");
				sqlQueryObject.addSelectField("id_soggetto");
				sqlQueryObject.addSelectField("id_accordo");
				sqlQueryObject.addSelectField("servizio_correlato");
				sqlQueryObject.addSelectField("stato");
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addWhereLikeCondition("nome_servizio", search, true, true);
				if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
					sqlQueryObject.addWhereCondition("superuser = ?");
				sqlQueryObject.addOrderBy("tipo_servizio");
				sqlQueryObject.addOrderBy("nome_servizio");
				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.SERVIZI);
				sqlQueryObject.addSelectField("id");
				sqlQueryObject.addSelectField("nome_servizio");
				sqlQueryObject.addSelectField("tipo_servizio");
				sqlQueryObject.addSelectField("versione_servizio");
				sqlQueryObject.addSelectField("id_soggetto");
				sqlQueryObject.addSelectField("id_accordo");
				sqlQueryObject.addSelectField("servizio_correlato");
				sqlQueryObject.addSelectField("stato");
				sqlQueryObject.setANDLogicOperator(true);
				if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
					sqlQueryObject.addWhereCondition("superuser = ?");
				sqlQueryObject.addOrderBy("tipo_servizio");
				sqlQueryObject.addOrderBy("nome_servizio");
				sqlQueryObject.setSortType(true);
				sqlQueryObject.setLimit(limit);
				sqlQueryObject.setOffset(offset);
				queryString = sqlQueryObject.createSQLQuery();
			}

			this.driver.logDebug("query : " + queryString);

			stmt = con.prepareStatement(queryString);
			if(this.driver.useSuperUser && superuser!=null && (!superuser.equals("")))
				stmt.setString(1, superuser);
			risultato = stmt.executeQuery();

			AccordoServizioParteSpecifica asps;
			while (risultato.next()) {

				asps = new AccordoServizioParteSpecifica();
				
				asps.setId(risultato.getLong("id"));
				asps.setNome(risultato.getString("nome_servizio"));
				asps.setTipo(risultato.getString("tipo_servizio"));
				asps.setVersione(risultato.getInt("versione_servizio"));
				asps.setIdSoggetto(risultato.getLong("id_soggetto"));
				asps.setIdAccordo(risultato.getLong("id_accordo"));
				String servizio_correlato = risultato.getString("servizio_correlato");
				if ( (servizio_correlato != null) && 
						(servizio_correlato.equalsIgnoreCase(CostantiRegistroServizi.ABILITATO.toString()) || TipologiaServizio.CORRELATO.toString().equals(servizio_correlato)) 
						){
					asps.setTipologiaServizio(TipologiaServizio.CORRELATO);
				}else{
					asps.setTipologiaServizio(TipologiaServizio.NORMALE);
				}

				// informazioni su soggetto
				Soggetto sog = this.driver.getSoggetto(asps.getIdSoggetto(),con);
				String nomeErogatore = sog.getNome();
				String tipoErogatore = sog.getTipo();

				asps.setNomeSoggettoErogatore(nomeErogatore);
				asps.setTipoSoggettoErogatore(tipoErogatore);

				// informazioni su accordo
				AccordoServizioParteComune as = this.driver.getAccordoServizioParteComune(asps.getIdAccordo(),con);
				asps.setAccordoServizioParteComune(this.driver.idAccordoFactory.getUriFromAccordo(as));

				// Stato
				asps.setStatoPackage(risultato.getString("stato"));

				lista.add(asps);
			}

			this.driver.logDebug("size lista :" + ((lista == null) ? null : lista.size()));

			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<Soggetto> accordiErogatoriList(long idAccordo, ISearch ricerca) throws DriverRegistroServiziException {
		String nomeMetodo = "accordiErogatoriList";
		int idLista = Liste.ACCORDI_EROGATORI;
		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));
		ricerca.getSearchString(idLista);

		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet risultato = null;
		PreparedStatement stmt2 = null;
		ResultSet risultato2 = null;

		ArrayList<Soggetto> lista = new ArrayList<Soggetto>();

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

			} 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 {

			if (!search.equals("")) {
				//query con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI + ".id_accordo = ?");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI + ".id_soggetto = " + CostantiDB.SOGGETTI + ".id");
				sqlQueryObject.addWhereCondition(false, sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI + ".nome_soggetto",search,true,true), 
						sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI + ".tipo_soggetto",search,true,true));
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			} else {
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_accordo = ?");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1,idAccordo);
			risultato = stmt.executeQuery();
			if (risultato.next())
				ricerca.setNumEntries(idLista,risultato.getInt("cont"));
			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.SERVIZI);
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".nome_soggetto");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".tipo_soggetto");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".id");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".descrizione");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".identificativo_porta");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".codice_ipa");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".id", "servid");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".nome_servizio");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".tipo_servizio");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".versione_servizio");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".servizio_correlato");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".id_accordo");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".id_soggetto");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI + ".id_accordo = ?");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI + ".id_soggetto = " + CostantiDB.SOGGETTI + ".id");
				sqlQueryObject.addWhereCondition(false, sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI + ".nome_soggetto",search,true,true), 
						sqlQueryObject.getWhereLikeCondition(CostantiDB.SOGGETTI + ".tipo_soggetto",search,true,true));
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy(CostantiDB.SOGGETTI + ".tipo_soggetto");
				sqlQueryObject.addOrderBy(CostantiDB.SOGGETTI + ".nome_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.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".nome_soggetto");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".tipo_soggetto");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".id");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".descrizione");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".identificativo_porta");
				sqlQueryObject.addSelectField(CostantiDB.SOGGETTI+".codice_ipa");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".id", "servid");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".nome_servizio");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".tipo_servizio");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".versione_servizio");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".servizio_correlato");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".id_accordo");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".id_soggetto");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_accordo = ?");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy("tipo_soggetto");
				sqlQueryObject.addOrderBy("nome_soggetto");
				sqlQueryObject.setSortType(true);
				sqlQueryObject.setLimit(limit);
				sqlQueryObject.setOffset(offset);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idAccordo);
			risultato = stmt.executeQuery();

			Soggetto sog = null;
			String oldNome = "";
			String oldTipo = "";
			while (risultato.next()) {
				String newNome = risultato.getString("nome_soggetto");
				String newTipo = risultato.getString("tipo_soggetto");

				// se il nome o il tipo sono diversi allora e' un soggetto nuovo
				// altrimenti e' sempre lo stesso soggetto
				// il controllo va fatto prima sul tipo in quanto il risultato
				// e' ordinato come tipo/nome
				if (sog == null || !oldTipo.equals(newTipo) || !oldNome.equals(newNome)) {

					oldTipo=newTipo;
					oldNome=newNome;
					// se sog e' null e' la prima volta che visito il result set
					// e non devo aggiunger nulla alla lista
					// altrimenti ho finito di aggiungere i servizi ad un
					// soggetto e devo metterlo nella lista
					// e iniziare ad aggiungere i servizi al nuovo soggetto
					// trovato
					if (sog != null)
						lista.add(sog);

					// creo il nuovo soggetto
					sog = new Soggetto();

					sog.setId(risultato.getLong("id"));
					sog.setNome(risultato.getString("nome_soggetto"));
					sog.setTipo(risultato.getString("tipo_soggetto"));
					sog.setDescrizione(risultato.getString("descrizione"));
					sog.setIdentificativoPorta(risultato.getString("identificativo_porta"));
					sog.setCodiceIpa(risultato.getString("codice_ipa"));
				}

				AccordoServizioParteSpecifica serv = new AccordoServizioParteSpecifica();
				serv.setId(risultato.getLong("servid"));
				serv.setNome(risultato.getString("nome_servizio"));
				serv.setTipo(risultato.getString("tipo_servizio"));
				serv.setVersione(risultato.getInt("versione_servizio"));

				if ( risultato.getString("servizio_correlato").equals(CostantiRegistroServizi.ABILITATO.toString()) ||
						TipologiaServizio.CORRELATO.toString().equals(risultato.getString("servizio_correlato"))) {
					serv.setTipologiaServizio(TipologiaServizio.CORRELATO);
				}
				else{
					serv.setTipologiaServizio(TipologiaServizio.NORMALE);
				}
				
				ISQLQueryObject sqlQueryObjectFruitori = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObjectFruitori.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObjectFruitori.addFromTable(CostantiDB.SERVIZI_FRUITORI);
				sqlQueryObjectFruitori.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObjectFruitori.addSelectField(CostantiDB.SOGGETTI,"tipo_soggetto");
				sqlQueryObjectFruitori.addSelectField(CostantiDB.SOGGETTI,"nome_soggetto");
				sqlQueryObjectFruitori.addWhereCondition(CostantiDB.SERVIZI+".id = ?");
				sqlQueryObjectFruitori.addWhereCondition(CostantiDB.SERVIZI+".id = "+CostantiDB.SERVIZI_FRUITORI+".id_servizio");
				sqlQueryObjectFruitori.addWhereCondition(CostantiDB.SOGGETTI+".id = "+CostantiDB.SERVIZI_FRUITORI+".id_soggetto");
				sqlQueryObjectFruitori.setANDLogicOperator(true);
				sqlQueryObjectFruitori.setSelectDistinct(true);
				String queryStringFruitori = sqlQueryObjectFruitori.createSQLQuery();
				stmt2 = con.prepareStatement(queryStringFruitori);
				stmt2.setLong(1, serv.getId());
				risultato2 = stmt2.executeQuery();

				while (risultato2.next()) {
					String nome = risultato2.getString("nome_soggetto");
					String tipo = risultato2.getString("tipo_soggetto");
					Fruitore fruitore = new Fruitore();
					fruitore.setTipo(tipo);
					fruitore.setNome(nome);
					serv.addFruitore(fruitore);
				}
				risultato2.close();
				stmt2.close();

				serv.setTipoSoggettoErogatore(sog.getTipo());
				serv.setNomeSoggettoErogatore(sog.getNome());
				sog.addAccordoServizioParteSpecifica(serv);
			}

			//aggiungo l'ultimo soggetto alla lista
			if(sog!=null) lista.add(sog);

			return lista;

		} catch (Exception se) {

			throw new DriverRegistroServiziException("[DriverRegistroServiziDB::" + nomeMetodo + "] Exception: " + se.getMessage(),se);
		} finally {
			//Chiudo statement and resultset
			JDBCUtilities.closeResources(risultato, stmt);
			JDBCUtilities.closeResources(risultato2, stmt2);
			this.driver.closeConnection(con);
		}
	}

		
	protected List<AccordoServizioParteSpecifica> getServiziByIdErogatore(long idErogatore,ISearch filters) throws DriverRegistroServiziException {
		return getServiziByIdErogatoreAndFilters(idErogatore, filters);		
	}

	private List<AccordoServizioParteSpecifica> getServiziByIdErogatoreAndFilters(long idErogatore,ISearch filters) throws DriverRegistroServiziException {

		String nomeMetodo = "getServiziByIdErogatoreAndFilters";
		String queryString;
		int idLista = Liste.SERVIZI;
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet risultato = null;

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

		ArrayList<AccordoServizioParteSpecifica> lista = null;

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

			} 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 {

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

			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idErogatore);
			risultato = stmt.executeQuery();
			if (risultato.next())
				filters.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.setANDLogicOperator(true);
			sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
			sqlQueryObject.addSelectField("id");
			sqlQueryObject.addSelectField("nome_servizio");
			sqlQueryObject.addSelectField("tipo_servizio");
			sqlQueryObject.addSelectField("versione_servizio");
			sqlQueryObject.addSelectField("id_soggetto");	
			sqlQueryObject.addWhereCondition("id_soggetto = ?");
			if (!search.equals("")) { // con search
				sqlQueryObject.addWhereLikeCondition("nome_servizio", search, true, true);
			} 

			sqlQueryObject.addOrderBy("nome_servizio");
			sqlQueryObject.addOrderBy("versione_servizio");
			sqlQueryObject.addOrderBy("tipo_servizio");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();

			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idErogatore);
			risultato = stmt.executeQuery();

			lista = new ArrayList<AccordoServizioParteSpecifica>();
			while (risultato.next()) {
				long id=risultato.getLong("id");
				AccordoServizioParteSpecifica se=this.driver.getAccordoServizioParteSpecifica(id, con);
				lista.add(se);
			}

			return lista;

		} catch (Exception se) {

			throw new DriverRegistroServiziException("[DriverControlStationDB::" + nomeMetodo + "] Exception: " + se.getMessage(),se);
		} finally {
			//Chiudo statement and resultset
			JDBCUtilities.closeResources(risultato, stmt);
			this.driver.closeConnection(con);
		}

	}

	protected List<AccordoServizioParteSpecifica> soggettiServizioList(String superuser, ISearch ricerca,boolean [] permessiUtente, 
			boolean gestioneFruitori, boolean gestioneErogatori) throws DriverRegistroServiziException {
		String nomeMetodo = "soggettiServizioList";
		int idLista = Liste.SERVIZI;
		int offset;
		int limit;
		String searchAPIErogazioneFruizione;
		String queryString;
		Connection con = null;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		boolean error = false;
		ArrayList<AccordoServizioParteSpecifica> serviziList = new ArrayList<>();

		String aliasSoggettiFruitori = "soggettoFruitore";
		
		String aliasSoggettiReferenti = "soggettoReferente";
				
		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);
		searchAPIErogazioneFruizione = (org.openspcoop2.core.constants.Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : 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> tipoServiziProtocollo = null;
		try {
			tipoServiziProtocollo = Filtri.convertToTipiServizi(filterProtocollo, filterProtocolli);
		}catch(Exception e) {
			throw new DriverRegistroServiziException(e.getMessage(),e);
		}

		String filterTipoAPI = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_SERVICE_BINDING);
		if(filterTipoAPI!=null && filterTipoAPI.equals("")) {
			filterTipoAPI = null;
		}
		
		String filterGruppo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_GRUPPO);
		if(filterGruppo!=null && filterGruppo.equals("")) {
			filterGruppo = null;
		}
		
		String filterApi = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_API);
		IDAccordo idAccordoApi = null;
		if(filterApi!=null && filterApi.equals("")) {
			filterApi = null;
		}
		if(filterApi!=null) {
			try {
				idAccordoApi = IDAccordoFactory.getInstance().getIDAccordoFromUri(filterApi);
			}catch(Exception e) {
				throw new DriverRegistroServiziException(e.getMessage(),e);
			}
		}
		
		String filterCanale = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CANALE);
		boolean searchCanale = false;
		boolean canaleDefault = false;
		if(gestioneFruitori || gestioneErogatori) {
			if(filterCanale!=null && !filterCanale.equals("")) {
				searchCanale = true;
				if(filterCanale.startsWith(Filtri.PREFIX_VALUE_CANALE_DEFAULT)) {
					filterCanale = filterCanale.substring(Filtri.PREFIX_VALUE_CANALE_DEFAULT.length());
					canaleDefault = true;
				}
			}
		}
		
		String filterDominio = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_DOMINIO);
		PddTipologia pddTipologia = null;
		if(filterDominio!=null && !"".equals(filterDominio)) {
			pddTipologia = PddTipologia.toPddTipologia(filterDominio);
		}
		
		String filterStatoAccordo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_STATO_ACCORDO);
		
		String filterSoggettoTipoNome = SearchUtils.getFilter(ricerca, idLista,  Filtri.FILTRO_SOGGETTO);
		String filterSoggettoTipo = null;
		String filterSoggettoNome = null;
		if(filterSoggettoTipoNome!=null && !"".equals(filterSoggettoTipoNome)) {
			filterSoggettoTipo = filterSoggettoTipoNome.split("/")[0];
			filterSoggettoNome = filterSoggettoTipoNome.split("/")[1];
		}
		
		String filterSoggettoErogatoreContains = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_SOGGETTO_EROGATORE_CONTAINS);
		
		String filtroStatoAPIImpl = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_STATO);
		if((filtroStatoAPIImpl!=null && "".equals(filtroStatoAPIImpl))) {
			filtroStatoAPIImpl=null;
		}
		
		String filtroAutenticazioneTokenPolicy = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_AUTENTICAZIONE_TOKEN_TIPO);
		if((filtroAutenticazioneTokenPolicy!=null && "".equals(filtroAutenticazioneTokenPolicy))) {
			filtroAutenticazioneTokenPolicy=null;
		}
		
		String filtroAutenticazioneTrasportoTipo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_AUTENTICAZIONE_TRASPORTO_TIPO);
		if((filtroAutenticazioneTrasportoTipo!=null && "".equals(filtroAutenticazioneTrasportoTipo))) {
			filtroAutenticazioneTrasportoTipo=null;
		}
		String filtroAutenticazioneTrasportoTipoPlugin = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_AUTENTICAZIONE_TRASPORTO_TIPO_PLUGIN);
		if((filtroAutenticazioneTrasportoTipoPlugin!=null && "".equals(filtroAutenticazioneTrasportoTipoPlugin))) {
			filtroAutenticazioneTrasportoTipoPlugin=null;
		}
		if(filtroAutenticazioneTrasportoTipoPlugin!=null && !org.openspcoop2.core.constants.Costanti.VALUE_PARAMETRO_CUSTOM_IN_SELECT.equals(filtroAutenticazioneTrasportoTipo)) {
			filtroAutenticazioneTrasportoTipoPlugin=null;
		}
		String filtroAutenticazioneTrasporto = (filtroAutenticazioneTrasportoTipoPlugin!=null) ? filtroAutenticazioneTrasportoTipoPlugin : filtroAutenticazioneTrasportoTipo;
		
		String filtroRateLimitingStato = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_RATE_LIMITING_STATO);
		if((filtroRateLimitingStato!=null && "".equals(filtroRateLimitingStato))) {
			filtroRateLimitingStato=null;
		}
		
		String filtroValidazioneStato = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_VALIDAZIONE_STATO);
		if((filtroValidazioneStato!=null && "".equals(filtroValidazioneStato))) {
			filtroValidazioneStato=null;
		}
		
		String filtroCacheRispostaStato = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_CACHE_RISPOSTA_STATO);
		if((filtroCacheRispostaStato!=null && "".equals(filtroCacheRispostaStato))) {
			filtroCacheRispostaStato=null;
		}
		
		String filtroMessageSecurityStato = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_MESSAGE_SECURITY_STATO);
		if((filtroMessageSecurityStato!=null && "".equals(filtroMessageSecurityStato))) {
			filtroMessageSecurityStato=null;
		}
		
		String filtroMTOMStato = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_MTOM_STATO);
		if((filtroMTOMStato!=null && "".equals(filtroMTOMStato))) {
			filtroMTOMStato=null;
		}
		if(filtroMTOMStato!=null && "rest".equalsIgnoreCase(filterTipoAPI)) {
			filtroMTOMStato=null;
		}
		
		String filtroTrasformazione = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_TRASFORMAZIONE_STATO);
		if((filtroTrasformazione!=null && "".equals(filtroTrasformazione))) {
			filtroTrasformazione=null;
		}
		
		String filtroConfigurazioneTransazioni = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_TRANSAZIONI);
		if((filtroConfigurazioneTransazioni!=null && "".equals(filtroConfigurazioneTransazioni))) {
			filtroConfigurazioneTransazioni=null;
		}
		
		String filtroCorrelazioneApplicativa = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_CORRELAZIONE_APPLICATIVA_STATO);
		if((filtroCorrelazioneApplicativa!=null && "".equals(filtroCorrelazioneApplicativa))) {
			filtroCorrelazioneApplicativa=null;
		}
		
		String filtroConfigurazioneDumpTipo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_DUMP_TIPO);
		if((filtroConfigurazioneDumpTipo!=null && "".equals(filtroConfigurazioneDumpTipo))) {
			filtroConfigurazioneDumpTipo=null;
		}
		
		String filtroCORS = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_CORS_TIPO);
		if((filtroCORS!=null && "".equals(filtroCORS))) {
			filtroCORS=null;
		}
		String filtroCORSorigin = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONFIGURAZIONE_CORS_ORIGIN);
		if((filtroCORSorigin!=null && "".equals(filtroCORSorigin))) {
			filtroCORSorigin=null;
		}
		if((filtroCORSorigin!=null && !Filtri.FILTRO_CONFIGURAZIONE_CORS_TIPO_VALORE_RIDEFINITO_ABILITATO.equals(filtroCORS))) {
			filtroCORSorigin=null;
		}
		
		String filtroConnettoreTipo = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONNETTORE_TIPO);
		String filtroConnettoreTipoPlugin = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONNETTORE_TIPO_PLUGIN);
		String filtroConnettoreTokenPolicy = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONNETTORE_TOKEN_POLICY);
		String filtroConnettoreEndpoint = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONNETTORE_ENDPOINT);
		String filtroConnettoreKeystore = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONNETTORE_KEYSTORE);
		String filtroConnettoreDebug = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_CONNETTORE_DEBUG);
		if((filtroConnettoreTipo!=null && "".equals(filtroConnettoreTipo))) {
			filtroConnettoreTipo=null;
		}
		if((filtroConnettoreTipoPlugin!=null && "".equals(filtroConnettoreTipoPlugin))) {
			filtroConnettoreTipoPlugin=null;
		}
		if((filtroConnettoreTokenPolicy!=null && "".equals(filtroConnettoreTokenPolicy))) {
			filtroConnettoreTokenPolicy=null;
		}
		if((filtroConnettoreEndpoint!=null && "".equals(filtroConnettoreEndpoint))) {
			filtroConnettoreEndpoint=null;
		}
		if((filtroConnettoreKeystore!=null && "".equals(filtroConnettoreKeystore))) {
			filtroConnettoreKeystore=null;
		}
		if((filtroConnettoreDebug!=null && "".equals(filtroConnettoreDebug))) {
			filtroConnettoreDebug=null;
		}
		boolean joinConnettore =  filtroConnettoreTipo!=null	|| filtroConnettoreTokenPolicy!=null || filtroConnettoreEndpoint!=null || filtroConnettoreKeystore!=null || filtroConnettoreDebug!=null;
		TipiConnettore tipoConnettore = null;
		String endpointType = null;
		boolean tipoConnettoreIntegrationManager = false; 
		if(filtroConnettoreTipo!=null && !"".equals(filtroConnettoreTipo)) {
			if(Filtri.FILTRO_CONNETTORE_TIPO_VALORE_IM.equals(filtroConnettoreTipo)) {
				tipoConnettoreIntegrationManager = true;
			}
			else {
				tipoConnettore = TipiConnettore.toEnumFromName(filtroConnettoreTipo);
				if(tipoConnettore!=null) {
					endpointType = (TipiConnettore.CUSTOM.equals(tipoConnettore)) ? filtroConnettoreTipoPlugin : tipoConnettore.getNome();
				}
			}
		}
		 
		String filtroModISicurezzaCanale = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_MODI_SICUREZZA_CANALE);
		String filtroModISicurezzaMessaggio = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_MODI_SICUREZZA_MESSAGGIO);
		String filtroModISorgenteToken = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_MODI_SORGENTE_TOKEN);
		String filtroModIKeystorePath = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_MODI_KEYSTORE_PATH);
		String filtroModIAudience = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_MODI_AUDIENCE);
		String filtroModIInfoUtente = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_MODI_INFORMAZIONI_UTENTE);
		String filtroModIDigestRichiesta = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_MODI_DIGEST_RICHIESTA);
		if((filtroModISicurezzaCanale!=null && "".equals(filtroModISicurezzaCanale))) {
			filtroModISicurezzaCanale=null;
		}
		if((filtroModISicurezzaMessaggio!=null && "".equals(filtroModISicurezzaMessaggio))) {
			filtroModISicurezzaMessaggio=null;
		}
		if((filtroModISorgenteToken!=null && "".equals(filtroModISorgenteToken))) {
			filtroModISorgenteToken=null;
		}
		Boolean filtroModIDigestRichiestaEnabled = null;
		if(CostantiDB.STATO_FUNZIONALITA_ABILITATO.equals(filtroModIDigestRichiesta)) {
			filtroModIDigestRichiestaEnabled = true;
		}
		else if(CostantiDB.STATO_FUNZIONALITA_DISABILITATO.equals(filtroModIDigestRichiesta)) {
			filtroModIDigestRichiestaEnabled = false;
		}
		if((filtroModIInfoUtente!=null && "".equals(filtroModIInfoUtente))) {
			filtroModIInfoUtente=null;
		}
		if((filtroModIKeystorePath!=null && "".equals(filtroModIKeystorePath))) {
			filtroModIKeystorePath=null;
		}
		if((filtroModIAudience!=null && "".equals(filtroModIAudience))) {
			filtroModIAudience=null;
		}
		boolean filtroModI = filtroModISicurezzaCanale!=null || filtroModISicurezzaMessaggio!=null ||
				filtroModISorgenteToken!=null ||
				filtroModIDigestRichiestaEnabled!=null || filtroModIInfoUtente!=null ||
				filtroModIKeystorePath!=null || filtroModIAudience!=null;
		
		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 : " + searchAPIErogazioneFruizione);
		this.driver.logDebug("filterSoggettoErogatoreContains : "+filterSoggettoErogatoreContains);
		this.driver.logDebug("filterProtocollo : " + filterProtocollo);
		this.driver.logDebug("filterProtocolli : " + filterProtocolli);
		this.driver.logDebug("filterTipoAPI : " + filterTipoAPI);
		this.driver.logDebug("filterGruppo : " + filterGruppo);
		this.driver.logDebug("filterApi : " + filterApi);
		this.driver.logDebug("filterCanale : " + filterCanale);
		this.driver.logDebug("filterDominio : " + filterDominio);
		this.driver.logDebug("filterStatoAccordo : " + filterStatoAccordo);
		this.driver.logDebug("filterSoggettoNome : " + filterSoggettoNome);
		this.driver.logDebug("filterSoggettoTipo : " + filterSoggettoTipo);
		this.driver.logDebug("filtroStatoAPIImpl : " + filtroStatoAPIImpl);
		this.driver.logDebug("filtroAutenticazioneTokenPolicy : " + filtroAutenticazioneTokenPolicy);
		this.driver.logDebug("filtroAutenticazioneTrasporto : " + filtroAutenticazioneTrasporto);
		this.driver.logDebug("filtroRateLimitingStato : " + filtroRateLimitingStato);
		this.driver.logDebug("filtroValidazioneStato : " + filtroValidazioneStato);
		this.driver.logDebug("filtroCacheRispostaStato : " + filtroCacheRispostaStato);
		this.driver.logDebug("filtroMessageSecurityStato : " + filtroMessageSecurityStato);
		this.driver.logDebug("filtroMTOMStato : " + filtroMTOMStato);
		this.driver.logDebug("filtroTrasformazione : " + filtroTrasformazione);
		this.driver.logDebug("filtroConfigurazioneTransazioni : " + filtroConfigurazioneTransazioni);
		this.driver.logDebug("filtroCorrelazioneApplicativa : " + filtroCorrelazioneApplicativa);
		this.driver.logDebug("filtroConfigurazioneDumpTipo : " + filtroConfigurazioneDumpTipo);
		this.driver.logDebug("filtroCORS : " + filtroCORS);
		this.driver.logDebug("filtroCORS_origin : " + filtroCORSorigin);
		this.driver.logDebug("filtroConnettoreTipo : " + filtroConnettoreTipo);
		this.driver.logDebug("filtroConnettoreTipoPlugin : " + filtroConnettoreTipoPlugin);
		this.driver.logDebug("filtroConnettoreTokenPolicy : " + filtroConnettoreTokenPolicy);
		this.driver.logDebug("filtroConnettoreEndpoint : " + filtroConnettoreEndpoint);
		this.driver.logDebug("filtroConnettoreKeystore : " + filtroConnettoreKeystore);
		this.driver.logDebug("filtroConnettoreDebug : " + filtroConnettoreDebug);
		this.driver.logDebug("filtroConnettoreTipoPlugin : " + filtroConnettoreTipoPlugin);
		this.driver.logDebug("filtroModISicurezzaCanale : " + filtroModISicurezzaCanale);
		this.driver.logDebug("filtroModISicurezzaMessaggio : " + filtroModISicurezzaMessaggio);
		this.driver.logDebug("filtroModISorgenteToken : " + filtroModISorgenteToken);
		this.driver.logDebug("filtroModIKeystorePath : " + filtroModIKeystorePath);
		this.driver.logDebug("filtroModIAudience : " + filtroModIAudience);
		this.driver.logDebug("filtroModIInfoUtente : " + filtroModIInfoUtente);
		this.driver.logDebug("filtroModIDigestRichiesta : " + filtroModIDigestRichiesta);
		this.driver.logDebug("filtroProprietaNome : " + filtroProprietaNome);
		this.driver.logDebug("filtroProprietaValore : " + filtroProprietaValore);
		
		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource("soggettiServizioList");
				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 {

			ISQLQueryObject sqlQueryObjectAccordiComposti = null;			
			if (permessiUtente != null) {
				sqlQueryObjectAccordiComposti = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObjectAccordiComposti.addFromTable(CostantiDB.ACCORDI_SERVIZI_COMPOSTO);
				sqlQueryObjectAccordiComposti.addSelectField(CostantiDB.ACCORDI_SERVIZI_COMPOSTO, "id");
				sqlQueryObjectAccordiComposti.setANDLogicOperator(true);
				sqlQueryObjectAccordiComposti.addWhereCondition(CostantiDB.ACCORDI_SERVIZI_COMPOSTO+".id_accordo="+CostantiDB.ACCORDI+".id");
			}

			ISQLQueryObject sqlQueryObjectSoggettiErogatoreContains = null;
			if (!filterSoggettoErogatoreContains.equals("")) {
				sqlQueryObjectSoggettiErogatoreContains = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObjectSoggettiErogatoreContains.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObjectSoggettiErogatoreContains.addSelectField(CostantiDB.SOGGETTI, "tipo_soggetto");
				sqlQueryObjectSoggettiErogatoreContains.addSelectField(CostantiDB.SOGGETTI, "nome_soggetto");
				sqlQueryObjectSoggettiErogatoreContains.setANDLogicOperator(true);
				sqlQueryObjectSoggettiErogatoreContains.addWhereCondition(CostantiDB.SERVIZI+".id_soggetto="+CostantiDB.SOGGETTI+".id");
				sqlQueryObjectSoggettiErogatoreContains.addWhereCondition(false,
						//sqlQueryObjectSoggettiErogatoreContains.getWhereLikeCondition("tipo_soggetto", search, true, true),
						sqlQueryObjectSoggettiErogatoreContains.getWhereLikeCondition("nome_soggetto", filterSoggettoErogatoreContains, true, true));
			}

			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);
			}
						
			if (!searchAPIErogazioneFruizione.equals("")) {
				//query con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				if(permessiUtente!=null || filterTipoAPI!=null || filterGruppo!=null || idAccordoApi!=null || searchCanale || filtroModI
						|| !searchAPIErogazioneFruizione.equals("") // aggiunto per cercare anche sul nome dell'API (parte comune)
					) {
					sqlQueryObject.addFromTable(CostantiDB.ACCORDI);
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_accordo="+CostantiDB.ACCORDI+".id");
					if(filterGruppo!=null) {
						sqlQueryObject.addFromTable(CostantiDB.ACCORDI_GRUPPI);
						sqlQueryObject.addFromTable(CostantiDB.GRUPPI);
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_GRUPPI+".id_accordo="+CostantiDB.ACCORDI+".id");
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_GRUPPI+".id_gruppo="+CostantiDB.GRUPPI+".id");
					}
					if(idAccordoApi!=null) {
						sqlQueryObject.addFromTable(CostantiDB.SOGGETTI, aliasSoggettiReferenti);
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".id_referente="+aliasSoggettiReferenti+".id");
					}
				}
				if(gestioneFruitori) {
					sqlQueryObject.addFromTable(CostantiDB.MAPPING_FRUIZIONE_PD);
					sqlQueryObject.addFromTable(CostantiDB.SERVIZI_FRUITORI);
					sqlQueryObject.addFromTable(CostantiDB.SOGGETTI, aliasSoggettiFruitori);
					if(searchCanale) {
						sqlQueryObject.addFromTable(CostantiDB.PORTE_DELEGATE);
					}
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".id_fruizione="+CostantiDB.SERVIZI_FRUITORI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".is_default=1");
					if(searchCanale) {
						sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".id_porta="+CostantiDB.PORTE_DELEGATE+".id");
					}
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_FRUITORI+".id_servizio="+CostantiDB.SERVIZI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_FRUITORI+".id_soggetto="+aliasSoggettiFruitori+".id");
					if(joinConnettore) {
						DBUtils.setFiltriConnettoreFruizione(sqlQueryObject, this.driver.tipoDB, 
								tipoConnettore, endpointType, tipoConnettoreIntegrationManager, 
								filtroConnettoreTokenPolicy, filtroConnettoreEndpoint, filtroConnettoreKeystore, filtroConnettoreDebug);
					}
					if(filtroModI) {
						DBUtils.setFiltriModIFruizione(sqlQueryObject, this.driver.tipoDB,
								filtroModISicurezzaCanale, filtroModISicurezzaMessaggio,
								filtroModISorgenteToken,
								filtroModIDigestRichiestaEnabled, filtroModIInfoUtente,
								filtroModIKeystorePath, filtroModIAudience);
					}
					if(filtroProprieta) {
						DBUtils.setFiltriProprietaFruizione(sqlQueryObject, this.driver.tipoDB, 
								filtroProprietaNome, filtroProprietaValore);
					}
					if(filtroStatoAPIImpl!=null || 
							filtroAutenticazioneTokenPolicy!=null || filtroAutenticazioneTrasporto!=null || 
							filtroRateLimitingStato!=null || 
							filtroValidazioneStato!=null || 
							filtroCacheRispostaStato!=null ||
							filtroMessageSecurityStato!=null ||
							filtroMTOMStato!=null ||
							filtroTrasformazione!=null ||
							filtroConfigurazioneTransazioni!=null ||
							filtroCorrelazioneApplicativa!=null ||
							filtroConfigurazioneDumpTipo!=null ||
							filtroCORS!=null) {
						DBUtils.setFiltriConfigurazioneFruizione(sqlQueryObject, this.driver.tipoDB,
								filtroStatoAPIImpl,
								filtroAutenticazioneTokenPolicy, filtroAutenticazioneTrasporto,
								filtroRateLimitingStato,
								filtroValidazioneStato,
								filtroCacheRispostaStato,
								filtroMessageSecurityStato,
								filtroMTOMStato,
								filtroTrasformazione,
								filtroConfigurazioneTransazioni,
								filtroCorrelazioneApplicativa,
								filtroConfigurazioneDumpTipo,
								filtroCORS, filtroCORSorigin);
					}					
				}
				if(gestioneErogatori) {
					sqlQueryObject.addFromTable(CostantiDB.MAPPING_EROGAZIONE_PA);
					if(searchCanale) {
						sqlQueryObject.addFromTable(CostantiDB.PORTE_APPLICATIVE);
					}
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".id_erogazione="+CostantiDB.SERVIZI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".is_default=1");
					if(searchCanale) {
						sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".id_porta="+CostantiDB.PORTE_APPLICATIVE+".id");
					}
					if(joinConnettore) {
						DBUtils.setFiltriConnettoreErogazione(sqlQueryObject, this.driver.tipoDB, 
								tipoConnettore, endpointType, tipoConnettoreIntegrationManager, 
								filtroConnettoreTokenPolicy, filtroConnettoreEndpoint, filtroConnettoreKeystore, filtroConnettoreDebug);
					}
					if(filtroModI) {
						DBUtils.setFiltriModIErogazione(sqlQueryObject, this.driver.tipoDB,
								filtroModISicurezzaCanale, filtroModISicurezzaMessaggio,
								filtroModISorgenteToken,
								filtroModIDigestRichiestaEnabled, filtroModIInfoUtente,
								filtroModIKeystorePath, filtroModIAudience);
					}
					if(filtroProprieta) {
						DBUtils.setFiltriProprietaErogazione(sqlQueryObject, this.driver.tipoDB, 
								filtroProprietaNome, filtroProprietaValore);
					}
					if(filtroStatoAPIImpl!=null || 
							filtroAutenticazioneTokenPolicy!=null || filtroAutenticazioneTrasporto!=null || 
							filtroRateLimitingStato!=null || 
							filtroValidazioneStato!=null || 
							filtroCacheRispostaStato!=null ||
							filtroMessageSecurityStato!=null ||
							filtroMTOMStato!=null ||
							filtroTrasformazione!=null ||
							filtroConfigurazioneTransazioni!=null ||
							filtroCorrelazioneApplicativa!=null ||
							filtroConfigurazioneDumpTipo!=null ||
							filtroCORS!=null) {
						DBUtils.setFiltriConfigurazioneErogazione(sqlQueryObject, this.driver.tipoDB,
								filtroStatoAPIImpl,
								filtroAutenticazioneTokenPolicy, filtroAutenticazioneTrasporto,
								filtroRateLimitingStato,
								filtroValidazioneStato,
								filtroCacheRispostaStato,
								filtroMessageSecurityStato,
								filtroMTOMStato,
								filtroTrasformazione,
								filtroConfigurazioneTransazioni,
								filtroCorrelazioneApplicativa,
								filtroConfigurazioneDumpTipo,
								filtroCORS, filtroCORSorigin);
					}
				}
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
				if(filterSoggettoNome!=null && !"".equals(filterSoggettoNome)) {
					if(gestioneFruitori) {
						sqlQueryObject.addWhereCondition(aliasSoggettiFruitori+".tipo_soggetto=?");
						sqlQueryObject.addWhereCondition(aliasSoggettiFruitori+".nome_soggetto=?");
					}
					else {
						sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".tipo_soggetto=?");
						sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".nome_soggetto=?");
					}
				}
				if(this.driver.useSuperUser && superuser!=null && (!"".equals(superuser)))
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".superuser = ?");
				if(tipoServiziProtocollo!=null && tipoServiziProtocollo.size()>0) {
					sqlQueryObject.addWhereINCondition(CostantiDB.SERVIZI+".tipo_servizio", true, tipoServiziProtocollo.toArray(new String[1]));
				}
				if(filterTipoAPI!=null && !filterTipoAPI.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".service_binding = ?");
				}
				if(filterGruppo!=null && !filterGruppo.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.GRUPPI+".nome = ?");
				}
				if(idAccordoApi!=null) {
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".nome = ?");
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".versione = ?");
					sqlQueryObject.addWhereCondition(aliasSoggettiReferenti+".tipo_soggetto = ?");
					sqlQueryObject.addWhereCondition(aliasSoggettiReferenti+".nome_soggetto = ?");
				}
				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(filterStatoAccordo!=null && !filterStatoAccordo.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".stato = ?");
				}
				if(sqlQueryObjectSoggettiErogatoreContains!=null) {
					sqlQueryObject.addWhereExistsCondition(false, sqlQueryObjectSoggettiErogatoreContains);
				}
				sqlQueryObject.addWhereCondition(false, 
						
						// - ricerca su tipo/nome/versione servizio
						//sqlQueryObject.getWhereLikeCondition("tipo_servizio", search, true, true), 
						sqlQueryObject.getWhereLikeCondition("nome_servizio", searchAPIErogazioneFruizione, true, true),
						//sqlQueryObject.getWhereLikeCondition("versione_servizio", search, true, true),
						
						// - ricerca su nome dell'API (parte comune)
						sqlQueryObject.getWhereLikeCondition(CostantiDB.ACCORDI+".nome", searchAPIErogazioneFruizione, true, true)
						
					);

				if(permessiUtente != null){
					// solo S
					if(permessiUtente[0] && !permessiUtente[1])
						sqlQueryObject.addWhereExistsCondition(true, sqlQueryObjectAccordiComposti);

					// solo P
					if(!permessiUtente[0] && permessiUtente[1])
						sqlQueryObject.addWhereExistsCondition(false, sqlQueryObjectAccordiComposti);

					// P che S come ora non aggiungo la condizione
				}

				if(searchCanale) {
					String tabellaPorta = gestioneErogatori ? CostantiDB.PORTE_APPLICATIVE : CostantiDB.PORTE_DELEGATE;
					if(canaleDefault) {
						sqlQueryObject.addWhereCondition(false, 
								(tabellaPorta+".canale = ?"),
								("( "+ tabellaPorta+".canale is null AND ("+CostantiDB.ACCORDI+".canale = ?  OR "+CostantiDB.ACCORDI+".canale is null) )"));
					}
					else {
						sqlQueryObject.addWhereCondition(false, 
								(tabellaPorta+".canale = ?"),
								("( "+ tabellaPorta+".canale is null AND "+CostantiDB.ACCORDI+".canale = ? )"));
					}
				}
				
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			} else {
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				if(permessiUtente!=null || filterTipoAPI!=null || filterGruppo!=null || idAccordoApi!=null || searchCanale || filtroModI) {
					sqlQueryObject.addFromTable(CostantiDB.ACCORDI);
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_accordo="+CostantiDB.ACCORDI+".id");
					if(filterGruppo!=null) {
						sqlQueryObject.addFromTable(CostantiDB.ACCORDI_GRUPPI);
						sqlQueryObject.addFromTable(CostantiDB.GRUPPI);
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_GRUPPI+".id_accordo="+CostantiDB.ACCORDI+".id");
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_GRUPPI+".id_gruppo="+CostantiDB.GRUPPI+".id");
					}
					if(idAccordoApi!=null) {
						sqlQueryObject.addFromTable(CostantiDB.SOGGETTI, aliasSoggettiReferenti);
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".id_referente="+aliasSoggettiReferenti+".id");
					}
				}
				if(gestioneFruitori) {
					sqlQueryObject.addFromTable(CostantiDB.MAPPING_FRUIZIONE_PD);
					sqlQueryObject.addFromTable(CostantiDB.SERVIZI_FRUITORI);
					sqlQueryObject.addFromTable(CostantiDB.SOGGETTI, aliasSoggettiFruitori);
					if(searchCanale) {
						sqlQueryObject.addFromTable(CostantiDB.PORTE_DELEGATE);
					}
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".id_fruizione="+CostantiDB.SERVIZI_FRUITORI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".is_default=1");
					if(searchCanale) {
						sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".id_porta="+CostantiDB.PORTE_DELEGATE+".id");
					}
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_FRUITORI+".id_servizio="+CostantiDB.SERVIZI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_FRUITORI+".id_soggetto="+aliasSoggettiFruitori+".id");
					if(joinConnettore) {
						DBUtils.setFiltriConnettoreFruizione(sqlQueryObject, this.driver.tipoDB, 
								tipoConnettore, endpointType, tipoConnettoreIntegrationManager, 
								filtroConnettoreTokenPolicy, filtroConnettoreEndpoint, filtroConnettoreKeystore, filtroConnettoreDebug);
					}
					if(filtroModI) {
						DBUtils.setFiltriModIFruizione(sqlQueryObject, this.driver.tipoDB,
								filtroModISicurezzaCanale, filtroModISicurezzaMessaggio,
								filtroModISorgenteToken,
								filtroModIDigestRichiestaEnabled, filtroModIInfoUtente,
								filtroModIKeystorePath, filtroModIAudience);
					}
					if(filtroProprieta) {
						DBUtils.setFiltriProprietaFruizione(sqlQueryObject, this.driver.tipoDB, 
								filtroProprietaNome, filtroProprietaValore);
					}
					if(filtroStatoAPIImpl!=null || 
							filtroAutenticazioneTokenPolicy!=null || filtroAutenticazioneTrasporto!=null || 
							filtroRateLimitingStato!=null || 
							filtroValidazioneStato!=null || 
							filtroCacheRispostaStato!=null ||
							filtroMessageSecurityStato!=null ||
							filtroMTOMStato!=null ||
							filtroTrasformazione!=null ||
							filtroConfigurazioneTransazioni!=null ||
							filtroCorrelazioneApplicativa!=null ||
							filtroConfigurazioneDumpTipo!=null ||
							filtroCORS!=null) {
						DBUtils.setFiltriConfigurazioneFruizione(sqlQueryObject, this.driver.tipoDB,
								filtroStatoAPIImpl,
								filtroAutenticazioneTokenPolicy, filtroAutenticazioneTrasporto,
								filtroRateLimitingStato,
								filtroValidazioneStato,
								filtroCacheRispostaStato,
								filtroMessageSecurityStato,
								filtroMTOMStato,
								filtroTrasformazione,
								filtroConfigurazioneTransazioni,
								filtroCorrelazioneApplicativa,
								filtroConfigurazioneDumpTipo,
								filtroCORS, filtroCORSorigin);
					}
				}
				if(gestioneErogatori) {
					sqlQueryObject.addFromTable(CostantiDB.MAPPING_EROGAZIONE_PA);
					if(searchCanale) {
						sqlQueryObject.addFromTable(CostantiDB.PORTE_APPLICATIVE);
					}
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".id_erogazione="+CostantiDB.SERVIZI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".is_default=1");
					if(searchCanale) {
						sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".id_porta="+CostantiDB.PORTE_APPLICATIVE+".id");
					}
					if(joinConnettore) {
						DBUtils.setFiltriConnettoreErogazione(sqlQueryObject, this.driver.tipoDB, 
								tipoConnettore, endpointType, tipoConnettoreIntegrationManager, 
								filtroConnettoreTokenPolicy, filtroConnettoreEndpoint, filtroConnettoreKeystore, filtroConnettoreDebug);
					}
					if(filtroModI) {
						DBUtils.setFiltriModIErogazione(sqlQueryObject, this.driver.tipoDB,
								filtroModISicurezzaCanale, filtroModISicurezzaMessaggio,
								filtroModISorgenteToken,
								filtroModIDigestRichiestaEnabled, filtroModIInfoUtente,
								filtroModIKeystorePath, filtroModIAudience);
					}
					if(filtroProprieta) {
						DBUtils.setFiltriProprietaErogazione(sqlQueryObject, this.driver.tipoDB, 
								filtroProprietaNome, filtroProprietaValore);
					}
					if(filtroStatoAPIImpl!=null || 
							filtroAutenticazioneTokenPolicy!=null || filtroAutenticazioneTrasporto!=null || 
							filtroRateLimitingStato!=null || 
							filtroValidazioneStato!=null || 
							filtroCacheRispostaStato!=null ||
							filtroMessageSecurityStato!=null ||
							filtroMTOMStato!=null ||
							filtroTrasformazione!=null ||
							filtroConfigurazioneTransazioni!=null ||
							filtroCorrelazioneApplicativa!=null ||
							filtroConfigurazioneDumpTipo!=null ||
							filtroCORS!=null) {
						DBUtils.setFiltriConfigurazioneErogazione(sqlQueryObject, this.driver.tipoDB,
								filtroStatoAPIImpl,
								filtroAutenticazioneTokenPolicy, filtroAutenticazioneTrasporto,
								filtroRateLimitingStato,
								filtroValidazioneStato,
								filtroCacheRispostaStato,
								filtroMessageSecurityStato,
								filtroMTOMStato,
								filtroTrasformazione,
								filtroConfigurazioneTransazioni,
								filtroCorrelazioneApplicativa,
								filtroConfigurazioneDumpTipo,
								filtroCORS, filtroCORSorigin);
					}
				}
				sqlQueryObject.addSelectCountField("*", "cont");
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
				if(filterSoggettoNome!=null && !"".equals(filterSoggettoNome)) {
					if(gestioneFruitori) {
						sqlQueryObject.addWhereCondition(aliasSoggettiFruitori+".tipo_soggetto=?");
						sqlQueryObject.addWhereCondition(aliasSoggettiFruitori+".nome_soggetto=?");
					}
					else {
						sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".tipo_soggetto=?");
						sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".nome_soggetto=?");
					}
				}
				if(this.driver.useSuperUser && superuser!=null && (!"".equals(superuser)))
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".superuser = ?");
				if(tipoServiziProtocollo!=null && tipoServiziProtocollo.size()>0) {
					sqlQueryObject.addWhereINCondition(CostantiDB.SERVIZI+".tipo_servizio", true, tipoServiziProtocollo.toArray(new String[1]));
				}
				if(filterTipoAPI!=null && !filterTipoAPI.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".service_binding = ?");
				}
				if(filterGruppo!=null && !filterGruppo.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.GRUPPI+".nome = ?");
				}
				if(idAccordoApi!=null) {
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".nome = ?");
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".versione = ?");
					sqlQueryObject.addWhereCondition(aliasSoggettiReferenti+".tipo_soggetto = ?");
					sqlQueryObject.addWhereCondition(aliasSoggettiReferenti+".nome_soggetto = ?");
				}
				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(filterStatoAccordo!=null && !filterStatoAccordo.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".stato = ?");
				}
				if(sqlQueryObjectSoggettiErogatoreContains!=null) {
					sqlQueryObject.addWhereExistsCondition(false, sqlQueryObjectSoggettiErogatoreContains);
				}

				if(permessiUtente != null){
					// solo S
					if(permessiUtente[0] && !permessiUtente[1])
						sqlQueryObject.addWhereExistsCondition(true, sqlQueryObjectAccordiComposti);

					// solo P
					if(!permessiUtente[0] && permessiUtente[1])
						sqlQueryObject.addWhereExistsCondition(false, sqlQueryObjectAccordiComposti);

					// P che S come ora non aggiungo la condizione
				}

				if(searchCanale) {
					String tabellaPorta = gestioneErogatori ? CostantiDB.PORTE_APPLICATIVE : CostantiDB.PORTE_DELEGATE;
					if(canaleDefault) {
						sqlQueryObject.addWhereCondition(false, 
								(tabellaPorta+".canale = ?"),
								("( "+ tabellaPorta+".canale is null AND ("+CostantiDB.ACCORDI+".canale = ?  OR "+CostantiDB.ACCORDI+".canale is null) )"));
					}
					else {
						sqlQueryObject.addWhereCondition(false, 
								(tabellaPorta+".canale = ?"),
								("( "+ tabellaPorta+".canale is null AND "+CostantiDB.ACCORDI+".canale = ? )"));
					}
				}
				
				sqlQueryObject.setANDLogicOperator(true);
				queryString = sqlQueryObject.createSQLQuery();
			}
			stmt = con.prepareStatement(queryString);
			int index = 1;
			if(filterSoggettoNome!=null && !"".equals(filterSoggettoNome)) {
				stmt.setString(index++, filterSoggettoTipo);
				stmt.setString(index++, filterSoggettoNome);
			}
			if(this.driver.useSuperUser && superuser!=null && (!"".equals(superuser)))
				stmt.setString(index++, superuser);
			if(filterTipoAPI!=null && !filterTipoAPI.equals("")) {
				stmt.setString(index++, filterTipoAPI);
			}
			if(filterGruppo!=null && !filterGruppo.equals("")) {
				stmt.setString(index++, filterGruppo);
			}
			if(idAccordoApi!=null) {
				stmt.setString(index++, idAccordoApi.getNome());
				stmt.setInt(index++, idAccordoApi.getVersione());
				stmt.setString(index++, idAccordoApi.getSoggettoReferente().getTipo());
				stmt.setString(index++, idAccordoApi.getSoggettoReferente().getNome());
			}
			if(pddTipologia!=null) {
				stmt.setString(index++, pddTipologia.toString());
			}
			if(filterStatoAccordo!=null && !filterStatoAccordo.equals("")) {
				stmt.setString(index++, filterStatoAccordo);
			}
			if(searchCanale) {
				stmt.setString(index++, filterCanale);
				stmt.setString(index++, filterCanale);
			}
			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 (!searchAPIErogazioneFruizione.equals("")) { // con search
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SERVIZI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				if(permessiUtente!=null || filterTipoAPI!=null || filterGruppo!=null || idAccordoApi!=null || searchCanale || filtroModI
						|| !searchAPIErogazioneFruizione.equals("") // aggiunto per cercare anche sul nome dell'API (parte comune)
					) {
					sqlQueryObject.addFromTable(CostantiDB.ACCORDI);
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_accordo="+CostantiDB.ACCORDI+".id");
					if(filterGruppo!=null) {
						sqlQueryObject.addFromTable(CostantiDB.ACCORDI_GRUPPI);
						sqlQueryObject.addFromTable(CostantiDB.GRUPPI);
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_GRUPPI+".id_accordo="+CostantiDB.ACCORDI+".id");
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_GRUPPI+".id_gruppo="+CostantiDB.GRUPPI+".id");
					}
					if(idAccordoApi!=null) {
						sqlQueryObject.addFromTable(CostantiDB.SOGGETTI, aliasSoggettiReferenti);
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".id_referente="+aliasSoggettiReferenti+".id");
					}
				}
				if(gestioneFruitori) {
					sqlQueryObject.addFromTable(CostantiDB.MAPPING_FRUIZIONE_PD);
					sqlQueryObject.addFromTable(CostantiDB.SERVIZI_FRUITORI);
					sqlQueryObject.addFromTable(CostantiDB.SOGGETTI, aliasSoggettiFruitori);
					if(searchCanale) {
						sqlQueryObject.addFromTable(CostantiDB.PORTE_DELEGATE);
					}
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".id_fruizione="+CostantiDB.SERVIZI_FRUITORI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".is_default=1");
					if(searchCanale) {
						sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".id_porta="+CostantiDB.PORTE_DELEGATE+".id");
					}
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_FRUITORI+".id_servizio="+CostantiDB.SERVIZI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_FRUITORI+".id_soggetto="+aliasSoggettiFruitori+".id");
					if(joinConnettore) {
						DBUtils.setFiltriConnettoreFruizione(sqlQueryObject, this.driver.tipoDB, 
								tipoConnettore, endpointType, tipoConnettoreIntegrationManager, 
								filtroConnettoreTokenPolicy, filtroConnettoreEndpoint, filtroConnettoreKeystore, filtroConnettoreDebug);
					}
					if(filtroModI) {
						DBUtils.setFiltriModIFruizione(sqlQueryObject, this.driver.tipoDB,
								filtroModISicurezzaCanale, filtroModISicurezzaMessaggio,
								filtroModISorgenteToken,
								filtroModIDigestRichiestaEnabled, filtroModIInfoUtente,
								filtroModIKeystorePath, filtroModIAudience);
					}
					if(filtroProprieta) {
						DBUtils.setFiltriProprietaFruizione(sqlQueryObject, this.driver.tipoDB, 
								filtroProprietaNome, filtroProprietaValore);
					}
					if(filtroStatoAPIImpl!=null || 
							filtroAutenticazioneTokenPolicy!=null || filtroAutenticazioneTrasporto!=null || 
							filtroRateLimitingStato!=null || 
							filtroValidazioneStato!=null || 
							filtroCacheRispostaStato!=null ||
							filtroMessageSecurityStato!=null ||
							filtroMTOMStato!=null ||
							filtroTrasformazione!=null ||
							filtroConfigurazioneTransazioni!=null ||
							filtroCorrelazioneApplicativa!=null ||
							filtroConfigurazioneDumpTipo!=null ||
							filtroCORS!=null) {
						DBUtils.setFiltriConfigurazioneFruizione(sqlQueryObject, this.driver.tipoDB,
								filtroStatoAPIImpl,
								filtroAutenticazioneTokenPolicy, filtroAutenticazioneTrasporto,
								filtroRateLimitingStato,
								filtroValidazioneStato,
								filtroCacheRispostaStato,
								filtroMessageSecurityStato,
								filtroMTOMStato,
								filtroTrasformazione,
								filtroConfigurazioneTransazioni,
								filtroCorrelazioneApplicativa,
								filtroConfigurazioneDumpTipo,
								filtroCORS, filtroCORSorigin);
					}
				}
				if(gestioneErogatori) {
					sqlQueryObject.addFromTable(CostantiDB.MAPPING_EROGAZIONE_PA);
					if(searchCanale) {
						sqlQueryObject.addFromTable(CostantiDB.PORTE_APPLICATIVE);
					}
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".id_erogazione="+CostantiDB.SERVIZI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".is_default=1");
					if(searchCanale) {
						sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".id_porta="+CostantiDB.PORTE_APPLICATIVE+".id");
					}
					if(joinConnettore) {
						DBUtils.setFiltriConnettoreErogazione(sqlQueryObject, this.driver.tipoDB, 
								tipoConnettore, endpointType, tipoConnettoreIntegrationManager, 
								filtroConnettoreTokenPolicy, filtroConnettoreEndpoint, filtroConnettoreKeystore, filtroConnettoreDebug);
					}
					if(filtroModI) {
						DBUtils.setFiltriModIErogazione(sqlQueryObject, this.driver.tipoDB,
								filtroModISicurezzaCanale, filtroModISicurezzaMessaggio,
								filtroModISorgenteToken,
								filtroModIDigestRichiestaEnabled, filtroModIInfoUtente,
								filtroModIKeystorePath, filtroModIAudience);
					}
					if(filtroProprieta) {
						DBUtils.setFiltriProprietaErogazione(sqlQueryObject, this.driver.tipoDB, 
								filtroProprietaNome, filtroProprietaValore);
					}
					if(filtroStatoAPIImpl!=null || 
							filtroAutenticazioneTokenPolicy!=null || filtroAutenticazioneTrasporto!=null || 
							filtroRateLimitingStato!=null || 
							filtroValidazioneStato!=null || 
							filtroCacheRispostaStato!=null ||
							filtroMessageSecurityStato!=null ||
							filtroMTOMStato!=null ||
							filtroTrasformazione!=null ||
							filtroConfigurazioneTransazioni!=null ||
							filtroCorrelazioneApplicativa!=null ||
							filtroConfigurazioneDumpTipo!=null ||
							filtroCORS!=null) {
						DBUtils.setFiltriConfigurazioneErogazione(sqlQueryObject, this.driver.tipoDB,
								filtroStatoAPIImpl,
								filtroAutenticazioneTokenPolicy, filtroAutenticazioneTrasporto,
								filtroRateLimitingStato,
								filtroValidazioneStato,
								filtroCacheRispostaStato,
								filtroMessageSecurityStato,
								filtroMTOMStato,
								filtroTrasformazione,
								filtroConfigurazioneTransazioni,
								filtroCorrelazioneApplicativa,
								filtroConfigurazioneDumpTipo,
								filtroCORS, filtroCORSorigin);
					}
				}
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".id");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".nome_servizio", "nomeServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".tipo_servizio", "tipoServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".versione_servizio", "versioneServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".id_soggetto","idSoggettoErogatore");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".id_accordo");
				sqlQueryObject.addSelectField("servizio_correlato");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".stato","statoServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI,"descrizione","descrizioneServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SOGGETTI+".nome_soggetto","nomeSoggettoErogatore");
				sqlQueryObject.addSelectAliasField(CostantiDB.SOGGETTI+".tipo_soggetto","tipoSoggettoErogatore");
				sqlQueryObject.addSelectField("port_type");
				if(gestioneFruitori) {
					sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI_FRUITORI+".id","idFruizione");
					sqlQueryObject.addSelectAliasField(aliasSoggettiFruitori+".id","idSoggettoFruitore");
					sqlQueryObject.addSelectAliasField(aliasSoggettiFruitori+".nome_soggetto","nomeSoggettoFruitore");
					sqlQueryObject.addSelectAliasField(aliasSoggettiFruitori+".tipo_soggetto","tipoSoggettoFruitore");
				}
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
				if(filterSoggettoNome!=null && !"".equals(filterSoggettoNome)) {
					if(gestioneFruitori) {
						sqlQueryObject.addWhereCondition(aliasSoggettiFruitori+".tipo_soggetto=?");
						sqlQueryObject.addWhereCondition(aliasSoggettiFruitori+".nome_soggetto=?");
					}
					else {
						sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".tipo_soggetto=?");
						sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".nome_soggetto=?");
					}
				}
				if(this.driver.useSuperUser && superuser!=null && (!"".equals(superuser)))
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".superuser = ?");
				if(tipoServiziProtocollo!=null && tipoServiziProtocollo.size()>0) {
					sqlQueryObject.addWhereINCondition(CostantiDB.SERVIZI+".tipo_servizio", true, tipoServiziProtocollo.toArray(new String[1]));
				}
				if(filterTipoAPI!=null && !filterTipoAPI.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".service_binding = ?");
				}
				if(filterGruppo!=null && !filterGruppo.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.GRUPPI+".nome = ?");
				}
				if(idAccordoApi!=null) {
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".nome = ?");
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".versione = ?");
					sqlQueryObject.addWhereCondition(aliasSoggettiReferenti+".tipo_soggetto = ?");
					sqlQueryObject.addWhereCondition(aliasSoggettiReferenti+".nome_soggetto = ?");
				}
				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(filterStatoAccordo!=null && !filterStatoAccordo.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".stato = ?");
				}
				if(sqlQueryObjectSoggettiErogatoreContains!=null) {
					sqlQueryObject.addWhereExistsCondition(false, sqlQueryObjectSoggettiErogatoreContains);
				}
				sqlQueryObject.addWhereCondition(false, 
						
						// - ricerca su tipo/nome/versione servizio
						//sqlQueryObject.getWhereLikeCondition("tipo_servizio", search, true, true), 
						sqlQueryObject.getWhereLikeCondition("nome_servizio", searchAPIErogazioneFruizione, true, true),
						//sqlQueryObject.getWhereLikeCondition("versione_servizio", search, true, true),
						
						// - ricerca su nome dell'API (parte comune)
						sqlQueryObject.getWhereLikeCondition(CostantiDB.ACCORDI+".nome", searchAPIErogazioneFruizione, true, true)
					);
				
				if(permessiUtente != null){
					// solo S
					if(permessiUtente[0] && !permessiUtente[1])
						sqlQueryObject.addWhereExistsCondition(true, sqlQueryObjectAccordiComposti);

					// solo P
					if(!permessiUtente[0] && permessiUtente[1])
						sqlQueryObject.addWhereExistsCondition(false, sqlQueryObjectAccordiComposti);

					// P che S come ora non aggiungo la condizione
				}
				
				if(searchCanale) {
					String tabellaPorta = gestioneErogatori ? CostantiDB.PORTE_APPLICATIVE : CostantiDB.PORTE_DELEGATE;
					if(canaleDefault) {
						sqlQueryObject.addWhereCondition(false, 
								(tabellaPorta+".canale = ?"),
								("( "+ tabellaPorta+".canale is null AND ("+CostantiDB.ACCORDI+".canale = ?  OR "+CostantiDB.ACCORDI+".canale is null) )"));
					}
					else {
						sqlQueryObject.addWhereCondition(false, 
								(tabellaPorta+".canale = ?"),
								("( "+ tabellaPorta+".canale is null AND "+CostantiDB.ACCORDI+".canale = ? )"));
					}
				}
				
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy("nomeServizio");
				sqlQueryObject.addOrderBy("versioneServizio");
				sqlQueryObject.addOrderBy("nomeSoggettoErogatore");
				sqlQueryObject.addOrderBy("tipoServizio");
				sqlQueryObject.addOrderBy("tipoSoggettoErogatore");
				if(gestioneFruitori) {
					sqlQueryObject.addOrderBy("nomeSoggettoFruitore");
					sqlQueryObject.addOrderBy("tipoSoggettoFruitore");
				}

				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.SERVIZI);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				if(permessiUtente!=null || filterTipoAPI!=null || filterGruppo!=null || idAccordoApi!=null || searchCanale || filtroModI) {
					sqlQueryObject.addFromTable(CostantiDB.ACCORDI);
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_accordo="+CostantiDB.ACCORDI+".id");
					if(filterGruppo!=null) {
						sqlQueryObject.addFromTable(CostantiDB.ACCORDI_GRUPPI);
						sqlQueryObject.addFromTable(CostantiDB.GRUPPI);
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_GRUPPI+".id_accordo="+CostantiDB.ACCORDI+".id");
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI_GRUPPI+".id_gruppo="+CostantiDB.GRUPPI+".id");
					}
					if(idAccordoApi!=null) {
						sqlQueryObject.addFromTable(CostantiDB.SOGGETTI, aliasSoggettiReferenti);
						sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".id_referente="+aliasSoggettiReferenti+".id");
					}
				}
				if(gestioneFruitori) {
					sqlQueryObject.addFromTable(CostantiDB.MAPPING_FRUIZIONE_PD);
					sqlQueryObject.addFromTable(CostantiDB.SERVIZI_FRUITORI);
					sqlQueryObject.addFromTable(CostantiDB.SOGGETTI, aliasSoggettiFruitori);
					if(searchCanale) {
						sqlQueryObject.addFromTable(CostantiDB.PORTE_DELEGATE);
					}
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".id_fruizione="+CostantiDB.SERVIZI_FRUITORI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".is_default=1");
					if(searchCanale) {
						sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_FRUIZIONE_PD+".id_porta="+CostantiDB.PORTE_DELEGATE+".id");
					}
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_FRUITORI+".id_servizio="+CostantiDB.SERVIZI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_FRUITORI+".id_soggetto="+aliasSoggettiFruitori+".id");
					if(joinConnettore) {
						DBUtils.setFiltriConnettoreFruizione(sqlQueryObject, this.driver.tipoDB, 
								tipoConnettore, endpointType, tipoConnettoreIntegrationManager, 
								filtroConnettoreTokenPolicy, filtroConnettoreEndpoint, filtroConnettoreKeystore, filtroConnettoreDebug);
					}
					if(filtroModI) {
						DBUtils.setFiltriModIFruizione(sqlQueryObject, this.driver.tipoDB,
								filtroModISicurezzaCanale, filtroModISicurezzaMessaggio,
								filtroModISorgenteToken,
								filtroModIDigestRichiestaEnabled, filtroModIInfoUtente,
								filtroModIKeystorePath, filtroModIAudience);
					}
					if(filtroProprieta) {
						DBUtils.setFiltriProprietaFruizione(sqlQueryObject, this.driver.tipoDB, 
								filtroProprietaNome, filtroProprietaValore);
					}
					if(filtroStatoAPIImpl!=null || 
							filtroAutenticazioneTokenPolicy!=null || filtroAutenticazioneTrasporto!=null || 
							filtroRateLimitingStato!=null || 
							filtroValidazioneStato!=null || 
							filtroCacheRispostaStato!=null ||
							filtroMessageSecurityStato!=null ||
							filtroMTOMStato!=null ||
							filtroTrasformazione!=null ||
							filtroConfigurazioneTransazioni!=null ||
							filtroCorrelazioneApplicativa!=null ||
							filtroConfigurazioneDumpTipo!=null ||
							filtroCORS!=null) {
						DBUtils.setFiltriConfigurazioneFruizione(sqlQueryObject, this.driver.tipoDB,
								filtroStatoAPIImpl,
								filtroAutenticazioneTokenPolicy, filtroAutenticazioneTrasporto,
								filtroRateLimitingStato,
								filtroValidazioneStato,
								filtroCacheRispostaStato,
								filtroMessageSecurityStato,
								filtroMTOMStato,
								filtroTrasformazione,
								filtroConfigurazioneTransazioni,
								filtroCorrelazioneApplicativa,
								filtroConfigurazioneDumpTipo,
								filtroCORS, filtroCORSorigin);
					}
				}
				if(gestioneErogatori) {
					sqlQueryObject.addFromTable(CostantiDB.MAPPING_EROGAZIONE_PA);
					if(searchCanale) {
						sqlQueryObject.addFromTable(CostantiDB.PORTE_APPLICATIVE);
					}
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".id_erogazione="+CostantiDB.SERVIZI+".id");
					sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".is_default=1");
					if(searchCanale) {
						sqlQueryObject.addWhereCondition(CostantiDB.MAPPING_EROGAZIONE_PA+".id_porta="+CostantiDB.PORTE_APPLICATIVE+".id");
					}
					if(joinConnettore) {
						DBUtils.setFiltriConnettoreErogazione(sqlQueryObject, this.driver.tipoDB, 
								tipoConnettore, endpointType, tipoConnettoreIntegrationManager, 
								filtroConnettoreTokenPolicy, filtroConnettoreEndpoint, filtroConnettoreKeystore, filtroConnettoreDebug);
					}
					if(filtroModI) {
						DBUtils.setFiltriModIErogazione(sqlQueryObject, this.driver.tipoDB,
								filtroModISicurezzaCanale, filtroModISicurezzaMessaggio,
								filtroModISorgenteToken,
								filtroModIDigestRichiestaEnabled, filtroModIInfoUtente,
								filtroModIKeystorePath, filtroModIAudience);
					}
					if(filtroProprieta) {
						DBUtils.setFiltriProprietaErogazione(sqlQueryObject, this.driver.tipoDB, 
								filtroProprietaNome, filtroProprietaValore);
					}
					if(filtroStatoAPIImpl!=null || 
							filtroAutenticazioneTokenPolicy!=null || filtroAutenticazioneTrasporto!=null || 
							filtroRateLimitingStato!=null || 
							filtroValidazioneStato!=null || 
							filtroCacheRispostaStato!=null ||
							filtroMessageSecurityStato!=null ||
							filtroMTOMStato!=null ||
							filtroTrasformazione!=null ||
							filtroConfigurazioneTransazioni!=null ||
							filtroCorrelazioneApplicativa!=null ||
							filtroConfigurazioneDumpTipo!=null ||
							filtroCORS!=null) {
						DBUtils.setFiltriConfigurazioneErogazione(sqlQueryObject, this.driver.tipoDB,
								filtroStatoAPIImpl,
								filtroAutenticazioneTokenPolicy, filtroAutenticazioneTrasporto,
								filtroRateLimitingStato,
								filtroValidazioneStato,
								filtroCacheRispostaStato,
								filtroMessageSecurityStato,
								filtroMTOMStato,
								filtroTrasformazione,
								filtroConfigurazioneTransazioni,
								filtroCorrelazioneApplicativa,
								filtroConfigurazioneDumpTipo,
								filtroCORS, filtroCORSorigin);
					}
				}
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".id");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".nome_servizio", "nomeServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".tipo_servizio", "tipoServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".versione_servizio", "versioneServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".id_soggetto","idSoggettoErogatore");
				sqlQueryObject.addSelectField(CostantiDB.SERVIZI+".id_accordo");
				sqlQueryObject.addSelectField("servizio_correlato");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI+".stato","statoServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI,"descrizione","descrizioneServizio");
				sqlQueryObject.addSelectAliasField(CostantiDB.SOGGETTI+".nome_soggetto","nomeSoggettoErogatore");
				sqlQueryObject.addSelectAliasField(CostantiDB.SOGGETTI+".tipo_soggetto","tipoSoggettoErogatore");
				sqlQueryObject.addSelectField("port_type");
				if(gestioneFruitori) {
					sqlQueryObject.addSelectAliasField(CostantiDB.SERVIZI_FRUITORI+".id","idFruizione");
					sqlQueryObject.addSelectAliasField(aliasSoggettiFruitori+".id","idSoggettoFruitore");
					sqlQueryObject.addSelectAliasField(aliasSoggettiFruitori+".nome_soggetto","nomeSoggettoFruitore");
					sqlQueryObject.addSelectAliasField(aliasSoggettiFruitori+".tipo_soggetto","tipoSoggettoFruitore");
				}
				sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".id_soggetto = "+CostantiDB.SOGGETTI+".id");
				if(filterSoggettoNome!=null && !"".equals(filterSoggettoNome)) {
					if(gestioneFruitori) {
						sqlQueryObject.addWhereCondition(aliasSoggettiFruitori+".tipo_soggetto=?");
						sqlQueryObject.addWhereCondition(aliasSoggettiFruitori+".nome_soggetto=?");
					}
					else {
						sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".tipo_soggetto=?");
						sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".nome_soggetto=?");
					}
				}
				if(this.driver.useSuperUser && superuser!=null && (!"".equals(superuser)))
					sqlQueryObject.addWhereCondition(CostantiDB.SOGGETTI+".superuser = ?");
				
				if(tipoServiziProtocollo!=null && tipoServiziProtocollo.size()>0) {
					sqlQueryObject.addWhereINCondition(CostantiDB.SERVIZI+".tipo_servizio", true, tipoServiziProtocollo.toArray(new String[1]));
				}
				if(filterTipoAPI!=null && !filterTipoAPI.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".service_binding = ?");
				}
				if(filterGruppo!=null && !filterGruppo.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.GRUPPI+".nome = ?");
				}
				if(idAccordoApi!=null) {
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".nome = ?");
					sqlQueryObject.addWhereCondition(CostantiDB.ACCORDI+".versione = ?");
					sqlQueryObject.addWhereCondition(aliasSoggettiReferenti+".tipo_soggetto = ?");
					sqlQueryObject.addWhereCondition(aliasSoggettiReferenti+".nome_soggetto = ?");
				}
				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(filterStatoAccordo!=null && !filterStatoAccordo.equals("")) {
					sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI+".stato = ?");
				}
				if(sqlQueryObjectSoggettiErogatoreContains!=null) {
					sqlQueryObject.addWhereExistsCondition(false, sqlQueryObjectSoggettiErogatoreContains);
				}
				
				if(permessiUtente != null){
					// solo S
					if(permessiUtente[0] && !permessiUtente[1])
						sqlQueryObject.addWhereExistsCondition(true, sqlQueryObjectAccordiComposti);

					// solo P
					if(!permessiUtente[0] && permessiUtente[1])
						sqlQueryObject.addWhereExistsCondition(false, sqlQueryObjectAccordiComposti);

					// P che S come ora non aggiungo la condizione
				}
				
				if(searchCanale) {
					String tabellaPorta = gestioneErogatori ? CostantiDB.PORTE_APPLICATIVE : CostantiDB.PORTE_DELEGATE;
					if(canaleDefault) {
						sqlQueryObject.addWhereCondition(false, 
								(tabellaPorta+".canale = ?"),
								("( "+ tabellaPorta+".canale is null AND ("+CostantiDB.ACCORDI+".canale = ?  OR "+CostantiDB.ACCORDI+".canale is null) )"));
					}
					else {
						sqlQueryObject.addWhereCondition(false, 
								(tabellaPorta+".canale = ?"),
								("( "+ tabellaPorta+".canale is null AND "+CostantiDB.ACCORDI+".canale = ? )"));
					}
				}
				
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addOrderBy("nomeServizio");
				sqlQueryObject.addOrderBy("versioneServizio");
				sqlQueryObject.addOrderBy("nomeSoggettoErogatore");
				sqlQueryObject.addOrderBy("tipoServizio");
				sqlQueryObject.addOrderBy("tipoSoggettoErogatore");
				if(gestioneFruitori) {
					sqlQueryObject.addOrderBy("nomeSoggettoFruitore");
					sqlQueryObject.addOrderBy("tipoSoggettoFruitore");
				}

				sqlQueryObject.setSortType(true);
				sqlQueryObject.setLimit(limit);
				sqlQueryObject.setOffset(offset);
				queryString = sqlQueryObject.createSQLQuery();
			}

			this.driver.logDebug("query : " + queryString);

			stmt = con.prepareStatement(queryString);
			index = 1;
			if(filterSoggettoNome!=null && !"".equals(filterSoggettoNome)) {
				stmt.setString(index++, filterSoggettoTipo);
				stmt.setString(index++, filterSoggettoNome);
			}
			if(this.driver.useSuperUser && superuser!=null && (!"".equals(superuser)))
				stmt.setString(index++, superuser);
			if(filterTipoAPI!=null && !filterTipoAPI.equals("")) {
				stmt.setString(index++, filterTipoAPI);
			}
			if(filterGruppo!=null && !filterGruppo.equals("")) {
				stmt.setString(index++, filterGruppo);
			}
			if(idAccordoApi!=null) {
				stmt.setString(index++, idAccordoApi.getNome());
				stmt.setInt(index++, idAccordoApi.getVersione());
				stmt.setString(index++, idAccordoApi.getSoggettoReferente().getTipo());
				stmt.setString(index++, idAccordoApi.getSoggettoReferente().getNome());
			}
			if(pddTipologia!=null) {
				stmt.setString(index++, pddTipologia.toString());
			}
			if(filterStatoAccordo!=null && !filterStatoAccordo.equals("")) {
				stmt.setString(index++, filterStatoAccordo);
			}
			if(searchCanale) {
				stmt.setString(index++, filterCanale);
				stmt.setString(index++, filterCanale);
			}
			risultato = stmt.executeQuery();

			while (risultato.next()) {
				AccordoServizioParteSpecifica serv = new AccordoServizioParteSpecifica();
				
				serv.setId(risultato.getLong("id"));
				serv.setNome(risultato.getString("nomeServizio"));
				serv.setTipo(risultato.getString("tipoServizio"));
				serv.setVersione(risultato.getInt("versioneServizio"));
				serv.setPortType(risultato.getString("port_type"));
				serv.setIdSoggetto(risultato.getLong("idSoggettoErogatore"));
				serv.setIdAccordo(risultato.getLong("id_accordo"));
				String servizioCorrelato = risultato.getString("servizio_correlato");
				if( (servizioCorrelato != null) && 
						(servizioCorrelato.equalsIgnoreCase(CostantiRegistroServizi.ABILITATO.toString()) ||
								TipologiaServizio.CORRELATO.toString().equals(servizioCorrelato))){
					serv.setTipologiaServizio(TipologiaServizio.CORRELATO);
				}else{
					serv.setTipologiaServizio(TipologiaServizio.NORMALE);
				}
				serv.setDescrizione(risultato.getString("descrizioneServizio"));

				// informazioni su soggetto
				Soggetto sog = this.driver.getSoggetto(serv.getIdSoggetto(),con);
				String nomeErogatore = sog.getNome();
				String tipoErogatore = sog.getTipo();

				serv.setNomeSoggettoErogatore(nomeErogatore);
				serv.setTipoSoggettoErogatore(tipoErogatore);

				// informazioni su accordo
				IDAccordo idAccordo = this.driver.getIdAccordoServizioParteComune(serv.getIdAccordo(), con);
				serv.setAccordoServizioParteComune(this.driver.idAccordoFactory.getUriFromIDAccordo(idAccordo));

				// Stato
				serv.setStatoPackage(risultato.getString("statoServizio"));
				
				if(gestioneFruitori) {
					
					Fruitore fruitore = new Fruitore();
					fruitore.setId(risultato.getLong("idFruizione"));
					fruitore.setTipo(risultato.getString("tipoSoggettoFruitore"));
					fruitore.setNome(risultato.getString("nomeSoggettoFruitore"));
					fruitore.setIdServizio(serv.getId());
					fruitore.setIdSoggetto(risultato.getLong("idSoggettoFruitore"));
					
					serv.addFruitore(fruitore);
				}

				serviziList.add(serv);
			}

			return serviziList;

		} 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);
		}
	}
}