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;