Author: pcl Date: Sat Oct 7 02:22:29 2006 New Revision: 453875 URL: http://svn.apache.org/viewvc?view=rev&rev=453875 Log: made ProductDerivations a bit more fault-tolerant -- when a failure occurs while loading ProductDerivation instances defined in services files, the system continues to start up with the ProductDerivations that did load, and a warning is printed to stderr. Note that this means that people using the uber-jar in 1.3 or 1.4 environments, or without having javax.persistence in their classpath, for example, will see warnings on stderr.
Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java incubator/openjpa/trunk/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties?view=diff&rev=453875&r1=453874&r2=453875 ============================================================================== --- incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties (original) +++ incubator/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/conf/localizer.properties Sat Oct 7 02:22:29 2006 @@ -536,13 +536,3 @@ diff-specs: Attempt to configure for multiple specifications. Was configured \ for "{0}". Attempt to now configure for "{1}". This attempt will be \ ignored. -no-product-derivations: Your system is missing product derivations. Product \ - derivations provide configuration options for supported data stores and \ - specifications. You must have a META-INF/services/{0} file in your \ - classpath listing the available derivation classes, and some listed class \ - must be instantiable. Typically this file is bundled as part of the \ - distribution. Have you unbundled it, or unbundled its listed classes? \ - If you are using ant, a common solution to this problem is to place \ - the jar libraries of the OpenJPA distribution in the \ - $'{user.home}/.ant/lib directory. Another common cause of this problem \ - is an overly-restrictive security manager. Modified: incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java?view=diff&rev=453875&r1=453874&r2=453875 ============================================================================== --- incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java (original) +++ incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivations.java Sat Oct 7 02:22:29 2006 @@ -36,15 +36,17 @@ private static final ProductDerivation[] _derivations; private static final String[] _prefixes; static { - Class[] pdcls = Services.getImplementorClasses(ProductDerivation.class, - ProductDerivation.class.getClassLoader()); - List derivations = new ArrayList(pdcls.length); - for (int i = 0; i < pdcls.length; i++) { + ClassLoader cl = ProductDerivation.class.getClassLoader(); + String pds = Services.getImplementors(ProductDerivation.class, cl); + List derivations = new ArrayList(pds.length); + for (int i = 0; i < pds.length; i++) { try { - derivations.add(pdcls[i].newInstance()); + Class cls = Class.forName(pds[i], true, cl); + derivations.add(cls.newInstance()); } catch (Throwable t) { - // invalid service - t.printStackTrace(); + Localizer loc = Localizer.forPackage(ProductDerivations.class); + System.err.println(loc.get("bad-product-derivation", pds[i], + t)); } } Modified: incubator/openjpa/trunk/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties?view=diff&rev=453875&r1=453874&r2=453875 ============================================================================== --- incubator/openjpa/trunk/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties (original) +++ incubator/openjpa/trunk/openjpa-lib/src/main/resources/org/apache/openjpa/lib/conf/localizer.properties Sat Oct 7 02:22:29 2006 @@ -58,6 +58,19 @@ value {0}. This exception will be consumed. anchor-only: You cannot supply a configuration unit name only. You must also \ supply the name of the resource in which the unit appears. +no-product-derivations: Your system is missing product derivations. Product \ + derivations provide configuration options for supported data stores and \ + specifications. You must have a META-INF/services/{0} file in your \ + classpath listing the available derivation classes, and some listed class \ + must be instantiable. Typically this file is bundled as part of the \ + distribution. Have you unbundled it, or unbundled its listed classes? \ + If you are using ant, a common solution to this problem is to place \ + the jar libraries of the OpenJPA distribution in the \ + $'{user.home}/.ant/lib directory. Another common cause of this problem \ + is an overly-restrictive security manager. +bad-product-derivation: An error occurred while attempting to load {0}. This \ + may indicate a corrupt system configuration, or may just be the result \ + of the inclusion of unused OpenJPA modules in your classpath. Error: {1} Log-name: Log factory Log-desc: LogFactory and configuration