From 4505cad88725f22f98bb8850ea4eeb9b40696e67 Mon Sep 17 00:00:00 2001 From: Heath Thomann Date: Mon, 8 Aug 2011 21:16:40 +0000 Subject: [PATCH] OPENJPA-758: Added code to check the ClassResolver to get a class loader when attempting to load a ValueHandler or FieldStrategy. git-svn-id: https://svn.apache.org/repos/asf/openjpa/branches/1.0.x@1155104 13f79535-47bb-0310-9956-ffa450edef68 --- .../openjpa/jdbc/meta/MappingRepository.java | 4 +- .../org/apache/openjpa/meta/JavaTypes.java | 40 ++++++++++++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java index 195f8b40e..94ade65d5 100644 --- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java +++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingRepository.java @@ -942,7 +942,7 @@ public class MappingRepository try { Class c = JavaTypes.classForName(name, val, (ClassLoader) AccessController.doPrivileged( - J2DoPrivHelper.getClassLoaderAction(FieldStrategy.class))); + J2DoPrivHelper.getClassLoaderAction(FieldStrategy.class)),false); Object o = AccessController.doPrivileged( J2DoPrivHelper.newInstanceAction(c)); Configurations.configureInstance(o, getConfiguration(), props); @@ -969,7 +969,7 @@ public class MappingRepository try { Class c = JavaTypes.classForName(name, val, (ClassLoader) AccessController.doPrivileged( - J2DoPrivHelper.getClassLoaderAction(ValueHandler.class))); + J2DoPrivHelper.getClassLoaderAction(ValueHandler.class)),false); if (ValueHandler.class.isAssignableFrom(c)) { ValueHandler vh = (ValueHandler) AccessController.doPrivileged( J2DoPrivHelper.newInstanceAction(c)); diff --git a/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java b/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java index bf266f872..c3f12cd26 100644 --- a/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java +++ b/openjpa-kernel/src/main/java/org/apache/openjpa/meta/JavaTypes.java @@ -196,12 +196,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 must 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) { + Class dec, ValueMetaData vmd, ClassLoader loader, boolean mustExist) { // special case for PersistenceCapable and Object if ("PersistenceCapable".equals(name) || "javax.jdo.PersistenceCapable".equals(name)) // backwards compat @@ -223,9 +249,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; }