You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2012/05/17 16:14:03 UTC

svn commit: r1339610 - in /ofbiz/trunk/framework/minilang/src: META-INF/services/ org/ofbiz/minilang/ org/ofbiz/minilang/method/conditional/ org/ofbiz/minilang/method/ifops/

Author: adrianc
Date: Thu May 17 14:14:03 2012
New Revision: 1339610

URL: http://svn.apache.org/viewvc?rev=1339610&view=rev
Log:
Consolidated some redundant Mini-language classes.

Removed:
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfCompare.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfCompareField.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfEmpty.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfHasPermission.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfRegexp.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/ifops/IfValidateMethod.java
Modified:
    ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.MethodOperation$Factory
    ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.conditional.ConditionalFactory
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CombinedCondition.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareCondition.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareFieldCondition.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/Conditional.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ConditionalFactory.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java
    ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java

Modified: ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.MethodOperation$Factory
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.MethodOperation%24Factory?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.MethodOperation$Factory (original)
+++ ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.MethodOperation$Factory Thu May 17 14:14:03 2012
@@ -25,7 +25,13 @@ org.ofbiz.minilang.method.callops.CallSi
 org.ofbiz.minilang.method.callops.CallSimpleMethod$CallSimpleMethodFactory
 org.ofbiz.minilang.method.callops.Return$ReturnFactory
 org.ofbiz.minilang.method.callops.SetServiceFields$SetServiceFieldsFactory
+org.ofbiz.minilang.method.conditional.CompareCondition$CompareConditionFactory
+org.ofbiz.minilang.method.conditional.CompareFieldCondition$CompareFieldConditionFactory
+org.ofbiz.minilang.method.conditional.EmptyCondition$EmptyConditionFactory
+org.ofbiz.minilang.method.conditional.HasPermissionCondition$HasPermissionConditionFactory
 org.ofbiz.minilang.method.conditional.MasterIf$MasterIfFactory
+org.ofbiz.minilang.method.conditional.RegexpCondition$RegexpConditionFactory
+org.ofbiz.minilang.method.conditional.ValidateMethodCondition$ValidateMethodConditionFactory
 org.ofbiz.minilang.method.entityops.ClearCacheLine$ClearCacheLineFactory
 org.ofbiz.minilang.method.entityops.ClearEntityCaches$ClearEntityCachesFactory
 org.ofbiz.minilang.method.entityops.CloneValue$CloneValueFactory
@@ -92,14 +98,8 @@ org.ofbiz.minilang.method.eventops.Reque
 org.ofbiz.minilang.method.eventops.SessionToField$SessionToFieldFactory
 org.ofbiz.minilang.method.eventops.WebappPropertyToField$WebappPropertyToFieldFactory
 org.ofbiz.minilang.method.ifops.CheckPermission$CheckPermissionFactory
-org.ofbiz.minilang.method.ifops.IfCompare$IfCompareFactory
-org.ofbiz.minilang.method.ifops.IfCompareField$IfCompareFieldFactory
-org.ofbiz.minilang.method.ifops.IfEmpty$IfEmptyFactory
-org.ofbiz.minilang.method.ifops.IfHasPermission$IfHasPermissionFactory
 org.ofbiz.minilang.method.ifops.IfInstanceOf$IfInstanceOfFactory
 org.ofbiz.minilang.method.ifops.IfNotEmpty$IfNotEmptyFactory
-org.ofbiz.minilang.method.ifops.IfRegexp$IfRegexpFactory
-org.ofbiz.minilang.method.ifops.IfValidateMethod$IfValidateMethodFactory
 org.ofbiz.minilang.method.otherops.Calculate$CalculateFactory
 org.ofbiz.minilang.method.otherops.Log$LogFactory
 org.ofbiz.minilang.method.otherops.PropertyToField$PropertyToFieldFactory

Modified: ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.conditional.ConditionalFactory
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.conditional.ConditionalFactory?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.conditional.ConditionalFactory (original)
+++ ofbiz/trunk/framework/minilang/src/META-INF/services/org.ofbiz.minilang.method.conditional.ConditionalFactory Thu May 17 14:14:03 2012
@@ -25,4 +25,3 @@ org.ofbiz.minilang.method.conditional.Em
 org.ofbiz.minilang.method.conditional.HasPermissionCondition$HasPermissionConditionFactory
 org.ofbiz.minilang.method.conditional.RegexpCondition$RegexpConditionFactory
 org.ofbiz.minilang.method.conditional.ValidateMethodCondition$ValidateMethodConditionFactory
-

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/MiniLangUtil.java Thu May 17 14:14:03 2012
@@ -53,7 +53,13 @@ import org.ofbiz.minilang.method.callops
 import org.ofbiz.minilang.method.callops.CallServiceAsynch;
 import org.ofbiz.minilang.method.callops.CallSimpleMethod;
 import org.ofbiz.minilang.method.callops.SetServiceFields;
