/** * Copyright (c) Members of the EGEE Collaboration. 2006-2009. * See http://www.eu-egee.org/partners/ for details on the copyright holders. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.glite.authz.pap.common; import java.io.File; import java.math.BigDecimal; import java.math.BigInteger; import java.util.Iterator; import java.util.List; import java.util.Properties; import javax.servlet.ServletContext; import org.apache.commons.configuration.CompositeConfiguration; import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.INIConfiguration; import org.glite.authz.pap.common.exceptions.NullArgumentException; import org.glite.authz.pap.common.exceptions.PAPConfigurationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** The configuration implementation for the PAP daemon and client **/ public class PAPConfiguration { /** Default directory prefix under which the authorization service apps are expected to live **/ private static final String DEFAULT_AUTHZ_PATH_PREFIX = "/opt/argus"; /** Default name for PAP home directory **/ private static final String DEFAULT_PAP_HOMEDIR_NAME = "pap"; /** Default directory path for PAP home directory **/ private static final String DEFAULT_PAP_HOME = DEFAULT_AUTHZ_PATH_PREFIX + "/"+ DEFAULT_PAP_HOMEDIR_NAME; /** Default directory under which the PAP will look for its configuration **/ private static final String DEFAULT_PAP_CONFIGURATION_DIR = DEFAULT_PAP_HOME+"/conf"; /** Default directory under which the PAP will look for its repository **/ private static final String DEFAULT_PAP_REPOSITORY_DIR = DEFAULT_PAP_HOME+"/repository"; /** The default file name for the PAP authorization layer configuration file **/ private static final String DEFAULT_PAP_AUTHZ_FILE_NAME = "pap_authorization.ini"; /** The default pap configuration file name **/ private static final String DEFAULT_PAP_CONFIGURATION_FILE_NAME = "pap_configuration.ini"; /** The prefix to be used to pick out monitoring properties out of this configuration **/ public static final String MONITORING_PROPERTY_PREFIX = "pap-monitoring"; /** The name of the stanza that contains repository configuration **/ public static final String REPOSITORY_STANZA = "repository"; /** The name of the stanza that contains standalone service configuration **/ public static final String STANDALONE_SERVICE_STANZA = "standalone-service"; /** The name of the stanza that contains local and remote paps configuration **/ public static final String PAPS_STANZA = "paps"; /** The name of the stanza that contains security configuration **/ public static final String SECURITY_STANZA = "security"; /** The default context for the PAP web application **/ public static final String DEFAULT_WEBAPP_CONTEXT = "pap"; final static Logger logger = LoggerFactory .getLogger( PAPConfiguration.class ); /** The singleton PAPConfiguration instance **/ private static PAPConfiguration instance; /** The Commons configuration base object that stores the actual configuration properties and provides a unified facade to multiple * configuration files **/ private CompositeConfiguration configuration; /** The PAP startup configuration object**/ private INIConfiguration startupConfiguration; /** * Constructor * * @param papConfigurationDir, the directory in which the PAP configuration files will be searched for */ private PAPConfiguration( String papConfigurationDir ) { configuration = new CompositeConfiguration(); if ( papConfigurationDir == null ){ logger.warn( "No configuration dir defined for PAP configuration initialization!" ); if (System.getProperty( "PAP_HOME" ) != null){ logger.info( "PAP_HOME system property defined. Will look in $PAP_HOME/conf for the configuration file!" ); configuration.setProperty( "papConfigurationDir", System.getProperty( "PAP_HOME" )+"/conf" ); }else{ logger.warn( "Using hardcoded configuration directory: "+ DEFAULT_PAP_CONFIGURATION_DIR ); configuration.setProperty( "papConfigurationDir", DEFAULT_PAP_CONFIGURATION_DIR ); } }else configuration.setProperty( "papConfigurationDir", papConfigurationDir ); loadStartupConfiguration(); } /** * Returns a PAPConfiguration object, if properly initialized. * * @return the active instance of the PAPConfiguration class * @throws PAPConfigurationException, in case the PAPConfiguration hasn't been properly initialized with the initialize method. */ public static PAPConfiguration instance() { if ( instance == null ) throw new PAPConfigurationException( "Please initialize configuration before calling the instance method!" ); return instance; } /** * Initializes the configuration for this PAP. * * @param context, a ServletContext that defines suitable defaults for configuration and repository directories * @return the active instance of the PAPConfiguration class */ public static PAPConfiguration initialize( ServletContext context ) { if ( context == null ) throw new NullArgumentException( "Please provide a value for the 'context' argument! null is not a valid value in this context." ); if ( instance == null ) { String papConfDir = context .getInitParameter( "papConfigurationDir" ); return initialize( papConfDir ); } return instance; } /** * Initializes the configuration for this PAP. * * @return the active instance of the PAPConfiguration class */ public static PAPConfiguration initialize() { if ( instance == null ) return initialize( (String)null ); return instance; } /** * Initializes the configuration for this PAP. * * * @param papConfigurationDir, the directory in which the PAP configuration files will be searched for * * @return a PAPConfiguration object */ public static PAPConfiguration initialize( String papConfigurationDir ) { if ( instance == null ) instance = new PAPConfiguration( papConfigurationDir); return instance; } /** * Loads the PAP startup configuration. */ private void loadStartupConfiguration() { // logger.info( "Loading pap startup configuration..." ); String papConfDir = configuration.getString( "papConfigurationDir" ); File papConfFile = new File( papConfDir + "/" + DEFAULT_PAP_CONFIGURATION_FILE_NAME); if ( !papConfFile.exists() ) throw new PAPConfigurationException( "PAP startup configuration file does not exists on path:" + papConfFile.getAbsolutePath() ); try { startupConfiguration = new INIConfiguration( papConfFile ); configuration.addConfiguration( startupConfiguration ); } catch ( org.apache.commons.configuration.ConfigurationException e ) { logger.error( "Error parsing PAP distribution configuration: " + e.getMessage(), e ); throw new PAPConfigurationException( "Error parsing PAP distribution configuration: " + e.getMessage(), e ); } } // Getter methods that access the configuration object and other services // down here /** Returns the default PAP configuration directory path **/ public String getPAPConfigurationDir() { return configuration.getString( "papConfigurationDir" ); } /** Returns the default PAP repository directory path **/ public String getPAPRepositoryDir() { return configuration.getString( REPOSITORY_STANZA+ ".location", System.getProperty( "PAP_HOME" )+"/repository" ); } /** Returns the default PAP authorization configuration file name **/ public String getPapAuthzConfigurationFileName() { return getPAPConfigurationDir() + "/" + DEFAULT_PAP_AUTHZ_FILE_NAME; } /** {@inheritDoc} **/ public BigDecimal getBigDecimal( String key, BigDecimal defaultValue ) { return configuration.getBigDecimal( key, defaultValue ); } /** {@inheritDoc} **/ public BigDecimal getBigDecimal( String key ) { return configuration.getBigDecimal( key ); } /** {@inheritDoc} **/ public BigInteger getBigInteger( String key, BigInteger defaultValue ) { return configuration.getBigInteger( key, defaultValue ); } /** {@inheritDoc} **/ public BigInteger getBigInteger( String key ) { return configuration.getBigInteger( key ); } /** {@inheritDoc} **/ public boolean getBoolean( String key, boolean defaultValue ) { return configuration.getBoolean( key, defaultValue ); } /** {@inheritDoc} **/ public Boolean getBoolean( String key, Boolean defaultValue ) { return configuration.getBoolean( key, defaultValue ); } /** {@inheritDoc} **/ public boolean getBoolean( String key ) { return configuration.getBoolean( key ); } /** {@inheritDoc} **/ public byte getByte( String key, byte defaultValue ) { return configuration.getByte( key, defaultValue ); } /** {@inheritDoc} **/ public Byte getByte( String key, Byte defaultValue ) { return configuration.getByte( key, defaultValue ); } /** {@inheritDoc} **/ public byte getByte( String key ) { return configuration.getByte( key ); } /** {@inheritDoc} **/ public double getDouble( String key, double defaultValue ) { return configuration.getDouble( key, defaultValue ); } /** {@inheritDoc} **/ public Double getDouble( String key, Double defaultValue ) { return configuration.getDouble( key, defaultValue ); } /** {@inheritDoc} **/ public double getDouble( String key ) { return configuration.getDouble( key ); } /** {@inheritDoc} **/ public float getFloat( String key, float defaultValue ) { return configuration.getFloat( key, defaultValue ); } /** {@inheritDoc} **/ public Float getFloat( String key, Float defaultValue ) { return configuration.getFloat( key, defaultValue ); } /** {@inheritDoc} **/ public float getFloat( String key ) { return configuration.getFloat( key ); } /** {@inheritDoc} **/ public int getInt( String key, int defaultValue ) { return configuration.getInt( key, defaultValue ); } /** {@inheritDoc} **/ public int getInt( String key ) { return configuration.getInt( key ); } /** {@inheritDoc} **/ public Integer getInteger( String key, Integer defaultValue ) { return configuration.getInteger( key, defaultValue ); } /** {@inheritDoc} **/ public Iterator getKeys() { return configuration.getKeys(); } /** {@inheritDoc} **/ public Iterator getKeys( String key ) { return configuration.getKeys( key ); } /** {@inheritDoc} **/ public List getList( String key, List defaultValue ) { return configuration.getList( key, defaultValue ); } /** {@inheritDoc} **/ public List getList( String key ) { return configuration.getList( key ); } /** {@inheritDoc} **/ public long getLong( String key, long defaultValue ) { return configuration.getLong( key, defaultValue ); } /** {@inheritDoc} **/ public Long getLong( String key, Long defaultValue ) { return configuration.getLong( key, defaultValue ); } /** {@inheritDoc} **/ public long getLong( String key ) { return configuration.getLong( key ); } /** {@inheritDoc} **/ public Properties getProperties( String key, Properties defaults ) { return configuration.getProperties( key, defaults ); } /** {@inheritDoc} **/ public Properties getProperties( String key ) { return configuration.getProperties( key ); } /** {@inheritDoc} **/ public Object getProperty( String key ) { return configuration.getProperty( key ); } /** {@inheritDoc} **/ public short getShort( String key, short defaultValue ) { return configuration.getShort( key, defaultValue ); } /** {@inheritDoc} **/ public Short getShort( String key, Short defaultValue ) { return configuration.getShort( key, defaultValue ); } /** {@inheritDoc} **/ public short getShort( String key ) { return configuration.getShort( key ); } /** {@inheritDoc} **/ public String getString( String key, String defaultValue ) { return configuration.getString( key, defaultValue ); } /** {@inheritDoc} **/ public String getString( String key ) { return configuration.getString( key ); } /** {@inheritDoc} **/ public String[] getStringArray( String key ) { return configuration.getStringArray( key ); } /** {@inheritDoc} **/ public void clearDistributionProperty( String key ) { configuration.clearProperty( key ); } public void setDistributionProperty( String key, Object value ) { startupConfiguration.setProperty( key, value ); } public void saveStartupConfiguration() { try { startupConfiguration.save(); } catch ( ConfigurationException e ) { throw new PAPConfigurationException( "Error saving policy distribution configuration: " + e.getMessage(), e ); } } /** * @param prefix * @return * @see org.apache.commons.configuration.AbstractConfiguration#subset(java.lang.String) */ public Configuration subset( String prefix ) { return configuration.subset( prefix ); } /** * Sets a monitoring property in this configuration. A specific prefix * is actually prefixed to the property name by this method * * @param name, the name of the property * @param value, the value of the property * @see #MONITORING_PROPERTY_PREFIX */ public void setMonitoringProperty(String name, Object value){ configuration.setProperty( MONITORING_PROPERTY_PREFIX+"."+name, value ); } /** * Gets a monitoring property in this configuration. A specific prefix * is actually prefixed to the property name by this method * * @param name, the name of the property * @return * @see #MONITORING_PROPERTY_PREFIX */ public Object getMonitoringProperty(String name){ return configuration.getProperty( MONITORING_PROPERTY_PREFIX+"."+name ); } }