PddPluginLoader.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.dynamic;

import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.core.config.constants.PluginCostanti;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.plugins.constants.TipoPlugin;
import org.openspcoop2.monitor.engine.dynamic.CorePluginLoader;
import org.openspcoop2.monitor.engine.dynamic.IPluginLoader;
import org.openspcoop2.monitor.engine.dynamic.PluginLoader;
import org.openspcoop2.pdd.config.ClassNameProperties;
import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
import org.openspcoop2.pdd.core.autenticazione.pa.IAutenticazionePortaApplicativa;
import org.openspcoop2.pdd.core.autenticazione.pd.IAutenticazionePortaDelegata;
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.handlers.ExitHandler;
import org.openspcoop2.pdd.core.handlers.InRequestHandler;
import org.openspcoop2.pdd.core.handlers.InRequestProtocolHandler;
import org.openspcoop2.pdd.core.handlers.InResponseHandler;
import org.openspcoop2.pdd.core.handlers.InitHandler;
import org.openspcoop2.pdd.core.handlers.IntegrationManagerRequestHandler;
import org.openspcoop2.pdd.core.handlers.IntegrationManagerResponseHandler;
import org.openspcoop2.pdd.core.handlers.OutRequestHandler;
import org.openspcoop2.pdd.core.handlers.OutResponseHandler;
import org.openspcoop2.pdd.core.handlers.PostOutRequestHandler;
import org.openspcoop2.pdd.core.handlers.PostOutResponseHandler;
import org.openspcoop2.pdd.core.handlers.PreInRequestHandler;
import org.openspcoop2.pdd.core.handlers.PreInResponseHandler;
import org.openspcoop2.pdd.core.integrazione.IGestoreIntegrazionePA;
import org.openspcoop2.pdd.core.integrazione.IGestoreIntegrazionePD;
import org.openspcoop2.pdd.core.token.attribute_authority.IRetrieveAttributeAuthorityResponseParser;
import org.openspcoop2.pdd.core.token.parser.IDynamicDiscoveryParser;
import org.openspcoop2.pdd.core.token.parser.INegoziazioneTokenParser;
import org.openspcoop2.pdd.core.token.parser.ITokenParser;
import org.openspcoop2.utils.NameValue;

