You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2006/10/13 23:07:18 UTC

svn commit: r463829 - in /incubator/openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ openjpa-lib/src/main/resources/...

Author: awhite
Date: Fri Oct 13 14:07:17 2006
New Revision: 463829

URL: http://svn.apache.org/viewvc?view=rev&rev=463829
Log:
Validate product derivations before caching them so we don't end up with runtime
errors when clients use JPA without jdo.jar or JDO without jpa.jar.  Give a 
more succinct warning when some product derivations are uninstantiable, with
more detailed information available via the ProductDerivations class's main().


Modified:
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java
    incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
    incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/AbstractProductDerivation.java
    incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivation.java
    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
    incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java
    incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java?view=diff&rev=463829&r1=463828&r2=463829
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java Fri Oct 13 14:07:17 2006
@@ -625,44 +625,6 @@
             }
         }
 
-        // indexes
-        /*
- if (_indexes)
- {
- Index[] idxs;
- Index idx;
- for (int i = 0; i < schemas.length; i++)
- {
- tabs = schemas[i].getTables ();
- for (int j = 0; j < tabs.length; j++)
- {
- if (!isDroppable (tabs[j]))
- continue;
- idxs = tabs[j].getIndexes ();
- reposTable = repos.findTable (tabs[j]);
- if (!tables && reposTable == null)
- continue;
-
- for (int k = 0; k < idxs.length; k++)
- {
- idx = null;
- if (reposTable != null)
- idx = reposTable.getIndex (idxs[k].getName ());
- if (reposTable == null || idx == null
- || !idxs[k].equalsIndex (idx))
- {
- if (dropIndex (idxs[k]))
- tabs[j].removeIndex (idxs[k]);
- else
- _log.warn (_loc.get ("drop-index", idxs[k],
- tabs[j]));
- }
- }
- }
- }
- }
-          */
-
         // primary keys
         if (_pks) {
             PrimaryKey pk;
@@ -830,41 +792,6 @@
             }
         }
 
-        // indexes
-        /*
- if (_indexes)
- {
- Index[] idxs;
- Index idx;
- for (int i = 0; i < schemas.length; i++)
- {
- tabs = schemas[i].getTables ();
- for (int j = 0; j < tabs.length; j++)
- {
- if (!isDroppable (tabs[j]))
- continue;
- idxs = tabs[j].getIndexes ();
- dbTable = db.findTable (tabs[j]);
- for (int k = 0; k < idxs.length; k++)
- {
- idx = null;
- if (dbTable != null)
- idx = dbTable.getIndex (idxs[k].getName ());
- if (dbTable == null || idx == null)
- continue;
-
- if (dropIndex (idxs[k]))
- if (dbTable != null)
- dbTable.removeIndex (idx);
- else
- _log.warn (_loc.get ("drop-index", idxs[k],
- tabs[j]));
- }
- }
- }
- }
-          */
-
         // drop the tables we calculated above
         dropTables(drops, db);
 
@@ -885,11 +812,12 @@
                     if (dbTable == null || col == null)
                         continue;
 
-                    if (dropColumn(cols[k]))
+                    if (dropColumn(cols[k])) {
                         if (dbTable != null)
                             dbTable.removeColumn(col);
                         else
                             _log.warn(_loc.get("drop-col", cols[k], tabs[j]));
+                    }
                 }
             }
         }
@@ -948,11 +876,9 @@
         if (tables.isEmpty())
             return;
 
-        Collection nodes = tables;
-
         Table table;
         Table changeTable;
-        for (Iterator itr = nodes.iterator(); itr.hasNext();) {
+        for (Iterator itr = tables.iterator(); itr.hasNext();) {
             table = (Table) itr.next();
             if (dropTable(table)) {
                 changeTable = change.findTable(table);
@@ -1338,11 +1264,14 @@
      * <ul>
      * <li>Write a script to stdout to re-create the current database
      * schema:<br />
-     * <code>java org.apache.openjpa.jdbc.schema.SchemaTool -f stdout -a createDB</code>
+     * <code>java org.apache.openjpa.jdbc.schema.SchemaTool -f stdout 
+     * -a createDB</code></li>
      * <li>Drop the current database schema:<br />
-     * <code>java org.apache.openjpa.jdbc.schema.SchemaTool -a dropDB</code></li>
+     * <code>java org.apache.openjpa.jdbc.schema.SchemaTool 
+     * -a dropDB</code></li>
      * <li>Create a schema based on an XML schema definition file:<br />
-     * <code>java org.apache.openjpa.jdbc.schema.SchemaTool myschema.xml</code></li>
+     * <code>java org.apache.openjpa.jdbc.schema.SchemaTool 
+     * myschema.xml</code></li>
      * </ul>
      */
     public static void main(String[] args)

Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?view=diff&rev=463829&r1=463828&r2=463829
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Fri Oct 13 14:07:17 2006
@@ -3561,14 +3561,8 @@
             return key;
         } finally {
             if (rs != null)
-                try {
-                    rs.close();
-                } catch (SQLException se) {
-                }
-            try {
-                stmnt.close();
-            } catch (SQLException se) {
-            }
+                try { rs.close(); } catch (SQLException se) {}
+            try { stmnt.close(); } catch (SQLException se) {} 
         }
     }
 

Modified: incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/AbstractProductDerivation.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/AbstractProductDerivation.java?view=diff&rev=463829&r1=463828&r2=463829
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/AbstractProductDerivation.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/AbstractProductDerivation.java Fri Oct 13 14:07:17 2006
@@ -31,6 +31,10 @@
         return null;
     }
 
