You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2007/02/07 02:07:39 UTC

svn commit: r504395 - in /db/ojb/trunk/src/java/org/apache/ojb/odmg: Image.java ObjectEnvelope.java

Author: arminw
Date: Tue Feb  6 17:07:38 2007
New Revision: 504395

URL: http://svn.apache.org/viewvc?view=rev&rev=504395
Log:
make object state-detection configurable, fix bug, minor improvements

Modified:
    db/ojb/trunk/src/java/org/apache/ojb/odmg/Image.java
    db/ojb/trunk/src/java/org/apache/ojb/odmg/ObjectEnvelope.java

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/Image.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/Image.java?view=diff&rev=504395&r1=504394&r2=504395
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/Image.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/Image.java Tue Feb  6 17:07:38 2007
@@ -45,13 +45,14 @@
 public abstract class Image
 {
     static Logger log = LoggerFactory.getLogger(Image.class);
+
     private long timestamp = System.currentTimeMillis();
 
     private Image()
     {
     }
 
-    boolean illegalImageComparison(Image oldImage)
+    boolean illegalImageComparison(final Image oldImage)
     {
         return timestamp < oldImage.timestamp;
     }
@@ -62,7 +63,7 @@
 
     abstract void referenceProcessing(Image oldImage);
 
-    public void performReferenceDetection(Image oldImage)
+    public void performReferenceDetection(final Image oldImage)
     {
         if(illegalImageComparison(oldImage))
         {
@@ -74,13 +75,13 @@
     //===================================================================
     // inner class
     //===================================================================
-    public static class MultipleRef extends Image implements CollectionProxyListener
+    public static final class MultipleRef extends Image implements CollectionProxyListener
     {
         static final int IS_NORMAL_OBJECT = 11;
         static final int IS_MATERIALIZED_PROXY = 13;
         static final int IS_UNMATERIALIZED_PROXY = 17;
 
-        private ImageListener listener;
+        private final ImageListener listener;
         private final CollectionDescriptor cod;
         private final Object collectionOrArray;
         private Map references;
@@ -88,7 +89,7 @@
         private boolean hasTransientIdentity;
         private boolean isRefreshed;
 
-        public MultipleRef(ImageListener listener, CollectionDescriptor cod, Object collectionOrArray)
+        public MultipleRef(final ImageListener listener, final CollectionDescriptor cod, final Object collectionOrArray)
         {
             this.listener = listener;
             this.cod = cod;
@@ -132,7 +133,7 @@
             }
         }
 
-        void handleReferencedObjects(Iterator it)
+        void handleReferencedObjects(final Iterator it)
         {
             if(it == null) return;
             references = new HashMap();
@@ -152,7 +153,7 @@
             }
         }
 
-        public void cleanup(boolean reuse)
+        public void cleanup(final boolean reuse)
         {
             if(log.isDebugEnabled()) log.debug("Cleanup collection image, reuse=" + reuse);
             if(reuse)
@@ -172,7 +173,7 @@
             }
         }
 
-        void referenceProcessing(Image oldImage)
+        void referenceProcessing(final Image oldImage)
         {
             MultipleRef oldRefs = (MultipleRef) oldImage;
             if(incommensurableProxies(oldRefs))
@@ -230,7 +231,7 @@
          * E.g. if the user exchange one another the unmaterialized proxy collection objects of two main objects,
          * then both proxy need to be materialized to assign the changed FK field values.
          */
-        private boolean incommensurableProxies(MultipleRef oldImage)
+        private boolean incommensurableProxies(final MultipleRef oldImage)
         {
             boolean result = false;
             // deleted objects
@@ -274,12 +275,12 @@
          * Always return 'false', because changed 1:n or m:n references do not
          * affect the main object.
          */
-        public boolean modified(Image other)
+        public boolean modified(final Image other)
         {
             return false;
         }
 
-        boolean containsReference(Identity oid)
+        boolean containsReference(final Identity oid)
         {
             if(!isRefreshed) refreshIdentities();
             return references.containsKey(oid);
@@ -304,12 +305,12 @@
 
         // CollectionProxy Listener methods
         //---------------------------------
-        public void beforeLoading(CollectionProxy colProxy)
+        public void beforeLoading(final CollectionProxy colProxy)
         {
             //noop
         }
 
-        public void afterLoading(CollectionProxy colProxy)
+        public void afterLoading(final CollectionProxy colProxy)
         {
             if(status == IS_UNMATERIALIZED_PROXY)
             {
@@ -329,21 +330,21 @@
     //===================================================================
     // inner class
     //===================================================================
-    public static class SingleRef extends Image
+    public static final class SingleRef extends Image
     {
         private Object referenceObjOrProxy;
         private Identity oid = null;
         private final ImageListener listener;
         private final ObjectReferenceDescriptor ord;
 
-        public SingleRef(ImageListener listener, ObjectReferenceDescriptor ord, Object reference)
+        public SingleRef(final ImageListener listener, final ObjectReferenceDescriptor ord, final Object reference)
         {
             this.listener = listener;
             this.ord = ord;
             this.referenceObjOrProxy = reference;
         }
 
-        public void cleanup(boolean reuse)
+        public void cleanup(final boolean reuse)
         {
             if(!reuse)
             {
@@ -351,7 +352,7 @@
             }
         }
 
-        void referenceProcessing(Image oldImage)
+        void referenceProcessing(final Image oldImage)
         {
             SingleRef oldRef = (SingleRef) oldImage;
             boolean isSame = getReferenceObjectOrProxy() == oldRef.getReferenceObjectOrProxy();
@@ -405,10 +406,10 @@
          * If a 1:1 reference has changed it will
          * affects the main object (FK needs update).
          */
-        public boolean modified(Image toCompare)
+        public boolean modified(final Image toCompare)
         {
             boolean modified = false;
-            if(!(this == toCompare))
+            if(this != toCompare)
             {
                 if(toCompare instanceof Image.SingleRef)
                 {
@@ -430,35 +431,31 @@
     //===================================================================
     // inner class
     //===================================================================
-    public static class Field extends Image
+    public static final class Field extends Image
     {
         private final FieldType type;
         private final Object value;
 
-        public Field(FieldType type, Object value)
+        public Field(final FieldType type, final Object value)
         {
             this.type = type;
             this.value = value;
         }
 
-        public void cleanup(boolean reuse)
+        public void cleanup(final boolean reuse)
         {
         }
 
-        void referenceProcessing(Image oldImage)
+        void referenceProcessing(final Image oldImage)
         {
             // nothing to do
         }
 
         /** If a field value has changed return 'true'. */
-        public boolean modified(Image other)
+        public boolean modified(final Image other)
         {
             boolean result = false;
-            if(this == other)
-            {
-                result = true;
-            }
-            else
+            if(this != other)
             {
                 if(other instanceof Field)
                 {

Modified: db/ojb/trunk/src/java/org/apache/ojb/odmg/ObjectEnvelope.java
URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/odmg/ObjectEnvelope.java?view=diff&rev=504395&r1=504394&r2=504395
==============================================================================
--- db/ojb/trunk/src/java/org/apache/ojb/odmg/ObjectEnvelope.java (original)
+++ db/ojb/trunk/src/java/org/apache/ojb/odmg/ObjectEnvelope.java Tue Feb  6 17:07:38 2007
@@ -397,7 +397,10 @@
         // register 1:1 references in image
         buildImageForSingleReferences(imageMap, cld);
         // put object values to image map, skip this for new objects
-        if(!isNew) buildImageForFields(imageMap, cld);
+        if(!isNew)
+        {
+            buildImageForFields(imageMap, cld);
+        }
         // register 1:n and m:n references in image
         buildImageForCollectionReferences(imageMap, cld);
         return imageMap;
@@ -440,19 +443,30 @@
 
     private void buildImageForFields(Map imageMap, ClassDescriptor cld)
     {
-        // register all non reference fields of object (with inherited fields)
-        FieldDescriptor[] fieldDescs = cld.getFieldDescriptor(true);
-        for(int i = 0; i < fieldDescs.length; i++)
+        if(cld.isStateDetection() && cld.getRepository().isStateDetection())
         {
-            addFieldImage(imageMap, fieldDescs[i]);
+            // register all non reference fields of object (with inherited fields)
+            FieldDescriptor[] fieldDescs = cld.getFieldDescriptor(true);
+            for(int i = 0; i < fieldDescs.length; i++)
+            {
+                addFieldImage(imageMap, fieldDescs[i]);
+            }
         }
     }
 
     private void addFieldImage(Map imageMap, FieldDescriptor fld)
     {
-        // register copies of all field values
-        Object value = fld.getCopyOfValue(getRealObject());
-        imageMap.put(fld.getPersistentField().getName(), new Image.Field(fld.getJdbcType().getFieldType(), value));
+        // register copies of all fields, except the fields with
+        // disbaled state detection
+        if(fld.isStateDetection())
+        {
+            Object value = fld.getCopyOfValue(getRealObject());
+            imageMap.put(fld.getPersistentField().getName(), new Image.Field(fld.getJdbcType().getFieldType(), value));
+        }
+        else
+        {
+            // field indicate that this field shouldn't included in object state detection
+        }
     }
 
     private void buildImageForCollectionReferences(Map imageMap, ClassDescriptor cld)
@@ -859,7 +873,7 @@
                 }
                 else
                 {
-                    // when cascade 'true' we remove all dependent objects, so no need
+                    // if cascade 'true', we remove all dependent objects, so no need
                     // to unlink, else we have to unlink all referenced objects of this
                     // object
                     if(!cascade)



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org