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/07/10 14:06:00 UTC

svn commit: r1359626 [6/12] - in /ofbiz/branches/release12.04: ./ framework/base/ framework/base/src/org/ofbiz/base/util/collections/ framework/base/src/org/ofbiz/base/util/collections/test/ framework/base/src/org/ofbiz/base/util/string/ framework/enti...

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/ElseIf.java Tue Jul 10 12:05:55 2012
@@ -22,21 +22,31 @@ import java.util.Collections;
 import java.util.List;
 
 import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.minilang.MiniLangElement;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Implements the else-if alternate execution element.
+ * Implements the <else-if> element.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Celseif%3E}}">Mini-language Reference</a>
  */
-public class ElseIf {
+public final class ElseIf extends MiniLangElement {
 
-    protected Conditional condition;
-    protected List<MethodOperation> thenSubOps;
+    private final Conditional condition;
+    private final List<MethodOperation> thenSubOps;
 
     public ElseIf(Element element, SimpleMethod simpleMethod) throws MiniLangException {
+        super(element, simpleMethod);
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.childElements(simpleMethod, element, "condition", "then");
+            MiniLangValidate.requiredChildElements(simpleMethod, element, "condition", "then");
+        }
         Element conditionElement = UtilXml.firstChildElement(element, "condition");
         Element conditionChildElement = UtilXml.firstChildElement(conditionElement);
         this.condition = ConditionalFactory.makeConditional(conditionChildElement, simpleMethod);
@@ -44,10 +54,17 @@ public class ElseIf {
         this.thenSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(thenElement, simpleMethod));
     }
 
-    public boolean checkCondition(MethodContext methodContext) {
+    public boolean checkCondition(MethodContext methodContext) throws MiniLangException {
         return condition.checkCondition(methodContext);
     }
 
+    @Override
+    public void gatherArtifactInfo(ArtifactInfoContext aic) {
+        for (MethodOperation method : this.thenSubOps) {
+            method.gatherArtifactInfo(aic);
+        }
+    }
+
     public List<MethodOperation> getThenSubOps() {
         return this.thenSubOps;
     }

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/EmptyCondition.java Tue Jul 10 12:05:55 2012
@@ -18,98 +18,114 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
-import java.util.Collection;
-import java.util.Map;
+import java.util.Collections;
+import java.util.List;
 
-import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.ObjectType;
+import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
+import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
-import org.ofbiz.minilang.method.ContextAccessor;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 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.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cifempty%3E}}">Mini-language Reference</a>
  */
-public class EmptyCondition implements Conditional {
+public final class EmptyCondition extends MethodOperation implements Conditional {
 
     public static final String module = EmptyCondition.class.getName();
 
-    ContextAccessor<Object> fieldAcsr;
-    ContextAccessor<Map<String, ? extends Object>> mapAcsr;
-    SimpleMethod simpleMethod;
-
-    public EmptyCondition(Element element, SimpleMethod simpleMethod) {
-        this.simpleMethod = simpleMethod;
-        // NOTE: this is still supported, but is deprecated
-        this.mapAcsr = new ContextAccessor<Map<String, ? extends Object>>(element.getAttribute("map-name"));
-        this.fieldAcsr = new ContextAccessor<Object>(element.getAttribute("field"));
-        if (this.fieldAcsr.isEmpty()) {
-            // NOTE: this is still supported, but is deprecated
-            this.fieldAcsr = new ContextAccessor<Object>(element.getAttribute("field-name"));
+    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);
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "field");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "field");
+            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;
         }
     }
 
-    public boolean checkCondition(MethodContext methodContext) {
-        // only run subOps if element is empty/null
-        boolean runSubOps = false;
-        Object fieldVal = getFieldVal(methodContext);
-        if (fieldVal == null) {
-            runSubOps = true;
+    @Override
+    public boolean checkCondition(MethodContext methodContext) throws MiniLangException {
+        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 (fieldVal instanceof String) {
-                String fieldStr = (String) fieldVal;
-                if (fieldStr.length() == 0) {
-                    runSubOps = true;
-                }
-            } else if (fieldVal instanceof Collection<?>) {
-                Collection<?> fieldCol = (Collection<?>) fieldVal;
-                if (fieldCol.size() == 0) {
-                    runSubOps = true;
-                }
-            } else if (fieldVal instanceof Map<?, ?>) {
-                Map<?, ?> fieldMap = (Map<?, ?>) fieldVal;
-                if (fieldMap.size() == 0) {
-                    runSubOps = true;
-                }
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
             }
         }
-        return runSubOps;
+        return true;
     }
 
-    protected Object getFieldVal(MethodContext methodContext) {
-        Object fieldVal = null;
-        if (!mapAcsr.isEmpty()) {
-            Map<String, ? extends Object> fromMap = mapAcsr.get(methodContext);
-            if (fromMap == null) {
-                if (Debug.infoOn())
-                    Debug.logInfo("Map not found with name " + mapAcsr + ", running operations", module);
-            } else {
-                fieldVal = fieldAcsr.get(fromMap, methodContext);
+    @Override
+    public void gatherArtifactInfo(ArtifactInfoContext aic) {
+        if (this.subOps != null) {
+            for (MethodOperation method : this.subOps) {
+                method.gatherArtifactInfo(aic);
+            }
+        }
+        if (this.elseSubOps != null) {
+            for (MethodOperation method : this.elseSubOps) {
+                method.gatherArtifactInfo(aic);
             }
-        } else {
-            // no map name, try the env
-            fieldVal = fieldAcsr.get(methodContext);
         }
-        return fieldVal;
     }
 
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
         messageBuffer.append("empty[");
-        if (!this.mapAcsr.isEmpty()) {
-            messageBuffer.append(this.mapAcsr);
-            messageBuffer.append(".");
-        }
-        messageBuffer.append(this.fieldAcsr);
-        if (methodContext != null) {
-            messageBuffer.append("=");
-            messageBuffer.append(getFieldVal(methodContext));
-        }
+        messageBuffer.append(fieldFma);
+        messageBuffer.append("=");
+        messageBuffer.append(fieldFma.get(methodContext.getEnvMap()));
         messageBuffer.append("]");
     }
 
-    public static final class EmptyConditionFactory extends ConditionalFactory<EmptyCondition> {
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<if-empty ");
+        sb.append("field=\"").append(this.fieldFma).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) {
+        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);
         }
 

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/HasPermissionCondition.java Tue Jul 10 12:05:55 2012
@@ -18,69 +18,142 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
+import java.util.Collections;
+import java.util.List;
+
 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.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 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.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cifhaspermission%3E}}">Mini-language Reference</a>
  */
