ClassNameProperties.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.pdd.config;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Properties;

import org.openspcoop2.core.config.constants.CostantiConfigurazione;
import org.openspcoop2.core.constants.TipiConnettore;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.pdd.core.autenticazione.pa.IAutenticazionePortaApplicativa;
import org.openspcoop2.pdd.core.autenticazione.pd.IAutenticazionePortaDelegata;
import org.openspcoop2.pdd.core.autorizzazione.container.IAutorizzazioneSecurityContainer;
import org.openspcoop2.pdd.core.autorizzazione.pa.IAutorizzazioneContenutoPortaApplicativa;
import org.openspcoop2.pdd.core.autorizzazione.pa.IAutorizzazionePortaApplicativa;
import org.openspcoop2.pdd.core.autorizzazione.pd.IAutorizzazioneContenutoPortaDelegata;
import org.openspcoop2.pdd.core.autorizzazione.pd.IAutorizzazionePortaDelegata;
import org.openspcoop2.pdd.core.behaviour.IBehaviour;
import org.openspcoop2.pdd.core.connettori.IConnettore;
import org.openspcoop2.pdd.core.controllo_traffico.plugins.IRateLimiting;
import org.openspcoop2.pdd.core.credenziali.IGestoreCredenziali;
import org.openspcoop2.pdd.core.credenziali.IGestoreCredenzialiIM;
import org.openspcoop2.pdd.core.handlers.notifier.INotifierCallback;
import org.openspcoop2.pdd.core.handlers.transazioni.ISalvataggioDiagnosticiManager;
import org.openspcoop2.pdd.core.handlers.transazioni.ISalvataggioTracceManager;
import org.openspcoop2.pdd.core.integrazione.IGestoreIntegrazionePA;
import org.openspcoop2.pdd.core.integrazione.IGestoreIntegrazionePD;
import org.openspcoop2.pdd.core.node.INodeReceiver;
import org.openspcoop2.pdd.core.node.INodeSender;
import org.openspcoop2.pdd.core.threshold.IThreshold;
import org.openspcoop2.pdd.core.token.attribute_authority.IRetrieveAttributeAuthorityResponseParser;
import org.openspcoop2.pdd.core.token.parser.INegoziazioneTokenParser;
import org.openspcoop2.pdd.core.token.parser.ITokenParser;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.pdd.services.OpenSPCoop2Startup;
import org.openspcoop2.protocol.engine.driver.IFiltroDuplicati;
import org.openspcoop2.protocol.engine.driver.repository.IGestoreRepository;
import org.openspcoop2.protocol.sdk.diagnostica.IDiagnosticProducer;
import org.openspcoop2.protocol.sdk.dump.IDumpProducer;
import org.openspcoop2.protocol.sdk.tracciamento.ITracciaProducer;
import org.openspcoop2.security.message.MessageSecurityContext;
import org.openspcoop2.security.message.MessageSecurityDigestReader;
import org.openspcoop2.utils.LoggerWrapperFactory;
import org.openspcoop2.utils.TipiDatabase;
import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.date.IDate;
import org.openspcoop2.utils.id.IUniqueIdentifierGenerator;
import org.openspcoop2.utils.jdbc.IJDBCAdapter;
import org.openspcoop2.utils.resources.Loader;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.slf4j.Logger;


/**
 * Contiene un lettore del file di proprieta' di OpenSPCoop.
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */


public class ClassNameProperties {	

	/** Logger utilizzato per errori eventuali. */
	private Logger log = null;



	/* ********  F I E L D S  P R I V A T I  ******** */

	/** Reader delle proprieta' impostate nel file 'govway.classRegistry.properties' */
	private ClassNameInstanceProperties reader;

	/** Copia Statica */
	private static ClassNameProperties classNameProperties = null;


	/* ********  C O S T R U T T O R E  ******** */

