Author: ppoddar
Date: Mon Aug 18 17:15:35 2008
New Revision: 686905

URL: http://svn.apache.org/viewvc?rev=686905&view=rev
Log:
Merge 686325, 686349, 686419 -- missed a whole block during manual merge.

Modified:
    
openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java

Modified: 
openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java?rev=686905&r1=686904&r2=686905&view=diff
==============================================================================
--- 
openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
 (original)
+++ 
openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
 Mon Aug 18 17:15:35 2008
@@ -20,6 +20,8 @@
 
 import java.io.Serializable;
 import java.lang.reflect.Method;
+import java.sql.Time;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
@@ -356,6 +358,52 @@
                                        
                                }
                        }
+
+               } else if (_named != null) {
+                       LinkedMap expected = _query.getParameterTypes();
+                       // key : name of the parameter used while binding
+                       // value : user supplied parameter value. null may mean 
either
+                       // user has supplied a value or not specified at all
+                       Map<String, Object> actual = _named;
+                       for (Object o : expected.keySet()) {
+                               String expectedName = (String) o;
+                               Class expectedParamType = (Class) 
expected.get(expectedName);
+                               Object actualValue = actual.get(expectedName);
+                               boolean valueUnspecified = 
!actual.containsKey(expectedName);
+                               if (valueUnspecified) {
+                                       newValidationException("param-missing", 
expectedName, query,
+                                                       
Arrays.toString(actual.keySet().toArray()));
+                               }
+                               if (expectedParamType.isPrimitive() && 
actualValue == null)
+                                       
newValidationException("param-type-null", 
+                                                       expectedName, query, 
expectedParamType.getName());
+                               if (actualValue != null 
+                                && 
!Filters.wrap(expectedParamType).isInstance(actualValue)) {
+                                       
newValidationException("param-type-mismatch",
+                                                       expectedName, query, 
actualValue,
+                                                       
actualValue.getClass().getName(),
+                                                       
expectedParamType.getName());
+                               }
+                       }
+                       for (String actualName : actual.keySet()) {
+                               Object actualValue = actual.get(actualName);
+                               Class expectedParamType = (Class) 
expected.get(actualName);
+                               boolean paramExpected = 
expected.containsKey(actualName);
+                               if (!paramExpected) {
+                                       newValidationException("param-extra", 
actualName, query,
+                                                       expected.asList());
+                               }
+                               if (expectedParamType.isPrimitive() && 
actualValue == null)
+                                       
newValidationException("param-type-null", 
+                                                       actualName, query, 
expectedParamType.getName());
+                               if (actualValue != null 
+                                && 
!Filters.wrap(expectedParamType).isInstance(actualValue)) {
+                                       
newValidationException("param-type-mismatch",
+                                                       actualName, query, 
actualValue,
+                                                       
actualValue.getClass().getName(),
+                                                       
expectedParamType.getName());
+                               }
+                       }
                }
        }
        
@@ -521,15 +569,35 @@
 
     public OpenJPAQuery setParameter(int position, Calendar value,
         TemporalType t) {
-        return setParameter(position, value);
+        return setParameter(position, convertTemporalType(value, t));
     }
 
     public OpenJPAQuery setParameter(int position, Date value,
         TemporalType type) {
-        return setParameter(position, value);
+        return setParameter(position, convertTemporalType(value, type));
     }
 
-       public OpenJPAQuery setParameter(int position, Object value) {
+    /**
+     * Converts the given Date to a value corresponding to given temporal type.
+     */
+    Object convertTemporalType(Date value, TemporalType type) {
+            switch (type) {
+            case DATE:
+                    return value;
+            case TIME:
+                    return new Time(value.getTime());
+            case TIMESTAMP:
+                    return new Timestamp(value.getTime());
+            default:
+                    return null;
+            }
+    }
+    
+    Object convertTemporalType(Calendar value, TemporalType type) {
+            return convertTemporalType(value.getTime(), type);
+    }
+    
+    public OpenJPAQuery setParameter(int position, Object value) {
                _query.assertOpen();
                _em.assertNotCloseInvoked();
                _query.lock();
@@ -565,12 +633,12 @@
 
     public OpenJPAQuery setParameter(String name, Calendar value,
         TemporalType t) {
-        return setParameter(name, value);
+        return setParameter(name, convertTemporalType(value, t));
     }
 
     public OpenJPAQuery setParameter(String name, Date value,
         TemporalType type) {
-        return setParameter(name, value);
+        return setParameter(name, convertTemporalType(value, type));
     }
 
     public OpenJPAQuery setParameter(String name, Object value) {


Reply via email to