-public class HasPermissionCondition implements Conditional {
+public final class HasPermissionCondition extends MethodOperation implements Conditional {
 
-    String action;
-    String permission;
-    SimpleMethod simpleMethod;
-
-    public HasPermissionCondition(Element element, SimpleMethod simpleMethod) {
-        this.simpleMethod = simpleMethod;
-        this.permission = element.getAttribute("permission");
-        this.action = element.getAttribute("action");
-    }
-
-    public boolean checkCondition(MethodContext methodContext) {
-        // only run subOps if element is empty/null
-        boolean runSubOps = false;
-        // if no user is logged in, treat as if the user does not have permission: do not
-        // run subops
+    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);
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "permission", "action");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "permission");
+            MiniLangValidate.constantPlusExpressionAttributes(simpleMethod, element, "permission", "action");
+        }
+        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
+    public boolean checkCondition(MethodContext methodContext) throws MiniLangException {
         GenericValue userLogin = methodContext.getUserLogin();
         if (userLogin != null) {
-            String permission = methodContext.expandString(this.permission);
-            String action = methodContext.expandString(this.action);
-
-            Authorization authz = methodContext.getAuthz();
-            Security security = methodContext.getSecurity();
-            if (UtilValidate.isNotEmpty(action)) {
-                // run hasEntityPermission
+            String permission = permissionFse.expandString(methodContext.getEnvMap());
+            String action = actionFse.expandString(methodContext.getEnvMap());
+            if (!action.isEmpty()) {
+                Security security = methodContext.getSecurity();
                 if (security.hasEntityPermission(permission, action, userLogin)) {
-                    runSubOps = true;
+                    return true;
                 }
             } else {
-                // run hasPermission
+                Authorization authz = methodContext.getAuthz();
                 if (authz.hasPermission(userLogin.getString("userLoginId"), permission, methodContext.getEnvMap())) {
-                    runSubOps = true;
+                    return true;
                 }
             }
         }
-        return runSubOps;
+        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 void gatherArtifactInfo(ArtifactInfoContext aic) {
+        if (this.subOps != null) {
+            for (MethodOperation method : this.subOps) {
+                method.gatherArtifactInfo(aic);
+            }
+        }
+        if (this.elseSubOps != null) {
+            for (MethodOperation method : this.elseSubOps) {
+                method.gatherArtifactInfo(aic);
+            }
+        }
     }
 
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
         messageBuffer.append("has-permission[");
-        messageBuffer.append(this.permission);
-        if (UtilValidate.isNotEmpty(this.action)) {
+        messageBuffer.append(this.permissionFse);
+        if (UtilValidate.isNotEmpty(this.actionFse)) {
             messageBuffer.append(":");
-            messageBuffer.append(this.action);
+            messageBuffer.append(this.actionFse);
         }
         messageBuffer.append("]");
     }
 
-    public static final class HasPermissionConditionFactory extends ConditionalFactory<HasPermissionCondition> {
+    @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 createCondition(Element element, SimpleMethod simpleMethod) {
+        public HasPermissionCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new HasPermissionCondition(element, simpleMethod);
         }
 

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/MasterIf.java Tue Jul 10 12:05:55 2012
@@ -18,45 +18,54 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
+import java.util.ArrayList;
 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.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
 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 class MasterIf extends MethodOperation {
+public final class MasterIf extends MethodOperation {
 
-    Conditional condition;
-    List<ElseIf> elseIfs = null;
-    List<MethodOperation> elseSubOps = null;
-    List<MethodOperation> thenSubOps;
+    private final Conditional condition;
+    private final List<ElseIf> elseIfs;
+    private final List<MethodOperation> elseSubOps;
+    private final List<MethodOperation> thenSubOps;
 
     public MasterIf(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.childElements(simpleMethod, element, "condition", "then", "else-if", "else");
+            MiniLangValidate.requiredChildElements(simpleMethod, element, "condition", "then");
+        }
         Element conditionElement = UtilXml.firstChildElement(element, "condition");
         Element conditionChildElement = UtilXml.firstChildElement(conditionElement);
         this.condition = ConditionalFactory.makeConditional(conditionChildElement, simpleMethod);
         Element thenElement = UtilXml.firstChildElement(element, "then");
         this.thenSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(thenElement, simpleMethod));
         List<? extends Element> elseIfElements = UtilXml.childElementList(element, "else-if");
-        if (UtilValidate.isNotEmpty(elseIfElements)) {
-            elseIfs = FastList.newInstance();
+        if (elseIfElements.isEmpty()) {
+            this.elseIfs = null;
+        } else {
+            List<ElseIf> elseIfs = new ArrayList<ElseIf>(elseIfElements.size());
             for (Element elseIfElement : elseIfElements) {
                 elseIfs.add(new ElseIf(elseIfElement, simpleMethod));
             }
+            this.elseIfs = Collections.unmodifiableList(elseIfs);
         }
         Element elseElement = UtilXml.firstChildElement(element, "else");
-        if (elseElement != null) {
+        if (elseElement == null) {
+            this.elseSubOps = null;
+        } else {
             this.elseSubOps = Collections.unmodifiableList(SimpleMethod.readOperations(elseElement, simpleMethod));
         }
     }
@@ -72,7 +81,7 @@ public class MasterIf extends MethodOper
             return SimpleMethod.runSubOps(thenSubOps, methodContext);
         } else {
             // try the else-ifs
-            if (UtilValidate.isNotEmpty(elseIfs)) {
+            if (elseIfs != null) {
                 for (ElseIf elseIf : elseIfs) {
                     if (elseIf.checkCondition(methodContext)) {
                         return elseIf.runSubOps(methodContext);
@@ -88,31 +97,32 @@ public class MasterIf extends MethodOper
     }
 
     @Override
-    public String expandedString(MethodContext methodContext) {
-        // TODO: fill in missing details, if needed
-        StringBuilder messageBuf = new StringBuilder();
-        this.condition.prettyPrint(messageBuf, methodContext);
-        return "<if><condition>" + messageBuf + "</condition></if>";
-    }
-
-    public List<MethodOperation> getAllSubOps() {
-        List<MethodOperation> allSubOps = FastList.newInstance();
-        allSubOps.addAll(this.thenSubOps);
-        if (this.elseSubOps != null)
-            allSubOps.addAll(this.elseSubOps);
-        if (elseIfs != null) {
+    public void gatherArtifactInfo(ArtifactInfoContext aic) {
+        for (MethodOperation method : this.thenSubOps) {
+            method.gatherArtifactInfo(aic);
+        }
+        if (this.elseSubOps != null) {
+            for (MethodOperation method : this.elseSubOps) {
+                method.gatherArtifactInfo(aic);
+            }
+        }
+        if (this.elseIfs != null) {
             for (ElseIf elseIf : elseIfs) {
-                allSubOps.addAll(elseIf.getThenSubOps());
+                elseIf.gatherArtifactInfo(aic);
             }
         }
-        return allSubOps;
     }
 
     @Override
-    public String rawString() {
-        return expandedString(null);
+    public String toString() {
+        StringBuilder messageBuf = new StringBuilder();
+        this.condition.prettyPrint(messageBuf, null);
+        return "<if><condition>" + messageBuf + "</condition></if>";
     }
 
+    /**
+     * 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/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/RegexpCondition.java Tue Jul 10 12:05:55 2012
@@ -18,110 +18,144 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.conditional;
 
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
-
-import javolution.util.FastList;
 
 import org.apache.oro.text.regex.MalformedPatternException;
 import org.ofbiz.base.util.CompilerMatcher;
-import org.ofbiz.base.util.Debug;
-import org.ofbiz.base.util.GeneralException;
-import org.ofbiz.base.util.ObjectType;
+import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 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.ContextAccessor;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 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.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cifregexp%3E}}">Mini-language Reference</a>
  */
-public class RegexpCondition 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();
 
-    List<?> elseSubOps = null;
-    FlexibleStringExpander exprExdr;
-    ContextAccessor<Object> fieldAcsr;
-    ContextAccessor<Map<String, ? extends Object>> mapAcsr;
-    SimpleMethod simpleMethod;
-    List<?> subOps = FastList.newInstance();
-
-    public RegexpCondition(Element element, SimpleMethod simpleMethod) {
-        this.simpleMethod = simpleMethod;
-        // NOTE: this is still supported, but is deprecated
-        this.mapAcsr = new ContextAccessor<Map<String, ? extends Object>>(element.getAttribute("map-name"));
-        this.fieldAcsr = new ContextAccessor<Object>(element.getAttribute("field"));
-        if (this.fieldAcsr.isEmpty()) {
-            // NOTE: this is still supported, but is deprecated
-            this.fieldAcsr = new ContextAccessor<Object>(element.getAttribute("field-name"));
-        }
-        this.exprExdr = FlexibleStringExpander.getInstance(element.getAttribute("expr"));
-    }
-
-    public boolean checkCondition(MethodContext methodContext) {
-        String fieldString = getFieldString(methodContext);
-        boolean matches = false;
+    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);
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "field", "expr");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "field", "expr");
+            MiniLangValidate.expressionAttributes(simpleMethod, element, "field");
+        }
+        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
+    public boolean checkCondition(MethodContext methodContext) throws MiniLangException {
+        Object fieldVal = fieldFma.get(methodContext.getEnvMap());
+        if (fieldVal == null) {
+            fieldVal = "";
+        } else if (!(fieldVal instanceof String)) {
+            try {
+                fieldVal = MiniLangUtil.convertType(fieldVal, String.class, methodContext.getLocale(), methodContext.getTimeZone(), null);
+            } catch (Exception e) {
+                throw new MiniLangRuntimeException(e, this);
+            }
+        }
+        String regExp = exprFse.expandString(methodContext.getEnvMap());
         try {
-            matches = compilerMatcher.get().matches(fieldString, methodContext.expandString(this.exprExdr));
+            return compilerMatcher.get().matches((String) fieldVal, regExp);
         } catch (MalformedPatternException e) {
-            Debug.logError(e, "Regular Expression [" + this.exprExdr + "] is mal-formed: " + e.toString(), module);
+            throw new MiniLangRuntimeException(e, this);
         }
-        if (matches) {
-            return true;
+    }
+
+    @Override
+    public boolean exec(MethodContext methodContext) throws MiniLangException {
+        if (checkCondition(methodContext)) {
+            if (this.subOps != null) {
+                return SimpleMethod.runSubOps(subOps, methodContext);
+            }
         } else {
-            return false;
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
+            }
         }
+        return true;
     }
 
-    protected String getFieldString(MethodContext methodContext) {
-        String fieldString = null;
-        Object fieldVal = null;
-        if (!mapAcsr.isEmpty()) {
-            Map<String, ? extends Object> fromMap = mapAcsr.get(methodContext);
-            if (fromMap == null) {
-                if (Debug.infoOn())
-                    Debug.logInfo("Map not found with name " + mapAcsr + ", using empty string for comparison", module);
-            } else {
-                fieldVal = fieldAcsr.get(fromMap, methodContext);
+    @Override
+    public void gatherArtifactInfo(ArtifactInfoContext aic) {
+        if (this.subOps != null) {
+            for (MethodOperation method : this.subOps) {
+                method.gatherArtifactInfo(aic);
             }
-        } else {
-            // no map name, try the env
-            fieldVal = fieldAcsr.get(methodContext);
         }
-        if (fieldVal != null) {
-            try {
-                fieldString = (String) ObjectType.simpleTypeConvert(fieldVal, "String", null, methodContext.getTimeZone(), methodContext.getLocale(), true);
-            } catch (GeneralException e) {
-                Debug.logError(e, "Could not convert object to String, using empty String", module);
+        if (this.elseSubOps != null) {
+            for (MethodOperation method : this.elseSubOps) {
+                method.gatherArtifactInfo(aic);
             }
         }
-        // always use an empty string by default
-        if (fieldString == null)
-            fieldString = "";
-        return fieldString;
     }
 
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
         messageBuffer.append("regexp[");
         messageBuffer.append("[");
-        if (!this.mapAcsr.isEmpty()) {
-            messageBuffer.append(this.mapAcsr);
-            messageBuffer.append(".");
-        }
-        messageBuffer.append(this.fieldAcsr);
+        messageBuffer.append(this.fieldFma);
         messageBuffer.append("=");
-        messageBuffer.append(getFieldString(methodContext));
+        messageBuffer.append(fieldFma.get(methodContext.getEnvMap()));
         messageBuffer.append("] matches ");
-        messageBuffer.append(methodContext.expandString(this.exprExdr));
+        messageBuffer.append(exprFse.expandString(methodContext.getEnvMap()));
         messageBuffer.append("]");
     }
 
-    public static final class RegexpConditionFactory extends ConditionalFactory<RegexpCondition> {
+    @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 createCondition(Element element, SimpleMethod simpleMethod) {
+        public RegexpCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new RegexpCondition(element, simpleMethod);
         }
 

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/conditional/ValidateMethodCondition.java Tue Jul 10 12:05:55 2012
@@ -19,119 +19,154 @@
 package org.ofbiz.minilang.method.conditional;
 
 import java.lang.reflect.Method;
-import java.util.Map;
+import java.util.Collections;
+import java.util.List;
 
-import org.ofbiz.base.util.Debug;
-import org.ofbiz.base.util.GeneralException;
-import org.ofbiz.base.util.ObjectType;
+import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
+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.ContextAccessor;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 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.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cifvalidatemethod%3E}}">Mini-language Reference</a>
  */
-public class ValidateMethodCondition 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 };
 
-    String className;
-    ContextAccessor<Object> fieldAcsr;
-    ContextAccessor<Map<String, ? extends Object>> mapAcsr;
-    String methodName;
-
-    public ValidateMethodCondition(Element element) {
-        this.mapAcsr = new ContextAccessor<Map<String, ? extends Object>>(element.getAttribute("map-name"));
-        this.fieldAcsr = new ContextAccessor<Object>(element.getAttribute("field-name"));
+    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);
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "field", "method", "class");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "field", "method");
+            MiniLangValidate.constantAttributes(simpleMethod, element, "method", "class");
+            MiniLangValidate.expressionAttributes(simpleMethod, element, "field");
+        }
+        this.fieldFma = FlexibleMapAccessor.getInstance(element.getAttribute("field"));
         this.methodName = element.getAttribute("method");
-        this.className = element.getAttribute("class");
+        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;
+        }
     }
 
-    public boolean checkCondition(MethodContext methodContext) {
-        String methodName = methodContext.expandString(this.methodName);
-        String className = methodContext.expandString(this.className);
-        String fieldString = getFieldString(methodContext);
-        Class<?>[] paramTypes = new Class<?>[] { String.class };
-        Object[] params = new Object[] { fieldString };
-        Class<?> valClass;
-        try {
-            valClass = methodContext.getLoader().loadClass(className);
-        } catch (ClassNotFoundException cnfe) {
-            Debug.logError("Could not find validation class: " + className, module);
-            return false;
-        }
-        Method valMethod;
-        try {
-            valMethod = valClass.getMethod(methodName, paramTypes);
-        } catch (NoSuchMethodException cnfe) {
-            Debug.logError("Could not find validation method: " + methodName + " of class " + className, module);
-            return false;
+    @Override
+    public boolean checkCondition(MethodContext methodContext) throws MiniLangException {
+        Object fieldVal = fieldFma.get(methodContext.getEnvMap());
+        if (fieldVal == null) {
+            fieldVal = "";
+        } else if (!(fieldVal instanceof String)) {
+            try {
+                fieldVal = MiniLangUtil.convertType(fieldVal, String.class, methodContext.getLocale(), methodContext.getTimeZone(), null);
+            } catch (Exception e) {
+                throw new MiniLangRuntimeException(e, this);
+            }
         }
-        Boolean resultBool = Boolean.FALSE;
+        Object[] params = new Object[] { fieldVal };
         try {
-            resultBool = (Boolean) valMethod.invoke(null, params);
+            Class<?> valClass = methodContext.getLoader().loadClass(className);
+            Method valMethod = valClass.getMethod(methodName, paramTypes);
+            Boolean resultBool = (Boolean) valMethod.invoke(null, params);
+            return resultBool.booleanValue();
         } catch (Exception e) {
-            Debug.logError(e, "Error in IfValidationMethod " + methodName + " of class " + className + ", not processing sub-ops ", module);
+            throw new MiniLangRuntimeException(e, this);
         }
-        if (resultBool != null)
-            return resultBool.booleanValue();
-        return false;
     }
 
-    protected String getFieldString(MethodContext methodContext) {
-        String fieldString = null;
-        Object fieldVal = null;
-        if (!mapAcsr.isEmpty()) {
-            Map<String, ? extends Object> fromMap = mapAcsr.get(methodContext);
-            if (fromMap == null) {
-                if (Debug.infoOn())
-                    Debug.logInfo("Map not found with name " + mapAcsr + ", using empty string for comparison", module);
-            } else {
-                fieldVal = fieldAcsr.get(fromMap, methodContext);
+    @Override
+    public boolean exec(MethodContext methodContext) throws MiniLangException {
+        if (checkCondition(methodContext)) {
+            if (this.subOps != null) {
+                return SimpleMethod.runSubOps(subOps, methodContext);
             }
         } else {
-            // no map name, try the env
-            fieldVal = fieldAcsr.get(methodContext);
+            if (elseSubOps != null) {
+                return SimpleMethod.runSubOps(elseSubOps, methodContext);
+            }
         }
-        if (fieldVal != null) {
-            try {
-                fieldString = (String) ObjectType.simpleTypeConvert(fieldVal, "String", null, methodContext.getTimeZone(), methodContext.getLocale(), true);
-            } catch (GeneralException e) {
-                Debug.logError(e, "Could not convert object to String, using empty String", module);
+        return true;
+    }
+
+    @Override
+    public void gatherArtifactInfo(ArtifactInfoContext aic) {
+        if (this.subOps != null) {
+            for (MethodOperation method : this.subOps) {
+                method.gatherArtifactInfo(aic);
+            }
+        }
+        if (this.elseSubOps != null) {
+            for (MethodOperation method : this.elseSubOps) {
+                method.gatherArtifactInfo(aic);
             }
         }
-        // always use an empty string by default
-        if (fieldString == null)
-            fieldString = "";
-        return fieldString;
     }
 
     public void prettyPrint(StringBuilder messageBuffer, MethodContext methodContext) {
-        // allow methodContext to be null
-        String methodName = methodContext == null ? this.methodName : methodContext.expandString(this.methodName);
-        String className = methodContext == null ? this.className : methodContext.expandString(this.className);
         messageBuffer.append("validate-method[");
         messageBuffer.append(className);
         messageBuffer.append(".");
         messageBuffer.append(methodName);
         messageBuffer.append("(");
-        if (!this.mapAcsr.isEmpty()) {
-            messageBuffer.append(this.mapAcsr);
-            messageBuffer.append(".");
-        }
-        messageBuffer.append(this.fieldAcsr);
+        messageBuffer.append(this.fieldFma);
         if (methodContext != null) {
             messageBuffer.append("=");
-            messageBuffer.append(getFieldString(methodContext));
+            messageBuffer.append(fieldFma.get(methodContext.getEnvMap()));
         }
         messageBuffer.append(")]");
     }
 
-    public static final class ValidateMethodConditionFactory extends ConditionalFactory<ValidateMethodCondition> {
+    @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 createCondition(Element element, SimpleMethod simpleMethod) {
-            return new ValidateMethodCondition(element);
+        public ValidateMethodCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
+            return new ValidateMethodCondition(element, simpleMethod);
         }
 
         @Override

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/ClearCacheLine.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/ClearCacheLine.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/ClearCacheLine.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/ClearCacheLine.java Tue Jul 10 12:05:55 2012
@@ -20,64 +20,70 @@ package org.ofbiz.minilang.method.entity
 
 import java.util.Map;
 
-import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
+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.ContextAccessor;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Uses the delegator to clear elements from the cache; intelligently looks at the map passed to see if it is a byPrimaryKey, and byAnd, or an all.
+ * Implements the &lt;clear-cache-line&gt; element.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cclearcacheline%3E}}">Mini-language Reference</a>
  */
-public class ClearCacheLine extends MethodOperation {
+public final class ClearCacheLine extends MethodOperation {
 
-    public static final String module = ClearCacheLine.class.getName();
-
-    String entityName;
-    ContextAccessor<Map<String, ? extends Object>> mapAcsr;
+    private final FlexibleStringExpander entityNameFse;
+    private final FlexibleMapAccessor<Map<String, ? extends Object>> mapFma;
 
     public ClearCacheLine(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
-        entityName = element.getAttribute("entity-name");
-        mapAcsr = new ContextAccessor<Map<String, ? extends Object>>(element.getAttribute("map"), element.getAttribute("map-name"));
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "entity-name", "map");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "entity-name");
+            MiniLangValidate.expressionAttributes(simpleMethod, element, "map");
+            MiniLangValidate.noChildElements(simpleMethod, element);
+        }
+        entityNameFse = FlexibleStringExpander.getInstance(element.getAttribute("entity-name"));
+        mapFma = FlexibleMapAccessor.getInstance(element.getAttribute("map"));
     }
 
     @Override
     public boolean exec(MethodContext methodContext) throws MiniLangException {
-        String entityName = methodContext.expandString(this.entityName);
-
-        if (mapAcsr.isEmpty()) {
+        String entityName = entityNameFse.expandString(methodContext.getEnvMap());
+        Map<String, ? extends Object> fieldsMap = mapFma.get(methodContext.getEnvMap());
+        if (fieldsMap == null) {
             methodContext.getDelegator().clearCacheLine(entityName);
         } else {
-            Map<String, ? extends Object> theMap = mapAcsr.get(methodContext);
-            if (theMap == null) {
-                Debug.logWarning("In clear-cache-line could not find map with name " + mapAcsr + ", not clearing any cache lines", module);
-            } else {
-                methodContext.getDelegator().clearCacheLine(entityName, theMap);
-            }
+            methodContext.getDelegator().clearCacheLine(entityName, fieldsMap);
         }
         return true;
     }
 
     @Override
-    public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
-    }
-
-    @Override
-    public String rawString() {
-        // TODO: something more than the empty tag
-        return "<clear-cache-line/>";
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<clear-cache-line ");
+        sb.append("entity-name=\"").append(this.entityNameFse).append("\" ");
+        if (!this.mapFma.isEmpty()) {
+            sb.append("map=\"").append(this.mapFma).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
     }
 
+    /**
+     * A factory for the &lt;clear-cache-line&gt; element.
+     */
     public static final class ClearCacheLineFactory implements Factory<ClearCacheLine> {
+        @Override
         public ClearCacheLine createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new ClearCacheLine(element, simpleMethod);
         }
 
+        @Override
         public String getName() {
             return "clear-cache-line";
         }

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/ClearEntityCaches.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/ClearEntityCaches.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/ClearEntityCaches.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/ClearEntityCaches.java Tue Jul 10 12:05:55 2012
@@ -19,18 +19,30 @@
 package org.ofbiz.minilang.method.entityops;
 
 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;
+import org.w3c.dom.NamedNodeMap;
 
 /**
- * Clears all Entity Engine Caches
+ * Implements the &lt;clear-entity-caches&gt; element.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cclearentitycaches%3E}}">Mini-language Reference</a>
  */
-public class ClearEntityCaches extends MethodOperation {
+public final class ClearEntityCaches extends MethodOperation {
 
     public ClearEntityCaches(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
+        if (MiniLangValidate.validationOn()) {
+            NamedNodeMap nnm = element.getAttributes();
+            for (int i = 0; i < nnm.getLength(); i++) {
+                String attributeName = nnm.item(i).getNodeName();
+                MiniLangValidate.handleError("Attribute name \"" + attributeName + "\" is not valid.", simpleMethod, element);
+            }
+            MiniLangValidate.noChildElements(simpleMethod, element);
+        }
     }
 
     @Override
@@ -40,22 +52,20 @@ public class ClearEntityCaches extends M
     }
 
     @Override
-    public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
-    }
-
-    @Override
-    public String rawString() {
-        // TODO: something more than the empty tag
+    public String toString() {
         return "<clear-entity-caches/>";
     }
 
+    /**
+     * A factory for the &lt;clear-entity-caches&gt; element.
+     */
     public static final class ClearEntityCachesFactory implements Factory<ClearEntityCaches> {
+        @Override
         public ClearEntityCaches createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new ClearEntityCaches(element, simpleMethod);
         }
 
+        @Override
         public String getName() {
             return "clear-entity-caches";
         }

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/CloneValue.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/CloneValue.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/CloneValue.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/CloneValue.java Tue Jul 10 12:05:55 2012
@@ -18,59 +18,65 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.entityops;
 
-import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.entity.GenericValue;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
-import org.ofbiz.minilang.method.ContextAccessor;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Uses the delegator to find entity values by anding the map fields
+ * Implements the &lt;clone-value&gt; element.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Cclonevalue%3E}}">Mini-language Reference</a>
  */
-public class CloneValue extends MethodOperation {
+public final class CloneValue extends MethodOperation {
 
-    public static final String module = CloneValue.class.getName();
-
-    ContextAccessor<GenericValue> newValueAcsr;
-    ContextAccessor<GenericValue> valueAcsr;
+    private final FlexibleMapAccessor<GenericValue> newValueFma;
+    private final FlexibleMapAccessor<GenericValue> valueFma;
 
     public CloneValue(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
-        valueAcsr = new ContextAccessor<GenericValue>(element.getAttribute("value-field"), element.getAttribute("value-name"));
-        newValueAcsr = new ContextAccessor<GenericValue>(element.getAttribute("new-value-field"), element.getAttribute("new-value-name"));
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "value-field", "new-value-field");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "value-field", "new-value-field");
+            MiniLangValidate.expressionAttributes(simpleMethod, element, "value-field", "new-value-field");
+            MiniLangValidate.noChildElements(simpleMethod, element);
+        }
+        valueFma = FlexibleMapAccessor.getInstance(element.getAttribute("value-field"));
+        newValueFma = FlexibleMapAccessor.getInstance(element.getAttribute("new-value-field"));
     }
 
     @Override
     public boolean exec(MethodContext methodContext) throws MiniLangException {
-        GenericValue value = valueAcsr.get(methodContext);
-        if (value == null) {
-            Debug.logWarning("In clone-value a value was not found with the specified valueAcsr: " + valueAcsr + ", not copying", module);
-            return true;
+        GenericValue value = valueFma.get(methodContext.getEnvMap());
+        if (value != null) {
+            newValueFma.put(methodContext.getEnvMap(), GenericValue.create(value));
         }
-        newValueAcsr.put(methodContext, GenericValue.create(value));
         return true;
     }
 
     @Override
-    public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
-    }
-
-    @Override
-    public String rawString() {
-        // TODO: something more than the empty tag
-        return "<clone-value/>";
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<clone-value ");
+        sb.append("value-field=\"").append(this.valueFma).append("\" ");
+        sb.append("new-value-field=\"").append(this.newValueFma).append("\" ");
+        sb.append("/>");
+        return sb.toString();
     }
 
+    /**
+     * A factory for the &lt;clone-value&gt; element.
+     */
     public static final class CloneValueFactory implements Factory<CloneValue> {
+        @Override
         public CloneValue createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new CloneValue(element, simpleMethod);
         }
 
+        @Override
         public String getName() {
             return "clone-value";
         }

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/CreateValue.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/CreateValue.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/CreateValue.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/CreateValue.java Tue Jul 10 12:05:55 2012
@@ -19,89 +19,91 @@
 package org.ofbiz.minilang.method.entityops;
 
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
-import org.ofbiz.minilang.method.ContextAccessor;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Uses the delegator to create the specified value object entity in the datasource
+ * Implements the &lt;create-value&gt; element.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Ccreatevalue%3E}}">Mini-language Reference</a>
  */
-public class CreateValue extends MethodOperation {
+public final class CreateValue extends MethodOperation {
 
     public static final String module = CreateValue.class.getName();
 
-    boolean createOrStore;
-    String doCacheClearStr;
-    boolean testDuplicate;
-    ContextAccessor<GenericValue> valueAcsr;
+    private final boolean createOrStore;
+    private final boolean doCacheClear;
+    private final FlexibleMapAccessor<GenericValue> valueFma;
 
     public CreateValue(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
-        valueAcsr = new ContextAccessor<GenericValue>(element.getAttribute("value-field"), element.getAttribute("value-name"));
-        doCacheClearStr = element.getAttribute("do-cache-clear");
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "value-field", "do-cache-clear", "or-store");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "value-field");
+            MiniLangValidate.expressionAttributes(simpleMethod, element, "value-field");
+            MiniLangValidate.constantAttributes(simpleMethod, element, "do-cache-clear", "or-store");
+            MiniLangValidate.noChildElements(simpleMethod, element);
+        }
+        valueFma = FlexibleMapAccessor.getInstance(element.getAttribute("value-field"));
+        doCacheClear = !"false".equals(element.getAttribute("do-cache-clear"));
         createOrStore = "true".equals(element.getAttribute("or-store"));
     }
 
     @Override
     public boolean exec(MethodContext methodContext) throws MiniLangException {
-        boolean doCacheClear = !"false".equals(methodContext.expandString(doCacheClearStr));
-        GenericValue value = valueAcsr.get(methodContext);
+        GenericValue value = valueFma.get(methodContext.getEnvMap());
         if (value == null) {
-            String errMsg = "In create-value a value was not found with the specified valueAcsr: " + valueAcsr + ", not creating";
+            String errMsg = "In <create-value> the value \"" + valueFma + "\" was not found, not creating";
             Debug.logWarning(errMsg, module);
-            if (methodContext.getMethodType() == MethodContext.EVENT) {
-                methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getEventResponseCodeName(), simpleMethod.getDefaultErrorCode());
-            } else if (methodContext.getMethodType() == MethodContext.SERVICE) {
-                methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), simpleMethod.getDefaultErrorCode());
-            }
+            simpleMethod.addErrorMessage(methodContext, errMsg);
             return false;
         }
         try {
-            if (createOrStore == true) {
+            if (createOrStore) {
                 methodContext.getDelegator().createOrStore(value, doCacheClear);
             } else {
                 methodContext.getDelegator().create(value, doCacheClear);
             }
         } catch (GenericEntityException e) {
-
-            Debug.logError(e, module);
-            String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process [problem creating the " + valueAcsr + " value: " + e.getMessage() + "]";
-            if (methodContext.getMethodType() == MethodContext.EVENT) {
-                methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getEventResponseCodeName(), simpleMethod.getDefaultErrorCode());
-            } else if (methodContext.getMethodType() == MethodContext.SERVICE) {
-                methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), simpleMethod.getDefaultErrorCode());
-            }
+            String errMsg = "Exception thrown while creating the \"" + valueFma +"\" GenericValue: " + e.getMessage();
+            Debug.logWarning(e, errMsg, module);
+            simpleMethod.addErrorMessage(methodContext, errMsg);
             return false;
         }
         return true;
     }
 
     @Override
-    public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
-    }
-
-    @Override
-    public String rawString() {
-        // TODO: something more than the empty tag
-        return "<create-value/>";
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<create-value ");
+        sb.append("value-field=\"").append(this.valueFma).append("\" ");
+        if (!this.doCacheClear) {
+            sb.append("do-cache-clear=\"false\"");
+        }
+        if (this.createOrStore) {
+            sb.append("or-store=\"true\"");
+        }
+        sb.append("/>");
+        return sb.toString();
     }
 
