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.Context;
022    import org.apache.commons.workflow.StepException;
023    import org.apache.commons.workflow.base.BaseStep;
024    
025    
026    /**
027     * <p>Push a new copy of the top item on the evaluation
028     * stack onto the stack.</p>
029     *
030     * @version $Revision: 155475 $ $Date: 2005-02-26 13:31:11 +0000 (Sat, 26 Feb 2005) $
031     * @author Craig R. McClanahan
032     */
033    
034    public class DuplicateStep extends BaseStep {
035    
036    
037        // ----------------------------------------------------------= Constructors
038    
039    
040        /**
041         * Construct a default instance of this Step.
042         */
043        public DuplicateStep() {
044    
045            super();
046    
047        }
048    
049    
050        /**
051         * Construct an instance of this Step with the specified identifier.
052         *
053         * @param id Step identifier
054         */
055        public DuplicateStep(String id) {
056    
057            super();
058            setId(id);
059    
060        }
061    
062    
063        // --------------------------------------------------------- Public Methods
064    
065    
066        /**
067         * Perform the executable actions related to this Step, in the context of
068         * the specified Context.
069         *
070         * @param context The Context that is tracking our execution state
071         *
072         * @exception StepException if a processing error has occurred
073         */
074        public void execute(Context context) throws StepException {
075    
076            // Peek at the top value on the evaluation stack
077            Object value = null;
078            try {
079                value = context.peek();
080            } catch (EmptyStackException e) {
081                throw new StepException("Evaluation stack is empty", e, this);
082            }
083    
084            // Push another copy of this value
085            context.push(value);
086    
087        }
088    
089    
090    }