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