RegistroServiziManager.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.protocol.registry;

import java.io.Serializable;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDAccordoAzione;
import org.openspcoop2.core.id.IDAccordoCooperazione;
import org.openspcoop2.core.id.IDFruizione;
import org.openspcoop2.core.id.IDPortType;
import org.openspcoop2.core.id.IDPortTypeAzione;
import org.openspcoop2.core.id.IDResource;
import org.openspcoop2.core.id.IDRuolo;
import org.openspcoop2.core.id.IDScope;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoCooperazione;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Documento;
import org.openspcoop2.core.registry.PortaDominio;
import org.openspcoop2.core.registry.Ruolo;
import org.openspcoop2.core.registry.Scope;
import org.openspcoop2.core.registry.Soggetto;
import org.openspcoop2.core.registry.constants.TipiDocumentoLivelloServizio;
import org.openspcoop2.core.registry.constants.TipiDocumentoSemiformale;
import org.openspcoop2.core.registry.constants.TipiDocumentoSicurezza;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziAzioneNotFound;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziCorrelatoNotFound;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziPortTypeNotFound;
import org.openspcoop2.core.registry.driver.DriverRegistroServiziServizioNotFound;
import org.openspcoop2.core.registry.driver.FiltroRicerca;
import org.openspcoop2.core.registry.driver.FiltroRicercaAccordi;
import org.openspcoop2.core.registry.driver.FiltroRicercaAzioni;
import org.openspcoop2.core.registry.driver.FiltroRicercaFruizioniServizio;
import org.openspcoop2.core.registry.driver.FiltroRicercaOperations;
import org.openspcoop2.core.registry.driver.FiltroRicercaPortTypes;
import org.openspcoop2.core.registry.driver.FiltroRicercaResources;
import org.openspcoop2.core.registry.driver.FiltroRicercaRuoli;
import org.openspcoop2.core.registry.driver.FiltroRicercaScope;
import org.openspcoop2.core.registry.driver.FiltroRicercaServizi;
import org.openspcoop2.core.registry.driver.FiltroRicercaSoggetti;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.Servizio;
import org.openspcoop2.protocol.sdk.constants.InformationApiSource;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.protocol.sdk.state.StateMessage;
import org.openspcoop2.utils.certificate.CertificateInfo;
import org.openspcoop2.utils.crypt.CryptConfig;
import org.openspcoop2.utils.transport.http.IBYOKUnwrapFactory;
import org.slf4j.Logger;