+    /**
+     * A factory for the &lt;create-value&gt; element.
+     */
     public static final class CreateValueFactory implements Factory<CreateValue> {
+        @Override
         public CreateValue createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new CreateValue(element, simpleMethod);
         }
 
+        @Override
         public String getName() {
             return "create-value";
         }

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityAnd.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityAnd.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityAnd.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityAnd.java Tue Jul 10 12:05:55 2012
@@ -23,22 +23,33 @@ import org.ofbiz.base.util.GeneralExcept
 import org.ofbiz.entity.Delegator;
 import org.ofbiz.entity.finder.ByAndFinder;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Uses the delegator to find entity values by a condition
+ * Implements the &lt;entity-and&gt; element.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Centityand%3E}}">Mini-language Reference</a>
  */
-public class EntityAnd extends MethodOperation {
+public final class EntityAnd extends MethodOperation {
 
     public static final String module = EntityAnd.class.getName();
 
-    protected ByAndFinder finder;
+    private final ByAndFinder finder;
 
     public EntityAnd(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "entity-name", "use-cache", "filter-by-date", "list", "distinct", "delegator-name");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "entity-name", "list");
+            MiniLangValidate.expressionAttributes(simpleMethod, element, "list");
+            MiniLangValidate.childElements(simpleMethod, element, "field-map", "order-by", "limit-range", "limit-view", "use-iterator");
+            MiniLangValidate.requiredChildElements(simpleMethod, element, "field-map");
+        }
         this.finder = new ByAndFinder(element);
     }
 
