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.base;
018    
019    
020    import java.util.ArrayList;
021    import org.apache.commons.workflow.Activity;
022    import org.apache.commons.workflow.Step;
023    
024    
025    /**
026     * <p><strong>BaseActivity</strong> is a convenient base class for more
027     * sophisticated <code>Activity</code> implementations.  It includes
028     * management of the static relationships of Steps to each other as part
029     * of an owning Activity.</p>
030     *
031     * @version $Revision: 155475 $ $Date: 2005-02-26 13:31:11 +0000 (Sat, 26 Feb 2005) $
032     * @author Craig R. McClanahan
033     */
034    
035    public class BaseActivity implements Activity {
036    
037    
038        // ----------------------------------------------------- Instance Variables
039    
040    
041        /**
042         * The first Step associated with this Activity.
043         */
044        protected Step firstStep = null;
045    
046    
047        /**
048         * The unique identifier of this Activity.
049         */
050        protected String id = null;
051    
052    
053        /**
054         * The last Step associated with this Activity.
055         */
056        protected Step lastStep = null;
057    
058    
059        // ------------------------------------------------------------- Properties
060    
061    
062        /**
063         * Return the first Step associated with this Activity.
064         */
065        public Step getFirstStep() {
066    
067            return (this.firstStep);
068    
069        }
070    
071    
072        /**
073         * Return the unique identifier of this Activity.
074         */
075        public String getId() {
076    
077            return (this.id);
078    
079        }
080    
081    
082        /**
083         * Set the unique identifier of this Activity.
084         *
085         * @param id The new unique identifier
086         */
087        public void setId(String id) {
088    
089            this.id = id;
090    
091        }
092    
093    
094        /**
095         * Return the last Step associated with this Activity.
096         */
097        public Step getLastStep() {
098    
099            return (this.lastStep);
100    
101        }
102    
103    
104        // ---------------------------------------------------------- Owner Methods
105    
106    
107        /**
108         * Add a new Step to the end of the sequence of Steps associated with
109         * this Activity.
110         *
111         * @param step The new step to be added
112         */
113        public void addStep(Step step) {
114    
115            step.setOwner(this);
116            if (firstStep == null) {
117                step.setPreviousStep(null);
118                step.setNextStep(null);
119                firstStep = step;
120                lastStep = step;
121            } else {
122                step.setPreviousStep(lastStep);
123                step.setNextStep(null);
124                lastStep.setNextStep(step);
125                lastStep = step;
126            }
127    
128        }
129    
130    
131        /**
132         * Clear any existing Steps associated with this Activity.
133         */
134        public void clearSteps() {
135    
136            Step current = firstStep;
137            while (current != null) {
138                Step next = current.getNextStep();
139                current.setOwner(null);
140                current.setPreviousStep(null);
141                current.setNextStep(null);
142                current = next;
143            }
144            firstStep = null;
145            lastStep = null;
146    
147        }
148    
149    
150        /**
151         * Return the identified Step from this Activity, if it exists.
152         * Otherwise, return <code>null</code>.
153         *
154         * @param id Identifier of the desired Step
155         */
156        public Step findStep(String id) {
157    
158            Step current = getFirstStep();
159            while (current != null) {
160                if (id.equals(current.getId()))
161                    return (current);
162                current = current.getNextStep();
163            }
164            return (null);
165    
166        }
167    
168    
169        /**
170         * Return the set of Steps associated with this Activity.
171         */
172        public Step[] getSteps() {
173    
174            ArrayList list = new ArrayList();
175            Step currentStep = firstStep;
176            while (currentStep != null) {
177                list.add(currentStep);
178                currentStep = currentStep.getNextStep();
179            }
180            Step steps[] = new Step[list.size()];
181            return ((Step[]) list.toArray(steps));
182    
183        }
184    
185    
186        /**
187         * Set the set of Steps associated with this Activity, replacing any
188         * existing ones.
189         *
190         * @param steps The new set of steps.
191         */
192        public void setSteps(Step steps[]) {
193    
194            clearSteps();
195            for (int i = 0; i < steps.length; i++)
196                addStep(steps[i]);
197    
198        }
199    
200    
201    }