1 package org.apache.commons.workflow.core;
2
3 import org.apache.commons.workflow.Context;
4 import org.apache.commons.workflow.Descriptor;
5 import org.apache.commons.workflow.Step;
6 import org.apache.commons.workflow.StepException;
7
8
9 /**
10 * <p>Evaluate properties specified by the associated Descriptors, and
11 * transfer control to the specified step if ANY of them are
12 * <code>false</code> (if boolean) or null (if Object).
13 *
14 * <b>This is the exact opposite of OrStep</b>
15 *
16 * To avoid non-deterministic evaluation stack behavior, all of the
17 * specified Descriptors are always evaluated.</p>
18 *
19 * <p>Supported Attributes:</p>
20 * <ul>
21 * <li><strong>step</strong> - Identifier of the Step to which control
22 * should be transferred if the condition is met.</li>
23 * </ul>
24 *
25 * @version $Revision: 155475 $ $Date: 2005-02-26 13:31:11 +0000 (Sat, 26 Feb 2005) $
26 * @author Preston Sheldon
27 */
28
29 public class NotOrStep extends GotoStep {
30
31
32 // ----------------------------------------------------------= Constructors
33
34
35 /**
36 * Construct a default instance of this Step.
37 */
38 public NotOrStep() {
39
40 super();
41
42 }
43 /**
44 * Construct an instance of this Step with the specified identifier.
45 *
46 * @param id Step identifier
47 */
48 public NotOrStep(String id) {
49
50 this(id, null, null);
51
52 }
53 /**
54 * Construct a fully configured instance of this Step.
55 *
56 * @param id Step identifier of this step
57 * @param step Step identifier to which control should be redirected
58 */
59 public NotOrStep(String id, String step) {
60
61 this(id, step, null);
62
63 }
64 /**
65 * Construct a fully configured instance of this Step.
66 *
67 * @param id Step identifier of this step
68 * @param step Step identifier to which control should be redirected
69 * @param descriptor Initial descriptor to be added
70 */
71 public NotOrStep(String id, String step, Descriptor descriptor) {
72
73 super();
74 setId(id);
75 setStep(step);
76 addDescriptor(descriptor);
77
78 }
79 // --------------------------------------------------------- Public Methods
80
81
82 /**
83 * Perform the executable actions related to this Step, in the context of
84 * the specified Context.
85 *
86 * @param context The Context that is tracking our execution state
87 *
88 * @exception StepException if a processing error has occurred
89 */
90 public void execute(Context context) throws StepException {
91
92 // Process all associated descriptors
93 boolean condition = false;
94 Descriptor descriptors[] = findDescriptors();
95 for (int i = 0; i < descriptors.length; i++) {
96 Object value = descriptors[i].get(context);
97 if (value != null) {
98 if (value instanceof Boolean) {
99 if (((Boolean) value).booleanValue())
100 condition = true;
101 } else {
102 condition = true;
103 }
104 }
105 }
106
107 // Conditionally forward control to the specified step
108 if (!condition) {
109 Step next = getOwner().findStep(this.step);
110 if (next == null)
111 throw new StepException("Cannot find step '" + step + "'",
112 this);
113 context.setNextStep(next);
114 }
115
116 }
117 }
118