@@ -48,41 +59,36 @@ public class EntityAnd extends MethodOpe
             Delegator delegator = methodContext.getDelegator();
             this.finder.runFind(methodContext.getEnvMap(), delegator);
         } catch (GeneralException e) {
-            Debug.logError(e, module);
-            String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process: " + e.getMessage();
-            if (methodContext.getMethodType() == MethodContext.EVENT) {
-                methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getEventResponseCodeName(), simpleMethod.getDefaultErrorCode());
-            } else if (methodContext.getMethodType() == MethodContext.SERVICE) {
-                methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), simpleMethod.getDefaultErrorCode());
-            }
+            String errMsg = "Exception thrown while performing entity find: " + e.getMessage();
+            Debug.logWarning(e, errMsg, module);
+            simpleMethod.addErrorMessage(methodContext, errMsg);
             return false;
         }
         return true;
     }
 
     @Override
-    public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
-    }
-
-    public String getEntityName() {
-        return this.finder.getEntityName();
+    public void gatherArtifactInfo(ArtifactInfoContext aic) {
+        aic.addEntityName(this.finder.getEntityName());
     }
 
     @Override
-    public String rawString() {
-        // TODO: something more than the empty tag
-        return "<entity-and/>";
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<entity-and ");
+        sb.append("entity-name=\"").append(this.finder.getEntityName()).append("\" />");
+        return sb.toString();
     }
 
+    /**
+     * A factory for the &lt;entity-and&gt; element.
+     */
     public static final class EntityAndFactory implements Factory<EntityAnd> {
+        @Override
         public EntityAnd createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new EntityAnd(element, simpleMethod);
         }
 
+        @Override
         public String getName() {
             return "entity-and";
         }

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCondition.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCondition.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCondition.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCondition.java Tue Jul 10 12:05:55 2012
@@ -23,22 +23,33 @@ import org.ofbiz.base.util.GeneralExcept
 import org.ofbiz.entity.Delegator;
 import org.ofbiz.entity.finder.ByConditionFinder;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Uses the delegator to find entity values by a condition
+ * Implements the &lt;entity-condition&gt; element.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Centitycondition%3E}}">Mini-language Reference</a>
  */
