Author: jgbutler
Date: Tue Apr 13 21:22:04 2010
New Revision: 933783

URL: http://svn.apache.org/viewvc?rev=933783&view=rev
Log:
Fix for IBATIS-777 - Dynamic context should not call every setter

Modified:
    
ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicContext.java
    
ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/submitted/dynsql/Parameter.java

Modified: 
ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicContext.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicContext.java?rev=933783&r1=933782&r2=933783&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicContext.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/builder/xml/dynamic/DynamicContext.java
 Tue Apr 13 21:22:04 2010
@@ -17,17 +17,16 @@ public class DynamicContext {
     OgnlRuntime.setPropertyAccessor(ContextMap.class, new ContextAccessor());
   }
 
-  private final ContextMap bindings = new ContextMap();
+  private final ContextMap bindings;
   private final StringBuilder sqlBuilder = new StringBuilder();
   private int uniqueNumber = 0;
 
   public DynamicContext(Configuration configuration, Object parameterObject) {
     if (parameterObject != null && !(parameterObject instanceof Map)) {
       MetaObject metaObject = configuration.newMetaObject(parameterObject);
-      String[] names = metaObject.getGetterNames();
-      for (String name : names) {
-        bindings.put(name, metaObject.getValue(name));
-      }
+      bindings = new ContextMap(metaObject);
+    } else {
+      bindings = new ContextMap(null);
     }
     bindings.put(PARAMETER_OBJECT_KEY, parameterObject);
   }
@@ -54,6 +53,28 @@ public class DynamicContext {
   }
 
   static class ContextMap extends HashMap<String, Object> {
+    private MetaObject parameterMetaObject;
+    public ContextMap(MetaObject parameterMetaObject) {
+      this.parameterMetaObject = parameterMetaObject;
+    }
+
+    @Override
+    public Object get(Object key) {
+      if (super.containsKey(key)) {
+        return super.get(key);
+      }
+        
+      if (parameterMetaObject != null) {
+        Object object = parameterMetaObject.getValue(key.toString());
+        if (object != null) {
+          super.put(key.toString(), object);
+        }
+            
+        return object;
+      }
+        
+      return null;
+    }
   }
 
   static class ContextAccessor implements PropertyAccessor {
@@ -81,5 +102,4 @@ public class DynamicContext {
       map.put(name, value);
     }
   }
-
 }

Modified: 
ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/submitted/dynsql/Parameter.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/submitted/dynsql/Parameter.java?rev=933783&r1=933782&r2=933783&view=diff
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/submitted/dynsql/Parameter.java
 (original)
+++ 
ibatis/java/ibatis-3/trunk/src/test/java/org/apache/ibatis/submitted/dynsql/Parameter.java
 Tue Apr 13 21:22:04 2010
@@ -25,6 +25,12 @@ public class Parameter {
   private String schema;
   private List<Integer> ids;
   private boolean enabled;
+  
+  public String getFred() {
+    // added this method to check for bug with DynamicContext
+    // IBATIS-777
+    throw new RuntimeException("This method should not be called.");
+  }
 
   public String getSchema() {
     return schema;


Reply via email to