+    public void validate() 
+        throws Exception {
+    }
+
     public ConfigurationProvider loadGlobals(ClassLoader loader)
         throws Exception {
         return null;

Modified: incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivation.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivation.java?view=diff&rev=463829&r1=463828&r2=463829
==============================================================================
--- incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivation.java (original)
+++ incubator/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ProductDerivation.java Fri Oct 13 14:07:17 2006
@@ -46,6 +46,15 @@
     public String getConfigurationPrefix();
 
     /**
+     * Ensure that this derivation is valid.  This action might consist of
+     * loading classes for the product this derivation represents to be sure
+     * they exist.  Throw any throwable to indicate an invalid derivation.
+     * Invalid derivations will not be used.
+     */
+    public void validate()
+        throws Exception;
+
+    /**
      * Load globals into the returned ConfigurationProvider, or return null if 
      * no globals are found.
      */

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=463829&r1=463828&r2=463829
==============================================================================
--- 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 Fri Oct 13 14:07:17 2006
@@ -38,31 +38,41 @@
         (ProductDerivations.class);
 
     private static final ProductDerivation[] _derivations;
+    private static final String[] _derivationNames;
+    private static final Throwable[] _derivationErrors;
     private static final String[] _prefixes;
     static {
-        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 {
-                Class cls = Class.forName(pds[i], true, cl);
-                derivations.add(cls.newInstance());
-            } catch (UnsupportedClassVersionError ucve) {
-                // ignore so that < 1.5 users don't get errors about
-                // 1.5 products they aren't using
+        ClassLoader l = ProductDerivation.class.getClassLoader();
+        _derivationNames = Services.getImplementors(ProductDerivation.class, l);
+        _derivationErrors = new Throwable[_derivationNames.length];
+        List derivations = new ArrayList(_derivationNames.length);
+        for (int i = 0; i < _derivationNames.length; i++) {
+            try {
+                ProductDerivation d = (ProductDerivation) Class.
+                    forName(_derivationNames[i], true, l).newInstance();
+                d.validate();
+                derivations.add(d);
             } catch (Throwable t) {
-                System.err.println(_loc.get("bad-product-derivation", pds[i], 
-                    t));
+                _derivationErrors[i] = t;
             }
         }
 
         // must be at least one product derivation to define metadata factories,
         // etc. 
         if (derivations.isEmpty()) {
-            Localizer loc = Localizer.forPackage(ProductDerivations.class);
-            throw new MissingResourceException(loc.get("no-product-derivations",
-                ProductDerivation.class.getName()).getMessage(),
-                ProductDerivations.class.getName(), "derivations");
+            throw new MissingResourceException(_loc.get
+                ("no-product-derivations", ProductDerivation.class.getName(),
+                derivationErrorsToString()).getMessage(), 
+                ProductDerivations.class.getName(),"derivations");
+        }
+
+        // if some derivations weren't instantiable, warn
+        for (int i = 0; i < _derivationErrors.length; i++) {
+            if (_derivationErrors[i] == null)
+                continue;
+            System.err.println(_loc.get("bad-product-derivations",
+                ProductDerivations.class.getName()));
+            break;
         }
 
         Collections.sort(derivations, new ProductDerivationComparator());
@@ -269,5 +279,29 @@
                 getName());
 		}
 	}
+
+    /**
+     * Prints product derivation information.
+     */
+    public static void main(String[] args) {
+        System.err.println(derivationErrorsToString());
+    }
+
+    /**
+     * Return a message about the status of each product derivation.
+     */
+    private static String derivationErrorsToString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append("ProductDerivations: ").append(_derivationNames.length);
+        for (int i = 0; i < _derivationNames.length; i++) {
+            buf.append("\n").append(i + 1).append(". ").
+                append(_derivationNames[i]).append(": ");
+            if (_derivationErrors[i] == null)
+                buf.append("OK");
+            else
+                buf.append(_derivationErrors[i].toString());
+        }
+        return buf.toString();
+    }
 }
 

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=463829&r1=463828&r2=463829
==============================================================================
--- 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 Fri Oct 13 14:07:17 2006
@@ -67,10 +67,9 @@
     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}
+    is an overly-restrictive security manager.\n{1}
+bad-product-derivations: Some product derivations are being skipped. For \
+    information about product derivation status, run:\njava {0}
 
 Log-name: Log factory
 Log-desc: LogFactory and configuration

Modified: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java?view=diff&rev=463829&r1=463828&r2=463829
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java (original)
+++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/JDBCPersistenceProductDerivation.java Fri Oct 13 14:07:17 2006
@@ -44,6 +44,13 @@
     }
 
     @Override
+    public void validate()
+        throws Exception {
+        // make sure JPA is available
+        javax.persistence.EntityManagerFactory.class.getClassLoader();
+    }
+
+    @Override
     public boolean beforeConfigurationLoad(Configuration c) {
         if (c instanceof OpenJPAConfiguration) {
             ((OpenJPAConfiguration) c).getStoreFacadeTypeRegistry().

Modified: incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java?view=diff&rev=463829&r1=463828&r2=463829
==============================================================================
--- incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java (original)
+++ incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceProductDerivation.java Fri Oct 13 14:07:17 2006
@@ -76,6 +76,13 @@
     public int getType() {
         return TYPE_SPEC;
     }
+
+    @Override
+    public void validate()
+        throws Exception {
+        // make sure JPA is available
+        javax.persistence.EntityManagerFactory.class.getClassLoader();
+    }
     
     @Override
     public boolean beforeConfigurationLoad(Configuration c) {