DriverConfigurazioneDB_porteTrasformazioniDriver.java

/*
 * GovWay - A customizable API Gateway 
 * https://govway.org
 * 
 * Copyright (c) 2005-2024 Link.it srl (https://link.it). 
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3, as published by
 * the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.openspcoop2.core.config.driver.db;

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

import org.openspcoop2.core.commons.DBUtils;
import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.commons.Liste;
import org.openspcoop2.core.config.TrasformazioneRegola;
import org.openspcoop2.core.config.TrasformazioneRegolaApplicabilitaRichiesta;
import org.openspcoop2.core.config.TrasformazioneRegolaApplicabilitaRisposta;
import org.openspcoop2.core.config.TrasformazioneRegolaApplicabilitaServizioApplicativo;
import org.openspcoop2.core.config.TrasformazioneRegolaApplicabilitaSoggetto;
import org.openspcoop2.core.config.TrasformazioneRegolaParametro;
import org.openspcoop2.core.config.TrasformazioneRegolaRichiesta;
import org.openspcoop2.core.config.TrasformazioneRegolaRisposta;
import org.openspcoop2.core.config.TrasformazioneRest;
import org.openspcoop2.core.config.TrasformazioneSoap;
import org.openspcoop2.core.config.TrasformazioneSoapRisposta;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.utils.jdbc.IJDBCAdapter;
import org.openspcoop2.utils.jdbc.JDBCAdapterFactory;
import org.openspcoop2.utils.jdbc.JDBCUtilities;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.SQLObjectFactory;

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

	private DriverConfigurazioneDB driver = null;
	
	protected DriverConfigurazioneDB_porteTrasformazioniDriver(DriverConfigurazioneDB driver) {
		this.driver = driver;
	}
	
	protected List<TrasformazioneRegola> porteDelegateTrasformazioniList(long idPA, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_DELEGATE_TRASFORMAZIONI;
		String nomeMetodo = "porteDelegateTrasformazioniList";
		boolean delegata = true;
		return getEngineTrasformazioniList(idPA, ricerca, idLista, nomeMetodo, delegata);
	}
	
	protected List<TrasformazioneRegola> porteApplicativeTrasformazioniList(long idPA, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeMetodo = "porteApplicativeTrasformazioniList";
		boolean delegata = false;
		return getEngineTrasformazioniList(idPA, ricerca, idLista, nomeMetodo, delegata);
	}
	
	private List<TrasformazioneRegola> getEngineTrasformazioniList(long idPA, ISearch ricerca, int idLista, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		int offset; 
		int limit;
		String queryString;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);

		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		PreparedStatement stm1 = null;
		ResultSet rs1 = null;
		PreparedStatement stm0 = null;
		ResultSet rs0 = null;
		
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<TrasformazioneRegola> lista = new ArrayList<TrasformazioneRegola>();
		try {
			
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectCountField(nomeTabella+".id", "cont");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);

			rs = stmt.executeQuery();
			if (rs.next())
				ricerca.setNumEntries(idLista,rs.getInt(1));
			rs.close();
			stmt.close();

			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectField("id_porta");
			sqlQueryObject.addSelectField("nome");
			sqlQueryObject.addSelectField("posizione");
			sqlQueryObject.addSelectField("id");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addOrderBy(nomeTabella+".posizione");
			sqlQueryObject.addOrderBy(nomeTabella+".nome");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);

			rs = stmt.executeQuery();

			List<Long> idTrasformazione = new ArrayList<>();			
			while (rs.next()) {
				
				idTrasformazione.add(rs.getLong("id"));
				
			}
			rs.close();
			stmt.close();
			
			if(idTrasformazione!=null && !idTrasformazione.isEmpty()) {
			
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
				sqlQueryObject.addFromTable(nomeTabella);
				sqlQueryObject.addSelectField("*");
				sqlQueryObject.setANDLogicOperator(true);
				sqlQueryObject.addWhereCondition("id = ?");
				queryString = sqlQueryObject.createSQLQuery();
				
				for (Long idLongTrasformazione : idTrasformazione) {
					
					stmt = con.prepareStatement(queryString);
					stmt.setLong(1, idLongTrasformazione);

					rs = stmt.executeQuery();
					
					if (rs.next()) {
									
						TrasformazioneRegola regola = new TrasformazioneRegola();
						
						String nome = rs.getString("nome");
						regola.setNome(nome);
		
						int posizione = rs.getInt("posizione");
						regola.setPosizione(posizione);
						
						StatoFunzionalita stato = DriverConfigurazioneDBLib.getEnumStatoFunzionalita(rs.getString("stato"));
						regola.setStato(stato);
						
						String applicabilita_azioni = rs.getString("applicabilita_azioni");
						String applicabilita_ct = rs.getString("applicabilita_ct");
						String applicabilita_pattern = rs.getString("applicabilita_pattern");
						String applicabilita_connettori = rs.getString("applicabilita_connettori");
						if( (applicabilita_azioni!=null && !"".equals(applicabilita_azioni)) ||
								(applicabilita_ct!=null && !"".equals(applicabilita_ct)) ||
								(applicabilita_pattern!=null && !"".equals(applicabilita_pattern))  ||
								(applicabilita_connettori!=null && !"".equals(applicabilita_connettori)) 
								) {
							TrasformazioneRegolaApplicabilitaRichiesta applicabilita = new TrasformazioneRegolaApplicabilitaRichiesta();
							
							if( (applicabilita_azioni!=null && !"".equals(applicabilita_azioni)) ) {
								if(applicabilita_azioni.contains(",")) {
									String [] tmp = applicabilita_azioni.split(",");
									for (int i = 0; i < tmp.length; i++) {
										applicabilita.addAzione(tmp[i].trim());
									}
								}
								else {
									applicabilita.addAzione(applicabilita_azioni);
								}
							}
							
							if( (applicabilita_ct!=null && !"".equals(applicabilita_ct)) ) {
								if(applicabilita_ct.contains(",")) {
									String [] tmp = applicabilita_ct.split(",");
									for (int i = 0; i < tmp.length; i++) {
										applicabilita.addContentType(tmp[i].trim());
									}
								}
								else {
									applicabilita.addContentType(applicabilita_ct);
								}
							}
							
							if(applicabilita_pattern!=null && !"".equals(applicabilita_pattern)){
								applicabilita.setPattern(applicabilita_pattern);
							}
							
							if( (applicabilita_connettori!=null && !"".equals(applicabilita_connettori)) ) {
								if(applicabilita_connettori.contains(",")) {
									String [] tmp = applicabilita_connettori.split(",");
									for (int i = 0; i < tmp.length; i++) {
										applicabilita.addConnettore(tmp[i].trim());
									}
								}
								else {
									applicabilita.addConnettore(applicabilita_connettori);
								}
							}
							
							regola.setApplicabilita(applicabilita);
						}
						
						TrasformazioneRegolaRichiesta richiesta = new TrasformazioneRegolaRichiesta();
						
						int req_conversione_enabled = rs.getInt("req_conversione_enabled");
						if(CostantiDB.TRUE == req_conversione_enabled) {
							richiesta.setConversione(true);
						}
						else {
							richiesta.setConversione(false);
						}
						richiesta.setConversioneTipo(rs.getString("req_conversione_tipo"));
						IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(this.driver.tipoDB);
						richiesta.setConversioneTemplate(jdbcAdapter.getBinaryData(rs, "req_conversione_template"));
						richiesta.setContentType(rs.getString("req_content_type"));
						
						int trasformazione_rest = rs.getInt("rest_transformation");
						if(CostantiDB.TRUE == trasformazione_rest) {
							TrasformazioneRest trasformazioneRest = new TrasformazioneRest();
							trasformazioneRest.setMetodo(rs.getString("rest_method"));
							trasformazioneRest.setPath(rs.getString("rest_path"));
							richiesta.setTrasformazioneRest(trasformazioneRest);
						}
							
						int trasformazione_soap = rs.getInt("soap_transformation");
						if(CostantiDB.TRUE == trasformazione_soap) {
							TrasformazioneSoap trasformazioneSoap = new TrasformazioneSoap();
							
							trasformazioneSoap.setVersione(DriverConfigurazioneDBLib.getEnumVersioneSOAP(rs.getString("soap_version")));
							trasformazioneSoap.setSoapAction(rs.getString("soap_action"));
							
							int envelope = rs.getInt("soap_envelope");
							if(CostantiDB.TRUE == envelope) {
								trasformazioneSoap.setEnvelope(true);
							}
							else {
								trasformazioneSoap.setEnvelope(false);
							}
							
							int envelope_as_attach = rs.getInt("soap_envelope_as_attach");
							if(CostantiDB.TRUE == envelope_as_attach) {
								trasformazioneSoap.setEnvelopeAsAttachment(true);
								
								trasformazioneSoap.setEnvelopeBodyConversioneTipo(rs.getString("soap_envelope_tipo"));
								trasformazioneSoap.setEnvelopeBodyConversioneTemplate(jdbcAdapter.getBinaryData(rs, "soap_envelope_template"));
							}
							else {
								trasformazioneSoap.setEnvelopeAsAttachment(false);
							}
							
							richiesta.setTrasformazioneSoap(trasformazioneSoap);
						}
						
						
						regola.setId(rs.getLong("id"));
						
						regola.setRichiesta(richiesta);
						
						
						// ** SOGGETTI **
						
						if(!portaDelegata) {
							
							nomeTabella = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTI;
							
							sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
							sqlQueryObject.addFromTable(nomeTabella);
							sqlQueryObject.addSelectField("*");
							sqlQueryObject.addWhereCondition("id_trasformazione=?");
							String sqlQuery = sqlQueryObject.createSQLQuery();
							stm0 = con.prepareStatement(sqlQuery);
							stm0.setLong(1, regola.getId());
							rs0 = stm0.executeQuery();
			
							while (rs0.next()) {
								
								if(regola.getApplicabilita()==null) {
									regola.setApplicabilita(new TrasformazioneRegolaApplicabilitaRichiesta());
								}
								
								TrasformazioneRegolaApplicabilitaSoggetto soggetto = new TrasformazioneRegolaApplicabilitaSoggetto();
								soggetto.setTipo(rs0.getString("tipo_soggetto"));
								soggetto.setNome(rs0.getString("nome_soggetto"));
								
								regola.getApplicabilita().addSoggetto(soggetto);
							
							}
							rs0.close();
							stm0.close();
						}
						
						
						// ** APPLICATIVI **
						
						nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_SA : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SA;
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
						sqlQueryObject.addFromTable(nomeTabella);
						sqlQueryObject.addSelectField("*");
						sqlQueryObject.addWhereCondition("id_trasformazione=?");
						String sqlQuery = sqlQueryObject.createSQLQuery();
						stm0 = con.prepareStatement(sqlQuery);
						stm0.setLong(1, regola.getId());
						rs0 = stm0.executeQuery();
		
						// per ogni entry 
						// prendo l'id del servizio associato, recupero il nome e
						// aggiungo
						// il servizio applicativo alla PortaDelegata da ritornare
						while (rs0.next()) {
							long idSA = rs0.getLong("id_servizio_applicativo");
		
							if (idSA != 0) {
								sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
								sqlQueryObject.addFromTable(CostantiDB.SERVIZI_APPLICATIVI);
								sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
								sqlQueryObject.addSelectField("nome");
								sqlQueryObject.addSelectField("tipo_soggetto");
								sqlQueryObject.addSelectField("nome_soggetto");
								sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_APPLICATIVI+".id=?");
								sqlQueryObject.addWhereCondition(CostantiDB.SERVIZI_APPLICATIVI+".id_soggetto="+CostantiDB.SOGGETTI+".id");
								sqlQueryObject.setANDLogicOperator(true);
								sqlQuery = sqlQueryObject.createSQLQuery();
								stm1 = con.prepareStatement(sqlQuery);
								stm1.setLong(1, idSA);
		
								this.driver.logDebug("eseguo query : " + DBUtils.formatSQLString(sqlQuery, idSA));
		
								rs1 = stm1.executeQuery();
		
								TrasformazioneRegolaApplicabilitaServizioApplicativo servizioApplicativo = null;
								if (rs1.next()) {
									// setto solo il nome come da specifica
									servizioApplicativo = new TrasformazioneRegolaApplicabilitaServizioApplicativo();
									servizioApplicativo.setId(idSA);
									servizioApplicativo.setNome(rs1.getString("nome"));
									servizioApplicativo.setTipoSoggettoProprietario(rs1.getString("tipo_soggetto"));
									servizioApplicativo.setNomeSoggettoProprietario(rs1.getString("nome_soggetto"));
									if(regola.getApplicabilita()==null) {
										regola.setApplicabilita(new TrasformazioneRegolaApplicabilitaRichiesta());
									}
									regola.getApplicabilita().addServizioApplicativo(servizioApplicativo);
								}
								rs1.close();
								stm1.close();
							}
						}
						rs0.close();
						stm0.close();
						
										
						lista.add(regola);

					}
					
					rs.close();
					stmt.close();
				}
			}

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

			//Chiudo statement and resultset
			JDBCUtilities.closeResources(rs1, stm1);
			JDBCUtilities.closeResources(rs0, stm0);
			JDBCUtilities.closeResources(rs, stmt);

			this.driver.closeConnection(error,con);
		}
		
		return lista;
	}
	
	protected boolean azioneUsataInTrasformazioniPortaDelegata(String azione) throws DriverConfigurazioneException {
		return this.azioneUsataInTrasformazioni(azione, true);
	}
	protected boolean azioneUsataInTrasformazioniPortaApplicativa(String azione) throws DriverConfigurazioneException {
		return this.azioneUsataInTrasformazioni(azione, false);
	}
	private boolean azioneUsataInTrasformazioni(String azione, boolean portaDelegata) throws DriverConfigurazioneException {

		String nomeMetodo = "azioneUsataInTrasformazioni";
		
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {
			
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectField("applicabilita_azioni");
			sqlQueryObject.addWhereLikeCondition("applicabilita_azioni", azione, false, true, false);
			sqlQueryObject.setANDLogicOperator(true);
			stmt = con.prepareStatement(sqlQueryObject.createSQLQuery());
			rs = stmt.executeQuery();

			while (rs.next()) {
				
				String checkAz = rs.getString("applicabilita_azioni");
				if(checkAz!=null) {
					if(azione.equals(checkAz)) {
						return true;
					}
					if(checkAz.contains(",")) {
						String [] tmp = checkAz.split(",");
						if(tmp!=null && tmp.length>0) {
							for (int i = 0; i < tmp.length; i++) {
								if(azione.equals(tmp[i])) {
									return true;
								}
							}
						}
					}
				}

			}

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

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

			this.driver.closeConnection(error,con);
		}
		
		return false;
	}
	
	
	protected TrasformazioneRegola getPortaApplicativaTrasformazione(long idPorta, String azioni, String pattern, String contentType, String connettori,
			List<TrasformazioneRegolaApplicabilitaSoggetto> soggetti,
			List<TrasformazioneRegolaApplicabilitaServizioApplicativo> applicativi,
			boolean interpretaNullList) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaApplicativaTrasformazione";
		boolean delegata = false;
		
		return getEngineTrasformazione(idPorta, azioni, pattern, contentType, connettori, soggetti, applicativi, nomeMetodo, delegata, interpretaNullList);
		
	}
	
	protected TrasformazioneRegola getPortaDelegataTrasformazione(long idPorta, String azioni, String pattern, String contentType, String connettori,
			List<TrasformazioneRegolaApplicabilitaServizioApplicativo> applicativi) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaDelegataTrasformazione";
		boolean delegata = true;
		return getEngineTrasformazione(idPorta, azioni, pattern, contentType, connettori, null, applicativi, nomeMetodo, delegata, 
				true); // esiste solo una lista
	}
	
	private TrasformazioneRegola getEngineTrasformazione(long idPorta, String azioni, String pattern, String contentType, String connettori,
			List<TrasformazioneRegolaApplicabilitaSoggetto> soggetti,
			List<TrasformazioneRegolaApplicabilitaServizioApplicativo> applicativi,
			String nomeMetodo, boolean portaDelegata, boolean interpretaNullList) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaSoggetti = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTI; //portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_SOGGETTI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTI;
		String nomeTabellaSA = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_SA : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SA;
		
		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource(nomeMetodo);
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::" + nomeMetodo + "] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
		TrasformazioneRegola regola = null;
		try {

			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectField("*");
			sqlQueryObject.setANDLogicOperator(true);
			
			sqlQueryObject.addWhereCondition("id_porta = ?");
			
			if(azioni != null) {
				//sqlQueryObject.addWhereCondition("applicabilita_azioni = ?");
				sqlQueryObject.addWhereLikeCondition("applicabilita_azioni", azioni, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition("applicabilita_azioni");
			}
			
			if(pattern != null) {
				//sqlQueryObject.addWhereCondition("applicabilita_pattern = ?");
				sqlQueryObject.addWhereLikeCondition("applicabilita_pattern", pattern, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition("applicabilita_pattern");
			}
			
			if(contentType != null) {
				//sqlQueryObject.addWhereCondition("applicabilita_ct = ?");
				sqlQueryObject.addWhereLikeCondition("applicabilita_ct", contentType, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition("applicabilita_ct");
			}
			
			if(connettori != null) {
				//sqlQueryObject.addWhereCondition("applicabilita_connettori = ?");
				sqlQueryObject.addWhereLikeCondition("applicabilita_connettori", connettori, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition("applicabilita_connettori");
			}
			
			if(!portaDelegata) {
				if(soggetti==null || soggetti.isEmpty()) {
					if(interpretaNullList) {
						ISQLQueryObject sqlQueryObjectExists = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
						sqlQueryObjectExists.addFromTable(nomeTabellaSoggetti);
						sqlQueryObjectExists.addSelectField("id_trasformazione");
						sqlQueryObjectExists.setANDLogicOperator(true);
						sqlQueryObjectExists.addWhereCondition("id_trasformazione="+nomeTabella+".id");
						sqlQueryObject.addWhereExistsCondition(true, sqlQueryObjectExists);	
					}
				}
				else {
					sqlQueryObject.addFromTable(nomeTabellaSoggetti);
					sqlQueryObject.addWhereCondition(nomeTabellaSoggetti+".id_trasformazione="+nomeTabella+".id");
					List<String> conditions = new ArrayList<>();
					for (@SuppressWarnings("unused") TrasformazioneRegolaApplicabilitaSoggetto trasformazioneRegolaApplicabilitaSoggetto : soggetti) {
						StringBuilder bf = new StringBuilder();
						bf.append("( ");
						bf.append(nomeTabellaSoggetti).append(".tipo_soggetto=?");
						bf.append(" AND ");
						bf.append(nomeTabellaSoggetti).append(".nome_soggetto=?");
						bf.append(") ");
						conditions.add(bf.toString());
					}
					sqlQueryObject.addWhereCondition(false, conditions.toArray(new String[1]));
				}
			}
			
			if(applicativi==null || applicativi.isEmpty()) {
				if(interpretaNullList) {
					ISQLQueryObject sqlQueryObjectExists = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObjectExists.addFromTable(nomeTabellaSA);
					sqlQueryObjectExists.addSelectField("id_trasformazione");
					sqlQueryObjectExists.setANDLogicOperator(true);
					sqlQueryObjectExists.addWhereCondition("id_trasformazione="+nomeTabella+".id");
					sqlQueryObject.addWhereExistsCondition(true, sqlQueryObjectExists);	
				}
			}
			else {
				sqlQueryObject.addFromTable(nomeTabellaSA);
				sqlQueryObject.addWhereCondition(nomeTabellaSA+".id_trasformazione="+nomeTabella+".id");
				List<String> conditions = new ArrayList<>();
				for (@SuppressWarnings("unused") TrasformazioneRegolaApplicabilitaServizioApplicativo trasformazioneRegolaApplicabilitaSA : applicativi) {
					StringBuilder bf = new StringBuilder();
					bf.append("( ");
					bf.append(nomeTabellaSA).append(".id_servizio_applicativo=?");
					bf.append(") ");
					conditions.add(bf.toString());
				}
				sqlQueryObject.addWhereCondition(false, conditions.toArray(new String[1]));
			}
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
//			if(azioni != null)
//				stmt.setString(parameterIndex ++, azioni);
//			if(pattern != null)
//				stmt.setString(parameterIndex ++, pattern);
//			if(contentType != null)
//				stmt.setString(parameterIndex ++, contentType);
			
			if(!portaDelegata) {
				if(soggetti==null || soggetti.isEmpty()) {
					// nop;
				}
				else {
					for (TrasformazioneRegolaApplicabilitaSoggetto trasformazioneRegolaApplicabilitaSoggetto : soggetti) {
						stmt.setString(parameterIndex ++, trasformazioneRegolaApplicabilitaSoggetto.getTipo());
						stmt.setString(parameterIndex ++, trasformazioneRegolaApplicabilitaSoggetto.getNome());
					}
				}
			}
			
			if(applicativi==null || applicativi.isEmpty()) {
				// nop;
			}
			else {
				for (TrasformazioneRegolaApplicabilitaServizioApplicativo trasformazioneRegolaApplicabilitaSA : applicativi) {
					long idSA = DBUtils.getIdServizioApplicativo(trasformazioneRegolaApplicabilitaSA.getNome(), 
							trasformazioneRegolaApplicabilitaSA.getTipoSoggettoProprietario(), trasformazioneRegolaApplicabilitaSA.getNomeSoggettoProprietario(), con, this.driver.tipoDB);
					stmt.setLong(parameterIndex ++, idSA);
				}
			}
			
			risultato = stmt.executeQuery();
			if (risultato.next()) {
				
				regola = getEngineTrasformazione(risultato);
			}
			
			risultato.close();
			stmt.close();

			return regola;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected TrasformazioneRegola getPortaApplicativaTrasformazione(long idPorta, String nome) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaApplicativaTrasformazione";
		boolean delegata = false;
		return getEngineTrasformazione(idPorta, nome, nomeMetodo, delegata);
	}
	
	protected TrasformazioneRegola getPortaDelegataTrasformazione(long idPorta, String nome) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaDelegataTrasformazione";
		boolean delegata = true;
		return getEngineTrasformazione(idPorta, nome, nomeMetodo, delegata);
	}
	
	private TrasformazioneRegola getEngineTrasformazione(long idPorta, String nome, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;

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

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
		TrasformazioneRegola regola = null;
		try {

			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectField("*");
			sqlQueryObject.setANDLogicOperator(true);
			
			sqlQueryObject.addWhereCondition("id_porta = ?");
			sqlQueryObject.addWhereCondition("nome = ?");
			
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setString(parameterIndex ++, nome);
						
			risultato = stmt.executeQuery();
			if (risultato.next()) {
				
				regola = getEngineTrasformazione(risultato);
			}
			
			risultato.close();
			stmt.close();

			return regola;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	private TrasformazioneRegola getEngineTrasformazione(ResultSet risultato) throws Exception {
		TrasformazioneRegola regola  = new TrasformazioneRegola();
				
		StatoFunzionalita stato = DriverConfigurazioneDBLib.getEnumStatoFunzionalita(risultato.getString("stato"));
		regola.setStato(stato);
		
		String applicabilita_azioni = risultato.getString("applicabilita_azioni");
		String applicabilita_ct = risultato.getString("applicabilita_ct");
		String applicabilita_pattern = risultato.getString("applicabilita_pattern");
		String applicabilita_connettori = risultato.getString("applicabilita_connettori");
		if( (applicabilita_azioni!=null && !"".equals(applicabilita_azioni)) ||
				(applicabilita_ct!=null && !"".equals(applicabilita_ct)) ||
				(applicabilita_pattern!=null && !"".equals(applicabilita_pattern))  ||
				(applicabilita_connettori!=null && !"".equals(applicabilita_connettori)) 
				) {
			TrasformazioneRegolaApplicabilitaRichiesta applicabilita = new TrasformazioneRegolaApplicabilitaRichiesta();
			
			if( (applicabilita_azioni!=null && !"".equals(applicabilita_azioni)) ) {
				if(applicabilita_azioni.contains(",")) {
					String [] tmp = applicabilita_azioni.split(",");
					for (int i = 0; i < tmp.length; i++) {
						applicabilita.addAzione(tmp[i].trim());
					}
				}
				else {
					applicabilita.addAzione(applicabilita_azioni);
				}
			}
			
			if( (applicabilita_ct!=null && !"".equals(applicabilita_ct)) ) {
				if(applicabilita_ct.contains(",")) {
					String [] tmp = applicabilita_ct.split(",");
					for (int i = 0; i < tmp.length; i++) {
						applicabilita.addContentType(tmp[i].trim());
					}
				}
				else {
					applicabilita.addContentType(applicabilita_ct);
				}
			}
			
			if(applicabilita_pattern!=null && !"".equals(applicabilita_pattern)){
				applicabilita.setPattern(applicabilita_pattern);
			}
			
			if( (applicabilita_connettori!=null && !"".equals(applicabilita_connettori)) ) {
				if(applicabilita_connettori.contains(",")) {
					String [] tmp = applicabilita_connettori.split(",");
					for (int i = 0; i < tmp.length; i++) {
						applicabilita.addConnettore(tmp[i].trim());
					}
				}
				else {
					applicabilita.addConnettore(applicabilita_connettori);
				}
			}
			
			regola.setApplicabilita(applicabilita);
		}
		
		TrasformazioneRegolaRichiesta richiesta = new TrasformazioneRegolaRichiesta();
		
		int req_conversione_enabled = risultato.getInt("req_conversione_enabled");
		if(CostantiDB.TRUE == req_conversione_enabled) {
			richiesta.setConversione(true);
		}
		else {
			richiesta.setConversione(false);
		}
		richiesta.setConversioneTipo(risultato.getString("req_conversione_tipo"));
		IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(this.driver.tipoDB);
		richiesta.setConversioneTemplate(jdbcAdapter.getBinaryData(risultato, "req_conversione_template"));
		richiesta.setContentType(risultato.getString("req_content_type"));
		
		int trasformazione_rest = risultato.getInt("rest_transformation");
		if(CostantiDB.TRUE == trasformazione_rest) {
			TrasformazioneRest trasformazioneRest = new TrasformazioneRest();
			trasformazioneRest.setMetodo(risultato.getString("rest_method"));
			trasformazioneRest.setPath(risultato.getString("rest_path"));
			richiesta.setTrasformazioneRest(trasformazioneRest);
		}
			
		int trasformazione_soap = risultato.getInt("soap_transformation");
		if(CostantiDB.TRUE == trasformazione_soap) {
			TrasformazioneSoap trasformazioneSoap = new TrasformazioneSoap();
			
			trasformazioneSoap.setVersione(DriverConfigurazioneDBLib.getEnumVersioneSOAP(risultato.getString("soap_version")));
			trasformazioneSoap.setSoapAction(risultato.getString("soap_action"));
			
			int envelope = risultato.getInt("soap_envelope");
			if(CostantiDB.TRUE == envelope) {
				trasformazioneSoap.setEnvelope(true);
			}
			else {
				trasformazioneSoap.setEnvelope(false);
			}
			
			int envelope_as_attach = risultato.getInt("soap_envelope_as_attach");
			if(CostantiDB.TRUE == envelope_as_attach) {
				trasformazioneSoap.setEnvelopeAsAttachment(true);
				
				trasformazioneSoap.setEnvelopeBodyConversioneTipo(risultato.getString("soap_envelope_tipo"));
				trasformazioneSoap.setEnvelopeBodyConversioneTemplate(jdbcAdapter.getBinaryData(risultato, "soap_envelope_template"));
			}
			else {
				trasformazioneSoap.setEnvelopeAsAttachment(false);
			}
			
			richiesta.setTrasformazioneSoap(trasformazioneSoap);
		}
		
		regola.setId(risultato.getLong("id"));
		
		regola.setRichiesta(richiesta);
		
		return regola;

	}
	
	protected boolean existsPortaApplicativaTrasformazione(long idPorta, String azioni, String pattern, String contentType, String connettori) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaApplicativaTrasformazione";
		boolean delegata = false;
		return _existsTrasformazione(idPorta, azioni, pattern, contentType, connettori, nomeMetodo, delegata);
	}
	
	protected boolean existsPortaDelegataTrasformazione(long idPorta, String azioni, String pattern, String contentType, String connettori) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaDelegataTrasformazione";
		boolean delegata = true;
		return _existsTrasformazione(idPorta, azioni, pattern, contentType, connettori, nomeMetodo, delegata);
	}
	
	private boolean _existsTrasformazione(long idPorta, String azioni, String pattern, String contentType, String connettori, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {

			int count = 0;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectCountField(nomeTabella+".id", "cont");
			sqlQueryObject.setANDLogicOperator(true);
			
			sqlQueryObject.addWhereCondition("id_porta = ?");
			
			if(azioni != null) {
				//sqlQueryObject.addWhereCondition("applicabilita_azioni = ?");
				sqlQueryObject.addWhereLikeCondition("applicabilita_azioni", azioni, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition("applicabilita_azioni");
			}
			
			if(pattern != null) {
				//sqlQueryObject.addWhereCondition("applicabilita_pattern = ?");
				sqlQueryObject.addWhereLikeCondition("applicabilita_pattern", pattern, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition("applicabilita_pattern");
			}
			
			if(contentType != null) {
				//sqlQueryObject.addWhereCondition("applicabilita_ct = ?");
				sqlQueryObject.addWhereLikeCondition("applicabilita_ct", contentType, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition("applicabilita_ct");
			}
			
			if(connettori != null) {
				//sqlQueryObject.addWhereCondition("applicabilita_connettori = ?");
				sqlQueryObject.addWhereLikeCondition("applicabilita_connettori", connettori, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition("applicabilita_connettori");
			}
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
//			if(azioni != null)
//				stmt.setString(parameterIndex ++, azioni);
//			if(pattern != null)
//				stmt.setString(parameterIndex ++, pattern);
//			if(contentType != null)
//				stmt.setString(parameterIndex ++, contentType);
			
			risultato = stmt.executeQuery();
			if (risultato.next())
				count = risultato.getInt(1);
			risultato.close();
			stmt.close();

			return count > 0;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected boolean existsPortaApplicativaTrasformazione(long idPorta, String nome) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaApplicativaTrasformazione";
		boolean delegata = false;
		return _existsTrasformazione(idPorta, nome, nomeMetodo, delegata);
	}
	
	protected boolean existsPortaDelegataTrasformazione(long idPorta, String nome) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaDelegataTrasformazione";
		boolean delegata = true;
		return _existsTrasformazione(idPorta, nome, nomeMetodo, delegata);
	}
	
	private boolean _existsTrasformazione(long idPorta, String nome, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {

			int count = 0;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectCountField(nomeTabella+".id", "cont");
			sqlQueryObject.setANDLogicOperator(true);
			
			sqlQueryObject.addWhereCondition("id_porta = ?");
			sqlQueryObject.addWhereCondition("nome = ?");
						
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setString(parameterIndex ++, nome);
			
			risultato = stmt.executeQuery();
			if (risultato.next())
				count = risultato.getInt(1);
			risultato.close();
			stmt.close();

			return count > 0;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	
	protected List<TrasformazioneRegolaRisposta> porteDelegateTrasformazioniRispostaList(long idPD, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE;
		String nomeMetodo = "porteDelegateTrasformazioniRispostaList";
		boolean delegata = true;
		return getEngineTrasformazioniRispostaList(idPD, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	protected List<TrasformazioneRegolaRisposta> porteApplicativeTrasformazioniRispostaList(long idPA, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
		String nomeMetodo = "porteApplicativeTrasformazioniRispostaList";
		boolean delegata = false;
		return getEngineTrasformazioniRispostaList(idPA, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	private List<TrasformazioneRegolaRisposta> getEngineTrasformazioniRispostaList(long idPA, long idTrasformazione, ISearch ricerca, int idLista, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		int offset; 
		int limit;
		String queryString;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);

		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRisposta = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<TrasformazioneRegolaRisposta> lista = new ArrayList<TrasformazioneRegolaRisposta>();
		try {
			
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addSelectCountField(nomeTabellaRisposta+".id", "cont");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();
			if (rs.next())
				ricerca.setNumEntries(idLista,rs.getInt(1));
			rs.close();
			stmt.close();

			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addSelectAliasField(nomeTabellaRisposta, "id", "idTrasRisposta");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".posizione");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".nome");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addOrderBy(nomeTabellaRisposta+".posizione");
			sqlQueryObject.addOrderBy(nomeTabellaRisposta+".nome");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();

			List<Long> idTrasformazioneRisposta = new ArrayList<>();
			while (rs.next()) { 
				idTrasformazioneRisposta.add(rs.getLong("idTrasRisposta"));
			}
			rs.close();
			stmt.close();
			
			if(idTrasformazioneRisposta!=null && !idTrasformazioneRisposta.isEmpty()) {
				for (Long idLongTrasformazioneRisposta : idTrasformazioneRisposta) {
						
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObject.addFromTable(nomeTabella);
					sqlQueryObject.addFromTable(nomeTabellaRisposta);
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".nome");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".posizione");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_status_min");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_status_max");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_ct");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_pattern");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_enabled");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_tipo");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_template");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".content_type");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".return_code");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_as_attach");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_tipo");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_template");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".id");
					sqlQueryObject.addSelectField(nomeTabellaRisposta+".id_trasformazione");
					sqlQueryObject.addSelectField(nomeTabella+".rest_transformation"); // serve per capire se nella risposta devo abilitare la soap trasformation
					sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id=?");
					sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
					sqlQueryObject.setANDLogicOperator(true);
					queryString = sqlQueryObject.createSQLQuery();
					stmt = con.prepareStatement(queryString);
					stmt.setLong(1, idLongTrasformazioneRisposta);

					rs = stmt.executeQuery();
					
					if (rs.next()) { 
						TrasformazioneRegolaRisposta risposta = _readTrasformazioneRegolaRisposta(rs);
						lista.add(risposta);
					}
					
					rs.close();
					stmt.close();
				}
			}

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

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

			this.driver.closeConnection(error,con);
		}
		
		return lista;
	} 
	
	protected TrasformazioneRegolaRisposta getPortaApplicativaTrasformazioneRisposta(long idPorta, long idTrasformazione, Integer statusMin, Integer statusMax, String pattern, String contentType) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaApplicativaTrasformazioneRisposta";
		boolean delegata = false;
		return getEngineTrasformazioneRisposta(idPorta, idTrasformazione, statusMin, statusMax, pattern, contentType, nomeMetodo, delegata);
	}
	
	protected TrasformazioneRegolaRisposta getPortaDelegataTrasformazioneRisposta(long idPorta, long idTrasformazione, Integer statusMin, Integer statusMax, String pattern, String contentType) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaDelegataTrasformazioneRisposta";
		boolean delegata = true;
		return getEngineTrasformazioneRisposta(idPorta, idTrasformazione, statusMin, statusMax, pattern, contentType, nomeMetodo, delegata);
	}
	
	private TrasformazioneRegolaRisposta getEngineTrasformazioneRisposta(long idPorta, long idTrasformazione, Integer statusMin, Integer statusMax, String pattern, String contentType, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet rs =null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRisposta = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
		
		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource(nomeMetodo);
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::" + nomeMetodo + "] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
		TrasformazioneRegolaRisposta risposta = null;
		try {

			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".nome");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".posizione");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_status_min");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_status_max");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_ct");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_pattern");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_enabled");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_tipo");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_template");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".content_type");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".return_code");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_as_attach");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_tipo");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_template");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".id");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.addSelectField(nomeTabella+".rest_transformation"); // serve per capire se nella risposta devo abilitare la soap trasformation
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.setANDLogicOperator(true);
			
			if(statusMin != null) {
				sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".applicabilita_status_min = ?");
			} else {
				sqlQueryObject.addWhereIsNullCondition(nomeTabellaRisposta+".applicabilita_status_min");
			}
			
			if(statusMax != null) {
				sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".applicabilita_status_max = ?");
			} else {
				sqlQueryObject.addWhereIsNullCondition(nomeTabellaRisposta+".applicabilita_status_max");
			}
			
			if(pattern != null) {
				sqlQueryObject.addWhereLikeCondition(nomeTabellaRisposta+".applicabilita_pattern", pattern, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition(nomeTabellaRisposta+".applicabilita_pattern");
			}
			
			if(contentType != null) {
				sqlQueryObject.addWhereLikeCondition(nomeTabellaRisposta+".applicabilita_ct", contentType, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition(nomeTabellaRisposta+".applicabilita_ct");
			}
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			
			if(statusMin != null)
				stmt.setInt(parameterIndex ++, statusMin);
			if(statusMax != null)
				stmt.setInt(parameterIndex ++, statusMax);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				
				risposta = _readTrasformazioneRegolaRisposta(rs);
			}
			
			rs.close();
			stmt.close();

			return risposta;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected TrasformazioneRegolaRisposta getPortaApplicativaTrasformazioneRisposta(long idPorta, long idTrasformazione, String nome) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaApplicativaTrasformazioneRisposta";
		boolean delegata = false;
		return getEngineTrasformazioneRisposta(idPorta, idTrasformazione, nome, nomeMetodo, delegata);
	}
	
	protected TrasformazioneRegolaRisposta getPortaDelegataTrasformazioneRisposta(long idPorta, long idTrasformazione, String nome) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaDelegataTrasformazioneRisposta";
		boolean delegata = true;
		return getEngineTrasformazioneRisposta(idPorta, idTrasformazione, nome, nomeMetodo, delegata);
	}
	
	private TrasformazioneRegolaRisposta getEngineTrasformazioneRisposta(long idPorta, long idTrasformazione, String nome, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet rs =null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRisposta = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
		
		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource(nomeMetodo);
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::" + nomeMetodo + "] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
		TrasformazioneRegolaRisposta risposta = null;
		try {

			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".nome");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".posizione");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_status_min");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_status_max");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_ct");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".applicabilita_pattern");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_enabled");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_tipo");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".conversione_template");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".content_type");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".return_code");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_as_attach");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_tipo");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".soap_envelope_template");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".id");
			sqlQueryObject.addSelectField(nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.addSelectField(nomeTabella+".rest_transformation"); // serve per capire se nella risposta devo abilitare la soap trasformation
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".nome = ?");
			
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			
			stmt.setString(parameterIndex ++, nome);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				
				risposta = _readTrasformazioneRegolaRisposta(rs);
			}
			
			rs.close();
			stmt.close();

			return risposta;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	private TrasformazioneRegolaRisposta _readTrasformazioneRegolaRisposta(ResultSet rs) throws Exception{
		TrasformazioneRegolaRisposta risposta = new TrasformazioneRegolaRisposta();
		
		String nome = rs.getString("nome");
		risposta.setNome(nome);

		int posizione = rs.getInt("posizione");
		risposta.setPosizione(posizione);
		
		int applicabilita_status_min = rs.getInt("applicabilita_status_min");
		int applicabilita_status_max = rs.getInt("applicabilita_status_max");
		String applicabilita_ct = rs.getString("applicabilita_ct");
		String applicabilita_pattern = rs.getString("applicabilita_pattern");
		if( (applicabilita_status_min >0 || applicabilita_status_max>0) ||
				(applicabilita_ct!=null && !"".equals(applicabilita_ct)) ||
				(applicabilita_pattern!=null && !"".equals(applicabilita_pattern)) 
				) {
			TrasformazioneRegolaApplicabilitaRisposta applicabilita = new TrasformazioneRegolaApplicabilitaRisposta();
			
			if(applicabilita_status_min>0) {
				applicabilita.setReturnCodeMin(applicabilita_status_min);
			}
			if(applicabilita_status_max>0) {
				applicabilita.setReturnCodeMax(applicabilita_status_max);
			}

			if( (applicabilita_ct!=null && !"".equals(applicabilita_ct)) ) {
				if(applicabilita_ct.contains(",")) {
					String [] tmp = applicabilita_ct.split(",");
					for (int i = 0; i < tmp.length; i++) {
						applicabilita.addContentType(tmp[i].trim());
					}
				}
				else {
					applicabilita.addContentType(applicabilita_ct);
				}
			}
			
			if(applicabilita_pattern!=null && !"".equals(applicabilita_pattern)){
				applicabilita.setPattern(applicabilita_pattern);
			}
			
			risposta.setApplicabilita(applicabilita);
		}
		
		int conversione_enabled = rs.getInt("conversione_enabled");
		if(CostantiDB.TRUE == conversione_enabled) {
			risposta.setConversione(true);
		}
		else {
			risposta.setConversione(false);
		}
		risposta.setConversioneTipo(rs.getString("conversione_tipo"));
		IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(this.driver.tipoDB);
		risposta.setConversioneTemplate(jdbcAdapter.getBinaryData(rs, "conversione_template"));
		risposta.setContentType(rs.getString("content_type"));
		risposta.setReturnCode(rs.getString("return_code"));
		
		int trasformazione_rest = rs.getInt("rest_transformation");
		if(CostantiDB.TRUE == trasformazione_rest) {
		
			// la risposta deve essere ritornata in SOAP
			
			TrasformazioneSoapRisposta trasformazioneSoap = new TrasformazioneSoapRisposta();
			
			int envelope = rs.getInt("soap_envelope");
			if(CostantiDB.TRUE == envelope) {
				trasformazioneSoap.setEnvelope(true);
			}
			else {
				trasformazioneSoap.setEnvelope(false);
			}
			
			int envelope_as_attach = rs.getInt("soap_envelope_as_attach");
			if(CostantiDB.TRUE == envelope_as_attach) {
				trasformazioneSoap.setEnvelopeAsAttachment(true);
				
				trasformazioneSoap.setEnvelopeBodyConversioneTipo(rs.getString("soap_envelope_tipo"));
				trasformazioneSoap.setEnvelopeBodyConversioneTemplate(jdbcAdapter.getBinaryData(rs, "soap_envelope_template"));
			}
			else {
				trasformazioneSoap.setEnvelopeAsAttachment(false);
			}
			
			risposta.setTrasformazioneSoap(trasformazioneSoap);
			
		}

		risposta.setId(rs.getLong("id"));
		
		return  risposta;
	}
	
	protected boolean existsPortaApplicativaTrasformazioneRisposta(long idPorta, long idTrasformazione, Integer statusMin, Integer statusMax, String pattern, String contentType) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaApplicativaTrasformazioneRisposta";
		boolean delegata = false;
		return _existsTrasformazioneRisposta(idPorta, idTrasformazione, statusMin, statusMax, pattern, contentType, nomeMetodo, delegata);
	}
	
	protected boolean existsPortaDelegataTrasformazioneRisposta(long idPorta, long idTrasformazione, Integer statusMin, Integer statusMax, String pattern, String contentType) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaDelegataTrasformazioneRisposta";
		boolean delegata = true;
		return _existsTrasformazioneRisposta(idPorta, idTrasformazione, statusMin, statusMax, pattern, contentType, nomeMetodo, delegata);
	}
	
	private boolean _existsTrasformazioneRisposta(long idPorta, long idTrasformazione, Integer statusMin, Integer statusMax, String pattern, String contentType, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRisposta = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {

			int count = 0;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addSelectCountField(nomeTabellaRisposta+".id", "cont");
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			
			
			if(statusMin != null) {
				sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".applicabilita_status_min = ?");
			} else {
				sqlQueryObject.addWhereIsNullCondition(nomeTabellaRisposta+".applicabilita_status_min");
			}
			
			if(statusMax != null) {
				sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".applicabilita_status_max = ?");
			} else {
				sqlQueryObject.addWhereIsNullCondition(nomeTabellaRisposta+".applicabilita_status_max");
			}
			
			if(pattern != null) {
				//sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".applicabilita_pattern = ?");
				sqlQueryObject.addWhereLikeCondition(nomeTabellaRisposta+".applicabilita_pattern", pattern, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition(nomeTabellaRisposta+".applicabilita_pattern");
			}
			
			if(contentType != null) {
				//sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".applicabilita_ct = ?");
				sqlQueryObject.addWhereLikeCondition(nomeTabellaRisposta+".applicabilita_ct", contentType, false, false);
			} else {
				sqlQueryObject.addWhereIsNullCondition(nomeTabellaRisposta+".applicabilita_ct");
			}
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			
			if(statusMin != null)
				stmt.setInt(parameterIndex ++, statusMin);
			if(statusMax != null)
				stmt.setInt(parameterIndex ++, statusMax);
//			if(pattern != null)
//				stmt.setString(parameterIndex ++, pattern);
//			if(contentType != null)
//				stmt.setString(parameterIndex ++, contentType);
			
			risultato = stmt.executeQuery();
			if (risultato.next())
				count = risultato.getInt(1);
			risultato.close();
			stmt.close();

			return count > 0;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected boolean existsPortaApplicativaTrasformazioneRisposta(long idPorta, long idTrasformazione, String nome) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaApplicativaTrasformazioneRisposta";
		boolean delegata = false;
		return _existsTrasformazioneRisposta(idPorta, idTrasformazione, nome, nomeMetodo, delegata);
	}
	
	protected boolean existsPortaDelegataTrasformazioneRisposta(long idPorta, long idTrasformazione, String nome) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaDelegataTrasformazioneRisposta";
		boolean delegata = true;
		return _existsTrasformazioneRisposta(idPorta, idTrasformazione, nome, nomeMetodo, delegata);
	}
	
	private boolean _existsTrasformazioneRisposta(long idPorta, long idTrasformazione, String nome, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRisposta = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {

			int count = 0;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addSelectCountField(nomeTabellaRisposta+".id", "cont");
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".nome = ?");
			
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			
			stmt.setString(parameterIndex ++, nome);
			
			risultato = stmt.executeQuery();
			if (risultato.next())
				count = risultato.getInt(1);
			risultato.close();
			stmt.close();

			return count > 0;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected List<TrasformazioneRegolaApplicabilitaServizioApplicativo> porteDelegateTrasformazioniServiziApplicativiList(long idPD, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_DELEGATE_TRASFORMAZIONI_SERVIZIO_APPLICATIVO;
		String nomeMetodo = "porteDelegateTrasformazioniServiziApplicativiList";
		boolean delegata = true;
		return getEngineTrasformazioniServiziApplicativiList(idPD, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	protected List<TrasformazioneRegolaApplicabilitaServizioApplicativo> porteApplicativeTrasformazioniServiziApplicativiList(long idPA, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_APPLICATIVE_TRASFORMAZIONI_SERVIZIO_APPLICATIVO_AUTORIZZATO;
		String nomeMetodo = "porteApplicativeTrasformazioniServiziApplicativiList";
		boolean delegata = false;
		return getEngineTrasformazioniServiziApplicativiList(idPA, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	private List<TrasformazioneRegolaApplicabilitaServizioApplicativo> getEngineTrasformazioniServiziApplicativiList(long idPA, long idTrasformazione, ISearch ricerca, int idLista, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		int offset; 
		int limit;
		String queryString;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);

		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaTrasformazioneSA = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_SA : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SA;
		String nomeTabellaSA = CostantiDB.SERVIZI_APPLICATIVI;
		String nomeTabellaSoggetti = CostantiDB.SOGGETTI;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<TrasformazioneRegolaApplicabilitaServizioApplicativo> lista = new ArrayList<TrasformazioneRegolaApplicabilitaServizioApplicativo>();
		try {
			
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaTrasformazioneSA);
			sqlQueryObject.addSelectCountField(nomeTabellaTrasformazioneSA+".id", "cont");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaTrasformazioneSA+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaTrasformazioneSA+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();
			if (rs.next())
				ricerca.setNumEntries(idLista,rs.getInt(1));
			rs.close();
			stmt.close();

			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaTrasformazioneSA);
			sqlQueryObject.addFromTable(nomeTabellaSA);
			sqlQueryObject.addFromTable(nomeTabellaSoggetti);
			sqlQueryObject.addSelectAliasField(nomeTabellaTrasformazioneSA, "id", "idTrasSA");
			sqlQueryObject.addSelectField(nomeTabellaSA+".nome");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaTrasformazioneSA+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaTrasformazioneSA+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaSA+".id="+nomeTabellaTrasformazioneSA+".id_servizio_applicativo");
			sqlQueryObject.addWhereCondition(nomeTabellaSA+".id_soggetto="+nomeTabellaSoggetti+".id");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addOrderBy(nomeTabellaSA+".nome");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();

			List<Long> idLong = new ArrayList<>();
			while (rs.next()) { 
				idLong.add(rs.getLong("idTrasSA"));
			}
			rs.close();
			stmt.close();
			
			if(!idLong.isEmpty()) {
				
				for (Long idLongTrasf : idLong) {
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObject.addFromTable(nomeTabella);
					sqlQueryObject.addFromTable(nomeTabellaTrasformazioneSA);
					sqlQueryObject.addFromTable(nomeTabellaSA);
					sqlQueryObject.addFromTable(nomeTabellaSoggetti);
					sqlQueryObject.addSelectField(nomeTabellaSA+".nome");
					sqlQueryObject.addSelectField(nomeTabellaSoggetti+".tipo_soggetto");
					sqlQueryObject.addSelectField(nomeTabellaSoggetti+".nome_soggetto");
					sqlQueryObject.addSelectField(nomeTabellaTrasformazioneSA+".id");
					sqlQueryObject.addSelectField(nomeTabellaTrasformazioneSA+".id_trasformazione");
					sqlQueryObject.addSelectField(nomeTabellaTrasformazioneSA+".id_servizio_applicativo");
					sqlQueryObject.addWhereCondition(nomeTabellaTrasformazioneSA+".id=?");
					sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaTrasformazioneSA+".id_trasformazione");
					sqlQueryObject.addWhereCondition(nomeTabellaSA+".id="+nomeTabellaTrasformazioneSA+".id_servizio_applicativo");
					sqlQueryObject.addWhereCondition(nomeTabellaSA+".id_soggetto="+nomeTabellaSoggetti+".id");
					sqlQueryObject.setANDLogicOperator(true);
					queryString = sqlQueryObject.createSQLQuery();
					stmt = con.prepareStatement(queryString);
					stmt.setLong(1, idLongTrasf);
					
					rs = stmt.executeQuery();
					if(rs.next()) {
						TrasformazioneRegolaApplicabilitaServizioApplicativo risposta = new TrasformazioneRegolaApplicabilitaServizioApplicativo();
						risposta.setId(rs.getLong("id"));
						risposta.setNome(rs.getString("nome"));
						risposta.setTipoSoggettoProprietario(rs.getString("tipo_soggetto"));
						risposta.setNomeSoggettoProprietario(rs.getString("nome_soggetto"));
						lista.add(risposta);		
					}
					
					rs.close();
					stmt.close();
					
				}
				
			}

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

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

			this.driver.closeConnection(error,con);
		}
		
		return lista;
	} 
	
	protected List<TrasformazioneRegolaApplicabilitaSoggetto> porteApplicativeTrasformazioniSoggettiList(long idPA, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTO;
		String nomeMetodo = "porteApplicativeTrasformazioniSoggettiList";
		boolean delegata = false;
		return getEngineTrasformazioniSoggettiList(idPA, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	private List<TrasformazioneRegolaApplicabilitaSoggetto> getEngineTrasformazioniSoggettiList(long idPA, long idTrasformazione, ISearch ricerca, int idLista, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		int offset; 
		int limit;
		String queryString;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);

		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaSoggetti = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTI;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<TrasformazioneRegolaApplicabilitaSoggetto> lista = new ArrayList<TrasformazioneRegolaApplicabilitaSoggetto>();
		try {
			
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaSoggetti);
			sqlQueryObject.addSelectCountField(nomeTabellaSoggetti+".id", "cont");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaSoggetti+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaSoggetti+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();
			if (rs.next())
				ricerca.setNumEntries(idLista,rs.getInt(1));
			rs.close();
			stmt.close();

			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaSoggetti);
			sqlQueryObject.addSelectAliasField(nomeTabellaSoggetti, "id", "idTrasSoggetto");
			sqlQueryObject.addSelectField(nomeTabellaSoggetti+".tipo_soggetto");
			sqlQueryObject.addSelectField(nomeTabellaSoggetti+".nome_soggetto");
			sqlQueryObject.addSelectField(nomeTabellaSoggetti+".id");
			sqlQueryObject.addSelectField(nomeTabellaSoggetti+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaSoggetti+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaSoggetti+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addOrderBy(nomeTabellaSoggetti+".tipo_soggetto");
			sqlQueryObject.addOrderBy(nomeTabellaSoggetti+".nome_soggetto");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();

			List<Long> idLong = new ArrayList<>();
			while (rs.next()) { 
				idLong.add(rs.getLong("idTrasSoggetto"));
			}
			rs.close();
			stmt.close();
			
			if(!idLong.isEmpty()) {
				
				for (Long idLongTrasf : idLong) {
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObject.addFromTable(nomeTabella);
					sqlQueryObject.addFromTable(nomeTabellaSoggetti);
					sqlQueryObject.addSelectField(nomeTabellaSoggetti+".tipo_soggetto");
					sqlQueryObject.addSelectField(nomeTabellaSoggetti+".nome_soggetto");
					sqlQueryObject.addSelectField(nomeTabellaSoggetti+".id");
					sqlQueryObject.addSelectField(nomeTabellaSoggetti+".id_trasformazione");
					sqlQueryObject.addWhereCondition(nomeTabellaSoggetti+".id=?");
					sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaSoggetti+".id_trasformazione");
					sqlQueryObject.setANDLogicOperator(true);
					queryString = sqlQueryObject.createSQLQuery();
					stmt = con.prepareStatement(queryString);
					stmt.setLong(1, idLongTrasf);

					rs = stmt.executeQuery();
					
					if(rs.next()) {
						TrasformazioneRegolaApplicabilitaSoggetto risposta = new TrasformazioneRegolaApplicabilitaSoggetto();
						risposta.setId(rs.getLong("id"));
						risposta.setTipo(rs.getString("tipo_soggetto"));
						risposta.setNome(rs.getString("nome_soggetto"));
						lista.add(risposta);
					}
					
					rs.close();
					stmt.close();
					
				}
				
			}

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

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

			this.driver.closeConnection(error,con);
		}
		
		return lista;
	} 
	
	
	protected List<TrasformazioneRegolaParametro> porteDelegateTrasformazioniRispostaHeaderList(long idPD, long idTrasformazione, long idTrasformazioneRisposta, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_HEADER;
		String nomeMetodo = "porteDelegateTrasformazioniRispostaHeaderList";
		boolean delegata = true;
		return getEngineTrasformazioniRispostaHeaderList(idPD, idTrasformazione, idTrasformazioneRisposta, ricerca, idLista, nomeMetodo, delegata);
	}
	
	protected List<TrasformazioneRegolaParametro> porteApplicativeTrasformazioniRispostaHeaderList(long idPA, long idTrasformazione, long idTrasformazioneRisposta, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_HEADER;
		String nomeMetodo = "porteApplicativeTrasformazioniRispostaHeaderList";
		boolean delegata = false;
		return getEngineTrasformazioniRispostaHeaderList(idPA, idTrasformazione, idTrasformazioneRisposta, ricerca, idLista, nomeMetodo, delegata);
	}
	
	private List<TrasformazioneRegolaParametro> getEngineTrasformazioniRispostaHeaderList(long idPA, long idTrasformazione, long idTrasformazioneRisposta, ISearch ricerca, int idLista, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		int offset; 
		int limit;
		String queryString;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);

		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRisposta = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
		String nomeTabellaRispostaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_HEADER;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<TrasformazioneRegolaParametro> lista = new ArrayList<TrasformazioneRegolaParametro>();
		try {
			
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addFromTable(nomeTabellaRispostaHeader);
			sqlQueryObject.addSelectCountField(nomeTabellaRispostaHeader+".id", "cont");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".id_transform_risp=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id="+nomeTabellaRispostaHeader+".id_transform_risp");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);
			stmt.setLong(3, idTrasformazioneRisposta);

			rs = stmt.executeQuery();
			if (rs.next())
				ricerca.setNumEntries(idLista,rs.getInt(1));
			rs.close();
			stmt.close();

			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addFromTable(nomeTabellaRispostaHeader);
			sqlQueryObject.addSelectAliasField(nomeTabellaRispostaHeader, "id", "idTrasParametro");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".tipo");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".nome");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".id");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".id_transform_risp");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".id_transform_risp=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id="+nomeTabellaRispostaHeader+".id_transform_risp");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addOrderBy(nomeTabellaRispostaHeader+".nome");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);
			stmt.setLong(3, idTrasformazioneRisposta);

			rs = stmt.executeQuery();

			List<Long> idLong = new ArrayList<>();
			while (rs.next()) { 
				idLong.add(rs.getLong("idTrasParametro"));
			}
			rs.close();
			stmt.close();
			
			if(!idLong.isEmpty()) {
				
				for (Long idLongTrasf : idLong) {
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObject.addFromTable(nomeTabella);
					sqlQueryObject.addFromTable(nomeTabellaRisposta);
					sqlQueryObject.addFromTable(nomeTabellaRispostaHeader);
					sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".tipo");
					sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".nome");
					sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".valore");
					sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".identificazione_fallita");
					sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".id");
					sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".id_transform_risp");
					sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".id=?");
					sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
					sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id="+nomeTabellaRispostaHeader+".id_transform_risp");
					sqlQueryObject.setANDLogicOperator(true);
					queryString = sqlQueryObject.createSQLQuery();
					stmt = con.prepareStatement(queryString);
					stmt.setLong(1, idLongTrasf);

					rs = stmt.executeQuery();

					if(rs.next()) {
						
						TrasformazioneRegolaParametro parametro = new TrasformazioneRegolaParametro();
						parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
						parametro.setNome(rs.getString("nome"));
						parametro.setValore(rs.getString("valore"));
						parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString("identificazione_fallita")));
						parametro.setId(rs.getLong("id"));
						lista.add(parametro);
						
					}
					
					rs.close();
					stmt.close();
					
				}
				
			}

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

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

			this.driver.closeConnection(error,con);
		}
		
		return lista;
	} 
	
	protected boolean existsPortaApplicativaTrasformazioneRispostaHeader(long idPorta, long idTrasformazione, long idTrasformazioneRisposta,  String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaApplicativaTrasformazioneRispostaHeader";
		boolean delegata = false;
		return _existsTrasformazioneRispostaHeader(idPorta, idTrasformazione, idTrasformazioneRisposta, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	protected boolean existsPortaDelegataTrasformazioneRispostaHeader(long idPorta, long idTrasformazione, long idTrasformazioneRisposta,  String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaDelegataTrasformazioneRispostaHeader";
		boolean delegata = true;
		return _existsTrasformazioneRispostaHeader(idPorta, idTrasformazione, idTrasformazioneRisposta, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	private boolean _existsTrasformazioneRispostaHeader(long idPorta, long idTrasformazione, long idTrasformazioneRisposta,  String nome, String tipo, boolean checkTipo, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRisposta = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
		String nomeTabellaRispostaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_HEADER;

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {

			int count = 0;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addFromTable(nomeTabellaRispostaHeader);
			sqlQueryObject.addSelectCountField(nomeTabellaRispostaHeader+".id", "cont");
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".id_transform_risp=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id="+nomeTabellaRispostaHeader+".id_transform_risp");
			sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".nome = ?");
			if(checkTipo) {
				sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".tipo = ?");
			}
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			stmt.setLong(parameterIndex ++, idTrasformazioneRisposta);
			stmt.setString(parameterIndex ++, nome);
			if(checkTipo) {
				stmt.setString(parameterIndex ++, tipo);
			}
			
			risultato = stmt.executeQuery();
			if (risultato.next())
				count = risultato.getInt(1);
			risultato.close();
			stmt.close();

			return count > 0;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected TrasformazioneRegolaParametro getPortaApplicativaTrasformazioneRispostaHeader(long idPorta, long idTrasformazione, long idTrasformazioneRisposta,  String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaApplicativaTrasformazioneRispostaHeader";
		boolean delegata = false;
		return getEngineTrasformazioneRispostaHeader(idPorta, idTrasformazione,  idTrasformazioneRisposta, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	protected TrasformazioneRegolaParametro getPortaDelegataTrasformazioneRispostaHeader(long idPorta, long idTrasformazione, long idTrasformazioneRisposta,  String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaDelegataTrasformazioneRispostaHeader";
		boolean delegata = true;
		return getEngineTrasformazioneRispostaHeader(idPorta, idTrasformazione,  idTrasformazioneRisposta, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	private TrasformazioneRegolaParametro getEngineTrasformazioneRispostaHeader(long idPorta, long idTrasformazione, long idTrasformazioneRisposta,  String nome, String tipo, boolean checkTipo, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet rs =null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRisposta = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
		String nomeTabellaRispostaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_HEADER;
		
		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource(nomeMetodo);
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::" + nomeMetodo + "] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
		TrasformazioneRegolaParametro parametro = null;
		try {

			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRisposta);
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".nome");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".valore");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".tipo");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".identificazione_fallita");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".id");
			sqlQueryObject.addSelectField(nomeTabellaRispostaHeader+".id_transform_risp");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".id_transform_risp=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRisposta+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRisposta+".id="+nomeTabellaRispostaHeader+".id_transform_risp");
			sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".nome = ?");
			if(checkTipo) {
				sqlQueryObject.addWhereCondition(nomeTabellaRispostaHeader+".tipo = ?");
			}
			sqlQueryObject.setANDLogicOperator(true);

			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			stmt.setLong(parameterIndex ++, idTrasformazioneRisposta);
			stmt.setString(parameterIndex ++, nome);
			if(checkTipo) {
				stmt.setString(parameterIndex ++, tipo);
			}
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				parametro = new TrasformazioneRegolaParametro();
				parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
				parametro.setNome(rs.getString("nome"));
				parametro.setValore(rs.getString("valore"));
				parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString("identificazione_fallita")));
				parametro.setId(rs.getLong("id"));
			}
			
			rs.close();
			stmt.close();

			return parametro;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected List<TrasformazioneRegolaParametro> porteDelegateTrasformazioniRichiestaHeaderList(long idPD, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_DELEGATE_TRASFORMAZIONI_RICHIESTA_HEADER;
		String nomeMetodo = "porteDelegateTrasformazioniRichiestaHeaderList";
		boolean delegata = true;
		return getEngineTrasformazioniRichiestaHeaderList(idPD, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	protected List<TrasformazioneRegolaParametro> porteApplicativeTrasformazioniRichiestaHeaderList(long idPA, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_APPLICATIVE_TRASFORMAZIONI_RICHIESTA_HEADER;
		String nomeMetodo = "porteApplicativeTrasformazioniRichiestaHeaderList";
		boolean delegata = false;
		return getEngineTrasformazioniRichiestaHeaderList(idPA, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	private List<TrasformazioneRegolaParametro> getEngineTrasformazioniRichiestaHeaderList(long idPA, long idTrasformazione, ISearch ricerca, int idLista, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		int offset; 
		int limit;
		String queryString;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);

		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRichiestaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_HEADER;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<TrasformazioneRegolaParametro> lista = new ArrayList<TrasformazioneRegolaParametro>();
		try {
			
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRichiestaHeader);
			sqlQueryObject.addSelectCountField(nomeTabellaRichiestaHeader+".id", "cont");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();
			if (rs.next())
				ricerca.setNumEntries(idLista,rs.getInt(1));
			rs.close();
			stmt.close();

			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRichiestaHeader);
			sqlQueryObject.addSelectAliasField(nomeTabellaRichiestaHeader, "id", "idTrasParametro");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".tipo");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".nome");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addOrderBy(nomeTabellaRichiestaHeader+".nome");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();

			List<Long> idLong = new ArrayList<>();
			while (rs.next()) { 
				idLong.add(rs.getLong("idTrasParametro"));
			}
			rs.close();
			stmt.close();
			
			if(!idLong.isEmpty()) {
				
				for (Long idLongTrasf : idLong) {
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObject.addFromTable(nomeTabella);
					sqlQueryObject.addFromTable(nomeTabellaRichiestaHeader);
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".tipo");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".nome");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".valore");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".identificazione_fallita");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id_trasformazione");
					sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id=?");
					sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
					sqlQueryObject.setANDLogicOperator(true);
					queryString = sqlQueryObject.createSQLQuery();
					stmt = con.prepareStatement(queryString);
					stmt.setLong(1, idLongTrasf);

					rs = stmt.executeQuery();
					
					if(rs.next()) {
						
						TrasformazioneRegolaParametro parametro = new TrasformazioneRegolaParametro();
						parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
						parametro.setNome(rs.getString("nome"));
						parametro.setValore(rs.getString("valore"));
						parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString("identificazione_fallita")));
						parametro.setId(rs.getLong("id"));
						lista.add(parametro);
						
					}
					
					rs.close();
					stmt.close();
					
				}
				
			}
			

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

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

			this.driver.closeConnection(error,con);
		}
		
		return lista;
	} 
	
	protected boolean existsPortaApplicativaTrasformazioneRichiestaHeader(long idPorta, long idTrasformazione, String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaApplicativaTrasformazioneRichiestaHeader";
		boolean delegata = false;
		return _existsTrasformazioneRichiestaHeader(idPorta, idTrasformazione, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	protected boolean existsPortaDelegataTrasformazioneRichiestaHeader(long idPorta, long idTrasformazione, String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaDelegataTrasformazioneRichiestaHeader";
		boolean delegata = true;
		return _existsTrasformazioneRichiestaHeader(idPorta, idTrasformazione, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	private boolean _existsTrasformazioneRichiestaHeader(long idPorta, long idTrasformazione, String nome, String tipo, boolean checkTipo, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRichiestaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_HEADER;

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {

			int count = 0;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRichiestaHeader);
			sqlQueryObject.addSelectCountField(nomeTabellaRichiestaHeader+".id", "cont");
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".nome = ?");
			if(checkTipo) {
				sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".tipo = ?");
			}
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			stmt.setString(parameterIndex ++, nome);
			if(checkTipo) {
				stmt.setString(parameterIndex ++, tipo);
			}
			
			risultato = stmt.executeQuery();
			if (risultato.next())
				count = risultato.getInt(1);
			risultato.close();
			stmt.close();

			return count > 0;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected TrasformazioneRegolaParametro getPortaApplicativaTrasformazioneRichiestaHeader(long idPorta, long idTrasformazione,  String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaApplicativaTrasformazioneRichiestaHeader";
		boolean delegata = false;
		return getEngineTrasformazioneRichiestaHeader(idPorta, idTrasformazione, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	protected TrasformazioneRegolaParametro getPortaDelegataTrasformazioneRichiestaHeader(long idPorta, long idTrasformazione,  String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaDelegataTrasformazioneRichiestaHeader";
		boolean delegata = true;
		return getEngineTrasformazioneRichiestaHeader(idPorta, idTrasformazione, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	private TrasformazioneRegolaParametro getEngineTrasformazioneRichiestaHeader(long idPorta, long idTrasformazione, String nome, String tipo, boolean checkTipo, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet rs =null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRichiestaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_HEADER;
		
		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource(nomeMetodo);
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::" + nomeMetodo + "] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
		TrasformazioneRegolaParametro parametro = null;
		try {

			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".nome");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".valore");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".tipo");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".identificazione_fallita");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".nome = ?");
			if(checkTipo) {
				sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".tipo = ?");
			}
			sqlQueryObject.setANDLogicOperator(true);

			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			stmt.setString(parameterIndex ++, nome);
			if(checkTipo) {
				stmt.setString(parameterIndex ++, tipo);
			}
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				parametro = new TrasformazioneRegolaParametro();
				parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
				parametro.setNome(rs.getString("nome"));
				parametro.setValore(rs.getString("valore"));
				parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString("identificazione_fallita")));
				parametro.setId(rs.getLong("id"));
			}
			
			rs.close();
			stmt.close();

			return parametro;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected List<TrasformazioneRegolaParametro> porteDelegateTrasformazioniRichiestaUrlParameterList(long idPD, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_DELEGATE_TRASFORMAZIONI_RICHIESTA_PARAMETRI;
		String nomeMetodo = "porteDelegateTrasformazioniRichiestaUrlParameterList";
		boolean delegata = true;
		return getEngineTrasformazioniRichiestaUrlParameterList(idPD, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	protected List<TrasformazioneRegolaParametro> porteApplicativeTrasformazioniRichiestaUrlParameterList(long idPA, long idTrasformazione, ISearch ricerca) throws DriverConfigurazioneException {
		int idLista = Liste.PORTE_APPLICATIVE_TRASFORMAZIONI_RICHIESTA_PARAMETRI;
		String nomeMetodo = "porteApplicativeTrasformazioniRichiestaUrlParameterList";
		boolean delegata = false;
		return getEngineTrasformazioniRichiestaUrlParameterList(idPA, idTrasformazione, ricerca, idLista, nomeMetodo, delegata);
	}
	
	private List<TrasformazioneRegolaParametro> getEngineTrasformazioniRichiestaUrlParameterList(long idPA, long idTrasformazione, ISearch ricerca, int idLista, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		int offset; 
		int limit;
		String queryString;

		limit = ricerca.getPageSize(idLista);
		offset = ricerca.getIndexIniziale(idLista);

		Connection con = null;
		boolean error = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRichiestaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_URL : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_URL;

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

			}

		} else
			con = this.driver.globalConnection;

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

		List<TrasformazioneRegolaParametro> lista = new ArrayList<TrasformazioneRegolaParametro>();
		try {
			
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRichiestaHeader);
			sqlQueryObject.addSelectCountField(nomeTabellaRichiestaHeader+".id", "cont");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();
			if (rs.next())
				ricerca.setNumEntries(idLista,rs.getInt(1));
			rs.close();
			stmt.close();

			// ricavo le entries
			if (limit == 0) // con limit
				limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
			
			sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRichiestaHeader);
			sqlQueryObject.addSelectAliasField(nomeTabellaRichiestaHeader, "id", "idTrasParametro");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".nome");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.setSelectDistinct(true);
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addOrderBy(nomeTabellaRichiestaHeader+".nome");
			sqlQueryObject.setSortType(true);
			sqlQueryObject.setLimit(limit);
			sqlQueryObject.setOffset(offset);
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			stmt.setLong(1, idPA);
			stmt.setLong(2, idTrasformazione);

			rs = stmt.executeQuery();

			List<Long> idLong = new ArrayList<>();
			while (rs.next()) { 
				idLong.add(rs.getLong("idTrasParametro"));
			}
			rs.close();
			stmt.close();
			
			if(!idLong.isEmpty()) {
				
				for (Long idLongTrasf : idLong) {
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
					sqlQueryObject.addFromTable(nomeTabella);
					sqlQueryObject.addFromTable(nomeTabellaRichiestaHeader);
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".tipo");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".nome");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".valore");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".identificazione_fallita");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id");
					sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id_trasformazione");
					sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id=?");
					sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
					sqlQueryObject.setANDLogicOperator(true);
					queryString = sqlQueryObject.createSQLQuery();
					stmt = con.prepareStatement(queryString);
					stmt.setLong(1, idLongTrasf);
					
					rs = stmt.executeQuery();
					
					if(rs.next()) {
						TrasformazioneRegolaParametro parametro = new TrasformazioneRegolaParametro();
						parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
						parametro.setNome(rs.getString("nome"));
						parametro.setValore(rs.getString("valore"));
						parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString("identificazione_fallita")));
						parametro.setId(rs.getLong("id"));
						lista.add(parametro);
					}
					
					rs.close();
					stmt.close();
					
				}
			}

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

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

			this.driver.closeConnection(error,con);
		}
		
		return lista;
	} 
	
	protected boolean existsPortaApplicativaTrasformazioneRichiestaUrlParameter(long idPorta, long idTrasformazione, String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaApplicativaTrasformazioneRichiestaUrlParameter";
		boolean delegata = false;
		return _existsTrasformazioneRichiestaUrlParameter(idPorta, idTrasformazione, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	protected boolean existsPortaDelegataTrasformazioneRichiestaUrlParameter(long idPorta, long idTrasformazione, String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "existsPortaDelegataTrasformazioneRichiestaUrlParameter";
		boolean delegata = true;
		return _existsTrasformazioneRichiestaUrlParameter(idPorta, idTrasformazione, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	private boolean _existsTrasformazioneRichiestaUrlParameter(long idPorta, long idTrasformazione, String nome, String tipo, boolean checkTipo, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet risultato=null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRichiestaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_URL : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_URL;

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

			}

		} else
			con = this.driver.globalConnection;

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

		try {

			int count = 0;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addFromTable(nomeTabellaRichiestaHeader);
			sqlQueryObject.addSelectCountField(nomeTabellaRichiestaHeader+".id", "cont");
			sqlQueryObject.setANDLogicOperator(true);
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".nome = ?");
			if(checkTipo) {
				sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".tipo = ?");
			}
			
			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			stmt.setString(parameterIndex ++, nome);
			if(checkTipo) {
				stmt.setString(parameterIndex ++, tipo);
			}
			
			risultato = stmt.executeQuery();
			if (risultato.next())
				count = risultato.getInt(1);
			risultato.close();
			stmt.close();

			return count > 0;

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

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

			this.driver.closeConnection(error,con);
		}
	}
	
	protected TrasformazioneRegolaParametro getPortaApplicativaTrasformazioneRichiestaUrlParameter(long idPorta, long idTrasformazione,  String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaApplicativaTrasformazioneRichiestaUrlParameter";
		boolean delegata = false;
		return getEngineTrasformazioneRichiestaUrlParameter(idPorta, idTrasformazione, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	protected TrasformazioneRegolaParametro getPortaDelegataTrasformazioneRichiestaUrlParameter(long idPorta, long idTrasformazione,  String nome, String tipo, boolean checkTipo) throws DriverConfigurazioneException {
		String nomeMetodo = "getPortaDelegataTrasformazioneRichiestaUrlParameter";
		boolean delegata = true;
		return getEngineTrasformazioneRichiestaUrlParameter(idPorta, idTrasformazione, nome, tipo, checkTipo, nomeMetodo, delegata);
	}
	
	private TrasformazioneRegolaParametro getEngineTrasformazioneRichiestaUrlParameter(long idPorta, long idTrasformazione, String nome, String tipo, boolean checkTipo, String nomeMetodo, boolean portaDelegata) throws DriverConfigurazioneException {
		Connection con = null;
		boolean error = false;
		PreparedStatement stmt=null;
		ResultSet rs =null;
		String queryString;
		String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
		String nomeTabellaRichiestaHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_URL : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_URL;
		
		if (this.driver.atomica) {
			try {
				con = this.driver.getConnectionFromDatasource(nomeMetodo);
				con.setAutoCommit(false);
			} catch (Exception e) {
				throw new DriverConfigurazioneException("[DriverConfigurazioneDB::" + nomeMetodo + "] Exception accedendo al datasource :" + e.getMessage(),e);

			}

		} else
			con = this.driver.globalConnection;

		this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
		TrasformazioneRegolaParametro parametro = null;
		try {

			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".nome");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".valore");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".tipo");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".identificazione_fallita");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id");
			sqlQueryObject.addSelectField(nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabella+".id_porta=?");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".id_trasformazione=?");
			sqlQueryObject.addWhereCondition(nomeTabella+".id="+nomeTabellaRichiestaHeader+".id_trasformazione");
			sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".nome = ?");
			if(checkTipo) {
				sqlQueryObject.addWhereCondition(nomeTabellaRichiestaHeader+".tipo = ?");
			}
			sqlQueryObject.setANDLogicOperator(true);

			queryString = sqlQueryObject.createSQLQuery();
			stmt = con.prepareStatement(queryString);
			int parameterIndex = 1;
			stmt.setLong(parameterIndex ++, idPorta);
			stmt.setLong(parameterIndex ++, idTrasformazione);
			stmt.setString(parameterIndex ++, nome);
			if(checkTipo) {
				stmt.setString(parameterIndex ++, tipo);
			}
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				parametro = new TrasformazioneRegolaParametro();
				parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
				parametro.setNome(rs.getString("nome"));
				parametro.setValore(rs.getString("valore"));
				parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString("identificazione_fallita")));
				parametro.setId(rs.getLong("id"));
			}
			
			rs.close();
			stmt.close();

			return parametro;

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

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

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