package at.gv.egovernment.moa.id.proxy; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import at.gv.egovernment.moa.id.config.ConfigurationException; import at.gv.egovernment.moa.id.config.proxy.OAProxyParameter; import at.gv.egovernment.moa.id.config.proxy.ProxyConfigurationProvider; /** * Factory delivering a {@link LoginParameterResolver} implementation for * an online application, initialized from configuration data. * @author Paul Ivancsics * @version $Id$ */ public class LoginParameterResolverFactory { /** default login parameter resolver to be used for online application * where no special implementation of the LoginParameterResolver * interface is configured */ private static LoginParameterResolver defaultLoginParameterResolver; /** mapping from online application public URL prefix to an implementation * of the LoginParameterResolver interface to be used; * if no mapping is given for an online application, the * DefaultLoginParameterResolver will be used */ private static Map loginParameterResolverMap; /** * Initializes the LoginParameterResolver map from the configuration data. * @throws ConfigurationException when the configuration cannot be read, * or when a class name configured cannot be instantiated */ public static void initialize() throws ConfigurationException { defaultLoginParameterResolver = new DefaultLoginParameterResolver(); loginParameterResolverMap = new HashMap(); ProxyConfigurationProvider proxyConf = ProxyConfigurationProvider.getInstance(); for (int i = 0; i < proxyConf.getOnlineApplicationParameters().length; i++) { OAProxyParameter oaParam = proxyConf.getOnlineApplicationParameters()[i]; String publicURLPrefix = oaParam.getPublicURLPrefix(); String className = oaParam.getLoginParameterResolverImpl(); String configuration = oaParam.getLoginParameterResolverConfiguration(); if (className != null) { try { Class lprClass = Class.forName(className); LoginParameterResolver lpr = (LoginParameterResolver)Class.forName(className).newInstance(); Class[] argumentTypes = { String.class }; Method confMethod = lprClass.getMethod( "configure", argumentTypes ); Object[] arguments = { new String(configuration) }; confMethod.invoke( lpr, arguments ); loginParameterResolverMap.put(publicURLPrefix, lpr); } catch (InvocationTargetException lpex) { throw new ConfigurationException("config.11", new Object[] {className}, lpex); } catch (Throwable ex) { throw new ConfigurationException("config.07", new Object[] {publicURLPrefix}, ex); } } } } /** * Gets the LoginParameterResolver implementation to be used for the given * online application. * @param publicURLPrefix public URL prefix of the online application * @return LoginParameterResolver implementation */ public static LoginParameterResolver getLoginParameterResolver(String publicURLPrefix) { LoginParameterResolver lpr = (LoginParameterResolver) loginParameterResolverMap.get(publicURLPrefix); if (lpr == null) return defaultLoginParameterResolver; else return lpr; } }