bloritsch    2002/09/25 08:10:53

  Modified:    fortress build.xml default.properties
               fortress/src/java/org/apache/excalibur/fortress
                        DefaultContainerManager.java
  Added:       fortress/src/java/org/apache/excalibur/fortress/util
                        ComponentStateValidator.java
               fortress/src/test/org/apache/excalibur/fortress/util/test
                        ComponentTestCase.java FullLifecycleComponent.java
  Log:
  make Util no longer necessary
  
  Revision  Changes    Path
  1.53      +0 -2      jakarta-avalon-excalibur/fortress/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/build.xml,v
  retrieving revision 1.52
  retrieving revision 1.53
  diff -u -r1.52 -r1.53
  --- build.xml 25 Sep 2002 14:43:43 -0000      1.52
  +++ build.xml 25 Sep 2002 15:10:53 -0000      1.53
  @@ -20,7 +20,6 @@
           <pathelement location="${excalibur-instrument-manager.jar}"/>
           <pathelement location="${excalibur-instrument-manager-interfaces.jar}"/>
           <pathelement location="${excalibur-event.jar}"/>
  -        <pathelement location="${excalibur-util.jar}"/>
           <pathelement location="${excalibur-logger.jar}"/>
           <pathelement location="${excalibur-sourceresolve.jar}"/>
           <pathelement location="${excalibur-concurrent.jar}"/>
  @@ -81,7 +80,6 @@
         <copy file="${excalibur-instrument-manager.jar}" 
todir="${build.dir}/tempjars"/>
         <copy file="${excalibur-instrument-manager-interfaces.jar}" 
todir="${build.dir}/tempjars"/>
         <copy file="${excalibur-event.jar}" todir="${build.dir}/tempjars"/>
  -      <copy file="${excalibur-util.jar}" todir="${build.dir}/tempjars"/>
         <copy file="${excalibur-logger.jar}" todir="${build.dir}/tempjars"/>
         <copy file="${excalibur-sourceresolve.jar}" todir="${build.dir}/tempjars"/>
         <copy file="${excalibur-concurrent.jar}" todir="${build.dir}/tempjars"/>
  
  
  
  1.37      +0 -5      jakarta-avalon-excalibur/fortress/default.properties
  
  Index: default.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/fortress/default.properties,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- default.properties        19 Sep 2002 04:07:23 -0000      1.36
  +++ default.properties        25 Sep 2002 15:10:53 -0000      1.37
  @@ -53,11 +53,6 @@
   excalibur-event.lib=${excalibur-event.home}
   excalibur-event.jar=${excalibur-event.lib}/excalibur-event-1.0a.jar
   
  -# ----- Excalibur util, version 1.0 or later -----
  -excalibur-util.home=${basedir}/../util/dist
  -excalibur-util.lib=${excalibur-util.home}
  -excalibur-util.jar=${excalibur-util.lib}/excalibur-util-1.0.jar
  -
   # ----- Excalibur Source Resolver, version 1.0 or later -----
   excalibur-sourceresolve.home=${basedir}/../sourceresolve/dist
   excalibur-sourceresolve.lib=${excalibur-sourceresolve.home}
  
  
  
  1.25      +2 -4      
jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/DefaultContainerManager.java
  
  Index: DefaultContainerManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/DefaultContainerManager.java,v
  retrieving revision 1.24
  retrieving revision 1.25
  diff -u -r1.24 -r1.25
  --- DefaultContainerManager.java      17 Sep 2002 17:39:59 -0000      1.24
  +++ DefaultContainerManager.java      25 Sep 2002 15:10:53 -0000      1.25
  @@ -53,7 +53,6 @@
   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.framework.component.ComponentManager;
   import org.apache.avalon.framework.component.Composable;
   import org.apache.avalon.framework.configuration.Configurable;
   import org.apache.avalon.framework.configuration.Configuration;
  @@ -61,7 +60,6 @@
   import org.apache.avalon.framework.context.ContextException;
   import org.apache.avalon.framework.context.Contextualizable;
   import org.apache.avalon.framework.logger.ConsoleLogger;
  -import org.apache.avalon.framework.logger.NullLogger;
   import org.apache.avalon.framework.logger.LogEnabled;
   import org.apache.avalon.framework.logger.Logger;
   import org.apache.avalon.framework.parameters.Parameterizable;
  @@ -69,7 +67,7 @@
   import org.apache.avalon.framework.service.ServiceManager;
   import org.apache.avalon.framework.service.Serviceable;
   import org.apache.excalibur.fortress.util.ContextManager;
  -import org.apache.excalibur.util.ComponentStateValidator;
  +import org.apache.excalibur.fortress.util.ComponentStateValidator;
   
   /**
    * The ContainerManager is a single point of contact to manage your Container
  
  
  
  1.1                  
jakarta-avalon-excalibur/fortress/src/java/org/apache/excalibur/fortress/util/ComponentStateValidator.java
  
  Index: ComponentStateValidator.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.fortress.util;
  
  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.framework.activity.Suspendable;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.service.Serviceable;
  import org.apache.avalon.framework.component.Recomposable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Reconfigurable;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.context.Recontextualizable;
  import org.apache.avalon.framework.logger.LogEnabled;
  import org.apache.avalon.framework.logger.Loggable;
  import org.apache.avalon.framework.parameters.Parameterizable;
  
  /**
   * This class provides basic facilities for enforcing Avalon's contracts
   * within your own code.
   *
   * Based on Avalon version from Sandbox.
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Berin Loritsch</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Michael McKibben</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Leif Mortenson</a>
   * @version CVS $Revision: 1.1 $ $Date: 2002/09/25 15:10:53 $
   */
  public final class ComponentStateValidator
  {
      private static final String WRITE_FAIL = "Value is already bound";
  
      // Interfaces
      private static final long LOG_ENABLED = 0x00000001;
      private static final long LOGGABLE = 0x00000002;
      private static final long CONTEXTUALIZABLE = 0x00000004;
      private static final long COMPOSABLE = 0x00000008;
      private static final long SERVICEABLE = 0x00000010;
      private static final long CONFIGURABLE = 0x00000020;
      private static final long PARAMETERIZABLE = 0x00000040;
      private static final long INITIALIZABLE = 0x00000080;
      private static final long STARTABLE = 0x00000100;
      private static final long SUSPENDABLE = 0x00001000;
      private static final long RECONTEXTUALIZABLE = 0x00002000;
      private static final long RECOMPOSABLE = 0x00004000;
      private static final long RECONFIGURABLE = 0x00008000;
      private static final long DISPOSABLE = 0x00100000;
  
      // Initialization Methods.
      private static final long ENABLE_LOGGING = 0x00000001;
      private static final long SET_LOGGER = 0x00000002;
      private static final long CONTEXTUALIZE = 0x00000004;
      private static final long SERVICE = 0x00000008;
      private static final long COMPOSE = 0x00000010;
      private static final long CONFIGURE = 0x00000020;
      private static final long PARAMETERIZE = 0x00000040;
      private static final long INITIALIZE = 0x00000080;
      private static final long START = 0x00000100;
      private static final long INIT_COMPLETE = 0x00000400;
  
      // Active Service Methods
      private static final long SUSPEND = 0x00001000;
      private static final long RECONTEXTUALIZE = 0x00002000;
      private static final long RECOMPOSE = 0x00004000;
      private static final long RECONFIGURE = 0x00008000;
      private static final long RESUME = 0x00010000;
  
      // Destruction Methods
      private static final long STOP = 0x00100000;
      private static final long DISPOSE = 0x00200000;
  
      // Masks
      private static final long INIT_MASK = ENABLE_LOGGING | SET_LOGGER |
          CONTEXTUALIZE | COMPOSE | SERVICE | CONFIGURE | PARAMETERIZE | INITIALIZE |
          START;
  
      private final long m_interfaces;
      private final long m_methods;
      private long m_state;
      private boolean m_active;
      private final Object m_object;
  
      /**
       * Create state validator from object (this can be used for more than just
       * components).
       */
      public ComponentStateValidator( final Object object )
      {
          m_object = object;
  
          long methods = 0;
          long interfaces = 0;
  
          if( object instanceof LogEnabled )
          {
              interfaces |= LOG_ENABLED;
              methods |= ENABLE_LOGGING;
          }
  
          if( object instanceof Loggable )
          {
              interfaces |= LOGGABLE;
              methods |= SET_LOGGER;
          }
  
          if( object instanceof Contextualizable )
          {
              interfaces |= CONTEXTUALIZABLE;
              methods |= CONTEXTUALIZE;
          }
          
          if( object instanceof Serviceable )
          {
              interfaces |= SERVICEABLE;
              methods |= SERVICE;
          }
  
          if( object instanceof Composable )
          {
              if ( (interfaces & SERVICEABLE) > 0 )
              {
                  throw new IllegalStateException("Cannot implement Composable and 
Serviceable together");
              }
  
              interfaces |= COMPOSABLE;
              methods |= COMPOSE;
          }
  
          if( object instanceof Configurable )
          {
              interfaces |= CONFIGURABLE;
              methods |= CONFIGURE;
          }
  
          if( object instanceof Parameterizable )
          {
              interfaces |= PARAMETERIZABLE;
              methods |= PARAMETERIZE;
          }
  
          if( object instanceof Initializable )
          {
              interfaces |= INITIALIZABLE;
              methods |= INITIALIZE;
          }
  
          if( object instanceof Startable )
          {
              interfaces |= STARTABLE;
              methods |= START | STOP;
          }
  
          if( object instanceof Suspendable )
          {
              interfaces |= SUSPENDABLE;
              methods |= SUSPEND | RESUME;
          }
  
          if( object instanceof Recontextualizable )
          {
              interfaces |= RECONTEXTUALIZABLE;
              methods |= RECONTEXTUALIZE;
          }
  
          if( object instanceof Recomposable )
          {
              interfaces |= RECOMPOSABLE;
              methods |= RECOMPOSE;
          }
  
          if( object instanceof Reconfigurable )
          {
              interfaces |= RECONFIGURABLE;
              methods |= RECONFIGURE;
          }
  
          if( object instanceof Disposable )
          {
              interfaces |= DISPOSABLE;
              methods |= DISPOSE;
          }
  
          m_methods = methods;
          m_interfaces = interfaces;
  
          generalCheckInitComplete();
      }
  
      private String getInterfaceName( long interfaceId )
      {
          if( interfaceId == LOG_ENABLED )
          {
              return LogEnabled.class.getName();
          }
          else if( interfaceId == LOGGABLE )
          {
              return Loggable.class.getName();
          }
          else if( interfaceId == CONTEXTUALIZABLE )
          {
              return Contextualizable.class.getName();
          }
          else if( interfaceId == SERVICEABLE )
          {
              return Serviceable.class.getName();
          }
          else if( interfaceId == COMPOSABLE )
          {
              return Composable.class.getName();
          }
          else if( interfaceId == CONFIGURABLE )
          {
              return Configurable.class.getName();
          }
          else if( interfaceId == PARAMETERIZABLE )
          {
              return Parameterizable.class.getName();
          }
          else if( interfaceId == INITIALIZABLE )
          {
              return Initializable.class.getName();
          }
          else if( interfaceId == STARTABLE )
          {
              return Startable.class.getName();
          }
          else if( interfaceId == SUSPENDABLE )
          {
              return Suspendable.class.getName();
          }
          else if( interfaceId == RECONTEXTUALIZABLE )
          {
              return Recontextualizable.class.getName();
          }
          else if( interfaceId == RECOMPOSABLE )
          {
              return Recomposable.class.getName();
          }
          else if( interfaceId == RECONFIGURABLE )
          {
              return Reconfigurable.class.getName();
          }
          else if( interfaceId == DISPOSABLE )
          {
              return Disposable.class.getName();
          }
          else
          {
              throw new IllegalStateException( "Unknown Interface Id " + interfaceId );
          }
      }
  
      private String getMethodName( long methodId )
      {
          if( methodId == ENABLE_LOGGING )
          {
              return "enableLogging()";
          }
          else if( methodId == SET_LOGGER )
          {
              return "setLogger()";
          }
          else if( methodId == CONTEXTUALIZE )
          {
              return "contextualize()";
          }
          else if( methodId == SERVICE )
          {
              return "service()";
          }
          else if( methodId == COMPOSE )
          {
              return "compose()";
          }
          else if( methodId == CONFIGURE )
          {
              return "configure()";
          }
          else if( methodId == PARAMETERIZE )
          {
              return "parameterize()";
          }
          else if( methodId == INITIALIZE )
          {
              return "initialize()";
          }
          else if( methodId == START )
          {
              return "start()";
          }
          else if( methodId == SUSPEND )
          {
              return "suspend()";
          }
          else if( methodId == RECONTEXTUALIZE )
          {
              return "recontextualize()";
          }
          else if( methodId == RECOMPOSE )
          {
              return "recompose()";
          }
          else if( methodId == RECONFIGURE )
          {
              return "reconfigure()";
          }
          else if( methodId == RESUME )
          {
              return "resume()";
          }
          else if( methodId == STOP )
          {
              return "stop()";
          }
          else if( methodId == DISPOSE )
          {
              return "dispose()";
          }
          else
          {
              throw new IllegalStateException( "Unknown Method Id " + methodId );
          }
      }
  
      private String getLastMethod( long state )
      {
          for( int i = 31; i >= 0; i-- )
          {
              long methodId = 0x1 << i;
              if( ( state & methodId ) != 0 )
              {
                  return getMethodName( methodId );
              }
          }
          throw new IllegalStateException( "No last state method found for state " + 
state );
      }
  
      /**
       * Test to see if this was the last initialization method.
       */
      private void generalCheckInitComplete()
      {
          if( m_state == ( m_methods & INIT_MASK ) )
          {
              // All init methods called
              m_active = true;
          }
      }
  
      /**
       * Initialization methods must be called in order, must all be called, may
       *  not be called more than once, and may not be called once any of the
       *  Descruction methods have been called.
       */
      private void generalCheckInit( final String message, final long interfaceId, 
final long methodId )
      {
          if( ( m_interfaces & interfaceId ) == 0 )
          {
              // Interface not implemented
              if( message == null )
              {
                  throw new IllegalStateException( m_object.getClass().getName() +
                                                   " does not implement " + 
getInterfaceName( interfaceId ) + "." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
          else if( ( m_state & methodId ) > 0 )
          {
              // Method already called.
              if( message == null )
              {
                  throw new IllegalStateException( getMethodName( methodId ) + " 
already called." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
          else if( m_state > methodId )
          {
              // Method called after a descruction method was called.
              if( message == null )
              {
                  throw new IllegalStateException( getMethodName( methodId ) +
                                                   " can not be called after " + 
getLastMethod( m_state ) + "." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
          else if( ( m_state & ( methodId - 1 ) ) != ( m_methods & ( methodId - 1 ) ) )
          {
              // One or more of the methods that should have been called before
              //  this method was not.
              if( message == null )
              {
                  throw new IllegalStateException( getMethodName( methodId ) +
                                                   " called out of order. " + 
getLastMethod( m_methods & ( methodId - 1 ) ) +
                                                   " must be called first." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
  
          // Add this method to the state
          m_state |= methodId;
  
          // See if the initialization is complete.
          generalCheckInitComplete();
      }
  
      /**
       * Active Service methods may only be called after all of the
       *  Initialization methods have been called, any before any of the
       *  Descruction methods have been called.  While in the active state,
       *  the contracts of the methods allow the active state methods to be
       *  called any number of times, in any order.
       * The resume() method should do nothing if suspend() has not yet been
       *  called for example.
       */
      private void generalCheckActive( final String message, final long interfaceId, 
final long methodId )
      {
          if( ( m_interfaces & interfaceId ) == 0 )
          {
              // Interface not implemented
              if( message == null )
              {
                  throw new IllegalStateException( m_object.getClass().getName() +
                                                   " does not implement " + 
getInterfaceName( interfaceId ) + "." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
          else if( !m_active )
          {
              // Component not in the active state.
              if( m_state < INIT_COMPLETE )
              {
                  // Still expecting initialization methods.
                  if( message == null )
                  {
                      throw new IllegalStateException( getMethodName( methodId ) +
                                                       " called before component was 
made active. " +
                                                       getLastMethod( m_methods & ( 
INIT_COMPLETE - 1 ) ) +
                                                       " must be called first." );
                  }
                  else
                  {
                      throw new IllegalStateException( message );
                  }
              }
              else
              {
                  // One or more destruction methods have been called.
                  if( message == null )
                  {
                      throw new IllegalStateException( getMethodName( methodId ) +
                                                       " called after component was 
made inactive.  Cannot call after " +
                                                       getLastMethod( m_state ) + "." 
);
                  }
                  else
                  {
                      throw new IllegalStateException( message );
                  }
              }
          }
      }
  
      /**
       * Descruction Methods must be called in order.  They may be called before
       *  all of the Initialization methods have been called if there was an
       *  error.
       */
      private void generalCheckDest( final String message, final long interfaceId, 
final long methodId )
      {
          if( ( m_interfaces & interfaceId ) == 0 )
          {
              // Interface not implemented
              if( message == null )
              {
                  throw new IllegalStateException( m_object.getClass().getName() +
                                                   " does not implement " + 
getInterfaceName( interfaceId ) + "." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
          else if( m_state > methodId )
          {
              // Method called after a later descruction method was called.
              if( message == null )
              {
                  throw new IllegalStateException( getMethodName( methodId ) +
                                                   " can not be called after " + 
getLastMethod( m_state ) + "." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
  
          // Add this method to the state
          m_state |= methodId;
  
          // Deactivate
          m_active = false;
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the ENABLE_LOGGING state has already been set, if the component implements
       * LogEnabled, and if the state has progressed beyond the Logger stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkLogEnabled()
      {
          checkLogEnabled( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the ENABLE_LOGGING state has already been set, if the component implements
       * LogEnabled, and if the state has progressed beyond the Logger stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkLogEnabled( final String message )
      {
          generalCheckInit( message, LOG_ENABLED, ENABLE_LOGGING );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the SET_LOGGER state has already been set, if the component implements
       * Loggable, and if the state has progressed beyond the Logger stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkLoggable()
      {
          checkLogEnabled( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the SET_LOGGER state has already been set, if the component implements
       * Loggable, and if the state has progressed beyond the Logger stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkLoggable( final String message )
      {
          generalCheckInit( message, LOGGABLE, SET_LOGGER );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the CONTEXTUALIZED state has already been set, if the component implements
       * Contextualizable, and if the state has progressed beyond the Context stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkContextualized()
      {
          checkContextualized( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the CONTEXTUALIZED state has already been set, if the component implements
       * Contextualizable, and if the state has progressed beyond the Context stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkContextualized( final String message )
      {
          generalCheckInit( message, CONTEXTUALIZABLE, CONTEXTUALIZE );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the SERVICE state has already been set, if the component implements
       * Composable, and if the state has progressed beyond the Configuration stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkServiced()
      {
          checkServiced( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the SERVICE state has already been set, if the component implements
       * Composable, and if the state has progressed beyond the Configuration stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkServiced( final String message )
      {
          generalCheckInit( message, SERVICEABLE, SERVICE );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the COMPOSED state has already been set, if the component implements
       * Composable, and if the state has progressed beyond the Configuration stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkComposed()
      {
          checkComposed( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the COMPOSED state has already been set, if the component implements
       * Composable, and if the state has progressed beyond the Configuration stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkComposed( final String message )
      {
          generalCheckInit( message, COMPOSABLE, COMPOSE );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the CONFIGURED state has already been set, if the component implements
       * Configurable, and if the state has progressed beyond the Configuration stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkConfigured()
      {
          checkConfigured( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the CONFIGURED state has already been set, if the component implements
       * Configurable, and if the state has progressed beyond the Configuration stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkConfigured( final String message )
      {
          generalCheckInit( message, CONFIGURABLE, CONFIGURE );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the PARAMETERIZED state has already been set, if the component implements
       * Parameterizable, and if the state has progressed beyond the Parameters stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkParameterized()
      {
          checkParameterized( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the PARAMETERIZED state has already been set, if the component implements
       * Parameterizable, and if the state has progressed beyond the Parameters stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkParameterized( final String message )
      {
          generalCheckInit( message, PARAMETERIZABLE, PARAMETERIZE );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the INITIALIZED state has already been set, if the component implements
       * Initializable, and if the state has progressed beyond the 
<code>initialize</code> stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkInitialized()
      {
          checkInitialized( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the INITIALIZED state has already been set, if the component implements
       * Initializable, and if the state has progressed beyond the 
<code>initialize</code> stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkInitialized( final String message )
      {
          generalCheckInit( message, INITIALIZABLE, INITIALIZE );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the STARTED state has already been set, if the component implements
       * Startable, and if the state has progressed beyond the <code>start</code> 
stage.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkStarted()
      {
          checkStarted( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the STARTED state has already been set, if the component implements
       * Startable, and if the state has progressed beyond the <code>start</code> 
stage.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkStarted( final String message )
      {
          generalCheckInit( message, STARTABLE, START );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the SUSPENDED state has already been set, if the component implements
       * Suspendable, and if the Component is active.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkSuspended()
      {
          checkSuspended( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the SUSPENDED state has already been set, if the component implements
       * Suspendable, and if the Component is active.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkSuspended( final String message )
      {
          generalCheckActive( message, SUSPENDABLE, SUSPEND );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the SUSPENDED state has not been set, if the component implements
       * Suspendable, and if the Component is active.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkResumed()
      {
          checkResumed( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the SUSPENDED state has not been set, if the component implements
       * Suspendable, and if the Component is active.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkResumed( final String message )
      {
          generalCheckActive( message, SUSPENDABLE, RESUME );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the STOPPED state has not been set, if the component implements
       * Startable, and if the Component is active.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkStopped()
      {
          checkStopped( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the STOPPED state has not been set, if the component implements
       * Startable, and if the Component is active.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkStopped( final String message )
      {
          generalCheckDest( message, STARTABLE, STOP );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the DISPOSED state has not been set, if the component implements
       * Disposable.
       *
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkDisposed()
      {
          checkDisposed( null );
      }
  
      /**
       * Throw an exception if the initialization is out of order.  It tests to see
       * if the DISPOSED state has not been set, if the component implements
       * Disposable.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkDisposed( final String message )
      {
          generalCheckDest( message, DISPOSABLE, DISPOSE );
      }
  
      /**
       * Checks to see if the state is active.
       *
       * @throws IllegalStateException if the component is not active
       */
      public void checkActive()
      {
          checkActive( null );
      }
  
      /**
       * Checks to see if the state is active.
       *
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the component is not active
       */
      public void checkActive( final String message )
      {
          if( isActive() )
          {
              return;
          }
  
          // Component not in the active state.
          if( m_state < INIT_COMPLETE )
          {
              // Still expecting initialization methods.
              if( message == null )
              {
                  throw new IllegalStateException( "Component not in the active state. 
" +
                                                   getLastMethod( m_methods & ( 
INIT_COMPLETE - 1 ) ) +
                                                   " was not called." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
          else
          {
              // One or more destruction methods have been called.
              if( message == null )
              {
                  throw new IllegalStateException( "Component not in the active state 
because " +
                                                   getLastMethod( m_state ) + " was 
called." );
              }
              else
              {
                  throw new IllegalStateException( message );
              }
          }
      }
  
      /**
       * Checks to see if the state is active, and returns true or false.
       *
       * @return <code>true</code> if active, <code>false</code> if not
       */
      public boolean isActive()
      {
          return m_active;
      }
  
      /**
       * Make sure object has not been assigned yet.
       *
       * @param object to test
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkNotAssigned( final Object object )
      {
          checkNotAssigned( object, WRITE_FAIL );
      }
  
      /**
       * Make sure object has not been assigned yet.
       *
       * @param object to test
       * @param message the message to include in the thrown exception
       * @throws IllegalStateException if the state is manage out of order
       */
      public void checkNotAssigned( final Object object, final String message )
      {
          if( null != object )
          {
              throw new IllegalStateException( message );
          }
      }
  }
  
  
  
  
  1.1                  
jakarta-avalon-excalibur/fortress/src/test/org/apache/excalibur/fortress/util/test/ComponentTestCase.java
  
  Index: ComponentTestCase.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.fortress.util.test;
  
  import junit.framework.TestCase;
  import org.apache.avalon.framework.component.DefaultComponentManager;
  import org.apache.avalon.framework.configuration.DefaultConfiguration;
  import org.apache.avalon.framework.context.DefaultContext;
  import org.apache.avalon.framework.logger.NullLogger;
  import org.apache.avalon.framework.parameters.Parameters;
  import org.apache.excalibur.fortress.util.test.FullLifecycleComponent;
  
  /**
   * This class provides basic facilities for enforcing Avalon's contracts
   * within your own code.
   *
   * @author <a href="[EMAIL PROTECTED]">Berin Loritsch</a>
   * @version CVS $Revision: 1.1 $ $Date: 2002/09/25 15:10:53 $
   */
  public final class ComponentTestCase
      extends TestCase
  {
      public ComponentTestCase( String test )
      {
          super( test );
      }
  
      public void testCorrectLifecycle()
          throws Exception
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          component.enableLogging( new NullLogger() );
          component.contextualize( new DefaultContext() );
          component.compose( new DefaultComponentManager() );
          component.configure( new DefaultConfiguration( "", "" ) );
          component.parameterize( new Parameters() );
          component.initialize();
          component.start();
          component.suspend();
          component.resume();
          component.stop();
          component.dispose();
      }
  
      public void testMissingLogger()
          throws Exception
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          try
          {
              component.contextualize( new DefaultContext() );
          }
          catch( Exception e )
          {
              return;
          }
          fail( "Did not detect missing logger" );
      }
  
      public void testOutOfOrderInitialize()
          throws Exception
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          component.enableLogging( new NullLogger() );
          component.contextualize( new DefaultContext() );
          component.compose( new DefaultComponentManager() );
          try
          {
              component.initialize();
              component.parameterize( new Parameters() );
          }
          catch( Exception e )
          {
              return;
          }
          fail( "Did not detect out of order initialization" );
      }
  
      public void testOutOfOrderDispose()
          throws Exception
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          component.enableLogging( new NullLogger() );
          component.contextualize( new DefaultContext() );
          component.compose( new DefaultComponentManager() );
          component.configure( new DefaultConfiguration( "", "" ) );
          component.parameterize( new Parameters() );
          component.initialize();
          component.start();
          component.suspend();
          component.resume();
  
          try
          {
              component.dispose();
              component.stop();
          }
          catch( Exception e )
          {
              return;
          }
          fail( "Did not detect out of order disposal" );
      }
  
      public void testDoubleAssignOfLogger()
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          try
          {
              component.enableLogging( new NullLogger() );
              component.enableLogging( new NullLogger() );
          }
          catch( Exception e )
          {
              // test successfull
              return;
          }
  
          fail( "Did not detect double assignment of Logger" );
      }
  
      public void testDoubleAssignOfContext()
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          component.enableLogging( new NullLogger() );
          try
          {
              component.contextualize( new DefaultContext() );
              component.contextualize( new DefaultContext() );
          }
          catch( Exception e )
          {
              // test successfull
              return;
          }
  
          fail( "Did not detect double assignment of Context" );
      }
  
      public void testDoubleAssignOfParameters()
          throws Exception
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          component.enableLogging( new NullLogger() );
          component.contextualize( new DefaultContext() );
          component.compose( new DefaultComponentManager() );
          component.configure( new DefaultConfiguration( "", "" ) );
  
          try
          {
              component.parameterize( new Parameters() );
              component.parameterize( new Parameters() );
          }
          catch( Exception e )
          {
              // test successfull
              return;
          }
  
          fail( "Did not detect double assignment of Parameters" );
      }
  
      public void testDoubleAssignOfConfiguration() throws Exception
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          component.enableLogging( new NullLogger() );
          component.contextualize( new DefaultContext() );
          component.compose( new DefaultComponentManager() );
          try
          {
              component.configure( new DefaultConfiguration( "", "" ) );
              component.configure( new DefaultConfiguration( "", "" ) );
          }
          catch( Exception e )
          {
              // test successfull
              return;
          }
  
          fail( "Did not detect double assignment of Configuration" );
      }
  
      public void testDoubleAssignOfComponentManger()
          throws Exception
      {
          FullLifecycleComponent component = new FullLifecycleComponent();
  
          component.enableLogging( new NullLogger() );
          component.contextualize( new DefaultContext() );
          try
          {
              component.compose( new DefaultComponentManager() );
              component.compose( new DefaultComponentManager() );
          }
          catch( Exception e )
          {
              // test successfull
              return;
          }
  
          fail( "Did not detect double assignment of ComponentLocator" );
      }
  }
  
  
  
  1.1                  
jakarta-avalon-excalibur/fortress/src/test/org/apache/excalibur/fortress/util/test/FullLifecycleComponent.java
  
  Index: FullLifecycleComponent.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.fortress.util.test;
  
  import org.apache.excalibur.fortress.util.ComponentStateValidator;
  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.framework.activity.Suspendable;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.ContextException;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.logger.LogEnabled;
  import org.apache.avalon.framework.logger.Logger;
  import org.apache.avalon.framework.parameters.ParameterException;
  import org.apache.avalon.framework.parameters.Parameterizable;
  import org.apache.avalon.framework.parameters.Parameters;
  import org.apache.avalon.framework.thread.ThreadSafe;
  
  /**
   * This test class is used to test the AbstractComponent facilities for you.
   *
   * @author <a href="[EMAIL PROTECTED]">Berin Loritsch</a>
   * @version CVS $Revision: 1.1 $ $Date: 2002/09/25 15:10:53 $
   */
  public final class FullLifecycleComponent
      implements LogEnabled, Contextualizable, Parameterizable, Configurable,
      Composable, Initializable, Startable, Suspendable, Disposable,
      ThreadSafe
  {
      private ComponentStateValidator m_validator = new ComponentStateValidator( this 
);
      private Logger m_logger;
      private Context m_context;
      private Parameters m_parameters;
      private Configuration m_configuration;
      private ComponentManager m_componentManager;
  
      public void enableLogging( Logger logger )
      {
          m_validator.checkNotAssigned( m_logger );
          m_validator.checkLogEnabled();
  
          m_logger = logger;
      }
  
      public void contextualize( Context context )
          throws ContextException
      {
          m_validator.checkNotAssigned( m_context );
          m_validator.checkContextualized();
  
          m_context = context;
      }
  
      public void parameterize( Parameters params )
          throws ParameterException
      {
          m_validator.checkNotAssigned( m_parameters );
          m_validator.checkParameterized();
  
          m_parameters = params;
      }
  
      public void configure( Configuration config )
          throws ConfigurationException
      {
          m_validator.checkNotAssigned( m_configuration );
          m_validator.checkConfigured();
  
          m_configuration = config;
      }
  
      public void compose( ComponentManager manager )
          throws ComponentException
      {
          m_validator.checkNotAssigned( m_componentManager );
          m_validator.checkComposed();
      }
  
      public void initialize()
          throws Exception
      {
          m_validator.checkInitialized();
      }
  
      public void start()
          throws Exception
      {
          m_validator.checkStarted();
      }
  
      public void suspend()
      {
          m_validator.checkSuspended();
      }
  
      public void resume()
      {
          m_validator.checkResumed();
      }
  
      public void stop()
          throws Exception
      {
          m_validator.checkStopped();
      }
  
      public void dispose()
      {
          m_validator.checkDisposed();
  
          m_logger = null;
          m_context = null;
          m_parameters = null;
          m_configuration = null;
          m_componentManager = null;
      }
  }
  
  
  

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

Reply via email to