/**
 * RegistroServiziManager
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class RegistroServiziManager {

	private static RegistroServiziManager staticInstanceWithoutState = null;
	private static synchronized void initStaticInstanceWithoutState(){
		if(staticInstanceWithoutState == null) {
			staticInstanceWithoutState = new RegistroServiziManager();
			staticInstanceWithoutState.singleInstance = true;
		}
	}

	public static RegistroServiziManager getInstance(){
		//return new RegistroServiziManager();
		if(staticInstanceWithoutState == null) {
			if(RegistroServiziReader.getInstance()==null) {
				return new RegistroServiziManager(); // succede all'avvio
			}
			initStaticInstanceWithoutState();
		}
		return staticInstanceWithoutState;
	}
	public static RegistroServiziManager getInstance(IState state){
		if(state!=null && state instanceof StateMessage) {
			return getInstance((StateMessage)state);
		}
		return getInstance();
	}
	public static RegistroServiziManager getInstance(StateMessage state){
		if(state!=null) {
			return new RegistroServiziManager(state);
		}
		return getInstance();
	}
	public static RegistroServiziManager getInstance(IState requestStateParam, IState responseStateParam){
		StateMessage requestState = null;
		StateMessage responseState = null;
		if(requestStateParam!=null && requestStateParam instanceof StateMessage) {
			requestState = (StateMessage) requestStateParam;
		}
		if(responseStateParam!=null && responseStateParam instanceof StateMessage) {
			responseState = (StateMessage) responseStateParam;
		}
		if(requestState!=null || responseState!=null) {
			return new RegistroServiziManager(requestState,responseState);
		}
		return getInstance();
	}
	public static RegistroServiziManager getInstance(StateMessage requestState, StateMessage responseState){
		if(requestState!=null || responseState!=null) {
			return new RegistroServiziManager(requestState,responseState);
		}
		return getInstance();
	}


	private boolean singleInstance = false;
	private RegistroServiziReader registroServiziReader = null;
	private StateMessage state = null;
	private StateMessage responseState = null;

	public StateMessage getState() {
		return this.state;
	}
	public StateMessage getResponseState() {
		return this.responseState;
	}
	
	public RegistroServiziManager(){
		this.registroServiziReader = RegistroServiziReader.getInstance();	
	}
	public RegistroServiziManager(StateMessage state){
		this();
		this.state = state;
	}
	public RegistroServiziManager(StateMessage requestState, StateMessage responseState){
		this();
		this.state = requestState;
		this.responseState = responseState;
	}
	
	public RegistroServiziManager refreshState(IState requestStateParam, IState responseStateParam) {
		StateMessage requestState = null;
		StateMessage responseState = null;
		if(requestStateParam!=null && requestStateParam instanceof StateMessage) {
			requestState = (StateMessage) requestStateParam;
		}
		if(responseStateParam!=null && responseStateParam instanceof StateMessage) {
			responseState = (StateMessage) responseStateParam;
		}
		return refreshState(requestState, responseState);
	}
	public RegistroServiziManager refreshState(StateMessage requestState, StateMessage responseState) {
		if(requestState==null && responseState==null) {
			return getInstance(); // senza stato
		}
		if(this.singleInstance) {
			return RegistroServiziManager.getInstance(requestState, responseState); // inizialmente era senza stato, ora serve
		}
		this.state = requestState;
		this.responseState = responseState;
		return this;
	}
	
	private Connection getConnection() {
		if(this.state!=null) {
			Connection c = StateMessage.getConnection(this.state);
			if(c!=null) {
				return c;
			}
		}
		if(this.responseState!=null) {
			Connection c = StateMessage.getConnection(this.responseState);
			if(c!=null) {
				return c;
			}
		}
		return null;
	}
	

	/* ********  READER  ******** */
	
	public RegistroServiziReader getRegistroServiziReader(){
		return this.registroServiziReader;
	}
	
	
	/* ********  U T I L S  ******** */ 
	
	public void isAlive(boolean controlloTotale) throws CoreException{
		this.registroServiziReader.isAlive(controlloTotale);
	}
	
	public void validazioneSemantica(boolean controlloTotale,boolean verificaURI, 
			String[] tipiSoggettiValidi,String [] tipiServiziSoapValidi, String [] tipiServiziRestValidi, String[] tipiConnettoriValidi,
			boolean validazioneSemanticaAbilitataXML,boolean validazioneSemanticaAbilitataAltriRegistri,
			Logger logConsole) throws CoreException{
		this.registroServiziReader.validazioneSemantica(controlloTotale, verificaURI, tipiSoggettiValidi, tipiServiziSoapValidi, tipiServiziRestValidi,
				tipiConnettoriValidi, validazioneSemanticaAbilitataXML, validazioneSemanticaAbilitataAltriRegistri, logConsole);
	}
	
	public void setValidazioneSemanticaModificaRegistroServiziXML(boolean verificaURI, 
			String[] tipiSoggettiValidi,String [] tipiServiziSoapValidi, String [] tipiServiziRestValidi, String[] tipiConnettoriValidi) throws CoreException{
		this.registroServiziReader.setValidazioneSemanticaModificaRegistroServiziXML(verificaURI, tipiSoggettiValidi, tipiServiziSoapValidi, tipiServiziRestValidi, tipiConnettoriValidi);
	}
	
	public void verificaConsistenzaRegistroServizi() throws DriverRegistroServiziException {
		this.registroServiziReader.verificaConsistenzaRegistroServizi();
	}
		
	
	/* ********  P R O F I L O   D I   G E S T I O N E  ******** */ 
	
	public String getProfiloGestioneFruizioneServizio(IDServizio idServizio,String nomeRegistro, RequestInfo requestInfo) 
		throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idServizio!=null && idServizio.equals(requestInfo.getRequestConfig().getIdServizio(), false);
		if(useRequestInfo) {
			if(requestInfo.getRequestConfig().getServizioVersioneProtocollo()!=null) {
				return requestInfo.getRequestConfig().getServizioVersioneProtocollo();
			}
		}
		String v = this.registroServiziReader.getProfiloGestioneFruizioneServizio(this.getConnection(), idServizio, nomeRegistro, requestInfo);
		if(useRequestInfo) {
			if(requestInfo.getRequestConfig().getServizioVersioneProtocollo()==null) {
				requestInfo.getRequestConfig().setServizioVersioneProtocollo(v);
			}
		}
		return v;
	}
	
	public String getProfiloGestioneErogazioneServizio(IDSoggetto idFruitore,IDServizio idServizio,String nomeRegistro, RequestInfo requestInfo) 
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		// accendendo all'implementazione sottostante si puo' vedere come il parametro idServizio non viene usato
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idFruitore!=null;
		boolean useRequestInfoSoggettoFruitore = false;
		boolean useRequestInfoSoggettoErogatore = false;
		if(useRequestInfo) {
			useRequestInfoSoggettoFruitore = useRequestInfo && requestInfo.getRequestConfig().getIdFruitore()!=null && 
					requestInfo.getRequestConfig().getIdFruitore().equals(idFruitore);
			if(useRequestInfoSoggettoFruitore) {
				if(requestInfo.getRequestConfig().getSoggettoFruitoreVersioneProtocollo()!=null) {
					return requestInfo.getRequestConfig().getSoggettoFruitoreVersioneProtocollo();
				}
			}
			else {
				useRequestInfoSoggettoErogatore = useRequestInfo && requestInfo.getRequestConfig().getIdServizio()!=null && 
					requestInfo.getRequestConfig().getIdServizio().getSoggettoErogatore()!=null &&
					requestInfo.getRequestConfig().getIdServizio().getSoggettoErogatore().equals(idFruitore);
				if(useRequestInfoSoggettoErogatore) {
					if(requestInfo.getRequestConfig().getSoggettoErogatoreVersioneProtocollo()!=null) {
						return requestInfo.getRequestConfig().getSoggettoErogatoreVersioneProtocollo();
					}
				}
			}
		}
		String v = this.registroServiziReader.getProfiloGestioneErogazioneServizio(this.getConnection(), idFruitore, idServizio, nomeRegistro, requestInfo);
		if(useRequestInfoSoggettoFruitore) {
			if(requestInfo.getRequestConfig().getSoggettoFruitoreVersioneProtocollo()==null) {
				requestInfo.getRequestConfig().setSoggettoFruitoreVersioneProtocollo(v);
			}
		}
		else if(useRequestInfoSoggettoErogatore) {
			if(requestInfo.getRequestConfig().getSoggettoErogatoreVersioneProtocollo()==null) {
				requestInfo.getRequestConfig().setSoggettoErogatoreVersioneProtocollo(v);
			}
		}
		return v;
	}
	
	public String getProfiloGestioneSoggetto(IDSoggetto idSoggetto,String nomeRegistro, RequestInfo requestInfo) 
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idSoggetto!=null;
		boolean useRequestInfoSoggettoFruitore = false;
		boolean useRequestInfoSoggettoErogatore = false;
		if(useRequestInfo) {
			useRequestInfoSoggettoFruitore = useRequestInfo && requestInfo.getRequestConfig().getIdFruitore()!=null && 
					requestInfo.getRequestConfig().getIdFruitore().equals(idSoggetto);
			if(useRequestInfoSoggettoFruitore) {
				if(requestInfo.getRequestConfig().getSoggettoFruitoreVersioneProtocollo()!=null) {
					return requestInfo.getRequestConfig().getSoggettoFruitoreVersioneProtocollo();
				}
			}
			else {
				useRequestInfoSoggettoErogatore = useRequestInfo && requestInfo.getRequestConfig().getIdServizio()!=null && 
					requestInfo.getRequestConfig().getIdServizio().getSoggettoErogatore()!=null &&
					requestInfo.getRequestConfig().getIdServizio().getSoggettoErogatore().equals(idSoggetto);
				if(useRequestInfoSoggettoErogatore) {
					if(requestInfo.getRequestConfig().getSoggettoErogatoreVersioneProtocollo()!=null) {
						return requestInfo.getRequestConfig().getSoggettoErogatoreVersioneProtocollo();
					}
				}
			}
		}
		String v = this.registroServiziReader.getProfiloGestioneSoggetto(this.getConnection(), idSoggetto, nomeRegistro, requestInfo);
		if(useRequestInfoSoggettoFruitore) {
			if(requestInfo.getRequestConfig().getSoggettoFruitoreVersioneProtocollo()==null) {
				requestInfo.getRequestConfig().setSoggettoFruitoreVersioneProtocollo(v);
			}
		}
		else if(useRequestInfoSoggettoErogatore) {
			if(requestInfo.getRequestConfig().getSoggettoErogatoreVersioneProtocollo()==null) {
				requestInfo.getRequestConfig().setSoggettoErogatoreVersioneProtocollo(v);
			}
		}
		return v;
	}
	
	
	/* ********  R I C E R C A   I N F O     S E R V I Z I  ******** */ 
	
	public Servizio getInfoServizio(IDSoggetto idSoggetto, IDServizio idService,String nomeRegistro, boolean verificaEsistenzaServizioAzioneCorrelato, boolean throwAzioneNotFound,
			RequestInfo requestInfo)
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound,DriverRegistroServiziAzioneNotFound,DriverRegistroServiziPortTypeNotFound,DriverRegistroServiziCorrelatoNotFound{
		if(requestInfo!=null && requestInfo.getRequestConfig()!=null && idService!=null && requestInfo.getRequestConfig().getInfoServizio()!=null) {
			if(requestInfo.getRequestConfig().getInfoServizio().getIDServizio().equals(idService)) {
				return requestInfo.getRequestConfig().getInfoServizio();
			}
		}
		Servizio s = this.registroServiziReader.getInfoServizio(this.getConnection(), idSoggetto, idService, nomeRegistro, verificaEsistenzaServizioAzioneCorrelato, throwAzioneNotFound);
		if(requestInfo!=null && requestInfo.getRequestConfig()!=null && requestInfo.getRequestConfig().getInfoServizio()==null) {
			requestInfo.getRequestConfig().setInfoServizio(s);
		}
		return s;
	}
	
	public Servizio getInfoServizioCorrelato(IDSoggetto idSoggetto,IDServizio idService,String nomeRegistro, boolean throwAzioneNotFound,
			RequestInfo requestInfo) 
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound,DriverRegistroServiziAzioneNotFound,DriverRegistroServiziPortTypeNotFound,DriverRegistroServiziCorrelatoNotFound{
		if(requestInfo!=null && requestInfo.getRequestConfig()!=null && idService!=null && requestInfo.getRequestConfig().getInfoServizioCorrelato()!=null) {
			if(requestInfo.getRequestConfig().getInfoServizioCorrelato().getIDServizio().equals(idService)) {
				return requestInfo.getRequestConfig().getInfoServizioCorrelato();
			}
		}
		Servizio s = this.registroServiziReader.getInfoServizioCorrelato(this.getConnection(), idSoggetto, idService, nomeRegistro, throwAzioneNotFound);
		if(requestInfo!=null && requestInfo.getRequestConfig()!=null && requestInfo.getRequestConfig().getInfoServizioCorrelato()==null) {
			requestInfo.getRequestConfig().setInfoServizioCorrelato(s);
		}
		return s;
	}
	
	public Servizio getInfoServizioAzioneCorrelata(IDSoggetto idSoggetto,IDServizio idService,String nomeRegistro, boolean throwAzioneNotFound,
			RequestInfo requestInfo) 
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound,DriverRegistroServiziAzioneNotFound,DriverRegistroServiziPortTypeNotFound,DriverRegistroServiziCorrelatoNotFound{
		if(requestInfo!=null && requestInfo.getRequestConfig()!=null && idService!=null && requestInfo.getRequestConfig().getInfoServizioAzioneCorrelata()!=null) {
			if(requestInfo.getRequestConfig().getInfoServizioAzioneCorrelata().getIDServizio().equals(idService)) {
				return requestInfo.getRequestConfig().getInfoServizioAzioneCorrelata();
			}
		}
		Servizio s = this.registroServiziReader.getInfoServizioAzioneCorrelata(this.getConnection(), idSoggetto, idService, nomeRegistro, throwAzioneNotFound);
		if(requestInfo!=null && requestInfo.getRequestConfig()!=null && requestInfo.getRequestConfig().getInfoServizioAzioneCorrelata()==null) {
			requestInfo.getRequestConfig().setInfoServizioAzioneCorrelata(s);
		}
		return s;
	}
	
	public Allegati getAllegati(IDServizio idASPS)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllegati(this.getConnection(), idASPS);
	}
	
	public Documento getAllegato(IDAccordo idAccordo, String nome, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllegato(this.getConnection(), idAccordo, nome, requestInfo);
	}
	public Documento getSpecificaSemiformale(IDAccordo idAccordo, TipiDocumentoSemiformale tipo, String nome, RequestInfo requestInfo)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSpecificaSemiformale(this.getConnection(), idAccordo, tipo, nome, requestInfo);
	}
	
	public Documento getAllegato(IDServizio idASPS, String nome, RequestInfo requestInfo)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllegato(this.getConnection(), idASPS, nome, requestInfo);
	}
	public Documento getSpecificaSemiformale(IDServizio idASPS, TipiDocumentoSemiformale tipo, String nome, RequestInfo requestInfo)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSpecificaSemiformale(this.getConnection(), idASPS, tipo, nome, requestInfo);
	}
	public Documento getSpecificaSicurezza(IDServizio idASPS, TipiDocumentoSicurezza tipo, String nome, RequestInfo requestInfo)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSpecificaSicurezza(this.getConnection(), idASPS, tipo, nome, requestInfo);
	}
	public Documento getSpecificaLivelloServizio(IDServizio idASPS, TipiDocumentoLivelloServizio tipo, String nome, RequestInfo requestInfo)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSpecificaLivelloServizio(this.getConnection(), idASPS, tipo, nome, requestInfo);
	}
	
	public org.openspcoop2.core.registry.wsdl.AccordoServizioWrapper getWsdlAccordoServizio(IDServizio idService,InformationApiSource infoWsdlSource,boolean buildSchemaXSD, boolean readDatiRegistro, RequestInfo requestInfo)
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idService!=null && infoWsdlSource!=null;
		if(useRequestInfo) {
			org.openspcoop2.core.registry.wsdl.AccordoServizioWrapper w = requestInfo.getRequestConfig().getAsWrapperSoap(infoWsdlSource, buildSchemaXSD, readDatiRegistro);
			if(w!=null) {
				return w;
			}
		}
		org.openspcoop2.core.registry.wsdl.AccordoServizioWrapper w = this.registroServiziReader.getWsdlAccordoServizio(this.getConnection(), idService, infoWsdlSource,buildSchemaXSD, readDatiRegistro);
		if(useRequestInfo && requestInfo!=null && requestInfo.getRequestConfig().getAsWrapperSoap(infoWsdlSource, buildSchemaXSD, readDatiRegistro)==null) {
			requestInfo.getRequestConfig().setAsWrapperSoap(w, infoWsdlSource, buildSchemaXSD, readDatiRegistro,
					requestInfo.getIdTransazione());
		}
		return w;
	}
	
	public org.openspcoop2.core.registry.rest.AccordoServizioWrapper getRestAccordoServizio(IDServizio idService,InformationApiSource infoWsdlSource,boolean buildSchemaXSD, boolean processIncludeForOpenApi, boolean readDatiRegistro, RequestInfo requestInfo)
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idService!=null && infoWsdlSource!=null;
		if(useRequestInfo) {
			org.openspcoop2.core.registry.rest.AccordoServizioWrapper w = requestInfo.getRequestConfig().getAsWrapperRest(infoWsdlSource, buildSchemaXSD, processIncludeForOpenApi, readDatiRegistro);
			if(w!=null) {
				return w;
			}
		}
		org.openspcoop2.core.registry.rest.AccordoServizioWrapper w = this.registroServiziReader.getRestAccordoServizio(this.getConnection(), idService, infoWsdlSource,buildSchemaXSD, processIncludeForOpenApi, readDatiRegistro);
		if(useRequestInfo && requestInfo!=null && requestInfo.getRequestConfig().getAsWrapperRest(infoWsdlSource, buildSchemaXSD, processIncludeForOpenApi, readDatiRegistro)==null) {
			requestInfo.getRequestConfig().setAsWrapperRest(w, infoWsdlSource, buildSchemaXSD, processIncludeForOpenApi, readDatiRegistro,
					requestInfo.getIdTransazione());
		}
		return w;
	}
	
	public org.openspcoop2.core.registry.constants.ServiceBinding getServiceBinding(IDServizio idService, RequestInfo requestInfo)
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idService!=null;
		if(useRequestInfo) {
			if( requestInfo.getRequestConfig().getServiceBinding()!=null) {
				return requestInfo.getRequestConfig().getServiceBinding();
			}
		}
		org.openspcoop2.core.registry.constants.ServiceBinding serviceBinding = this.registroServiziReader.getServiceBinding(this.getConnection(), idService);
		if(useRequestInfo && requestInfo.getRequestConfig().getServiceBinding()==null) {
			requestInfo.getRequestConfig().setServiceBinding(serviceBinding);
		}
		return serviceBinding;
	}
	
	public EsitoAutorizzazioneRegistro isFruitoreServizioAutorizzato(String pdd,String servizioApplicativo,IDSoggetto soggetto,IDServizio servizio)
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound, DriverRegistroServiziServizioNotFound{
		return this.registroServiziReader.isFruitoreServizioAutorizzato(this.getConnection(), pdd, servizioApplicativo, soggetto, servizio);
	}
	
	
	/* ********  C O N N E T T O R I  ******** */ 

	public org.openspcoop2.core.config.Connettore getConnettore(IDSoggetto idSoggetto,IDServizio idService,String nomeRegistro, RequestInfo requestInfo) 
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idSoggetto!=null && idService!=null &&
				requestInfo.getRequestConfig().getIdFruitore()!=null && idSoggetto.equals(requestInfo.getRequestConfig().getIdFruitore()) &&
				requestInfo.getRequestConfig().getIdServizio()!=null && idService.equals(requestInfo.getRequestConfig().getIdServizio(),false);
		if(useRequestInfo) {
			if(requestInfo.getRequestConfig().getConnettoreFrutoreServizio()!=null) {
				return requestInfo.getRequestConfig().getConnettoreFrutoreServizio();
			}
		}
		org.openspcoop2.core.config.Connettore c = this.registroServiziReader.getConnettore(this.getConnection(), idSoggetto, idService, nomeRegistro);
		if(useRequestInfo) {
			if(requestInfo.getRequestConfig().getConnettoreFrutoreServizio()==null) {
				requestInfo.getRequestConfig().setConnettoreFrutoreServizio(c);
			}
		}
		return c;
	}
	
	public org.openspcoop2.core.config.Connettore getConnettore(IDSoggetto idSoggetto,String nomeRegistro, RequestInfo requestInfo) 
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idSoggetto!=null &&
				requestInfo.getRequestConfig().getIdServizio()!=null &&  
				requestInfo.getRequestConfig().getIdServizio().getSoggettoErogatore()!=null &&  
				requestInfo.getRequestConfig().getIdServizio().getSoggettoErogatore().equals(idSoggetto);
		if(useRequestInfo) {
			if(requestInfo.getRequestConfig().getConnettoreSoggettoErogatore()!=null) {
				return requestInfo.getRequestConfig().getConnettoreSoggettoErogatore();
			}
		}
		org.openspcoop2.core.config.Connettore c = this.registroServiziReader.getConnettore(this.getConnection(), idSoggetto, nomeRegistro);
		if(useRequestInfo) {
			if(requestInfo.getRequestConfig().getConnettoreSoggettoErogatore()==null) {
				requestInfo.getRequestConfig().setConnettoreSoggettoErogatore(c);
			}
		}
		return c;
	}
	
	
	/* ********  VALIDAZIONE  ******** */ 

	public String getDominio(IDSoggetto idSoggetto,String nomeRegistro,IProtocolFactory<?> protocolFactory, RequestInfo requestInfo) 
			throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idSoggetto!=null;
		if(useRequestInfo) {
			if( requestInfo.getRequestConfig().getSoggettoErogatoreConfig()!=null && requestInfo.getRequestConfig().getSoggettoErogatoreIdentificativoPorta()!=null &&
				idSoggetto.getTipo().equals(requestInfo.getRequestConfig().getSoggettoErogatoreConfig().getTipo()) &&
					idSoggetto.getNome().equals(requestInfo.getRequestConfig().getSoggettoErogatoreConfig().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoErogatoreIdentificativoPorta();
			}
			else if( requestInfo.getRequestConfig().getSoggettoFruitoreConfig()!=null && requestInfo.getRequestConfig().getSoggettoFruitoreIdentificativoPorta()!=null &&
				idSoggetto.getTipo().equals(requestInfo.getRequestConfig().getSoggettoFruitoreConfig().getTipo()) &&
					idSoggetto.getNome().equals(requestInfo.getRequestConfig().getSoggettoFruitoreConfig().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoFruitoreIdentificativoPorta();
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo()!=null) {
			if(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig()!=null && 
					requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreIdentificativoPorta()!=null &&
					idSoggetto.getTipo().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig().getTipo()) && 
					idSoggetto.getNome().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig().getNome())) {
				return requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreIdentificativoPorta();
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo()!=null) {
			if(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig()!=null && 
					requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreIdentificativoPorta()!=null &&
					idSoggetto.getTipo().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig().getTipo()) && 
					idSoggetto.getNome().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig().getNome())) {
				return requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreIdentificativoPorta();
			}
		}
		return this.registroServiziReader.getDominio(this.getConnection(), idSoggetto, nomeRegistro, protocolFactory);
		// il set viene effettuato nei service utils per comprendere se si tratta di fruitore o erogatore
	}
	
	public String getImplementazionePdD(IDSoggetto idSoggetto,String nomeRegistro, RequestInfo requestInfo) 
			throws DriverRegistroServiziException{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idSoggetto!=null;
		if(useRequestInfo) {
			if( requestInfo.getRequestConfig().getSoggettoErogatoreConfig()!=null && requestInfo.getRequestConfig().getSoggettoErogatoreImplementazionePdd()!=null &&
				idSoggetto.getTipo().equals(requestInfo.getRequestConfig().getSoggettoErogatoreConfig().getTipo()) &&
					idSoggetto.getNome().equals(requestInfo.getRequestConfig().getSoggettoErogatoreConfig().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoErogatoreImplementazionePdd();
			}
			else if( requestInfo.getRequestConfig().getSoggettoFruitoreConfig()!=null && requestInfo.getRequestConfig().getSoggettoFruitoreImplementazionePdd()!=null && 
				idSoggetto.getTipo().equals(requestInfo.getRequestConfig().getSoggettoFruitoreConfig().getTipo()) &&
					idSoggetto.getNome().equals(requestInfo.getRequestConfig().getSoggettoFruitoreConfig().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoFruitoreImplementazionePdd();
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo()!=null) {
			if(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig()!=null && 
					requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreImplementazionePdd()!=null &&
					idSoggetto.getTipo().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig().getTipo()) && 
					idSoggetto.getNome().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig().getNome())) {
				return requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreImplementazionePdd();
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo()!=null) {
			if(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig()!=null && 
					requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreImplementazionePdd()!=null &&
					idSoggetto.getTipo().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig().getTipo()) && 
					idSoggetto.getNome().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig().getNome())) {
				return requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreImplementazionePdd();
			}
		}
		return this.registroServiziReader.getImplementazionePdD(this.getConnection(), idSoggetto, nomeRegistro);
		// il set viene effettuato nei service utils per comprendere se si tratta di fruitore o erogatore
	}
	
	public String getIdPortaDominio(IDSoggetto idSoggetto,String nomeRegistro, RequestInfo requestInfo) 
			throws DriverRegistroServiziException{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idSoggetto!=null;
		if(useRequestInfo) {
			if( requestInfo.getRequestConfig().getSoggettoErogatoreConfig()!=null && requestInfo.getRequestConfig().getSoggettoErogatorePddReaded()!=null && 
				requestInfo.getRequestConfig().getSoggettoErogatorePddReaded() &&
				idSoggetto.getTipo().equals(requestInfo.getRequestConfig().getSoggettoErogatoreConfig().getTipo()) &&
					idSoggetto.getNome().equals(requestInfo.getRequestConfig().getSoggettoErogatoreConfig().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoErogatorePdd()!=null ? requestInfo.getRequestConfig().getSoggettoErogatorePdd().getNome() : null;
			}
			else if( requestInfo.getRequestConfig().getSoggettoFruitoreConfig()!=null && requestInfo.getRequestConfig().getSoggettoFruitorePddReaded()!=null && 
					requestInfo.getRequestConfig().getSoggettoFruitorePddReaded() && 
				idSoggetto.getTipo().equals(requestInfo.getRequestConfig().getSoggettoFruitoreConfig().getTipo()) &&
					idSoggetto.getNome().equals(requestInfo.getRequestConfig().getSoggettoFruitoreConfig().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoFruitorePdd()!=null ? requestInfo.getRequestConfig().getSoggettoFruitorePdd().getNome() : null;
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo()!=null) {
			if( requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig()!=null && 
					requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitorePddReaded()!=null && 
					requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitorePddReaded() &&
					idSoggetto.getTipo().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig().getTipo()) &&
						idSoggetto.getNome().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreConfig().getNome())	) {
					return requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitorePdd()!=null ? requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitorePdd().getNome() : null;
				}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo()!=null) {
			if( requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig()!=null && 
					requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitorePddReaded()!=null && 
					requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitorePddReaded() &&
					idSoggetto.getTipo().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig().getTipo()) &&
						idSoggetto.getNome().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreConfig().getNome())	) {
					return requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitorePdd()!=null ? requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitorePdd().getNome() : null;
				}
		}
		return this.registroServiziReader.getIdPortaDominio(this.getConnection(), idSoggetto, nomeRegistro);
		// il set viene effettuato nei service utils per comprendere se si tratta di fruitore o erogatore
	}
	
	public RisultatoValidazione validaServizio(IDSoggetto soggettoFruitore,IDServizio idService,String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziPortTypeNotFound{
		return this.registroServiziReader.validaServizio(this.getConnection(), soggettoFruitore, idService, nomeRegistro);
	}
	
	
	/* ********  A U T E N T I C A Z I O N E   S O G G E T T I  ******** */ 
	
	public Soggetto getSoggettoByCredenzialiBasic(String username, String password, CryptConfig cryptConfig, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSoggettoByCredenzialiBasic(this.getConnection(), username, password, cryptConfig, nomeRegistro);
	}
	
	public Soggetto getSoggettoByCredenzialiApiKey(String username, String password, boolean appId, CryptConfig cryptConfig, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSoggettoByCredenzialiApiKey(this.getConnection(), username, password, appId, cryptConfig, nomeRegistro);
	}
	
	public Soggetto getSoggettoByCredenzialiSsl(String subject, String issuer, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSoggettoByCredenzialiSsl(this.getConnection(), subject, issuer, nomeRegistro);
	}
	
	public Soggetto getSoggettoByCredenzialiSsl(CertificateInfo certificate, boolean strictVerifier, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSoggettoByCredenzialiSsl(this.getConnection(), certificate, strictVerifier, nomeRegistro);
	}
	
	public Soggetto getSoggettoByCredenzialiPrincipal(String principal, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getSoggettoByCredenzialiPrincipal(this.getConnection(), principal, nomeRegistro);
	}
	
	public IDSoggetto getIdSoggettoByCredenzialiBasic(String username, String password, CryptConfig cryptConfig, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getIdSoggettoByCredenzialiBasic(this.getConnection(), username, password, cryptConfig, nomeRegistro);
	}
	
	public IDSoggetto getIdSoggettoByCredenzialiApiKey(String username, String password, boolean appId, CryptConfig cryptConfig, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getIdSoggettoByCredenzialiApiKey(this.getConnection(), username, password, appId, cryptConfig, nomeRegistro);
	}
	
	public IDSoggetto getIdSoggettoByCredenzialiSsl(String subject, String issuer, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getIdSoggettoByCredenzialiSsl(this.getConnection(), subject, issuer, nomeRegistro);
	}
	
	public IDSoggetto getIdSoggettoByCredenzialiSsl(CertificateInfo certificate, boolean strictVerifier, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getIdSoggettoByCredenzialiSsl(this.getConnection(), certificate, strictVerifier, nomeRegistro);
	}
	
	public IDSoggetto getIdSoggettoByCredenzialiPrincipal(String principal, String nomeRegistro)throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getIdSoggettoByCredenzialiPrincipal(this.getConnection(), principal, nomeRegistro);
	}
	
	
	
	/* ********  P R O P R I E T A  ******** */
	
	public Map<String, String> getProprietaConfigurazione(Soggetto soggetto) throws DriverRegistroServiziException {
		return this.registroServiziReader.getProprietaConfigurazione(soggetto);
	}
	
	
	
	/* ********  C E R T I F I C A T I  ******** */
	
	public CertificateCheck checkCertificatoSoggettoWithoutCache(long idSoggetto, int sogliaWarningGiorni,  
			boolean addCertificateDetails, String separator, String newLine) throws DriverRegistroServiziException,DriverRegistroServiziNotFound {
		return this.registroServiziReader.checkCertificatoSoggetto(null, false,
				idSoggetto, sogliaWarningGiorni,  
				addCertificateDetails, separator, newLine);
	}

	public CertificateCheck checkCertificatoSoggettoWithoutCache(IDSoggetto idSoggetto, int sogliaWarningGiorni, 
			boolean addCertificateDetails, String separator, String newLine) throws DriverRegistroServiziException,DriverRegistroServiziNotFound {
		return this.registroServiziReader.checkCertificatoSoggetto(null, false,
				idSoggetto, sogliaWarningGiorni,  
				addCertificateDetails, separator, newLine);
	}
	
	public CertificateCheck checkCertificatiConnettoreHttpsByIdWithoutCache(long idConnettore, int sogliaWarningGiorni, IBYOKUnwrapFactory byokUnwrapFactory,  
			boolean addCertificateDetails, String separator, String newLine) throws DriverRegistroServiziException,DriverRegistroServiziNotFound {
		return this.registroServiziReader.checkCertificatiConnettoreHttpsById(null, false,
				idConnettore, sogliaWarningGiorni, byokUnwrapFactory,
				addCertificateDetails, separator, newLine);
	}
	
	public CertificateCheck checkCertificatiModIErogazioneByIdWithoutCache(long idErogazione, int sogliaWarningGiorni, IBYOKUnwrapFactory byokUnwrapFactory,  
			boolean addCertificateDetails, String separator, String newLine) throws DriverRegistroServiziException,DriverRegistroServiziNotFound {
		return this.registroServiziReader.checkCertificatiModIErogazioneById(null, false,
				idErogazione, sogliaWarningGiorni, byokUnwrapFactory,  
				addCertificateDetails, separator, newLine);
	}
	
	public CertificateCheck checkCertificatiModIFruizioneByIdWithoutCache(long idFruizione, int sogliaWarningGiorni, IBYOKUnwrapFactory byokUnwrapFactory,
			boolean addCertificateDetails, String separator, String newLine) throws DriverRegistroServiziException,DriverRegistroServiziNotFound {
		return this.registroServiziReader.checkCertificatiModIFruizioneById(null, false,
				idFruizione, sogliaWarningGiorni, byokUnwrapFactory,  
				addCertificateDetails, separator, newLine);
	}
	
	
	
	/* ********  R I C E R C A  E L E M E N T I   P R I M I T I V I  ******** */
	
	public PortaDominio getPortaDominio(String nome,String nomeRegistro, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && nome!=null;
		if(useRequestInfo) {
			if( requestInfo.getRequestConfig().getSoggettoErogatorePdd()!=null &&
					nome.equals(requestInfo.getRequestConfig().getSoggettoErogatorePdd().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoErogatorePdd();
			}
			else if( requestInfo.getRequestConfig().getSoggettoFruitorePdd()!=null &&
					nome.equals(requestInfo.getRequestConfig().getSoggettoFruitorePdd().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoFruitorePdd();
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo()!=null) {
			if( requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitorePdd()!=null &&
					nome!=null && nome.equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitorePdd().getNome())	) {
				return requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitorePdd();
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo()!=null) {
			if( requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitorePdd()!=null &&
					nome!=null && nome.equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitorePdd().getNome())	) {
				return requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitorePdd();
			}
		}
		return this.registroServiziReader.getPortaDominio(this.getConnection(), nome, nomeRegistro);
		// il set viene effettuato nei service utils per comprendere se si tratta di fruitore o erogatore
	}

	public Ruolo getRuolo(String nome,String nomeRegistro, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && nome!=null;
		if(useRequestInfo) {
			Ruolo ruolo = requestInfo.getRequestConfig().getRuolo(nome);
			if(ruolo!=null) {
				return ruolo;
			}
		}
		Ruolo r = this.registroServiziReader.getRuolo(this.getConnection(), nome, nomeRegistro);
		if(useRequestInfo && requestInfo!=null) {
			requestInfo.getRequestConfig().addRuolo(nome, r, 
					requestInfo.getIdTransazione());
		}
		return r;
	}
	public Ruolo getRuolo(IDRuolo idRuolo,String nomeRegistro, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.getRuolo(idRuolo.getNome(), nomeRegistro, requestInfo);
	}
	
	public Scope getScope(String nome,String nomeRegistro, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && nome!=null;
		if(useRequestInfo) {
			Scope scope = requestInfo.getRequestConfig().getScope(nome);
			if(scope!=null) {
				return scope;
			}
		}
		Scope s = this.registroServiziReader.getScope(this.getConnection(), nome, nomeRegistro);
		if(useRequestInfo && requestInfo!=null) {
			requestInfo.getRequestConfig().addScope(nome, s, 
					requestInfo.getIdTransazione());
		}
		return s;
	}
	public Scope getScope(IDScope idScope,String nomeRegistro, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.getScope(idScope.getNome(), nomeRegistro, requestInfo);
	}

	public Soggetto getSoggetto(IDSoggetto idSoggetto,String nomeRegistro, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		Soggetto soggetto = _getSoggettoFromRequestInfo(idSoggetto, requestInfo);
		if(soggetto!=null) {
			return soggetto;
		}
		return this.registroServiziReader.getSoggetto(this.getConnection(), idSoggetto, nomeRegistro);
	}
	static Soggetto _getSoggettoFromRequestInfo(IDSoggetto idSoggetto, RequestInfo requestInfo) {
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idSoggetto!=null;
		if(useRequestInfo) {
			if( requestInfo.getRequestConfig().getSoggettoErogatoreRegistry()!=null &&
				idSoggetto.getTipo().equals(requestInfo.getRequestConfig().getSoggettoErogatoreRegistry().getTipo()) &&
					idSoggetto.getNome().equals(requestInfo.getRequestConfig().getSoggettoErogatoreRegistry().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoErogatoreRegistry();
			}
			else if( requestInfo.getRequestConfig().getSoggettoFruitoreRegistry()!=null &&
				idSoggetto.getTipo().equals(requestInfo.getRequestConfig().getSoggettoFruitoreRegistry().getTipo()) &&
					idSoggetto.getNome().equals(requestInfo.getRequestConfig().getSoggettoFruitoreRegistry().getNome())	) {
				return requestInfo.getRequestConfig().getSoggettoFruitoreRegistry();
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo()!=null) {
			if(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreRegistry()!=null && idSoggetto!=null && 
					idSoggetto.getTipo().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreRegistry().getTipo()) && 
					idSoggetto.getNome().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreRegistry().getNome())) {
				return requestInfo.getRequestThreadContext().getRequestFruitoreTrasportoInfo().getSoggettoFruitoreRegistry();
			}
		}
		if(requestInfo!=null && requestInfo.getRequestThreadContext()!=null && requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo()!=null) {
			if(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreRegistry()!=null && idSoggetto!=null && 
					idSoggetto.getTipo().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreRegistry().getTipo()) && 
					idSoggetto.getNome().equals(requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreRegistry().getNome())) {
				return requestInfo.getRequestThreadContext().getRequestFruitoreTokenInfo().getSoggettoFruitoreRegistry();
			}
		}
		return null;
	} 
	
	public AccordoServizioParteComune getAccordoServizioParteComune(IDAccordo idAccordo,String nomeRegistro,Boolean readContenutiAllegati,Boolean readDatiRegistro, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idAccordo!=null && 
				(readContenutiAllegati==null || readContenutiAllegati==false) &&
				(readDatiRegistro==null || readDatiRegistro==false);
		if(useRequestInfo) {
			if( requestInfo.getRequestConfig().getAspc()!=null) {
				IDAccordoFactory idAccordoFactory = IDAccordoFactory.getInstance();
				String uriAspc = idAccordoFactory.getUriFromAccordo(requestInfo.getRequestConfig().getAspc());
				String uriParam = idAccordoFactory.getUriFromIDAccordo(idAccordo);
				if(uriAspc.equals(uriParam)) {
					return requestInfo.getRequestConfig().getAspc();
				}
			}
		}
		AccordoServizioParteComune aspc = this.registroServiziReader.getAccordoServizioParteComune(this.getConnection(), idAccordo, readContenutiAllegati, readDatiRegistro, nomeRegistro);
		if(useRequestInfo && requestInfo.getRequestConfig().getAspc()==null) {
			requestInfo.getRequestConfig().setAspc(aspc);
		}
		return aspc;
	}
	
	public AccordoServizioParteSpecifica getAccordoServizioParteSpecifica(IDServizio idServizio,String nomeRegistro,Boolean readContenutiAllegati, RequestInfo requestInfo) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		boolean useRequestInfo = requestInfo!=null && requestInfo.getRequestConfig()!=null && idServizio!=null && 
				(readContenutiAllegati==null || readContenutiAllegati==false);
		if(useRequestInfo) {
			if( requestInfo.getRequestConfig().getAsps()!=null) {
				IDServizioFactory idServizioFactory = IDServizioFactory.getInstance();
				String uriAsps = idServizioFactory.getUriFromAccordo(requestInfo.getRequestConfig().getAsps());
				String uriParam = idServizioFactory.getUriFromIDServizio(idServizio);
				if(uriAsps.equals(uriParam)) {
					return requestInfo.getRequestConfig().getAsps();
				}
			}
		}
		AccordoServizioParteSpecifica asps = this.registroServiziReader.getAccordoServizioParteSpecifica(this.getConnection(), idServizio, readContenutiAllegati, nomeRegistro);
		if(useRequestInfo && requestInfo.getRequestConfig().getAsps()==null) {
			requestInfo.getRequestConfig().setAsps(asps);
		}
		return asps;
	}
	
	public AccordoCooperazione getAccordoCooperazione(IDAccordoCooperazione idAccordo,String nomeRegistro,Boolean readContenutiAllegati) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAccordoCooperazione(this.getConnection(), idAccordo, readContenutiAllegati, nomeRegistro);
	}

	
		
	/* ********  R I C E R C A  I D   E L E M E N T I   P R I M I T I V I  ******** */
	
	public List<String> getAllIdPorteDominio(FiltroRicerca filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException, DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdPorteDominio(this.getConnection(), filtroRicerca, nomeRegistro);
	}

	public List<IDRuolo> getAllIdRuoli(FiltroRicercaRuoli filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException, DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdRuoli(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDScope> getAllIdScope(FiltroRicercaScope filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException, DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdScope(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDSoggetto> getAllIdSoggetti(FiltroRicercaSoggetti filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException, DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdSoggetti(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDAccordoCooperazione> getAllIdAccordiCooperazione(FiltroRicercaAccordi filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException, DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdAccordiCooperazione(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDAccordo> getAllIdAccordiServizioParteComune(FiltroRicercaAccordi filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException, DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdAccordiServizioParteComune(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDPortType> getAllIdPortType(FiltroRicercaPortTypes filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdPortType(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDPortTypeAzione> getAllIdAzionePortType(FiltroRicercaOperations filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdAzionePortType(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDAccordoAzione> getAllIdAzioneAccordo(FiltroRicercaAzioni filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdAzioneAccordo(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDResource> getAllIdResource(FiltroRicercaResources filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdResource(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDServizio> getAllIdServizi(FiltroRicercaServizi filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException, DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdServizi(this.getConnection(), filtroRicerca, nomeRegistro);
	}
	
	public List<IDFruizione> getAllIdFruizioniServizio(FiltroRicercaFruizioniServizio filtroRicerca,String nomeRegistro) throws DriverRegistroServiziException, DriverRegistroServiziNotFound{
		return this.registroServiziReader.getAllIdFruizioniServizio(this.getConnection(), filtroRicerca, nomeRegistro);
	}

	
	
	/* ********  R E P O S I T O R Y    O G G E T T I   G E N E R I C I  ******** */
	
	public Serializable getGenericObject(String keyObject) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.getGenericObject(keyObject);
	}
	
	public Serializable pushGenericObject(String keyObject, Serializable object) throws DriverRegistroServiziException,DriverRegistroServiziNotFound{
		return this.registroServiziReader.pushGenericObject(keyObject, object);
	}

	
	
}