+import org.ofbiz.minilang.method.conditional.CompareCondition;
+import org.ofbiz.minilang.method.conditional.CompareFieldCondition;
+import org.ofbiz.minilang.method.conditional.EmptyCondition;
+import org.ofbiz.minilang.method.conditional.HasPermissionCondition;
 import org.ofbiz.minilang.method.conditional.MasterIf;
+import org.ofbiz.minilang.method.conditional.RegexpCondition;
+import org.ofbiz.minilang.method.conditional.ValidateMethodCondition;
 import org.ofbiz.minilang.method.entityops.EntityAnd;
 import org.ofbiz.minilang.method.entityops.EntityCondition;
 import org.ofbiz.minilang.method.entityops.EntityCount;
@@ -67,14 +73,8 @@ import org.ofbiz.minilang.method.envops.
 import org.ofbiz.minilang.method.envops.IterateMap;
 import org.ofbiz.minilang.method.envops.Loop;
 import org.ofbiz.minilang.method.envops.While;
-import org.ofbiz.minilang.method.ifops.IfCompare;
-import org.ofbiz.minilang.method.ifops.IfCompareField;
-import org.ofbiz.minilang.method.ifops.IfEmpty;
-import org.ofbiz.minilang.method.ifops.IfHasPermission;
 import org.ofbiz.minilang.method.ifops.IfInstanceOf;
 import org.ofbiz.minilang.method.ifops.IfNotEmpty;
