You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by ht...@apache.org on 2011/08/08 23:20:48 UTC
svn commit: r1155108 - in /openjpa/branches/2.0.x:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java
Author: hthomann
Date: Mon Aug 8 21:20:47 2011
New Revision: 1155108
URL: http://svn.apache.org/viewvc?rev=1155108&view=rev
Log:
OPENJPA-758: Added code to check the ClassResolver to get a class loader when attempting to load a ValueHandler or FieldStrategy.
Modified:
openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java
Modified: openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java?rev=1155108&r1=1155107&r2=1155108&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java (original)
+++ openjpa/branches/2.0.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java Mon Aug 8 21:20:47 2011
@@ -1204,7 +1204,7 @@ public class MappingRepository extends M
try {
Class<?> c = JavaTypes.classForName(name, val,
AccessController.doPrivileged(
- J2DoPrivHelper.getClassLoaderAction(FieldStrategy.class)));
+ J2DoPrivHelper.getClassLoaderAction(FieldStrategy.class)),false);
Object o = AccessController.doPrivileged(
J2DoPrivHelper.newInstanceAction(c));
Configurations.configureInstance(o, getConfiguration(), props);
@@ -1231,7 +1231,7 @@ public class MappingRepository extends M
try {
Class<?> c = JavaTypes.classForName(name, val,
AccessController.doPrivileged(
- J2DoPrivHelper.getClassLoaderAction(ValueHandler.class)));
+ J2DoPrivHelper.getClassLoaderAction(ValueHandler.class)),false);
if (ValueHandler.class.isAssignableFrom(c)) {
ValueHandler vh = (ValueHandler) AccessController.doPrivileged(
J2DoPrivHelper.newInstanceAction(c));
Modified: openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java?rev=1155108&r1=1155107&r2=1155108&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java (original)
+++ openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java Mon Aug 8 21:20:47 2011
@@ -205,12 +205,38 @@ public class JavaTypes {
context.getFieldMetaData().getDeclaringType(), context, loader);
}
+ /**
+ * Try to load a class using the provided loader. Optionally tries the
+ * configuration's ClassResolver if the supplied loader cannot find the class.
+ *
+ * @param name Name of the class to load.
+ * @param context
+ * @param loader ClassLoader to use. If null, the configuration's ClassResolver will be used.
+ * @param mustExist Whether the supplied loader <b>must</b> be able to load the class. If true no attempt to use a
+ * different classloader will be made. If false the ClassResolver from the configuration will be used.
+ */
+ public static Class<?> classForName(String name, ValueMetaData context,
+ ClassLoader loader, boolean mustExist) {
+ return classForName(name,
+ context.getFieldMetaData().getDefiningMetaData(),
+ context.getFieldMetaData().getDeclaringType(), context, loader, mustExist);
+ }
+
+ /**
+ * OJ-758: Delegates to the final classForName. This is needed
+ * to maintain the existing code path prior to OJ-758.
+ */
+ private static Class<?> classForName(String name, ClassMetaData meta,
+ Class<?> dec, ValueMetaData vmd, ClassLoader loader) {
+ return classForName(name, meta, dec, vmd, loader, true);
+ }
+
/**
* Check the given name against the same set of standard packages used
* when parsing metadata.
*/
private static Class<?> classForName(String name, ClassMetaData meta, Class<?> dec, ValueMetaData vmd,
- ClassLoader loader) {
+ ClassLoader loader, boolean mustExist) {
// special case for PersistenceCapable and Object
if ("PersistenceCapable".equals(name)
|| "javax.jdo.PersistenceCapable".equals(name)) // backwards compatibility
@@ -232,9 +258,21 @@ public class JavaTypes {
pkg = Strings.getPackageName(vmd.getDeclaredType());
cls = CFMetaDataParser.classForName(name, pkg, runtime, loader);
}
+
+ //OJ-758 start: If the class is still null, as a last/final attempt to
+ //load the class, check with the ClassResolver to get a loader
+ //and use it to attempt to load the class.
+ if (cls == null && !mustExist){
+ loader = rep.getConfiguration().getClassResolverInstance().
+ getClassLoader(dec, meta.getEnvClassLoader());
+ cls = CFMetaDataParser.classForName(name, pkg, runtime, loader);
+ }
+ //OJ-758 end
+
if (cls == null)
throw new MetaDataException(_loc.get("bad-class", name,
(vmd == null) ? (Object) meta : (Object) vmd));
+
return cls;
}