mcconnell    2002/12/20 21:18:22

  Modified:    merlin/src/java/org/apache/avalon/merlin/container
                        DefaultContainer.java
               merlin/src/java/org/apache/avalon/merlin/kernel
                        DefaultKernel.java
  Log:
  Improvements to the handling of components during shutdown and disposal 
phases.
  
  Revision  Changes    Path
  1.7       +74 -13    
avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/container/DefaultContainer.java
  
  Index: DefaultContainer.java
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/container/DefaultContainer.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DefaultContainer.java     21 Dec 2002 03:30:24 -0000      1.6
  +++ DefaultContainer.java     21 Dec 2002 05:18:22 -0000      1.7
  @@ -72,6 +72,7 @@
   import org.apache.avalon.framework.context.ContextException;
   import org.apache.avalon.framework.activity.Disposable;
   import org.apache.avalon.framework.activity.Initializable;
  +import org.apache.avalon.framework.activity.Startable;
   import org.apache.avalon.merlin.container.ContainerDescriptor;
   import org.apache.avalon.merlin.service.Registry;
   import org.apache.avalon.meta.model.Profile;
  @@ -269,7 +270,7 @@
           while( iterator.hasNext() )
           {
               Appliance appliance = (Appliance) iterator.next();
  -            m_engine.assemble( appliance );
  +            appliance.assemble();
           }
       }
   
  @@ -390,16 +391,20 @@
               Object object = m_componentMap.get( appliance );
               if( object != null )
               {
  -                if( getLogger().isDebugEnabled() )
  +                if( object instanceof Startable )
                   {
  -                    final String message =
  -                      "stopping: " + appliance;
  -                    getLogger().debug( message );
  +                    if( getLogger().isDebugEnabled() )
  +                    {
  +                        final String message =
  +                          "stopping: " + appliance;
  +                        getLogger().debug( message );
  +                    }
  +                    ((Startable)object).stop();
  +                }
  +                else
  +                {
  +                    appliance.release( object );
                   }
  -
  -                m_componentMap.remove( appliance );
  -                appliance.release( object );
  -                appliance.terminate();
               }
           }
       }
  @@ -418,9 +423,6 @@
               try
               {
                   container.shutdown();
  -                m_containerMap.remove( appliance );
  -                appliance.release( container );
  -                appliance.terminate();
               }
               catch( Throwable e )
               {
  @@ -442,6 +444,10 @@
           {
               getLogger().debug( "disposal" );
           }
  +
  +        disposeContainers();
  +        disposeComponents();
  +
           m_engine = null;
           m_descriptor = null;
           m_componentMap.clear();
  @@ -454,5 +460,60 @@
           m_containers = null;
           m_partition = null;
           m_path = null;
  +    }
  +
  +   /**
  +    * Shutdown all subsidiary containers and all components in this 
container.
  +    * @exception Exception if a shutdown error occurs
  +    */
  +    protected void disposeComponents()
  +    {
  +        Iterator iterator = m_components.iterator();
  +        while( iterator.hasNext() )
  +        {
  +            Appliance appliance = (Appliance) iterator.next();
  +            Object object = m_componentMap.get( appliance );
  +            if( object != null )
  +            {
  +                if( getLogger().isDebugEnabled() )
  +                {
  +                    final String message =
  +                      "disposing of: " + appliance;
  +                    getLogger().debug( message );
  +                }
  +
  +                m_componentMap.remove( appliance );
  +                appliance.release( object );
  +                appliance.terminate();
  +            }
  +        }
  +    }
  +
  +   /**
  +    * Shutdown the containers in this container.
  +    * @exception Exception if a startup error occurs
  +    */
  +    protected void disposeContainers()
  +    {
  +        Iterator iterator = m_containers.iterator();
  +        while( iterator.hasNext() )
  +        {
  +            Appliance appliance = (Appliance) iterator.next();
  +            Container container = (Container) m_containerMap.get( appliance 
);
  +            try
  +            {
  +                m_containerMap.remove( appliance );
  +                appliance.release( container );
  +                appliance.terminate();
  +            }
  +            catch( Throwable e )
  +            {
  +                final String error =
  +                  "Could not shutdown a subsidiary container: " 
  +                     + appliance.getName() 
  +                     + " in container: " + this;
  +                getLogger().warn( error, e );
  +            }
  +        }
       }
   }
  
  
  
  1.15      +23 -5     
avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/kernel/DefaultKernel.java
  
  Index: DefaultKernel.java
  ===================================================================
  RCS file: 
/home/cvs/avalon-sandbox/merlin/src/java/org/apache/avalon/merlin/kernel/DefaultKernel.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- DefaultKernel.java        20 Dec 2002 11:58:00 -0000      1.14
  +++ DefaultKernel.java        21 Dec 2002 05:18:22 -0000      1.15
  @@ -350,7 +350,7 @@
               Appliance appliance = block.getAppliance();
               try
               {
  -                m_engine.assemble( appliance );
  +                appliance.assemble();
                   Container container = (Container)appliance.access();
                   m_containers.put( block, container );
               }
  @@ -453,10 +453,7 @@
               Container container = (Container) m_containers.get( block );
               if( container != null )
               {
  -                m_containers.remove( block );
                   container.shutdown();
  -                block.getAppliance().release( container );
  -                block.getAppliance().terminate();
               }
           }
       }
  @@ -470,6 +467,27 @@
       */
       public void dispose()
       {
  +        if( getLogger() != null ) 
  +        {
  +            if( getLogger().isInfoEnabled() )
  +            {
  +                getLogger().info( "commencing disposal phase" );
  +            }
  +        }
  +
  +        Iterator iterator = m_blocks.iterator();
  +        while( iterator.hasNext() )
  +        {
  +            Block block = (Block) iterator.next();
  +            Container container = (Container) m_containers.get( block );
  +            if( container != null )
  +            {
  +                m_containers.remove( block );
  +                block.getAppliance().release( container );
  +                block.getAppliance().terminate();
  +            }
  +        }
  +
           if( getLogger() != null ) 
           {
               if( getLogger().isInfoEnabled() )
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to