View Javadoc

1   /*
2    * Copyright 1999-2001,2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */ 
16  
17  package org.apache.commons.workflow.core;
18  
19  
20  import org.apache.commons.workflow.Context;
21  import org.apache.commons.workflow.Descriptor;
22  import org.apache.commons.workflow.Step;
23  import org.apache.commons.workflow.StepException;
24  
25  
26  /**
27   * <p>Evaluate properties specified by the associated Descriptors, and
28   * transfer control to the specified step if ALL of them are
29   * <code>true</code> (if boolean) or not null (if Object).  To avoid
30   * non-deterministic evaluation stack behavior, all of the specified
31   * Descriptors are always evaluated.</p>
32   *
33   * <p>Supported Attributes:</p>
34   * <ul>
35   * <li><strong>step</strong> - Identifier of the Step to which control
36   *     should be transferred if the condition is met.</li>
37   * </ul>
38   *
39   * @version $Revision: 155475 $ $Date: 2005-02-26 13:31:11 +0000 (Sat, 26 Feb 2005) $
40   * @author Craig R. McClanahan
41   */
42  
43  public class AndStep extends GotoStep {
44  
45  
46      // ----------------------------------------------------------= Constructors
47  
48  
49      /**
50       * Construct a default instance of this Step.
51       */
52      public AndStep() {
53  
54          super();
55  
56      }
57  
58  
59      /**
60       * Construct an instance of this Step with the specified identifier.
61       *
62       * @param id Step identifier
63       */
64      public AndStep(String id) {
65  
66          this(id, null, null);
67  
68      }
69  
70  
71      /**
72       * Construct a fully configured instance of this Step.
73       *
74       * @param id Step identifier of this step
75       * @param step Step identifier to which control should be redirected
76       */
77      public AndStep(String id, String step) {
78  
79          this(id, step, null);
80  
81      }
82  
83  
84      /**
85       * Construct a fully configured instance of this Step.
86       *
87       * @param id Step identifier of this step
88       * @param step Step identifier to which control should be redirected
89       * @param descriptor Initial descriptor to be added
90       */
91      public AndStep(String id, String step, Descriptor descriptor) {
92  
93          super();
94          setId(id);
95          setStep(step);
96          addDescriptor(descriptor);
97  
98      }
99  
100 
101     // --------------------------------------------------------- Public Methods
102 
103 
104     /**
105      * Perform the executable actions related to this Step, in the context of
106      * the specified Context.
107      *
108      * @param context The Context that is tracking our execution state
109      *
110      * @exception StepException if a processing error has occurred
111      */
112     public void execute(Context context) throws StepException {
113 
114         // Process all associated descriptors
115         boolean condition = true;
116         Descriptor descriptors[] = findDescriptors();
117         for (int i = 0; i < descriptors.length; i++) {
118             Object value = descriptors[i].get(context);
119             if (value == null)
120                 condition = false;
121             else if ((value instanceof Boolean) &&
122                      !((Boolean) value).booleanValue())
123                 condition = false;
124         }
125 
126         // Conditionally forward control to the specified step
127         if (condition) {
128             Step next = getOwner().findStep(this.step);
129             if (next == null)
130                 throw new StepException("Cannot find step '" + step + "'",
131                                         this);
132             context.setNextStep(next);
133         }
134                 
135     }
136 
137 
138 }