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

Reply via email to