Author: deepak
Date: Fri Nov  3 10:28:05 2017
New Revision: 1814160

URL: http://svn.apache.org/viewvc?rev=1814160&view=rev
Log:
Add ability to disable entity eca rule (OFBIZ-9897)


We have enabled flag in EntityEcaRule class, if its set false then entity eca 
rule will not be execute.
But there is not way to disable entity eca.

We can add enabled flag in Entity ECA definition to disable the existing entity 
eca rule.

    Add new attribute on entity eca tag named enabled
    Default value will be true for this.
    If user want to disable existing OOTB entity eca rule, then user can define 
same rule in custom component and set the enabled=false

Also as per current flow if same seca rule is define more then once, system 
will execute all the rule, ideally it should not execute same rule (same rule, 
condition and action) if its defined more than one.

Also need to ovride hasCode, equals and toString method for EntityEcaRule, 
EntityEcaAction and EntityEcaCondition class file.

Modified:
    ofbiz/ofbiz-framework/trunk/framework/entity/dtd/entity-eca.xsd
    
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaAction.java
    
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
    
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaUtil.java

Modified: ofbiz/ofbiz-framework/trunk/framework/entity/dtd/entity-eca.xsd
URL: 
http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entity/dtd/entity-eca.xsd?rev=1814160&r1=1814159&r2=1814160&view=diff
==============================================================================
--- ofbiz/ofbiz-framework/trunk/framework/entity/dtd/entity-eca.xsd (original)
+++ ofbiz/ofbiz-framework/trunk/framework/entity/dtd/entity-eca.xsd Fri Nov  3 
10:28:05 2017
@@ -77,6 +77,14 @@ under the License.
                 </xs:restriction>
             </xs:simpleType>
         </xs:attribute>
+        <xs:attribute name="enabled" default="true">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
     </xs:attributeGroup>
     <xs:element name="condition">
         <xs:complexType>

Modified: 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaAction.java
URL: 
http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaAction.java?rev=1814160&r1=1814159&r2=1814160&view=diff
==============================================================================
--- 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaAction.java
 (original)
+++ 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaAction.java
 Fri Nov  3 10:28:05 2017
@@ -22,6 +22,7 @@ import java.util.Map;
 
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.UtilMisc;
+import org.apache.ofbiz.base.util.UtilValidate;
 import org.apache.ofbiz.entity.GenericEntity;
 import org.apache.ofbiz.entity.GenericEntityException;
 import org.apache.ofbiz.entity.GenericValue;
@@ -115,4 +116,50 @@ public final class EntityEcaAction imple
             }
         }
     }
+
+    public String toString() {
+        StringBuilder buf = new StringBuilder();
+        if (UtilValidate.isNotEmpty(serviceName)) 
buf.append("[").append(serviceName).append("]");
+        if (UtilValidate.isNotEmpty(serviceMode)) 
buf.append("[").append(serviceMode).append("]");
+        if (UtilValidate.isNotEmpty(runAsUser)) 
buf.append("[").append(runAsUser).append("]");
+        if (UtilValidate.isNotEmpty(valueAttr)) 
buf.append("[").append(valueAttr).append("]");
+        if (UtilValidate.isNotEmpty(resultToValue)) 
buf.append("[").append(resultToValue).append("]");
+        if (UtilValidate.isNotEmpty(abortOnError)) 
buf.append("[").append(abortOnError).append("]");
+        if (UtilValidate.isNotEmpty(rollbackOnError)) 
buf.append("[").append(rollbackOnError).append("]");
+        if (UtilValidate.isNotEmpty(persist)) 
buf.append("[").append(persist).append("]");
+        return buf.toString();
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((serviceName == null) ? 0 : 
serviceName.hashCode());
+        result = prime * result + ((serviceMode == null) ? 0 : 
serviceMode.hashCode());
+        result = prime * result + ((runAsUser == null) ? 0 : 
runAsUser.hashCode());
+        result = prime * result + ((valueAttr == null) ? 0 : 
valueAttr.hashCode());
+        result = prime * result + (resultToValue ? 1231 : 1237);
+        result = prime * result + (abortOnError ? 1231 : 1237);
+        result = prime * result + (rollbackOnError ? 1231 : 1237);
+        result = prime * result + (persist ? 1231 : 1237);
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof EntityEcaAction) {
+            EntityEcaAction other = (EntityEcaAction) obj;
+            if (!UtilValidate.areEqual(this.serviceName, other.serviceName)) 
return false;
+            if (!UtilValidate.areEqual(this.serviceMode, other.serviceMode)) 
return false;
+            if (!UtilValidate.areEqual(this.runAsUser, other.runAsUser)) 
return false;
+            if (!UtilValidate.areEqual(this.valueAttr, other.valueAttr)) 
return false;
+            if (this.resultToValue != other.resultToValue) return false;
+            if (this.abortOnError != other.abortOnError) return false;
+            if (this.rollbackOnError != other.rollbackOnError) return false;
+            if (this.persist != other.persist) return false;
+            return true;
+        } else {
+            return false;
+        }
+    }
 }

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=1814160&r1=1814159&r2=1814160&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
 Fri Nov  3 10:28:05 2017
