/**
* 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 );
}
}