	/**
	 * Viene chiamato in causa per istanziare il properties reader
	 *
	 * 
	 */
	private ClassNameProperties(boolean logError) throws UtilsException {

		if(OpenSPCoop2Startup.initialize)
			this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
		else
			this.log = LoggerWrapperFactory.getLogger("govway.startup");
		
		/* ---- Lettura del cammino del file di configurazione ---- */
		Properties propertiesReader = new Properties();
		java.io.InputStream properties = null;
		try{  
		    properties = ClassNameProperties.class.getResourceAsStream("/govway.classRegistry.properties");
			if(properties==null){
				throw new UtilsException("File '/govway.classRegistry.properties' not found");
			}
		    propertiesReader.load(properties);
		}catch(Exception e) {
			if(logError) {
				String msg = "Riscontrato errore durante la lettura del file 'govway.classRegistry.properties': "+e.getMessage();
				this.log.error(msg,e);
			}
		    throw new UtilsException("ClassName initialize error: "+e.getMessage());
		}finally{
		    try{
		    	if(properties!=null)
		    		properties.close();
		    }catch(Exception er){
		    	// close
		    }
		}

		this.reader = new ClassNameInstanceProperties(propertiesReader, this.log);
	}
	
	public void refreshLocalProperties(Properties localProp,String confDir){
		
		this.reader.searchLocalFileImplementation(confDir);
		
		if(localProp!=null){
			this.reader.setLocalObjectImplementation(localProp);
		}
		
	}


	/**
	 * Il Metodo si occupa di inizializzare il propertiesReader 
	 *
	 * 
	 */
	public static boolean initialize(boolean logError){

		try {
		    ClassNameProperties.classNameProperties = new ClassNameProperties(logError);	
		    return true;
		}
		catch(Exception e) {
		    return false;
		}
	}
    
	/**
	 * Ritorna l'istanza di questa classe
	 *
	 * @return Istanza di ClassNameProperties
	 * 
	 */
	public static ClassNameProperties getInstance(){
	    if(ClassNameProperties.classNameProperties==null) {
	    	// spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
	    	synchronized (ClassNameProperties.class) {
	    		if(ClassNameProperties.classNameProperties==null) {
	    			ClassNameProperties.initialize(false);
	    		}
	    	}
	    }
	    return ClassNameProperties.classNameProperties;
	}
    
