DriverConfigurazioneDBTrasformazioniLib.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 static org.openspcoop2.core.constants.CostantiDB.CREATE;
import static org.openspcoop2.core.constants.CostantiDB.DELETE;
import static org.openspcoop2.core.constants.CostantiDB.UPDATE;

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

import org.openspcoop2.core.commons.DBUtils;
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.Trasformazioni;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.utils.TipiDatabase;
import org.openspcoop2.utils.jdbc.CustomKeyGeneratorObject;
import org.openspcoop2.utils.jdbc.IJDBCAdapter;
import org.openspcoop2.utils.jdbc.InsertAndGeneratedKey;
import org.openspcoop2.utils.jdbc.InsertAndGeneratedKeyJDBCType;
import org.openspcoop2.utils.jdbc.InsertAndGeneratedKeyObject;
import org.openspcoop2.utils.jdbc.JDBCAdapterException;
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_trasformazioniLIB
 * 
 * @author Stefano Corallo - corallo@link.it
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class DriverConfigurazioneDBTrasformazioniLib {
	
	private DriverConfigurazioneDBTrasformazioniLib() {}

	private static final String ESEGUO_QUERY_PREFIX = "eseguo query : ";
	
	private static void normalizePositionsEngine(Trasformazioni trasformazioni) {
		if(trasformazioni==null || trasformazioni.sizeRegolaList()<=0) {
			return;
		}
		
		List<Integer> posizioni = new ArrayList<>();
		HashMap<Integer, TrasformazioneRegola> regole = new HashMap<>();
		for (TrasformazioneRegola regola : trasformazioni.getRegolaList()) {
			posizioni.add(regola.getPosizione());
			regole.put(regola.getPosizione(), regola);
		}
		while(trasformazioni.sizeRegolaList()>0) {
			trasformazioni.removeRegola(0);
		}
		Collections.sort( posizioni );
		int posNew = 1;
		for (Integer pos : posizioni) {
			TrasformazioneRegola regola = regole.get(pos);
			regola.setPosizione(posNew);
			trasformazioni.addRegola(regola);
			posNew++;
		}
		
		// normalizzazione delle risposte
		for (TrasformazioneRegola regola : trasformazioni.getRegolaList()) {
			
			if(regola.getRispostaList()==null || regola.sizeRispostaList()<=0){
				continue;
			}
			
			List<Integer> posizioniRisposta = new ArrayList<>();
			HashMap<Integer, TrasformazioneRegolaRisposta> regoleRisposta = new HashMap<>();
			for (TrasformazioneRegolaRisposta regolaRisposta : regola.getRispostaList()) {
				posizioniRisposta.add(regolaRisposta.getPosizione());
				regoleRisposta.put(regolaRisposta.getPosizione(), regolaRisposta);
			}
			while(regola.sizeRispostaList()>0) {
				regola.removeRisposta(0);
			}
			Collections.sort( posizioniRisposta );
			int posRispostaNew = 1;
			for (Integer posRisposta : posizioniRisposta) {
				TrasformazioneRegolaRisposta regolaRisposta = regoleRisposta.get(posRisposta);
				regolaRisposta.setPosizione(posRispostaNew);
				regola.addRisposta(regolaRisposta);
				posRispostaNew++;
			}
		}
	}
	
	static void CRUDTrasformazioni(int type, Connection con, Trasformazioni trasformazioni, 
			Long idProprietario, boolean portaDelegata) throws DriverConfigurazioneException, JDBCAdapterException {
		
		PreparedStatement updateStmt = null;
		ResultSet rs = null;
		IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverConfigurazioneDBLib.tipoDB);
		try {
			switch (type) {
			case CREATE:
		
				if(trasformazioni==null || trasformazioni.sizeRegolaList()<=0) {
					break;
				}
				
				normalizePositionsEngine(trasformazioni);
				
				for (TrasformazioneRegola regola : trasformazioni.getRegolaList()) {
					
					String applicabilitaAzioni = null;
					if(regola.getApplicabilita()!=null && regola.getApplicabilita().sizeAzioneList()>0) {
						StringBuilder bf = new StringBuilder();
						for (int i = 0; i < regola.getApplicabilita().sizeAzioneList(); i++) {
							if(i>0) {
								bf.append(",");
							}
							bf.append(regola.getApplicabilita().getAzione(i));
						}
						if(bf.length()>0) {
							applicabilitaAzioni = bf.toString();
						}
					}
					
					String applicabilitaCT = null;
					if(regola.getApplicabilita()!=null && regola.getApplicabilita().sizeContentTypeList()>0) {
						StringBuilder bf = new StringBuilder();
						for (int i = 0; i < regola.getApplicabilita().sizeContentTypeList(); i++) {
							if(i>0) {
								bf.append(",");
							}
							bf.append(regola.getApplicabilita().getContentType(i));
						}
						if(bf.length()>0) {
							applicabilitaCT = bf.toString();
						}
					}
					
					String applicabilitaConnettori = null;
					if(regola.getApplicabilita()!=null && regola.getApplicabilita().sizeConnettoreList()>0) {
						StringBuilder bf = new StringBuilder();
						for (int i = 0; i < regola.getApplicabilita().sizeConnettoreList(); i++) {
							if(i>0) {
								bf.append(",");
							}
							bf.append(regola.getApplicabilita().getConnettore(i));
						}
						if(bf.length()>0) {
							applicabilitaConnettori = bf.toString();
						}
					}
					
					List<InsertAndGeneratedKeyObject> listInsertAndGeneratedKeyObject = new ArrayList<>();
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("id_porta", idProprietario , InsertAndGeneratedKeyJDBCType.LONG) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("nome", regola.getNome() , InsertAndGeneratedKeyJDBCType.STRING) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_POSIZIONE, regola.getPosizione() , InsertAndGeneratedKeyJDBCType.INT) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("stato", DriverConfigurazioneDBLib.getValue(regola.getStato()) , InsertAndGeneratedKeyJDBCType.STRING) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("applicabilita_azioni", applicabilitaAzioni , InsertAndGeneratedKeyJDBCType.STRING) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_APPLICABILITA_CT, applicabilitaCT , InsertAndGeneratedKeyJDBCType.STRING) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_APPLICABILITA_PATTERN, (regola.getApplicabilita()!=null ? regola.getApplicabilita().getPattern() : null) , InsertAndGeneratedKeyJDBCType.STRING) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("applicabilita_connettori", applicabilitaConnettori , InsertAndGeneratedKeyJDBCType.STRING) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("req_conversione_enabled", ( regola.getRichiesta()!=null && regola.getRichiesta().getConversione()) ? CostantiDB.TRUE : CostantiDB.FALSE , InsertAndGeneratedKeyJDBCType.INT) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("req_conversione_tipo", (regola.getRichiesta()!=null ? regola.getRichiesta().getConversioneTipo() : null) , InsertAndGeneratedKeyJDBCType.STRING) );
					listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("req_content_type", (regola.getRichiesta()!=null ? regola.getRichiesta().getContentType() : null) , InsertAndGeneratedKeyJDBCType.STRING) );
					if(regola.getRichiesta()!=null && regola.getRichiesta().getTrasformazioneRest()!=null) {
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("rest_transformation", CostantiDB.TRUE , InsertAndGeneratedKeyJDBCType.INT) );
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("rest_method", regola.getRichiesta().getTrasformazioneRest().getMetodo() , InsertAndGeneratedKeyJDBCType.STRING) );
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("rest_path", regola.getRichiesta().getTrasformazioneRest().getPath() , InsertAndGeneratedKeyJDBCType.STRING) );
					}
					if(regola.getRichiesta()!=null && regola.getRichiesta().getTrasformazioneSoap()!=null) {
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("soap_transformation", CostantiDB.TRUE , InsertAndGeneratedKeyJDBCType.INT) );
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("soap_version", DriverConfigurazioneDBLib.getValue(regola.getRichiesta().getTrasformazioneSoap().getVersione()) , InsertAndGeneratedKeyJDBCType.STRING) );
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("soap_action", regola.getRichiesta().getTrasformazioneSoap().getSoapAction() , InsertAndGeneratedKeyJDBCType.STRING) );
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE, (regola.getRichiesta().getTrasformazioneSoap().getEnvelope() ? CostantiDB.TRUE : CostantiDB.FALSE) , InsertAndGeneratedKeyJDBCType.INT) );
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_AS_ATTACH, (regola.getRichiesta().getTrasformazioneSoap().getEnvelopeAsAttachment() ? CostantiDB.TRUE : CostantiDB.FALSE) , InsertAndGeneratedKeyJDBCType.INT) );
						listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_TIPO, regola.getRichiesta().getTrasformazioneSoap().getEnvelopeBodyConversioneTipo() , InsertAndGeneratedKeyJDBCType.STRING) );
					}
					// Insert and return generated key
					String tableName = null;
					String columnIdName = null;
					String sequence = null;
					String tableForId = null;
					if(portaDelegata) {
						tableName = CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI;
						columnIdName = CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_COLUMN_ID;
						sequence = CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_SEQUENCE;
						tableForId = CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_TABLE_FOR_ID;
					}
					else {
						tableName = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
						columnIdName = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_COLUMN_ID;
						sequence = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SEQUENCE;
						tableForId = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_TABLE_FOR_ID;
					}
					long idtrasformazione = InsertAndGeneratedKey.insertAndReturnGeneratedKey(con, TipiDatabase.toEnumConstant(DriverConfigurazioneDBLib.tipoDB), 
							new CustomKeyGeneratorObject(tableName, columnIdName, sequence, tableForId),
							listInsertAndGeneratedKeyObject.toArray(new InsertAndGeneratedKeyObject[1]));
					if(idtrasformazione<=0){
						throw new DriverConfigurazioneException("ID autoincrementale non ottenuto");
					}
					
					if( regola.getRichiesta()!=null && 
							(
									regola.getRichiesta().getConversioneTemplate()!=null 
									||
									(regola.getRichiesta().getTrasformazioneSoap()!=null && regola.getRichiesta().getTrasformazioneSoap().getEnvelopeBodyConversioneTemplate()!=null)
							) ) {
						ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addUpdateTable(tableName);
						if(regola.getRichiesta().getConversioneTemplate()!=null ) {
							sqlQueryObject.addUpdateField("req_conversione_template", "?");
						}
						if(regola.getRichiesta().getTrasformazioneSoap()!=null && regola.getRichiesta().getTrasformazioneSoap().getEnvelopeBodyConversioneTemplate()!=null) {
							sqlQueryObject.addUpdateField(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_TEMPLATE, "?");
						}
						sqlQueryObject.addWhereCondition(columnIdName+"=?");
						String updateQuery = sqlQueryObject.createSQLUpdate();
						updateStmt = con.prepareStatement(updateQuery);
						int index = 1;
						if(regola.getRichiesta().getConversioneTemplate()!=null ) {
							jdbcAdapter.setBinaryData(updateStmt, index++, regola.getRichiesta()!=null ? regola.getRichiesta().getConversioneTemplate() : null);
						}
						if(regola.getRichiesta().getTrasformazioneSoap()!=null && regola.getRichiesta().getTrasformazioneSoap().getEnvelopeBodyConversioneTemplate()!=null) {
							jdbcAdapter.setBinaryData(updateStmt, index++, regola.getRichiesta().getTrasformazioneSoap().getEnvelopeBodyConversioneTemplate());
						}
						updateStmt.setLong(index++, idtrasformazione);
						updateStmt.executeUpdate();
						updateStmt.close();
					}
				
					
					if(regola.getRichiesta()!=null) {
						
						if(regola.getApplicabilita()!=null) {
							
							if(!portaDelegata && regola.getApplicabilita().sizeSoggettoList()>0) {
								// Soggetti
								int n=0;
								for (int j = 0; j < regola.getApplicabilita().sizeSoggettoList(); j++) {
									TrasformazioneRegolaApplicabilitaSoggetto soggetto = regola.getApplicabilita().getSoggetto(j);
									ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
									sqlQueryObject.addInsertTable(CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTI);
									sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE, "?");
									sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_TIPO_SOGGETTO, "?");
									sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_NOME_SOGGETTO, "?");
									String sqlQuery = sqlQueryObject.createSQLInsert();
									updateStmt = con.prepareStatement(sqlQuery);
									updateStmt.setLong(1, idtrasformazione);
									updateStmt.setString(2, soggetto.getTipo());
									updateStmt.setString(3, soggetto.getNome());
									updateStmt.executeUpdate();
									updateStmt.close();
									n++;
									DriverConfigurazioneDBLib.logDebug("Aggiunto soggetto [" + soggetto.getTipo() + "/"+soggetto.getNome()+"] alla Trasformazione[" + idtrasformazione + "]");
								}
								
								DriverConfigurazioneDBLib.logDebug("Aggiunti " + n + " soggetti alla Trasformazione[" + idtrasformazione + "]");
							}
							
							
							// serviziapplicativi
							if(regola.getApplicabilita().sizeServizioApplicativoList()>0) {
								ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
								if(portaDelegata) {
									sqlQueryObject.addInsertTable(CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_SA);
								}
								else {
									sqlQueryObject.addInsertTable(CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SA);
								}
								sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE, "?");
								sqlQueryObject.addInsertField("id_servizio_applicativo", "?");
								String sqlQuery = sqlQueryObject.createSQLInsert();
								updateStmt = con.prepareStatement(sqlQuery);
				
								int i = 0;
								for (i = 0; i < regola.getApplicabilita().sizeServizioApplicativoList(); i++) {
									TrasformazioneRegolaApplicabilitaServizioApplicativo servizioApplicativo = regola.getApplicabilita().getServizioApplicativo(i);
									String nomeSA = servizioApplicativo.getNome();
									String nomeProprietarioSA = servizioApplicativo.getNomeSoggettoProprietario();
									String tipoProprietarioSA = servizioApplicativo.getTipoSoggettoProprietario();
									if (nomeSA == null || nomeSA.equals(""))
										throw new DriverConfigurazioneException("[CRUDPortaApplicativa(CREATE)[Transf]::Nome del ServizioApplicativo associato non valido.");
									if (nomeProprietarioSA == null || nomeProprietarioSA.equals(""))
										throw new DriverConfigurazioneException("[CRUDPortaApplicativa(CREATE)[Transf]::Nome Proprietario del ServizioApplicativo associato non valido.");
									if (tipoProprietarioSA == null || tipoProprietarioSA.equals(""))
										throw new DriverConfigurazioneException("[CRUDPortaApplicativa(CREATE)[Transf]::Tipo Proprietario del ServizioApplicativo associato non valido.");
				
									long idSA = DriverConfigurazioneDB_serviziApplicativiLIB.getIdServizioApplicativo(nomeSA, tipoProprietarioSA, nomeProprietarioSA, con, DriverConfigurazioneDBLib.tipoDB,DriverConfigurazioneDBLib.tabellaSoggetti);
				
									if (idSA <= 0)
										throw new DriverConfigurazioneException("Impossibile recuperare l'id del Servizio Applicativo [" + nomeSA + "] di [" + tipoProprietarioSA + "/" + nomeProprietarioSA + "]");
				
									updateStmt.setLong(1, idtrasformazione);
									updateStmt.setLong(2, idSA);
									updateStmt.executeUpdate();
								}
								updateStmt.close();
								DriverConfigurazioneDBLib.logDebug("Inseriti " + i + " servizi applicativi autorizzati associati alla Trasformazione[" + idtrasformazione + "]");
							}
							
						}
						
						if(regola.getRichiesta().sizeHeaderList()>0) {
							for (TrasformazioneRegolaParametro parametro : regola.getRichiesta().getHeaderList()) {
								
								ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
								if(portaDelegata) {
									sqlQueryObject.addInsertTable(CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_HEADER);
								}
								else {
									sqlQueryObject.addInsertTable(CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_HEADER);
								}
								sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE, "?");
								sqlQueryObject.addInsertField("tipo", "?");
								sqlQueryObject.addInsertField("nome", "?");
								sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_VALORE, "?");
								sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_IDENTIFICAZIONE_FALLITA, "?");
								
								String updateQuery = sqlQueryObject.createSQLInsert();
								updateStmt = con.prepareStatement(updateQuery);
								int index = 1;
								updateStmt.setLong(index++, idtrasformazione);
								updateStmt.setString(index++, DriverConfigurazioneDBLib.getValue(parametro.getConversioneTipo()));
								updateStmt.setString(index++, parametro.getNome());
								updateStmt.setString(index++, parametro.getValore());
								updateStmt.setString(index++, DriverConfigurazioneDBLib.getValue(parametro.getIdentificazioneFallita()));
								updateStmt.executeUpdate();
								updateStmt.close();
							}
						}
						
						if(regola.getRichiesta().sizeParametroUrlList()>0) {
							for (TrasformazioneRegolaParametro parametro : regola.getRichiesta().getParametroUrlList()) {
								
								ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
								if(portaDelegata) {
									sqlQueryObject.addInsertTable(CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_URL);
								}
								else {
									sqlQueryObject.addInsertTable(CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_URL);
								}
								sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE, "?");
								sqlQueryObject.addInsertField("tipo", "?");
								sqlQueryObject.addInsertField("nome", "?");
								sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_VALORE, "?");
								sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_IDENTIFICAZIONE_FALLITA, "?");
								
								String updateQuery = sqlQueryObject.createSQLInsert();
								updateStmt = con.prepareStatement(updateQuery);
								int index = 1;
								updateStmt.setLong(index++, idtrasformazione);
								updateStmt.setString(index++, DriverConfigurazioneDBLib.getValue(parametro.getConversioneTipo()));
								updateStmt.setString(index++, parametro.getNome());
								updateStmt.setString(index++, parametro.getValore());
								updateStmt.setString(index++, DriverConfigurazioneDBLib.getValue(parametro.getIdentificazioneFallita()));
								updateStmt.executeUpdate();
								updateStmt.close();
							}
						}
					}
					
					if(regola.sizeRispostaList()>0) {
						
						for (TrasformazioneRegolaRisposta regolaRisposta : regola.getRispostaList()) {
							
							String applicabilitaCtResponse = null;
							if(regolaRisposta.getApplicabilita()!=null && regolaRisposta.getApplicabilita().sizeContentTypeList()>0) {
								StringBuilder bf = new StringBuilder();
								for (int i = 0; i < regolaRisposta.getApplicabilita().sizeContentTypeList(); i++) {
									if(i>0) {
										bf.append(",");
									}
									bf.append(regolaRisposta.getApplicabilita().getContentType(i));
								}
								if(bf.length()>0) {
									applicabilitaCtResponse = bf.toString();
								}
							}
							
							listInsertAndGeneratedKeyObject = new ArrayList<>();
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE, idtrasformazione , InsertAndGeneratedKeyJDBCType.LONG) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("nome", regolaRisposta.getNome() , InsertAndGeneratedKeyJDBCType.STRING) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_POSIZIONE, regolaRisposta.getPosizione() , InsertAndGeneratedKeyJDBCType.INT) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("applicabilita_status_min", 
									(regolaRisposta.getApplicabilita()!=null && regolaRisposta.getApplicabilita().getReturnCodeMin()!=null && 
									regolaRisposta.getApplicabilita().getReturnCodeMin().intValue()>0) ? regolaRisposta.getApplicabilita().getReturnCodeMin().intValue() : null , InsertAndGeneratedKeyJDBCType.INT) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("applicabilita_status_max", 
									(regolaRisposta.getApplicabilita()!=null && regolaRisposta.getApplicabilita().getReturnCodeMax()!=null && 
									regolaRisposta.getApplicabilita().getReturnCodeMax().intValue()>0) ? regolaRisposta.getApplicabilita().getReturnCodeMax().intValue() : null , InsertAndGeneratedKeyJDBCType.INT) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_APPLICABILITA_CT, applicabilitaCtResponse , InsertAndGeneratedKeyJDBCType.STRING) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_APPLICABILITA_PATTERN, (regolaRisposta.getApplicabilita()!=null ? regolaRisposta.getApplicabilita().getPattern() : null) , InsertAndGeneratedKeyJDBCType.STRING) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("conversione_enabled", regolaRisposta.getConversione() ? CostantiDB.TRUE : CostantiDB.FALSE , InsertAndGeneratedKeyJDBCType.INT) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("conversione_tipo", regolaRisposta.getConversioneTipo() , InsertAndGeneratedKeyJDBCType.STRING) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("content_type", regolaRisposta.getContentType() , InsertAndGeneratedKeyJDBCType.STRING) );
							listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject("return_code", regolaRisposta.getReturnCode(), InsertAndGeneratedKeyJDBCType.STRING) );
							if(regolaRisposta.getTrasformazioneSoap()!=null) {
								listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE, (regolaRisposta.getTrasformazioneSoap().getEnvelope() ? CostantiDB.TRUE : CostantiDB.FALSE) , InsertAndGeneratedKeyJDBCType.INT) );
								listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_AS_ATTACH, (regolaRisposta.getTrasformazioneSoap().getEnvelopeAsAttachment() ? CostantiDB.TRUE : CostantiDB.FALSE) , InsertAndGeneratedKeyJDBCType.INT) );
								listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_TIPO, regolaRisposta.getTrasformazioneSoap().getEnvelopeBodyConversioneTipo() , InsertAndGeneratedKeyJDBCType.STRING) );
							}
							// Insert and return generated key
							tableName = null;
							columnIdName = null;
							sequence = null;
							tableForId = null;
							if(portaDelegata) {
								tableName = CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE;
								columnIdName = CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_COLUMN_ID;
								sequence = CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_SEQUENCE;
								tableForId = CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_TABLE_FOR_ID;
							}
							else {
								tableName = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
								columnIdName = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_COLUMN_ID;
								sequence = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_SEQUENCE;
								tableForId = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_TABLE_FOR_ID;
							}
							long idtrasformazioneRisposta = InsertAndGeneratedKey.insertAndReturnGeneratedKey(con, TipiDatabase.toEnumConstant(DriverConfigurazioneDBLib.tipoDB), 
									new CustomKeyGeneratorObject(tableName, columnIdName, sequence, tableForId),
									listInsertAndGeneratedKeyObject.toArray(new InsertAndGeneratedKeyObject[1]));
							if(idtrasformazioneRisposta<=0){
								throw new DriverConfigurazioneException("ID autoincrementale non ottenuto");
							}
							
							if( 	regolaRisposta.getConversioneTemplate()!=null 
											||
											(regolaRisposta.getTrasformazioneSoap()!=null && regolaRisposta.getTrasformazioneSoap().getEnvelopeBodyConversioneTemplate()!=null)
								 ) {
								ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
								sqlQueryObject.addUpdateTable(tableName);
								if(regolaRisposta.getConversioneTemplate()!=null ) {
									sqlQueryObject.addUpdateField("conversione_template", "?");
								}
								if(regolaRisposta.getTrasformazioneSoap()!=null && regolaRisposta.getTrasformazioneSoap().getEnvelopeBodyConversioneTemplate()!=null) {
									sqlQueryObject.addUpdateField(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_TEMPLATE, "?");
								}
								sqlQueryObject.addWhereCondition(columnIdName+"=?");
								String updateQuery = sqlQueryObject.createSQLUpdate();
								updateStmt = con.prepareStatement(updateQuery);
								int index = 1;
								if(regolaRisposta.getConversioneTemplate()!=null ) {
									jdbcAdapter.setBinaryData(updateStmt, index++, regolaRisposta.getConversioneTemplate());
								}
								if(regolaRisposta.getTrasformazioneSoap()!=null && regolaRisposta.getTrasformazioneSoap().getEnvelopeBodyConversioneTemplate()!=null) {
									jdbcAdapter.setBinaryData(updateStmt, index++, regolaRisposta.getTrasformazioneSoap().getEnvelopeBodyConversioneTemplate());
								}
								updateStmt.setLong(index++, idtrasformazioneRisposta);
								updateStmt.executeUpdate();
								updateStmt.close();
							}
							
							if(regolaRisposta.sizeHeaderList()>0) {
								for (TrasformazioneRegolaParametro parametro : regolaRisposta.getHeaderList()) {
									
									ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
									if(portaDelegata) {
										sqlQueryObject.addInsertTable(CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_HEADER);
									}
									else {
										sqlQueryObject.addInsertTable(CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_HEADER);
									}
									sqlQueryObject.addInsertField("id_transform_risp", "?");
									sqlQueryObject.addInsertField("tipo", "?");
									sqlQueryObject.addInsertField("nome", "?");
									sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_VALORE, "?");
									sqlQueryObject.addInsertField(CostantiDB.TRASFORMAZIONI_COLUMN_IDENTIFICAZIONE_FALLITA, "?");
									
									String updateQuery = sqlQueryObject.createSQLInsert();
									updateStmt = con.prepareStatement(updateQuery);
									int index = 1;
									updateStmt.setLong(index++, idtrasformazioneRisposta);
									updateStmt.setString(index++, DriverConfigurazioneDBLib.getValue(parametro.getConversioneTipo()));
									updateStmt.setString(index++, parametro.getNome());
									updateStmt.setString(index++, parametro.getValore());
									updateStmt.setString(index++, DriverConfigurazioneDBLib.getValue(parametro.getIdentificazioneFallita()));
									updateStmt.executeUpdate();
									updateStmt.close();
								}
							}
						}
						
					}
					
				}
				
				break;
				
			case UPDATE:
				
				// Per la delete recupero l'immagine attuale del configurazione
				Trasformazioni trasformazioniOld = readTrasformazioni(idProprietario, portaDelegata, con);
				if(trasformazioniOld!=null) {
					CRUDTrasformazioni(DELETE, con, trasformazioniOld, idProprietario, portaDelegata);
				}
				
				// Creo la nuova immagine
				if(trasformazioni!=null) {
					
					normalizePositionsEngine(trasformazioni);
					
					CRUDTrasformazioni(CREATE, con, trasformazioni, idProprietario, portaDelegata);
				}
				break;
				
			case DELETE:
				
				if(trasformazioni==null) {
					break;
				}
				
				String tableName = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
				String tableNameSoggetti = portaDelegata ? null : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTI;
				String tableNameSA = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_SA : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SA;
				String tableNameHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_HEADER;
				String tableNameUrl = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_URL : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_URL;
				String tableNameRisposte = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
				String tableNameRisposteHeader = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_HEADER;
				List<Long> idTrasformazioneList = new ArrayList<>();
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addFromTable(tableName);
				sqlQueryObject.addSelectField("id");
				sqlQueryObject.addWhereCondition(CostantiDB.PORTA_COLUMN_ID_REF+"=?");
				sqlQueryObject.setANDLogicOperator(true);
				String updateQuery = sqlQueryObject.createSQLQuery();
				updateStmt = con.prepareStatement(updateQuery);
				updateStmt.setLong(1, idProprietario);
				rs = updateStmt.executeQuery();
				while(rs.next()) {
					idTrasformazioneList.add(rs.getLong("id"));
				}
				rs.close();
				updateStmt.close();
				
				if(idTrasformazioneList.isEmpty()) {
					break;
				}
				
				for (Long idTrasformazione : idTrasformazioneList) {
					
					if(tableNameSoggetti!=null) {
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addDeleteTable(tableNameSoggetti);
						sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
						sqlQueryObject.setANDLogicOperator(true);
						updateQuery = sqlQueryObject.createSQLDelete();
						updateStmt = con.prepareStatement(updateQuery);
						updateStmt.setLong(1, idTrasformazione);
						updateStmt.executeUpdate();
						updateStmt.close();
					}
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
					sqlQueryObject.addDeleteTable(tableNameSA);
					sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
					sqlQueryObject.setANDLogicOperator(true);
					updateQuery = sqlQueryObject.createSQLDelete();
					updateStmt = con.prepareStatement(updateQuery);
					updateStmt.setLong(1, idTrasformazione);
					updateStmt.executeUpdate();
					updateStmt.close();
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
					sqlQueryObject.addDeleteTable(tableNameHeader);
					sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
					sqlQueryObject.setANDLogicOperator(true);
					updateQuery = sqlQueryObject.createSQLDelete();
					updateStmt = con.prepareStatement(updateQuery);
					updateStmt.setLong(1, idTrasformazione);
					updateStmt.executeUpdate();
					updateStmt.close();
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
					sqlQueryObject.addDeleteTable(tableNameUrl);
					sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
					sqlQueryObject.setANDLogicOperator(true);
					updateQuery = sqlQueryObject.createSQLDelete();
					updateStmt = con.prepareStatement(updateQuery);
					updateStmt.setLong(1, idTrasformazione);
					updateStmt.executeUpdate();
					updateStmt.close();
					
					List<Long> idTrasformazioneRisposteList = new ArrayList<>();
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
					sqlQueryObject.addFromTable(tableNameRisposte);
					sqlQueryObject.addSelectField("id");
					sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
					sqlQueryObject.setANDLogicOperator(true);
					updateQuery = sqlQueryObject.createSQLQuery();
					updateStmt = con.prepareStatement(updateQuery);
					updateStmt.setLong(1, idTrasformazione);
					rs = updateStmt.executeQuery();
					while(rs.next()) {
						idTrasformazioneRisposteList.add(rs.getLong("id"));
					}
					rs.close();
					updateStmt.close();
					
					if(!idTrasformazioneRisposteList.isEmpty()) {
						
						for (Long idTrasformazioneRisposta : idTrasformazioneRisposteList) {
							
							sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
							sqlQueryObject.addDeleteTable(tableNameRisposteHeader);
							sqlQueryObject.addWhereCondition("id_transform_risp=?");
							sqlQueryObject.setANDLogicOperator(true);
							updateQuery = sqlQueryObject.createSQLDelete();
							updateStmt = con.prepareStatement(updateQuery);
							updateStmt.setLong(1, idTrasformazioneRisposta);
							updateStmt.executeUpdate();
							updateStmt.close();
							
						}
						
					}
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
					sqlQueryObject.addDeleteTable(tableNameRisposte);
					sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
					sqlQueryObject.setANDLogicOperator(true);
					updateQuery = sqlQueryObject.createSQLDelete();
					updateStmt = con.prepareStatement(updateQuery);
					updateStmt.setLong(1, idTrasformazione);
					updateStmt.executeUpdate();
					updateStmt.close();
					
				}
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addDeleteTable(tableName);
				sqlQueryObject.addWhereCondition(CostantiDB.PORTA_COLUMN_ID_REF+"=?");
				sqlQueryObject.setANDLogicOperator(true);
				updateQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(updateQuery);
				updateStmt.setLong(1, idProprietario);
				updateStmt.executeUpdate();
				updateStmt.close();
				
				break;
				
			default:
				break;
			}
		
		} catch (SQLException se) {
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDConfigurazioneGenerale] SQLException [" + se.getMessage() + "].",se);
		}catch (Exception se) {
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDConfigurazioneGenerale] Exception [" + se.getMessage() + "].",se);
		} finally {
	
			JDBCUtilities.closeResources(rs, updateStmt);
			
		}
	}
	
	public static Trasformazioni readTrasformazioni(long idPorta, boolean portaDelegata, Connection con) throws Exception {
		
		PreparedStatement stm = null;
		ResultSet rs = null;
		PreparedStatement stm1 = null;
		ResultSet rs1 = null;
		Trasformazioni trasformazioni = null;
		try {
			
			String nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI;
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
			sqlQueryObject.addFromTable(nomeTabella);
			sqlQueryObject.addSelectField("*");
			sqlQueryObject.addWhereCondition(CostantiDB.PORTA_COLUMN_ID_REF+"=?");
			sqlQueryObject.addOrderBy(CostantiDB.TRASFORMAZIONI_COLUMN_POSIZIONE);
			sqlQueryObject.addOrderBy("nome");
			sqlQueryObject.setSortType(true);
			String sqlQuery = sqlQueryObject.createSQLQuery();
			stm = con.prepareStatement(sqlQuery);
			stm.setLong(1, idPorta);
	
			DriverConfigurazioneDBLib.logDebug(ESEGUO_QUERY_PREFIX + DBUtils.formatSQLString(sqlQuery, idPorta));
			rs = stm.executeQuery();
	
			while (rs.next()) {
				
				if(trasformazioni==null) {
					trasformazioni = new Trasformazioni();
				}
				
				TrasformazioneRegola regola = new TrasformazioneRegola();
				
				String nome = rs.getString("nome");
				regola.setNome(nome);
				
				int posizione = rs.getInt(CostantiDB.TRASFORMAZIONI_COLUMN_POSIZIONE);
				regola.setPosizione(posizione);
				
				StatoFunzionalita stato = DriverConfigurazioneDBLib.getEnumStatoFunzionalita(rs.getString("stato"));
				regola.setStato(stato);
				
				String applicabilitaAzioni = rs.getString("applicabilita_azioni");
				String applicabilitaCT = rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_APPLICABILITA_CT);
				String applicabilitaPattern = rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_APPLICABILITA_PATTERN);
				String applicabilitaConnettori = rs.getString("applicabilita_connettori");
				if( (applicabilitaAzioni!=null && !"".equals(applicabilitaAzioni)) ||
						(applicabilitaCT!=null && !"".equals(applicabilitaCT)) ||
						(applicabilitaPattern!=null && !"".equals(applicabilitaPattern))  ||
						(applicabilitaConnettori!=null && !"".equals(applicabilitaConnettori)) 
						) {
					TrasformazioneRegolaApplicabilitaRichiesta applicabilita = new TrasformazioneRegolaApplicabilitaRichiesta();
					
					if( (applicabilitaAzioni!=null && !"".equals(applicabilitaAzioni)) ) {
						if(applicabilitaAzioni.contains(",")) {
							String [] tmp = applicabilitaAzioni.split(",");
							for (int i = 0; i < tmp.length; i++) {
								applicabilita.addAzione(tmp[i].trim());
							}
						}
						else {
							applicabilita.addAzione(applicabilitaAzioni);
						}
					}
					
					if( (applicabilitaCT!=null && !"".equals(applicabilitaCT)) ) {
						if(applicabilitaCT.contains(",")) {
							String [] tmp = applicabilitaCT.split(",");
							for (int i = 0; i < tmp.length; i++) {
								applicabilita.addContentType(tmp[i].trim());
							}
						}
						else {
							applicabilita.addContentType(applicabilitaCT);
						}
					}
					
					if(applicabilitaPattern!=null && !"".equals(applicabilitaPattern)){
						applicabilita.setPattern(applicabilitaPattern);
					}
					
					if( (applicabilitaConnettori!=null && !"".equals(applicabilitaConnettori)) ) {
						if(applicabilitaConnettori.contains(",")) {
							String [] tmp = applicabilitaConnettori.split(",");
							for (int i = 0; i < tmp.length; i++) {
								applicabilita.addConnettore(tmp[i].trim());
							}
						}
						else {
							applicabilita.addConnettore(applicabilitaConnettori);
						}
					}
					
					regola.setApplicabilita(applicabilita);
				}
				
				TrasformazioneRegolaRichiesta richiesta = new TrasformazioneRegolaRichiesta();
				
				int reqConversioneEnabled = rs.getInt("req_conversione_enabled");
				richiesta.setConversione(CostantiDB.TRUE == reqConversioneEnabled);

				richiesta.setConversioneTipo(rs.getString("req_conversione_tipo"));
				IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverConfigurazioneDBLib.tipoDB);
				richiesta.setConversioneTemplate(jdbcAdapter.getBinaryData(rs, "req_conversione_template"));
				richiesta.setContentType(rs.getString("req_content_type"));
				
				int trasformazioneRestIntValue = rs.getInt("rest_transformation");
				if(CostantiDB.TRUE == trasformazioneRestIntValue) {
					TrasformazioneRest trasformazioneRest = new TrasformazioneRest();
					trasformazioneRest.setMetodo(rs.getString("rest_method"));
					trasformazioneRest.setPath(rs.getString("rest_path"));
					richiesta.setTrasformazioneRest(trasformazioneRest);
				}
					
				int trasformazioneSoapIntValue = rs.getInt("soap_transformation");
				if(CostantiDB.TRUE == trasformazioneSoapIntValue) {
					TrasformazioneSoap trasformazioneSoap = new TrasformazioneSoap();
					
					trasformazioneSoap.setVersione(DriverConfigurazioneDBLib.getEnumVersioneSOAP(rs.getString("soap_version")));
					trasformazioneSoap.setSoapAction(rs.getString("soap_action"));
					
					int envelope = rs.getInt(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE);
					trasformazioneSoap.setEnvelope(CostantiDB.TRUE == envelope);
					
					int envelopeAsAttach = rs.getInt(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_AS_ATTACH);
					if(CostantiDB.TRUE == envelopeAsAttach) {
						trasformazioneSoap.setEnvelopeAsAttachment(true);
						
						trasformazioneSoap.setEnvelopeBodyConversioneTipo(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_TIPO));
						trasformazioneSoap.setEnvelopeBodyConversioneTemplate(jdbcAdapter.getBinaryData(rs, CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_TEMPLATE));
					}
					else {
						trasformazioneSoap.setEnvelopeAsAttachment(false);
					}
					
					richiesta.setTrasformazioneSoap(trasformazioneSoap);
				}
				
				regola.setId(rs.getLong("id"));
				
				regola.setRichiesta(richiesta);
				
				trasformazioni.addRegola(regola);
				
			}
			rs.close();
			stm.close();
			
			if(trasformazioni==null) {
				return trasformazioni;
			}
			
			for (TrasformazioneRegola regola : trasformazioni.getRegolaList()) {
				

				// ** SOGGETTI **
				
				if(!portaDelegata) {
					
					nomeTabella = CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SOGGETTI;
					
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
					sqlQueryObject.addFromTable(nomeTabella);
					sqlQueryObject.addSelectField("*");
					sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
					sqlQuery = sqlQueryObject.createSQLQuery();
					stm = con.prepareStatement(sqlQuery);
					stm.setLong(1, regola.getId());
					rs = stm.executeQuery();
	
					while (rs.next()) {
						
						if(regola.getApplicabilita()==null) {
							regola.setApplicabilita(new TrasformazioneRegolaApplicabilitaRichiesta());
						}
						
						TrasformazioneRegolaApplicabilitaSoggetto soggetto = new TrasformazioneRegolaApplicabilitaSoggetto();
						soggetto.setTipo(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_TIPO_SOGGETTO));
						soggetto.setNome(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_NOME_SOGGETTO));
						
						regola.getApplicabilita().addSoggetto(soggetto);
					
					}
					rs.close();
					stm.close();
				}
				
				
				// ** APPLICATIVI **
				
				nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_SA : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_SA;
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addFromTable(nomeTabella);
				sqlQueryObject.addSelectField("*");
				sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
				sqlQuery = sqlQueryObject.createSQLQuery();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, regola.getId());
				rs = stm.executeQuery();

				// per ogni entry 
				// prendo l'id del servizio associato, recupero il nome e
				// aggiungo
				// il servizio applicativo alla PortaDelegata da ritornare
				while (rs.next()) {
					long idSA = rs.getLong("id_servizio_applicativo");

					if (idSA != 0) {
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addFromTable(CostantiDB.SERVIZI_APPLICATIVI);
						sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
						sqlQueryObject.addSelectField("nome");
						sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_COLUMN_TIPO_SOGGETTO);
						sqlQueryObject.addSelectField(CostantiDB.SOGGETTI_COLUMN_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);

						DriverConfigurazioneDBLib.logDebug(ESEGUO_QUERY_PREFIX + 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(CostantiDB.SOGGETTI_COLUMN_TIPO_SOGGETTO));
							servizioApplicativo.setNomeSoggettoProprietario(rs1.getString(CostantiDB.SOGGETTI_COLUMN_NOME_SOGGETTO));
							if(regola.getApplicabilita()==null) {
								regola.setApplicabilita(new TrasformazioneRegolaApplicabilitaRichiesta());
							}
							regola.getApplicabilita().addServizioApplicativo(servizioApplicativo);
						}
						rs1.close();
						stm1.close();
					}
				}
				rs.close();
				stm.close();
				
				
				// ** HEADER **
				
				nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_HEADER;
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addFromTable(nomeTabella);
				sqlQueryObject.addSelectField("*");
				sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
				sqlQuery = sqlQueryObject.createSQLQuery();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, regola.getId());
		
				DriverConfigurazioneDBLib.logDebug(ESEGUO_QUERY_PREFIX + DBUtils.formatSQLString(sqlQuery, idPorta));
				rs = stm.executeQuery();
		
				while (rs.next()) {
					TrasformazioneRegolaParametro parametro = new TrasformazioneRegolaParametro();
					parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
					parametro.setNome(rs.getString("nome"));
					parametro.setValore(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_VALORE));
					parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_IDENTIFICAZIONE_FALLITA)));
					parametro.setId(rs.getLong("id"));
					regola.getRichiesta().addHeader(parametro);
				}
				
				rs.close();
				stm.close();
				
				
				// ** URL **
				
				nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_URL : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_URL;
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addFromTable(nomeTabella);
				sqlQueryObject.addSelectField("*");
				sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
				sqlQuery = sqlQueryObject.createSQLQuery();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, regola.getId());
		
				DriverConfigurazioneDBLib.logDebug(ESEGUO_QUERY_PREFIX + DBUtils.formatSQLString(sqlQuery, idPorta));
				rs = stm.executeQuery();
		
				while (rs.next()) {
					TrasformazioneRegolaParametro parametro = new TrasformazioneRegolaParametro();
					parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
					parametro.setNome(rs.getString("nome"));
					parametro.setValore(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_VALORE));
					parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_IDENTIFICAZIONE_FALLITA)));
					parametro.setId(rs.getLong("id"));
					regola.getRichiesta().addParametroUrl(parametro);
				}
				
				rs.close();
				stm.close();
				
				
				
				// ** RISPOSTE **
				
				nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE;
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addFromTable(nomeTabella);
				sqlQueryObject.addSelectField("*");
				sqlQueryObject.addWhereCondition(CostantiDB.TRASFORMAZIONI_COLUMN_ID_RIF_TRASFORMAZIONE+"=?");
				sqlQueryObject.addOrderBy(CostantiDB.TRASFORMAZIONI_COLUMN_POSIZIONE);
				sqlQueryObject.addOrderBy("nome");
				sqlQueryObject.setSortType(true);
				sqlQuery = sqlQueryObject.createSQLQuery();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, regola.getId());
		
				DriverConfigurazioneDBLib.logDebug(ESEGUO_QUERY_PREFIX + DBUtils.formatSQLString(sqlQuery, idPorta));
				rs = stm.executeQuery();
		
				while (rs.next()) {
				
					TrasformazioneRegolaRisposta risposta = new TrasformazioneRegolaRisposta();
					
					String nome = rs.getString("nome");
					risposta.setNome(nome);
					
					int posizione = rs.getInt(CostantiDB.TRASFORMAZIONI_COLUMN_POSIZIONE);
					risposta.setPosizione(posizione);
					
					int applicabilitaStatusMin = rs.getInt("applicabilita_status_min");
					int applicabilitaStatusMax = rs.getInt("applicabilita_status_max");
					String applicabilitaCT = rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_APPLICABILITA_CT);
					String applicabilitaPattern = rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_APPLICABILITA_PATTERN);
					if( (applicabilitaStatusMin >0 || applicabilitaStatusMax>0) ||
							(applicabilitaCT!=null && !"".equals(applicabilitaCT)) ||
							(applicabilitaPattern!=null && !"".equals(applicabilitaPattern)) 
							) {
						TrasformazioneRegolaApplicabilitaRisposta applicabilita = new TrasformazioneRegolaApplicabilitaRisposta();
						
						if(applicabilitaStatusMin>0) {
							applicabilita.setReturnCodeMin(applicabilitaStatusMin);
						}
						if(applicabilitaStatusMax>0) {
							applicabilita.setReturnCodeMax(applicabilitaStatusMax);
						}

						if( (applicabilitaCT!=null && !"".equals(applicabilitaCT)) ) {
							if(applicabilitaCT.contains(",")) {
								String [] tmp = applicabilitaCT.split(",");
								for (int i = 0; i < tmp.length; i++) {
									applicabilita.addContentType(tmp[i].trim());
								}
							}
							else {
								applicabilita.addContentType(applicabilitaCT);
							}
						}
						
						if(applicabilitaPattern!=null && !"".equals(applicabilitaPattern)){
							applicabilita.setPattern(applicabilitaPattern);
						}
						
						risposta.setApplicabilita(applicabilita);
					}
					
					int conversioneEnabled = rs.getInt("conversione_enabled");
					risposta.setConversione(CostantiDB.TRUE == conversioneEnabled);

					risposta.setConversioneTipo(rs.getString("conversione_tipo"));
					IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverConfigurazioneDBLib.tipoDB);
					risposta.setConversioneTemplate(jdbcAdapter.getBinaryData(rs, "conversione_template"));
					risposta.setContentType(rs.getString("content_type"));
					risposta.setReturnCode(rs.getString("return_code"));
					
					if(regola.getRichiesta().getTrasformazioneRest()!=null) { // La risposta deve essere ritrasformata in soap
					
						TrasformazioneSoapRisposta trasformazioneSoap = new TrasformazioneSoapRisposta();
						
						int envelope = rs.getInt(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE);
						trasformazioneSoap.setEnvelope(CostantiDB.TRUE == envelope);
						
						int envelopeAsAttach = rs.getInt(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_AS_ATTACH);
						if(CostantiDB.TRUE == envelopeAsAttach) {
							trasformazioneSoap.setEnvelopeAsAttachment(true);
							
							trasformazioneSoap.setEnvelopeBodyConversioneTipo(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_TIPO));
							trasformazioneSoap.setEnvelopeBodyConversioneTemplate(jdbcAdapter.getBinaryData(rs, CostantiDB.TRASFORMAZIONI_COLUMN_SOAP_ENVELOPE_TEMPLATE));
						}
						else {
							trasformazioneSoap.setEnvelopeAsAttachment(false);
						}
						
						risposta.setTrasformazioneSoap(trasformazioneSoap);
						
					}

					risposta.setId(rs.getLong("id"));
					
					regola.addRisposta(risposta);
					
				}
				
				rs.close();
				stm.close();
				
				
				// ** HEADER RISPOSTA **
				
				for (TrasformazioneRegolaRisposta risposta : regola.getRispostaList()) {
					
					nomeTabella = portaDelegata ? CostantiDB.PORTE_DELEGATE_TRASFORMAZIONI_RISPOSTE_HEADER : CostantiDB.PORTE_APPLICATIVE_TRASFORMAZIONI_RISPOSTE_HEADER;
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
					sqlQueryObject.addFromTable(nomeTabella);
					sqlQueryObject.addSelectField("*");
					sqlQueryObject.addWhereCondition("id_transform_risp=?");
					sqlQuery = sqlQueryObject.createSQLQuery();
					stm = con.prepareStatement(sqlQuery);
					stm.setLong(1, risposta.getId());
			
					DriverConfigurazioneDBLib.logDebug(ESEGUO_QUERY_PREFIX + DBUtils.formatSQLString(sqlQuery, idPorta));
					rs = stm.executeQuery();
			
					while (rs.next()) {
						TrasformazioneRegolaParametro parametro = new TrasformazioneRegolaParametro();
						parametro.setConversioneTipo(DriverConfigurazioneDBLib.getEnumTrasformazioneRegolaParametroTipoAzione(rs.getString("tipo")));
						parametro.setNome(rs.getString("nome"));
						parametro.setValore(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_VALORE));
						parametro.setIdentificazioneFallita(DriverConfigurazioneDBLib.getEnumTrasformazioneIdentificazioneRisorsaFallita(rs.getString(CostantiDB.TRASFORMAZIONI_COLUMN_IDENTIFICAZIONE_FALLITA)));
						parametro.setId(rs.getLong("id"));
						risposta.addHeader(parametro);
					}
					
					rs.close();
					stm.close();
					
				}
			}
			
		}finally {
			JDBCUtilities.closeResources(rs1, stm1);
			JDBCUtilities.closeResources(rs, stm);
		}
		
		return trasformazioni;
	}
	
	
}