Author: arunpatidar
Date: Sat Feb 24 07:27:54 2018
New Revision: 1825191

URL: http://svn.apache.org/viewvc?rev=1825191&view=rev
Log:
Improved: Introduce support for condition-service for entity eca's as 
well.(OFBIZ-10220)
Thanks Suraj Khurana for your contribution.

Modified:
    
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaCondition.java
    
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaRule.java

Modified: 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaCondition.java
URL: 
http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaCondition.java?rev=1825191&r1=1825190&r2=1825191&view=diff
==============================================================================
--- 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaCondition.java
 (original)
+++ 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaCondition.java
 Sat Feb 24 07:27:54 2018
@@ -21,6 +21,7 @@ package org.apache.ofbiz.entityext.eca;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.ObjectType;
@@ -28,7 +29,11 @@ import org.apache.ofbiz.base.util.UtilVa
 import org.apache.ofbiz.entity.GenericEntity;
 import org.apache.ofbiz.entity.GenericEntityException;
 import org.apache.ofbiz.service.DispatchContext;
+import org.apache.ofbiz.service.GenericServiceException;
 import org.w3c.dom.Element;
+import org.apache.ofbiz.base.util.UtilMisc;
+import org.apache.ofbiz.service.LocalDispatcher;
+import org.apache.ofbiz.service.ServiceUtil;
 
 /**
  * EntityEcaCondition
@@ -38,13 +43,20 @@ public final class EntityEcaCondition im
 
     public static final String module = EntityEcaCondition.class.getName();
 
-    private final String lhsValueName, rhsValueName;
-    private final String operator;
-    private final String compareType;
-    private final String format;
-    private final boolean constant;
-
-    public EntityEcaCondition(Element condition, boolean constant) {
+    protected String lhsValueName = null;
+    protected String rhsValueName = null;
+    protected String operator = null;
+    protected String compareType = null;
+    protected String format = null;
+    protected boolean constant = false;
+    protected boolean isService = false;
+    protected String conditionService = null;
+
+    public EntityEcaCondition(Element condition, boolean constant, boolean 
isService) {
+        if (isService) {
+            this.isService = isService;
+            this.conditionService = condition.getAttribute("service-name");
+        } else {
         this.lhsValueName = condition.getAttribute("field-name");
         this.constant = constant;
         if (constant) {
@@ -55,15 +67,36 @@ public final class EntityEcaCondition im
         this.operator = condition.getAttribute("operator");
         this.compareType = condition.getAttribute("type");
         this.format = condition.getAttribute("format");
+        }
     }
 
-    public boolean eval(DispatchContext dctx, GenericEntity value) throws 
GenericEntityException {
+    public boolean eval(DispatchContext dctx, GenericEntity value, Map<String, 
Object> context) throws GenericEntityException {
         if (dctx == null || value == null || dctx.getClassLoader() == null) {
             throw new GenericEntityException("Cannot have null Value or 
DispatchContext!");
         }
 
         if (Debug.verboseOn()) Debug.logVerbose(this.toString(), module);
 
+        // condition-service; run the service and return the reply result
+        if (isService) {
+            try {
+                LocalDispatcher dispatcher = dctx.getDispatcher();
+                Map<String, Object> conditionServiceResult = 
dispatcher.runSync(conditionService,
+                        UtilMisc.<String, Object>toMap("serviceContext", 
context, "userLogin", context.get("userLogin")));
+
+                Boolean conditionReply = Boolean.FALSE;
+                if (ServiceUtil.isError(conditionServiceResult)) {
+                    Debug.logError("Error in condition-service : " +
+                            
ServiceUtil.getErrorMessage(conditionServiceResult), module);
+                } else {
+                    conditionReply = (Boolean) 
conditionServiceResult.get("conditionReply");
+                }
+                return conditionReply.booleanValue();
+            } catch (GenericServiceException gse) {
+                throw new GenericEntityException("Error in calling condition 
service "+conditionService+". "+gse.getMessage());
+            }
+        }
+
         Object lhsValue = value.get(lhsValueName);
 
         Object rhsValue;
@@ -110,6 +143,7 @@ public final class EntityEcaCondition im
     @Override
     public String toString() {
         StringBuilder buf = new StringBuilder();
+        if (UtilValidate.isNotEmpty(conditionService)) 
buf.append("[").append(conditionService).append("]");
         if (UtilValidate.isNotEmpty(lhsValueName)) 
buf.append("[").append(lhsValueName).append("]");
         if (UtilValidate.isNotEmpty(operator)) 
buf.append("[").append(operator).append("]");
         if (UtilValidate.isNotEmpty(rhsValueName)) 
buf.append("[").append(rhsValueName).append("]");
@@ -136,12 +170,14 @@ public final class EntityEcaCondition im
         if (obj instanceof EntityEcaCondition) {
             EntityEcaCondition other = (EntityEcaCondition) obj;
 
+            if (!UtilValidate.areEqual(this.conditionService, 
other.conditionService)) return false;
             if (!UtilValidate.areEqual(this.lhsValueName, other.lhsValueName)) 
return false;
             if (!UtilValidate.areEqual(this.rhsValueName, other.rhsValueName)) 
return false;
             if (!UtilValidate.areEqual(this.operator, other.operator)) return 
false;
             if (!UtilValidate.areEqual(this.compareType, other.compareType)) 
return false;
             if (!UtilValidate.areEqual(this.format, other.format)) return 
false;
             if (this.constant != other.constant) return false;
+            if (this.isService != other.isService) return false;
 
             return true;
         } else {

Modified: 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaRule.java
URL: 
http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaRule.java?rev=1825191&r1=1825190&r2=1825191&view=diff
==============================================================================
--- 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaRule.java
 (original)
+++ 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaRule.java
 Sat Feb 24 07:27:54 2018
@@ -63,13 +63,16 @@ public final class EntityEcaRule impleme
         ArrayList<Object> actionsAndSets = new ArrayList<Object>();
         for (Element element: UtilXml.childElementList(eca)) {
             if ("condition".equals(element.getNodeName())) {
-                EntityEcaCondition ecaCond = new EntityEcaCondition(element, 
true);
+                EntityEcaCondition ecaCond = new EntityEcaCondition(element, 
true, false);
                 conditions.add(ecaCond);
                 conditionFieldNames.addAll(ecaCond.getFieldNames());
             } else if ("condition-field".equals(element.getNodeName())) {
-                EntityEcaCondition ecaCond = new EntityEcaCondition(element, 
false);
+                EntityEcaCondition ecaCond = new EntityEcaCondition(element, 
false, false);
                 conditions.add(ecaCond);
                 conditionFieldNames.addAll(ecaCond.getFieldNames());
+            } else if ("condition-service".equals(element.getNodeName())) {
+                EntityEcaCondition ecaCond = new EntityEcaCondition(element, 
false, true);
+                conditions.add(ecaCond);
             } else if ("action".equals(element.getNodeName())) {
                 actionsAndSets.add(new EntityEcaAction(element));
             } else if ("set".equals(element.getNodeName())) {
@@ -144,13 +147,12 @@ public final class EntityEcaRule impleme
             }
         }
 
-
         Map<String, Object> context = new HashMap<String, Object>();
         context.putAll(value);
 
         boolean allCondTrue = true;
         for (EntityEcaCondition ec: conditions) {
-            if (!ec.eval(dctx, value)) {
+            if (!ec.eval(dctx, value, context)) {
                 allCondTrue = false;
                 break;
             }


Reply via email to