DriverConfigurazioneDB_serviziApplicativiLIB.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.sql.Timestamp;
import java.text.MessageFormat;
import java.util.List;

import org.openspcoop2.core.byok.BYOKUtilities;
import org.openspcoop2.core.byok.BYOKWrappedValue;
import org.openspcoop2.core.byok.IDriverBYOK;
import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.core.commons.DBUtils;
import org.openspcoop2.core.config.Connettore;
import org.openspcoop2.core.config.Credenziali;
import org.openspcoop2.core.config.InvocazioneCredenziali;
import org.openspcoop2.core.config.InvocazionePorta;
import org.openspcoop2.core.config.InvocazionePortaGestioneErrore;
import org.openspcoop2.core.config.InvocazioneServizio;
import org.openspcoop2.core.config.Proprieta;
import org.openspcoop2.core.config.RispostaAsincrona;
import org.openspcoop2.core.config.Ruolo;
import org.openspcoop2.core.config.ServizioApplicativo;
import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.config.constants.TipologiaErogazione;
import org.openspcoop2.core.config.constants.TipologiaFruizione;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.constants.ProprietariProtocolProperty;
import org.openspcoop2.core.constants.TipiConnettore;
import org.openspcoop2.utils.certificate.CertificateUtils;
import org.openspcoop2.utils.certificate.PrincipalType;
import org.openspcoop2.utils.date.DateManager;
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_serviziApplicativiLIB
 * 
 * @author Stefano Corallo - corallo@link.it
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class DriverConfigurazioneDB_serviziApplicativiLIB {


	
	/**
	 * 
	 * @param type
	 * @param aSA
	 * @param con
	 * @return id
	 * @throws DriverConfigurazioneException
	 */
	public static long CRUDServizioApplicativo(int type, ServizioApplicativo aSA, Connection con, IDriverBYOK driverBYOK) throws DriverConfigurazioneException {
		if (aSA == null)
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDServizioApplicativo] Servizio Applicativo non valido.");

		String nomeSA = aSA.getNome();
		String tipoProprietario = aSA.getTipoSoggettoProprietario();
		String nomeProprietario = aSA.getNomeSoggettoProprietario();

		if (nomeSA == null || nomeSA.equals(""))
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDServizioApplicativo] Nome Servizio Applicativo non valido.");
		if (tipoProprietario == null || tipoProprietario.equals(""))
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDServizioApplicativo] Tipo Proprietario Servizio Applicativo non valido.");
		if (nomeProprietario == null || nomeProprietario.equals(""))
			throw new DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDServizioApplicativo] Nome Proprietario Servizio Applicativo non valido.");

		PreparedStatement stm = null;
		String sqlQuery;
		PreparedStatement stmQuery = null;
		ResultSet rs = null;
		PreparedStatement stm2 = null;
		int n = 0;

		try {
			String tipoSA = aSA.getTipo();
			int useAsClient = aSA.getUseAsClient() ? CostantiDB.TRUE : CostantiDB.FALSE;
			String descrizione = aSA.getDescrizione();
			DriverConfigurazioneDBLib.logDebug("get ID Soggetto con tipo["+tipoProprietario+"] e nome["+nomeProprietario+"]");
			long idProprietario = DBUtils.getIdSoggetto(nomeProprietario, tipoProprietario, con, DriverConfigurazioneDBLib.tipoDB,DriverConfigurazioneDBLib.tabellaSoggetti);
			DriverConfigurazioneDBLib.logDebug("get ID Soggetto con tipo["+tipoProprietario+"] e nome["+nomeProprietario+"] : "+idProprietario);
			InvocazionePorta invPorta = aSA.getInvocazionePorta();
			InvocazioneServizio invServizio = aSA.getInvocazioneServizio();
			RispostaAsincrona ricezione = aSA.getRispostaAsincrona();
			List<Proprieta> proprieta = aSA.getProprietaList();

			Connettore connettoreRisp = null;
			Connettore connettoreInv = null;
			long idConnettoreRisp = 0;
			long idConnettoreInv = 0;
			long idServizioApplicativo = 0;
			Credenziali credenzialiInvocazionePorta = null;
			InvocazioneCredenziali credenzialiInvocazione = null;
			InvocazionePortaGestioneErrore gestErr = null;
			String fault = null;

			switch (type) {
			case CREATE:
				
				String utenteRichiedente = null;
				if(aSA.getProprietaOggetto()!=null && aSA.getProprietaOggetto().getUtenteRichiedente()!=null) {
					utenteRichiedente = aSA.getProprietaOggetto().getUtenteRichiedente();
				}
				else {
					utenteRichiedente = DBUtils.getSuperUserSoggettoSafe(DriverConfigurazioneDBLib.log, "CRUDPortaApplicativa",
							idProprietario, con, DriverConfigurazioneDBLib.tipoDB,DriverConfigurazioneDBLib.tabellaSoggetti);
				}
				
				Timestamp dataCreazione = null;
				if(aSA.getProprietaOggetto()!=null && aSA.getProprietaOggetto().getDataCreazione()!=null) {
					dataCreazione = new Timestamp(aSA.getProprietaOggetto().getDataCreazione().getTime());
				}
				else if(aSA.getOraRegistrazione()!=null){
					dataCreazione = new Timestamp(aSA.getOraRegistrazione().getTime());
				}
				else {
					dataCreazione = DateManager.getTimestamp();
				}
				
				// create
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addInsertTable(CostantiDB.SERVIZI_APPLICATIVI);
				sqlQueryObject.addInsertField("nome", "?");
				sqlQueryObject.addInsertField("tipo", "?");
				sqlQueryObject.addInsertField("as_client", "?");
				sqlQueryObject.addInsertField("descrizione", "?");
				sqlQueryObject.addInsertField("sbustamentorisp", "?");
				sqlQueryObject.addInsertField("sbustamento_protocol_info_risp", "?");
				sqlQueryObject.addInsertField("getmsgrisp", "?");
				sqlQueryObject.addInsertField("tipoauthrisp", "?");
				sqlQueryObject.addInsertField("utenterisp", "?");
				sqlQueryObject.addInsertField("passwordrisp", "?");
				sqlQueryObject.addInsertField("enc_passwordrisp", "?");
				sqlQueryObject.addInsertField("id_connettore_risp", "?");
				sqlQueryObject.addInsertField("sbustamentoinv", "?");
				sqlQueryObject.addInsertField("sbustamento_protocol_info_inv", "?");
				sqlQueryObject.addInsertField("getmsginv", "?");
				sqlQueryObject.addInsertField("tipoauthinv", "?");
				sqlQueryObject.addInsertField("utenteinv", "?");
				sqlQueryObject.addInsertField("passwordinv", "?");
				sqlQueryObject.addInsertField("enc_passwordinv", "?");
				sqlQueryObject.addInsertField("id_connettore_inv", "?");
				sqlQueryObject.addInsertField("id_soggetto", "?");
				sqlQueryObject.addInsertField("fault", "?");
				sqlQueryObject.addInsertField("tipoauth", "?");
				sqlQueryObject.addInsertField("utente", "?");
				sqlQueryObject.addInsertField("password", "?");
				sqlQueryObject.addInsertField("subject", "?");
				sqlQueryObject.addInsertField("cn_subject", "?");
				sqlQueryObject.addInsertField("issuer", "?");
				sqlQueryObject.addInsertField("cn_issuer", "?");
				sqlQueryObject.addInsertField("certificate", "?");
				sqlQueryObject.addInsertField("cert_strict_verification", "?");
				sqlQueryObject.addInsertField("token_policy", "?");
				sqlQueryObject.addInsertField("invio_x_rif_inv", "?");
				sqlQueryObject.addInsertField("risposta_x_rif_inv", "?");
				sqlQueryObject.addInsertField("invio_x_rif", "?");
				sqlQueryObject.addInsertField("invio_x_rif_risp", "?");
				sqlQueryObject.addInsertField("risposta_x_rif_risp", "?");
				sqlQueryObject.addInsertField("sbustamento_protocol_info", "?");
				sqlQueryObject.addInsertField("fault_actor", "?");
				sqlQueryObject.addInsertField("generic_fault_code", "?");
				sqlQueryObject.addInsertField("prefix_fault_code", "?");
				sqlQueryObject.addInsertField("tipologia_fruizione", "?");
				sqlQueryObject.addInsertField("tipologia_erogazione", "?");
				if(utenteRichiedente!=null) {
					sqlQueryObject.addInsertField(CostantiDB.PROPRIETA_OGGETTO_UTENTE_RICHIEDENTE, "?");
				}
				if(dataCreazione!=null) {
					sqlQueryObject.addInsertField(CostantiDB.PROPRIETA_OGGETTO_DATA_CREAZIONE, "?");
				}
				sqlQuery = sqlQueryObject.createSQLInsert();
				stm = con.prepareStatement(sqlQuery);

				// creo i connettori, ma disabilitati

				// connettore risp
				//il nome del connettore deve essere univoco Connettore[RISP o INV]_nomeSA+tipoSoggetto+nomeSoggetto
				connettoreRisp = new Connettore();
				connettoreRisp.setNome("ConnettoreRISP_" + aSA.getNome()+"_"+aSA.getTipoSoggettoProprietario()+aSA.getNomeSoggettoProprietario());
				connettoreRisp.setTipo(TipiConnettore.DISABILITATO.getNome());
				//Creo il connettore disabilitato
				idConnettoreRisp = DriverConfigurazioneDB_connettoriLIB.CRUDConnettore(1, connettoreRisp, con, driverBYOK);
				//Se il connettore mi era stato passato allora devo aggiornare il connettore con i dati giusti
				if(ricezione!=null && ricezione.getConnettore()!=null){
					Connettore connettore= ricezione.getConnettore();
					//setto l'id del connettore e il nome che aveva prima
					connettore.setId(idConnettoreRisp);
					connettore.setNome(connettoreRisp.getNome());//il nome DEVE essere quello creato in precedenza per assicurarsi che sia univoco
					DriverConfigurazioneDB_connettoriLIB.CRUDConnettore(CostantiDB.UPDATE, connettore, con, driverBYOK);
				}

				// connettore inv
				connettoreInv = new Connettore();
				connettoreInv.setNome("ConnettoreINV_" + aSA.getNome()+"_"+aSA.getTipoSoggettoProprietario()+aSA.getNomeSoggettoProprietario());
				connettoreInv.setTipo(TipiConnettore.DISABILITATO.getNome());
				idConnettoreInv = DriverConfigurazioneDB_connettoriLIB.CRUDConnettore(1, connettoreInv, con, driverBYOK);

				//setto i valori corretti del connettore se mi era stato passato
				if(invServizio!=null && invServizio.getConnettore()!=null){
					Connettore connettore = invServizio.getConnettore();
					connettore.setId(idConnettoreInv);
					connettore.setNome(connettoreInv.getNome());//il nome DEVE essere quello creato in precedenza per assicurarsi che sia univoco
					DriverConfigurazioneDB_connettoriLIB.CRUDConnettore(CostantiDB.UPDATE, connettore, con, driverBYOK);
				}

				int index = 1;
				
				stm.setString(index++, nomeSA);
				stm.setString(index++, tipoSA);
				stm.setInt(index++, useAsClient);
				stm.setString(index++, descrizione);

				// RicezioneRisposta
				stm.setInt(index++, (ricezione != null && (CostantiConfigurazione.ABILITATO.equals(ricezione.getSbustamentoSoap())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				stm.setInt(index++, (ricezione != null && (!CostantiConfigurazione.DISABILITATO.equals(ricezione.getSbustamentoInformazioniProtocollo())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				stm.setString(index++, ricezione != null ? DriverConfigurazioneDBLib.getValue(ricezione.getGetMessage()) : null);
				// setto credenziali risp
				credenzialiInvocazione = ricezione != null ? ricezione.getCredenziali() : null;
				stm.setString(index++, (ricezione != null ? DriverConfigurazioneDBLib.getValue(ricezione.getAutenticazione()) : null)); //l'autenticazione e' quella della risposta asincrona
				stm.setString(index++, (credenzialiInvocazione != null ? credenzialiInvocazione.getUser() : null));
				
				String plainValue = (credenzialiInvocazione != null ? credenzialiInvocazione.getPassword() : null);
				String encValue = null;
				if(driverBYOK!=null && plainValue!=null) {
					BYOKWrappedValue byokValue = driverBYOK.wrap(plainValue);
					if(byokValue!=null) {
						encValue = byokValue.getWrappedValue();
						plainValue = byokValue.getWrappedPlainValue();
					}
				}
				stm.setString(index++, plainValue);
				stm.setString(index++, encValue);
				
				// setto idconnettore risp
				stm.setLong(index++, idConnettoreRisp);

				// InvocazioneServizio
				stm.setInt(index++, (invServizio != null && (CostantiConfigurazione.ABILITATO.equals(invServizio.getSbustamentoSoap())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				stm.setInt(index++, (invServizio != null && (!CostantiConfigurazione.DISABILITATO.equals(invServizio.getSbustamentoInformazioniProtocollo())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				stm.setString(index++, invServizio != null ? DriverConfigurazioneDBLib.getValue(invServizio.getGetMessage()) : null);
				// setto credenziali inv
				credenzialiInvocazione = invServizio != null ? invServizio.getCredenziali() : null;
				stm.setString(index++, (invServizio != null ? DriverConfigurazioneDBLib.getValue(invServizio.getAutenticazione()) : null));//l'autenticazione e' quella dell invocazione servizio
				stm.setString(index++, (credenzialiInvocazione != null ? credenzialiInvocazione.getUser() : null));
				
				plainValue = (credenzialiInvocazione != null ? credenzialiInvocazione.getPassword() : null);
				encValue = null;
				if(driverBYOK!=null && plainValue!=null) {
					BYOKWrappedValue byokValue = driverBYOK.wrap(plainValue);
					if(byokValue!=null) {
						encValue = byokValue.getWrappedValue();
						plainValue = byokValue.getWrappedPlainValue();
					}
				}
				stm.setString(index++, plainValue);
				stm.setString(index++, encValue);
				
				// setto idconnettore inv
				stm.setLong(index++, idConnettoreInv);

				// idsoggetto proprietario
				stm.setLong(index++, idProprietario);

				// InvocazionePorta
				gestErr = invPorta != null ? invPorta.getGestioneErrore() : null;
				fault = (gestErr != null ? DriverConfigurazioneDBLib.getValue(gestErr.getFault()) : null);
				stm.setString(index++, fault);
				// setto credenziali invocaizone porta
				// per il momento c'e' soltato una credenziale,quindi un solo
				// oggetto nella lista
				credenzialiInvocazionePorta = (invPorta != null && invPorta.sizeCredenzialiList() > 0 ? invPorta.getCredenziali(0) : null);
				stm.setString(index++, (credenzialiInvocazionePorta != null ? DriverConfigurazioneDBLib.getValue(credenzialiInvocazionePorta.getTipo()) : null));
				stm.setString(index++, (credenzialiInvocazionePorta != null ? credenzialiInvocazionePorta.getUser() : null));
				stm.setString(index++, (credenzialiInvocazionePorta != null ? credenzialiInvocazionePorta.getPassword() : null));
				
				String subject = null;
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getSubject()!=null && !"".equals(credenzialiInvocazionePorta.getSubject()))
					subject = credenzialiInvocazionePorta.getSubject();
				stm.setString(index++, (subject != null ? CertificateUtils.formatPrincipal(subject, PrincipalType.SUBJECT) : null));
				String subjectCN = null;
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getCnSubject()!=null && !"".equals(credenzialiInvocazionePorta.getCnSubject()))
					subjectCN = credenzialiInvocazionePorta.getCnSubject();
				stm.setString(index++, subjectCN);
				
				String issuer = null;
				if(credenzialiInvocazionePorta != null && org.openspcoop2.core.config.constants.CredenzialeTipo.APIKEY.equals(credenzialiInvocazionePorta.getTipo())) {
					stm.setString(index++, CostantiDB.getIssuerApiKey(credenzialiInvocazionePorta.isAppId()));
				}
				else {
					if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getIssuer()!=null && !"".equals(credenzialiInvocazionePorta.getIssuer()))
						issuer = credenzialiInvocazionePorta.getIssuer();
					stm.setString(index++, (issuer != null ? CertificateUtils.formatPrincipal(issuer, PrincipalType.ISSUER) : null));
				}
				String issuerCN = null;
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getCnIssuer()!=null && !"".equals(credenzialiInvocazionePorta.getCnIssuer()))
					issuerCN = credenzialiInvocazionePorta.getCnIssuer();
				stm.setString(index++, issuerCN);
				
				byte [] certificate = null;
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getCertificate()!=null) {
					certificate = credenzialiInvocazionePorta.getCertificate();
				}
				IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverConfigurazioneDBLib.tipoDB);
				jdbcAdapter.setBinaryData(stm, index++, certificate);
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.isCertificateStrictVerification()) {
					stm.setInt(index++, CostantiDB.TRUE);
				}				
				else {
					stm.setInt(index++, CostantiDB.FALSE);
				}
				
				stm.setString(index++, credenzialiInvocazionePorta!=null ? credenzialiInvocazionePorta.getTokenPolicy() : null);

				// aggiungo gestione invio/risposta per riferimento
				// invocazione servizio
				stm.setString(index++, invServizio != null ? DriverConfigurazioneDBLib.getValue(invServizio.getInvioPerRiferimento()) : null);
				stm.setString(index++, invServizio != null ? DriverConfigurazioneDBLib.getValue(invServizio.getRispostaPerRiferimento()) : null);
				// invocazione porta
				stm.setString(index++, invPorta != null ? DriverConfigurazioneDBLib.getValue(invPorta.getInvioPerRiferimento()) : null);
				// ricezione risposta
				stm.setString(index++, ricezione != null ? DriverConfigurazioneDBLib.getValue(ricezione.getInvioPerRiferimento()) : null);
				stm.setString(index++, ricezione != null ? DriverConfigurazioneDBLib.getValue(ricezione.getRispostaPerRiferimento()) : null);
				// sbustamento info protocolo
				stm.setInt(index++, (invPorta != null && (!CostantiConfigurazione.DISABILITATO.equals(invPorta.getSbustamentoInformazioniProtocollo())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				//Invocazione Porta : fault_actor, generic_fault_code, prefix_fault_code
				stm.setString(index++, gestErr!=null ? gestErr.getFaultActor() : null);
				stm.setString(index++, gestErr!=null ? DriverConfigurazioneDBLib.getValue(gestErr.getGenericFaultCode()) : null);
				stm.setString(index++, gestErr!=null ? gestErr.getPrefixFaultCode() : null);
								
				//tipologia erogazione/fruizione
				stm.setString(index++, aSA.getTipologiaFruizione()!=null ? TipologiaFruizione.valueOf(aSA.getTipologiaFruizione().toUpperCase()).toString() : TipologiaFruizione.DISABILITATO.toString());
				stm.setString(index++, aSA.getTipologiaErogazione()!=null ? TipologiaErogazione.valueOf(aSA.getTipologiaErogazione().toUpperCase()).toString() : TipologiaErogazione.DISABILITATO.toString());
				
				if(utenteRichiedente!=null) {
					stm.setString(index++, utenteRichiedente);
				}
				
				if(dataCreazione!=null) {
					stm.setTimestamp(index++, dataCreazione);
				}
				
				n = stm.executeUpdate();
				stm.close();
				DriverConfigurazioneDBLib.logDebug("Inserted " + n + " row(s)");

				try {
					sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
					sqlQueryObject.addFromTable(CostantiDB.SERVIZI_APPLICATIVI);
					sqlQueryObject.addSelectField("id");
					sqlQueryObject.addWhereCondition("id_soggetto = ?");
					sqlQueryObject.addWhereCondition("nome = ?");
					sqlQueryObject.setANDLogicOperator(true);
					sqlQuery = sqlQueryObject.createSQLQuery();
					stmQuery = con.prepareStatement(sqlQuery);
					stmQuery.setLong(1, idProprietario);
					stmQuery.setString(2, nomeSA);
	
					rs = stmQuery.executeQuery();
	
					if (rs.next()) {
						idServizioApplicativo = rs.getLong("id");
						aSA.setId(idServizioApplicativo);
					} else {
						throw new DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDServizioApplicativo(CREATE)] Impossibile trovare il servizio appena creato.");
					}
				}finally {
					if(rs!=null) {
						rs.close();
						rs = null;
					}
					if(stmQuery!=null) {
						stmQuery.close();
						stmQuery = null;
					}
				}
				
				// GestioneErrore
				if(aSA.getRispostaAsincrona()!=null && aSA.getRispostaAsincrona().getGestioneErrore()!=null){
					
					DriverConfigurazioneDB_gestioneErroreLIB.CRUDGestioneErroreServizioApplicativo(CostantiDB.CREATE, 
							aSA.getRispostaAsincrona().getGestioneErrore(), idProprietario, idServizioApplicativo, false, con);
					
					try {
						ISQLQueryObject sqlQueryObjectUpdate = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObjectUpdate.addUpdateTable(CostantiDB.SERVIZI_APPLICATIVI);
						sqlQueryObjectUpdate.addUpdateField("id_gestione_errore_risp", "?");
						sqlQueryObjectUpdate.addWhereCondition("id = ?");
						stm2 = con.prepareStatement(sqlQueryObjectUpdate.createSQLUpdate());
						stm2.setLong(1, aSA.getRispostaAsincrona().getGestioneErrore().getId());
						stm2.setLong(2, idServizioApplicativo);
						stm2.executeUpdate();
					}finally {
						if(stm2!=null) {
							stm2.close();
							stm2 = null;
						}
					}
					
				}
				
				// GestioneErrore
				if(aSA.getInvocazioneServizio()!=null && aSA.getInvocazioneServizio().getGestioneErrore()!=null){
					
					DriverConfigurazioneDB_gestioneErroreLIB.CRUDGestioneErroreServizioApplicativo(CostantiDB.CREATE, 
							aSA.getInvocazioneServizio().getGestioneErrore(), idProprietario, idServizioApplicativo, true, con);
					
					try {
						ISQLQueryObject sqlQueryObjectUpdate = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObjectUpdate.addUpdateTable(CostantiDB.SERVIZI_APPLICATIVI);
						sqlQueryObjectUpdate.addUpdateField("id_gestione_errore_inv", "?");
						sqlQueryObjectUpdate.addWhereCondition("id = ?");
						stm2 = con.prepareStatement(sqlQueryObjectUpdate.createSQLUpdate());
						stm2.setLong(1, aSA.getInvocazioneServizio().getGestioneErrore().getId());
						stm2.setLong(2, idServizioApplicativo);
						stm2.executeUpdate();
					}finally {
						if(stm2!=null) {
							stm2.close();
							stm2 = null;
						}
					}
				}
				
				// Ruoli
				n=0;
				if(invPorta!=null && invPorta.getRuoli()!=null && invPorta.getRuoli().sizeRuoloList()>0){
					for (int i = 0; i < invPorta.getRuoli().sizeRuoloList(); i++) {
						Ruolo ruolo = invPorta.getRuoli().getRuolo(i);
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SERVIZI_APPLICATIVI_RUOLI);
						sqlQueryObject.addInsertField("id_servizio_applicativo", "?");
						sqlQueryObject.addInsertField("ruolo", "?");
						sqlQuery = sqlQueryObject.createSQLInsert();
						stm = con.prepareStatement(sqlQuery);
						stm.setLong(1, aSA.getId());
						stm.setString(2, ruolo.getNome());
						stm.executeUpdate();
						stm.close();
						n++;
						DriverConfigurazioneDBLib.logDebug("Aggiunto ruolo[" + ruolo.getNome() + "] al servizioApplicativo "+idServizioApplicativo);
					}
				}
				
				DriverConfigurazioneDBLib.logDebug("Aggiunti " + n + " ruoli al servizioApplicativo "+idServizioApplicativo);
				
				
				// Credenziali (le credenziali in questa tabella partono dal numero maggiore di 1)
				n=0;
				if(invPorta!=null && invPorta.sizeCredenzialiList()>1){
					for (int i = 1; i < invPorta.sizeCredenzialiList(); i++) {
						Credenziali credenziale = invPorta.getCredenziali(i);
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SERVIZI_APPLICATIVI_CREDENZIALI);
						sqlQueryObject.addInsertField("id_servizio_applicativo", "?");
						sqlQueryObject.addInsertField("subject", "?");
						sqlQueryObject.addInsertField("cn_subject", "?");
						sqlQueryObject.addInsertField("issuer", "?");
						sqlQueryObject.addInsertField("cn_issuer", "?");
						sqlQueryObject.addInsertField("certificate", "?");
						sqlQueryObject.addInsertField("cert_strict_verification", "?");
						sqlQuery = sqlQueryObject.createSQLInsert();
						stm = con.prepareStatement(sqlQuery);
						
						index = 1;
						stm.setLong(index++, aSA.getId());
						
						String subjectCredenziale = null;
						if(credenziale!=null && credenziale.getSubject()!=null && !"".equals(credenziale.getSubject()))
							subjectCredenziale = credenziale.getSubject();
						stm.setString(index++, (subjectCredenziale != null ? CertificateUtils.formatPrincipal(subjectCredenziale, PrincipalType.SUBJECT) : null));
						String subjectCredenzialeCN = null;
						if(credenziale!=null && credenziale.getCnSubject()!=null && !"".equals(credenziale.getCnSubject()))
							subjectCredenzialeCN = credenziale.getCnSubject();
						stm.setString(index++, subjectCredenzialeCN);
						
						String issuerCredenziale = null;
						if(credenziale != null && org.openspcoop2.core.config.constants.CredenzialeTipo.APIKEY.equals(credenziale.getTipo())) {
							stm.setString(index++, CostantiDB.getIssuerApiKey(credenziale.isAppId()));
						}
						else {
							if(credenziale!=null && credenziale.getIssuer()!=null && !"".equals(credenziale.getIssuer()))
								issuerCredenziale = credenziale.getIssuer();
							stm.setString(index++, (issuerCredenziale != null ? CertificateUtils.formatPrincipal(issuerCredenziale, PrincipalType.ISSUER) : null));
						}
						String issuerCredenzialeCN = null;
						if(credenziale!=null && credenziale.getCnIssuer()!=null && !"".equals(credenziale.getCnIssuer()))
							issuerCredenzialeCN = credenziale.getCnIssuer();
						stm.setString(index++, issuerCredenzialeCN);
						
						byte [] certificateCredenziale = null;
						if(credenziale!=null && credenziale.getCertificate()!=null) {
							certificateCredenziale = credenziale.getCertificate();
						}
						jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverConfigurazioneDBLib.tipoDB);
						jdbcAdapter.setBinaryData(stm, index++, certificateCredenziale);
						if(credenziale!=null && credenziale.isCertificateStrictVerification()) {
							stm.setInt(index++, CostantiDB.TRUE);
						}				
						else {
							stm.setInt(index++, CostantiDB.FALSE);
						}
						
						stm.executeUpdate();
						stm.close();
						n++;
						DriverConfigurazioneDBLib.logDebug("Aggiunta credenziale al servizioApplicativo "+idServizioApplicativo);
					}
				}
				
				DriverConfigurazioneDBLib.logDebug("Aggiunte " + n + " credenziali al servizioApplicativo "+idServizioApplicativo);
				
				
				// Proprieta
				n=0;
				if(proprieta!=null && !proprieta.isEmpty()){
					for (int i = 0; i < proprieta.size(); i++) {
						Proprieta prop = proprieta.get(i);
						
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SERVIZI_APPLICATIVI_PROPS);
						sqlQueryObject.addInsertField("id_servizio_applicativo", "?");
						sqlQueryObject.addInsertField("nome", "?");
						sqlQueryObject.addInsertField("valore", "?");
						sqlQueryObject.addInsertField("enc_value", "?");
						sqlQuery = sqlQueryObject.createSQLInsert();
						stm = con.prepareStatement(sqlQuery);
						
						int indexP = 1;
						stm.setLong(indexP++, aSA.getId());
						stm.setString(indexP++, prop.getNome());
						
						String plainValueP = prop.getValore();
						String encValueP = null;
						if(driverBYOK!=null && BYOKUtilities.isWrappedValue(plainValueP) ) {
							BYOKWrappedValue byokValue = driverBYOK.wrap(plainValueP);
							if(byokValue!=null) {
								encValueP = byokValue.getWrappedValue();
								plainValueP = byokValue.getWrappedPlainValue();
							}
						}
						
						stm.setString(indexP++, plainValueP);
						stm.setString(indexP++, encValueP);
						
						stm.executeUpdate();
						stm.close();
						n++;
						DriverConfigurazioneDBLib.logDebug("Aggiunta proprieta' [" + prop.getNome() + "] al servizioApplicativo "+idServizioApplicativo);
					}
				}
				
				DriverConfigurazioneDBLib.logDebug("Aggiunte " + n + " proprieta' al servizioApplicativo "+idServizioApplicativo);
				
				
				// ProtocolProperties
				DriverConfigurazioneDBLib.crudProtocolProperty(CostantiDB.CREATE, aSA.getProtocolPropertyList(), 
						idServizioApplicativo, ProprietariProtocolProperty.SERVIZIO_APPLICATIVO, con, DriverConfigurazioneDBLib.tipoDB, driverBYOK);
				
				
				break;

			case UPDATE:
				String oldNomeSA = null;
				String oldNomeProprietario = null;
				String oldTipoProprietario = null;
				if(aSA.getOldIDServizioApplicativoForUpdate()!=null){
					oldNomeSA = aSA.getOldIDServizioApplicativoForUpdate().getNome();
					if(aSA.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario()!=null){
						oldNomeProprietario = aSA.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario().getNome();
						oldTipoProprietario = aSA.getOldIDServizioApplicativoForUpdate().getIdSoggettoProprietario().getTipo();
					}
				}

				if (oldNomeSA == null || oldNomeSA.equals(""))
					oldNomeSA = nomeSA;
				if (oldNomeProprietario == null || oldNomeProprietario.equals(""))
					oldNomeProprietario = nomeProprietario;
				if (oldTipoProprietario == null || oldTipoProprietario.equals(""))
					oldTipoProprietario = tipoProprietario;

				long oldIdProprietario = DBUtils.getIdSoggetto(oldNomeProprietario, oldTipoProprietario, con, DriverConfigurazioneDBLib.tipoDB,DriverConfigurazioneDBLib.tabellaSoggetti);
				// Puo' darsi che l'old soggetto e il nuovo soggetto siano la stesso soggetto della tabella. E' stato cambiato il nome.
				if(oldIdProprietario <=0) {
					oldIdProprietario = DBUtils.getIdSoggetto(nomeProprietario, tipoProprietario, con, DriverConfigurazioneDBLib.tipoDB,DriverConfigurazioneDBLib.tabellaSoggetti);
				}
				if(oldIdProprietario <=0) 
					throw new DriverConfigurazioneException("Impossibile recuperare l'id del Soggetto Proprietario del Servizio Applicativo");
				
				String utenteUltimaModifica = null;
				if(aSA.getProprietaOggetto()!=null && aSA.getProprietaOggetto().getUtenteUltimaModifica()!=null) {
					utenteUltimaModifica = aSA.getProprietaOggetto().getUtenteUltimaModifica();
				}
				
				Timestamp dataUltimaModifica = null;
				if(aSA.getProprietaOggetto()!=null && aSA.getProprietaOggetto().getDataUltimaModifica()!=null) {
					dataUltimaModifica = new Timestamp(aSA.getProprietaOggetto().getDataUltimaModifica().getTime());
				}
				else {
					dataUltimaModifica = DateManager.getTimestamp();
				}
				
				
				// update
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addUpdateTable(CostantiDB.SERVIZI_APPLICATIVI);
				sqlQueryObject.addUpdateField("tipo", "?");
				sqlQueryObject.addUpdateField("as_client", "?");
				sqlQueryObject.addUpdateField("descrizione", "?");
				sqlQueryObject.addUpdateField("sbustamentorisp", "?");
				sqlQueryObject.addUpdateField("sbustamento_protocol_info_risp", "?");
				sqlQueryObject.addUpdateField("getmsgrisp", "?");
				sqlQueryObject.addUpdateField("tipoauthrisp", "?");
				sqlQueryObject.addUpdateField("utenterisp", "?");
				sqlQueryObject.addUpdateField("passwordrisp", "?");
				sqlQueryObject.addUpdateField("enc_passwordrisp", "?");
				sqlQueryObject.addUpdateField("id_connettore_risp", "?");
				sqlQueryObject.addUpdateField("sbustamentoinv", "?");
				sqlQueryObject.addUpdateField("sbustamento_protocol_info_inv", "?");
				sqlQueryObject.addUpdateField("getmsginv", "?");
				sqlQueryObject.addUpdateField("tipoauthinv", "?");
				sqlQueryObject.addUpdateField("utenteinv", "?");
				sqlQueryObject.addUpdateField("passwordinv", "?");
				sqlQueryObject.addUpdateField("enc_passwordinv", "?");
				sqlQueryObject.addUpdateField("id_connettore_inv", "?");
				sqlQueryObject.addUpdateField("fault", "?");
				sqlQueryObject.addUpdateField("tipoauth", "?");
				sqlQueryObject.addUpdateField("utente", "?");
				sqlQueryObject.addUpdateField("password", "?");
				sqlQueryObject.addUpdateField("subject", "?");
				sqlQueryObject.addUpdateField("cn_subject", "?");
				sqlQueryObject.addUpdateField("issuer", "?");
				sqlQueryObject.addUpdateField("cn_issuer", "?");
				sqlQueryObject.addUpdateField("certificate", "?");
				sqlQueryObject.addUpdateField("cert_strict_verification", "?");
				sqlQueryObject.addUpdateField("token_policy", "?");
				sqlQueryObject.addUpdateField("invio_x_rif_inv", "?");
				sqlQueryObject.addUpdateField("risposta_x_rif_inv", "?");
				sqlQueryObject.addUpdateField("invio_x_rif", "?");
				sqlQueryObject.addUpdateField("invio_x_rif_risp", "?");
				sqlQueryObject.addUpdateField("risposta_x_rif_risp", "?");
				sqlQueryObject.addUpdateField("sbustamento_protocol_info", "?");
				sqlQueryObject.addUpdateField("fault_actor", "?");
				sqlQueryObject.addUpdateField("generic_fault_code", "?");
				sqlQueryObject.addUpdateField("prefix_fault_code", "?");
				sqlQueryObject.addUpdateField("nome", "?");
				sqlQueryObject.addUpdateField("id_soggetto", "?");
				if(aSA.getRispostaAsincrona()!=null && aSA.getRispostaAsincrona().getGestioneErrore()!=null){
					sqlQueryObject.addUpdateField("id_gestione_errore_risp", "?");
				}
				if(aSA.getInvocazioneServizio()!=null && aSA.getInvocazioneServizio().getGestioneErrore()!=null){
					sqlQueryObject.addUpdateField("id_gestione_errore_inv", "?");
				}
				sqlQueryObject.addUpdateField("tipologia_fruizione", "?");
				sqlQueryObject.addUpdateField("tipologia_erogazione", "?");
				if(utenteUltimaModifica!=null) {
					sqlQueryObject.addUpdateField(CostantiDB.PROPRIETA_OGGETTO_UTENTE_ULTIMA_MODIFICA, "?");
				}
				if(dataUltimaModifica!=null) {
					sqlQueryObject.addUpdateField(CostantiDB.PROPRIETA_OGGETTO_DATA_ULTIMA_MODIFICA, "?");
				}
				sqlQueryObject.addWhereCondition("id=?");
				sqlQueryObject.addWhereCondition("nome=?");
				sqlQueryObject.addWhereCondition("id_soggetto=?");
				sqlQueryObject.setANDLogicOperator(true);
				sqlQuery = sqlQueryObject.createSQLUpdate();
				stm = con.prepareStatement(sqlQuery);

				idServizioApplicativo = getIdServizioApplicativo(oldNomeSA, oldTipoProprietario, oldNomeProprietario, con, DriverConfigurazioneDBLib.tipoDB,DriverConfigurazioneDBLib.tabellaSoggetti);
				// Puo' darsi che l'old soggetto e il nuovo soggetto siano la stesso soggetto della tabella. E' stato cambiato il nome.
				if(idServizioApplicativo<=0) {
					idServizioApplicativo = getIdServizioApplicativo(oldNomeSA, tipoProprietario, nomeProprietario, con, DriverConfigurazioneDBLib.tipoDB,DriverConfigurazioneDBLib.tabellaSoggetti);
				}
				if (idServizioApplicativo <= 0)
					throw new DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDServizioApplicativo(UPDATE)] ID del ServizioApplicativo necessario per l'aggiornamento.");
				// recupero i connettori

				// connettore risp asinc				
				RispostaAsincrona rispAsin = aSA.getRispostaAsincrona();
				connettoreRisp = rispAsin != null ? rispAsin.getConnettore() : new Connettore();
				String newNomeConnettoreRisp = "ConnettoreRISP_"+nomeSA+"_"+tipoProprietario+nomeProprietario;
				idConnettoreRisp = DriverConfigurazioneDB_connettoriLIB.getIdConnettoreSARISP(idServizioApplicativo, con);
				
				// connettore inv servizio
				InvocazioneServizio invServ = aSA.getInvocazioneServizio();
				connettoreInv = invServ != null ? invServizio.getConnettore() : new Connettore();
				String newNomeConnettoreInv = "ConnettoreINV_"+nomeSA+"_"+tipoProprietario+nomeProprietario;
				idConnettoreInv = DriverConfigurazioneDB_connettoriLIB.getIdConnettoreSAINV(idServizioApplicativo, con);
				
				//Controllo consistenza degli id dei connettori in quanto devono essere specificati
				//e quindi maggiori di 0
				if(idConnettoreInv <=0 || idConnettoreRisp<=0) throw new DriverConfigurazioneException("I connettori del servizio applicativo sono invalidi");
				
				/*
				 * Problema:
				 * 	Se il nuovo connettore e' disabilitato (e il nome del connettore non cambia)
				 * 	il valore presente sul db non cambia anche se questo valore e' != da DISABILITATO
				 * Fix:
				 * 	I valori del nuovo connettore devono essere sempre aggiornati
				 *   
				 */

				String nomeConnettoreRisp = DriverConfigurazioneDB_connettoriLIB.getConnettore(idConnettoreRisp, con, null).getNome();
				String nomeConnettoreInv = DriverConfigurazioneDB_connettoriLIB.getConnettore(idConnettoreInv, con, null).getNome();

				String pattern = "Aggiorno Connettore [{0}] : id [{1}] oldNome [{2}] newNome [{2}]";

				DriverConfigurazioneDBLib.logDebug(MessageFormat.format(pattern, "Risposta Asincrona",idConnettoreRisp, nomeConnettoreRisp, newNomeConnettoreRisp));
				//aggiorno connettore risp
				connettoreRisp.setNome(newNomeConnettoreRisp);
				connettoreRisp.setId(idConnettoreRisp);
				DriverConfigurazioneDB_connettoriLIB.CRUDConnettore(CostantiDB.UPDATE, connettoreRisp, con, driverBYOK);

				//aggiorno connettore inv
				DriverConfigurazioneDBLib.logDebug(MessageFormat.format(pattern, "Invocazione Servizio",idConnettoreInv, nomeConnettoreInv, newNomeConnettoreInv));
				connettoreInv.setNome(newNomeConnettoreInv);
				connettoreInv.setId(idConnettoreInv);
				DriverConfigurazioneDB_connettoriLIB.CRUDConnettore(CostantiDB.UPDATE, connettoreInv, con, driverBYOK);


				// Setto i dati del ServizioApplicativo

				index = 1;
				
				stm.setString(index++, tipoSA);
				stm.setInt(index++, useAsClient);
				stm.setString(index++, descrizione);

				// RicezioneRisposta
				stm.setInt(index++, (ricezione != null && (CostantiConfigurazione.ABILITATO.equals(ricezione.getSbustamentoSoap())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				stm.setInt(index++, (ricezione != null && (!CostantiConfigurazione.DISABILITATO.equals(ricezione.getSbustamentoInformazioniProtocollo())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				stm.setString(index++, ricezione != null ? DriverConfigurazioneDBLib.getValue(ricezione.getGetMessage()) : null);
				// setto credenziali risp
				credenzialiInvocazione = ricezione != null ? ricezione.getCredenziali() : null;
				stm.setString(index++, (ricezione != null ? DriverConfigurazioneDBLib.getValue(ricezione.getAutenticazione()) : null));
				stm.setString(index++, (credenzialiInvocazione != null ? credenzialiInvocazione.getUser() : null));
				
				plainValue = (credenzialiInvocazione != null ? credenzialiInvocazione.getPassword() : null);
				encValue = null;
				if(driverBYOK!=null && plainValue!=null) {
					BYOKWrappedValue byokValue = driverBYOK.wrap(plainValue);
					if(byokValue!=null) {
						encValue = byokValue.getWrappedValue();
						plainValue = byokValue.getWrappedPlainValue();
					}
				}
				stm.setString(index++, plainValue);
				stm.setString(index++, encValue);
				
				// setto idconnettore risp
				stm.setLong(index++, idConnettoreRisp);

				// InvocazioneServizio
				stm.setInt(index++, (invServizio != null && (CostantiConfigurazione.ABILITATO.equals(invServizio.getSbustamentoSoap())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				stm.setInt(index++, (invServizio != null && (!CostantiConfigurazione.DISABILITATO.equals(invServizio.getSbustamentoInformazioniProtocollo())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				stm.setString(index++, invServizio != null ? DriverConfigurazioneDBLib.getValue(invServizio.getGetMessage()) : null);
				// setto credenziali inv
				credenzialiInvocazione = invServizio != null ? invServizio.getCredenziali() : null;
				stm.setString(index++, (invServizio != null ? DriverConfigurazioneDBLib.getValue(invServizio.getAutenticazione()) : null));
				stm.setString(index++, (credenzialiInvocazione != null ? credenzialiInvocazione.getUser() : null));
				
				plainValue = (credenzialiInvocazione != null ? credenzialiInvocazione.getPassword() : null);
				encValue = null;
				if(driverBYOK!=null && plainValue!=null) {
					BYOKWrappedValue byokValue = driverBYOK.wrap(plainValue);
					if(byokValue!=null) {
						encValue = byokValue.getWrappedValue();
						plainValue = byokValue.getWrappedPlainValue();
					}
				}
				stm.setString(index++, plainValue);
				stm.setString(index++, encValue);
				
				// setto idconnettore inv
				stm.setLong(index++, idConnettoreInv);

				// InvocazionePorta
				gestErr = invPorta != null ? invPorta.getGestioneErrore() : null;
				fault = (gestErr != null ? DriverConfigurazioneDBLib.getValue(gestErr.getFault()) : null);
				stm.setString(index++, fault);
				// setto credenziali invocaizone porta
				// per il momento c'e' soltato una credenziale,quindi un solo
				// oggetto nella lista
				credenzialiInvocazionePorta = (invPorta != null && invPorta.sizeCredenzialiList() > 0 ? invPorta.getCredenziali(0) : null);
				stm.setString(index++, (credenzialiInvocazionePorta != null ? DriverConfigurazioneDBLib.getValue(credenzialiInvocazionePorta.getTipo()) : null));
				stm.setString(index++, (credenzialiInvocazionePorta != null ? credenzialiInvocazionePorta.getUser() : null));
				stm.setString(index++, (credenzialiInvocazionePorta != null ? credenzialiInvocazionePorta.getPassword() : null));
				
				subject = null;
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getSubject()!=null && !"".equals(credenzialiInvocazionePorta.getSubject()))
					subject = credenzialiInvocazionePorta.getSubject();
				stm.setString(index++, (subject != null ? CertificateUtils.formatPrincipal(subject, PrincipalType.SUBJECT) : null));
				subjectCN = null;
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getCnSubject()!=null && !"".equals(credenzialiInvocazionePorta.getCnSubject()))
					subjectCN = credenzialiInvocazionePorta.getCnSubject();
				stm.setString(index++, subjectCN);
				
				issuer = null;
				if(credenzialiInvocazionePorta != null && org.openspcoop2.core.config.constants.CredenzialeTipo.APIKEY.equals(credenzialiInvocazionePorta.getTipo())) {
					stm.setString(index++, CostantiDB.getIssuerApiKey(credenzialiInvocazionePorta.isAppId()));
				}
				else {
					if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getIssuer()!=null && !"".equals(credenzialiInvocazionePorta.getIssuer()))
						issuer = credenzialiInvocazionePorta.getIssuer();
					stm.setString(index++, (issuer != null ? CertificateUtils.formatPrincipal(issuer, PrincipalType.ISSUER) : null));
				}
				issuerCN = null;
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getCnIssuer()!=null && !"".equals(credenzialiInvocazionePorta.getCnIssuer()))
					issuerCN = credenzialiInvocazionePorta.getCnIssuer();
				stm.setString(index++, issuerCN);
				
				certificate = null;
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.getCertificate()!=null) {
					certificate = credenzialiInvocazionePorta.getCertificate();
				}
				jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverConfigurazioneDBLib.tipoDB);
				jdbcAdapter.setBinaryData(stm, index++, certificate);
				if(credenzialiInvocazionePorta!=null && credenzialiInvocazionePorta.isCertificateStrictVerification()) {
					stm.setInt(index++, CostantiDB.TRUE);
				}				
				else {
					stm.setInt(index++, CostantiDB.FALSE);
				}
				
				stm.setString(index++, credenzialiInvocazionePorta!=null ? credenzialiInvocazionePorta.getTokenPolicy() : null);

				// aggiungo gestione invio/risposta per riferimento
				// invocazione servizio
				stm.setString(index++, invServizio != null ? DriverConfigurazioneDBLib.getValue(invServizio.getInvioPerRiferimento()) : null);
				stm.setString(index++, invServizio != null ? DriverConfigurazioneDBLib.getValue(invServizio.getRispostaPerRiferimento()) : null);
				// invocazione porta
				stm.setString(index++, invPorta != null ? DriverConfigurazioneDBLib.getValue(invPorta.getInvioPerRiferimento()) : null);
				// ricezione risposta
				stm.setString(index++, ricezione != null ? DriverConfigurazioneDBLib.getValue(ricezione.getInvioPerRiferimento()) : null);
				stm.setString(index++, ricezione != null ? DriverConfigurazioneDBLib.getValue(ricezione.getRispostaPerRiferimento()) : null);
				// protocol info
				stm.setInt(index++, (invPorta != null && (!CostantiConfigurazione.DISABILITATO.equals(invPorta.getSbustamentoInformazioniProtocollo())) ? CostantiDB.TRUE : CostantiDB.FALSE));
				//Invocazione Porta : fault_actor, generic_fault_code, prefix_fault_code
				stm.setString(index++, gestErr!=null ? gestErr.getFaultActor() : null);
				stm.setString(index++, gestErr!=null ? DriverConfigurazioneDBLib.getValue(gestErr.getGenericFaultCode()) : null);
				stm.setString(index++, gestErr!=null ? gestErr.getPrefixFaultCode() : null);
				//Aggiorno nome servizio applicativo
				stm.setString(index++, nomeSA);
				//Aggiorno il proprietario
				stm.setLong(index++, idProprietario<0 ? oldIdProprietario : idProprietario);

				// GestioneErrore risposta asincrona
				if(aSA.getRispostaAsincrona() !=null && aSA.getRispostaAsincrona().getGestioneErrore()!=null){
					DriverConfigurazioneDB_gestioneErroreLIB.CRUDGestioneErroreServizioApplicativo(CostantiDB.UPDATE, 
							aSA.getRispostaAsincrona().getGestioneErrore(), idProprietario, idServizioApplicativo, false, con);
					stm.setLong(index++, aSA.getRispostaAsincrona().getGestioneErrore().getId());
				}
				//	GestioneErrore invocazione servizio
				if(aSA.getInvocazioneServizio() !=null && aSA.getInvocazioneServizio().getGestioneErrore()!=null){
					DriverConfigurazioneDB_gestioneErroreLIB.CRUDGestioneErroreServizioApplicativo(CostantiDB.UPDATE, 
							aSA.getInvocazioneServizio().getGestioneErrore(), idProprietario, idServizioApplicativo, true, con);
					stm.setLong(index++, aSA.getInvocazioneServizio().getGestioneErrore().getId());
				}
				
				//tipologia erogazione/fruizione
				stm.setString(index++, aSA.getTipologiaFruizione()!=null ? TipologiaFruizione.valueOf(aSA.getTipologiaFruizione().toUpperCase()).toString() : TipologiaFruizione.DISABILITATO.toString());
				stm.setString(index++, aSA.getTipologiaErogazione()!=null ? TipologiaErogazione.valueOf(aSA.getTipologiaErogazione().toUpperCase()).toString() : TipologiaErogazione.DISABILITATO.toString());
				
				if(utenteUltimaModifica!=null) {
					stm.setString(index++, utenteUltimaModifica);
				}
				
				if(dataUltimaModifica!=null) {
					stm.setTimestamp(index++, dataUltimaModifica);
				}
				
				// where
				stm.setLong(index++, idServizioApplicativo); 
				stm.setString(index++, oldNomeSA); 
				stm.setLong(index++, oldIdProprietario); 

				n = stm.executeUpdate();
				stm.close();
				DriverConfigurazioneDBLib.logDebug("Updated " + n + " row(s)");

				
				
				// Ruoli
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SERVIZI_APPLICATIVI_RUOLI);
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, aSA.getId());
				n=stm.executeUpdate();
				stm.close();
				DriverConfigurazioneDBLib.logDebug("Cancellati "+n+" ruoli associati al servizioApplicativo "+idServizioApplicativo);
				
				n=0;
				if(invPorta!=null && invPorta.getRuoli()!=null && invPorta.getRuoli().sizeRuoloList()>0){
					for (int i = 0; i < invPorta.getRuoli().sizeRuoloList(); i++) {
						Ruolo ruolo = invPorta.getRuoli().getRuolo(i);
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SERVIZI_APPLICATIVI_RUOLI);
						sqlQueryObject.addInsertField("id_servizio_applicativo", "?");
						sqlQueryObject.addInsertField("ruolo", "?");
						sqlQuery = sqlQueryObject.createSQLInsert();
						stm = con.prepareStatement(sqlQuery);
						stm.setLong(1, aSA.getId());
						stm.setString(2, ruolo.getNome());
						stm.executeUpdate();
						stm.close();
						n++;
						DriverConfigurazioneDBLib.logDebug("Aggiunto ruolo[" + ruolo.getNome() + "] al servizioApplicativo "+idServizioApplicativo);
					}
				}
				
				DriverConfigurazioneDBLib.logDebug("Aggiunti " + n + " ruoli al servizioApplicativo "+idServizioApplicativo);
				
				
				
				
				
				
				
				// Credenziali  (le credenziali in questa tabella partono dal numero maggiore di 1)
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SERVIZI_APPLICATIVI_CREDENZIALI);
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, aSA.getId());
				n=stm.executeUpdate();
				stm.close();
				DriverConfigurazioneDBLib.logDebug("Cancellate "+n+" credenziali associate al servizioApplicativo "+idServizioApplicativo);
				
				n=0;
				if(invPorta!=null && invPorta.sizeCredenzialiList()>1){
					for (int i = 1; i < invPorta.sizeCredenzialiList(); i++) {
						Credenziali credenziale = invPorta.getCredenziali(i);
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SERVIZI_APPLICATIVI_CREDENZIALI);
						sqlQueryObject.addInsertField("id_servizio_applicativo", "?");
						sqlQueryObject.addInsertField("subject", "?");
						sqlQueryObject.addInsertField("cn_subject", "?");
						sqlQueryObject.addInsertField("issuer", "?");
						sqlQueryObject.addInsertField("cn_issuer", "?");
						sqlQueryObject.addInsertField("certificate", "?");
						sqlQueryObject.addInsertField("cert_strict_verification", "?");
						sqlQuery = sqlQueryObject.createSQLInsert();
						stm = con.prepareStatement(sqlQuery);
						
						index = 1;
						stm.setLong(index++, aSA.getId());
						
						String subjectCredenziale = null;
						if(credenziale!=null && credenziale.getSubject()!=null && !"".equals(credenziale.getSubject()))
							subjectCredenziale = credenziale.getSubject();
						stm.setString(index++, (subjectCredenziale != null ? CertificateUtils.formatPrincipal(subjectCredenziale, PrincipalType.SUBJECT) : null));
						String subjectCredenzialeCN = null;
						if(credenziale!=null && credenziale.getCnSubject()!=null && !"".equals(credenziale.getCnSubject()))
							subjectCredenzialeCN = credenziale.getCnSubject();
						stm.setString(index++, subjectCredenzialeCN);
						
						String issuerCredenziale = null;
						if(credenziale != null && org.openspcoop2.core.config.constants.CredenzialeTipo.APIKEY.equals(credenziale.getTipo())) {
							stm.setString(index++, CostantiDB.getIssuerApiKey(credenziale.isAppId()));
						}
						else {
							if(credenziale!=null && credenziale.getIssuer()!=null && !"".equals(credenziale.getIssuer()))
								issuerCredenziale = credenziale.getIssuer();
							stm.setString(index++, (issuerCredenziale != null ? CertificateUtils.formatPrincipal(issuerCredenziale, PrincipalType.ISSUER) : null));
						}
						String issuerCredenzialeCN = null;
						if(credenziale!=null && credenziale.getCnIssuer()!=null && !"".equals(credenziale.getCnIssuer()))
							issuerCredenzialeCN = credenziale.getCnIssuer();
						stm.setString(index++, issuerCredenzialeCN);
						
						byte [] certificateCredenziale = null;
						if(credenziale!=null && credenziale.getCertificate()!=null) {
							certificateCredenziale = credenziale.getCertificate();
						}
						jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverConfigurazioneDBLib.tipoDB);
						jdbcAdapter.setBinaryData(stm, index++, certificateCredenziale);
						if(credenziale!=null && credenziale.isCertificateStrictVerification()) {
							stm.setInt(index++, CostantiDB.TRUE);
						}				
						else {
							stm.setInt(index++, CostantiDB.FALSE);
						}
						
						stm.executeUpdate();
						stm.close();
						n++;
						DriverConfigurazioneDBLib.logDebug("Aggiunta credenziale al servizioApplicativo "+idServizioApplicativo);
					}
				}
				
				DriverConfigurazioneDBLib.logDebug("Aggiunte " + n + " credenziali al servizioApplicativo "+idServizioApplicativo);
				
				
				
				// Proprieta
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SERVIZI_APPLICATIVI_PROPS);
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, aSA.getId());
				n=stm.executeUpdate();
				stm.close();
				DriverConfigurazioneDBLib.logDebug("Cancellate "+n+" proprieta' associate al servizioApplicativo "+idServizioApplicativo);
				
				n=0;
				if(proprieta!=null && !proprieta.isEmpty()){
					for (int i = 0; i < proprieta.size(); i++) {
						Proprieta prop = proprieta.get(i);
						
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SERVIZI_APPLICATIVI_PROPS);
						sqlQueryObject.addInsertField("id_servizio_applicativo", "?");
						sqlQueryObject.addInsertField("nome", "?");
						sqlQueryObject.addInsertField("valore", "?");
						sqlQueryObject.addInsertField("enc_value", "?");
						sqlQuery = sqlQueryObject.createSQLInsert();
						stm = con.prepareStatement(sqlQuery);
						
						int indexP = 1;
						stm.setLong(indexP++, aSA.getId());
						stm.setString(indexP++, prop.getNome());
						
						String plainValueP = prop.getValore();
						String encValueP = null;
						if(driverBYOK!=null && BYOKUtilities.isWrappedValue(plainValueP) ) {
							BYOKWrappedValue byokValue = driverBYOK.wrap(plainValueP);
							if(byokValue!=null) {
								encValueP = byokValue.getWrappedValue();
								plainValueP = byokValue.getWrappedPlainValue();
							}
						}
						
						stm.setString(indexP++, plainValueP);
						stm.setString(indexP++, encValueP);
						
						stm.executeUpdate();
						stm.close();
						n++;
						DriverConfigurazioneDBLib.logDebug("Aggiunta proprieta' [" + prop.getNome() + "] al servizioApplicativo "+idServizioApplicativo);
					}
				}
				
				DriverConfigurazioneDBLib.logDebug("Aggiunte " + n + " proprieta' al servizioApplicativo "+idServizioApplicativo);
				
				
				
				
				// ProtocolProperties
				DriverConfigurazioneDBLib.crudProtocolProperty(CostantiDB.UPDATE, aSA.getProtocolPropertyList(), 
						idServizioApplicativo, ProprietariProtocolProperty.SERVIZIO_APPLICATIVO, con, DriverConfigurazioneDBLib.tipoDB, driverBYOK);
				
				break;

			case DELETE:
				// delete
				/** if(aSA.getId()==null || aSA.getId()<=0) throw new
				// DriverConfigurazioneException("[DriverConfigurazioneDB_LIB::CRUDServizioApplicativo(DELETE)]
				// id del ServizioApplicativo non valida.");*/

				DriverConfigurazioneDBLib.logDebug("get ID Servizio Applicativo con nome["+nomeSA+"] tipoProprietario["+tipoProprietario+"] nomeProprietario["+nomeProprietario+"]");
				idServizioApplicativo = getIdServizioApplicativo(nomeSA, tipoProprietario, nomeProprietario, con, DriverConfigurazioneDBLib.tipoDB,DriverConfigurazioneDBLib.tabellaSoggetti);
				DriverConfigurazioneDBLib.logDebug("get ID Servizio Applicativo: "+idServizioApplicativo); 

				// ProtocolProperties
				DriverConfigurazioneDBLib.crudProtocolProperty(CostantiDB.DELETE, null, 
						idServizioApplicativo, ProprietariProtocolProperty.SERVIZIO_APPLICATIVO, con, DriverConfigurazioneDBLib.tipoDB, driverBYOK);
				
				// proprieta'
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SERVIZI_APPLICATIVI_PROPS);
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, idServizioApplicativo);
				n=stm.executeUpdate();
				stm.close();
				if (n > 0)
					DriverConfigurazioneDBLib.logDebug("Deleted " + n + " proprieta' associate al ServizioApplicativo[" + idServizioApplicativo + "]");
				
				// credenziali
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SERVIZI_APPLICATIVI_CREDENZIALI);
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, idServizioApplicativo);
				n=stm.executeUpdate();
				stm.close();
				if (n > 0)
					DriverConfigurazioneDBLib.logDebug("Deleted " + n + " credenziali associate al ServizioApplicativo[" + idServizioApplicativo + "]");
				
				// ruoli
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SERVIZI_APPLICATIVI_RUOLI);
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, idServizioApplicativo);
				n=stm.executeUpdate();
				stm.close();
				if (n > 0)
					DriverConfigurazioneDBLib.logDebug("Deleted " + n + " ruoli associati al ServizioApplicativo[" + idServizioApplicativo + "]");
				
				/*
				 * BUG Devo prima eliminare l'associazione
				 */
				/**
				// cancello anche le associazioni delle porteapplicative
				// associate a questo servizio
				// serviziapplicativi
				
				List<Long> idsPA_SA = new ArrayList<>(); 
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDB_LIB.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.PORTE_APPLICATIVE_SA);
				sqlQueryObject.addSelectField("id");
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQueryObject.setANDLogicOperator(true);
				sqlQuery = sqlQueryObject.createSQLQuery();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, idServizioApplicativo);
				rs = stm.executeQuery();
				while(rs.next()) {
					idsPA_SA.add(rs.getLong("id"));
				}
				rs.close();
				stm.close();
				
				if(!idsPA_SA.isEmpty()) {
					for (Long idsapa : idsPA_SA) {
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDB_LIB.tipoDB);
						sqlQueryObject.addDeleteTable(CostantiDB.PORTE_APPLICATIVE_SA_PROPS);
						sqlQueryObject.addWhereCondition("id_porta=?");
						sqlQuery = sqlQueryObject.createSQLDelete();
						stm = con.prepareStatement(sqlQuery);
						stm.setLong(1, idsapa);
						n=stm.executeUpdate();
						stm.close();
						DriverConfigurazioneDB_LIB.logDebug("Eliminate "+n+" proprieta relative all'associazione '"+idsapa+"' (SA "+idServizioApplicativo+")");
					}
				}
				
				DriverConfigurazioneDB_LIB.logDebug("Deleted PA associazioni...");
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.PORTE_APPLICATIVE_SA);
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, idServizioApplicativo);
				n=stm.executeUpdate();
				stm.close();
				if (n > 0)
					DriverConfigurazioneDB_LIB.logDebug("Deleted " + n + " associazioni di PortaApplicativa<->ServizioApplicativo associate al ServizioApplicativo[" + idServizioApplicativo + "]");

				// faccio lo stesso per le portedelegate
				DriverConfigurazioneDB_LIB.logDebug("Deleted PD associazioni...");
				DriverConfigurazioneDB_LIB.logDebug("Deleted PA associazioni...");
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.PORTE_DELEGATE_SA);
				sqlQueryObject.addWhereCondition("id_servizio_applicativo=?");
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, idServizioApplicativo);
				n=stm.executeUpdate();
				stm.close();
				if (n > 0)
					DriverConfigurazioneDB_LIB.logDebug("Deleted " + n + " associazioni di PortaDelegata<->ServizioApplicativo associate al ServizioApplicativo[" + idServizioApplicativo + "]");
				 */


				DriverConfigurazioneDBLib.logDebug("Deleted ...");
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverConfigurazioneDBLib.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SERVIZI_APPLICATIVI);
				sqlQueryObject.addWhereCondition("id=?");
				sqlQueryObject.addWhereCondition("nome=?");
				sqlQueryObject.addWhereCondition("id_soggetto=?");
				sqlQueryObject.setANDLogicOperator(true);
				sqlQuery = sqlQueryObject.createSQLDelete();
				stm = con.prepareStatement(sqlQuery);
				stm.setLong(1, idServizioApplicativo);
				stm.setString(2, nomeSA);
				stm.setLong(3, idProprietario);
				DriverConfigurazioneDBLib.logDebug("eseguo query : " + DBUtils.formatSQLString(sqlQuery, idServizioApplicativo,nomeSA,idProprietario));
				n=stm.executeUpdate();
				stm.close();
				DriverConfigurazioneDBLib.logDebug("Deleted " + n + " row(s)");


				//cancello i connettori

				// Connettore asincrono
				DriverConfigurazioneDBLib.logDebug("Recupero connettore asincrono ...");
				if(aSA.getRispostaAsincrona()!=null && aSA.getRispostaAsincrona().getConnettore()!=null){
					connettoreRisp=aSA.getRispostaAsincrona().getConnettore();
				}else{
					connettoreRisp = new Connettore();
					connettoreRisp.setTipo(TipiConnettore.DISABILITATO.getNome());
				}
				nomeConnettoreRisp = "ConnettoreRISP_" + aSA.getNome()+"_"+aSA.getTipoSoggettoProprietario()+aSA.getNomeSoggettoProprietario();
				connettoreRisp.setNome(nomeConnettoreRisp);
				idConnettoreRisp = DBUtils.getIdConnettore(nomeConnettoreRisp, con, DriverConfigurazioneDBLib.tipoDB);
				DriverConfigurazioneDBLib.logDebug("Recupero connettore asincrono id["+idConnettoreRisp+"]");
				connettoreRisp.setId(idConnettoreRisp);


				// Connettore inv servizio
				DriverConfigurazioneDBLib.logDebug("Recupero connettore invocazione servizio ...");
				if(aSA.getInvocazioneServizio()!=null && aSA.getInvocazioneServizio().getConnettore()!=null){
					connettoreInv=aSA.getInvocazioneServizio().getConnettore();
				}else{
					connettoreInv = new Connettore();
					connettoreInv.setTipo(TipiConnettore.DISABILITATO.getNome());
				}
				nomeConnettoreInv = "ConnettoreINV_" + aSA.getNome()+"_"+aSA.getTipoSoggettoProprietario()+aSA.getNomeSoggettoProprietario();
				connettoreInv.setNome(nomeConnettoreInv);
				idConnettoreInv = DBUtils.getIdConnettore(nomeConnettoreInv, con, DriverConfigurazioneDBLib.tipoDB);
				DriverConfigurazioneDBLib.logDebug("Recupero connettore invocazione servizio id["+idConnettoreInv+"]");
				connettoreInv.setId(idConnettoreInv);


				//Controllo consistenza degli id dei connettori in quanto devono essere specificati
				//e quindi maggiori di 0
				if(idConnettoreInv <=0 || idConnettoreRisp<=0) throw new DriverConfigurazioneException("I connettori del servizio applicativo sono invalidi");

				// se il connettore e' abilitato allora propago le modifiche al
				// connettore
				DriverConfigurazioneDBLib.logDebug("Delete connettore asincrono ...");
				DriverConfigurazioneDB_connettoriLIB.CRUDConnettore(CostantiDB.DELETE, connettoreRisp, con, driverBYOK);
				DriverConfigurazioneDBLib.logDebug("Delete connettore invocazione servizio ...");
				DriverConfigurazioneDB_connettoriLIB.CRUDConnettore(CostantiDB.DELETE, connettoreInv, con, driverBYOK);

				
				// Delete gestione errore risposta asincrona
				if(aSA.getRispostaAsincrona() !=null && aSA.getRispostaAsincrona().getGestioneErrore()!=null){
					DriverConfigurazioneDB_gestioneErroreLIB.CRUDGestioneErroreServizioApplicativo(CostantiDB.DELETE, 
							aSA.getRispostaAsincrona().getGestioneErrore(), idProprietario, idServizioApplicativo, false, con);
				}
				
				
				// Delete gestione errore invocazione servizio
				if(aSA.getInvocazioneServizio() !=null && aSA.getInvocazioneServizio().getGestioneErrore()!=null){
					DriverConfigurazioneDB_gestioneErroreLIB.CRUDGestioneErroreServizioApplicativo(CostantiDB.DELETE, 
							aSA.getInvocazioneServizio().getGestioneErrore(), idProprietario, idServizioApplicativo, true, con);
				}
				

				break;

			}

			return idServizioApplicativo;
		} catch (DriverConfigurazioneException e) {
			throw e;
		} catch (SQLException se) {
			throw new DriverConfigurazioneException("SQLException : " + se.getMessage(),se);
		} catch (Exception se) {
			throw new DriverConfigurazioneException("Exception : " + se.getMessage(),se);
		} finally {
			//Chiudo statement and resultset
			JDBCUtilities.closeResources(rs, stmQuery);
			JDBCUtilities.closeResources(stm);
			JDBCUtilities.closeResources(stm2);
		}
	}

	
	
	
	public static long getIdServizioApplicativo(String nomeServizioApplicativo, String tipoProprietario,String nomeProprietario,
			Connection con, String tipoDB) throws CoreException
	{
		return getIdServizioApplicativo(nomeServizioApplicativo, tipoProprietario, nomeProprietario, con, tipoDB, CostantiDB.SOGGETTI);
	}
	public static long getIdServizioApplicativo(String nomeServizioApplicativo, String tipoProprietario,String nomeProprietario,
			Connection con, String tipoDB,String tabellaSoggetti) throws CoreException
	{
		PreparedStatement stm = null;
		ResultSet rs = null;
		long idSoggetto;
		long idServizioApplicativo=-1;

		try
		{
			idSoggetto = DBUtils.getIdSoggetto(nomeProprietario, tipoProprietario, con, tipoDB,tabellaSoggetti);

			//recupero l'id della porta applicativa appena inserita
			ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDB);
			sqlQueryObject.addFromTable(CostantiDB.SERVIZI_APPLICATIVI);
			sqlQueryObject.addSelectField("id");
			sqlQueryObject.addWhereCondition("id_soggetto = ?");
			sqlQueryObject.addWhereCondition("nome = ?");
			sqlQueryObject.setANDLogicOperator(true);
			String sqlQuery = sqlQueryObject.createSQLQuery();
			stm=con.prepareStatement(sqlQuery);
			stm.setLong(1, idSoggetto);
			stm.setString(2, nomeServizioApplicativo);

			rs=stm.executeQuery();

			if(rs.next())
			{
				idServizioApplicativo=rs.getLong("id");
			}
			return idServizioApplicativo;
		}catch (Exception e) {
			throw new CoreException(e);
		}finally
		{
			//Chiudo statement and resultset
			JDBCUtilities.closeResources(rs, stm);

		}
	}
	
}