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/09/09 14:07:46 UTC

cvs commit: jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/store ComponentStore.java

donaldp     2002/09/09 05:07:46

  Modified:    containerkit/src/java/org/apache/excalibur/containerkit/kernel
                        AbstractServiceKernel.java
  Added:       containerkit/src/java/org/apache/excalibur/containerkit/kernel
                        ComponentReference.java ComponentStore.java
               containerkit/src/java/org/apache/excalibur/containerkit/kernel/processor
                        DependencyMap.java Phase.java PhaseEntry.java
                        PhaseProcessor.java
  Removed:     containerkit/src/java/org/apache/excalibur/containerkit/directory
                        ComponentReference.java
               containerkit/src/java/org/apache/excalibur/containerkit/processor
                        DependencyMap.java Phase.java PhaseEntry.java
               containerkit/src/java/org/apache/excalibur/containerkit/store
                        ComponentStore.java
  Log:
  Start moving all the unstable stuff that is NK partition specific under kernel package. Can differentiate again when stable or remove if Spice superscedes it.
  
  Revision  Changes    Path
  1.30      +3 -4      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.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- AbstractServiceKernel.java	31 Aug 2002 10:57:59 -0000	1.29
  +++ AbstractServiceKernel.java	9 Sep 2002 12:07:45 -0000	1.30
  @@ -17,12 +17,11 @@
   import org.apache.avalon.framework.activity.Initializable;
   import org.apache.avalon.framework.container.ContainerUtil;
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
  -import org.apache.excalibur.containerkit.processor.DependencyMap;
  +import org.apache.excalibur.containerkit.kernel.processor.DependencyMap;
   import org.apache.excalibur.containerkit.factory.ComponentFactory;
   import org.apache.excalibur.containerkit.lifecycle.LifecycleHelper;
   import org.apache.excalibur.containerkit.lifecycle.ResourceProvider;
   import org.apache.excalibur.containerkit.metadata.ComponentMetaData;
  -import org.apache.excalibur.containerkit.store.ComponentStore;
   import org.apache.excalibur.containerkit.registry.ComponentProfile;
   import org.apache.avalon.framework.info.ComponentInfo;
   import org.apache.excalibur.containerkit.factory.ComponentBundle;
  @@ -61,7 +60,7 @@
        */
       private final ComponentStore m_store = new ComponentStore();
       /**
  -     * The {@link org.apache.excalibur.containerkit.processor.DependencyMap} via which dependency graph is
  +     * The {@link org.apache.excalibur.containerkit.kernel.processor.DependencyMap} via which dependency graph is
        * produced.
        */
       private final DependencyMap m_dependencyMap = new DependencyMap();
  
  
  
  1.1                  jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel/ComponentReference.java
  
  Index: ComponentReference.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.kernel;
  
  import org.apache.avalon.framework.info.ComponentInfo;
  
  /**
   * This interface defines a resource returned from the
   * {@link ComponentDirectory}.
   *
   * @author <a href="mailto:peter at apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/09/09 12:07:45 $
   */
  public interface ComponentReference
  {
      /**
       * Return the underlying object representing the Component.
       *
       * @return the underlying object representing the Component
       */
      Object getComponent();
  
      /**
       * @todo Determine if this is reallly needed. It is only
       * returned as  a result of Directory lookup, hence should
       * know the type.
       * @todo Determine if this could be replace by getInfo()
       */
      ComponentInfo getInfo();
  
      /**
       * Invalidate the component reference. After the reference has been
       * invalidated, any calls made on the Compnent will have undefined
       * results.
       */
      void invalidate();
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel/ComponentStore.java
  
  Index: ComponentStore.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.kernel;
  
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import org.apache.excalibur.containerkit.registry.ComponentProfile;
  
  /**
   *
   *
   * @author <a href="mailto:peter at apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/09/09 12:07:45 $
   */
  public class ComponentStore
  {
      /**
       * Parent {@link org.apache.excalibur.containerkit.kernel.ComponentStore}. Components in parent
       * {@link org.apache.excalibur.containerkit.kernel.ComponentStore} are potential Providers for services
       * if no component in current {@link org.apache.excalibur.containerkit.kernel.ComponentStore} satisfies
       * dependency.
       */
      private final ComponentStore m_parent;
      /**
       * The child {@link org.apache.excalibur.containerkit.kernel.ComponentStore} objects.
       * Possible consumers of services in this assembly.
       */
      private final ArrayList m_children = new ArrayList();
      /**
       * The set of components in assembly.
       * Used when searching for providers/consumers.
       */
      private final Map m_components = new HashMap();
  
      /**
       * Create a root ComponentStore without any parent
       * ComponentStore.
       */
      public ComponentStore()
      {
          this( null );
      }
  
      /**
       * Return the parent ComponentStore (may be null).
       */
      public ComponentStore getParent()
      {
          return m_parent;
      }
  
      /**
       * Create a root ComponentStore with specified parent
       * ComponentStore.
       */
      public ComponentStore( final ComponentStore parent )
      {
          m_parent = parent;
      }
  
      /**
       * Add child {@link org.apache.excalibur.containerkit.kernel.ComponentStore}.
       *
       * @param child the child {@link org.apache.excalibur.containerkit.kernel.ComponentStore}.
       */
      public void addChildStore( final ComponentStore child )
      {
          m_children.add( child );
      }
  
      /**
       * Return the list of child {@link org.apache.excalibur.containerkit.kernel.ComponentStore}s.
       *
       * @return the list of child {@link org.apache.excalibur.containerkit.kernel.ComponentStore}s.
       */
      public List getChildStores()
      {
          return m_children;
      }
  
      /**
       * Remove child {@link org.apache.excalibur.containerkit.kernel.ComponentStore}.
       *
       * @param child the child {@link org.apache.excalibur.containerkit.kernel.ComponentStore}.
       */
      public void removeChildStore( final ComponentStore child )
      {
          m_children.remove( child );
      }
  
      /**
       * Add a component to store.
       *
       * @param component the component
       */
      public void addComponent( final ComponentProfile component )
      {
          final String name =
              component.getMetaData().getName();
          m_components.put( name, component );
      }
  
      /**
       * Remove a component from the store.
       *
       * @param component the component
       */
      public void removeComponent( final ComponentProfile component )
      {
          final String name =
              component.getMetaData().getName();
          m_components.remove( name );
      }
  
      /**
       * Return a component with specified name.
       *
       * @return a component with specified name
       */
      public ComponentProfile getComponent( final String name )
      {
          return (ComponentProfile)m_components.get( name );
      }
  
      /**
       * Return a collection containing all the
       * names of components in store. No ordering of
       * components is guarenteed or mandated.
       *
       * @return the collection containing all component names
       */
      public Collection getComponentNames()
      {
          final Collection collection = m_components.keySet();
          final ArrayList components = new ArrayList();
          components.addAll( collection );
          return components;
      }
  
      /**
       * Return a collection containing all the
       * components in store. Noordering of
       * components is guarenteed or mandated.
       *
       * @return the collection containing all components
       */
      public Collection getComponents()
      {
          final Collection collection = m_components.values();
          final ArrayList components = new ArrayList();
          components.addAll( collection );
          return components;
      }
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel/processor/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.kernel.processor;
  
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.List;
  import org.apache.avalon.framework.info.DependencyDescriptor;
  import org.apache.excalibur.containerkit.metadata.ComponentMetaData;
  import org.apache.excalibur.containerkit.metadata.DependencyMetaData;
  import org.apache.excalibur.containerkit.registry.ComponentProfile;
  import org.apache.excalibur.containerkit.kernel.ComponentStore;
  
  /**
   * Utility class to help aquire a ordered graph of
   * consumers and providers for specific components.
   *
   * @author <a href="mailto:peter at apache.org">Peter Donald</a>
   * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a>
   * @version $Revision: 1.1 $ $Date: 2002/09/09 12:07:46 $
   */
  public class DependencyMap
  {
      /**
       * Get the serilized graph of {@link ComponentProfile} 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 ComponentProfile[] getStartupGraph( final ComponentStore store )
      {
          return walkGraph( true, store );
      }
  
      /**
       * Get the serilized graph of {@link ComponentProfile} 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 ComponentProfile[] getShutdownGraph( final ComponentStore store )
      {
          return walkGraph( false, store );
      }
  
      /**
       * Get the serilized graph of {@link ComponentProfile} objects
       * that use services of specified component.
       *
       * @param component the component
       * @return the ordered list of consumers
       */
      public ComponentProfile[] getConsumerGraph( final ComponentProfile component,
                                                  final ComponentStore store )
      {
          return getComponentGraph( component, false, store );
      }
  
      /**
       * Get the serilized graph of {@link ComponentProfile} objects
       * that provide specified component with services.
       *
       * @param component the component
       * @return the ordered list of providers
       */
      public ComponentProfile[] getProviderGraph( final ComponentProfile component,
                                                  final ComponentStore store )
      {
          return getComponentGraph( component, true, store );
      }
  
      /**
       * Get the graph of a single component.
       *
       * @param component the component
       * @param providers true if traversing providers, false if consumers
       * @return the list of components in graph
       */
      private ComponentProfile[] getComponentGraph( final ComponentProfile component,
                                                    final boolean providers,
                                                    final ComponentStore store )
      {
          final ArrayList result = new ArrayList();
          visitcomponent( component,
                          providers,
                          new ArrayList(),
                          result,
                          store );
  
          final ComponentProfile[] returnValue = new ComponentProfile[ result.size() ];
          return (ComponentProfile[])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 providers true if forward dependencys traced, false if dependencies reversed
       * @return the ordered node names
       */
      private ComponentProfile[] walkGraph( final boolean providers,
                                            final ComponentStore store )
      {
          final ArrayList result = new ArrayList();
          final ArrayList done = new ArrayList();
  
          final Collection components = store.getComponents();
          final ComponentProfile[] entrySet =
              (ComponentProfile[])components.toArray( new ComponentProfile[ components.size() ] );
          for( int i = 0; i < entrySet.length; i++ )
          {
              final ComponentProfile component = entrySet[ i ];
              visitcomponent( component,
                              providers,
                              done,
                              result,
                              store );
          }
  
          final ComponentProfile[] returnValue = new ComponentProfile[ result.size() ];
          return (ComponentProfile[])result.toArray( returnValue );
      }
  
      /**
       * Visit a component when traversing dependencies.
       *
       * @param component the component
       * @param providers true if walking tree looking for providers, else false
       * @param done those nodes already traversed
       * @param order the order in which nodes have already been
       *             traversed
       */
      private void visitcomponent( final ComponentProfile component,
                                   final boolean providers,
                                   final ArrayList done,
                                   final ArrayList order,
                                   final ComponentStore store )
      {
          //If already visited this component then bug out early
          if( done.contains( component ) )
          {
              return;
          }
          done.add( component );
  
          if( providers )
          {
              visitProviders( component, done, order, store );
          }
          else
          {
              visitConsumers( component, done, order, store );
          }
  
          order.add( component );
      }
  
      /**
       * Traverse graph of components that provide services to
       * the specified component.
       *
       * @param component the ComponentProfile
       */
      private void visitProviders( final ComponentProfile component,
                                   final ArrayList done,
                                   final ArrayList order,
                                   final ComponentStore store )
      {
          final DependencyDescriptor[] descriptors =
              component.getInfo().getDependencies();
          final ComponentMetaData metaData = component.getMetaData();
  
          for( int i = 0; i < descriptors.length; i++ )
          {
              final DependencyMetaData dependency =
                  metaData.getDependency( descriptors[ i ].getKey() );
  
              // added != null clause to catch cases where an optional
              // dependency exists and the dependecy has not been bound
              // to a provider
  
              if( dependency != null )
              {
                  final ComponentProfile other =
                      getComponent( dependency.getProviderName(), store );
                  visitcomponent( other, true, done, order, store );
              }
          }
      }
  
      /**
       * Traverse all Consumers of component. ie Anyone that uses
       * service provided by component.
       *
       * @param component the ComponentProfile
       */
      private void visitConsumers( final ComponentProfile component,
                                   final ArrayList done,
                                   final ArrayList order,
                                   final ComponentStore store )
      {
          final String name = component.getMetaData().getName();
  
          final Collection components = store.getComponents();
          final ComponentProfile[] entrySet =
              (ComponentProfile[])components.toArray( new ComponentProfile[ components.size() ] );
          for( int i = 0; i < entrySet.length; i++ )
          {
              final ComponentProfile other = entrySet[ i ];
              final DependencyMetaData[] roles =
                  other.getMetaData().getDependencies();
  
              for( int j = 0; j < roles.length; j++ )
              {
                  final String depends = roles[ j ].getProviderName();
                  if( depends.equals( name ) )
                  {
                      visitcomponent( other, false, done, order, store );
                  }
              }
          }
  
          final List childStores = store.getChildStores();
          final int childCount = childStores.size();
          for( int i = 0; i < childCount; i++ )
          {
              final ComponentStore child = (ComponentStore)childStores.get( i );
              visitConsumers( component, done, order, child );
          }
      }
  
      /**
       * Utility method to get component with specified name from specified array.
       *
       * @param name the name of component
       * @return the component
       */
      private ComponentProfile getComponent( final String name,
                                             final ComponentStore store )
      {
          final ComponentProfile component = store.getComponent( name );
          if( null != component )
          {
              return component;
          }
  
          final ComponentStore parent = store.getParent();
          if( null != parent )
          {
              return parent.getComponent( name );
          }
  
          //Should never happen if Verifier passed checks
          throw new IllegalStateException();
      }
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel/processor/Phase.java
  
  Index: Phase.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.kernel.processor;
  
  /**
   * The phase is a set of Stages that a component must pass
   * through.
   *
   * @author <a href="mailto:peter at apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/09/09 12:07:46 $
   */
  public interface Phase
  {
      void processPhase( String name )
          throws Exception;
  }
  
  
  1.1                  jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel/processor/PhaseEntry.java
  
  Index: PhaseEntry.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.kernel.processor;
  
  /**
   * The PhaseEntry class defines a particular Phase that
   * components can pass through. It defines the traversal
   * strategy, the phase and whether or not failure of
   * a particular component passing through the Phase
   * will cause all processing to be stopped.
   */
  public class PhaseEntry
  {
      public final static int TRAVERSE_DEPS_FORWARD = 0;
      public final static int TRAVERSE_DEPS_REVERSE = 1;
      public final static int NO_TRAVERSE_DEPS = 2;
  
      private final int m_traversalStrategy;
      private final boolean m_haltOnError;
      private final Phase m_processor;
  
      public PhaseEntry( final int traversalStrategy,
                         final boolean haltOnError,
                         final Phase processor )
      {
          m_traversalStrategy = traversalStrategy;
          m_haltOnError = haltOnError;
          m_processor = processor;
      }
  
      public int getTraversalStrategy()
      {
          return m_traversalStrategy;
      }
  
      public boolean shouldHaltOnError()
      {
          return m_haltOnError;
      }
  
      public Phase getPhase()
      {
          return m_processor;
      }
  }
  
  
  
  1.1                  jakarta-avalon-excalibur/containerkit/src/java/org/apache/excalibur/containerkit/kernel/processor/PhaseProcessor.java
  
  Index: PhaseProcessor.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.kernel.processor;
  
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.excalibur.containerkit.registry.ComponentProfile;
  
  /**
   *
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/09/09 12:07:46 $
   */
  public class PhaseProcessor
      extends AbstractLogEnabled
  {
      private final static Resources REZ =
          ResourceManager.getPackageResources( PhaseProcessor.class );
  
      /**
       * The {@link DependencyMap} via which dependency graph is
       * produced.
       */
      private DependencyMap m_dependencyMap = new DependencyMap();
  
      public void processPhase( final PhaseEntry entry )
          throws Throwable
      {
          final Phase phase = entry.getPhase();
          final boolean shouldHaltOnError = entry.shouldHaltOnError();
          final int strategy = entry.getTraversalStrategy();
          final ComponentProfile[] graph = getOrderedComponents( strategy );
          for( int i = 0; i < graph.length; i++ )
          {
              final ComponentProfile component = graph[ i ];
              final String name = component.getMetaData().getName();
              try
              {
                  phase.processPhase( name );
              }
              catch( final Throwable t )
              {
                  if( shouldHaltOnError )
                  {
                      throw t;
                  }
                  else
                  {
                      final String message =
                          REZ.getString( "error.phase." );
                      getLogger().warn( message, t );
                  }
              }
          }
      }
  
      private ComponentProfile[] getOrderedComponents( final int strategy )
      {
          ComponentProfile[] graph;
          if( PhaseEntry.TRAVERSE_DEPS_FORWARD == strategy )
          {
              graph = m_dependencyMap.getStartupGraph( null );
          }
          else if( PhaseEntry.TRAVERSE_DEPS_REVERSE == strategy )
          {
              graph = m_dependencyMap.getShutdownGraph( null );
          }
          else
          {
              //Should really be processing blocks in
              //definition order
              graph = m_dependencyMap.getShutdownGraph( null );
          }
          return graph;
      }
  }
  
  
  

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