-import org.ofbiz.minilang.method.ifops.IfRegexp;
-import org.ofbiz.minilang.method.ifops.IfValidateMethod;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
@@ -244,22 +244,22 @@ public final class MiniLangUtil {
                 findEntityNamesUsed(((MasterIf) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
             } else if (methodOperation instanceof While) {
                 findEntityNamesUsed(((While) methodOperation).getThenSubOps(), allEntityNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfValidateMethod) {
-                findEntityNamesUsed(((IfValidateMethod) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof ValidateMethodCondition) {
+                findEntityNamesUsed(((ValidateMethodCondition) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
             } else if (methodOperation instanceof IfInstanceOf) {
                 findEntityNamesUsed(((IfInstanceOf) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfCompare) {
-                findEntityNamesUsed(((IfCompare) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfCompareField) {
-                findEntityNamesUsed(((IfCompareField) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfRegexp) {
-                findEntityNamesUsed(((IfRegexp) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfEmpty) {
-                findEntityNamesUsed(((IfEmpty) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof CompareCondition) {
+                findEntityNamesUsed(((CompareCondition) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof CompareFieldCondition) {
+                findEntityNamesUsed(((CompareFieldCondition) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof RegexpCondition) {
+                findEntityNamesUsed(((RegexpCondition) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof EmptyCondition) {
+                findEntityNamesUsed(((EmptyCondition) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
             } else if (methodOperation instanceof IfNotEmpty) {
                 findEntityNamesUsed(((IfNotEmpty) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfHasPermission) {
-                findEntityNamesUsed(((IfHasPermission) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof HasPermissionCondition) {
+                findEntityNamesUsed(((HasPermissionCondition) methodOperation).getAllSubOps(), allEntityNames, simpleMethodsVisited);
             }
         }
     }
@@ -303,22 +303,22 @@ public final class MiniLangUtil {
                 findServiceNamesCalled(((MasterIf) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
             } else if (methodOperation instanceof While) {
                 findServiceNamesCalled(((While) methodOperation).getThenSubOps(), allServiceNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfValidateMethod) {
-                findServiceNamesCalled(((IfValidateMethod) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof ValidateMethodCondition) {
+                findServiceNamesCalled(((ValidateMethodCondition) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
             } else if (methodOperation instanceof IfInstanceOf) {
                 findServiceNamesCalled(((IfInstanceOf) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfCompare) {
-                findServiceNamesCalled(((IfCompare) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfCompareField) {
-                findServiceNamesCalled(((IfCompareField) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfRegexp) {
-                findServiceNamesCalled(((IfRegexp) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfEmpty) {
-                findServiceNamesCalled(((IfEmpty) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof CompareCondition) {
+                findServiceNamesCalled(((CompareCondition) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof CompareFieldCondition) {
+                findServiceNamesCalled(((CompareFieldCondition) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof RegexpCondition) {
+                findServiceNamesCalled(((RegexpCondition) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof EmptyCondition) {
+                findServiceNamesCalled(((EmptyCondition) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
             } else if (methodOperation instanceof IfNotEmpty) {
                 findServiceNamesCalled(((IfNotEmpty) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
-            } else if (methodOperation instanceof IfHasPermission) {
-                findServiceNamesCalled(((IfHasPermission) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
+            } else if (methodOperation instanceof HasPermissionCondition) {
+                findServiceNamesCalled(((HasPermissionCondition) methodOperation).getAllSubOps(), allServiceNames, simpleMethodsVisited);
             }
         }
     }

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CombinedCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CombinedCondition.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CombinedCondition.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CombinedCondition.java Thu May 17 14:14:03 2012
@@ -31,7 +31,7 @@ import org.ofbiz.minilang.method.MethodC
 import org.w3c.dom.Element;
 
 /**
- * Implements generic combining conditions such as or, and, etc.
+ * Implements the <and>, <or>, <not>, and <xor> elements.
  */
 public abstract class CombinedCondition extends MiniLangElement implements Conditional {
 
@@ -59,6 +59,9 @@ public abstract class CombinedCondition 
         messageBuffer.append(")");
     }
 
+    /**
+     * A <and> element factory. 
+     */
     public static final class AndConditionFactory extends ConditionalFactory<CombinedCondition> {
         @Override
         public CombinedCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
@@ -87,6 +90,9 @@ public abstract class CombinedCondition 
         }
     }
 
+    /**
+     * A &lt;not&gt; element factory. 
+     */
     public static final class NotConditionFactory extends ConditionalFactory<CombinedCondition> {
         @Override
         public CombinedCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
@@ -116,6 +122,9 @@ public abstract class CombinedCondition 
         }
     }
 
+    /**
+     * A &lt;or&gt; element factory. 
+     */
     public static final class OrConditionFactory extends ConditionalFactory<CombinedCondition> {
         @Override
         public CombinedCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
@@ -144,6 +153,9 @@ public abstract class CombinedCondition 
         }
     }
 
+    /**
+     * A &lt;xor&gt; element factory. 
+     */
     public static final class XorConditionFactory extends ConditionalFactory<CombinedCondition> {
         @Override
         public CombinedCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareCondition.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareCondition.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareCondition.java Thu May 17 14:14:03 2012
@@ -18,23 +18,29 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
+import java.util.Collections;
+import java.util.List;
+
+import javolution.util.FastList;
+
 import org.ofbiz.base.util.ObjectType;
 import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.UtilXml;
 import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.base.util.string.FlexibleStringExpander;
-import org.ofbiz.minilang.MiniLangElement;
 import org.ofbiz.minilang.MiniLangException;
 import org.ofbiz.minilang.MiniLangRuntimeException;
 import org.ofbiz.minilang.MiniLangUtil;
 import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
 import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Implements compare to a constant condition.
+ * Implements the &lt;if-compare&gt; element.
  */
-public final class CompareCondition extends MiniLangElement implements Conditional {
+public final class CompareCondition extends MethodOperation implements Conditional {
 
     private final Compare compare;
     private final FlexibleMapAccessor<Object> fieldFma;
@@ -43,6 +49,9 @@ public final class CompareCondition exte
     private final Class<?> targetClass;
     private final String type;
     private final FlexibleStringExpander valueFse;
+    // Sub-operations are used only when this is a method operation.
+    private final List<MethodOperation> elseSubOps;
+    private final List<MethodOperation> subOps;
 
     public CompareCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
@@ -52,7 +61,6 @@ public final class CompareCondition exte
             MiniLangValidate.constantAttributes(simpleMethod, element, "operator", "type");
             MiniLangValidate.constantPlusExpressionAttributes(simpleMethod, element, "value", "format");
             MiniLangValidate.expressionAttributes(simpleMethod, element, "field");
-            MiniLangValidate.noChildElements(simpleMethod, element);
         }
         this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field"));
         this.formatFse = FlexibleStringExpander.getInstance(element.getAttribute("format"));
@@ -77,6 +85,18 @@ public final class CompareCondition exte
         }
         this.targetClass = targetClass;
         this.valueFse = FlexibleStringExpander.getInstance(element.getAttribute("value"));
+        Element childElement = UtilXml.firstChildElement(element);
+        if (childElement != null && !"else".equals(childElement.getTagName())) {
+            this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod));
+        } else {
+            this.subOps = null;
+        }
+        Element elseElement = UtilXml.firstChildElement(element, "else");
+        if (elseElement != null) {
+            this.elseSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(elseElement, simpleMethod));
+        } else {
+            this.elseSubOps = null;
+        }
     }
 
     @Override
@@ -99,6 +119,34 @@ public final class CompareCondition exte
         return false;
     }
 
+    @Override
+    public boolean exec(MethodContext methodContext) throws MiniLangException {
+        if (checkCondition(methodContext)) {
+            if (this.subOps != null) {
+                return SimpleMethod.runSubOps(subOps, methodContext);
+            }
+        } else {
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public String expandedString(MethodContext methodContext) {
+        return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap());
+    }
+
+    public List<MethodOperation> getAllSubOps() {
+        List<MethodOperation> allSubOps = FastList.newInstance();
+        if (this.subOps != null)
+            allSubOps.addAll(this.subOps);
+        if (this.elseSubOps != null)
+            allSubOps.addAll(this.elseSubOps);
+        return allSubOps;
+    }
+
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
         String value = valueFse.expandString(methodContext.getEnvMap());
         String format = formatFse.expandString(methodContext.getEnvMap());
@@ -119,12 +167,41 @@ public final class CompareCondition exte
         }
     }
 
-    public static final class CompareConditionFactory extends ConditionalFactory<CompareCondition> {
+    @Override
+    public String rawString() {
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<if-compare ");
+        sb.append("field=\"").append(this.fieldFma).append("\" operator=\"").append(operator).append("\" ");
+        if (!this.valueFse.isEmpty()) {
+            sb.append("value=\"").append(this.valueFse).append("\" ");
+        }
+        if (!this.type.isEmpty()) {
+            sb.append("type=\"").append(this.type).append("\" ");
+        }
+        if (!this.formatFse.isEmpty()) {
+            sb.append("format=\"").append(this.formatFse).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
+    }
+
+    /**
+     * A &lt;if-compare&gt; element factory. 
+     */
+    public static final class CompareConditionFactory extends ConditionalFactory<CompareCondition> implements Factory<CompareCondition> {
         @Override
         public CompareCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new CompareCondition(element, simpleMethod);
         }
 
+        public CompareCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
+            return new CompareCondition(element, simpleMethod);
+        }
+
         @Override
         public String getName() {
             return "if-compare";

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareFieldCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareFieldCondition.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareFieldCondition.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/CompareFieldCondition.java Thu May 17 14:14:03 2012
@@ -18,23 +18,29 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
+import java.util.Collections;
+import java.util.List;
+
+import javolution.util.FastList;
+
 import org.ofbiz.base.util.ObjectType;
 import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.UtilXml;
 import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.base.util.string.FlexibleStringExpander;
-import org.ofbiz.minilang.MiniLangElement;
 import org.ofbiz.minilang.MiniLangException;
 import org.ofbiz.minilang.MiniLangRuntimeException;
 import org.ofbiz.minilang.MiniLangUtil;
 import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
 import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Implements compare to a field condition.
+ * Implements the &lt;if-compare-field&gt; element.
  */
-public final class CompareFieldCondition extends MiniLangElement implements Conditional {
+public final class CompareFieldCondition extends MethodOperation implements Conditional {
 
     // This method is needed only during the v1 to v2 transition
     private static boolean autoCorrect(Element element) {
@@ -54,6 +60,9 @@ public final class CompareFieldCondition
     private final FlexibleMapAccessor<Object> toFieldFma;
     private final Class<?> targetClass;
     private final String type;
+    // Sub-operations are used only when this is a method operation.
+    private final List<MethodOperation> elseSubOps;
+    private final List<MethodOperation> subOps;
 
     public CompareFieldCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
@@ -86,6 +95,18 @@ public final class CompareFieldCondition
             }
         }
         this.targetClass = targetClass;
+        Element childElement = UtilXml.firstChildElement(element);
+        if (childElement != null && !"else".equals(childElement.getTagName())) {
+            this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod));
+        } else {
+            this.subOps = null;
+        }
+        Element elseElement = UtilXml.firstChildElement(element, "else");
+        if (elseElement != null) {
+            this.elseSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(elseElement, simpleMethod));
+        } else {
+            this.elseSubOps = null;
+        }
     }
 
     @Override
@@ -108,6 +129,34 @@ public final class CompareFieldCondition
         return false;
     }
 
+    @Override
+    public boolean exec(MethodContext methodContext) throws MiniLangException {
+        if (checkCondition(methodContext)) {
+            if (this.subOps != null) {
+                return SimpleMethod.runSubOps(subOps, methodContext);
+            }
+        } else {
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public String expandedString(MethodContext methodContext) {
+        return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap());
+    }
+
+    public List<MethodOperation> getAllSubOps() {
+        List<MethodOperation> allSubOps = FastList.newInstance();
+        if (this.subOps != null)
+            allSubOps.addAll(this.subOps);
+        if (this.elseSubOps != null)
+            allSubOps.addAll(this.elseSubOps);
+        return allSubOps;
+    }
+
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
         String format = formatFse.expandString(methodContext.getEnvMap());
         Object fieldVal = fieldFma.get(methodContext.getEnvMap());
@@ -131,12 +180,41 @@ public final class CompareFieldCondition
         }
     }
 
-    public static final class CompareFieldConditionFactory extends ConditionalFactory<CompareFieldCondition> {
+    @Override
+    public String rawString() {
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<if-compare-field ");
+        sb.append("field=\"").append(this.fieldFma).append("\" operator=\"").append(operator).append("\" ");
+        if (!this.toFieldFma.isEmpty()) {
+            sb.append("to-field=\"").append(this.toFieldFma).append("\" ");
+        }
+        if (!this.type.isEmpty()) {
+            sb.append("type=\"").append(this.type).append("\" ");
+        }
+        if (!this.formatFse.isEmpty()) {
+            sb.append("format=\"").append(this.formatFse).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
+    }
+
+    /**
+     * A &lt;if-compare-field&gt; element factory. 
+     */
+    public static final class CompareFieldConditionFactory extends ConditionalFactory<CompareFieldCondition> implements Factory<CompareFieldCondition> {
         @Override
         public CompareFieldCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new CompareFieldCondition(element, simpleMethod);
         }
 
+        public CompareFieldCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
+            return new CompareFieldCondition(element, simpleMethod);
+        }
+
         @Override
         public String getName() {
             return "if-compare-field";

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/Conditional.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/Conditional.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/Conditional.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/Conditional.java Thu May 17 14:14:03 2012
@@ -22,7 +22,7 @@ import org.ofbiz.minilang.MiniLangExcept
 import org.ofbiz.minilang.method.MethodContext;
 
 /**
- * Interface for all conditional elements under the master if element or and else-if element.
+ * Interface for all conditional elements under the &lt;if&gt; element.
  */
 public interface Conditional {
 

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ConditionalFactory.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ConditionalFactory.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ConditionalFactory.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ConditionalFactory.java Thu May 17 14:14:03 2012
@@ -31,7 +31,10 @@ import org.ofbiz.minilang.SimpleMethod;
 import org.w3c.dom.Element;
 
 /**
- * Creates Conditional objects according to the element that is passed.
+ * An abstract factory class for creating &lt;if&gt; element sub-element implementations.
+ * <p>Mini-language can be extended to support additional condition elements
+ * by extending this class to provide custom conditional element implementations.
+ * </p>
  */
 public abstract class ConditionalFactory<C extends Conditional> {
 

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java Thu May 17 14:14:03 2012
@@ -31,7 +31,7 @@ import org.ofbiz.minilang.method.MethodO
 import org.w3c.dom.Element;
 
 /**
- * Implements the else-if alternate execution element.
+ * Implements the &lt;else-if&gt; element.
  */
 public final class ElseIf extends MiniLangElement {
 

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java Thu May 17 14:14:03 2012
@@ -18,23 +18,33 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
-import org.ofbiz.base.util.UtilValidate;
+import java.util.Collections;
+import java.util.List;
+
+import javolution.util.FastList;
+
+import org.ofbiz.base.util.ObjectType;
+import org.ofbiz.base.util.UtilXml;
 import org.ofbiz.base.util.collections.FlexibleMapAccessor;
-import org.ofbiz.minilang.MiniLangElement;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
 import org.ofbiz.minilang.MiniLangException;
 import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
 import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Implements compare to a constant condition.
+ * Implements the &lt;if-empty&gt; element.
  */
-public final class EmptyCondition extends MiniLangElement implements Conditional {
+public final class EmptyCondition extends MethodOperation implements Conditional {
 
     public static final String module = EmptyCondition.class.getName();
 
     private final FlexibleMapAccessor<Object> fieldFma;
+    // Sub-operations are used only when this is a method operation.
+    private final List<MethodOperation> elseSubOps;
+    private final List<MethodOperation> subOps;
 
     public EmptyCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
@@ -44,11 +54,51 @@ public final class EmptyCondition extend
             MiniLangValidate.expressionAttributes(simpleMethod, element, "field");
         }
         this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field"));
+        Element childElement = UtilXml.firstChildElement(element);
+        if (childElement != null && !"else".equals(childElement.getTagName())) {
+            this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod));
+        } else {
+            this.subOps = null;
+        }
+        Element elseElement = UtilXml.firstChildElement(element, "else");
+        if (elseElement != null) {
+            this.elseSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(elseElement, simpleMethod));
+        } else {
+            this.elseSubOps = null;
+        }
     }
 
     @Override
     public boolean checkCondition(MethodContext methodContext) throws MiniLangException {
-        return UtilValidate.isEmpty(fieldFma.get(methodContext.getEnvMap()));
+        return ObjectType.isEmpty(fieldFma.get(methodContext.getEnvMap()));
+    }
+
+    @Override
+    public boolean exec(MethodContext methodContext) throws MiniLangException {
+        if (checkCondition(methodContext)) {
+            if (this.subOps != null) {
+                return SimpleMethod.runSubOps(subOps, methodContext);
+            }
+        } else {
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public String expandedString(MethodContext methodContext) {
+        return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap());
+    }
+
+    public List<MethodOperation> getAllSubOps() {
+        List<MethodOperation> allSubOps = FastList.newInstance();
+        if (this.subOps != null)
+            allSubOps.addAll(this.subOps);
+        if (this.elseSubOps != null)
+            allSubOps.addAll(this.elseSubOps);
+        return allSubOps;
     }
 
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
@@ -59,12 +109,32 @@ public final class EmptyCondition extend
         messageBuffer.append("]");
     }
 
-    public static final class EmptyConditionFactory extends ConditionalFactory<EmptyCondition> {
+    @Override
+    public String rawString() {
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<if-empty ");
+        sb.append("field=\"").append(this.fieldFma).append("\"/>");
+        sb.append("/>");
+        return sb.toString();
+    }
+
+    /**
+     * A &lt;if-empty&gt; element factory. 
+     */
+    public static final class EmptyConditionFactory extends ConditionalFactory<EmptyCondition> implements Factory<EmptyCondition> {
         @Override
         public EmptyCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new EmptyCondition(element, simpleMethod);
         }
 
+        public EmptyCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
+            return new EmptyCondition(element, simpleMethod);
+        }
+
         @Override
         public String getName() {
             return "if-empty";

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java Thu May 17 14:14:03 2012
@@ -18,25 +18,34 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
+import java.util.Collections;
+import java.util.List;
+
+import javolution.util.FastList;
+
 import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.UtilXml;
 import org.ofbiz.base.util.string.FlexibleStringExpander;
 import org.ofbiz.entity.GenericValue;
-import org.ofbiz.minilang.MiniLangElement;
 import org.ofbiz.minilang.MiniLangException;
 import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
 import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.minilang.method.MethodOperation;
 import org.ofbiz.security.Security;
 import org.ofbiz.security.authz.Authorization;
 import org.w3c.dom.Element;
 
 /**
- * Implements compare to a constant condition.
+ * Implements the &lt;if-has-permission&gt; element.
  */
-public final class HasPermissionCondition extends MiniLangElement implements Conditional {
+public final class HasPermissionCondition extends MethodOperation implements Conditional {
 
     private final FlexibleStringExpander actionFse;
     private final FlexibleStringExpander permissionFse;
+    // Sub-operations are used only when this is a method operation.
+    private final List<MethodOperation> elseSubOps;
+    private final List<MethodOperation> subOps;
 
     public HasPermissionCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
@@ -47,6 +56,18 @@ public final class HasPermissionConditio
         }
         this.permissionFse = FlexibleStringExpander.getInstance(element.getAttribute("permission"));
         this.actionFse = FlexibleStringExpander.getInstance(element.getAttribute("action"));
+        Element childElement = UtilXml.firstChildElement(element);
+        if (childElement != null && !"else".equals(childElement.getTagName())) {
+            this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod));
+        } else {
+            this.subOps = null;
+        }
+        Element elseElement = UtilXml.firstChildElement(element, "else");
+        if (elseElement != null) {
+            this.elseSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(elseElement, simpleMethod));
+        } else {
+            this.elseSubOps = null;
+        }
     }
 
     @Override
@@ -70,6 +91,34 @@ public final class HasPermissionConditio
         return false;
     }
 
+    @Override
+    public boolean exec(MethodContext methodContext) throws MiniLangException {
+        if (checkCondition(methodContext)) {
+            if (this.subOps != null) {
+                return SimpleMethod.runSubOps(subOps, methodContext);
+            }
+        } else {
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public String expandedString(MethodContext methodContext) {
+        return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap());
+    }
+
+    public List<MethodOperation> getAllSubOps() {
+        List<MethodOperation> allSubOps = FastList.newInstance();
+        if (this.subOps != null)
+            allSubOps.addAll(this.subOps);
+        if (this.elseSubOps != null)
+            allSubOps.addAll(this.elseSubOps);
+        return allSubOps;
+    }
+
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
         messageBuffer.append("has-permission[");
         messageBuffer.append(this.permissionFse);
@@ -80,13 +129,39 @@ public final class HasPermissionConditio
         messageBuffer.append("]");
     }
 
-    public static final class HasPermissionConditionFactory extends ConditionalFactory<HasPermissionCondition> {
+    @Override
+    public String rawString() {
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<if-has-permission ");
+        if (!this.permissionFse.isEmpty()) {
+            sb.append("permission=\"").append(this.permissionFse).append("\" ");
+        }
+        if (!this.actionFse.isEmpty()) {
+            sb.append("action=\"").append(this.actionFse).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
+    }
+
+    /**
+     * A &lt;if-has-permission&gt; element factory. 
+     */
+    public static final class HasPermissionConditionFactory extends ConditionalFactory<HasPermissionCondition> implements Factory<HasPermissionCondition> {
         @Override
         public HasPermissionCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new HasPermissionCondition(element, simpleMethod);
         }
 
         @Override
+        public HasPermissionCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
+            return new HasPermissionCondition(element, simpleMethod);
+        }
+
+        @Override
         public String getName() {
             return "if-has-permission";
         }

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java Thu May 17 14:14:03 2012
@@ -33,7 +33,7 @@ import org.ofbiz.minilang.method.MethodO
 import org.w3c.dom.Element;
 
 /**
- * Represents the top-level element and only mounted operation for the more flexible if structure.
+ * Implements the &lt;if&gt; element.
  */
 public final class MasterIf extends MethodOperation {
 
@@ -123,6 +123,9 @@ public final class MasterIf extends Meth
         return expandedString(null);
     }
 
+    /**
+     * A &lt;if&gt; element factory. 
+     */
     public static final class MasterIfFactory implements Factory<MasterIf> {
         public MasterIf createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new MasterIf(element, simpleMethod);

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java Thu May 17 14:14:03 2012
@@ -18,29 +18,38 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
+import java.util.Collections;
+import java.util.List;
+
+import javolution.util.FastList;
+
 import org.apache.oro.text.regex.MalformedPatternException;
 import org.ofbiz.base.util.CompilerMatcher;
+import org.ofbiz.base.util.UtilXml;
 import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.base.util.string.FlexibleStringExpander;
-import org.ofbiz.minilang.MiniLangElement;
 import org.ofbiz.minilang.MiniLangException;
 import org.ofbiz.minilang.MiniLangRuntimeException;
 import org.ofbiz.minilang.MiniLangUtil;
 import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
 import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Implements compare to a constant condition.
+ * Implements the &lt;if-regexp&gt; element.
  */
-public class RegexpCondition extends MiniLangElement implements Conditional {
+public class RegexpCondition extends MethodOperation implements Conditional {
 
     public static final String module = RegexpCondition.class.getName();
     private transient static ThreadLocal<CompilerMatcher> compilerMatcher = CompilerMatcher.getThreadLocal();
 
     private final FlexibleMapAccessor<Object> fieldFma;
     private final FlexibleStringExpander exprFse;
+    // Sub-operations are used only when this is a method operation.
+    private final List<MethodOperation> elseSubOps;
+    private final List<MethodOperation> subOps;
 
     public RegexpCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
@@ -52,6 +61,18 @@ public class RegexpCondition extends Min
         }
         this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field"));
         this.exprFse = FlexibleStringExpander.getInstance(element.getAttribute("expr"));
+        Element childElement = UtilXml.firstChildElement(element);
+        if (childElement != null && !"else".equals(childElement.getTagName())) {
+            this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod));
+        } else {
+            this.subOps = null;
+        }
+        Element elseElement = UtilXml.firstChildElement(element, "else");
+        if (elseElement != null) {
+            this.elseSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(elseElement, simpleMethod));
+        } else {
+            this.elseSubOps = null;
+        }
     }
 
     @Override
@@ -74,6 +95,34 @@ public class RegexpCondition extends Min
         }
     }
 
+    @Override
+    public boolean exec(MethodContext methodContext) throws MiniLangException {
+        if (checkCondition(methodContext)) {
+            if (this.subOps != null) {
+                return SimpleMethod.runSubOps(subOps, methodContext);
+            }
+        } else {
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public String expandedString(MethodContext methodContext) {
+        return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap());
+    }
+
+    public List<MethodOperation> getAllSubOps() {
+        List<MethodOperation> allSubOps = FastList.newInstance();
+        if (this.subOps != null)
+            allSubOps.addAll(this.subOps);
+        if (this.elseSubOps != null)
+            allSubOps.addAll(this.elseSubOps);
+        return allSubOps;
+    }
+
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
         messageBuffer.append("regexp[");
         messageBuffer.append("[");
@@ -85,13 +134,37 @@ public class RegexpCondition extends Min
         messageBuffer.append("]");
     }
 
-    public static final class RegexpConditionFactory extends ConditionalFactory<RegexpCondition> {
+    @Override
+    public String rawString() {
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<if-regexp ");
+        sb.append("field=\"").append(this.fieldFma).append("\" ");
+        if (!this.exprFse.isEmpty()) {
+            sb.append("expr=\"").append(this.exprFse).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
+    }
+
+    /**
+     * A &lt;if-regexp&gt; element factory. 
+     */
+    public static final class RegexpConditionFactory extends ConditionalFactory<RegexpCondition> implements Factory<RegexpCondition> {
         @Override
         public RegexpCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new RegexpCondition(element, simpleMethod);
         }
 
         @Override
+        public RegexpCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
+            return new RegexpCondition(element, simpleMethod);
+        }
+
+        @Override
         public String getName() {
             return "if-regexp";
         }

Modified: ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java?rev=1339610&r1=1339609&r2=1339610&view=diff
==============================================================================
--- ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java (original)
+++ ofbiz/trunk/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java Thu May 17 14:14:03 2012
@@ -19,21 +19,27 @@
 package org.ofbiz.minilang.method.conditional;
 
 import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.List;
 
+import javolution.util.FastList;
+
+import org.ofbiz.base.util.UtilXml;
 import org.ofbiz.base.util.collections.FlexibleMapAccessor;
-import org.ofbiz.minilang.MiniLangElement;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
 import org.ofbiz.minilang.MiniLangException;
 import org.ofbiz.minilang.MiniLangRuntimeException;
 import org.ofbiz.minilang.MiniLangUtil;
 import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
 import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Implements validate method condition.
+ * Implements the &lt;if-validate-method&gt; element.
  */
-public final class ValidateMethodCondition extends MiniLangElement implements Conditional {
+public final class ValidateMethodCondition extends MethodOperation implements Conditional {
 
     public static final String module = ValidateMethodCondition.class.getName();
     private static final Class<?>[] paramTypes = new Class<?>[] { String.class };
@@ -41,6 +47,9 @@ public final class ValidateMethodConditi
     private final String className;
     private final FlexibleMapAccessor<Object> fieldFma;
     private final String methodName;
+    // Sub-operations are used only when this is a method operation.
+    private final List<MethodOperation> elseSubOps;
+    private final List<MethodOperation> subOps;
 
     public ValidateMethodCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
@@ -53,6 +62,18 @@ public final class ValidateMethodConditi
         this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field"));
         this.methodName = element.getAttribute("method");
         this.className = MiniLangValidate.checkAttribute(element.getAttribute("class"), "org.ofbiz.base.util.UtilValidate");
+        Element childElement = UtilXml.firstChildElement(element);
+        if (childElement != null && !"else".equals(childElement.getTagName())) {
+            this.subOps = Collections.unmodifiableList(SimpleMethod.readOperations(element, simpleMethod));
+        } else {
+            this.subOps = null;
+        }
+        Element elseElement = UtilXml.firstChildElement(element, "else");
+        if (elseElement != null) {
+            this.elseSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(elseElement, simpleMethod));
+        } else {
+            this.elseSubOps = null;
+        }
     }
 
     @Override
@@ -78,6 +99,34 @@ public final class ValidateMethodConditi
         }
     }
 
+    @Override
+    public boolean exec(MethodContext methodContext) throws MiniLangException {
+        if (checkCondition(methodContext)) {
+            if (this.subOps != null) {
+                return SimpleMethod.runSubOps(subOps, methodContext);
+            }
+        } else {
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public String expandedString(MethodContext methodContext) {
+        return FlexibleStringExpander.expandString(toString(), methodContext.getEnvMap());
+    }
+
+    public List<MethodOperation> getAllSubOps() {
+        List<MethodOperation> allSubOps = FastList.newInstance();
+        if (this.subOps != null)
+            allSubOps.addAll(this.subOps);
+        if (this.elseSubOps != null)
+            allSubOps.addAll(this.elseSubOps);
+        return allSubOps;
+    }
+
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
         // allow methodContext to be null
         String methodName = methodContext == null ? this.methodName : methodContext.expandString(this.methodName);
@@ -95,13 +144,40 @@ public final class ValidateMethodConditi
         messageBuffer.append(")]");
     }
 
-    public static final class ValidateMethodConditionFactory extends ConditionalFactory<ValidateMethodCondition> {
+    @Override
+    public String rawString() {
+        return toString();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<if-validate-method ");
+        sb.append("field=\"").append(this.fieldFma).append("\" ");
+        if (!this.methodName.isEmpty()) {
+            sb.append("methodName=\"").append(this.methodName).append("\" ");
+        }
+        if (!"org.ofbiz.base.util.UtilValidate".equals(this.className)) {
+            sb.append("class=\"").append(this.className).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
+    }
+
+    /**
+     * A &lt;if-validate-method&gt; element factory. 
+     */
+    public static final class ValidateMethodConditionFactory extends ConditionalFactory<ValidateMethodCondition> implements Factory<ValidateMethodCondition> {
         @Override
         public ValidateMethodCondition createCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new ValidateMethodCondition(element, simpleMethod);
         }
 
         @Override
+        public ValidateMethodCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
+            return new ValidateMethodCondition(element, simpleMethod);
+        }
+
+        @Override
         public String getName() {
             return "if-validate-method";
         }