avalon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mcconn...@apache.org
Subject cvs commit: jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder XMLTypeCreator.java
Date Mon, 05 Aug 2002 12:39:38 GMT
mcconnell    2002/08/05 05:39:38

  Modified:    assembly/demo/src/etc demo.mf
               assembly/demo/src/java/org/apache/excalibur/playground
                        EmbeddedDemo.java SimpleComponent.xinfo
               assembly/src/etc kernel.xml
               assembly/src/java/org/apache/excalibur/merlin/assembly
                        ContainerManager.java ProfileRegistry.java
                        TypeManager.java
               assembly/src/java/org/apache/excalibur/merlin/assembly/resource
                        ProfileDesignator.java
               assembly/src/java/org/apache/excalibur/merlin/container
                        DefaultContainer.java StateEvent.java
               assembly/src/java/org/apache/excalibur/merlin/kernel
                        DefaultKernel.java
               assembly/src/java/org/apache/excalibur/merlin/model
                        ContainerDescriptor.java Profile.java
               assembly/src/java/org/apache/excalibur/meta
                        ConfigurationBuilder.java
               assembly/src/java/org/apache/excalibur/meta/info/builder
                        XMLTypeCreator.java
  Added:       assembly/src/java/org/apache/excalibur/meta type.dtd
  Log:
  Enhancements to support thread safe failure of a container.
  
  Revision  Changes    Path
  1.9       +3 -0      jakarta-avalon-excalibur/assembly/demo/src/etc/demo.mf
  
  Index: demo.mf
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/etc/demo.mf,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- demo.mf	2 Aug 2002 06:36:09 -0000	1.8
  +++ demo.mf	5 Aug 2002 12:39:37 -0000	1.9
  @@ -27,3 +27,6 @@
   
   Name: org/apache/excalibur/playground/EmbeddedDemo.class
   Avalon-Block: true
  +
  +Name: org/apache/excalibur/playground/CustomContainer.class
  +Avalon-Block: true
  
  
  
  1.6       +1 -0      jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/EmbeddedDemo.java
  
  Index: EmbeddedDemo.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/EmbeddedDemo.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- EmbeddedDemo.java	4 Aug 2002 11:49:35 -0000	1.5
  +++ EmbeddedDemo.java	5 Aug 2002 12:39:37 -0000	1.6
  @@ -99,6 +99,7 @@
           {
               getLogger().warn("manager return a null profile - cannot proceed");
           }
  +
       }
   
       //=======================================================================
  
  
  
  1.8       +4 -4      jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/SimpleComponent.xinfo
  
  Index: SimpleComponent.xinfo
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/demo/src/java/org/apache/excalibur/playground/SimpleComponent.xinfo,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SimpleComponent.xinfo	4 Aug 2002 11:49:35 -0000	1.7
  +++ SimpleComponent.xinfo	5 Aug 2002 12:39:37 -0000	1.8
  @@ -1,9 +1,9 @@
   <?xml version="1.0"?>
   <!DOCTYPE component-info
  -      PUBLIC "-//AVALON/Component Info DTD Version 1.0//EN"
  -             "http://jakarta.apache.org/avalon/componentinfo_1_0.dtd" >
  +      PUBLIC "-//AVALON/Component Type DTD Version 1.0//EN"
  +             "http://jakarta.apache.org/avalon/type_1_0.dtd" >
   
  -<component-info>
  +<type>
   
     <component>
       <name>simple</name>
  @@ -43,5 +43,5 @@
        </phase>
     </phases>
   
  -</component-info>
  +</type>
   
  
  
  
  1.24      +11 -9     jakarta-avalon-excalibur/assembly/src/etc/kernel.xml
  
  Index: kernel.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/etc/kernel.xml,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- kernel.xml	4 Aug 2002 11:49:36 -0000	1.23
  +++ kernel.xml	5 Aug 2002 12:39:37 -0000	1.24
  @@ -71,13 +71,6 @@
          </fileset>
        </classpath>
   
  -     <component name="embedded" class="org.apache.excalibur.playground.EmbeddedDemo" activation="true">
  -        <context>
  -          <import key="avalon:home" name="avalon:home"/>
  -          <import key="classloader" name="classloader"/>
  -        </context>
  -     </component>
  -
        <!--
        Declaration of the services hosted by this container.  Service container here 
        will be managed relative to other provider components at the same level and 
  @@ -132,11 +125,9 @@
   
          <container name="demo">
   
  -         <!--
            <categories priority="INFO">
              <category priority="WARN"  name="loader" />
            </categories>
  -         -->
   
            <!--
            Including the next entry demonstrates the resolution of a dependency via a profile
  @@ -158,6 +149,17 @@
                <message>This is a custom message.</message>
              </configuration>
   
  +         </component>
  +
  +         <!--
  +         Demonstration of a component that contains an embedded kernel.
  +         -->
  +         <component name="embedded" 
  +           class="org.apache.excalibur.playground.EmbeddedDemo" activation="true">
  +           <context>
  +             <import key="avalon:home" name="avalon:home"/>
  +             <import key="classloader" name="classloader"/>
  +           </context>
            </component>
   
          </container>
  
  
  
  1.6       +13 -21    jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/ContainerManager.java
  
  Index: ContainerManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/ContainerManager.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ContainerManager.java	4 Aug 2002 11:49:36 -0000	1.5
  +++ ContainerManager.java	5 Aug 2002 12:39:37 -0000	1.6
  @@ -182,7 +182,6 @@
       * The container model that contains the container's classpath declaration, 
       * explicit profile declarations, and defintions of the subsidiary containers.
       */
  -    private ContainerDescriptor m_descriptor;
   
       private CategoriesDescriptor m_categories;
   
  @@ -214,13 +213,13 @@
       }
   
      /**
  -    * Creation of a new <code>KernelManager</code>.
  -    * @param classloader the parent classloader
  +    * Creation of a new <code>ContainerManager</code>.
  +    * @param parent the parent classloader
       * @param name the name to assign to this classloader (used with logging)
       */
  -    public ContainerManager( ClassLoader classloader, String name )
  +    public ContainerManager( ClassLoader parent, String name )
       {
  -        this( classloader, new ContainerDescriptor( name ) , true );
  +        this(  parent, name, true );
       }
   
      /**
  @@ -230,18 +229,17 @@
       * @param root if TRUE, logging catagories are top level, otherwise logging 
       *    catagories are subsidary to the parent
       */
  -    public ContainerManager( ClassLoader parent, ContainerDescriptor descriptor, boolean root )
  +    public ContainerManager( ClassLoader parent, String name, boolean root )
       {
           super( parent );
   
           m_root = root;
  -        m_descriptor = descriptor;
  -        m_name = descriptor.getName();
  +        m_name = name;
   
           if( parent instanceof ContainerManager )
           {
               m_parent = (ContainerManager) parent;
  -            m_map = new DependencyGraph( m_parent.getDependencyMap() );
  +            m_map = m_parent.getDependencyMap();
           }
           else 
           {
  @@ -352,7 +350,7 @@
           //
   
           getLogger().debug(
  -          "creating manager '" + m_descriptor.getName() 
  +          "creating manager '" + m_name 
             + "' " + System.identityHashCode( this ) 
             + " with parent: " + System.identityHashCode( getParent() ) );
   
  @@ -487,7 +485,8 @@
       {
           try
           {
  -            ContainerManager loader = new ContainerManager( this, descriptor, root );
  +            final String name = descriptor.getName();
  +            ContainerManager loader = new ContainerManager( this, name, root );
               DefaultContext context = new DefaultContext( m_context );
               context.put( ContainerManager.CATEGORIES_DESCRIPTOR_KEY, descriptor.getCategories() );
               context.put( TypeManager.CLASSPATH_DESCRIPTOR_KEY, descriptor.getClasspath() );
  @@ -515,14 +514,6 @@
       }
   
      /**
  -    * Return the container descriptor that this manager is managing.
  -    */
  -    public ContainerDescriptor getContainerDescriptor()
  -    {
  -        return m_descriptor;
  -    }
  -
  -   /**
       * Returns the path name of this manager.
       * @return the manager's path
       */
  @@ -705,7 +696,8 @@
               if(( resource == null ) && create )
               {
                   final String name = getPath() + DELIMITER + profile.getName();
  -                ProfileDesignator designator = new ProfileDesignator( name, profile, m_helper, m_provider );
  +                ProfileDesignator designator = 
  +                  new ProfileDesignator( name, profile, m_helper, m_provider );
                   designator.enableLogging( getLocalLogger().getChildLogger( "resource" ) );
                   m_resources.put( profile, designator );
                   resource = designator;
  
  
  
  1.6       +13 -13    jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/ProfileRegistry.java
  
  Index: ProfileRegistry.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/ProfileRegistry.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ProfileRegistry.java	4 Aug 2002 11:49:36 -0000	1.5
  +++ ProfileRegistry.java	5 Aug 2002 12:39:37 -0000	1.6
  @@ -50,7 +50,7 @@
      /**
       * Classloader used to load a service profile selector.
       */
  -    private ContainerManager m_classloader;
  +    private ContainerManager m_manager;
   
      /**
       * The dependency map that is populated during the assembly process.
  @@ -63,12 +63,12 @@
   
      /**
       * Creation of a new service registry.
  -    * @param loader the registry class loader
  +    * @param manager the container manager
       * @param map the dependency map
       */
  -    public ProfileRegistry( ContainerManager loader, DependencyGraph map )
  +    public ProfileRegistry( ContainerManager manager, DependencyGraph map )
       {
  -        m_classloader = loader;
  +        m_manager = manager;
           m_map = map;
       }
   
  @@ -94,8 +94,8 @@
               assembleProfile( profile, visited, "" );
   
               final String name = 
  -              m_classloader.getPath() + ContainerManager.DELIMITER + profile.getName();
  -            final Resource resource = m_classloader.getResource( profile, true );
  +              m_manager.getPath() + ContainerManager.DELIMITER + profile.getName();
  +            final Resource resource = m_manager.getResource( profile, true );
               getLogger().debug( "created explicit resource for: " + name );
               m_map.add( profile );
           }
  @@ -109,7 +109,7 @@
       */
       Profile[] getProfiles( ReferenceDescriptor service )
       {
  -        return m_classloader.getProfiles( service );
  +        return m_manager.getProfiles( service );
       }
   
      /**
  @@ -119,7 +119,7 @@
       */
       Profile[] getProfiles( PhaseDescriptor phase )
       {
  -        return m_classloader.getProfiles( phase );
  +        return m_manager.getProfiles( phase );
       }
   
   
  @@ -177,7 +177,7 @@
                   // argument contains the selection policy to apply
                   //
                   
  -                Profile supplier = m_classloader.getProfile( dependency );
  +                Profile supplier = m_manager.getProfile( dependency );
                   if( supplier == null )
                   {
                       final String message =
  @@ -196,7 +196,7 @@
                   //
   
                   getLogger().debug( pad + "  selection: " + supplier );
  -                Resource resource = m_classloader.getResource( supplier, true );
  +                Resource resource = m_manager.getResource( supplier, true );
                   profile.addProvider( role, resource );
                   m_map.add( supplier );
               }
  @@ -230,7 +230,7 @@
                   // argument contains the selection policy to apply
                   //
                   
  -                Profile supplier = m_classloader.getProfile( phase );
  +                Profile supplier = m_manager.getProfile( phase );
                   if( supplier == null )
                   {
                       final String message =
  @@ -249,7 +249,7 @@
   
                   getLogger().debug( pad + "  selection: " + supplier );
                   Resource resource = 
  -                  m_classloader.getResource( supplier, true );
  +                  m_manager.getResource( supplier, true );
                   profile.addExtension( phase, supplier, resource );
                   m_map.add( supplier );
   
  
  
  
  1.6       +35 -17    jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/TypeManager.java
  
  Index: TypeManager.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/TypeManager.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TypeManager.java	4 Aug 2002 06:43:20 -0000	1.5
  +++ TypeManager.java	5 Aug 2002 12:39:37 -0000	1.6
  @@ -83,6 +83,8 @@
       */
       public static final String CLASSPATH_DESCRIPTOR_KEY = "classpath";
   
  +    private static final String DEFAULT_CONTAINER_CLASS = 
  +      "org/apache/excalibur/merlin/container/DefaultContainer";
   
       //===================================================================
       // state
  @@ -123,14 +125,6 @@
       //===================================================================
   
      /**
  -    * Creation of a new type manager.
  -    */
  -    public TypeManager( )
  -    {
  -        super( new URL[ 0 ], Thread.currentThread().getContextClassLoader() );
  -    }
  -
  -   /**
       * Creation of a new type manager using the supplied parent class loader.
       * @param parent the parent class loader
       */
  @@ -239,6 +233,16 @@
           }
   
           //
  +        // make sure the Merlin default container type is declared if this is the 
  +        // root classloader
  +        //
  +
  +        if( !( getParent() instanceof TypeManager ))
  +        {
  +            m_types.addType( DEFAULT_CONTAINER_CLASS );
  +        }
  +
  +        //
           // install the classpath
           //
   
  @@ -371,7 +375,7 @@
           {
               URL url = extensions[ i ].toURL();
               getLocalLogger().info("extension: " + url ); 
  -            super.addURL( url );
  +            addURL( url ); // was super.addURL( url )
           }
           load( stack );
           for( int i = 0; i < urls.length; i++ )
  @@ -382,8 +386,6 @@
           getLocalLogger().debug( "classpath addition complete" );
       }
   
  -    
  -
       /**
        * Load the supplied jar files recursively.
        * For each entry in the stack, try to load it and
  @@ -466,14 +468,30 @@
           }
           else
           {
  -            ClassLoader parent = getParent();
  -            if( parent instanceof TypeManager )
  +
  +            //
  +            // try to construct the type 
  +            //
  +
  +            try
               {
  -                return ((TypeManager)parent).getType( classname );
  +                return m_types.addType( classname );
               }
  -            else
  +            catch( Throwable e )
               {
  -                throw new TypeException("Type not found, classname: " + classname );
  +                //
  +                // otherwise try to locate the type form the parent classloader
  +                //
  +
  +                ClassLoader parent = getParent();
  +                if( parent instanceof TypeManager )
  +                {
  +                    return ((TypeManager)parent).getType( classname );
  +                }
  +                else
  +                {
  +                    throw new TypeException("Type not found, classname: " + classname );
  +                }
               }
           }
       }
  
  
  
  1.7       +13 -13    jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/resource/ProfileDesignator.java
  
  Index: ProfileDesignator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/assembly/resource/ProfileDesignator.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- ProfileDesignator.java	2 Aug 2002 09:34:56 -0000	1.6
  +++ ProfileDesignator.java	5 Aug 2002 12:39:37 -0000	1.7
  @@ -45,7 +45,7 @@
       /**
        * A singleton reference to the instantiated service.
        */
  -    private Object m_service;
  +    private Object m_object;
   
       /**
        * The lifecycle helper.
  @@ -106,7 +106,7 @@
       /**
        * Returns the path of the resource.
        *
  -     * @return the simbolic path of the resource
  +     * @return the symbolic path of the resource
        */
       public String getPath()
       {
  @@ -132,10 +132,10 @@
       public Object create() throws Exception
       {
           if( getState() == STARTED )
  -          return m_service;
  -        m_service = m_helper.startup( m_path, m_profile, m_provider );
  +          return m_object;
  +        m_object = m_helper.startup( m_path, m_profile, m_provider );
           setState( STARTED );
  -        return m_service;
  +        return m_object;
       }
   
       /**
  @@ -146,7 +146,7 @@
        */
       public Object access() throws Exception
       {
  -        if( m_service == null )
  +        if( m_object == null )
           {
               create();
           }
  @@ -159,10 +159,10 @@
           PhaseDescriptor[] phases = m_profile.getType().getPhases();
           for( int i=0; i<phases.length; i++ )
           {
  -            processExtension( ExtensionDescriptor.ACCESS, phases[i], m_service, context );
  +            processExtension( ExtensionDescriptor.ACCESS, phases[i], m_object, context );
           }
   
  -        return m_service;
  +        return m_object;
       }
   
       /**
  @@ -181,7 +181,7 @@
               PhaseDescriptor[] phases = m_profile.getType().getPhases();
               for( int i=0; i<phases.length; i++ )
               {
  -                 processExtension( ExtensionDescriptor.RELEASE, phases[i], m_service, context );
  +                 processExtension( ExtensionDescriptor.RELEASE, phases[i], m_object, context );
               }
           }
       }
  @@ -191,10 +191,10 @@
        */
       public void destroy() throws Exception
       {
  -        if( m_service != null )
  +        if( m_object != null )
           {
  -            release( m_service );
  -            m_helper.shutdown( m_path, m_profile, m_service );
  +            release( m_object );
  +            m_helper.shutdown( m_path, m_profile, m_object );
           }
           setState( STOPPED );
       }
  
  
  
  1.25      +60 -20    jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/DefaultContainer.java
  
  Index: DefaultContainer.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/DefaultContainer.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- DefaultContainer.java	4 Aug 2002 06:43:20 -0000	1.24
  +++ DefaultContainer.java	5 Aug 2002 12:39:37 -0000	1.25
  @@ -44,6 +44,7 @@
   import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
   import org.apache.avalon.framework.configuration.ConfigurationException;
   import org.apache.avalon.framework.configuration.Configurable;
  +import org.apache.avalon.framework.parameters.Parameters;
   import org.apache.avalon.framework.context.Context;
   import org.apache.avalon.framework.context.Contextualizable;
   import org.apache.avalon.framework.context.ContextException;
  @@ -71,6 +72,7 @@
   import org.apache.excalibur.merlin.model.ClasspathDescriptor;
   import org.apache.excalibur.merlin.model.Profile;
   import org.apache.excalibur.merlin.model.Resource;
  +import org.apache.excalibur.merlin.model.ContextDirective;
   import org.apache.excalibur.merlin.model.CategoriesDescriptor;
   import org.apache.excalibur.merlin.model.builder.XMLContainerUtil;
   import org.apache.excalibur.merlin.Controller;
  @@ -95,6 +97,11 @@
       */
       public static final String MANAGER_KEY = "manager";
   
  +   /**
  +    * Context key used to locate the container descriptor.
  +    */
  +    public static final String DESCRIPTOR_KEY = "descriptor";
  +
       private static final Resources REZ =
           ResourceManager.getPackageResources( DefaultContainer.class );
   
  @@ -175,7 +182,7 @@
       public void contextualize( Context context ) throws ContextException
       {
           m_manager = (ContainerManager) context.get( MANAGER_KEY );
  -        m_descriptor = m_manager.getContainerDescriptor();
  +        m_descriptor = (ContainerDescriptor) context.get( DESCRIPTOR_KEY );
       }
   
       //=======================================================================
  @@ -209,15 +216,6 @@
           try
           {
               handleInitialize();
  -        }
  -        catch( Throwable e )
  -        {
  -            final String error = "Unexpected error during container initialization.";
  -            throw new ContainerRuntimeException( error, e );
  -        }
  -
  -        try
  -        {
               while( m_action.intValue() < DISPOSED )
               {
                   synchronized( m_action )
  @@ -244,7 +242,8 @@
           catch( Throwable e )
           {
               final String error = "Unexpected error during container execution.";
  -            throw new ContainerRuntimeException( error, e );
  +            Throwable exception = new ContainerException( error, e );
  +            handleDispose( exception );
           }
       }
   
  @@ -688,13 +687,34 @@
       }
   
      /**
  -    * Handle disposal of the container.
  +    * Handle normal disposal of the container.
       */
       private void handleDispose()
       {
  +        handleDispose( null );
  +    }
  +
  +   /**
  +    * Handle disposal of the container.
  +    */
  +    private void handleDispose( Throwable error )
  +    {
  +        if( error != null )
  +        {
  +            final String message = "Container disposal triggered by abnormal condition.";
  +            getLogger().error( message, error );
  +        }
  +
           if( m_state == STARTED )
           {
  -               handleShutdown();
  +             try
  +             {
  +                 handleShutdown();
  +             }
  +             catch( Throwable e )
  +             {
  +                 // ignore
  +             }
           }
   
           //
  @@ -719,7 +739,7 @@
   
           getLogger().debug("done");
           m_state = DISPOSED;
  -        fireStateChange( new StateEvent( this, DISPOSED ) );
  +        fireStateChange( new StateEvent( this, DISPOSED, error ) );
       }
   
       //=======================================================================
  @@ -734,7 +754,8 @@
       {
           synchronized( m_stateListeners )
   	  {
  -            StateListener[] listeners = (StateListener[]) m_stateListeners.toArray( new StateListener[0] );
  +            StateListener[] listeners = 
  +              (StateListener[]) m_stateListeners.toArray( new StateListener[0] );
               for( int i=0; i<listeners.length; i++ )
               {
                   StateListener listener = listeners[i];
  @@ -794,17 +815,34 @@
       */
       private DefaultContainer createContainer( Configuration config ) throws Exception
       {
  -        ContainerManager manager = null;
  +        ContainerManager manager;
  +        ContainerDescriptor descriptor;
           String name = null;
           try
           {
               name = config.getAttribute("name");
  +            Type type = m_manager.getType( this.getClass().getName() );
  +
               ClasspathDescriptor classpath = 
                 m_creator.createClasspathDescriptor( config.getChild("classpath") );
               CategoriesDescriptor categories = 
                 m_creator.createCategoriesDescriptor( name, config.getChild("categories") );
  -            ContainerDescriptor descriptor = 
  -              new ContainerDescriptor( name, classpath, categories );
  +            final boolean enabled = 
  +              config.getAttributeAsBoolean( "enabled", true );
  +            final boolean activation = 
  +              config.getAttributeAsBoolean( "activation", false );
  +            final Parameters params = 
  +              Parameters.fromConfiguration( config.getChild("parameters") );
  +            final ContextDirective context = 
  +              m_creator.createContextDirective( config.getChild("context") );
  +            final Configuration conf = config.getChild("configuration");
  +
  +            descriptor = 
  +              new ContainerDescriptor( 
  +                name, params, conf, context, categories, type, enabled, 
  +                activation, ContainerDescriptor.EXPLICIT, classpath 
  +              );
  +
               manager = m_manager.createContainerManager( descriptor, false );
           }
           catch( Throwable e )
  @@ -818,11 +856,13 @@
               getLogger().debug("creating subsidiary container: " + name );
               DefaultContext context = new DefaultContext();
               context.put( MANAGER_KEY, manager );
  +            context.put( DESCRIPTOR_KEY, descriptor );
               context.makeReadOnly();
     
               final String classname = 
                 config.getAttribute( "class", DefaultContainer.class.getName() );
               DefaultContainer container = createContainerInstance( manager, classname );
  +
               final Logger logger = getLogger().getChildLogger( name );
               container.enableLogging( logger );
               container.contextualize( context );
  @@ -860,7 +900,7 @@
       }
   
      /**
  -    * Internel utility to sleep a bit.
  +    * Internal utility to sleep a bit.
       */
       private void sleep()
       {
  
  
  
  1.2       +31 -0     jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/StateEvent.java
  
  Index: StateEvent.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/container/StateEvent.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- StateEvent.java	4 Aug 2002 06:43:20 -0000	1.1
  +++ StateEvent.java	5 Aug 2002 12:39:37 -0000	1.2
  @@ -26,6 +26,11 @@
       */
       private final int m_state;
   
  +   /**
  +    * Error condition
  +    */
  +    private Throwable m_error;
  +
       //============================================================
       // constructor
       //============================================================
  @@ -39,8 +44,22 @@
       */
       public StateEvent( Container container, int state ) 
       {
  +        this( container, state, null );
  +    }
  +
  +   /**
  +    * Creation of a new StateEvent.
  +    *
  +    * @param container the source container
  +    * @param state int value of (@link Container#INITIALIZED}, {@link Container#STARTED}, 
  +    *    {@link Container#STOPPED} or {@link Container#DISPOSED}
  +    * @param error an error condition triggering the state change
  +    */
  +    public StateEvent( Container container, int state, Throwable error ) 
  +    {
           super( container );
           m_state = state;
  +        m_error = error;
       }
   
       //============================================================
  @@ -64,5 +83,17 @@
       {
           return m_state;
       }
  +
  +   /**
  +    * Returns a throwable causing the state change.  This is normally a 
  +    * null value.  If not null, the transition was a result of an error
  +    * condition.
  +    * @return the error condition
  +    */
  +    public Throwable getError()
  +    {
  +        return m_error;
  +    }
  +
   }
   
  
  
  
  1.29      +87 -65    jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultKernel.java
  
  Index: DefaultKernel.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/kernel/DefaultKernel.java,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- DefaultKernel.java	4 Aug 2002 06:43:20 -0000	1.28
  +++ DefaultKernel.java	5 Aug 2002 12:39:37 -0000	1.29
  @@ -44,6 +44,7 @@
   import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
   import org.apache.avalon.framework.configuration.ConfigurationException;
   import org.apache.avalon.framework.configuration.Configurable;
  +import org.apache.avalon.framework.parameters.Parameters;
   import org.apache.avalon.framework.context.Context;
   import org.apache.avalon.framework.context.Contextualizable;
   import org.apache.avalon.framework.context.ContextException;
  @@ -73,6 +74,7 @@
   import org.apache.excalibur.merlin.model.Profile;
   import org.apache.excalibur.merlin.model.CategoriesDescriptor;
   import org.apache.excalibur.merlin.model.ContainerDescriptor;
  +import org.apache.excalibur.merlin.model.ContextDirective;
   import org.apache.excalibur.merlin.model.Resource;
   import org.apache.excalibur.merlin.assembly.TypeManager;
   import org.apache.excalibur.merlin.assembly.ContainerManager;
  @@ -259,6 +261,90 @@
   
       }
   
  +   /**
  +    * Internal utility to create the root container.
  +    *
  +    * @param descriptor the subsidiary container descriptor
  +    * @exception Exception is an error occurs
  +    */
  +    private DefaultContainer createContainer( Configuration config ) throws Exception
  +    {
  +        ContainerManager manager;
  +        ContainerDescriptor descriptor;
  +        String name = null;
  +        String classname = null;
  +        try
  +        {
  +            name = config.getAttribute( "name", "root" );
  +            classname = config.getAttribute( "class", DefaultContainer.class.getName() );
  +            final Type type = m_manager.getType( classname );
  +            final ClasspathDescriptor classpath = 
  +              m_creator.createClasspathDescriptor( config.getChild("classpath") );
  +            final CategoriesDescriptor categories = 
  +              m_creator.createCategoriesDescriptor( name, config.getChild("categories") );
  +            final boolean enabled = 
  +              config.getAttributeAsBoolean( "enabled", true );
  +            final boolean activation = 
  +              config.getAttributeAsBoolean( "activation", false );
  +            final Parameters params = 
  +              Parameters.fromConfiguration( config.getChild("parameters") );
  +            final ContextDirective context = 
  +              m_creator.createContextDirective( config.getChild("context") );
  +            final Configuration conf = config.getChild("configuration");
  +
  +            descriptor = 
  +              new ContainerDescriptor( 
  +                name, params, conf, context, categories, type, enabled, 
  +                activation, ContainerDescriptor.EXPLICIT, classpath 
  +              );
  +
  +            manager = m_manager.createContainerManager( descriptor, true );
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = "Error establishing subsidiary container manager.";
  +            throw new KernelException( error, e );
  +        }
  +
  +        try
  +        {
  +            getLogger().debug("creating root container: " + name );
  +            DefaultContext context = new DefaultContext();
  +            context.put( DefaultContainer.MANAGER_KEY, manager );
  +            context.put( DefaultContainer.DESCRIPTOR_KEY, descriptor );
  +            context.makeReadOnly();
  +  
  +            DefaultContainer container = createContainerInstance( m_manager, classname );
  +            Logger logger = manager.getLoggingManager().getLoggerForCategory( name );
  +            container.enableLogging( logger );
  +            container.contextualize( context );
  +            container.configure( config );
  +            container.addStateListener( this );
  +            container.initialize( );
  +            return container;
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = "Error establishing root container.";
  +            throw new KernelException( error, e );
  +        }
  +    }
  +
  +    private DefaultContainer createContainerInstance( 
  +      ClassLoader loader, String classname ) throws KernelException
  +    {
  +        try
  +        {
  +           return (DefaultContainer) loader.loadClass( classname ).newInstance();
  +        }
  +        catch( Throwable e )
  +        {
  +            final String error = 
  +              "Cannot create a container from the classname: " + classname;
  +            throw new KernelException( error, e );
  +        }
  +    }
  +
       //=======================================================================
       // Startable
       //=======================================================================
  @@ -451,70 +537,6 @@
       // internals
       //=======================================================================
   
  -   /**
  -    * Internal utility to create the root container.
  -    *
  -    * @param descriptor the subsidiary container descriptor
  -    * @exception Exception is an error occurs
  -    */
  -    private DefaultContainer createContainer( Configuration config ) throws Exception
  -    {
  -        ContainerManager manager = null;
  -        String name = null;
  -        String classname = null;
  -        try
  -        {
  -            name = config.getAttribute( "name", "root" );
  -            classname = config.getAttribute( "class", DefaultContainer.class.getName() );
  -            ClasspathDescriptor classpath = 
  -              m_creator.createClasspathDescriptor( config.getChild("classpath") );
  -            CategoriesDescriptor categories = 
  -              m_creator.createCategoriesDescriptor( name, config.getChild("categories") );
  -            ContainerDescriptor descriptor = 
  -              new ContainerDescriptor( name, classpath, categories );
  -            manager = m_manager.createContainerManager( descriptor, true );
  -        }
  -        catch( Throwable e )
  -        {
  -            final String error = "Error establishing subsidiary container manager.";
  -            throw new KernelException( error, e );
  -        }
  -
  -        try
  -        {
  -            getLogger().debug("creating root container: " + name );
  -            DefaultContext context = new DefaultContext();
  -            context.put( DefaultContainer.MANAGER_KEY, manager );
  -            context.makeReadOnly();
  -  
  -            DefaultContainer container = createContainerInstance( manager, classname );
  -            Logger logger = manager.getLoggingManager().getLoggerForCategory( name );
  -            container.enableLogging( logger );
  -            container.contextualize( context );
  -            container.configure( config );
  -            container.addStateListener( this );
  -            container.initialize( );
  -            return container;
  -        }
  -        catch( Throwable e )
  -        {
  -            final String error = "Error establishing root container.";
  -            throw new KernelException( error, e );
  -        }
  -    }
  -
  -    private DefaultContainer createContainerInstance( ClassLoader loader, String classname ) throws KernelException
  -    {
  -        try
  -        {
  -           return (DefaultContainer) loader.loadClass( classname ).newInstance();
  -        }
  -        catch( Throwable e )
  -        {
  -            final String error = "Cannot create a container from the classname: " + classname;
  -            throw new KernelException( error, e );
  -        }
  -    }
   
      /**
       * Internel utility to sleep a bit.
  
  
  
  1.11      +32 -57    jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ContainerDescriptor.java
  
  Index: ContainerDescriptor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/ContainerDescriptor.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- ContainerDescriptor.java	2 Aug 2002 06:34:51 -0000	1.10
  +++ ContainerDescriptor.java	5 Aug 2002 12:39:37 -0000	1.11
  @@ -9,9 +9,13 @@
   
   import java.util.ArrayList;
   import org.apache.avalon.framework.logger.Logger;
  +import org.apache.avalon.framework.configuration.Configuration;
  +import org.apache.avalon.framework.configuration.ConfigurationException;
  +import org.apache.avalon.framework.parameters.Parameters;
   import org.apache.excalibur.merlin.assembly.ContainerManager;
   import org.apache.excalibur.merlin.model.Profile;
   import org.apache.excalibur.merlin.model.CategoriesDescriptor;
  +import org.apache.excalibur.meta.info.Type;
   
   
   /**
  @@ -85,7 +89,7 @@
    * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
    * @version $Revision$ $Date$
    */
  -public class ContainerDescriptor
  +public class ContainerDescriptor extends Profile
   {
       /**
        * The component described within the scope of the container.
  @@ -98,63 +102,44 @@
       public static final String DELIMITER = "/";
   
       /**
  -     * The container name
  -     */
  -    private final String m_name;
  -
  -    /**
        * The container classpath
        */
       private final ClasspathDescriptor m_classpath;
   
       /**
  -     * The container logging categores
  -     */
  -    private final CategoriesDescriptor m_categories;
  -
  -    /**
        * Create a ContainerDescriptor instance.
  -     * @param parent the parent container
  -     * @param name the container name
  -     * @param manager the containers type manager
  -     */
  -    public ContainerDescriptor( final String name )
  +     *
  +     * @param name the abstract name of component meta data instance
  +     * @param parameters the parameters instance to use during type instantiation
  +     * @param configuration the configuration instance to use during type instantiation
  +     * @param context the context instance to use during type instantiation
  +     * @param logger the root logger to be used by an instance established from the profile
  +     * @param type the type of component that this profile qualifies
  +     * @param enabled the enabled state of the component profile
  +     * @param activation TRUE if activation on startup, FALSE to activate on request 
  +     * @param mode the creation mode (either IMPLICIT, PACKAGED, or EXPLICIT)
  +     * @param mode the classpath descriptor
  +     */
  +    public ContainerDescriptor( final String name,
  +                           final Parameters parameters,
  +                           final Configuration configuration,
  +                           final ContextDirective context,
  +                           final CategoriesDescriptor categories,
  +                           final Type type,
  +                           final boolean enabled,
  +                           final boolean activation,
  +                           final int mode,
  +                           final ClasspathDescriptor classpath )
       {
  -        this( name, new ClasspathDescriptor(), new CategoriesDescriptor( name ) );
  -    }
  -
  +        super( 
  +          name, parameters, configuration, context, categories, type, enabled, 
  +          activation, mode 
  +        );
   
  -    /**
  -     * Create a ContainerDescriptor instance.
  -     * @param parent the parent container
  -     * @param name the container name
  -     * @param manager the containers type manager
  -     */
  -    public ContainerDescriptor( 
  -                           final String name, 
  -                           final ClasspathDescriptor classpath,
  -                           final CategoriesDescriptor categories )
  -    {
  -        if( name == null )
  -          throw new NullPointerException("name");
           if( classpath == null )
             throw new NullPointerException("classpath");
  -        if( categories== null )
  -          throw new NullPointerException("categories");
   
  -        m_name = name;
           m_classpath = classpath;
  -        m_categories = categories;
  -    }
  -
  -    /**
  -     * Return the instance name.
  -     *
  -     * @return the name of the container
  -     */
  -    public String getName()
  -    {
  -        return m_name;
       }
   
       /**
  @@ -165,16 +150,6 @@
       public ClasspathDescriptor getClasspath()
       {
           return m_classpath;
  -    }
  -
  -    /**
  -     * Return the categories descriptor
  -     *
  -     * @return the categories descriptor
  -     */
  -    public CategoriesDescriptor getCategories()
  -    {
  -        return m_categories;
       }
   
       /**
  
  
  
  1.18      +44 -1     jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Profile.java
  
  Index: Profile.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/merlin/model/Profile.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- Profile.java	4 Aug 2002 14:58:30 -0000	1.17
  +++ Profile.java	5 Aug 2002 12:39:37 -0000	1.18
  @@ -182,6 +182,49 @@
       private final boolean m_activation;
   
       /**
  +     * Create a Profile instance without parameters.
  +     *
  +     * @param name the abstract name of component meta data instance
  +     * @param configuration the configuration instance to use during type instantiation
  +     * @param context the context instance to use during type instantiation
  +     * @param logger the root logger to be used by an instance established from the profile
  +     * @param type the type of component that this profile qualifies
  +     * @param enabled the enabled state of the component profile
  +     * @param activation TRUE if activation on startup, FALSE to activate on request 
  +     * @param mode the creation mode (either IMPLICIT, PACKAGED, or EXPLICIT)
  +     */
  +    public Profile( final String name,
  +                           final Type type,
  +                           final CategoriesDescriptor categories )
  +    {
  +        this( name, null, null, null, categories, type, true, false, EXPLICIT );
  +    }
  +
  +    /**
  +     * Create a Profile instance without parameters.
  +     *
  +     * @param name the abstract name of component meta data instance
  +     * @param configuration the configuration instance to use during type instantiation
  +     * @param context the context instance to use during type instantiation
  +     * @param logger the root logger to be used by an instance established from the profile
  +     * @param type the type of component that this profile qualifies
  +     * @param enabled the enabled state of the component profile
  +     * @param activation TRUE if activation on startup, FALSE to activate on request 
  +     * @param mode the creation mode (either IMPLICIT, PACKAGED, or EXPLICIT)
  +     */
  +    public Profile( final String name,
  +                           final Configuration configuration,
  +                           final ContextDirective context,
  +                           final CategoriesDescriptor categories,
  +                           final Type type,
  +                           final boolean enabled,
  +                           final boolean activation,
  +                           final int mode )
  +    {
  +        this( name, null, configuration, context, categories, type, enabled, activation, mode );
  +    }
  +
  +    /**
        * Create a Profile instance.
        *
        * @param name the abstract name of component meta data instance
  
  
  
  1.3       +4 -1      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/ConfigurationBuilder.java
  
  Index: ConfigurationBuilder.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/ConfigurationBuilder.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- ConfigurationBuilder.java	20 Jul 2002 00:54:07 -0000	1.2
  +++ ConfigurationBuilder.java	5 Aug 2002 12:39:38 -0000	1.3
  @@ -31,6 +31,9 @@
           new DTDInfo( "-//AVALON/Component Info DTD Version 1.0//EN",
                        "http://jakarta.apache.org/avalon/componentinfo_1_0.dtd",
                        "org/apache/excalibur/meta/componentinfo.dtd" ),
  +        new DTDInfo( "-//AVALON/Component Type DTD Version 1.0//EN",
  +                     "http://jakarta.apache.org/avalon/type_1_0.dtd",
  +                     "org/apache/excalibur/meta/type.dtd" ),
       };
   
       private static final DTDResolver c_resolver =
  
  
  
  1.1                  jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/type.dtd
  
  Index: type.dtd
  ===================================================================
  <!--
  
     This is the DTD defining the Avalon Meta Model Type 1.0
     descriptor (XML) file format/syntax.
  
     Author: Stephen McConnell <mcconnell@apache.org>
     Author: Peter Donald <peter@apache.org>
  
     An xinfo file is an XML file used to describe Component types and is located side-by-side with
     the .class file of the component. It describes the services the component requires to operate
     (its dependecies), the services the component is capable of offerring other component, the 
     context entrys that component requires, logging catagories that the compoent may use, and other 
     support meta data in the form of attributes.
  
     Copyright (C) The Apache Software Foundation. All rights reserved.
  
     This software is published under the terms of the Apache Software License
     version 1.1, a copy of which has been included  with this distribution in
     the LICENSE.txt file.
  
    -->
  
  <!--
  The component-info is the document root, it defines:
  
  component    the specifc details about this component
  loggers      the loggers used by this component
  context      the context required by this component
  services     the services offered by this component
  dependencies the services that this component require to operate
  phase        the lifecycle phases that this component manages
  
  -->
  <!ELEMENT type (component, loggers?, context?, services?, dependencies?, phases?, extensions?)>
  <!--
    !ATTLIST component-info id ID #IMPLIED
            xmlns CDATA #FIXED "http://jakarta.apache.org/avalon/componentinfo_1_0.dtd"
   -->
  
  <!--
  The component element describes the component, it defines:
  
  name	        the human readable name of component type. Must be a string
               containing alphanumeric characters, '.', '_' and starting
               with a letter.
  version	     the version of the component in (in the format #.#.#, #.# or # where
               # is a integer
  -->
  <!ELEMENT component      (name?,version,attributes?)>
    <!ELEMENT name         (#PCDATA) >
    <!ELEMENT version      (#PCDATA) >
  
  <!--
  The logger element defines the loggers that are available to component.
  The element has one attribute specifying name of Logger. It contains:
  
  attributes	  Optional attributes about logger
  -->
  <!ELEMENT logger   (attributes?) >
    <!ATTLIST logger name CDATA #IMPLIED >
  
  <!--
  The context element defines what values and type of context
  is available to component.
  It contains:
  
  entrys    	  Key value pairs that component uses
  attributes	  Optional attributes about service
  -->
  <!ELEMENT context   (entry*,attributes?) >
    <!ATTLIST context type CDATA #IMPLIED >
  
  <!--
  The service element defines a service that the component
  can provide to other component.
  It contains:
  
  reference     the reference to service.
  attributes	  Optional attributes about service
  -->
  <!ENTITY % ref "(service-ref|reference)">
  <!ELEMENT service   (%ref;,attributes?) >
  
  <!--
  The reference element defines a reference to a versioned interface.
  It defines:
  
  type         the class of the interface. This must be equal to the class name of the
               interface.
  version	 the version of the interface in (in the format #.#.#, #.# or # where
               # is a integer
  -->
  <!ELEMENT reference   EMPTY >
    <!ATTLIST reference
         type CDATA #REQUIRED
         version CDATA #IMPLIED >
  
  <!--
  The extension element defines a lifecycle extension phase supplied by a type:
  
  name  the extension name.
  reference  the version lifecycle interface supported
  attributes	  Optional attributes about the extension
  -->
  <!ENTITY % stage.attribute "stage (CREATE|ACCESS|RELEASE|DESTROY|ALL|INNER|OUTER) 'ALL'">
  <!ELEMENT extension      (name,reference,attributes?)>
  <!ATTLIST extension
         %stage.attribute; >
  
  <!--
  The phase element defines a lifecycle extension phase that this component provides.
  It contains:
  
  name  the phase name.
  interface  the client interface phase dependency
  attributes	  Optional attributes about phase
  -->
  <!ELEMENT phase      (reference,attributes?)>
  
  <!--
  The phases element contains a list of phases that this component provides.
  It contains phase elements.
  -->
  <!ELEMENT phases    (phase*)>
  
  <!--
  The extensions element contains a list of phases that this component requires.
  It contains phase elements.
  -->
  <!ELEMENT extensions    (extension*)>
  
  <!--
  The service dependency describes a service that the component
  requires. It defines:
  
  role         the role of the service. This is the value that is used to lookup the
               service in the ComponentManager. If not provided it defaults to the
               value specified in the name attribute of service element
  service-ref  the service that is required
  -->
  <!ELEMENT dependency  (role?,%ref;,attributes?) >
    <!ATTLIST dependency optional CDATA #IMPLIED >
    <!ELEMENT role        (#PCDATA) >
  
  
  <!--
  The loggers element contains a list of loggers that component uses.
  -->
  <!ELEMENT loggers    (logger*)>
  
  <!--
  The services element contains a list of services that this component supports.
  It contains service elements.
  -->
  <!ELEMENT services    (service*)>
  
  <!--
  The dependencies element contains a list of services that this component requires.
  It contains dependency elements.
  -->
  <!ELEMENT dependencies    (dependency*)>
  
  <!--
  The attributes element contains a list of attributes for feature.
  -->
  <!ELEMENT attributes    (attribute*)>
  
  <!--
  The attribute element defines an attribute (an opaque key-value pair for a feature).
  It defines:
  
  key          the key for attribute.
  value  	     the value of attribute.
  -->
  <!ELEMENT attribute   EMPTY >
    <!ATTLIST attribute
         key CDATA #REQUIRED
         value CDATA #REQUIRED
    >
  
  <!--
  The entry element defines entry in context.
  It defines:
  
  key          the key for entry.
  value  	     the value of entry.
  optional     is entry optional
  -->
  <!ELEMENT entry   EMPTY >
    <!ATTLIST entry
         key CDATA #REQUIRED
         type CDATA #REQUIRED
         optional CDATA #IMPLIED
    >
  
  
  1.8       +8 -5      jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/XMLTypeCreator.java
  
  Index: XMLTypeCreator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/assembly/src/java/org/apache/excalibur/meta/info/builder/XMLTypeCreator.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XMLTypeCreator.java	30 Jul 2002 07:05:56 -0000	1.7
  +++ XMLTypeCreator.java	5 Aug 2002 12:39:38 -0000	1.8
  @@ -88,13 +88,16 @@
           }
   
           final String topLevelName = info.getName();
  -        if( !topLevelName.equals( "component-info" ) )
  +        if( !topLevelName.equals( "type" ) )
           {
  -            final String message =
  -                REZ.getString( "builder.bad-toplevel-element.error",
  +            if( !topLevelName.equals( "component-info" ) )
  +            {
  +                final String message =
  +                    REZ.getString( "builder.bad-toplevel-element.error",
                                  classname,
                                  topLevelName );
  -            throw new ConfigurationException( message );
  +                throw new ConfigurationException( message );
  +            }
           }
   
           Configuration configuration = null;
  
  
  

--
To unsubscribe, e-mail:   <mailto:avalon-cvs-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:avalon-cvs-help@jakarta.apache.org>


Mime
View raw message