You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by cr...@apache.org on 2001/11/18 23:19:13 UTC
cvs commit: jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/core NotAndStep.java NotOrStep.java CoreRuleSet.java
craigmcc 01/11/18 14:19:13
Modified: workflow/src/java/org/apache/commons/workflow/core
CoreRuleSet.java
Added: workflow/src/java/org/apache/commons/workflow/core
NotAndStep.java NotOrStep.java
Log:
Add "NotAndStep" and "NotOrStep" implementations that are the exact
opposite of "AndStep" and "OrStep". While not strictly required for
functional completeness, these rules make some logic sequences easier to
express.
Submitted by: Colin Sharples <Co...@hbl.co.nz>
Revision Changes Path
1.5 +39 -4 jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/core/CoreRuleSet.java
Index: CoreRuleSet.java
===================================================================
RCS file: /home/cvs/jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/core/CoreRuleSet.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- CoreRuleSet.java 2001/09/19 15:26:16 1.4
+++ CoreRuleSet.java 2001/11/18 22:19:13 1.5
@@ -1,7 +1,7 @@
/*
- * $Header: /home/cvs/jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/core/CoreRuleSet.java,v 1.4 2001/09/19 15:26:16 craigmcc Exp $
- * $Revision: 1.4 $
- * $Date: 2001/09/19 15:26:16 $
+ * $Header: /home/cvs/jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/core/CoreRuleSet.java,v 1.5 2001/11/18 22:19:13 craigmcc Exp $
+ * $Revision: 1.5 $
+ * $Date: 2001/11/18 22:19:13 $
*
* ====================================================================
*
@@ -76,7 +76,8 @@
* </pre>
*
* @author Craig R. McClanahan
- * @version $Revision: 1.4 $ $Date: 2001/09/19 15:26:16 $
+ * @author Preston Sheldon
+ * @version $Revision: 1.5 $ $Date: 2001/11/18 22:19:13 $
*/
public class CoreRuleSet extends BaseRuleSet {
@@ -242,6 +243,40 @@
(prefix + "load", "addStep",
"org.apache.commons.workflow.Step");
+ digester.addObjectCreate
+ (prefix + "notAnd",
+ "org.apache.commons.workflow.core.AndNotStep");
+ digester.addSetProperties
+ (prefix + "notAnd");
+ digester.addSetNext
+ (prefix + "notAnd", "addStep",
+ "org.apache.commons.workflow.Step");
+ digester.addObjectCreate
+ (prefix + "notAnd/descriptor",
+ "org.apache.commons.workflow.base.BaseDescriptor");
+ digester.addSetProperties
+ (prefix + "notAnd/descriptor");
+ digester.addSetNext
+ (prefix + "notAnd/descriptor", "addDescriptor",
+ "org.apache.commons.workflow.Descriptor");
+
+ digester.addObjectCreate
+ (prefix + "notOr",
+ "org.apache.commons.workflow.core.OrStep");
+ digester.addSetProperties
+ (prefix + "notOr");
+ digester.addSetNext
+ (prefix + "notOr", "addStep",
+ "org.apache.commons.workflow.Step");
+ digester.addObjectCreate
+ (prefix + "notOr/descriptor",
+ "org.apache.commons.workflow.base.BaseDescriptor");
+ digester.addSetProperties
+ (prefix + "notOr/descriptor");
+ digester.addSetNext
+ (prefix + "notOr/descriptor", "addDescriptor",
+ "org.apache.commons.workflow.Descriptor");
+
digester.addObjectCreate
(prefix + "or",
"org.apache.commons.workflow.core.OrStep");
1.1 jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/core/NotAndStep.java
Index: NotAndStep.java
===================================================================
package org.apache.commons.workflow.core;
import org.apache.commons.workflow.Context;
import org.apache.commons.workflow.Descriptor;
import org.apache.commons.workflow.Step;
import org.apache.commons.workflow.StepException;
/**
* <p>Evaluate properties specified by the associated Descriptors, and
* transfer control to the specified step if ALL of them are
* <code>false</code> (if boolean) or null (if Object).
*
* <b>This is the exact opposite of AndStep</b>
*
* To avoid non-deterministic evaluation stack behavior, all of the
* specified Descriptors are always evaluated.</p>
*
* <p>Supported Attributes:</p>
* <ul>
* <li><strong>step</strong> - Identifier of the Step to which control
* should be transferred if the condition is not met.</li>
* </ul>
*
* @version $Revision: 1.1 $ $Date: 2001/11/18 22:19:13 $
* @author Preston Sheldon
*/
public class NotAndStep extends GotoStep {
// ----------------------------------------------------------= Constructors
/**
* Construct a default instance of this Step.
*/
public NotAndStep() {
super();
}
/**
* Construct an instance of this Step with the specified identifier.
*
* @param id Step identifier
*/
public NotAndStep(String id) {
this(id, null, null);
}
/**
* Construct a fully configured instance of this Step.
*
* @param id Step identifier of this step
* @param step Step identifier to which control should be redirected
*/
public NotAndStep(String id, String step) {
this(id, step, null);
}
/**
* Construct a fully configured instance of this Step.
*
* @param id Step identifier of this step
* @param step Step identifier to which control should be redirected
* @param descriptor Initial descriptor to be added
*/
public NotAndStep(String id, String step, Descriptor descriptor) {
super();
setId(id);
setStep(step);
addDescriptor(descriptor);
}
// --------------------------------------------------------- Public Methods
/**
* Perform the executable actions related to this Step, in the context of
* the specified Context.
*
* @param context The Context that is tracking our execution state
*
* @exception StepException if a processing error has occurred
*/
public void execute(Context context) throws StepException {
// Process all associated descriptors
boolean condition = true;
Descriptor descriptors[] = findDescriptors();
for (int i = 0; i < descriptors.length; i++) {
Object value = descriptors[i].get(context);
if (value == null)
condition = false;
else if ((value instanceof Boolean) &&
!((Boolean) value).booleanValue())
condition = false;
}
// Conditionally forward control to the specified step
if (!condition) {
Step next = findStep(this.step);
if (next == null)
throw new StepException("Cannot find step '" + step + "'",
this);
context.setNextStep(next);
}
}
}
1.1 jakarta-commons-sandbox/workflow/src/java/org/apache/commons/workflow/core/NotOrStep.java
Index: NotOrStep.java
===================================================================
package org.apache.commons.workflow.core;
import org.apache.commons.workflow.Context;
import org.apache.commons.workflow.Descriptor;
import org.apache.commons.workflow.Step;
import org.apache.commons.workflow.StepException;
/**
* <p>Evaluate properties specified by the associated Descriptors, and
* transfer control to the specified step if ANY of them are
* <code>false</code> (if boolean) or null (if Object).
*
* <b>This is the exact opposite of OrStep</b>
*
* To avoid non-deterministic evaluation stack behavior, all of the
* specified Descriptors are always evaluated.</p>
*
* <p>Supported Attributes:</p>
* <ul>
* <li><strong>step</strong> - Identifier of the Step to which control
* should be transferred if the condition is met.</li>
* </ul>
*
* @version $Revision: 1.1 $ $Date: 2001/11/18 22:19:13 $
* @author Preston Sheldon
*/
public class NotOrStep extends GotoStep {
// ----------------------------------------------------------= Constructors
/**
* Construct a default instance of this Step.
*/
public NotOrStep() {
super();
}
/**
* Construct an instance of this Step with the specified identifier.
*
* @param id Step identifier
*/
public NotOrStep(String id) {
this(id, null, null);
}
/**
* Construct a fully configured instance of this Step.
*
* @param id Step identifier of this step
* @param step Step identifier to which control should be redirected
*/
public NotOrStep(String id, String step) {
this(id, step, null);
}
/**
* Construct a fully configured instance of this Step.
*
* @param id Step identifier of this step
* @param step Step identifier to which control should be redirected
* @param descriptor Initial descriptor to be added
*/
public NotOrStep(String id, String step, Descriptor descriptor) {
super();
setId(id);
setStep(step);
addDescriptor(descriptor);
}
// --------------------------------------------------------- Public Methods
/**
* Perform the executable actions related to this Step, in the context of
* the specified Context.
*
* @param context The Context that is tracking our execution state
*
* @exception StepException if a processing error has occurred
*/
public void execute(Context context) throws StepException {
// Process all associated descriptors
boolean condition = false;
Descriptor descriptors[] = findDescriptors();
for (int i = 0; i < descriptors.length; i++) {
Object value = descriptors[i].get(context);
if (value != null) {
if (value instanceof Boolean) {
if (((Boolean) value).booleanValue())
condition = true;
} else {
condition = true;
}
}
}
// Conditionally forward control to the specified step
if (!condition) {
Step next = findStep(this.step);
if (next == null)
throw new StepException("Cannot find step '" + step + "'",
this);
context.setNextStep(next);
}
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>