package at.gv.egovernment.moa.id.config.proxy; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.MalformedURLException; import org.w3c.dom.Element; import at.gv.egovernment.moa.id.config.ConfigurationBuilder; import at.gv.egovernment.moa.id.config.ConfigurationException; import at.gv.egovernment.moa.id.config.ConfigurationProvider; import at.gv.egovernment.moa.id.config.ConnectionParameter; import at.gv.egovernment.moa.logging.Logger; import at.gv.egovernment.moa.util.DOMUtils; import at.gv.egovernment.moa.util.FileUtils; /** * A class providing access to the Proxy Part of the MOA-ID configuration data. * *

Configuration data is read from an XML file, whose location is given by * the moa.id.configuration system property.

*

This class implements the Singleton pattern. The reload() * method can be used to update the configuration data. Therefore, it is not * guaranteed that consecutive calls to getInstance() will return * the same ProxyConfigurationProvider all the time. During the * processing of a web service request, the current * TransactionContext should be used to obtain the * ProxyConfigurationProvider local to that request.

* * @author Stefan Knirsch */ public class ProxyConfigurationProvider extends ConfigurationProvider { /** Singleton instance. null, if none has been created. */ private static ProxyConfigurationProvider instance; // // configuration data // /** * connection parameters for connection to MOA ID Auth component */ private ConnectionParameter authComponentConnectionParameter; /** * configuration parameters for online applications */ private OAProxyParameter[] onlineApplicationProxyParameter; /** * Return the single instance of configuration data. * * @return ProxyConfigurationProvider The current configuration data. * @throws ConfigurationException */ public static synchronized ProxyConfigurationProvider getInstance() throws ConfigurationException { if (instance == null) { reload(); } return instance; } /** * Reload the configuration data and set it if successful. * * @return ProxyConfigurationProvider The loaded configuration data. * @throws ConfigurationException Failure to load the configuration data. */ public static synchronized ProxyConfigurationProvider reload() throws ConfigurationException { String fileName = System.getProperty(CONFIG_PROPERTY_NAME); if (fileName == null) { throw new ConfigurationException("config.01", null); } Logger.info("Loading MOA-ID-PROXY configuration " + fileName); instance = new ProxyConfigurationProvider(fileName); return instance; } /** * Constructor for ProxyConfigurationProvider. */ public ProxyConfigurationProvider(String fileName) throws ConfigurationException { load(fileName); } /** * Load the configuration data from XML file with the given name and build * the internal data structures representing the MOA configuration. * * @param fileName The name of the XML file to load. * @throws ConfigurationException The MOA configuration could not be * read/built. */ private void load(String fileName) throws ConfigurationException { FileInputStream stream = null; Element configElem; ConfigurationBuilder builder; try { // load the main config file stream = new FileInputStream(fileName); configElem = DOMUtils.parseXmlValidating(stream); } catch (Throwable t) { throw new ConfigurationException("config.03", null, t); } finally { try { if (stream != null) { stream.close(); } } catch (IOException e) { } } try { // determine the directory of the root config file rootConfigFileDir = new File(fileName).getParent(); try { rootConfigFileDir = new File(rootConfigFileDir).toURL().toString(); } catch (MalformedURLException t) { throw new ConfigurationException("config.03", null, t); } // build the internal datastructures builder = new ConfigurationBuilder(configElem, rootConfigFileDir); authComponentConnectionParameter = builder.buildAuthComponentConnectionParameter(); onlineApplicationProxyParameter = builder.buildOnlineApplicationProxyParameters(); for(int i = 0; i < onlineApplicationProxyParameter.length; i++) { onlineApplicationProxyParameter[i].setConfigFileURL(FileUtils.makeAbsoluteURL(onlineApplicationProxyParameter[i].getConfigFileURL(), rootConfigFileDir)); } genericConfiguration = builder.buildGenericConfiguration(); defaultChainingMode = builder.getDefaultChainingMode(); chainingModes = builder.buildChainingModes(); trustedCACertificates = builder.getTrustedCACertificates(); trustedCACertificates = FileUtils.makeAbsoluteURL(trustedCACertificates, rootConfigFileDir); } catch (Throwable t) { throw new ConfigurationException("config.02", null, t); } } /** * Return a bean containing all information about the ProxyComponent * @return The ConnectionParameter for the Proxy Component */ public ConnectionParameter getAuthComponentConnectionParameter() { return authComponentConnectionParameter; } /** * Build an array of OnlineApplication Parameter Beans containing all * information about the proxy component of the online application * @return An OAProxyParameter array containing beans * with all relevant information for the proxy component of the online * application */ public OAProxyParameter[] getOnlineApplicationParameters() { return onlineApplicationProxyParameter; } /** * Provides configuration information regarding the online application behind * the given URL, relevant to the MOA-ID Proxy component. * * @param oaURL URL requested for an online application * @return an OAProxyParameter, or null * if none is applicable */ public OAProxyParameter getOnlineApplicationParameter(String oaURL) { OAProxyParameter[] oaParams = getOnlineApplicationParameters(); for (int i = 0; i < oaParams.length; i++) { OAProxyParameter oaParam = oaParams[i]; if (oaURL.startsWith(oaParam.getPublicURLPrefix())) return oaParam; } return null; } }