You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by do...@apache.org on 2002/06/23 07:59:18 UTC

cvs commit: jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel AbstractServiceKernel.java DependencyGraph.java

donaldp     2002/06/22 22:59:18

  Modified:    containerkit/src/java/org/apache/excalibur/containerkit/kernel
                        AbstractServiceKernel.java
  Added:       containerkit/src/java/org/apache/excalibur/containerkit/dependency
                        DependencyMap.java
  Removed:     containerkit/src/java/org/apache/excalibur/containerkit/dependency
                        DependencyGraph.java
               containerkit/src/java/org/apache/excalibur/containerkit/kernel
                        DependencyGraph.java
  Log:
  Rework the Dependeny graph stuff to be reusable in other contexts easily.
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/dependency/DependencyMap.java
  
  Index: DependencyMap.java
  ===================================================================
  /*
   * 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.
   */
  package org.apache.excalibur.containerkit.dependency;
  
  import java.util.ArrayList;
  import org.apache.excalibur.containerkit.metadata.ComponentMetaData;
  import org.apache.excalibur.containerkit.metadata.DependencyMetaData;
  import org.apache.excalibur.containerkit.metainfo.DependencyDescriptor;
  
  /**
   * Utility class to help aquire a ordered graph of
   * consumers and providers for specific components.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/06/23 05:59:17 $
   */
  public class DependencyMap
  {
      private final ComponentMetaData[] m_components;
  
      public DependencyMap( final ComponentMetaData[] components )
      {
          m_components = components;
      }
  
      /**
       * Get the serilized graph of {@link ComponentMetaData} objects
       * required when starting up all the components. This makes sure
       * that all providers occur before their coresponding
       * consumers in graph.
       *
       * @return the ordered list of components
       */
      public ComponentMetaData[] getStartupGraph()
      {
          return walkGraph( true );
      }
  
      /**
       * Get the serilized graph of {@link ComponentMetaData} objects
       * required when shutting down all the components. This makes
       * sure that all consumers occur before their coresponding
       * providers in graph.
       *
       * @return the ordered list of components
       */
      public ComponentMetaData[] getShutdownGraph()
      {
          return walkGraph( false );
      }
  
      /**
       * Get the serilized graph of {@link ComponentMetaData} objects
       * that use services of specified component.
       *
       * @param component the component
       * @return the ordered list of consumers
       */
      public ComponentMetaData[] getConsumerGraph( final ComponentMetaData component )
      {
          return getComponentGraph( component, false );
      }
  
      /**
       * Get the serilized graph of {@link ComponentMetaData} objects
       * that provide specified component with services.
       *
       * @param component the component
       * @return the ordered list of providers
       */
      public ComponentMetaData[] getProviderGraph( final ComponentMetaData component )
      {
          return getComponentGraph( component, true );
      }
  
      /**
       * Get the graph of a single component.
       *
       * @param component the component
       * @param provider true if traversing providers, false if consumers
       * @return the list of components in graph
       */
      private ComponentMetaData[] getComponentGraph( final ComponentMetaData component, final boolean provider )
      {
          final ArrayList result = new ArrayList();
          visitcomponent( component,
                          provider,
                          new ArrayList(),
                          result );
  
          final ComponentMetaData[] returnValue = new ComponentMetaData[ result.size() ];
          return (ComponentMetaData[])result.toArray( returnValue );
      }
  
      /**
       * Method to generate an ordering of nodes to traverse.
       * It is expected that the specified components have passed
       * verification tests and are well formed.
       *
       * @param forward true if forward dependencys traced, false if dependencies reversed
       * @return the ordered node names
       */
      private ComponentMetaData[] walkGraph( final boolean forward )
      {
          final ArrayList result = new ArrayList();
  
          for( int i = 0; i < m_components.length; i++ )
          {
              visitcomponent( m_components[ i ],
                              forward,
                              new ArrayList(),
                              result );
          }
  
          final ComponentMetaData[] returnValue = new ComponentMetaData[ result.size() ];
          return (ComponentMetaData[])result.toArray( returnValue );
      }
  
      /**
       * Visit a component when traversing dependencies.
       *
       * @param component the component
       * @param forward true if walking down tree, else false
       * @param done those nodes already traversed
       * @param order the order in which nodes have already been
       *             traversed
       */
      private void visitcomponent( final ComponentMetaData component,
                                   final boolean forward,
                                   final ArrayList done,
                                   final ArrayList order )
      {
          //If already visited this component then bug out early
          if( done.contains( component ) )
          {
              return;
          }
          done.add( component );
  
          if( forward )
          {
              visitDependencies( component, done, order );
          }
          else
          {
              visitReverseDependencies( component, done, order );
          }
  
          order.add( component );
      }
  
      /**
       * Traverse dependencies of specified component.
       *
       * @param component the ComponentMetaData
       */
      private void visitDependencies( final ComponentMetaData component,
                                      final ArrayList done,
                                      final ArrayList order )
      {
          final DependencyDescriptor[] descriptors =
              component.getComponentInfo().getDependencies();
  
          for( int i = 0; i < descriptors.length; i++ )
          {
              final DependencyMetaData dependency =
                  component.getDependency( descriptors[ i ].getRole() );
              final ComponentMetaData other =
                  getComponent( dependency.getProviderName() );
              visitcomponent( other, true, done, order );
          }
      }
  
      /**
       * Traverse all reverse dependencies of specified component.
       * A reverse dependency are those that dependend on component.
       *
       * @param component the ComponentMetaData
       */
      private void visitReverseDependencies( final ComponentMetaData component,
                                             final ArrayList done,
                                             final ArrayList order )
      {
          final String name = component.getName();
  
          for( int i = 0; i < m_components.length; i++ )
          {
              final ComponentMetaData other = m_components[ i ];
              final DependencyMetaData[] roles = other.getDependencies();
              if( null == roles )
              {
                  continue;
              }
  
              for( int j = 0; j < roles.length; j++ )
              {
                  final String depends = roles[ j ].getProviderName();
                  if( depends.equals( name ) )
                  {
                      visitcomponent( other, false, done, order );
                  }
              }
          }
      }
  
      /**
       * Utility method to get component with specified name from specified array.
       *
       * @param name the name of component
       * @return the component
       */
      private ComponentMetaData getComponent( final String name )
      {
          for( int i = 0; i < m_components.length; i++ )
          {
              if( m_components[ i ].getName().equals( name ) )
              {
                  return m_components[ i ];
              }
          }
  
          //Should never happen if Verifier passed checks
          throw new IllegalStateException();
      }
  }
  
  
  
  1.5       +38 -20    jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel/AbstractServiceKernel.java
  
  Index: AbstractServiceKernel.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel/AbstractServiceKernel.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AbstractServiceKernel.java	23 Jun 2002 04:44:15 -0000	1.4
  +++ AbstractServiceKernel.java	23 Jun 2002 05:59:18 -0000	1.5
  @@ -7,17 +7,18 @@
    */
   package org.apache.excalibur.containerkit.kernel;
   
  -import java.util.Arrays;
  +import java.util.ArrayList;
   import java.util.Collection;
   import java.util.HashMap;
  -import java.util.List;
   import java.util.Iterator;
  +import java.util.List;
   import org.apache.avalon.excalibur.i18n.ResourceManager;
   import org.apache.avalon.excalibur.i18n.Resources;
   import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.activity.Startable;
   import org.apache.avalon.framework.context.Contextualizable;
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
  +import org.apache.excalibur.containerkit.dependency.DependencyMap;
   import org.apache.excalibur.containerkit.lifecycle.LifecycleHelper;
   import org.apache.excalibur.containerkit.lifecycle.ResourceProvider;
   import org.apache.excalibur.containerkit.metadata.ComponentMetaData;
  @@ -52,11 +53,18 @@
        */
       private final HashMap m_entrys = new HashMap();
   
  +    /**
  +     * The {@link DependencyMap} via which dependency graph is
  +     * produced.
  +     */
  +    private DependencyMap m_dependencyMap;
  +
       public void initialize()
           throws Exception
       {
           m_resourceProvider = prepareResourceProvider();
           m_lifecycleHelper = prepareLifecycleHelper();
  +        m_dependencyMap = new DependencyMap( getCompnentMetaDatas() );
       }
   
       protected abstract ResourceProvider prepareResourceProvider();
  @@ -71,29 +79,33 @@
       protected final void startupAllComponents()
           throws Exception
       {
  -        final String[] order =
  -            DependencyGraph.walkGraph( true, getCompnentMetaDatas() );
  -        processComponents( true, order );
  +        final ComponentMetaData[] components = m_dependencyMap.getStartupGraph();
  +        processComponents( true, components );
       }
   
       protected final void shutdownAllComponents()
           throws Exception
       {
  -        final String[] order =
  -            DependencyGraph.walkGraph( false, getCompnentMetaDatas() );
  -        processComponents( false, order );
  +        final ComponentMetaData[] components = m_dependencyMap.getStartupGraph();
  +        processComponents( false, components );
       }
   
       protected final void startupComponent( final String name )
           throws Exception
       {
  -        //        final String[] order = DependencyGraph.walkGraph( false, components );
  -        //        processComponents( false, order );
  +        final ComponentEntry entry = (ComponentEntry)m_entrys.get( name );
  +        final ComponentMetaData[] components =
  +            m_dependencyMap.getProviderGraph( entry.getMetaData() );
  +        processComponents( true, components );
       }
   
       protected final void shutdownComponent( final String name )
           throws Exception
       {
  +        final ComponentEntry entry = (ComponentEntry)m_entrys.get( name );
  +        final ComponentMetaData[] components =
  +            m_dependencyMap.getConsumerGraph( entry.getMetaData() );
  +        processComponents( false, components );
       }
   
       /**
  @@ -124,19 +136,18 @@
        * in order specified by the dependency graph.
        *
        * @param startup true if application startup phase, false if shutdown phase
  -     * @param order
        * @throws Exception if there is error processing any of the components
        *         through the phases
        */
       private void processComponents( final boolean startup,
  -                                    final String[] order )
  +                                    final ComponentMetaData[] components )
           throws Exception
       {
  -        processComponentsNotice( order, startup );
  +        processComponentsNotice( components, startup );
   
  -        for( int i = 0; i < order.length; i++ )
  +        for( int i = 0; i < components.length; i++ )
           {
  -            processComponent( order[ i ], startup );
  +            processComponent( components[ i ], startup );
           }
       }
   
  @@ -148,15 +159,16 @@
        * it is expected that all of the consumers of services provided
        * by this component have already been shutdown.
        *
  -     * @param name the name of the component
  +     * @param component the component
        * @param startup true if application startup phase, false if shutdown phase
        * @throws Exception if there is error processing any of the components
        *         through the phases
        */
  -    private void processComponent( final String name,
  +    private void processComponent( final ComponentMetaData component,
                                      final boolean startup )
           throws Exception
       {
  +        final String name = component.getName();
           final ComponentEntry entry =
               (ComponentEntry)m_entrys.get( name );
   
  @@ -209,14 +221,20 @@
        * @param order the order the components will be processed in
        * @param startup true if application startup phase, false if shutdown phase
        */
  -    private void processComponentsNotice( final String[] order,
  +    private void processComponentsNotice( final ComponentMetaData[] order,
                                             final boolean startup )
       {
   
           if( getLogger().isInfoEnabled() )
           {
               final Integer count = new Integer( order.length );
  -            final List pathList = Arrays.asList( order );
  +
  +            final List pathList = new ArrayList();
  +            for( int i = 0; i < order.length; i++ )
  +            {
  +                pathList.add( order[ i ].getName() );
  +            }
  +
               final String message =
                   REZ.getString( "components-processing",
                                  count,
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>