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]>