Index: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
===================================================================
--- openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (revision 556794)
+++ openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (working copy)
@@ -2260,7 +2260,7 @@
*
private static Class pcPCSuperclass
*
* private static String[] pcFieldNames
- * private static Class[] pcFieldTypes
+ * private static String[] pcFieldTypes
* private static byte[] pcFieldFlags
* protected transient StateManager pcStateManager
* if no PersistenceCapable superclass present)
@@ -2269,7 +2269,7 @@
private void addFields() {
_pc.declareField(INHERIT, int.class).setStatic(true);
_pc.declareField(PRE + "FieldNames", String[].class).setStatic(true);
- _pc.declareField(PRE + "FieldTypes", Class[].class).setStatic(true);
+ _pc.declareField(PRE + "FieldTypes", String[].class).setStatic(true);
_pc.declareField(PRE + "FieldFlags", byte[].class).setStatic(true);
_pc.declareField(SUPER, Class.class).setStatic(true);
@@ -2312,16 +2312,16 @@
}
code.putstatic().setField(PRE + "FieldNames", String[].class);
- // pcFieldTypes = new Class[] { .class, .class, ... };
+ // pcFieldTypes = new String[] { .class, .class, ... };
code.constant().setValue(fmds.length);
- code.anewarray().setType(Class.class);
+ code.anewarray().setType(String.class);
for (int i = 0; i < fmds.length; i++) {
code.dup();
code.constant().setValue(i);
- code.classconstant().setClass(fmds[i].getDeclaredType());
+ code.constant().setValue(fmds[i].getDeclaredType().getName());
code.aastore();
}
- code.putstatic().setField(PRE + "FieldTypes", Class[].class);
+ code.putstatic().setField(PRE + "FieldTypes", String[].class);
// pcFieldFlags = new byte[] { , , ... };
code.constant().setValue(fmds.length);
@@ -2339,7 +2339,7 @@
// pcPCSuperclass, alias, new XXX ());
code.classconstant().setClass(_pc);
code.getstatic().setField(PRE + "FieldNames", String[].class);
- code.getstatic().setField(PRE + "FieldTypes", Class[].class);
+ code.getstatic().setField(PRE + "FieldTypes", String[].class);
code.getstatic().setField(PRE + "FieldFlags", byte[].class);
code.getstatic().setField(SUPER, Class.class);
@@ -2357,7 +2357,7 @@
}
code.invokestatic().setMethod(HELPERTYPE, "register", void.class,
- new Class[]{ Class.class, String[].class, Class[].class,
+ new Class[]{ Class.class, String[].class, String[].class,
byte[].class, Class.class, String.class, PCTYPE });
code.vreturn();
Index: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCRegistry.java
===================================================================
--- openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCRegistry.java (revision 556794)
+++ openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCRegistry.java (working copy)
@@ -20,6 +20,7 @@
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
@@ -27,6 +28,7 @@
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.lib.util.ReferenceMap;
import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashMap;
+import org.apache.openjpa.util.InternalException;
import org.apache.openjpa.util.UserException;
/**
@@ -44,6 +46,19 @@
// map of pc classes to meta structs; weak so the VM can GC classes
private static final Map _metas = new ConcurrentReferenceHashMap
(ReferenceMap.WEAK, ReferenceMap.HARD);
+
+ private static final Map _primitives = new HashMap();
+ static {
+ _primitives.put("boolean", boolean.class);
+ _primitives.put("byte", byte.class);
+ _primitives.put("char", char.class);
+ _primitives.put("double", double.class);
+ _primitives.put("float", float.class);
+ _primitives.put("int", int.class);
+ _primitives.put("long", long.class);
+ _primitives.put("short", short.class);
+ }
+
// register class listeners
private static final Collection _listeners = new LinkedList();
@@ -88,8 +103,29 @@
*/
public static Class[] getFieldTypes(Class pcClass) {
Meta meta = getMeta(pcClass);
- return meta.fieldTypes;
+ String[] fieldTypes = meta.fieldTypes;
+ Class[] result = new Class[fieldTypes.length];
+ ClassLoader fieldLoader = pcClass.getClassLoader();
+ for (int i=0; iPersistenceCapable
@@ -185,7 +221,7 @@
* @param pc an instance of the class, if not abstract
*/
public static void register(Class pcClass, String[] fieldNames,
- Class[] fieldTypes, byte[] fieldFlags, Class sup, String alias,
+ String[] fieldTypes, byte[] fieldFlags, Class sup, String alias,
PersistenceCapable pc) {
if (pcClass == null)
throw new NullPointerException();
@@ -243,12 +279,12 @@
public final PersistenceCapable pc;
public final String[] fieldNames;
- public final Class[] fieldTypes;
+ public final String[] fieldTypes;
public final Class pcSuper;
public final String alias;
public Meta(PersistenceCapable pc, String[] fieldNames,
- Class[] fieldTypes, Class pcSuper, String alias) {
+ String[] fieldTypes, Class pcSuper, String alias) {
this.pc = pc;
this.fieldNames = fieldNames;
this.fieldTypes = fieldTypes;
Index: openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties
===================================================================
--- openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties (revision 556794)
+++ openjpa-kernel/src/main/resources/org/apache/openjpa/enhance/localizer.properties (working copy)
@@ -121,3 +121,5 @@
field "{1}", while the getter method returns field "{2}".
cft-exception-thrown: An exception was thrown while attempting to perform \
class file transformation on "{0}":
+field-type-load-error: Following exception was thrown while "{3}" tried to \
+ load the class "{2}" declared as the type of "{0}.{1}": {4}