	/**
	public static void updateLocalImplementation(Properties prop){
		ClassNameProperties.classNameProperties.reader.setLocalImplementation(prop);
	}*/

	
	
	
	
	
	public boolean validaConfigurazione(java.lang.ClassLoader loader, String db) {	
		try{  
			TipiDatabase tipiDatabase = TipiDatabase.DEFAULT;
			if(db!=null) {
				tipiDatabase = TipiDatabase.toEnumConstant(db);
			}
			
			Loader loaderOpenSPCoop = null;
			if(loader!=null){
				loaderOpenSPCoop = Loader.getInstance(); // gia inizializzato nello startup
			}else{
				loaderOpenSPCoop = new Loader(loader);
			}
			
			String[] tmp = getConnettore();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(CostantiConfigurazione.DISABILITATO.toString().equals(tipo)) {
						continue;
					}
					if(TipiConnettore.JMS.getNome().equals(tipo)) {
						continue; // sulle installazioni standalone non ci sono i jar jms
					}
					String className = this.getConnettore(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IConnettore.class) ) return false;
				}
			}
			
			tmp = getRealmContainerCustom();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getRealmContainerCustom(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IAutorizzazioneSecurityContainer.class) ) return false;
				}
			}
			
			tmp = getAutenticazionePortaDelegata();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(CostantiConfigurazione.AUTENTICAZIONE_NONE.equals(tipo)) {
						continue;
					}
					String className = this.getAutenticazionePortaDelegata(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IAutenticazionePortaDelegata.class) ) return false;
				}
			}
			
			tmp = getAutenticazionePortaApplicativa();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(CostantiConfigurazione.AUTENTICAZIONE_NONE.equals(tipo)) {
						continue;
					}
					String className = this.getAutenticazionePortaApplicativa(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IAutenticazionePortaApplicativa.class) ) return false;
				}
			}
			
			tmp = getAutorizzazionePortaDelegata();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(CostantiConfigurazione.AUTENTICAZIONE_NONE.equals(tipo)) {
						continue;
					}
					String className = this.getAutorizzazionePortaDelegata(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IAutorizzazionePortaDelegata.class) ) return false;
				}
			}
			
			tmp = getAutorizzazionePortaApplicativa();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(CostantiConfigurazione.AUTENTICAZIONE_NONE.equals(tipo)) {
						continue;
					}
					String className = this.getAutorizzazionePortaApplicativa(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IAutorizzazionePortaApplicativa.class) ) return false;
				}
			}
			
			tmp = getAutorizzazioneContenutoPortaDelegata();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(CostantiConfigurazione.AUTENTICAZIONE_NONE.equals(tipo)) {
						continue;
					}
					String className = this.getAutorizzazioneContenutoPortaDelegata(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IAutorizzazioneContenutoPortaDelegata.class) ) return false;
				}
			}
			
			tmp = getAutorizzazioneContenutoPortaApplicativa();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(CostantiConfigurazione.AUTENTICAZIONE_NONE.equals(tipo)) {
						continue;
					}
					String className = this.getAutorizzazioneContenutoPortaApplicativa(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IAutorizzazioneContenutoPortaApplicativa.class) ) return false;
				}
			}
			
			tmp = getIntegrazionePortaDelegata();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getIntegrazionePortaDelegata(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IGestoreIntegrazionePD.class) ) return false;
				}
			}
			
			tmp = getIntegrazionePortaApplicativa();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getIntegrazionePortaApplicativa(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IGestoreIntegrazionePA.class) ) return false;
				}
			}
			
			tmp = getJDBCAdapter();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getJDBCAdapter(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IJDBCAdapter.class, tipiDatabase) ) return false;
				}
			}
			
			tmp = getThreshold();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getThreshold(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IThreshold.class) ) return false;
				}
			}
			
			tmp = getMsgDiagnosticoOpenSPCoopAppender();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getMsgDiagnosticoOpenSPCoopAppender(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IDiagnosticProducer.class) ) return false;
				}
			}
			
			tmp = getTracciamentoOpenSPCoopAppender();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getTracciamentoOpenSPCoopAppender(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, ITracciaProducer.class) ) return false;
				}
			}
			
			tmp = getDumpOpenSPCoopAppender();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getDumpOpenSPCoopAppender(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IDumpProducer.class) ) return false;
				}
			}
			
			tmp = getNodeReceiver();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(TipiConnettore.JMS.getNome().equals(tipo)) {
						continue; // sulle installazioni standalone non ci sono i jar jms
					}
					String className = this.getNodeReceiver(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, INodeReceiver.class) ) return false;
				}
			}
			
			tmp = getNodeSender();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					if(TipiConnettore.JMS.getNome().equals(tipo)) {
						continue; // sulle installazioni standalone non ci sono i jar jms
					}
					String className = this.getNodeSender(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, INodeSender.class) ) return false;
				}
			}
			
			tmp = getRepositoryBuste();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getRepositoryBuste(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IGestoreRepository.class) ) return false;
				}
			}
			
			tmp = getSQLQueryObject();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getSQLQueryObject(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, ISQLQueryObject.class, tipiDatabase) ) return false;
				}
			}
			
			tmp = getDateManager();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getDateManager(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IDate.class) ) return false;
				}
			}
			
			tmp = getUniqueIdentifier();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getUniqueIdentifier(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IUniqueIdentifierGenerator.class) ) return false;
				}
			}
			
			tmp = getFiltroDuplicati();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getFiltroDuplicati(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IFiltroDuplicati.class) ) return false;
				}
			}
			
			// HANDLER: gia' verificati in properties openspcoop
			
			tmp = getOpenSPCoop2MessageFactory();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getOpenSPCoop2MessageFactory(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, OpenSPCoop2MessageFactory.class) ) return false;
				}
			}
			
			tmp = getMessageSecurityContext();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getMessageSecurityContext(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, MessageSecurityContext.class) ) return false;
				}
			}
			
			tmp = getMessageSecurityDigestReader();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getMessageSecurityDigestReader(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, MessageSecurityDigestReader.class) ) return false;
				}
			}
			
			tmp = getGestoreCredenziali();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getGestoreCredenziali(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IGestoreCredenziali.class) ) return false;
				}
			}
			
			tmp = getGestoreCredenzialiIM();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getGestoreCredenzialiIM(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IGestoreCredenzialiIM.class) ) return false;
				}
			}
			
			tmp = getNotifierCallback();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getNotifierCallback(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, INotifierCallback.class) ) return false;
				}
			}
			
			tmp = getBehaviour();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getBehaviour(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IBehaviour.class) ) return false;
				}
			}
			
			tmp = getSalvataggioTracceManager();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getSalvataggioTracceManager(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, ISalvataggioTracceManager.class) ) return false;
				}
			}
			
			tmp = getSalvataggioDiagnosticiManager();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getSalvataggioDiagnosticiManager(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, ISalvataggioDiagnosticiManager.class) ) return false;
				}
			}
			
			tmp = getRateLimiting();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getRateLimiting(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IRateLimiting.class) ) return false;
				}
			}
			
			tmp = getTokenValidazione();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getTokenValidazione(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, ITokenParser.class) ) return false;
				}
			}
			
			tmp = getTokenNegoziazione();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getTokenNegoziazione(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, INegoziazioneTokenParser.class) ) return false;
				}
			}
			
			tmp = getAttributeAuthority();
			if(tmp!=null && tmp.length>0) {
				for (String tipo : tmp) {
					String className = this.getAttributeAuthority(tipo);
					if ( !this.validate(loaderOpenSPCoop, className, tipo, IRetrieveAttributeAuthorityResponseParser.class) ) return false;
				}
			}
			
			return true;
			
		}catch(java.lang.Exception e) {
			this.log.error("Riscontrato errore durante la validazione lettura della proprieta' di openspcoop: "+e.getMessage(),e);
			return false;
		}
	}

	private boolean validate(Loader loaderOpenSPCoop, String className, String tipo, Class<?> classAttesa) {
		return this.validate(loaderOpenSPCoop, className, tipo, classAttesa, null);
	}
	private boolean validate(Loader loaderOpenSPCoop, String className, String tipo, Class<?> classAttesa, TipiDatabase tipiDatabase) {
		try{
			Object o = null;
			if(tipiDatabase==null) {
				o = loaderOpenSPCoop.newInstance(className);
			}
			else {
				o = loaderOpenSPCoop.newInstance(className, tipiDatabase);
			}
			o.toString();
			
			if(!classAttesa.isInstance(o)) {
				throw new UtilsException("Classe '"+className+"' non implementa l'interfaccia '"+classAttesa.getName()+"'");
			}
			
			return true;
			
		}catch(Throwable e){
			this.log.error("Riscontrato errore durante l'istanziazione della classe '"+className+"' associata al tipo '"+tipo+
					"' riguardante la gestione dell'interfaccia '"+classAttesa.getName()+"': "+e.getMessage(),e);
			return false;
		} 
	}




	/* ********  M E T O D I  ******** */

	/**
	 * Ritorna la classe di un connector se questo e' stato precedentemente registrata
	 *
	 * 
	 */
	public String getConnettore(String nome){
		return this.getValue("org.openspcoop2.connettore.", nome);
	}
	public String[] getConnettore() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.connettore.",CostantiConfigurazione.DISABILITATO.toString());
	}
		
	/**
	 * Ritorna una classe 'IAutorizzazioneSecurityContainer' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getRealmContainerCustom(String nome){
		return this.getValue("org.openspcoop2.realmContainer.custom.", nome);
	}
	public String[] getRealmContainerCustom() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.realmContainer.custom.");
	}
	
	/**
	 * Ritorna una classe 'IAutenticazionePortaDelegata' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getAutenticazionePortaDelegata(String nome){
		return this.getValue("org.openspcoop2.autenticazione.pd.", nome);
	}
	public String[] getAutenticazionePortaDelegata() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.autenticazione.pd.",CostantiConfigurazione.AUTENTICAZIONE_NONE);
	}

	/**
	 * Ritorna una classe 'IAutenticazionePortaApplicativa' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getAutenticazionePortaApplicativa(String nome){
		return this.getValue("org.openspcoop2.autenticazione.pa.", nome);
	}
	public String[] getAutenticazionePortaApplicativa() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.autenticazione.pa.",CostantiConfigurazione.AUTENTICAZIONE_NONE);
	}
	
	/**
	 * Ritorna una classe 'IAutorizzazionePortaDelegata' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getAutorizzazionePortaDelegata(String nome){
		return this.getValue("org.openspcoop2.autorizzazione.pd.", nome);
	}
	public String[] getAutorizzazionePortaDelegata() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.autorizzazione.pd.",CostantiConfigurazione.AUTORIZZAZIONE_NONE);
	}
	
	/**
	 * Ritorna una classe 'IAutorizzazionePortaApplicativa' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getAutorizzazionePortaApplicativa(String nome){
		return this.getValue("org.openspcoop2.autorizzazione.pa.", nome);
	}
	public String[] getAutorizzazionePortaApplicativa() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.autorizzazione.pa.",CostantiConfigurazione.AUTORIZZAZIONE_NONE);
	}
	
	/**
	 * Ritorna una classe 'IAutorizzazioneContenutoPortaDelegata' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getAutorizzazioneContenutoPortaDelegata(String nome){
		return this.getValue("org.openspcoop2.autorizzazioneContenuto.pd.", nome);
	}
	public String[] getAutorizzazioneContenutoPortaDelegata() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.autorizzazioneContenuto.pd.",CostantiConfigurazione.AUTORIZZAZIONE_NONE);
	}
	
	/**
	 * Ritorna una classe 'IAutorizzazioneContenutoPortaApplicativa' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getAutorizzazioneContenutoPortaApplicativa(String nome){
		return this.getValue("org.openspcoop2.autorizzazioneContenuto.pa.", nome);
	}
	public String[] getAutorizzazioneContenutoPortaApplicativa() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.autorizzazioneContenuto.pa.",CostantiConfigurazione.AUTORIZZAZIONE_NONE);
	}
	
	/**
	 * Ritorna una classe 'IGestoreIntegrazionePD' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getIntegrazionePortaDelegata(String nome){
		return this.getValue("org.openspcoop2.integrazione.pd.", nome);
	}
	public String[] getIntegrazionePortaDelegata() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.integrazione.pd.");
	}
	
	/**
	 * Ritorna una classe 'IGestoreIntegrazionePA' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getIntegrazionePortaApplicativa(String nome){
		return this.getValue("org.openspcoop2.integrazione.pa.", nome);
	}
	public String[] getIntegrazionePortaApplicativa() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.integrazione.pa.");
	}
	
	/**
	 * Ritorna una classe 'IJDBCAdapter' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getJDBCAdapter(String nome){
		return this.getValue("org.openspcoop2.jdbcAdapter.", nome);
	}
	public String[] getJDBCAdapter() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.jdbcAdapter.");
	}
	
	/**
	 * Ritorna una classe 'IThreshold' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getThreshold(String nome){
		return this.getValue("org.openspcoop2.threshold.", nome);
	}
	public String[] getThreshold() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.threshold.");
	}

	/**
	 * Ritorna una classe 'IMsgDiagnosticoOpenSPCoopAppender' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getMsgDiagnosticoOpenSPCoopAppender(String nome){
		return this.getValue("org.openspcoop2.msgdiagnosticoAppender.", nome);
	}
	public String[] getMsgDiagnosticoOpenSPCoopAppender() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.msgdiagnosticoAppender.");
	}
	
	/**
	 * Ritorna una classe 'ITracciamentoOpenSPCoopAppender' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getTracciamentoOpenSPCoopAppender(String nome){
		return this.getValue("org.openspcoop2.tracciamentoAppender.", nome);
	}
	public String[] getTracciamentoOpenSPCoopAppender() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.tracciamentoAppender.");
	}
	
	/**
	 * Ritorna una classe 'IDumpOpenSPCoopAppender' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getDumpOpenSPCoopAppender(String nome){
		return this.getValue("org.openspcoop2.dumpAppender.", nome);
	}
	public String[] getDumpOpenSPCoopAppender() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.dumpAppender.");
	}
		
	/**
	 * Ritorna una classe 'INodeReceiver' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getNodeReceiver(String nome){
		return this.getValue("org.openspcoop2.nodeReceiver.", nome);
	}
	public String[] getNodeReceiver() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.nodeReceiver.");
	}
	
	/**
	 * Ritorna una classe 'INodeSender' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getNodeSender(String nome){
		return this.getValue("org.openspcoop2.nodeSender.", nome);
	}
	public String[] getNodeSender() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.nodeSender.");
	}
	
	/**
	 * Ritorna una classe 'IGestoreRepositoryBuste' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getRepositoryBuste(String nome){
		return this.getValue("org.openspcoop2.repositoryBuste.", nome);
	}
	public String[] getRepositoryBuste() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.repositoryBuste.");
	}
	
	/**
	 * Ritorna una classe 'ISQLQueryObject' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getSQLQueryObject(String nome){
		return this.getValue("org.openspcoop2.sqlQueryObject.", nome);
	}
	public String[] getSQLQueryObject() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.sqlQueryObject.");
	}
	
	/**
	 * Ritorna una classe 'IDate' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getDateManager(String nome){
		return this.getValue("org.openspcoop2.date.", nome);
	}
	public String[] getDateManager() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.date.");
	}
	
	
	
	/**
	 * Ritorna una classe 'IUniqueIdentifier' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getUniqueIdentifier(String nome){
		return this.getValue("org.openspcoop2.id.", nome);
	}
	public String[] getUniqueIdentifier() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.id.");
	}
	
	
	
	/**
	 * Ritorna una classe 'IFiltroDuplicati' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getFiltroDuplicati(String nome){
		return this.getValue("org.openspcoop2.protocol.filtroDuplicati.", nome);
	}
	public String[] getFiltroDuplicati() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.protocol.filtroDuplicati.");
	}
	
	
	
	
	
	// Handler BuiltIn
	
	
	/**
	 * Ritorna una classe 'InitHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getInitHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.init.", nome);
	}
	public String[] getInitHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.init.");
	}
	
	
	
	/**
	 * Ritorna una classe 'ExitHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getExitHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.exit.", nome);
	}
	public String[] getExitHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.exit.");
	}
	
	
	
	/**
	 * Ritorna una classe 'PreInRequestHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getPreInRequestHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.pre-in-request.", nome);
	}
	public String[] getPreInRequestHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.pre-in-request.");
	}
	
	/**
	 * Ritorna una classe 'InRequestHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getInRequestHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.in-request.", nome);
	}
	public String[] getInRequestHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.in-request.");
	}
	
	/**
	 * Ritorna una classe 'InProtocolRequestHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getInRequestProtocolHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.in-protocol-request.", nome);
	}
	public String[] getInRequestProtocolHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.in-protocol-request.");
	}
	
	/**
	 * Ritorna una classe 'OutRequestHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getOutRequestHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.out-request.", nome);
	}
	public String[] getOutRequestHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.out-request.");
	}
	
	/**
	 * Ritorna una classe 'PostOutRequestHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getPostOutRequestHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.post-out-request.", nome);
	}
	public String[] getPostOutRequestHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.post-out-request.");
	}
	
	/**
	 * Ritorna una classe 'PreInResponseHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getPreInResponseHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.pre-in-response.", nome);
	}
	public String[] getPreInResponseHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.pre-in-response.");
	}
	
	/**
	 * Ritorna una classe 'InResponseHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getInResponseHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.in-response.", nome);
	}
	public String[] getInResponseHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.in-response.");
	}
	
	/**
	 * Ritorna una classe 'OutResponseHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getOutResponseHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.out-response.", nome);
	}
	public String[] getOutResponseHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.out-response.");
	}
	
	/**
	 * Ritorna una classe 'PostOutResponseHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getPostOutResponseHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.built-in.post-out-response.", nome);
	}
	public String[] getPostOutResponseHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.built-in.post-out-response.");
	}
	
	/**
	 * Ritorna una classe 'IntegrationManagerRequestHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getIntegrationManagerRequestHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.integrationManager.handler.built-in.request.", nome);
	}
	public String[] getIntegrationManagerRequestHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.integrationManager.handler.built-in.request.");
	}
	
	/**
	 * Ritorna una classe 'IntegrationManagerResponseHandlerBuiltIn' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getIntegrationManagerResponseHandlerBuiltIn(String nome){
		return this.getValue("org.openspcoop2.pdd.integrationManager.handler.built-in.response.", nome);
	}
	public String[] getIntegrationManagerResponseHandlerBuiltIn() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.integrationManager.handler.built-in.response.");
	}
	
	
	
	
	// Handler 
	
	/**
	 * Ritorna una classe 'InitHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getInitHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.init.", nome);
	}
	public String[] getInitHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.init.");
	}
	
	
	
	/**
	 * Ritorna una classe 'ExitHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getExitHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.exit.", nome);
	}
	public String[] getExitHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.exit.");
	}
	
	
	
	/**
	 * Ritorna una classe 'PreInRequestHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getPreInRequestHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.pre-in-request.", nome);
	}
	public String[] getPreInRequestHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.pre-in-request.");
	}
	
	/**
	 * Ritorna una classe 'InRequestHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getInRequestHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.in-request.", nome);
	}
	public String[] getInRequestHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.in-request.");
	}
	
	/**
	 * Ritorna una classe 'InProtocolRequestHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getInRequestProtocolHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.in-protocol-request.", nome);
	}
	public String[] getInRequestProtocolHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.in-protocol-request.");
	}
	
	/**
	 * Ritorna una classe 'OutRequestHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getOutRequestHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.out-request.", nome);
	}
	public String[] getOutRequestHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.out-request.");
	}
	
	/**
	 * Ritorna una classe 'PostOutRequestHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getPostOutRequestHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.post-out-request.", nome);
	}
	public String[] getPostOutRequestHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.post-out-request.");
	}
	
	/**
	 * Ritorna una classe 'PreInResponseHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getPreInResponseHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.pre-in-response.", nome);
	}
	public String[] getPreInResponseHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.pre-in-response.");
	}
	
	/**
	 * Ritorna una classe 'InResponseHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getInResponseHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.in-response.", nome);
	}
	public String[] getInResponseHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.in-response.");
	}
	
	/**
	 * Ritorna una classe 'OutResponseHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getOutResponseHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.out-response.", nome);
	}
	public String[] getOutResponseHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.out-response.");
	}
	
	/**
	 * Ritorna una classe 'PostOutResponseHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getPostOutResponseHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.handler.post-out-response.", nome);
	}
	public String[] getPostOutResponseHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.handler.post-out-response.");
	}
	
	/**
	 * Ritorna una classe 'IntegrationManagerRequestHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getIntegrationManagerRequestHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.integrationManager.handler.request.", nome);
	}
	public String[] getIntegrationManagerRequestHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.integrationManager.handler.request.");
	}
	
	/**
	 * Ritorna una classe 'IntegrationManagerResponseHandler' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getIntegrationManagerResponseHandler(String nome){
		return this.getValue("org.openspcoop2.pdd.integrationManager.handler.response.", nome);
	}
	public String[] getIntegrationManagerResponseHandler() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.integrationManager.handler.response.");
	}
	
	
	/**
	 * Ritorna una classe 'OpenSPCoop2MessageFactory' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getOpenSPCoop2MessageFactory(String nome){
		if(nome == null) return null;
		return this.getValue("org.openspcoop2.pdd.messagefactory.", nome);
	}
	public String[] getOpenSPCoop2MessageFactory() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.messagefactory.");
	}
	
	
	/**
	 * Ritorna una classe 'MessageSecurityContext' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getMessageSecurityContext(String nome){
		if(nome == null) return null;
		return this.getValue("org.openspcoop2.pdd.messageSecurity.context.", nome);
	}
	public String[] getMessageSecurityContext() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.messageSecurity.context.");
	}
	
	
	/**
	 * Ritorna una classe 'MessageSecurityDigestReader' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getMessageSecurityDigestReader(String nome){
		if(nome == null) return null;
		return this.getValue("org.openspcoop2.pdd.messageSecurity.digestReader.", nome);
	}
	public String[] getMessageSecurityDigestReader() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.messageSecurity.digestReader.");
	}
	
	
	/**
	 * Ritorna una classe 'IGestoreCredenziali' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getGestoreCredenziali(String nome){
		return this.getValue("org.openspcoop2.pdd.gestoreCredenziali.", nome);
	}
	public String[] getGestoreCredenziali() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.gestoreCredenziali.");
	}
	
	/**
	 * Ritorna una classe 'IGestoreCredenzialiIM' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getGestoreCredenzialiIM(String nome){
		return this.getValue("org.openspcoop2.integrationManager.gestoreCredenziali.", nome);
	}
	public String[] getGestoreCredenzialiIM() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.integrationManager.gestoreCredenziali.");
	}
	
	
	
	/**
	 * Ritorna una classe 'NotifierCallback' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getNotifierCallback(String nome){
		return this.getValue("org.openspcoop2.notifierCallback.", nome);
	}
	public String[] getNotifierCallback() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.notifierCallback.");
	}
	
	
	
	
	/**
	 * Ritorna una classe 'IBehaviour' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getBehaviour(String nome){
		return this.getValue("org.openspcoop2.behaviour.", nome);
	}
	public String[] getBehaviour() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.behaviour.");
	}
	
	
	
	/**
	 * Ritorna una classe 'ISalvataggioTracceManager' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getSalvataggioTracceManager(String nome){
		return this.getValue("org.openspcoop2.pdd.transazioni.tracce.salvataggio.", nome);
	}
	public String[] getSalvataggioTracceManager() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.transazioni.tracce.salvataggio.");
	}
	
	
	
	/**
	 * Ritorna una classe 'ISalvataggioDiagnosticiManager' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getSalvataggioDiagnosticiManager(String nome){
		return this.getValue("org.openspcoop2.pdd.transazioni.diagnostici.salvataggio.", nome);
	}
	public String[] getSalvataggioDiagnosticiManager() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.transazioni.diagnostici.salvataggio.");
	}
	
	
	
	/**
	 * Ritorna una classe 'IRateLimiting' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getRateLimiting(String nome){
		return this.getValue("org.openspcoop2.pdd.controlloTraffico.rateLimiting.", nome);
	}
	public String[] getRateLimiting() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.controlloTraffico.rateLimiting.");
	}

	
	
	/**
	 * Ritorna una classe 'IDynamicDiscoveryParser' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getTokenDynamicDiscovery(String nome){
		return this.getValue("org.openspcoop2.pdd.token.dynamicDiscovery.", nome);
	}
	public String[] getTokenDynamicDiscovery() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.token.dynamicDiscovery.");
	}
	
	
	
	
	/**
	 * Ritorna una classe 'ITokenParser' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getTokenValidazione(String nome){
		return this.getValue("org.openspcoop2.pdd.token.validazione.", nome);
	}
	public String[] getTokenValidazione() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.token.validazione.");
	}
	
	
	
	/**
	 * Ritorna una classe 'INegoziazioneTokenParser' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getTokenNegoziazione(String nome){
		return this.getValue("org.openspcoop2.pdd.token.negoziazione.", nome);
	}
	public String[] getTokenNegoziazione() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.token.negoziazione.");
	}
	
	
	
	/**
	 * Ritorna una classe 'IRetrieveAttributeAuthorityResponseParser' se questa e' stata precedentemente registrata
	 *
	 * 
	 */
	public String getAttributeAuthority(String nome){
		return this.getValue("org.openspcoop2.pdd.attributeAuthority.", nome);
	}
	public String[] getAttributeAuthority() throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.attributeAuthority.");
	}
	
	
	
	/**
	 * Ritorna una classe estesa la cui interfaccia dipende da quella indicata nel primo, parametro
	 *
	 * 
	 */
	public String getExtended(String tipologia, String nome){
		return this.getValue("org.openspcoop2.pdd.extended.", tipologia+"."+nome);
	}
	public String[] getExtended(String tipologia) throws UtilsException{
		return this.getTipiGestiti("org.openspcoop2.pdd.extended."+tipologia+".");
	}
	
	
	

	private String getValue(String prop,String nome){
		try{
			String value = this.reader.getValue(prop+nome);
			if(value!=null){
				value = value.trim();
			}
			else{
				// provo con lowerCase
				value = this.reader.getValue(prop+(nome.toLowerCase()));
				if(value!=null){
					value = value.trim();
				}
				else{
					// provo con upperCase
					value = this.reader.getValue(prop+(nome.toUpperCase()));
					if(value!=null){
						value = value.trim();
					}
				}
			}
				
			return value;
		}catch(Exception e){
			this.log.error("Errore durante la lettura della proprieta ["+prop+nome+"]: "+e.getMessage(),e);
			return null;
		}
	}
	private String[] getTipiGestiti(String prefix,String ... defaults) throws UtilsException {
		Properties prop = this.reader.readProperties(prefix);
		Enumeration<?> en = prop.keys();
		List<String> tipi = new ArrayList<>();
		if(defaults!=null && defaults.length>0){
			tipi.addAll(Arrays.asList(defaults));
		}
		while(en.hasMoreElements()){
			Object o = en.nextElement();
			if(o!=null){
				String v = (String)o;
				tipi.add(v.trim());
			}
		}
		String[] sNull = null;
		if(!tipi.isEmpty()){
			return tipi.toArray(new String[1]);
		}else{
			return sNull;
		}
	}
}