-public class EntityCondition extends MethodOperation {
+public final class EntityCondition extends MethodOperation {
 
     public static final String module = EntityCondition.class.getName();
 
-    protected ByConditionFinder finder;
+    private final ByConditionFinder finder;
 
     public EntityCondition(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "entity-name", "use-cache", "filter-by-date", "list", "distinct", "delegator-name");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "entity-name", "list");
+            MiniLangValidate.expressionAttributes(simpleMethod, element, "list");
+            MiniLangValidate.childElements(simpleMethod, element, "condition-expr", "condition-list", "condition-object", "having-condition-list", "select-field", "order-by", "limit-range", "limit-view", "use-iterator");
+            MiniLangValidate.requireAnyChildElement(simpleMethod, element, "condition-expr", "condition-list", "condition-object");
+        }
         this.finder = new ByConditionFinder(element);
     }
 
@@ -48,41 +59,33 @@ public class EntityCondition extends Met
             Delegator delegator = methodContext.getDelegator();
             this.finder.runFind(methodContext.getEnvMap(), delegator);
         } catch (GeneralException e) {
-            Debug.logError(e, module);
-            String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process: " + e.getMessage();
-            if (methodContext.getMethodType() == MethodContext.EVENT) {
-                methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getEventResponseCodeName(), simpleMethod.getDefaultErrorCode());
-            } else if (methodContext.getMethodType() == MethodContext.SERVICE) {
-                methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), simpleMethod.getDefaultErrorCode());
-            }
+            String errMsg = "Exception thrown while performing entity find: " + e.getMessage();
+            Debug.logWarning(e, errMsg, module);
+            simpleMethod.addErrorMessage(methodContext, errMsg);
             return false;
         }
         return true;
     }
 
     @Override
