craigmcc    01/08/13 14:16:01

  Added:       workflow/src/java/org/apache/commons/workflow/base
                        BaseActivity.java BaseContext.java BaseScope.java
                        BaseStep.java
  Log:
  Initial check-in of the workflow management system proposal.
  
  Revision  Changes    Path
  1.1                  
jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/base/BaseActivity.java
  
  Index: BaseActivity.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/base/BaseActivity.java,v
 1.1 2001/08/13 21:16:01 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2001/08/13 21:16:01 $
   *
   * ====================================================================
   * 
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */ 
  
  package org.apache.commons.workflow.base;
  
  
  import org.apache.commons.workflow.Activity;
  import org.apache.commons.workflow.Step;
  
  
  /**
   * <p><strong>BaseActivity</strong> is a convenient base class for more
   * sophisticated <code>Activity</code> implementations.  It includes
   * management of the static relationships of Steps to each other as part
   * of an owning Activity.</p>
   *
   * @version $Revision: 1.1 $ $Date: 2001/08/13 21:16:01 $
   * @author Craig R. McClanahan
   */
  
  public class BaseActivity implements Activity {
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      /**
       * The first Step associated with this Activity.
       */
      protected Step firstStep = null;
  
  
      /**
       * The last Step associated with this Activity.
       */
      protected Step lastStep = null;
  
  
      // ------------------------------------------------------------- Properties
  
  
      /**
       * Return the first Step associated with this Activity.
       */
      public Step getFirstStep() {
  
          return (this.firstStep);
  
      }
  
  
      /**
       * Return the last Step associated with this Activity.
       */
      public Step getLastStep() {
  
          return (this.lastStep);
  
      }
  
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Add a new Step to the end of the sequence of Steps associated with
       * this Activity.
       *
       * @param step The new step to be added
       */
      public void addStep(Step step) {
  
          if (firstStep == null) {
              step.setPreviousStep(null);
              step.setNextStep(null);
              firstStep = step;
              lastStep = step;
          } else {
              step.setPreviousStep(lastStep);
              step.setNextStep(null);
              lastStep.setNextStep(step);
              lastStep = step;
          }
  
      }
  
  
  }
  
  
  
  1.1                  
jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/base/BaseContext.java
  
  Index: BaseContext.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/base/BaseContext.java,v
 1.1 2001/08/13 21:16:01 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2001/08/13 21:16:01 $
   *
   * ====================================================================
   * 
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */ 
  
  package org.apache.commons.workflow.base;
  
  
  import java.util.EmptyStackException;
  import org.apache.commons.collections.ArrayStack;
  import org.apache.commons.workflow.Activity;
  import org.apache.commons.workflow.Context;
  import org.apache.commons.workflow.Step;
  import org.apache.commons.workflow.StepException;
  import org.apache.commons.workflow.Scope;
  
  
  /**
   * <strong>BaseContext</strong> is a basic <code>Context</code> implementation
   * that can serve as a convenient base class for more sophisticated
   * <code>Context</code> implementations.
   *
   * <p><strong>WARNING</strong> - No synchronization is performed within this
   * class.  If it is used in a multiple thread environment, callers must
   * take suitable precations.</p>
   *
   * @version $Revision: 1.1 $ $Date: 2001/08/13 21:16:01 $
   * @author Craig R. McClanahan
   */
  
  public class BaseContext implements Context {
  
  
  
      // ----------------------------------------------------------- Constructors
  
  
      /**
       * Construct a new BaseContext with all default values.
       */
      public BaseContext() {
  
          super();
          names[LOCAL_SCOPE] = "local";
          scopes[LOCAL_SCOPE] = new BaseScope();
  
      }
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      /**
       * The <code>Activity</code> that we are associated with and executing
       * <code>Steps</code> from (if any).
       */
      protected Activity activity = null;
  
  
      /**
       * The set of names associated with the registered <code>Scopes</code>.
       */
      protected String names[] = new String[MAX_SCOPES];
  
  
      /**
       * The <code>Step</code> that will be executed first the next time that
       * <code>execute()</code> is called.  This is maintained dynamically as
       * execution proceeds, much like the "next instruction pointer" of a
       * CPU tracks what instruction will be executed next.
       */
      protected Step nextStep = null;
  
  
      /**
       * The set of <code>Scopes</code> that have been associated with
       * this Context.  When initially created, every Context has a
       * Scope attached to identifier LOCAL_SCOPE already created.
       */
      protected Scope scopes[] = new Scope[MAX_SCOPES];
  
  
      /**
       * The evaluation stack of nameless objects being processed.
       */
      protected ArrayStack stack = new ArrayStack();
  
  
      /**
       * The suspension flag.  If this is set when a particular <code>Step</code>
       * returns, control will be returned from our <code>execute()</code>
       * method to allow interaction with the rest of the application.  The
       * next time that <code>execute()</code> is called, execution will
       * resume with the next scheduled step.
       */
      protected boolean suspend = false;
  
  
      // --------------------------------------------------- Scope Access Methods
  
  
      // These methods provide Steps with the ability to get and set arbitrary
      // objects in arbitrary scopes.  When a scope is not mentioned explicitly,
      // either LOCAL_SCOPE will be used, or scopes will be searched in
      // increasing order of their identifiers, as specified in the various
      // method descriptions.
  
  
      /**
       * Does a bean with the specified key exist in any specified scope?
       * Scopes will be searched in ascending order of their identifiers,
       * starting with LOCAL_SCOPE.
       *
       * @param key Key of the bean to be searched for (cannot be null)
       */
      public boolean contains(String key) {
  
          for (int i = 0; i < MAX_SCOPES; i++) {
              if (scopes[i] == null)
                  continue;
              if (scopes[i].containsKey(key))
                  return (true);
          }
          return (false);
  
      }
  
  
      /**
       * Does a bean with the specified key exist in the specified scope?
       *
       * @param key Key of the bean to be searched for (cannot be null)
       * @param scope Identifier of the scope to be returned.
       */
      public boolean contains(String key, int scope) {
  
          if (scopes[scope] == null)
              return (false);
          else
              return (scopes[scope].containsKey(key));
  
      }
  
  
      /**
       * Return the bean associated with the specified key, if it exists in
       * any scope.  Scopes will be searched in increasing order of their
       * identifiers, starting with LOCAL_SCOPE.  If the underlying Scope
       * allows null values, a <code>null</code> return will be ambiguous.
       * Therefore, you can use the <code>contains()</code> method to determine
       * whether the key actually exists.
       *
       * @param key Key of the bean to be retrieved (cannot be null)
       */
      public Object get(String key) {
  
          for (int i = 0; i < MAX_SCOPES; i++) {
              if (scopes[i] == null)
                  continue;
              Object bean = scopes[i].get(key);
              if (bean != null)
                  return (bean);
          }
          return (null);
  
      }
  
  
      /**
       * Return the bean associated with the specified key, if it exists in
       * the specified scope.  If the underlying Scope allows null values,
       * a <code>null</code> return will be ambiguous.  Therefore, you can
       * use the <code>contains()</code> method to determine whether the
       * key actually exists.
       *
       * @param key Key of the bean to be searched for
       * @param scope Identifier of the scope to be searched
       */
      public Object get(String key, int scope) {
  
          if (scopes[scope] == null)
              return (null);
          else
              return (scopes[scope].get(key));
  
      }
  
  
      /**
       * Store the specified bean under the specified key, in local scope,
       * replacing any previous value for that key.  Any previous value will
       * be returned.
       *
       * @param key Key of the bean to be stored (cannot be null)
       * @param value Value of the bean to be stored
       */
      public Object put(String key, Object value) {
  
          return (scopes[LOCAL_SCOPE].put(key, value));
  
      }
  
  
      /**
       * Store the specified bean under the specified key, in the specified
       * scope, replacing any previous value for that key.  Any previous value
       * will be returned.
       *
       * @param key Key of the bean to be stored (cannot be null)
       * @param value Value of the bean to be stored
       * @param scope Identifier of the scope to use for storage
       */
      public Object put(String key, Object value, int scope) {
  
          if (scopes[scope] == null)
              return (null);
          else
              return (scopes[scope].put(key, value));
  
      }
  
  
      /**
       * Remove any existing value for the specified key, in any scope.
       * Scopes will be searched in ascending order of their identifiers,
       * starting with LOCAL_SCOPE.  Any previous value for this key will
       * be returned.
       *
       * @param key Key of the bean to be removed
       */
      public Object remove(String key) {
  
          return (scopes[LOCAL_SCOPE].remove(key));
  
      }
  
  
      /**
       * Remove any existing value for the specified key, from the specified
       * scope.  Any previous value for this key will be returned.
       *
       * @param key Key of the bean to be removed
       * @param scope Scope the bean to be removed from
       */
      public Object remove(String key, int scope) {
  
          if (scopes[scope] == null)
              return (null);
          else
              return (scopes[scope].remove(key));
  
      }
  
  
  
      // --------------------------------------------- Scope Registration Methods
  
  
      // These methods provide capabilities to register and retrieve
      // Scope implementations.  Workflow engine implementations will
      // register desired scopes when they create Context instances.
  
  
      /**
       * Register a Scope implementation under the specified identifier.
       * It is not legal to replace the LOCAL_SCOPE implementation that is
       * provided by the Context implementation.
       *
       * @param scope Scope identifier to register under
       * @param name Scope name to register under
       * @param impl Scope implementation to be registered (or null to
       *  remove a previous registration)
       * @exception IllegalArgumentException if you attempt to register
       *  or deregister the local scope
       */
      public void addScope(int scope, String name, Scope impl) {
  
          if (scope == LOCAL_SCOPE)
              throw new IllegalArgumentException("Cannot replace local scope");
          if (impl == null) {
              names[scope] = null;
              scopes[scope] = null;
          } else {
              names[scope] = name;
              scopes[scope] = impl;
          }
  
      }
  
  
      /**
       * Return the Scope implementation registered for the specified
       * identifier, if any; otherwise, return <code>null</code>.
       *
       * @param scope Scope identifier to select
       */
      public Scope getScope(int scope) {
  
          return (scopes[scope]);
  
      }
  
  
      /**
       * Return the Scope identifier registered for the specified
       * name, if any; otherwise, return <code>-1</code>.
       *
       * @param name Scope name to select
       */
      public int getScopeId(String name) {
  
          for (int i = 0; i < names.length; i++) {
              if (names[i] == null)
                  continue;
              if (names[i].equals(name))
                  return (i);
          }
          return (-1);
  
      }
  
  
      // ----------------------------------------------- Evaluation Stack Methods
  
  
      /**
       * Clear the evaluation stack.
       */
      public void clear() {
  
          stack.clear();
  
      }
  
  
      /**
       * Return the top item from the evaluation stack without removing it.
       *
       * @exception EmptyStackException if the stack is empty
       */
      public Object peek() throws EmptyStackException {
  
          return (stack.peek());
  
      }
  
  
      /**
       * Pop and return the top item from the evaluation stack.
       *
       * @exception EmptyStackException if the stack is empty
       */
      public Object pop() throws EmptyStackException {
  
          return (stack.pop());
  
      }
  
  
      /**
       * Push a new item onto the top of the evaluation stack.
       *
       * @param item New item to be pushed
       */
      public void push(Object item) {
  
          stack.push(item);
  
      }
  
  
      // ---------------------------------------------- Dynamic Execution Methods
  
  
      // These methods are used to request the dynamic execution of the
      // Steps related to a particular Activity.
  
  
      /**
       * <p>Execute the <code>Step</code> currently identified as the next
       * step, and continue execution until there is no next step, or until
       * the <code>suspend</code> property has been set to true.
       *
       * @exception StepException if an exception is thrown by the
       *  <code>execute()</code> method of a Step we have executed
       * @exception IllegalStateException if there is no defined next step
       *  (either because there is no Activity, or because we have already
       *  completed all the steps of this activity)
       */
      public void execute() throws StepException {
  
          // Do we actually have a next step to be performed
          if (activity == null)
              throw new IllegalStateException("No Activity has been selected");
          else if (nextStep == null)
              throw new IllegalStateException("Activity has been completed");
  
          // Reset the suspend flag until set by another step
          suspend = false;
  
          // Perform execution until suspended or completed
          while (true) {
  
              if (suspend)
                  break;                // Suspend set by a Step
              if (nextStep == null)
                  break;                // We have completed this Activity
  
              Step thisStep = nextStep;
              nextStep = thisStep.getNextStep();
              thisStep.execute(this);
  
          }
  
      }
  
  
      /**
       * <p>Return the <code>Activity</code> we will be executing when the
       * <code>execute()</code> method is called, if any.</p>
       */
      public Activity getActivity() {
  
          return (this.activity);
  
      }
  
  
      /**
       * <p>Set the <code>Activity</code> to be executed, and make the first
       * defined <code>Step</code> within this <code>Activity</code> the next
       * action to be performed by <code>execute()</code>.</p>
       *
       * <p>If <code>null</code> is passed, any currently associated Activity
       * will be released, and the evaluation stack will be cleared.</p>
       *
       * <p><strong>WARNING</strong> - This will have to become more sophisticated
       * in order to support calling nested Activities.</p>
       *
       * @param activity The new Activity to be executed, or <code>null</code>
       *  to release resources
       */
      public void setActivity(Activity activity) {
  
          if (activity == null) {
              this.activity = null;
              this.nextStep = null;
              clear();
          } else {
              this.activity = activity;
              this.nextStep = activity.getFirstStep();
          }
  
      }
  
  
      /**
       * <p>Return the <code>Step</code> that will be executed the next time
       * that <code>execute()</code> is called, if any.</p>
       */
      public Step getNextStep() {
  
          return (this.nextStep);
  
      }
  
  
      /**
       * <p>Set the <code>Step</code> that will be executed the next time
       * that <code>execute()</code> is called.  This is called by a
       * <code>Step</code> that wants to perform branching based on some
       * calculated results.</p>
       *
       * @param nextStep The next Step to be executed
       *
       * @exception IllegalArgumentException if the specified Step is not
       *  part of the current Activity
       */
      public void setNextStep(Step nextStep) {
  
          if (this.activity != nextStep.getActivity())
              throw new IllegalArgumentException
                  ("Step is not part of the current Activity");
          this.nextStep = nextStep;
  
      }
  
  
      /**
       * <p>Return the suspend flag.</p>
       */
      public boolean getSuspend() {
  
          return (this.suspend);
  
      }
  
  
      /**
       * <p>Set the suspend flag.  This is called by a <code>Step</code> that
       * wants to signal the <code>Context</code> to return control to the
       * caller of the <code>execute()</code> method before executing the
       * next <code>Step</code> in the current activity.</p>
       *
       * @param suspend The new suspend flag
       */
      public void setSuspend(boolean suspend) {
  
          this.suspend = suspend;
  
      }
  
  
  }
  
  
  
  1.1                  
jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/base/BaseScope.java
  
  Index: BaseScope.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/base/BaseScope.java,v
 1.1 2001/08/13 21:16:01 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2001/08/13 21:16:01 $
   *
   * ====================================================================
   * 
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */ 
  
  package org.apache.commons.workflow.base;
  
  
  import java.util.Collection;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.Map;
  import java.util.Set;
  import org.apache.commons.workflow.Scope;
  import org.apache.commons.workflow.ScopeListener;
  import org.apache.commons.workflow.util.ScopeSupport;
  
  
  /**
   * <strong>BaseScope</strong> is a basic <code>Scope</code> implementation
   * that maintains its bean collection in an in-memory HashMap.  This can
   * also serve as a convenient base class for more sophisticated
   * <code>Scope</code> implementations.
   *
   * <p><strong>WARNING</strong> - No synchronization is performed within this
   * class.  If it is used in a multiple thread environment, callers must
   * take suitable precations.</p>
   *
   * @version $Revision: 1.1 $ $Date: 2001/08/13 21:16:01 $
   * @author Craig R. McClanahan
   */
  
  public class BaseScope implements Scope {
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      /**
       * The HashMap that contains our registered keys and beans.
       */
      protected HashMap map = new HashMap();
  
  
      /**
       * The event listener support object for this <code>Scope</code>.
       */
      protected ScopeSupport support = new ScopeSupport(this);
  
  
      // ------------------------------------------------------------ Map Methods
  
  
      /**
       * Remove all beans from this Map and call <code>scopeCleared() on
       * all registered <code>ScopeListeners</code>.
       */
      public void clear() {
  
          map.clear();
          support.fireScopeCleared();
  
      }
  
  
      /**
       * Return <code>true</code> if this map contains the specified key.
       *
       * @param key Key to be looked up
       */
      public boolean containsKey(Object key) {
  
          return (map.containsKey(key));
  
      }
  
  
      /**
       * Return <code>true</code> if this map contains the specified value.
       *
       * @param value Value to be looked up
       */
      public boolean containsValue(Object value) {
  
          return (map.containsValue(value));
  
      }
  
  
      /**
       * Return a set view of the mappings contained in this map.
       */
      public Set entrySet() {
  
          return (map.entrySet());
  
      }
  
  
      /**
       * Compare the specified object with this map for equality.
       *
       * @param object Object to be compared
       */
      public boolean equals(Object object) {
  
          return (map.equals(object));
  
      }
  
  
      /**
       * Return the value to which this map maps the specified key.
       *
       * @param key Key to be looked up
       */
      public Object get(Object key) {
  
          return (get((String) key));
  
      }
  
  
      /**
       * Return the value to which this map maps the specified key.
       *
       * @param key Key to be looked up
       */
      public Object get(String key) {
  
          return (map.get(key));
  
      }
  
  
      /**
       * Return the hash code value for this map.
       */
      public int hashCode() {
  
          return (map.hashCode());
  
      }
  
  
      /**
       * Return <code>true</code> if this map is empty.
       */
      public boolean isEmpty() {
  
          return (map.isEmpty());
  
      }
  
  
      /**
       * Return a set view of the keys contained in this map.
       */
      public Set keySet() {
  
          return (map.keySet());
  
      }
  
  
      /**
       * Add or replace the bean associated with the specified key.
       *
       * @param key Key with which the new value should be associated
       *  (cannot be null)
       * @param bean Bean to be associated with this key (cannot be null)
       */
      public Object put(Object key, Object bean) {
  
          return (put((String) key, bean));
  
      }
  
  
      /**
       * Add the specified bean, associated with the specified key, to this
       * scope and replace any previous bean associated with this key.  If
       * the bean was added, call <code>beanAdded()</code> on all registered
       * listeners after the add is done.  If an old bean was replaced,
       * call <code>beanReplaced()</code> (passing the old value in the event)
       * on all registered <code>ScopeListeners</code> after the removal
       * is done.  If a bean was replaced, the old value is also returned;
       * otherwise <code>null</code> is returned.
       *
       * @param key Key with which the new value should be associated
       *  (cannot be null)
       * @param bean Bean to be associated with this key (cannot be null)
       *
       * @exception IllegalArgumentException if <code>key</code> or
       *  <code>bean</code> is null
       */
      public Object put(String key, Object bean) {
  
          if (key == null)
              throw new IllegalArgumentException("Key cannot be null");
          if (bean == null)
              throw new IllegalArgumentException("Value cannot be null");
  
          Object old = get(key);
          if (map.containsKey(key)) {
              map.put(key, bean);
              support.fireBeanReplaced(key, old);
          } else {
              map.put(key, bean);
              support.fireBeanAdded(key, bean);
          }
          return (old);
              
      }
  
  
      /**
       * Copy all of the mappings from the specified map into this map,
       * firing appropriate <code>beanAdded()</code> and
       * <code>beanReplaced()</code> events along the way.
       *
       * @param in Map whose contents are to be added
       */
      public void putAll(Map in) {
  
          Iterator keys = in.keySet().iterator();
          while (keys.hasNext()) {
              Object key = keys.next();
              put(key, in.get(key));
          }
  
      }
  
  
      /**
       * Remove the bean associated with the specified key (if any), and return
       * the old value if removed.
       *
       * @param key Key of the bean to remove (cannot be null)
       */
      public Object remove(Object key) {
  
          return (remove((String) key));
  
      }
  
  
  
      /**
       * Remove the bean associated with the specified key (if any).  If such
       * a bean is found and removed, call <code>beanRemoved()</code> on all
       * registered <code>ScopeListeners</code> after the removal is done.
       * Return the old value (if any); otherwise return <code>null</code>.
       *
       * @param key Key of the bean to remove (cannot be null)
       *
       * @exception IllegalArgumentException if <code>key</code> is null
       */
      public Object remove(String key) {
  
          if (map.containsKey(key)) {
              Object old = map.remove(key);
              support.fireBeanRemoved(key, old);
              return (old);
          }
          return (null);
  
      }
  
  
      /**
       * Return the number of key-value mappings in this map.
       */
      public int size() {
  
          return (map.size());
  
      }
  
  
      /**
       * Return a Collection view of the values contained in this map.
       */
      public Collection values() {
  
          return (map.values());
  
      }
  
  
      // ------------------------------------------------- Event Listener Methods
  
  
      /**
       * Add a listener that is notified each time beans are added,
       * replaced, or removed in this scope.
       *
       * @param listener The ScopeListener to be added
       */
      public void addScopeListener(ScopeListener listener) {
  
          support.addScopeListener(listener);
  
      }
  
  
      /**
       * Remove a listener that is notified each time beans are added,
       * replaced, or removed in this scope.
       *
       * @param listener The ScopeListener to be removed
       */
      public void removeScopeListener(ScopeListener listener) {
  
          support.removeScopeListener(listener);
  
      }
  
  
  }
  
  
  
  1.1                  
jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/base/BaseStep.java
  
  Index: BaseStep.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/base/BaseStep.java,v
 1.1 2001/08/13 21:16:01 craigmcc Exp $
   * $Revision: 1.1 $
   * $Date: 2001/08/13 21:16:01 $
   *
   * ====================================================================
   * 
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:  
   *       "This product includes software developed by the 
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written 
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */ 
  
  package org.apache.commons.workflow.base;
  
  
  import org.apache.commons.workflow.Activity;
  import org.apache.commons.workflow.Context;
  import org.apache.commons.workflow.Step;
  import org.apache.commons.workflow.StepException;
  
  
  /**
   * <p><strong>BaseStep</strong> is a convenient base class for more sophisticated
   * <code>Step</code> implementations.  It includes management of the static
   * relationships of Steps to each other, and to their owning Activity, but
   * requires the implementation to provide an <code>execute()</code> method.
   *
   * @version $Revision: 1.1 $ $Date: 2001/08/13 21:16:01 $
   * @author Craig R. McClanahan
   */
  
  public abstract class BaseStep implements Step {
  
  
      // ----------------------------------------------------- Instance Variables
  
  
      /**
       * The Activity that owns this Step.
       */
      protected Activity activity = null;
  
  
  
      /**
       * The unique identifier (within this Activity) of this Step.
       */
      protected String id = null;
  
  
      /**
       * The next Step in our associated Activity.
       */
      protected Step nextStep = null;
  
  
      /**
       * The previous Step in our associated Activity.
       */
      protected Step previousStep = null;
  
  
  
      // ------------------------------------------------------------- Properties
  
  
      /**
       * Return the Activity that owns this Step.
       */
      public Activity getActivity() {
  
          return (this.activity);
  
      }
  
  
      /**
       * Set the Activity that owns this Step.
       *
       * @param activity The new owning Activity
       */
      public void setActivity(Activity activity) {
  
          this.activity = activity;
  
      }
  
  
      /**
       * Return the unique identifier (within this Activity) of this Step.
       */
      public String getId() {
  
          return (this.id);
  
      }
  
  
      /**
       * Set the unique identifier (within this Activity) of this Step.
       *
       * @param id The new unique identifier
       */
      public void setId(String id) {
  
          this.id = id;
  
      }
  
  
      /**
       * Return the next Step in our associated Activity.
       */
      public Step getNextStep() {
  
          return (this.nextStep);
  
      }
  
  
      /**
       * Set the next Step in our associated Activity.
       *
       * @param nextStep The new next Step
       */
      public void setNextStep(Step nextStep) {
  
          this.nextStep = nextStep;
  
      }
  
  
      /**
       * Return the previous Step in our associated Activity.
       */
      public Step getPreviousStep() {
  
          return (this.previousStep);
  
      }
  
  
      /**
       * Set the previous Step in our associated Activity.
       *
       * @param previousStep The new previous Step
       */
      public void setPreviousStep(Step previousStep) {
  
          this.previousStep = previousStep;
  
      }
  
  
      // --------------------------------------------------------- Public Methods
  
  
      /**
       * Perform the executable actions related to this Step, in the context of
       * the specified Context.
       *
       * @param context The Context that is tracking our execution state
       *
       * @exception StepException if a processing error has occurred
       */
      public abstract void execute(Context context) throws StepException;
  
  
  }
  
  
  

Reply via email to