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 2008/08/15 21:04:26 UTC

svn commit: r686325 - in /openjpa/trunk: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/ openjpa-persistence/src/main/java/org/apache/openjpa/p...

Author: awhite
Date: Fri Aug 15 12:04:25 2008
New Revision: 686325

URL: http://svn.apache.org/viewvc?rev=686325&view=rev
Log:
Eagerly compile JPQL queries to catch JPQL errors and throw proper exception as
required by spec.  OPENJPA-678


Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestException.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestException.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestException.java?rev=686325&r1=686324&r2=686325&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestException.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/exception/TestException.java Fri Aug 15 12:04:25 2008
@@ -160,22 +160,14 @@
 	}
 	
 	/**
-	 * Invalid query does not throw IllegalArgumentException on construction 
-	 * as per JPA spec. The exception is thrown during execution.
-	 * 
-	 * A patch
-	 * <A HREF="http://issues.apache.org/jira/browse/OPENJPA-678">OPENJPA-678</A>
-	 * by Xiaoqin Feng has proposed eager compilation of the query to raise the
-	 * error before execution and as per JPA spec. 
-	 * However, this patch has not yet been applied as eagerly compiling query
-	 * has other side-effects. 
-	 * 
+	 * Invalid query throws IllegalArgumentException on construction 
+	 * as per JPA spec.
 	 */
 	public void testIllegalArgumennExceptionOnInvalidQuery() {
 	    EntityManager em = emf.createEntityManager();
-	    Query query = em.createQuery("This is not a valid JPQL query");
 	    try {
-		   query.getResultList();
+	      em.createQuery("This is not a valid JPQL query");
+        fail("Did not throw IllegalArgumentException for invalid query.");
 	    } catch (Throwable t) {
 		   assertException(t, IllegalArgumentException.class);
 	    }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java?rev=686325&r1=686324&r2=686325&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/test/PersistenceTestCase.java Fri Aug 15 12:04:25 2008
@@ -18,6 +18,11 @@
  */
 package org.apache.openjpa.persistence.test;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.lang.reflect.Modifier;
 import java.sql.SQLException;
 import java.util.ArrayList;
@@ -302,6 +307,20 @@
         else if (o1.equals(o2))
             fail("expected args to be different; compared equal.");
     }
+
+    /**
+     * Round-trip a serializable object to bytes.
+     */
+    public static Object roundtrip(Object o) 
+        throws ClassNotFoundException, IOException {
+        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream(bytes);
+        out.writeObject(o);
+        out.flush();
+        ObjectInputStream in = new ObjectInputStream(
+            new ByteArrayInputStream(bytes.toByteArray()));
+        return in.readObject();
+    }
     
     // ================================================ 
     // Utility methods for exception handling

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=686325&r1=686324&r2=686325&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java Fri Aug 15 12:04:25 2008
@@ -87,7 +87,7 @@
     private Map<FetchConfiguration,FetchPlan> _plans =
         new IdentityHashMap<FetchConfiguration,FetchPlan>(1);
 
-    private RuntimeExceptionTranslator ret =
+    private RuntimeExceptionTranslator _ret =
         PersistenceExceptions.getRollbackTranslator(this);
 
     public EntityManagerImpl() {
@@ -104,8 +104,8 @@
 
     private void initialize(EntityManagerFactoryImpl factory, Broker broker) {
         _emf = factory;
-        _broker = new DelegatingBroker(broker, ret);
-        _broker.setImplicitBehavior(this, ret);
+        _broker = new DelegatingBroker(broker, _ret);
+        _broker.setImplicitBehavior(this, _ret);
     }
 
     /**
@@ -867,7 +867,16 @@
 
     public OpenJPAQuery createQuery(String language, String query) {
         assertNotCloseInvoked();
-        return new QueryImpl(this, ret, _broker.newQuery(language, query));
+        try {
+            org.apache.openjpa.kernel.Query q = _broker.newQuery(language, 
+                query);
+            // have to validate JPQL according to spec
+            if (JPQLParser.LANG_JPQL.equals(language))
+                q.compile(); 
+            return new QueryImpl(this, _ret, q);
+        } catch (RuntimeException re) {
+            throw PersistenceExceptions.toPersistenceException(re);
+        }
     }
 
     public OpenJPAQuery createQuery(Query query) {
@@ -875,7 +884,7 @@
             return createQuery((String) null);
         assertNotCloseInvoked();
         org.apache.openjpa.kernel.Query q = ((QueryImpl) query).getDelegate();
-        return new QueryImpl(this, ret, _broker.newQuery(q.getLanguage(),
+        return new QueryImpl(this, _ret, _broker.newQuery(q.getLanguage(),
             q));
     }
 
@@ -891,7 +900,7 @@
             meta.setInto(del);
             del.compile();
 
-            OpenJPAQuery q = new QueryImpl(this, ret, del);
+            OpenJPAQuery q = new QueryImpl(this, _ret, del);
             String[] hints = meta.getHintKeys();
             Object[] values = meta.getHintValues();
             for (int i = 0; i < hints.length; i++)
@@ -917,7 +926,7 @@
         org.apache.openjpa.kernel.Query kernelQuery = _broker.newQuery(
             QueryLanguages.LANG_SQL, query);
         kernelQuery.setResultMapping(null, mappingName);
-        return new QueryImpl(this, ret, kernelQuery);
+        return new QueryImpl(this, _ret, kernelQuery);
     }
 
     /**
@@ -1235,7 +1244,7 @@
     public void readExternal(ObjectInput in)
         throws IOException, ClassNotFoundException {
         try {
-            ret = PersistenceExceptions.getRollbackTranslator(this);
+            _ret = PersistenceExceptions.getRollbackTranslator(this);
 
             // this assumes that serialized Brokers are from something
             // that extends AbstractBrokerFactory.
@@ -1254,7 +1263,7 @@
             initialize(emf, broker);
         } catch (RuntimeException re) {
             try {
-                re = ret.translate(re);
+                re = _ret.translate(re);
             } catch (Exception e) {
                 // ignore
             }
@@ -1276,7 +1285,7 @@
             out.writeObject(baos.toByteArray());
         } catch (RuntimeException re) {
             try {
-                re = ret.translate(re);
+                re = _ret.translate(re);
             } catch (Exception e) {
                 // ignore
             }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java?rev=686325&r1=686324&r2=686325&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java Fri Aug 15 12:04:25 2008
@@ -79,12 +79,9 @@
 	/**
 	 * Constructor; supply factory exception translator and delegate.
 	 * 
-	 * @param em
-	 *            The EntityManager which created this query
-	 * @param ret
-	 *            Exception translater for this query
-	 * @param query
-	 *            The underlying "kernel" query.
+	 * @param em  The EntityManager which created this query
+	 * @param ret Exception translater for this query
+	 * @param query The underlying "kernel" query.
 	 */
 	public QueryImpl(EntityManagerImpl em, RuntimeExceptionTranslator ret,
 			org.apache.openjpa.kernel.Query query) {