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