/**
 * PluginLoader
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class PddPluginLoader extends PluginLoader implements IPluginLoader {

	public static PddPluginLoader getInstance() {
		return (PddPluginLoader) CorePluginLoader.getInstance();
	}
	
	
	private ClassNameProperties className = null;
	private ConfigurazionePdDManager configPdDManager = null;
	
	public PddPluginLoader() {
		super();
		this.className = ClassNameProperties.getInstance();
		this.configPdDManager = ConfigurazionePdDManager.getInstance();
	}
	

	
	// UTILITY
	
	public String getPluginClassName(TipoPlugin tipoPlugin, String tipo, NameValue ... filtri) throws DriverConfigurazioneException {
		return this.getPluginClassName(tipoPlugin.getValue(), tipo, filtri);
	}
	public String getPluginClassName(String tipoPlugin, String tipo, NameValue ... filtri) throws DriverConfigurazioneException {
		if(this.isPluginManagerEnabled()) {
			try {
				if(filtri!=null && filtri.length>0) {
					return this.configPdDManager.getPluginClassNameByFilter(tipoPlugin, tipo, filtri);
				}
				else {
					return this.configPdDManager.getPluginClassName(tipoPlugin, tipo);
				}
			}catch(DriverConfigurazioneNotFound notFound) {
				return null;
			}
		}
		return null;
	}
	public Class<?> getPddDynamicClass(String className, TipoPlugin tipoPlugin, String tipo, NameValue ... filtri) throws CoreException {
		return getPddDynamicClass(className, tipoPlugin.getValue(), tipo, filtri);
	}
	public Class<?> getPddDynamicClass(String className, String tipoPlugin, String tipo, NameValue ... filtri) throws CoreException {
		StringBuilder sFiltro = new StringBuilder();
		if(filtri!=null && filtri.length>0) {
			for (int i = 0; i < filtri.length; i++) {
				NameValue filtro = filtri[i];
				sFiltro.append(" filter-").append(i).append(" '").append(filtro.toString()).append("'");
			}
		}
		if(className==null) {
			try {
				className = getPluginClassName(tipoPlugin, tipo, filtri);
			}catch(Exception e) {
				throw new CoreException("Class not found in registry ("+super.getObjectName(tipoPlugin)+" type '"+tipo+"' "+sFiltro.toString()+"): "+e.getMessage(),e);
			}
		}
		if(className==null) {
			throw new CoreException("Class not found in registry ("+super.getObjectName(tipoPlugin)+" type '"+tipo+"' "+sFiltro.toString()+")");
		}
		return super.getDynamicClass(className, tipoPlugin, tipo);
	}
	
	
	// TIPI DI PLUGINS
	
	public IConnettore newConnettore(String tipo) throws CoreException {
		String classNameRegistered = this.className.getConnettore(tipo);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.CONNETTORE, tipo);
		return (IConnettore) newInstance(c, TipoPlugin.CONNETTORE, tipo);
	}

	public IAutenticazionePortaDelegata newAutenticazionePortaDelegata(String tipo) throws CoreException {
		String classNameRegistered = this.className.getAutenticazionePortaDelegata(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_RUOLO_NOME, PluginCostanti.FILTRO_RUOLO_VALORE_FRUIZIONE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.AUTENTICAZIONE, tipo, nv);
		return (IAutenticazionePortaDelegata) newInstance(c, TipoPlugin.AUTENTICAZIONE, tipo);
	}
	
	public IAutenticazionePortaApplicativa newAutenticazionePortaApplicativa(String tipo) throws CoreException {
		String classNameRegistered = this.className.getAutenticazionePortaApplicativa(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_RUOLO_NOME, PluginCostanti.FILTRO_RUOLO_VALORE_EROGAZIONE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.AUTENTICAZIONE, tipo, nv);
		return (IAutenticazionePortaApplicativa) newInstance(c, TipoPlugin.AUTENTICAZIONE, tipo);
	}
	
	public IAutorizzazionePortaDelegata newAutorizzazionePortaDelegata(String tipo) throws CoreException {
		String classNameRegistered = this.className.getAutorizzazionePortaDelegata(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_RUOLO_NOME, PluginCostanti.FILTRO_RUOLO_VALORE_FRUIZIONE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.AUTORIZZAZIONE, tipo, nv);
		return (IAutorizzazionePortaDelegata) newInstance(c, TipoPlugin.AUTORIZZAZIONE, tipo);
	}
	
	public IAutorizzazionePortaApplicativa newAutorizzazionePortaApplicativa(String tipo) throws CoreException {
		String classNameRegistered = this.className.getAutorizzazionePortaApplicativa(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_RUOLO_NOME, PluginCostanti.FILTRO_RUOLO_VALORE_EROGAZIONE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.AUTORIZZAZIONE, tipo, nv);
		return (IAutorizzazionePortaApplicativa) newInstance(c, TipoPlugin.AUTORIZZAZIONE, tipo);
	}
	
	public IAutorizzazioneContenutoPortaDelegata newAutorizzazioneContenutiPortaDelegata(String tipo) throws CoreException {
		String classNameRegistered = this.className.getAutorizzazioneContenutoPortaDelegata(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_RUOLO_NOME, PluginCostanti.FILTRO_RUOLO_VALORE_FRUIZIONE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.AUTORIZZAZIONE_CONTENUTI, tipo, nv);
		return (IAutorizzazioneContenutoPortaDelegata) newInstance(c, TipoPlugin.AUTORIZZAZIONE_CONTENUTI, tipo);
	}
	
	public IAutorizzazioneContenutoPortaApplicativa newAutorizzazioneContenutiPortaApplicativa(String tipo) throws CoreException {
		String classNameRegistered = this.className.getAutorizzazioneContenutoPortaApplicativa(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_RUOLO_NOME, PluginCostanti.FILTRO_RUOLO_VALORE_EROGAZIONE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.AUTORIZZAZIONE_CONTENUTI, tipo, nv);
		return (IAutorizzazioneContenutoPortaApplicativa) newInstance(c, TipoPlugin.AUTORIZZAZIONE_CONTENUTI, tipo);
	}
	
	public IGestoreIntegrazionePD newIntegrazionePortaDelegata(String tipo) throws CoreException {
		String classNameRegistered = this.className.getIntegrazionePortaDelegata(tipo); 
		NameValue nv = new NameValue(PluginCostanti.FILTRO_RUOLO_NOME, PluginCostanti.FILTRO_RUOLO_VALORE_FRUIZIONE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.INTEGRAZIONE, tipo, nv);
		return (IGestoreIntegrazionePD) newInstance(c, TipoPlugin.INTEGRAZIONE, tipo);
	}
	
	public IGestoreIntegrazionePA newIntegrazionePortaApplicativa(String tipo) throws CoreException {
		String classNameRegistered = this.className.getIntegrazionePortaApplicativa(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_RUOLO_NOME, PluginCostanti.FILTRO_RUOLO_VALORE_EROGAZIONE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.INTEGRAZIONE, tipo, nv);
		return (IGestoreIntegrazionePA) newInstance(c, TipoPlugin.INTEGRAZIONE, tipo);
	}
	
	public InitHandler newInitHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getInitHandler(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_SERVICE_HANDLER_NOME, PluginCostanti.FILTRO_SERVICE_HANDLER_VALORE_INIT);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.SERVICE_HANDLER, tipo, nv);
		return (InitHandler) newInstance(c, TipoPlugin.SERVICE_HANDLER, tipo);
	}
	
	public ExitHandler newExitHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getExitHandler(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_SERVICE_HANDLER_NOME, PluginCostanti.FILTRO_SERVICE_HANDLER_VALORE_EXIT);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.SERVICE_HANDLER, tipo, nv);
		return (ExitHandler) newInstance(c, TipoPlugin.SERVICE_HANDLER, tipo);
	}
	
	public IntegrationManagerRequestHandler newIntegrationManagerRequestHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getIntegrationManagerRequestHandler(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_SERVICE_HANDLER_NOME, PluginCostanti.FILTRO_SERVICE_HANDLER_VALORE_INTEGRATION_MANAGER_REQUEST);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.SERVICE_HANDLER, tipo, nv);
		return (IntegrationManagerRequestHandler) newInstance(c, TipoPlugin.SERVICE_HANDLER, tipo);
	}
	
	public IntegrationManagerResponseHandler newIntegrationManagerResponseHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getIntegrationManagerResponseHandler(tipo);
		NameValue nv = new NameValue(PluginCostanti.FILTRO_SERVICE_HANDLER_NOME, PluginCostanti.FILTRO_SERVICE_HANDLER_VALORE_INTEGRATION_MANAGER_RESPONSE);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.SERVICE_HANDLER, tipo, nv);
		return (IntegrationManagerResponseHandler) newInstance(c, TipoPlugin.SERVICE_HANDLER, tipo);
	}
	
	public PreInRequestHandler newPreInRequestHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getPreInRequestHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_PRE_IN);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RICHIESTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (PreInRequestHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public InRequestHandler newInRequestHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getInRequestHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_IN);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RICHIESTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (InRequestHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public InRequestProtocolHandler newInRequestProtocolHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getInRequestProtocolHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_IN_PROTOCOL_INFO);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RICHIESTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (InRequestProtocolHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public OutRequestHandler newOutRequestHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getOutRequestHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_OUT);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RICHIESTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (OutRequestHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public PostOutRequestHandler newPostOutRequestHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getPostOutRequestHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_POST_OUT);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RICHIESTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (PostOutRequestHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public PreInResponseHandler newPreInResponseHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getPreInResponseHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_PRE_IN);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RISPOSTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (PreInResponseHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public InResponseHandler newInResponseHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getInResponseHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_IN);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RISPOSTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (InResponseHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public OutResponseHandler newOutResponseHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getOutResponseHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_OUT);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RISPOSTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (OutResponseHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public PostOutResponseHandler newPostOutResponseHandler(String tipo) throws CoreException {
		String classNameRegistered = this.className.getPostOutResponseHandler(tipo);
		NameValue fase = new NameValue(PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_FASE_MESSAGE_HANDLER_VALORE_POST_OUT);
		NameValue ruolo = new NameValue(PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_NOME, PluginCostanti.FILTRO_RUOLO_MESSAGE_HANDLER_VALORE_RISPOSTA);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.MESSAGE_HANDLER, tipo, fase, ruolo);
		return (PostOutResponseHandler) newInstance(c, TipoPlugin.MESSAGE_HANDLER, tipo);
	}
	
	public IBehaviour newBehaviour(String tipo) throws CoreException {
		String classNameRegistered = this.className.getBehaviour(tipo);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.BEHAVIOUR, tipo);
		return (IBehaviour) newInstance(c, TipoPlugin.BEHAVIOUR, tipo);
	}
	
	public IRateLimiting newRateLimiting(String tipo) throws CoreException {
		String classNameRegistered = this.className.getRateLimiting(tipo);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.RATE_LIMITING, tipo);
		return (IRateLimiting) newInstance(c, TipoPlugin.RATE_LIMITING, tipo);
	}
	
	public IDynamicDiscoveryParser newDynamicDiscovery(String tipo) throws CoreException {
		String classNameRegistered = this.className.getTokenDynamicDiscovery(tipo);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.TOKEN_DYNAMIC_DISCOVERY, tipo);
		return (IDynamicDiscoveryParser) newInstance(c, TipoPlugin.TOKEN_DYNAMIC_DISCOVERY, tipo);
	}
	
	public ITokenParser newTokenValidazione(String tipo) throws CoreException {
		String classNameRegistered = this.className.getTokenValidazione(tipo);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.TOKEN_VALIDAZIONE, tipo);
		return (ITokenParser) newInstance(c, TipoPlugin.TOKEN_VALIDAZIONE, tipo);
	}
	
	public INegoziazioneTokenParser newTokenNegoziazione(String tipo) throws CoreException {
		String classNameRegistered = this.className.getTokenNegoziazione(tipo);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.TOKEN_NEGOZIAZIONE, tipo);
		return (INegoziazioneTokenParser) newInstance(c, TipoPlugin.TOKEN_NEGOZIAZIONE, tipo);
	}
	
	public IRetrieveAttributeAuthorityResponseParser newAttributeAuthority(String tipo) throws CoreException {
		String classNameRegistered = this.className.getAttributeAuthority(tipo);
		Class<?> c = getPddDynamicClass(classNameRegistered, TipoPlugin.ATTRIBUTE_AUTHORITY, tipo);
		return (IRetrieveAttributeAuthorityResponseParser) newInstance(c, TipoPlugin.ATTRIBUTE_AUTHORITY, tipo);
	}
	
}