proyal 2002/07/26 13:09:17
Modified: src/java/org/apache/avalon/phoenix/components/configuration
FileSystemPersistentConfigurationRepository.java
Resources.properties
Removed: src/java/org/apache/avalon/phoenix/components/configuration
PersistentConfigurationRepositoryMBean.java
Log:
* Update repo impl to store partial configs on disk,
with the partials computed dynamically.
* Remove separate MBean interface for persistent repos
* Update resources
Revision Changes Path
1.8 +125 -118
jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/FileSystemPersistentConfigurationRepository.java
Index: FileSystemPersistentConfigurationRepository.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/FileSystemPersistentConfigurationRepository.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- FileSystemPersistentConfigurationRepository.java 26 Jul 2002 09:49:20 -0000
1.7
+++ FileSystemPersistentConfigurationRepository.java 26 Jul 2002 20:09:17 -0000
1.8
@@ -9,16 +9,14 @@
import java.io.File;
import java.io.IOException;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
+
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.avalon.excalibur.io.FileUtil;
import org.apache.avalon.excalibur.property.PropertyException;
import org.apache.avalon.excalibur.property.PropertyUtil;
+import org.apache.avalon.framework.CascadingRuntimeException;
import org.apache.avalon.framework.activity.Initializable;
-import org.apache.avalon.framework.activity.Startable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
@@ -30,33 +28,46 @@
import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.avalon.framework.parameters.Parameterizable;
import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.avalon.framework.service.ServiceException;
-import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.phoenix.interfaces.ConfigurationRepository;
-import org.apache.avalon.phoenix.interfaces.SystemManager;
+import org.apache.avalon.phoenix.interfaces.ConfigurationRepositoryMBean;
+import org.apache.excalibur.configuration.ConfigurationUtil;
import org.apache.excalibur.configuration.merged.ConfigurationMerger;
+import org.apache.excalibur.configuration.merged.ConfigurationSplitter;
+
import org.xml.sax.SAXException;
/**
- * Repository which persistently stores configuration information on disk
- *
- * THIS IS A WORK IN PROGRESS AND WILL CHANGE BEWARE OF USE BEWAAAARE!
+ * <p>
+ * A ConfigurationRepository that will store partial configurations on disk.
+ * </p><p>
+ * When a Configuration is retrieved from the repository, the configuration from
disk is
+ * <i>merged</i> with the configuration from the SAR. This merge is accompilished
via
+ * <code>ConfigurationMerger.merge</code>.
+ * </p><p>
+ * When a Configuration is stored in the repository, if there is no
<i>transient</i>, that is,
+ * configuration from the SAR, Configuration information, the first store is that.
Subsequent
+ * calls to storeConfiguration will persist the difference between the
<i>transient</i>
+ * Configuration and the passed configuration to disk. The differences are computed
via
+ * <code>ConfigurationSplitter.split</code>
+ * </p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a>
+ * @see org.apache.excalibur.configuration.merged.ConfigurationMerger
+ * @see org.apache.excalibur.configuration.merged.ConfigurationSplitter
*/
public class FileSystemPersistentConfigurationRepository extends AbstractLogEnabled
- implements ConfigurationRepository, Parameterizable, Configurable, Startable,
Serviceable,
- Initializable, PersistentConfigurationRepositoryMBean
+ implements ConfigurationRepository, Parameterizable, Configurable,
Initializable,
+ ConfigurationRepositoryMBean
{
private static final Resources REZ =
ResourceManager.getPackageResources(
FileSystemPersistentConfigurationRepository.class );
- private final HashMap m_persistedConfigurations = new HashMap();
-
- private final HashMap m_configurations = new HashMap();
-
- private ServiceManager m_serviceManager;
+ private final DefaultConfigurationRepository m_persistedConfigurations =
+ new DefaultConfigurationRepository();
+ private final DefaultConfigurationRepository
+ m_transientConfigurations = new DefaultConfigurationRepository();
+ private final DefaultConfigurationRepository
+ m_mergedConfigurations = new DefaultConfigurationRepository();
private String m_phoenixHome;
@@ -67,12 +78,6 @@
this.m_phoenixHome = parameters.getParameter( "phoenix.home", ".." );
}
- public void service( ServiceManager manager )
- throws ServiceException
- {
- this.m_serviceManager = manager;
- }
-
private Context createConfigurationContext()
{
final DefaultContext ctx = new DefaultContext();
@@ -86,25 +91,17 @@
{
this.m_storageDirectory = new File( constructStoragePath( configuration ) );
- ensureDirectoryExists( this.m_storageDirectory );
- }
-
- private void ensureDirectoryExists( File dir ) throws ConfigurationException
- {
- if( !dir.isDirectory() )
+ try
{
- if( dir.exists() )
- {
- final String message = REZ.getString( "config.error.dir.isfile",
dir );
+ FileUtil.forceMkdir( this.m_storageDirectory );
+ }
+ catch( IOException e )
+ {
+ final String message = REZ.getString( "config.error.dir.invalid",
+ this.m_storageDirectory );
- throw new ConfigurationException( message );
- }
- else if( !dir.mkdirs() )
- {
- final String message = REZ.getString( "config.error.dir.nomake",
dir );
+ throw new ConfigurationException( message, e );
- throw new ConfigurationException( message );
- }
}
}
@@ -122,7 +119,7 @@
if( opath instanceof String )
{
- return FileUtil.normalize( (String)opath );
+ return FileUtil.normalize( ( String ) opath );
}
else
{
@@ -141,32 +138,12 @@
}
}
- public void initialize() throws Exception
- {
- final SystemManager systemManager =
- (SystemManager)this.m_serviceManager.lookup( SystemManager.ROLE );
- final SystemManager context =
- systemManager.getSubContext( null, "component" ).getSubContext(
"ConfigurationManager",
-
"subcomponent" );
-
- context.register(
- "PersistentConfigurationRepository",
- this,
- new Class[]{PersistentConfigurationRepositoryMBean.class} );
- }
-
- public void start()
+ public void initialize()
throws Exception
{
loadConfigurations();
}
- public void stop()
- throws Exception
- {
- persistConfigurations();
- }
-
private void loadConfigurations()
throws IOException, SAXException, ConfigurationException
{
@@ -174,7 +151,7 @@
for( int i = 0; i < apps.length; i++ )
{
- loadConfigurations( apps[ i ] );
+ loadConfigurations( apps[i] );
}
}
@@ -188,10 +165,11 @@
for( int i = 0; i < blocks.length; i++ )
{
final String block =
- blocks[ i ].getName().substring( 0, blocks[ i ].getName().indexOf(
".xml" ) );
+ blocks[i].getName().substring( 0, blocks[i].getName().indexOf(
".xml" ) );
- this.m_persistedConfigurations.put( new ConfigurationKey( app, block ),
- builder.buildFromFile( blocks[ i ]
) );
+ m_persistedConfigurations.storeConfiguration( app,
+ block,
+ builder.buildFromFile(
blocks[i] ) );
if( getLogger().isDebugEnabled() )
getLogger().debug( "Loaded persistent configuration [app: " + app
@@ -199,20 +177,6 @@
}
}
- private void persistConfigurations()
- throws SAXException, IOException, ConfigurationException
- {
- for( Iterator i = this.m_persistedConfigurations.entrySet().iterator();
i.hasNext(); )
- {
- final Map.Entry entry = (Map.Entry)i.next();
- final ConfigurationKey key = (ConfigurationKey)entry.getKey();
-
- persistConfiguration( key.getApplication(),
- key.getBlock(),
- (Configuration)entry.getValue() );
- }
- }
-
private void persistConfiguration( final String application,
final String block,
final Configuration configuration )
@@ -232,10 +196,10 @@
}
public void removeConfiguration( String application, String block )
+ throws ConfigurationException
{
- final String name = application + "." + block;
-
- m_configurations.remove( name );
+ m_transientConfigurations.removeConfiguration( application, block );
+ m_mergedConfigurations.removeConfiguration( application, block );
}
public synchronized void storeConfiguration( final String application,
@@ -243,15 +207,43 @@
final Configuration configuration )
throws ConfigurationException
{
- final String name = application + "." + block;
- if( null == configuration )
+ if( m_transientConfigurations.hasConfiguration( application, block ) )
{
- m_configurations.remove( name );
+ if( !ConfigurationUtil.equals( configuration, getConfiguration(
application, block ) ) )
+ {
+ final Configuration layer =
+ ConfigurationSplitter.split( configuration,
+ getConfiguration( application,
+ block,
+
m_transientConfigurations ) );
+
+ m_persistedConfigurations.storeConfiguration( application, block,
layer );
+ m_mergedConfigurations.removeConfiguration( application, block );
+
+ try
+ {
+ persistConfiguration( application, block, layer );
+ }
+ catch( SAXException e )
+ {
+ final String message =
+ REZ.getString( "config.error.persist", application, block );
+
+ throw new ConfigurationException( message, e );
+ }
+ catch( IOException e )
+ {
+ final String message =
+ REZ.getString( "config.error.persist", application, block );
+
+ throw new ConfigurationException( message, e );
+ }
+ }
}
else
{
- m_configurations.put( name, configuration );
+ m_transientConfigurations.storeConfiguration( application, block,
configuration );
}
}
@@ -259,59 +251,74 @@
final String block )
throws ConfigurationException
{
- final String name = application + "." + block;
- final Configuration c = (Configuration)m_configurations.get( name );
- final Configuration p = (Configuration)m_persistedConfigurations.get(
- new ConfigurationKey( application, block ) );
+ if( m_mergedConfigurations.hasConfiguration( application, block ) )
+ {
+ return m_mergedConfigurations.getConfiguration( application, block );
+ }
+ else
+ {
+ final Configuration configuration = createMergedConfiguration(
application, block );
+
+ m_mergedConfigurations.storeConfiguration( application, block,
configuration );
+
+ return configuration;
+ }
+ }
+
+ private Configuration createMergedConfiguration( final String application,
+ final String block )
+ throws ConfigurationException
+ {
+ final Configuration t = getConfiguration( application, block,
m_transientConfigurations );
+ final Configuration p = getConfiguration( application, block,
m_persistedConfigurations );
- if( null == c && p == null )
+ if( null == t && p == null )
{
final String message = REZ.getString( "config.error.noconfig", block,
application );
+
throw new ConfigurationException( message );
}
- else if( null == c )
+ else if( null == t )
{
return p;
}
else if( null == p )
{
- return c;
+ return t;
}
else
{
- return ConfigurationMerger.merge( p, c );
+ return ConfigurationMerger.merge( p, t );
}
}
- public Configuration getPersistentConfiguration( String application, String
block )
- throws ConfigurationException
+ private Configuration getConfiguration( final String application,
+ final String block,
+ final DefaultConfigurationRepository
repository )
{
- final Configuration configuration =
(Configuration)m_persistedConfigurations.get(
- new ConfigurationKey( application, block ) );
-
- if( null == configuration )
+ if( repository.hasConfiguration( application, block ) )
{
- final String message = REZ.getString( "config.error.noconfig", block,
application );
- throw new ConfigurationException( message );
- }
-
- return configuration;
- }
-
- public void storePersistentConfiguration( String application,
- String block,
- Configuration configuration )
- throws ConfigurationException
- {
- final ConfigurationKey key = new ConfigurationKey( application, block );
+ try
+ {
+ return repository.getConfiguration( application, block );
+ }
+ catch( ConfigurationException e )
+ {
+ final String message = REZ.getString( "config.error.noconfig",
block, application );
- if( null == configuration )
- {
- m_persistedConfigurations.remove( key );
+ throw new CascadingRuntimeException( message, e );
+ }
}
else
{
- m_persistedConfigurations.put( key, configuration );
+ return null;
}
+ }
+
+ public boolean hasConfiguration( String application, String block )
+ {
+ return m_mergedConfigurations.hasConfiguration( application, block )
+ || m_transientConfigurations.hasConfiguration( application, block )
+ || m_persistedConfigurations.hasConfiguration( application, block );
}
}
1.7 +3 -2
jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/Resources.properties
Index: Resources.properties
===================================================================
RCS file:
/home/cvs/jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/configuration/Resources.properties,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Resources.properties 13 Jul 2002 19:46:24 -0000 1.6
+++ Resources.properties 26 Jul 2002 20:09:17 -0000 1.7
@@ -3,8 +3,9 @@
config.error.nonstring=Expected property to resolve as string [class: {0}]
config.error.missingproperty=Invalid property expansion in configuration [loc: {0}]
#
-config.error.dir.nomake=Unable to create directory: {0}
-config.error.dir.isfile={0} is not a directory
+config.error.dir.invalid={0} is an invalid directory
+#
+config.error.persist=Unable to persist configuration for Block {0} in application
{1}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>