package org.apache.commons.jcs.utils.props; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ import org.apache.commons.jcs.access.exception.ConfigurationException; import java.util.Properties; /** * Provides a mechanism to load properties into objects. * <p> * Functions that depend on properties should call ensureProperties() before it uses any properties. */ public abstract class AbstractPropertyContainer { /** File, db, etc */ private static final PropertiesFactory DEFAULT_PROPERTIES_FACTORY = new PropertiesFactoryFileImpl(); /** * A property group is a subsection of properties. It's sent to the properties factory to * specify which group of properties to pull back. This will probably mean different things to * different property factories. For PropertiesFactoryFileImpl, the propertiesGroup maps to a * filename. */ private String propertiesGroup; /** * The property heading is used to specify a starting point in the properties object. This is * used so that settings can be relative to this propertiesHeading, as opposed to being * statically coded. There's no enforcement of this, but users are encouraged to call * getProperties().get( getPropertiesHeading() + ".foo" ); */ private String propertiesHeading; /** The factory to use. */ private PropertiesFactory propertiesFactory; /** The loaded properties. */ private Properties properties; /** * Makes sure an AbstractPropertyClass has all the properties it needs. * <p> * Synchronized mutators so multiple threads cannot cause problems. We wouldn't want the * properties heading to get changed as we were processing the properties. * <p> * @throws ConfigurationException on configuration failure */ public synchronized void ensureProperties() throws ConfigurationException { if ( getProperties() == null ) { initializeProperties(); } } /** * Loads the properties and then calls handleProperties. Typically, you don't need to call this. * This is primarily intended for reinitialization. * <p> * If the properties object is null, when you call ensureProperties initialize will be called. * <p> * @throws ConfigurationException on configuration failure */ public synchronized void initializeProperties() throws ConfigurationException { loadProperties(); handleProperties(); } /** * This loads the properties regardless of whether or not they have already been loaded. * <p> * @throws ConfigurationException on configuration failure */ private void loadProperties() throws ConfigurationException { if ( getPropertiesGroup() == null ) { throw new ConfigurationException( "Properties group is null and it shouldn't be" ); } if ( getPropertiesHeading() == null ) { throw new ConfigurationException( "Properties heading is null and it shouldn't be" ); } if ( getPropertiesFactory() == null ) { setProperties( DEFAULT_PROPERTIES_FACTORY.getProperties( getPropertiesGroup() ) ); } else { setProperties( getPropertiesFactory().getProperties( getPropertiesGroup() ) ); } } /** * Sets fields for properties, and verifies that all necessary properties are there. * <p> * @throws ConfigurationException on configuration failure */ protected abstract void handleProperties() throws ConfigurationException; /** * @return Returns the properties. */ public synchronized Properties getProperties() { return properties; } /** * @param properties The properties to set. */ public synchronized void setProperties( Properties properties ) { this.properties = properties; } /** * @return Returns the propertiesHeading. */ public synchronized String getPropertiesHeading() { return propertiesHeading; } /** * @param propertiesHeading The propertiesHeading to set. */ public synchronized void setPropertiesHeading( String propertiesHeading ) { this.propertiesHeading = propertiesHeading; } /** * @return Returns the propertiesFactory. */ public PropertiesFactory getPropertiesFactory() { return propertiesFactory; } /** * @param propertiesFactory The propertiesFactory to set. */ public void setPropertiesFactory( PropertiesFactory propertiesFactory ) { this.propertiesFactory = propertiesFactory; } /** * @return Returns the propertiesGroup. */ public String getPropertiesGroup() { return propertiesGroup; } /** * @param propertiesGroup The propertiesGroup to set. */ public void setPropertiesGroup( String propertiesGroup ) { this.propertiesGroup = propertiesGroup; } }