@@ -110,14 +110,44 @@ public final class EntityEcaCondition im
     @Override
     public String toString() {
         StringBuilder buf = new StringBuilder();
-        buf.append("[").append(lhsValueName).append("]");
-        buf.append("[").append(operator).append("]");
-        buf.append("[").append(rhsValueName).append("]");
-        buf.append("[").append(constant).append("]");
-        buf.append("[").append(compareType).append("]");
-        buf.append("[").append(format).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("]");
+        if (UtilValidate.isNotEmpty(constant)) 
buf.append("[").append(constant).append("]");
+        if (UtilValidate.isNotEmpty(compareType)) 
buf.append("[").append(compareType).append("]");
+        if (UtilValidate.isNotEmpty(format)) 
buf.append("[").append(format).append("]");
         return buf.toString();
     }
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((lhsValueName == null) ? 0 : 
lhsValueName.hashCode());
+        result = prime * result + ((operator == null) ? 0 : 
operator.hashCode());
+        result = prime * result + ((rhsValueName == null) ? 0 : 
rhsValueName.hashCode());
+        result = prime * result + (constant ? 1231 : 1237);
+        result = prime * result + ((compareType == null) ? 0 : 
compareType.hashCode());
+        result = prime * result + ((format == null) ? 0 : format.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof EntityEcaCondition) {
+            EntityEcaCondition other = (EntityEcaCondition) obj;
+
+            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;
+
+            return true;
+        } else {
+            return false;
+        }
+    }
     
     protected List<String> getFieldNames() {
         List<String> fieldNameList = new ArrayList<String>();

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=1814160&r1=1814159&r2=1814160&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
 Fri Nov  3 10:28:05 2017
@@ -57,6 +57,7 @@ public final class EntityEcaRule impleme
         this.operationName = eca.getAttribute("operation");
         this.eventName = eca.getAttribute("event");
         this.runOnError = "true".equals(eca.getAttribute("run-on-error"));
+        this.enabled = !"false".equals(eca.getAttribute("enabled"));
         ArrayList<EntityEcaCondition> conditions = new 
ArrayList<EntityEcaCondition>();
         ArrayList<Object> actionsAndSets = new ArrayList<Object>();
         for (Element element: UtilXml.childElementList(eca)) {
@@ -185,4 +186,57 @@ public final class EntityEcaRule impleme
     public boolean isEnabled() {
         return this.enabled;
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((entityName == null) ? 0 : 
entityName.hashCode());
+        result = prime * result + ((operationName == null) ? 0 : 
operationName.hashCode());
+        result = prime * result + ((eventName == null) ? 0 : 
eventName.hashCode());
+        result = prime * result + ((actionsAndSets == null) ? 0 : 
actionsAndSets.hashCode());
+        result = prime * result + ((conditions == null) ? 0 : 
conditions.hashCode());
+        result = prime * result + ((conditionFieldNames == null) ? 0 : 
conditionFieldNames.hashCode());
+        result = prime * result + (enabled ? 1231 : 1237);
+        result = prime * result + (runOnError ? 1231 : 1237);
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+    if (obj instanceof EntityEcaRule) {
+            EntityEcaRule other = (EntityEcaRule) obj;
+            if (!UtilValidate.areEqual(this.entityName, other.entityName)) {
+                return false;
+            }
+            if (!UtilValidate.areEqual(this.operationName, 
other.operationName)) {
+                return false;
+            }
+            if (!UtilValidate.areEqual(this.eventName, other.eventName)) {
+                return false;
+            }
+            if (!this.conditions.equals(other.conditions)) {
+                return false;
+            }
+            if (!this.actionsAndSets.equals(other.actionsAndSets)) {
+                return false;
+            }
+            if (!this.conditionFieldNames.equals(other.conditionFieldNames)) {
+                return false;
+            }
+
+            if (this.runOnError != other.runOnError) {
+                return false;
+            }
+
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "EntityEcaRule:" + this.entityName + ":" + this.operationName + 
":" + this.eventName +  ":runOnError=" + this.runOnError + ":enabled=" + 
this.enabled + ":conditions=" + this.conditions + ":actionsAndSets=" + 
this.actionsAndSets + ":conditionFieldNames" + this.conditionFieldNames;
+    }
 }

Modified: 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaUtil.java
URL: 
http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaUtil.java?rev=1814160&r1=1814159&r2=1814160&view=diff
==============================================================================
--- 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaUtil.java
 (original)
+++ 
ofbiz/ofbiz-framework/trunk/framework/entityext/src/main/java/org/apache/ofbiz/entityext/eca/EntityEcaUtil.java
 Fri Nov  3 10:28:05 2017
@@ -121,6 +121,11 @@ public final class EntityEcaUtil {
                         eventMap.put(eventName, rules);
                     }
                 }
+                //remove the old rule if found and keep the recent one
+                //This will prevent duplicate rule execution along with 
enabled/disabled eca workflow
+                if (rules.remove(rule)) {
+                    Debug.logWarning("Duplicate Entity ECA [" + entityName + 
"]" + "for operation [ "+ rule.getOperationName() + "] " + "on [" + eventName + 
"] ", module);
+                }
                 rules.add(rule);
             }
         }


Reply via email to