You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2011/01/04 19:19:39 UTC

svn commit: r1055128 - in /openjpa/branches/2.1.x: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-kernel/src/test/java/org/a...

Author: curtisr7
Date: Tue Jan  4 18:19:38 2011
New Revision: 1055128

URL: http://svn.apache.org/viewvc?rev=1055128&view=rev
Log:
OPENJPA-1896: Merging changes from trunk.

Added:
    openjpa/branches/2.1.x/openjpa-kernel/src/test/java/org/apache/openjpa/meta/TestJavaTypes.java
      - copied unchanged from r1052025, openjpa/trunk/openjpa-kernel/src/test/java/org/apache/openjpa/meta/TestJavaTypes.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/IntegerVersionEntity.java
      - copied unchanged from r1052025, openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/IntegerVersionEntity.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/TestMergeNoStateManager.java
      - copied unchanged from r1052025, openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/TestMergeNoStateManager.java
Modified:
    openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
    openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java
    openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java
    openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/IntVersionEntity.java

Modified: openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?rev=1055128&r1=1055127&r2=1055128&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Tue Jan  4 18:19:38 2011
@@ -3261,15 +3261,14 @@ public class PCEnhancer { 
                 ifins.setTarget(code.nop());
                 // if (pcVersionInit != false)
                 // return true
-                // else return false;
+                // else return null; //  (returning null because we don't know the correct answer)
                 loadManagedInstance(code, false);
                 getfield(code, null, VERSION_INIT_STR);
                 ifins = code.ifeq();
                 code.getstatic().setField(Boolean.class, "TRUE", Boolean.class);
                 code.areturn();
                 ifins.setTarget(code.nop());
-                code.getstatic().setField(Boolean.class, "FALSE", Boolean.class);
-                
+                code.constant().setNull();                
             }
             code.areturn();
             return false;

Modified: openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java?rev=1055128&r1=1055127&r2=1055128&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java (original)
+++ openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/VersionAttachStrategy.java Tue Jan  4 18:19:38 2011
@@ -18,12 +18,15 @@
  */
 package org.apache.openjpa.kernel;
 
+import java.lang.reflect.Field;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
 
 import org.apache.openjpa.enhance.PersistenceCapable;
+import org.apache.openjpa.enhance.Reflection;
 import org.apache.openjpa.enhance.StateManager;
+import org.apache.openjpa.event.LifecycleEvent;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.ClassMetaData;
 import org.apache.openjpa.meta.FieldMetaData;
@@ -31,10 +34,9 @@ import org.apache.openjpa.meta.JavaTypes
 import org.apache.openjpa.meta.ValueMetaData;
 import org.apache.openjpa.meta.ValueStrategies;
 import org.apache.openjpa.util.ApplicationIds;
+import org.apache.openjpa.util.ImplHelper;
 import org.apache.openjpa.util.ObjectNotFoundException;
 import org.apache.openjpa.util.OptimisticException;
-import org.apache.openjpa.util.ImplHelper;
-import org.apache.openjpa.event.LifecycleEvent;
 
 /**
  * Handles attaching instances using version and primary key fields.
@@ -175,9 +177,29 @@ class VersionAttachStrategy
      */
     private void compareVersion(StateManagerImpl sm, PersistenceCapable pc) {
         Object version = pc.pcGetVersion();
-        if (version == null)
+        // In the event that the version field is a primitive and it is the types default value, we can't differentiate
+        // between a value that was set to be the default, and one that defaulted to that value.
+        if (version != null 
+                && JavaTypes.isPrimitiveDefault(version, sm.getMetaData().getVersionField().getTypeCode())) {
+            Field pcVersionInitField = null;
+            try {
+                pcVersionInitField = pc.getClass().getDeclaredField("pcVersionInit");
+                Object pcField = Reflection.get(pc, pcVersionInitField);
+                if (pcField != null) {
+                    boolean bool = (Boolean) pcField;
+                    if (bool == false) {
+                        // If this field if false, that means that the pcGetVersion returned a default value rather than
+                        // and actual value.
+                        version = null;
+                    }
+                }
+            } catch (Exception e) {
+                // Perhaps this is an Entity that was enhanced before the pcVersionInit field was added. 
+            }
+        }
+        if (version == null) {
             return;
-
+        }
         // don't need to load unloaded fields since its implicitly
         // a single field value
         StoreManager store = sm.getBroker().getStoreManager();

Modified: openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java?rev=1055128&r1=1055127&r2=1055128&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java (original)
+++ openjpa/branches/2.1.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java Tue Jan  4 18:19:38 2011
@@ -435,4 +435,31 @@ public class JavaTypes {
             Array.set(array, idx, itr.next ());
 		return array;
 	}
+    
+    /**
+     * Determine whether or not the provided Object value is the default for the provided typeCode.
+     * 
+     * For example: If o = Integer(0) and typeCode = JavaTypes.INT, this method will return true.
+     */
+    public static boolean isPrimitiveDefault(Object o, int typeCode) {
+        switch (typeCode) {
+            case BOOLEAN:
+                return ((Boolean) o).equals(Boolean.FALSE) ? true : false;
+            case BYTE:
+                return ((Byte) o) == 0 ? true : false;
+            case SHORT:
+                return ((Short) o) == 0 ? true : false;
+            case INT:
+                return ((Integer) o) == 0 ? true : false;
+            case LONG:
+                return ((Long) o) == 0L ? true : false;
+            case FLOAT:
+                return ((Float) o) == 0.0F ? true : false;
+            case CHAR:
+                return ((Character) o) == '\u0000' ? true : false;
+            case DOUBLE:
+                return ((Double) o) == 0.0d ? true : false;
+        }
+        return false;
+    }
 }

Modified: openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/IntVersionEntity.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/IntVersionEntity.java?rev=1055128&r1=1055127&r2=1055128&view=diff
==============================================================================
--- openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/IntVersionEntity.java (original)
+++ openjpa/branches/2.1.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/detach/IntVersionEntity.java Tue Jan  4 18:19:38 2011
@@ -18,6 +18,8 @@
  */
 package org.apache.openjpa.persistence.detach;
 
+import java.io.Serializable;
+
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
@@ -26,7 +28,7 @@ import javax.persistence.OneToOne;
 import javax.persistence.Version;
 
 @Entity
-public class IntVersionEntity {
+public class IntVersionEntity implements Serializable {
     
     @Id
     private int id;