001 /* 002 * Copyright 1999-2001,2004 The Apache Software Foundation. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.apache.commons.workflow.core; 018 019 020 import java.util.EmptyStackException; 021 import org.apache.commons.workflow.Block; 022 import org.apache.commons.workflow.BlockState; 023 import org.apache.commons.workflow.Context; 024 import org.apache.commons.workflow.Descriptor; 025 import org.apache.commons.workflow.Step; 026 import org.apache.commons.workflow.StepException; 027 import org.apache.commons.workflow.base.BaseBlock; 028 029 030 /** 031 * <p>Evaluate properties specified by the associated Descriptors, and 032 * execute the nested Steps if and only if <strong>ALL</strong> of them 033 * evaluate to a negative result. To avoid non-deterministic evaluation 034 * stack behavior, all of the specified Descriptors are always 035 * evaluated exactly once.</p> 036 * 037 * @version $Revision: 155475 $ $Date: 2005-02-26 13:31:11 +0000 (Sat, 26 Feb 2005) $ 038 * @author Craig R. McClanahan 039 */ 040 041 public class IfNotAnyStep extends IfStep { 042 043 044 // ----------------------------------------------------------= Constructors 045 046 047 /** 048 * Construct a default instance of this Step. 049 */ 050 public IfNotAnyStep() { 051 052 super(); 053 054 } 055 056 057 /** 058 * Construct an instance of this Step with the specified identifier. 059 * 060 * @param id Step identifier 061 */ 062 public IfNotAnyStep(String id) { 063 064 this(id, null); 065 066 } 067 068 069 /** 070 * Construct a fully configured instance of this Step. 071 * 072 * @param id Step identifier of this step 073 * @param descriptor Initial descriptor to be added 074 */ 075 public IfNotAnyStep(String id, Descriptor descriptor) { 076 077 super(); 078 setId(id); 079 if (descriptor != null) 080 addDescriptor(descriptor); 081 082 } 083 084 085 // --------------------------------------------------------- Public Methods 086 087 088 /** 089 * Render a string representation of this Step. 090 */ 091 public String toString() { 092 093 StringBuffer sb = new StringBuffer("<core:ifNotAny"); 094 if (getId() != null) { 095 sb.append(" id=\""); 096 sb.append(getId()); 097 sb.append("\""); 098 } 099 sb.append(">"); 100 Descriptor descriptors[] = findDescriptors(); 101 for (int i = 0; i < descriptors.length; i++) 102 sb.append(descriptors[i]); 103 Step steps[] = getSteps(); 104 for (int i = 0; i < steps.length; i++) 105 sb.append(steps[i]); 106 sb.append("</core:ifNotAny>"); 107 return (sb.toString()); 108 109 } 110 111 112 // ------------------------------------------------------ Protected Methods 113 114 115 /** 116 * Evaluate the condition specified by the Descriptors associated with 117 * this Block, and return the resulting boolean value. 118 * 119 * @param context Context within which to evaluate the descriptors 120 */ 121 protected boolean evaluate(Context context) { 122 123 boolean condition = false; 124 Descriptor descriptors[] = findDescriptors(); 125 for (int i = 0; i < descriptors.length; i++) { 126 if (descriptors[i].positive(context)) 127 condition = true; 128 } 129 return (!condition); 130 131 } 132 133 134 }