You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2008/08/31 20:18:54 UTC
svn commit: r690747 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src:
main/java/org/apache/ibatis/reflection/MetaObject.java
test/java/org/apache/ibatis/reflection/MetaObjectTest.java
Author: cbegin
Date: Sun Aug 31 11:18:53 2008
New Revision: 690747
URL: http://svn.apache.org/viewvc?rev=690747&view=rev
Log:
added support for map[key] syntax
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java?rev=690747&r1=690746&r2=690747&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/reflection/MetaObject.java Sun Aug 31 11:18:53 2008
@@ -37,17 +37,20 @@
}
public String findProperty(String propName) {
- if (object instanceof Map) return propName;
+ if (object instanceof Map)
+ return propName;
return metaClass.findProperty(propName);
}
public String[] getGetterNames() {
- if (object instanceof Map) return (String[]) ((Map) object).keySet().toArray(new String[((Map) object).size()]);
+ if (object instanceof Map)
+ return (String[]) ((Map) object).keySet().toArray(new String[((Map) object).size()]);
return metaClass.getGetterNames();
}
public String[] getSetterNames() {
- if (object instanceof Map) return (String[]) ((Map) object).keySet().toArray(new String[((Map) object).size()]);
+ if (object instanceof Map)
+ return (String[]) ((Map) object).keySet().toArray(new String[((Map) object).size()]);
return metaClass.getSetterNames();
}
@@ -84,7 +87,8 @@
}
public boolean hasSetter(String name) {
- if (object instanceof Map) return true;
+ if (object instanceof Map)
+ return true;
PropertyTokenizer prop = new PropertyTokenizer(name);
if (prop.hasNext()) {
MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
@@ -99,7 +103,8 @@
}
public boolean hasGetter(String name) {
- if (object instanceof Map) return true;
+ if (object instanceof Map)
+ return true;
PropertyTokenizer prop = new PropertyTokenizer(name);
if (prop.hasNext()) {
MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());
@@ -123,7 +128,7 @@
return metaValue.getValue(prop.getChildren());
}
} else {
- return getProperty(object, prop);
+ return getProperty(prop, object);
}
}
@@ -139,7 +144,7 @@
try {
Object newObject = objectFactory.create(type);
metaValue = MetaObject.forObject(newObject);
- setProperty(object, prop, newObject);
+ setProperty(prop, object, newObject);
} catch (Exception e) {
throw new RuntimeException("Cannot set value of property '" + name + "' because '" + name + "' is null and cannot be instantiated on instance of " + type.getName() + ". Cause:" + e.toString(), e);
}
@@ -147,38 +152,38 @@
}
metaValue.setValue(prop.getChildren(), value);
} else {
- setProperty(object, prop, value);
+ setProperty(prop, object, value);
}
}
- private Object getProperty(Object object, PropertyTokenizer prop) {
+ private Object getProperty(PropertyTokenizer prop, Object object) {
if (prop.getIndex() != null) {
- return getIndexedProperty(object, prop);
+ return getIndexedProperty(prop, object);
} else {
- return getBeanOrMapProperty(object, prop);
+ return getBeanOrMapProperty(prop, object);
}
}
- private Object getBeanOrMapProperty(Object object, PropertyTokenizer prop) {
+ private Object getBeanOrMapProperty(PropertyTokenizer prop, Object object) {
if (object instanceof Map) {
return ((Map) object).get(prop.getName());
} else {
- return getBeanProperty(object, prop);
+ return getBeanProperty(prop, object);
}
}
- private void setProperty(Object object, PropertyTokenizer prop, Object value) {
+ private void setProperty(PropertyTokenizer prop, Object object, Object value) {
if (prop.getIndex() != null) {
- setIndexedProperty(object, prop, value);
+ setIndexedProperty(prop, object, value);
} else if (object instanceof Map) {
((Map) object).put(prop.getName(), value);
} else {
- setBeanProperty(object, prop, value);
+ setBeanProperty(prop, object, value);
}
}
- private Object getBeanProperty(Object object, PropertyTokenizer prop) {
+ private Object getBeanProperty(PropertyTokenizer prop, Object object) {
try {
Invoker method = metaClass.getGetInvoker(prop.getName());
try {
@@ -193,7 +198,7 @@
}
}
- private void setBeanProperty(Object object, PropertyTokenizer prop, Object value) {
+ private void setBeanProperty(PropertyTokenizer prop, Object object, Object value) {
try {
Invoker method = metaClass.getSetInvoker(prop.getName());
Object[] params = {value};
@@ -207,83 +212,82 @@
}
}
- private Object getIndexedProperty(Object object, PropertyTokenizer prop) {
- Object value;
- try {
- int i = Integer.parseInt(prop.getIndex());
- Object list;
- if ("".equals(prop.getName())) {
- list = object;
- } else {
- list = getBeanOrMapProperty(object, prop);
- }
- if (list instanceof List) {
- value = ((List) list).get(i);
- } else if (list instanceof Object[]) {
- value = ((Object[]) list)[i];
- } else if (list instanceof char[]) {
- value = ((char[]) list)[i];
- } else if (list instanceof boolean[]) {
- value = ((boolean[]) list)[i];
- } else if (list instanceof byte[]) {
- value = ((byte[]) list)[i];
- } else if (list instanceof double[]) {
- value = ((double[]) list)[i];
- } else if (list instanceof float[]) {
- value = ((float[]) list)[i];
- } else if (list instanceof int[]) {
- value = ((int[]) list)[i];
- } else if (list instanceof long[]) {
- value = ((long[]) list)[i];
- } else if (list instanceof short[]) {
- value = ((short[]) list)[i];
- } else {
- throw new RuntimeException("The '" + prop.getName() + "' property of " + object + " is not a List or Array.");
- }
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new RuntimeException("Error getting ordinal list from JavaBean. Cause " + e, e);
+ private Object resolveCollection(PropertyTokenizer prop, Object object) {
+ if ("".equals(prop.getName())) {
+ return object;
+ } else {
+ return getBeanOrMapProperty(prop, object);
}
- return value;
}
- private void setIndexedProperty(Object object, PropertyTokenizer prop, Object value) {
- try {
- int i = Integer.parseInt(prop.getIndex());
- Object list;
- if ("".equals(prop.getName())) {
- list = object;
- } else {
- list = getBeanOrMapProperty(object, prop);
- }
- if (list instanceof List) {
- ((List) list).set(i, value);
- } else if (list instanceof Object[]) {
- ((Object[]) list)[i] = value;
- } else if (list instanceof char[]) {
- ((char[]) list)[i] = (Character) value;
- } else if (list instanceof boolean[]) {
- ((boolean[]) list)[i] = (Boolean) value;
- } else if (list instanceof byte[]) {
- ((byte[]) list)[i] = (Byte) value;
- } else if (list instanceof double[]) {
- ((double[]) list)[i] = (Double) value;
- } else if (list instanceof float[]) {
- ((float[]) list)[i] = (Float) value;
- } else if (list instanceof int[]) {
- ((int[]) list)[i] = (Integer) value;
- } else if (list instanceof long[]) {
- ((long[]) list)[i] = (Long) value;
- } else if (list instanceof short[]) {
- ((short[]) list)[i] = (Short) value;
- } else {
- throw new RuntimeException("The '" + prop.getName() + "' property of " + object + " is not a List or Array.");
- }
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new RuntimeException("Error getting ordinal value from JavaBean. Cause " + e, e);
+ private Object getIndexedProperty(PropertyTokenizer prop, Object object) {
+ Object collection = resolveCollection(prop, object);
+ if (collection instanceof Map) {
+ return ((Map)collection).get(prop.getIndex());
+ }
+ return getListValue(prop, collection);
+ }
+
+ private Object getListValue(PropertyTokenizer prop, Object list) {
+ int i = Integer.parseInt(prop.getIndex());
+ if (list instanceof List) {
+ return ((List) list).get(i);
+ } else if (list instanceof Object[]) {
+ return ((Object[]) list)[i];
+ } else if (list instanceof char[]) {
+ return ((char[]) list)[i];
+ } else if (list instanceof boolean[]) {
+ return ((boolean[]) list)[i];
+ } else if (list instanceof byte[]) {
+ return ((byte[]) list)[i];
+ } else if (list instanceof double[]) {
+ return ((double[]) list)[i];
+ } else if (list instanceof float[]) {
+ return ((float[]) list)[i];
+ } else if (list instanceof int[]) {
+ return ((int[]) list)[i];
+ } else if (list instanceof long[]) {
+ return ((long[]) list)[i];
+ } else if (list instanceof short[]) {
+ return ((short[]) list)[i];
+ } else {
+ throw new RuntimeException("The '" + prop.getName() + "' property of " + list + " is not a List or Array.");
+ }
+ }
+
+ private void setIndexedProperty(PropertyTokenizer prop, Object object, Object value) {
+ Object collection = resolveCollection(prop, object);
+ if (collection instanceof Map) {
+ ((Map)collection).put(prop.getIndex(),value);
+ } else {
+ setListValue(prop, collection, value);
+ }
+ }
+
+ private void setListValue(PropertyTokenizer prop, Object list, Object value) {
+ int i = Integer.parseInt(prop.getIndex());
+ if (list instanceof List) {
+ ((List) list).set(i, value);
+ } else if (list instanceof Object[]) {
+ ((Object[]) list)[i] = value;
+ } else if (list instanceof char[]) {
+ ((char[]) list)[i] = (Character) value;
+ } else if (list instanceof boolean[]) {
+ ((boolean[]) list)[i] = (Boolean) value;
+ } else if (list instanceof byte[]) {
+ ((byte[]) list)[i] = (Byte) value;
+ } else if (list instanceof double[]) {
+ ((double[]) list)[i] = (Double) value;
+ } else if (list instanceof float[]) {
+ ((float[]) list)[i] = (Float) value;
+ } else if (list instanceof int[]) {
+ ((int[]) list)[i] = (Integer) value;
+ } else if (list instanceof long[]) {
+ ((long[]) list)[i] = (Long) value;
+ } else if (list instanceof short[]) {
+ ((short[]) list)[i] = (Short) value;
+ } else {
+ throw new RuntimeException("The '" + prop.getName() + "' property of " + list + " is not a List or Array.");
}
}
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java?rev=690747&r1=690746&r2=690747&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/reflection/MetaObjectTest.java Sun Aug 31 11:18:53 2008
@@ -47,6 +47,14 @@
}
@Test
+ public void shouldGetAndSetMapPairUsingArraySyntax() {
+ RichType rich = new RichType();
+ MetaObject meta = MetaObject.forObject(rich);
+ meta.setValue("richMap[key]", "foo");
+ Assert.assertEquals("foo", meta.getValue("richMap[key]"));
+ }
+
+ @Test
public void shouldGetAndSetNestedMapPair() {
RichType rich = new RichType();
MetaObject meta = MetaObject.forObject(rich);
@@ -55,6 +63,14 @@
}
@Test
+ public void shouldGetAndSetNestedMapPairUsingArraySyntax() {
+ RichType rich = new RichType();
+ MetaObject meta = MetaObject.forObject(rich);
+ meta.setValue("richType.richMap[key]", "foo");
+ Assert.assertEquals("foo", meta.getValue("richType.richMap[key]"));
+ }
+
+ @Test
public void shouldGetAndSetListItem() {
RichType rich = new RichType();
MetaObject meta = MetaObject.forObject(rich);