DriverRegistroServiziDB_soggettiLIB.java

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



package org.openspcoop2.core.registry.driver.db;

import 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 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.constants.CostantiDB;
import org.openspcoop2.core.constants.ProprietariProtocolProperty;
import org.openspcoop2.core.id.IDRuolo;
import org.openspcoop2.core.registry.Connettore;
import org.openspcoop2.core.registry.CredenzialiSoggetto;
import org.openspcoop2.core.registry.PortaDominio;
import org.openspcoop2.core.registry.Proprieta;
import org.openspcoop2.core.registry.RuoloSoggetto;
import org.openspcoop2.core.registry.constants.StatoFunzionalita;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
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;

/**
 * Classe utilizzata per effettuare query ad un registro dei servizi openspcoop
 * formato db.
 * 
 * 
 * @author Sandra Giangrandi (sandra@link.it)
 * @author Stefano Corallo (corallo@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class DriverRegistroServiziDB_soggettiLIB {

	

	/** Metodi CRUD */

	public static void CRUDPortaDominio(int type, PortaDominio pdd, Connection con)
	throws DriverRegistroServiziException {
		if (pdd == null) {
			throw new DriverRegistroServiziException(
			"[DriverRegistroServiziDB_LIB::CRUDPdd] Parametro non valido.");
		}

		/**if ((type != CostantiDB.CREATE) && (pdd.getId() <= 0)) {
			throw new DriverRegistroServiziException(
			"[DriverRegistroServiziDB_LIB::CRUDPdd] ID Pdd non valido.");
		}*/

		String nome = pdd.getNome();
		String descrizione = pdd.getDescrizione();
		String implementazione = pdd.getImplementazione();

		String subject = pdd.getSubject();
		StatoFunzionalita client_auth = pdd.getClientAuth();
		
		String superuser = pdd.getSuperUser();

		PreparedStatement updateStmt = null;
		String updateQuery = "";
		PreparedStatement selectStmt = null;
		String selectQuery = "";
		ResultSet selectRS = null;
		int n = 0;

		try {

			// preparo lo statement in base al tipo di operazione
			switch (type) {
			case CREATE:
				// CREATE
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addInsertTable(CostantiDB.PDD);
				sqlQueryObject.addInsertField("nome", "?");
				sqlQueryObject.addInsertField("descrizione", "?");
				sqlQueryObject.addInsertField("implementazione", "?");
				sqlQueryObject.addInsertField("subject", "?");
				sqlQueryObject.addInsertField("client_auth", "?");
				sqlQueryObject.addInsertField("superuser", "?");
				if(pdd.getOraRegistrazione()!=null)
					sqlQueryObject.addInsertField("ora_registrazione", "?");

				updateQuery = sqlQueryObject.createSQLInsert();
				updateStmt = con.prepareStatement(updateQuery);

				updateStmt.setString(1, nome);
				updateStmt.setString(2, descrizione);
				updateStmt.setString(3, implementazione);
				updateStmt.setString(4, (subject != null ? CertificateUtils.formatPrincipal(subject, PrincipalType.SUBJECT) : null));
				updateStmt.setString(5, DriverRegistroServiziDB_LIB.getValue(client_auth));
				updateStmt.setString(6, superuser);
				if(pdd.getOraRegistrazione()!=null)
					updateStmt.setTimestamp(7, new Timestamp(pdd.getOraRegistrazione().getTime()));

				// eseguo lo statement
				n = updateStmt.executeUpdate();

				updateStmt.close();

				DriverRegistroServiziDB_LIB.logDebug("CRUDPdd type = " + type
						+ " row affected =" + n);

				DriverRegistroServiziDB_LIB.logDebug("CRUDPdd CREATE : \n"
						+ DriverRegistroServiziDB_LIB.formatSQLString(
								updateQuery, nome, descrizione,implementazione,subject,client_auth));

				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.PDD);
				sqlQueryObject.addSelectField("id");
				sqlQueryObject.addWhereCondition("nome = ?");
				selectQuery = sqlQueryObject.createSQLQuery();
				selectStmt = con.prepareStatement(selectQuery);
				selectStmt.setString(1, nome);

				selectRS = selectStmt.executeQuery();
				if (selectRS.next()) {
					pdd.setId(selectRS.getLong("id"));
				}
				selectRS.close();
				selectStmt.close();
				break;

			case UPDATE:
				// UPDATE

				String nomePdd = pdd.getOldNomeForUpdate();
				if(nomePdd==null || "".equals(nomePdd))
					nomePdd = pdd.getNome();
				
				long idPdd = DBUtils.getIdPortaDominio(nomePdd, con, DriverRegistroServiziDB_LIB.tipoDB);
				if (idPdd <= 0)
					throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDPortaDominio(UPDATE)] Id Porta di Dominio non valido.");
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addUpdateTable(CostantiDB.PDD);
				sqlQueryObject.addUpdateField("nome", "?");
				sqlQueryObject.addUpdateField("descrizione", "?");
				sqlQueryObject.addUpdateField("implementazione", "?");
				sqlQueryObject.addUpdateField("subject", "?");
				sqlQueryObject.addUpdateField("client_auth", "?");
				sqlQueryObject.addUpdateField("superuser", "?");
				if(pdd.getOraRegistrazione()!=null)
					sqlQueryObject.addUpdateField("ora_registrazione", "?");
				sqlQueryObject.addWhereCondition("id=?");
				updateQuery = sqlQueryObject.createSQLUpdate();
				updateStmt = con.prepareStatement(updateQuery);

				updateStmt.setString(1, nome);
				updateStmt.setString(2, descrizione);
				updateStmt.setString(3, implementazione);
				updateStmt.setString(4, (subject != null ? CertificateUtils.formatPrincipal(subject, PrincipalType.SUBJECT) : null));
				updateStmt.setString(5, DriverRegistroServiziDB_LIB.getValue(client_auth));
				updateStmt.setString(6, superuser);

				int paramIndex = 6;

				if(pdd.getOraRegistrazione()!=null)
					updateStmt.setTimestamp(++paramIndex, new Timestamp(pdd.getOraRegistrazione().getTime()));

				updateStmt.setLong(++paramIndex, idPdd);

				// eseguo lo statement
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDPdd type = " + type
						+ " row affected =" + n);

				DriverRegistroServiziDB_LIB.logDebug("CRUDPdd UPDATE : \n"
						+ DriverRegistroServiziDB_LIB.formatSQLString(
								updateQuery, descrizione, implementazione,subject,client_auth,idPdd));

				break;

			case DELETE:
				// DELETE

				idPdd = DBUtils.getIdPortaDominio(nome, con, DriverRegistroServiziDB_LIB.tipoDB);
				if (idPdd <= 0)
					throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDPortaDominio(DELETE)] Id Porta di Dominio non valido.");
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.PDD);
				sqlQueryObject.addWhereCondition("id=?");
				updateQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(updateQuery);

				updateStmt.setLong(1, idPdd);

				// eseguo lo statement
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDPdd type = " + type
						+ " row affected =" + n);

				DriverRegistroServiziDB_LIB.logDebug("CRUDPdd DELETE : \n"
						+ DriverRegistroServiziDB_LIB.formatSQLString(
								updateQuery, idPdd));

				break;
			}

		} catch (SQLException se) {
			throw new DriverRegistroServiziException(
					"[DriverControlStationDB_LIB::CRUDPdd] SQLException ["
					+ se.getMessage() + "].",se);
		} catch (Exception se) {
			throw new DriverRegistroServiziException(
					"[DriverControlStationDB_LIB::CRUDPdd] Exception ["
					+ se.getMessage() + "].",se);
		} finally {
			JDBCUtilities.closeResources(updateStmt);
			JDBCUtilities.closeResources(selectRS, selectStmt);
		}
	}
	
	/**
	 * CRUD oggetto Soggetto Non si occupa di chiudere la connessione con
	 * il db in caso di errore in quanto verra' gestita dal metodo chiamante
	 * 
	 * @param type
	 *            Tipo operazione {1 (CREATE),2 (UPDATE),3 (DELETE)}
	 * @param soggetto
	 * @throws DriverRegistroServiziException
	 */
	public static long CRUDSoggetto(int type, org.openspcoop2.core.registry.Soggetto soggetto, 
			Connection con, String tipoDatabase, IDriverBYOK driverBYOK) throws DriverRegistroServiziException {
		if (soggetto == null)
			throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDSoggetto] Parametro non valido.");

		String nome = soggetto.getNome();
		String tipo = soggetto.getTipo();

		if (nome == null || nome.equals(""))
			throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDSoggetto] Parametro Nome non valido.");
		if (tipo == null || tipo.equals(""))
			throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDSoggetto] Parametro Tipo non valido.");

		String descizione = soggetto.getDescrizione();
		String identificativoPorta = soggetto.getIdentificativoPorta();
		String server = soggetto.getPortaDominio();
		Connettore connettore = soggetto.getConnettore();
		String codiceIPA = soggetto.getCodiceIpa();
		String superUser = soggetto.getSuperUser();

		if (connettore == null && type != CostantiDB.CREATE && type!=CostantiDB.DELETE)
			throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDSoggetto] Il connettore del soggetto e' null.");

		PreparedStatement updateStmt = null;
		String updateQuery = "";
		PreparedStatement selectStmt = null;
		String selectQuery = "";
		ResultSet selectRS = null;
		long idSoggetto = 0;
		int n = 0;

		try {
			long idConnettore;

			// preparo lo statement in base al tipo di operazione
			switch (type) {
			case CREATE:
				// CREATE

				String utenteRichiedente = null;
				if(soggetto.getProprietaOggetto()!=null && soggetto.getProprietaOggetto().getUtenteRichiedente()!=null) {
					utenteRichiedente = soggetto.getProprietaOggetto().getUtenteRichiedente();
				}
				else {
					utenteRichiedente = superUser;
				}
				
				Timestamp dataCreazione = null;
				if(soggetto.getProprietaOggetto()!=null && soggetto.getProprietaOggetto().getDataCreazione()!=null) {
					dataCreazione = new Timestamp(soggetto.getProprietaOggetto().getDataCreazione().getTime());
				}
				else if(soggetto.getOraRegistrazione()!=null){
					dataCreazione = new Timestamp(soggetto.getOraRegistrazione().getTime());
				}
				else {
					dataCreazione = DateManager.getTimestamp();
				}
				
				ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addInsertTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addInsertField("nome_soggetto", "?");
				sqlQueryObject.addInsertField("descrizione", "?");
				sqlQueryObject.addInsertField("identificativo_porta", "?");
				sqlQueryObject.addInsertField("tipo_soggetto", "?");
				sqlQueryObject.addInsertField("id_connettore", "?");
				sqlQueryObject.addInsertField("server", "?");
				sqlQueryObject.addInsertField("superuser", "?");
				sqlQueryObject.addInsertField("privato", "?");
				sqlQueryObject.addInsertField("profilo", "?");
				sqlQueryObject.addInsertField("codice_ipa", "?");
				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", "?");
				if(soggetto.getOraRegistrazione()!=null)
					sqlQueryObject.addInsertField("ora_registrazione", "?");
				if(utenteRichiedente!=null) {
					sqlQueryObject.addInsertField(CostantiDB.PROPRIETA_OGGETTO_UTENTE_RICHIEDENTE, "?");
				}
				if(dataCreazione!=null) {
					sqlQueryObject.addInsertField(CostantiDB.PROPRIETA_OGGETTO_DATA_CREAZIONE, "?");
				}
				updateQuery = sqlQueryObject.createSQLInsert();
				updateStmt = con.prepareStatement(updateQuery);

				// Controllo se il connettore non e' presente ne creo uno
				// disabilitato
				// in questo caso setto il nome del connettore
				if (connettore == null) {
					connettore = new Connettore();
					connettore.setNome("CNT_" + tipo + "_" + nome);
				}

				if (connettore.getNome() == null || connettore.getNome().equals(""))
					connettore.setNome("CNT_" + tipo + "_" + nome);

				idConnettore = DriverRegistroServiziDB_connettoriLIB.CRUDConnettore(CostantiDB.CREATE, connettore, con, driverBYOK);

				int index = 1;
				
				updateStmt.setString(index++, nome);
				updateStmt.setString(index++, descizione);
				updateStmt.setString(index++, identificativoPorta);
				updateStmt.setString(index++, tipo);
				updateStmt.setLong(index++, idConnettore);
				updateStmt.setString(index++, server);
				updateStmt.setString(index++, superUser);
				if(soggetto.getPrivato()!=null && soggetto.getPrivato())
					updateStmt.setInt(index++, 1);
				else
					updateStmt.setInt(index++, 0);
				updateStmt.setString(index++, soggetto.getVersioneProtocollo());
				updateStmt.setString(index++, codiceIPA);
				
				CredenzialiSoggetto credenziali = (soggetto.sizeCredenzialiList() > 0 ? soggetto.getCredenziali(0) : null);
				updateStmt.setString(index++, (credenziali != null ? DriverRegistroServiziDB_LIB.getValue(credenziali.getTipo()) : null));
				updateStmt.setString(index++, (credenziali != null ? credenziali.getUser() : null));
				updateStmt.setString(index++, (credenziali != null ? credenziali.getPassword() : null));
				
				String subject = null;
				if(credenziali!=null && credenziali.getSubject()!=null && !"".equals(credenziali.getSubject()))
					subject = credenziali.getSubject();
				updateStmt.setString(index++, (subject != null ? CertificateUtils.formatPrincipal(subject, PrincipalType.SUBJECT) : null));
				String subjectCN = null;
				if(credenziali!=null && credenziali.getCnSubject()!=null && !"".equals(credenziali.getCnSubject()))
					subjectCN = credenziali.getCnSubject();
				updateStmt.setString(index++, subjectCN);
				
				String issuer = null;
				if(credenziali != null && org.openspcoop2.core.registry.constants.CredenzialeTipo.APIKEY.equals(credenziali.getTipo())) {
					updateStmt.setString(index++, CostantiDB.getIssuerApiKey(credenziali.isAppId()));
				}
				else {
					if(credenziali!=null && credenziali.getIssuer()!=null && !"".equals(credenziali.getIssuer()))
						issuer = credenziali.getIssuer();
					updateStmt.setString(index++, (issuer != null ? CertificateUtils.formatPrincipal(issuer, PrincipalType.ISSUER) : null));
				}
				String issuerCN = null;
				if(credenziali!=null && credenziali.getCnIssuer()!=null && !"".equals(credenziali.getCnIssuer()))
					issuerCN = credenziali.getCnIssuer();
				updateStmt.setString(index++, issuerCN);
				
				byte [] certificate = null;
				if(credenziali!=null && credenziali.getCertificate()!=null) {
					certificate = credenziali.getCertificate();
				}
				IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverRegistroServiziDB_LIB.tipoDB);
				jdbcAdapter.setBinaryData(updateStmt, index++, certificate);
				if(credenziali!=null && credenziali.isCertificateStrictVerification()) {
					updateStmt.setInt(index++, CostantiDB.TRUE);
				}				
				else {
					updateStmt.setInt(index++, CostantiDB.FALSE);
				}
								
				if(soggetto.getOraRegistrazione()!=null){
					updateStmt.setTimestamp(index++, new Timestamp(soggetto.getOraRegistrazione().getTime()));
				}
				
				if(utenteRichiedente!=null) {
					updateStmt.setString(index++, utenteRichiedente);
				}
				
				if(dataCreazione!=null) {
					updateStmt.setTimestamp(index++, dataCreazione);
				}

				// eseguo lo statement
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n);
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto CREATE : \n" + DriverRegistroServiziDB_LIB.formatSQLString(updateQuery, nome, descizione, identificativoPorta, tipo, idConnettore, server));

				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addFromTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addSelectField("id");
				sqlQueryObject.addWhereCondition("tipo_soggetto = ?");
				sqlQueryObject.addWhereCondition("nome_soggetto = ?");
				sqlQueryObject.setANDLogicOperator(true);
				selectQuery = sqlQueryObject.createSQLQuery();
				selectStmt = con.prepareStatement(selectQuery);
				selectStmt.setString(1, tipo);
				selectStmt.setString(2, nome);
				selectRS = selectStmt.executeQuery();
				if (selectRS.next())
					idSoggetto = selectRS.getLong("id");

				soggetto.setId(idSoggetto);

				selectRS.close();
				selectStmt.close();
				
				
				// ProtocolProperties
				DriverRegistroServiziDB_LIB.CRUDProtocolProperty(CostantiDB.CREATE, soggetto.getProtocolPropertyList(), 
						idSoggetto, ProprietariProtocolProperty.SOGGETTO, con, tipoDatabase, driverBYOK);
				
				
				// ruoli
				
				n = 0;
				if(soggetto.getRuoli()!=null && soggetto.getRuoli().sizeRuoloList()>0){
					for (int i = 0; i < soggetto.getRuoli().sizeRuoloList(); i++) {
						RuoloSoggetto ruoloSoggetto = soggetto.getRuoli().getRuolo(i);
						
						IDRuolo idRuoloObject= new IDRuolo(ruoloSoggetto.getNome());
						long idRuolo = DBUtils.getIdRuolo(idRuoloObject, con, DriverRegistroServiziDB_LIB.tipoDB);
						
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SOGGETTI_RUOLI);
						sqlQueryObject.addInsertField("id_soggetto", "?");
						sqlQueryObject.addInsertField("id_ruolo", "?");
						updateQuery = sqlQueryObject.createSQLInsert();
						updateStmt = con.prepareStatement(updateQuery);
						
						updateStmt.setLong(1, idSoggetto);
						updateStmt.setLong(2, idRuolo);
						
						int r= updateStmt.executeUpdate();
						n++;
						updateStmt.close();
						DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + r+" create role ["+ruoloSoggetto.getNome()+"]");
					}
				}
				
				DriverRegistroServiziDB_LIB.logDebug("Aggiunti " + n + " ruoli al soggetto "+idSoggetto);
				
				
				// credenziali (le credenziali in questa tabella partono dal numero maggiore di 1)
				
				n = 0;
				if(soggetto.sizeCredenzialiList()>1){
					for (int i = 1; i < soggetto.sizeCredenzialiList(); i++) {
						CredenzialiSoggetto credenzialiSoggetto = soggetto.getCredenziali(i);
						
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SOGGETTI_CREDENZIALI);
						sqlQueryObject.addInsertField("id_soggetto", "?");
						sqlQueryObject.addInsertField("subject", "?");
						sqlQueryObject.addInsertField("cn_subject", "?");
						sqlQueryObject.addInsertField("issuer", "?");
						sqlQueryObject.addInsertField("cn_issuer", "?");
						sqlQueryObject.addInsertField("certificate", "?");
						sqlQueryObject.addInsertField("cert_strict_verification", "?");
						updateQuery = sqlQueryObject.createSQLInsert();
						updateStmt = con.prepareStatement(updateQuery);
						
						index = 1;
						updateStmt.setLong(index++, idSoggetto);
						
						String subjectCredenziali = null;
						if(credenzialiSoggetto!=null && credenzialiSoggetto.getSubject()!=null && !"".equals(credenzialiSoggetto.getSubject()))
							subjectCredenziali = credenzialiSoggetto.getSubject();
						updateStmt.setString(index++, (subjectCredenziali != null ? CertificateUtils.formatPrincipal(subjectCredenziali, PrincipalType.SUBJECT) : null));
						String subjectCredenzialiCN = null;
						if(credenzialiSoggetto!=null && credenzialiSoggetto.getCnSubject()!=null && !"".equals(credenzialiSoggetto.getCnSubject()))
							subjectCredenzialiCN = credenzialiSoggetto.getCnSubject();
						updateStmt.setString(index++, subjectCredenzialiCN);
						
						String issuerCredenziali = null;
						if(credenzialiSoggetto != null && org.openspcoop2.core.registry.constants.CredenzialeTipo.APIKEY.equals(credenzialiSoggetto.getTipo())) {
							updateStmt.setString(index++, CostantiDB.getIssuerApiKey(credenzialiSoggetto.isAppId()));
						}
						else {
							if(credenzialiSoggetto!=null && credenzialiSoggetto.getIssuer()!=null && !"".equals(credenzialiSoggetto.getIssuer()))
								issuerCredenziali = credenzialiSoggetto.getIssuer();
							updateStmt.setString(index++, (issuerCredenziali != null ? CertificateUtils.formatPrincipal(issuerCredenziali, PrincipalType.ISSUER) : null));
						}
						String issuerCredenzialiCN = null;
						if(credenzialiSoggetto!=null && credenzialiSoggetto.getCnIssuer()!=null && !"".equals(credenzialiSoggetto.getCnIssuer()))
							issuerCredenzialiCN = credenzialiSoggetto.getCnIssuer();
						updateStmt.setString(index++, issuerCredenzialiCN);
						
						byte [] certificateCredenziali = null;
						if(credenzialiSoggetto!=null && credenzialiSoggetto.getCertificate()!=null) {
							certificateCredenziali = credenzialiSoggetto.getCertificate();
						}
						jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverRegistroServiziDB_LIB.tipoDB);
						jdbcAdapter.setBinaryData(updateStmt, index++, certificateCredenziali);
						if(credenzialiSoggetto!=null && credenzialiSoggetto.isCertificateStrictVerification()) {
							updateStmt.setInt(index++, CostantiDB.TRUE);
						}				
						else {
							updateStmt.setInt(index++, CostantiDB.FALSE);
						}
						
						int r = updateStmt.executeUpdate();
						n++;
						updateStmt.close();
						DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + r+" create credenziale");
					}
					
				}
				
				DriverRegistroServiziDB_LIB.logDebug("Aggiunte " + n + " credenziali al soggetto "+idSoggetto);
				
				
				// properties
				
				n = 0;
				if(soggetto.sizeProprietaList()>0){
					for (int i = 0; i < soggetto.sizeProprietaList(); i++) {
						
						Proprieta proprieta = soggetto.getProprieta(i);
						
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SOGGETTI_PROPS);
						sqlQueryObject.addInsertField("id_soggetto", "?");
						sqlQueryObject.addInsertField("nome", "?");
						sqlQueryObject.addInsertField("valore", "?");
						sqlQueryObject.addInsertField("enc_value", "?");
						updateQuery = sqlQueryObject.createSQLInsert();
						updateStmt = con.prepareStatement(updateQuery);
						
						int indexP = 1;
						updateStmt.setLong(indexP++, idSoggetto);
						updateStmt.setString(indexP++, proprieta.getNome());
						
						String plainValue = proprieta.getValore();
						String encValue = null;
						if(driverBYOK!=null && BYOKUtilities.isWrappedValue(plainValue) ) {
							BYOKWrappedValue byokValue = driverBYOK.wrap(plainValue);
							if(byokValue!=null) {
								encValue = byokValue.getWrappedValue();
								plainValue = byokValue.getWrappedPlainValue();
							}
						}
						
						updateStmt.setString(indexP++, plainValue);
						updateStmt.setString(indexP++, encValue);
						
						int r= updateStmt.executeUpdate();
						n++;
						updateStmt.close();
						DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + r+" create property ["+proprieta.getNome()+"]");
					}
				}
				
				DriverRegistroServiziDB_LIB.logDebug("Aggiunti " + n + " proprietà al soggetto "+idSoggetto);
				
				
				break;

			case UPDATE:
				// UPDATE
				String oldNomeSoggetto = null;
				String oldTipoSoggetto = null;
				if(soggetto.getOldIDSoggettoForUpdate()!=null){
					oldNomeSoggetto = soggetto.getOldIDSoggettoForUpdate().getNome();
					oldTipoSoggetto = soggetto.getOldIDSoggettoForUpdate().getTipo();
				}

				// se i valori old... non sono settati allora uso quelli normali
				if (oldNomeSoggetto == null || oldNomeSoggetto.equals(""))
					oldNomeSoggetto = nome;
				if (oldTipoSoggetto == null || oldTipoSoggetto.equals(""))
					oldTipoSoggetto = tipo;

				String utenteUltimaModifica = null;
				if(soggetto.getProprietaOggetto()!=null && soggetto.getProprietaOggetto().getUtenteUltimaModifica()!=null) {
					utenteUltimaModifica = soggetto.getProprietaOggetto().getUtenteUltimaModifica();
				}
				else {
					utenteUltimaModifica = superUser;
				}
				
				Timestamp dataUltimaModifica = null;
				if(soggetto.getProprietaOggetto()!=null && soggetto.getProprietaOggetto().getDataUltimaModifica()!=null) {
					dataUltimaModifica = new Timestamp(soggetto.getProprietaOggetto().getDataUltimaModifica().getTime());
				}
				else {
					dataUltimaModifica = DateManager.getTimestamp();
				}
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addUpdateTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addUpdateField("nome_soggetto", "?");
				sqlQueryObject.addUpdateField("descrizione", "?");
				sqlQueryObject.addUpdateField("identificativo_porta", "?");
				sqlQueryObject.addUpdateField("tipo_soggetto", "?");
				sqlQueryObject.addUpdateField("server", "?");
				sqlQueryObject.addUpdateField("superuser", "?");
				sqlQueryObject.addUpdateField("privato", "?");
				sqlQueryObject.addUpdateField("profilo", "?");
				sqlQueryObject.addUpdateField("codice_ipa", "?");
				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", "?");
				if(soggetto.getOraRegistrazione()!=null)
					sqlQueryObject.addUpdateField("ora_registrazione", "?");
				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=?");
				updateQuery = sqlQueryObject.createSQLUpdate();
				updateStmt = con.prepareStatement(updateQuery);

				idConnettore = DriverRegistroServiziDB_LIB.getIdConnettoreSoggetto(oldNomeSoggetto, oldTipoSoggetto, con);
				connettore.setId(idConnettore);

				idSoggetto = DBUtils.getIdSoggetto(oldNomeSoggetto, oldTipoSoggetto, con, DriverRegistroServiziDB_LIB.tipoDB);
				if (idSoggetto <= 0)
					throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDSoggetto(UPDATE)] Id Soggetto non valido.");

				index = 1;
				
				updateStmt.setString(index++, nome);
				updateStmt.setString(index++, descizione);
				updateStmt.setString(index++, identificativoPorta);
				updateStmt.setString(index++, tipo);
				updateStmt.setString(index++, server);
				updateStmt.setString(index++, superUser);
				if(soggetto.getPrivato()!=null && soggetto.getPrivato())
					updateStmt.setInt(index++, 1);
				else
					updateStmt.setInt(index++, 0);
				updateStmt.setString(index++, soggetto.getVersioneProtocollo());
				updateStmt.setString(index++, codiceIPA);
				
				credenziali = (soggetto.sizeCredenzialiList() > 0 ? soggetto.getCredenziali(0) : null);
				updateStmt.setString(index++, (credenziali != null ? DriverRegistroServiziDB_LIB.getValue(credenziali.getTipo()) : null));
				updateStmt.setString(index++, (credenziali != null ? credenziali.getUser() : null));
				updateStmt.setString(index++, (credenziali != null ? credenziali.getPassword() : null));
				
				subject = null;
				if(credenziali!=null && credenziali.getSubject()!=null && !"".equals(credenziali.getSubject()))
					subject = credenziali.getSubject();
				updateStmt.setString(index++, (subject != null ? CertificateUtils.formatPrincipal(subject, PrincipalType.SUBJECT) : null));
				subjectCN = null;
				if(credenziali!=null && credenziali.getCnSubject()!=null && !"".equals(credenziali.getCnSubject()))
					subjectCN = credenziali.getCnSubject();
				updateStmt.setString(index++, subjectCN);
				
				issuer = null;
				if(credenziali != null && org.openspcoop2.core.registry.constants.CredenzialeTipo.APIKEY.equals(credenziali.getTipo())) {
					updateStmt.setString(index++, CostantiDB.getIssuerApiKey(credenziali.isAppId()));
				}
				else {
					if(credenziali!=null && credenziali.getIssuer()!=null && !"".equals(credenziali.getIssuer()))
						issuer = credenziali.getIssuer();
					updateStmt.setString(index++, (issuer != null ? CertificateUtils.formatPrincipal(issuer, PrincipalType.ISSUER) : null));
				}
				issuerCN = null;
				if(credenziali!=null && credenziali.getCnIssuer()!=null && !"".equals(credenziali.getCnIssuer()))
					issuerCN = credenziali.getCnIssuer();
				updateStmt.setString(index++, issuerCN);
				
				certificate = null;
				if(credenziali!=null && credenziali.getCertificate()!=null) {
					certificate = credenziali.getCertificate();
				}
				jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverRegistroServiziDB_LIB.tipoDB);
				jdbcAdapter.setBinaryData(updateStmt, index++, certificate);
				if(credenziali!=null && credenziali.isCertificateStrictVerification()) {
					updateStmt.setInt(index++, CostantiDB.TRUE);
				}				
				else {
					updateStmt.setInt(index++, CostantiDB.FALSE);
				}
				
				if(soggetto.getOraRegistrazione()!=null){
					updateStmt.setTimestamp(index++, new Timestamp(soggetto.getOraRegistrazione().getTime()));
				}
				
				if(utenteUltimaModifica!=null) {
					updateStmt.setString(index++, utenteUltimaModifica);
				}
				
				if(dataUltimaModifica!=null) {
					updateStmt.setTimestamp(index++, dataUltimaModifica);
				}
				
				updateStmt.setLong(index++, idSoggetto);

				// eseguo lo statement
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n);
				// modifico i dati del connettore
				//setto il nuovo nome
				String newNomeConnettore = "CNT_" + tipo + "_" + nome;
				connettore.setNome(newNomeConnettore);
				DriverRegistroServiziDB_connettoriLIB.CRUDConnettore(2, connettore, con, driverBYOK);

				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto UPDATE : \n" + DriverRegistroServiziDB_LIB.formatSQLString(updateQuery, nome, descizione, identificativoPorta, tipo, idSoggetto));

				
				// Ruoli
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SOGGETTI_RUOLI);
				sqlQueryObject.addWhereCondition("id_soggetto=?");
				updateQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(updateQuery);
				updateStmt.setLong(1, idSoggetto);
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n+" delete roles");
				
				n = 0;
				if(soggetto.getRuoli()!=null && soggetto.getRuoli().sizeRuoloList()>0){
					for (int i = 0; i < soggetto.getRuoli().sizeRuoloList(); i++) {
						RuoloSoggetto ruoloSoggetto = soggetto.getRuoli().getRuolo(i);
						
						IDRuolo idRuoloObject= new IDRuolo(ruoloSoggetto.getNome());
						long idRuolo = DBUtils.getIdRuolo(idRuoloObject, con, DriverRegistroServiziDB_LIB.tipoDB);
						
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SOGGETTI_RUOLI);
						sqlQueryObject.addInsertField("id_soggetto", "?");
						sqlQueryObject.addInsertField("id_ruolo", "?");
						updateQuery = sqlQueryObject.createSQLInsert();
						updateStmt = con.prepareStatement(updateQuery);
						
						updateStmt.setLong(1, idSoggetto);
						updateStmt.setLong(2, idRuolo);
						
						int r = updateStmt.executeUpdate();
						n++;
						updateStmt.close();
						DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + r+" create role ["+ruoloSoggetto.getNome()+"]");
					}
				}
				
				DriverRegistroServiziDB_LIB.logDebug("Aggiunti " + n + " ruoli al soggetto "+idSoggetto);
				
				
				// credenziali (le credenziali in questa tabella partono dal numero maggiore di 1)

				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SOGGETTI_CREDENZIALI);
				sqlQueryObject.addWhereCondition("id_soggetto=?");
				updateQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(updateQuery);
				updateStmt.setLong(1, idSoggetto);
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n+" delete roles");

				n = 0;
				if(soggetto.sizeCredenzialiList()>1){
					for (int i = 1; i < soggetto.sizeCredenzialiList(); i++) {
						CredenzialiSoggetto credenzialiSoggetto = soggetto.getCredenziali(i);
						
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SOGGETTI_CREDENZIALI);
						sqlQueryObject.addInsertField("id_soggetto", "?");
						sqlQueryObject.addInsertField("subject", "?");
						sqlQueryObject.addInsertField("cn_subject", "?");
						sqlQueryObject.addInsertField("issuer", "?");
						sqlQueryObject.addInsertField("cn_issuer", "?");
						sqlQueryObject.addInsertField("certificate", "?");
						sqlQueryObject.addInsertField("cert_strict_verification", "?");
						updateQuery = sqlQueryObject.createSQLInsert();
						updateStmt = con.prepareStatement(updateQuery);
						
						index = 1;
						updateStmt.setLong(index++, idSoggetto);
						
						String subjectCredenziali = null;
						if(credenzialiSoggetto!=null && credenzialiSoggetto.getSubject()!=null && !"".equals(credenzialiSoggetto.getSubject()))
							subjectCredenziali = credenzialiSoggetto.getSubject();
						updateStmt.setString(index++, (subjectCredenziali != null ? CertificateUtils.formatPrincipal(subjectCredenziali, PrincipalType.SUBJECT) : null));
						String subjectCredenzialiCN = null;
						if(credenzialiSoggetto!=null && credenzialiSoggetto.getCnSubject()!=null && !"".equals(credenzialiSoggetto.getCnSubject()))
							subjectCredenzialiCN = credenzialiSoggetto.getCnSubject();
						updateStmt.setString(index++, subjectCredenzialiCN);
						
						String issuerCredenziali = null;
						if(credenzialiSoggetto != null && org.openspcoop2.core.registry.constants.CredenzialeTipo.APIKEY.equals(credenzialiSoggetto.getTipo())) {
							updateStmt.setString(index++, CostantiDB.getIssuerApiKey(credenzialiSoggetto.isAppId()));
						}
						else {
							if(credenzialiSoggetto!=null && credenzialiSoggetto.getIssuer()!=null && !"".equals(credenzialiSoggetto.getIssuer()))
								issuerCredenziali = credenzialiSoggetto.getIssuer();
							updateStmt.setString(index++, (issuerCredenziali != null ? CertificateUtils.formatPrincipal(issuerCredenziali, PrincipalType.ISSUER) : null));
						}
						String issuerCredenzialiCN = null;
						if(credenzialiSoggetto!=null && credenzialiSoggetto.getCnIssuer()!=null && !"".equals(credenzialiSoggetto.getCnIssuer()))
							issuerCredenzialiCN = credenzialiSoggetto.getCnIssuer();
						updateStmt.setString(index++, issuerCredenzialiCN);
						
						byte [] certificateCredenziali = null;
						if(credenzialiSoggetto!=null && credenzialiSoggetto.getCertificate()!=null) {
							certificateCredenziali = credenzialiSoggetto.getCertificate();
						}
						jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(DriverRegistroServiziDB_LIB.tipoDB);
						jdbcAdapter.setBinaryData(updateStmt, index++, certificateCredenziali);
						if(credenzialiSoggetto!=null && credenzialiSoggetto.isCertificateStrictVerification()) {
							updateStmt.setInt(index++, CostantiDB.TRUE);
						}				
						else {
							updateStmt.setInt(index++, CostantiDB.FALSE);
						}
						
						int r = updateStmt.executeUpdate();
						n++;
						updateStmt.close();
						DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + r+" create credenziale");
					}
					
				}
				
				DriverRegistroServiziDB_LIB.logDebug("Aggiunte " + n + " credenziali al soggetto "+idSoggetto);
				
				
				// properties
				
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SOGGETTI_PROPS);
				sqlQueryObject.addWhereCondition("id_soggetto=?");
				updateQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(updateQuery);
				updateStmt.setLong(1, idSoggetto);
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n+" delete properties");
				
				n = 0;
				if(soggetto.sizeProprietaList()>0){
					for (int i = 0; i < soggetto.sizeProprietaList(); i++) {
						
						Proprieta proprieta = soggetto.getProprieta(i);
						
						sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
						sqlQueryObject.addInsertTable(CostantiDB.SOGGETTI_PROPS);
						sqlQueryObject.addInsertField("id_soggetto", "?");
						sqlQueryObject.addInsertField("nome", "?");
						sqlQueryObject.addInsertField("valore", "?");
						sqlQueryObject.addInsertField("enc_value", "?");
						updateQuery = sqlQueryObject.createSQLInsert();
						updateStmt = con.prepareStatement(updateQuery);
						
						int indexP = 1;
						updateStmt.setLong(indexP++, idSoggetto);
						updateStmt.setString(indexP++, proprieta.getNome());

						String plainValue = proprieta.getValore();
						String encValue = null;
						if(driverBYOK!=null && BYOKUtilities.isWrappedValue(plainValue) ) {
							BYOKWrappedValue byokValue = driverBYOK.wrap(plainValue);
							if(byokValue!=null) {
								encValue = byokValue.getWrappedValue();
								plainValue = byokValue.getWrappedPlainValue();
							}
						}
						
						updateStmt.setString(indexP++, plainValue);
						updateStmt.setString(indexP++, encValue);
						
						int r= updateStmt.executeUpdate();
						n++;
						updateStmt.close();
						DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + r+" create property ["+proprieta.getNome()+"]");
					}
				}
				
				DriverRegistroServiziDB_LIB.logDebug("Aggiunti " + n + " proprietà al soggetto "+idSoggetto);
				
				
				// ProtocolProperties
				DriverRegistroServiziDB_LIB.CRUDProtocolProperty(CostantiDB.UPDATE, soggetto.getProtocolPropertyList(), 
						idSoggetto, ProprietariProtocolProperty.SOGGETTO, con, tipoDatabase, driverBYOK);
				
				
				break;

			case DELETE:
								
				// DELETE

				idSoggetto = DBUtils.getIdSoggetto(nome, tipo, con, DriverRegistroServiziDB_LIB.tipoDB);
				idConnettore = DriverRegistroServiziDB_LIB.getIdConnettoreSoggetto(nome, tipo, con);
				if (idSoggetto <= 0)
					throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDSoggetto(DELETE)] Id Soggetto non valido.");
				
				// ProtocolProperties
				DriverRegistroServiziDB_LIB.CRUDProtocolProperty(CostantiDB.DELETE, null, 
						idSoggetto, ProprietariProtocolProperty.SOGGETTO, con, tipoDatabase, driverBYOK);
				
				// elimino le proprieta' del soggetto
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SOGGETTI_PROPS);
				sqlQueryObject.addWhereCondition("id_soggetto=?");
				updateQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(updateQuery);
				updateStmt.setLong(1, idSoggetto);
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n+" delete properties");
				
				// elimino le credenziali del soggetto
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SOGGETTI_CREDENZIALI);
				sqlQueryObject.addWhereCondition("id_soggetto=?");
				updateQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(updateQuery);
				updateStmt.setLong(1, idSoggetto);
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n+" delete credentials");
				
				// elimino i ruoli del soggetto
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SOGGETTI_RUOLI);
				sqlQueryObject.addWhereCondition("id_soggetto=?");
				updateQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(updateQuery);
				updateStmt.setLong(1, idSoggetto);
				n = updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n+" delete roles");
				
				// elimino il soggetto
				sqlQueryObject = SQLObjectFactory.createSQLQueryObject(DriverRegistroServiziDB_LIB.tipoDB);
				sqlQueryObject.addDeleteTable(CostantiDB.SOGGETTI);
				sqlQueryObject.addWhereCondition("id=?");
				String sqlQuery = sqlQueryObject.createSQLDelete();
				updateStmt = con.prepareStatement(sqlQuery);
				updateStmt.setLong(1, idSoggetto);
				n=updateStmt.executeUpdate();
				updateStmt.close();
				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto type = " + type + " row affected =" + n);

				// elimino il connettore
				connettore=new Connettore();
				connettore.setId(idConnettore);
				DriverRegistroServiziDB_connettoriLIB.CRUDConnettore(3, connettore, con, driverBYOK);

				DriverRegistroServiziDB_LIB.logDebug("CRUDSoggetto DELETE : \n" + DriverRegistroServiziDB_LIB.formatSQLString(updateQuery, idSoggetto));

				break;
			}

			if (type == CostantiDB.CREATE) {
				return idSoggetto;
			} else {
				return n;
			}

		} catch (CoreException e) {
			throw new DriverRegistroServiziException(e);
		} catch (SQLException se) {
			throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDSoggetto] SQLException [" + se.getMessage() + "].",se);
		}catch (Exception se) {
			throw new DriverRegistroServiziException("[DriverRegistroServiziDB_LIB::CRUDSoggetto] Exception [" + se.getMessage() + "].",se);
		} finally {
			JDBCUtilities.closeResources(updateStmt);
			JDBCUtilities.closeResources(selectRS, selectStmt);
		}

	}

	
}