-    public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
-    }
-
-    public String getEntityName() {
-        return this.finder.getEntityName();
+    public void gatherArtifactInfo(ArtifactInfoContext aic) {
+        aic.addEntityName(this.finder.getEntityName());
     }
 
     @Override
-    public String rawString() {
-        // TODO: something more than the empty tag
-        return "<entity-condition/>";
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<entity-condition ");
+        sb.append("entity-name=\"").append(this.finder.getEntityName()).append("\" />");
+        return sb.toString();
     }
 
     public static final class EntityConditionFactory implements Factory<EntityCondition> {
+        @Override
         public EntityCondition createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new EntityCondition(element, simpleMethod);
         }
 
+        @Override
         public String getName() {
             return "entity-condition";
         }

Modified: ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java?rev=1359626&r1=1359625&r2=1359626&view=diff
==============================================================================
--- ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java (original)
+++ ofbiz/branches/release12.04/framework/minilang/src/org/ofbiz/minilang/method/entityops/EntityCount.java Tue Jul 10 12:05:55 2012
@@ -18,8 +18,6 @@
  *******************************************************************************/
 package org.ofbiz.minilang.method.entityops;
 
-import java.util.Map;
-
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.UtilValidate;
@@ -35,39 +33,49 @@ import org.ofbiz.entity.finder.EntityFin
 import org.ofbiz.entity.finder.EntityFinderUtil.ConditionObject;
 import org.ofbiz.entity.model.ModelEntity;
 import org.ofbiz.minilang.MiniLangException;
+import org.ofbiz.minilang.MiniLangValidate;
 import org.ofbiz.minilang.SimpleMethod;
+import org.ofbiz.minilang.artifact.ArtifactInfoContext;
 import org.ofbiz.minilang.method.MethodContext;
 import org.ofbiz.minilang.method.MethodOperation;
 import org.w3c.dom.Element;
 
 /**
- * Uses the delegator to find entity values by a condition
+ * Implements the &lt;entity-count&gt; element.
+ * 
+ * @see <a href="https://cwiki.apache.org/OFBADMIN/mini-language-reference.html#Mini-languageReference-{{%3Centitycount%3E}}">Mini-language Reference</a>
  */
-public class EntityCount extends MethodOperation {
+public final class EntityCount extends MethodOperation {
 
     public static final String module = EntityCount.class.getName();
 
-    protected FlexibleMapAccessor<Long> countAcsr;
-    protected FlexibleStringExpander delegatorNameExdr;
-    protected FlexibleStringExpander entityNameExdr;
-    protected Condition havingCondition;
-    protected Condition whereCondition;
+    private final FlexibleMapAccessor<Long> countFma;
+    private final FlexibleStringExpander delegatorNameFse;
+    private final FlexibleStringExpander entityNameFse;
+    private final Condition havingCondition;
+    private final Condition whereCondition;
 
     public EntityCount(Element element, SimpleMethod simpleMethod) throws MiniLangException {
         super(element, simpleMethod);
-        this.entityNameExdr = FlexibleStringExpander.getInstance(element.getAttribute("entity-name"));
-        this.delegatorNameExdr = FlexibleStringExpander.getInstance(element.getAttribute("delegator-name"));
-        if (UtilValidate.isNotEmpty(element.getAttribute("count-field"))) {
-            this.countAcsr = FlexibleMapAccessor.getInstance(element.getAttribute("count-field"));
-        } else {
-            this.countAcsr = FlexibleMapAccessor.getInstance(element.getAttribute("count-name"));
-        }
-        // process condition-expr | condition-list
+        if (MiniLangValidate.validationOn()) {
+            MiniLangValidate.attributeNames(simpleMethod, element, "entity-name", "count-field", "delegator-name");
+            MiniLangValidate.requiredAttributes(simpleMethod, element, "entity-name", "count-field");
+            MiniLangValidate.expressionAttributes(simpleMethod, element, "count-field");
+            MiniLangValidate.childElements(simpleMethod, element, "condition-expr", "condition-list", "condition-object", "having-condition-list");
+            MiniLangValidate.requireAnyChildElement(simpleMethod, element, "condition-expr", "condition-list", "condition-object");
+        }
+        this.entityNameFse = FlexibleStringExpander.getInstance(element.getAttribute("entity-name"));
+        this.delegatorNameFse = FlexibleStringExpander.getInstance(element.getAttribute("delegator-name"));
+        this.countFma = FlexibleMapAccessor.getInstance(element.getAttribute("count-field"));
+        int conditionElementCount = 0;
         Element conditionExprElement = UtilXml.firstChildElement(element, "condition-expr");
+        conditionElementCount = conditionExprElement == null ? conditionElementCount : conditionElementCount++;
         Element conditionListElement = UtilXml.firstChildElement(element, "condition-list");
+        conditionElementCount = conditionListElement == null ? conditionElementCount : conditionElementCount++;
         Element conditionObjectElement = UtilXml.firstChildElement(element, "condition-object");
-        if (conditionExprElement != null && conditionListElement != null) {
-            throw new IllegalArgumentException("In entity find by condition element, cannot have condition-expr and condition-list sub-elements");
+        conditionElementCount = conditionObjectElement == null ? conditionElementCount : conditionElementCount++;
+        if (conditionElementCount > 1) {
+            MiniLangValidate.handleError("Element must include only one condition child element", simpleMethod, conditionObjectElement);
         }
         if (conditionExprElement != null) {
             this.whereCondition = new ConditionExpr(conditionExprElement);
@@ -75,77 +83,73 @@ public class EntityCount extends MethodO
             this.whereCondition = new ConditionList(conditionListElement);
         } else if (conditionObjectElement != null) {
             this.whereCondition = new ConditionObject(conditionObjectElement);
+        } else {
+            this.whereCondition = null;
         }
-        // process having-condition-list
         Element havingConditionListElement = UtilXml.firstChildElement(element, "having-condition-list");
         if (havingConditionListElement != null) {
             this.havingCondition = new ConditionList(havingConditionListElement);
+        } else {
+            this.havingCondition = null;
         }
     }
 
     @Override
     public boolean exec(MethodContext methodContext) throws MiniLangException {
         try {
-            Map<String, Object> context = methodContext.getEnvMap();
+            String delegatorName = this.delegatorNameFse.expandString(methodContext.getEnvMap());
             Delegator delegator = methodContext.getDelegator();
-            String entityName = this.entityNameExdr.expandString(context);
-            String delegatorName = this.delegatorNameExdr.expandString(context);
             if (UtilValidate.isNotEmpty(delegatorName)) {
                 delegator = DelegatorFactory.getDelegator(delegatorName);
             }
+            String entityName = this.entityNameFse.expandString(methodContext.getEnvMap());
             ModelEntity modelEntity = delegator.getModelEntity(entityName);
-            // create whereEntityCondition from whereCondition
             EntityCondition whereEntityCondition = null;
             if (this.whereCondition != null) {
-                whereEntityCondition = this.whereCondition.createCondition(context, modelEntity, delegator.getModelFieldTypeReader(modelEntity));
+                whereEntityCondition = this.whereCondition.createCondition(methodContext.getEnvMap(), modelEntity, delegator.getModelFieldTypeReader(modelEntity));
             }
-            // create havingEntityCondition from havingCondition
             EntityCondition havingEntityCondition = null;
             if (this.havingCondition != null) {
-                havingEntityCondition = this.havingCondition.createCondition(context, modelEntity, delegator.getModelFieldTypeReader(modelEntity));
+                havingEntityCondition = this.havingCondition.createCondition(methodContext.getEnvMap(), modelEntity, delegator.getModelFieldTypeReader(modelEntity));
             }
             long count = delegator.findCountByCondition(entityName, whereEntityCondition, havingEntityCondition, null);
-            this.countAcsr.put(context, count);
+            this.countFma.put(methodContext.getEnvMap(), count);
         } catch (GeneralException e) {
-            Debug.logError(e, module);
-            String errMsg = "ERROR: Could not complete the " + simpleMethod.getShortDescription() + " process: " + e.getMessage();
-            if (methodContext.getMethodType() == MethodContext.EVENT) {
-                methodContext.putEnv(simpleMethod.getEventErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getEventResponseCodeName(), simpleMethod.getDefaultErrorCode());
-            } else if (methodContext.getMethodType() == MethodContext.SERVICE) {
-                methodContext.putEnv(simpleMethod.getServiceErrorMessageName(), errMsg);
-                methodContext.putEnv(simpleMethod.getServiceResponseMessageName(), simpleMethod.getDefaultErrorCode());
-            }
+            String errMsg = "Exception thrown while performing entity count: " + e.getMessage();
+            Debug.logWarning(e, errMsg, module);
+            simpleMethod.addErrorMessage(methodContext, errMsg);
             return false;
         }
         return true;
     }
 
     @Override
-    public String expandedString(MethodContext methodContext) {
-        // TODO: something more than a stub/dummy
-        return this.rawString();
-    }
-
-    public String getEntityName() {
-        String entName = this.entityNameExdr.getOriginal();
-        // if there is expansion syntax
-        if (entName.indexOf("${") >= 0)
-            return null;
-        return entName;
+    public void gatherArtifactInfo(ArtifactInfoContext aic) {
+        aic.addEntityName(entityNameFse.toString());
     }
 
     @Override
-    public String rawString() {
-        // TODO: something more than the empty tag
-        return "<entity-count/>";
+    public String toString() {
+        StringBuilder sb = new StringBuilder("<entity-count ");
+        sb.append("entity-name=\"").append(this.entityNameFse).append("\" ");
+        sb.append("count-field=\"").append(this.countFma).append("\" ");
+        if (!this.delegatorNameFse.isEmpty()) {
+            sb.append("delegator-name=\"").append(this.delegatorNameFse).append("\" ");
+        }
+        sb.append("/>");
+        return sb.toString();
     }
 
+    /**
+     * A factory for the &lt;entity-count&gt; element.
+     */
     public static final class EntityCountFactory implements Factory<EntityCount> {
+        @Override
         public EntityCount createMethodOperation(Element element, SimpleMethod simpleMethod) throws MiniLangException {
             return new EntityCount(element, simpleMethod);
         }
 
+        @Override
         public String getName() {
             return "entity-count";
         }