Author: adrianc
Date: Mon Apr 22 19:38:06 2013
New Revision: 1470676

URL: http://svn.apache.org/r1470676
Log:
Copy the observable aspect of GenericEntity. Includes unit tests. Also added 
some FIXME comments.

Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericEntity.java
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericValue.java
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericEntity.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericEntity.java?rev=1470676&r1=1470675&r2=1470676&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericEntity.java 
(original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericEntity.java Mon 
Apr 22 19:38:06 2013
@@ -207,6 +207,7 @@ public class GenericEntity implements Ma
         if (value.fields != null) this.fields.putAll(value.fields);
         this.delegatorName = value.delegatorName;
         this.internalDelegator = value.internalDelegator;
+        this.observable = new Observable(value.observable);
     }
 
     public void reset() {
@@ -232,11 +233,13 @@ public class GenericEntity implements Ma
         if (!thisPK.equals(newPK)) {
             throw new GenericEntityException("Could not refresh value, new 
value did not have the same primary key; this PK=" + thisPK + ", new value PK=" 
+ newPK);
         }
+        // FIXME: This is dangerous - two instances sharing a common field Map 
is a bad idea.
         this.fields = newValue.fields;
         this.setDelegator(newValue.getDelegator());
         this.generateHashCode = newValue.generateHashCode;
         this.cachedHashCode = newValue.cachedHashCode;
         this.modified = false;
+        this.observable = new Observable(newValue.observable);
     }
 
     public boolean isModified() {

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericValue.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericValue.java?rev=1470676&r1=1470675&r2=1470676&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericValue.java 
(original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/GenericValue.java Mon Apr 
22 19:38:06 2013
@@ -46,9 +46,11 @@ public class GenericValue extends Generi
     public static final GenericValue NULL_VALUE = new NullGenericValue();
 
     /** Map to cache various related entity collections */
+    // FIXME: This is a bad idea. Another process could change the related 
values after they are added to the Map.
     public transient Map<String, List<GenericValue>> relatedCache = null;
 
     /** Map to cache various related cardinality one entity collections */
+    // FIXME: This is a bad idea. Another process could change the related 
values after they are added to the Map.
     public transient Map<String, GenericValue> relatedOneCache = null;
 
     /** This Map will contain the original field values from the database iff
@@ -146,6 +148,7 @@ public class GenericValue extends Generi
      * values from the Db.
      */
     public void copyOriginalDbValues() {
+        // FIXME: There is no guarantee this.fields was not modified.
         this.originalDbValues = new HashMap<String, Object>();
         this.originalDbValues.putAll(this.fields);
     }

Modified: 
ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java?rev=1470676&r1=1470675&r2=1470676&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java 
(original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java 
Mon Apr 22 19:38:06 2013
@@ -29,6 +29,8 @@ import java.util.List;
 import java.util.Map;
 
 import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.Observable;
+import org.ofbiz.base.util.Observer;
 import org.ofbiz.base.util.UtilDateTime;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.util.UtilXml;
@@ -95,9 +97,17 @@ public class EntityTestSuite extends Ent
         // retrieve a sample GenericValue, make sure it's correct
         GenericValue testValue = delegator.findOne("TestingType", false, 
"testingTypeId", "TEST-1");
         assertEquals("Retrieved value has the correct description", "Testing 
Type #1", testValue.getString("description"));
-
-        // now update and store it
+        // Test Observable aspect
+        TestObserver observer = new TestObserver();
+        testValue.addObserver(observer);
         testValue.put("description", "New Testing Type #1");
+        assertEquals("Observer called with original GenericValue field name", 
"description", observer.arg);
+        observer.observable = null;
+        observer.arg = null;
+        GenericValue clonedValue = (GenericValue) testValue.clone();
+        clonedValue.put("description", "New Testing Type #1");
+        assertEquals("Observer called with cloned GenericValue field name", 
"description", observer.arg);
+        // now store it
         testValue.store();
 
         // now retrieve it again and make sure that the updated value is 
correct
@@ -848,4 +858,15 @@ public class EntityTestSuite extends Ent
         testType = delegator.findOne("TestingType", 
UtilMisc.toMap("testingTypeId", "JUNIT-TEST2"), false);
         assertNull("Delete TestingType 2", testType);
     }
+
+    private final class TestObserver implements Observer {
+        private Observable observable;
+        private Object arg;
+
+        @Override
+        public void update(Observable observable, Object arg) {
+            this.observable = observable;
+            this.arg = arg;
+        }
+    }
 }


Reply via email to