You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/02/04 00:18:55 UTC

svn commit: r740506 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/

Author: ppoddar
Date: Tue Feb  3 23:18:54 2009
New Revision: 740506

URL: http://svn.apache.org/viewvc?rev=740506&view=rev
Log:
OPENJPA-703: Validate parameter values by their expected types.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
    openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestParameterProcessing.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java?rev=740506&r1=740505&r2=740506&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java Tue Feb  3 23:18:54 2009
@@ -405,7 +405,9 @@
                         throw new UserException(_loc.get("gap-query-param", 
                             new Object[]{q.getContext().getQueryString(), key, 
                             userParams.size(), userParams}));
-                arr[idx] = userParams.get(key);
+                Object value = userParams.get(key);
+                validateParameterValue(key, value, (Class)paramTypes.get(key));
+                arr[idx] = value;
             }
             return arr;
         }
@@ -430,7 +432,25 @@
             }
             return low;
         }
-
+        
+        private static void validateParameterValue(Object key, Object value, 
+            Class expected) {
+            if (expected == null)
+                return;
+            
+            if (value == null) {
+                if (expected.isPrimitive()) 
+                    throw new UserException(_loc.get("null-primitive-param", 
+                        key, expected));
+            } else {
+                Class actual = value.getClass();
+                boolean strict = true;
+                if (!Filters.canConvert(actual, expected, strict)) 
+                    throw new UserException(_loc.get("param-value-mismatch", 
+                        new Object[]{key, expected, value, actual}));
+            }
+        }
+        
         public final Map getUpdates(StoreQuery q) {
             return assertQueryExpression().updates;
         }

Modified: openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties?rev=740506&r1=740505&r2=740506&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties (original)
+++ openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/localizer.properties Tue Feb  3 23:18:54 2009
@@ -291,8 +291,10 @@
 extra-params: More parameters were passed to execute() than were declared: \
 	{1} parameters were specified for query execution, but only {0} \
 	parameters were declared in the query.
-null-primitive-param: Parameter "{0}" was declared with a primitive type, but \
-	has been given a null value.
+null-primitive-param: Parameter "{0}" expects a value of primitive "{1}" \ 
+	but was given a null value.
+param-value-mismatch: Parameter "{0}" expects a value of "{1}" but was given \
+	a value of "{2}" of "{3}".
 merged-aggregate: This query on candidate type "{0}" with filter "{1}" \
 	involves combining the results of multiple sub-queries.  However, because \
 	this query is for aggregate data, OpenJPA cannot combine the sub-query \

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestParameterProcessing.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestParameterProcessing.java?rev=740506&r1=740505&r2=740506&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestParameterProcessing.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestParameterProcessing.java Tue Feb  3 23:18:54 2009
@@ -94,5 +94,37 @@
         
         assertEquals(1, result2.size());
     }
+    
+    public void testWrongParameterValueTypeThrowException() {
+        String jpql = "select p from Person p where p.firstName=:first" 
+                    + " and p.age > :age";
+        EntityManager em = emf.createEntityManager();
+
+        OpenJPAQuery q1 = OpenJPAPersistence.cast(em.createQuery(jpql));
+        try {
+            List result1 = q1.setParameter("first", (short)40)
+                             .setParameter("age", "John")
+                             .getResultList();
+            fail("Expected to fail with wrong parameter value");
+        } catch (IllegalArgumentException e) {
+            // good
+        }
+    }
+    
+    public void testNullParameterValueForPrimitiveTypeThrowsException() {
+        String jpql = "select p from Person p where p.firstName=:first" 
+                    + " and p.age > :age";
+        EntityManager em = emf.createEntityManager();
+
+        OpenJPAQuery q1 = OpenJPAPersistence.cast(em.createQuery(jpql));
+        try {
+            List result1 = q1.setParameter("first", "John")
+                             .setParameter("age", null)
+                             .getResultList();
+            fail("Expected to fail with null parameter value for primitives");
+        } catch (RuntimeException e) {
+            // good
+        }
+    }
 
 }