001 /*
002 * Copyright 1999-2001,2004 The Apache Software Foundation.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.apache.commons.workflow.core;
018
019
020 import java.util.EmptyStackException;
021 import org.apache.commons.workflow.Activity;
022 import org.apache.commons.workflow.Context;
023 import org.apache.commons.workflow.StepException;
024 import org.apache.commons.workflow.base.BaseStep;
025
026
027 /**
028 * <p>Pop the top value from the evaluation stack, which must be an
029 * <code>Activity</code>, and initiate a "subroutine call" to execute
030 * this Activity before resuming the current one.</p>
031 *
032 * <p><strong>NOTE</strong> - The means by which the Activity on the top
033 * of the stack was acquired is NOT mandated by this Step implementation.</p>
034 *
035 * @version $Revision: 155475 $ $Date: 2005-02-26 13:31:11 +0000 (Sat, 26 Feb 2005) $
036 * @author Craig R. McClanahan
037 */
038
039 public class CallStep extends BaseStep {
040
041
042 // ----------------------------------------------------------= Constructors
043
044
045 /**
046 * Construct a default instance of this Step.
047 */
048 public CallStep() {
049
050 super();
051
052 }
053
054
055 /**
056 * Construct an instance of this Step with the specified identifier.
057 *
058 * @param id Step identifier
059 */
060 public CallStep(String id) {
061
062 super();
063 setId(id);
064
065 }
066
067
068 // --------------------------------------------------------- Public Methods
069
070
071 /**
072 * Perform the executable actions related to this Step, in the context of
073 * the specified Context.
074 *
075 * @param context The Context that is tracking our execution state
076 *
077 * @exception StepException if a processing error has occurred
078 */
079 public void execute(Context context) throws StepException {
080
081 // Pop the evaluation stack
082 Object value = null;
083 try {
084 value = context.pop();
085 } catch (EmptyStackException e) {
086 throw new StepException("Evaluation stack is empty", e, this);
087 }
088
089 // Call the requested Activity
090 if (!(value instanceof Activity))
091 throw new StepException("Top of stack is not an Activity", this);
092 context.call((Activity) value);
093
094 }
095
096
097 }