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 java.util.EmptyStackException;
21 import org.apache.commons.workflow.Block;
22 import org.apache.commons.workflow.BlockState;
23 import org.apache.commons.workflow.Context;
24 import org.apache.commons.workflow.Descriptor;
25 import org.apache.commons.workflow.Iterator;
26 import org.apache.commons.workflow.Step;
27 import org.apache.commons.workflow.StepException;
28 import org.apache.commons.workflow.base.BaseBlock;
29
30
31 /**
32 * <p>Repeatedly evaluate the properties specified by the associated
33 * Descriptors, and execute the nested Steps if and only if
34 * <strong>ANY</strong> of them evaluate to a positive result.
35 * To avoid non-deterministic evaluation
36 * stack behavior, all of the specified Descriptors are always
37 * evaluated exactly once.</p>
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 WhileAnyStep extends WhileStep {
44
45
46 // ----------------------------------------------------------= Constructors
47
48
49 /**
50 * Construct a default instance of this Step.
51 */
52 public WhileAnyStep() {
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 WhileAnyStep(String id) {
65
66 this(id, 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 descriptor Initial descriptor to be added
76 */
77 public WhileAnyStep(String id, Descriptor descriptor) {
78
79 super();
80 setId(id);
81 if (descriptor != null)
82 addDescriptor(descriptor);
83
84 }
85
86
87 // --------------------------------------------------------- Public Methods
88
89
90 /**
91 * Render a string representation of this Step.
92 */
93 public String toString() {
94
95 StringBuffer sb = new StringBuffer("<core:whileAny");
96 if (getId() != null) {
97 sb.append(" id=\"");
98 sb.append(getId());
99 sb.append("\"");
100 }
101 sb.append(">");
102 Descriptor descriptors[] = findDescriptors();
103 for (int i = 0; i < descriptors.length; i++)
104 sb.append(descriptors[i]);
105 Step steps[] = getSteps();
106 for (int i = 0; i < steps.length; i++)
107 sb.append(steps[i]);
108 sb.append("</core:whileAny>");
109 return (sb.toString());
110
111 }
112
113
114 // ------------------------------------------------------ Protected Methods
115
116
117 /**
118 * Evaluate the condition specified by the Descriptors associated with
119 * this Block, and return the resulting boolean value.
120 *
121 * @param context Context within which to evaluate the descriptors
122 */
123 protected boolean evaluate(Context context) {
124
125 boolean condition = false;
126 Descriptor descriptors[] = findDescriptors();
127 for (int i = 0; i < descriptors.length; i++) {
128 if (descriptors[i].positive(context))
129 condition = true;
130 }
131 return (condition);
132
133 }
134
135
136 }