/* * Copyright (c) 2002-2007 by OpenSymphony * All rights reserved. */ package com.opensymphony.oscache.base; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties; /** * Responsible for holding the Cache configuration properties. If the default * constructor is used, this class will load the properties from the * cache.configuration. * * @author Fabian Crabus * @version $Revision$ */ public class Config implements java.io.Serializable { private static final transient Log log = LogFactory.getLog(Config.class); /** * Name of the properties file. */ private final static String PROPERTIES_FILENAME = "/oscache.properties"; /** * Properties map to hold the cache configuration. */ private Properties properties = null; /** * Create an OSCache Config that loads properties from oscache.properties. * The file must be present in the root of OSCache's classpath. If the file * cannot be loaded, an error will be logged and the configuration will * remain empty. */ public Config() { this(null); } /** * Create an OSCache configuration with the specified properties. * Note that it is the responsibility of the caller to provide valid * properties as no error checking is done to ensure that required * keys are present. If you're unsure of what keys should be present, * have a look at a sample oscache.properties file. * * @param p The properties to use for this configuration. If null, * then the default properties are loaded from the oscache.properties * file. */ public Config(Properties p) { if (log.isDebugEnabled()) { log.debug("OSCache: Config called"); } if (p == null) { this.properties = loadProperties(PROPERTIES_FILENAME, "the default configuration"); } else { this.properties = p; } } /** * Retrieve the value of the named configuration property. If the property * cannot be found this method will return null. * * @param key The name of the property. * @return The property value, or null if the value could * not be found. * * @throws IllegalArgumentException if the supplied key is null. */ public String getProperty(String key) { if (key == null) { throw new IllegalArgumentException("key is null"); } if (properties == null) { return null; } return properties.getProperty(key); } /** * Retrieves all of the configuration properties. This property set * should be treated as immutable. * * @return The configuration properties. */ public Properties getProperties() { return properties; } public Object get(Object key) { return properties.get(key); } /** * Sets a configuration property. * * @param key The unique name for this property. * @param value The value assigned to this property. * * @throws IllegalArgumentException if the supplied key is null. */ public void set(Object key, Object value) { if (key == null) { throw new IllegalArgumentException("key is null"); } if (value == null) { return; } if (properties == null) { properties = new Properties(); } properties.put(key, value); } /** * Load the properties from the specified URL. * @param url a non null value of the URL to the properties * @param info additional logger information if the properties can't be read * @return the loaded properties specified by the URL * @since 2.4 */ public static Properties loadProperties(URL url, String info) { log.info("OSCache: Getting properties from URL " + url + " for " + info); Properties properties = new Properties(); InputStream in = null; try { in = url.openStream(); properties.load(in); log.info("OSCache: Properties read " + properties); } catch (Exception e) { log.error("OSCache: Error reading from " + url, e); log.error("OSCache: Ensure the properties information in " + url+ " is readable and in your classpath."); } finally { try { in.close(); } catch (IOException e) { log.warn("OSCache: IOException while closing InputStream: " + e.getMessage()); } } return properties; } /** * Load the specified properties file from the classpath. If the file * cannot be found or loaded, an error will be logged and no * properties will be set. * @param filename the properties file with path * @param info additional logger information if file can't be read * @return the loaded properties specified by the filename * @since 2.4 */ public static Properties loadProperties(String filename, String info) { URL url = null; ClassLoader threadContextClassLoader = Thread.currentThread().getContextClassLoader(); if (threadContextClassLoader != null) { url = threadContextClassLoader.getResource(filename); } if (url == null) { url = Config.class.getResource(filename); if (url == null) { log.warn("OSCache: No properties file found in the classpath by filename " + filename); return new Properties(); } } return loadProperties(url, info); } }