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
+        }
+    }
 
 }


Reply via email to