You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Fábio Pisaruk <pi...@gmail.com> on 2007/09/17 14:54:51 UTC
Mapping xmlbeans arrays using Ibatis
Hello
For those one you that wish Ibatis to be capable of mapping xmlbeans arrays
i´ve changed its code to do so and, as far as i´m concerned it´s working
fine.
There are two scenarios concerning xmlbean arrays:
1-) Map xmlbeans array property using nested resultMap.
<resultMap id="resultMap-Person" class="Person">
<result property="name" column="nome">
<result property="addressArray" resultMap="resultMap-address">
</resultMap>
<select id="get-person" resultMap="resultMap-Person">
select * from person p ,address a where p.person_id=a.person_id and
p.person_id=#value#
</select>
2-) Map xmlbeans array property using nested select
<resultMap id="resultMap-Person" class="Person">
<result property="name" column="nome">
<result property="addressArray" select="resultMap-address"
column="person_id">
</resultMap>
<select id="get-person" resultMap="resultMap-Person">
select * from person p where p.person_id=a.person_id
</select>
<select id="get-addresses" resultMap="resultMap-Address">
select * from address where a.person_id=#value#
</select>
Both issues have been correct and now xmlbeans and ibatis have a smooth
integration.
To make it work you have to change the following methods of the class
com.ibatis.common.beans.ComplexBeanProbe:
- public void setObject(Object object, String name, Object value)
- protected void setProperty(Object object, String name, Object value)
Original Code:
public void setObject(Object object, String name, Object value) {
if (name.indexOf('.') > -1) {
StringTokenizer parser = new StringTokenizer(name, ".");
String property = parser.nextToken();
Object child = object;
while (parser.hasMoreTokens()) {
Class type = getPropertyTypeForSetter(child, property);
Object parent = child;
child = getProperty(parent, property);
if (child == null) {
if (value == null) {
return; // don't instantiate child path if value is null
} else {
try {
child = ResultObjectFactoryUtil.createObjectThroughFactory
(type);
setObject(parent, property, child);
} catch (Exception e) {
throw new ProbeException("Cannot set value of property '" +
name + "' because '" + property + "' is null and cannot be instantiated on
instance of " + type.getName () + ". Cause:" + e.toString(), e);
}
}
}
property = parser.nextToken();
}
setProperty(child, property, value);
} else {
setProperty(object, name, value);
}
}
protected void setProperty(Object object, String name, Object value) {
ClassInfo classCache = ClassInfo.getInstance(object.getClass());
try {
if (name.indexOf('[') > -1) {
setIndexedProperty(object, name, value);
} else {
if (object instanceof Map) {
((Map) object).put(name, value);
} else {
Method method = classCache.getSetter (name);
if (method == null) {
throw new NoSuchMethodException("No SET method for property " +
name + " on instance of " + object.getClass().getName());
}
Object[] params = new Object[1];
params[0] = value;
try {
method.invoke(object, params);
} catch (Throwable t) {
throw ClassInfo.unwrapThrowable(t);
}
}
}
} catch (ProbeException e) {
throw e;
} catch (Throwable t) {
if (object == null) {
throw new ProbeException("Could not set property '" + name + "' for
null reference. Cause: " + t.toString(), t);
} else {
throw new ProbeException("Could not set property '" + name + "' for
" + object.getClass().getName() + ". Cause: " + t.toString(), t);
}
}
}
New code claiming to have correct the two issues exposed above:
public void setObject(Object object, String name, Object value) {
if (name.indexOf('.') > -1) {
StringTokenizer parser = new StringTokenizer(name, ".");
String property = parser.nextToken();
Object child = object;
while (parser.hasMoreTokens()) {
Class type = getPropertyTypeForSetter(child, property);
Object parent = child;
child = getProperty(parent, property);
if (child == null)
if (value == null)
return; // don't instantiate child path if value is
null
else
try {
setObject(parent, property,
ResultObjectFactoryUtil
.createObjectThroughFactory(type));
child = getProperty(parent, property);
} catch (Exception e) {
throw new ProbeException(
"Cannot set value of property '"
+ name
+ "' because '"
+ property
+ "' is null and cannot be
instantiated on instance of "
+ type.getName() + ". Cause:"
+ e.toString(), e);
}
property = parser.nextToken ();
}
setProperty(child, property, value);
} else
setProperty(object, name, value);
}
protected void setProperty(Object object, String name, Object value) {
ClassInfo classCache = ClassInfo.getInstance(object.getClass());
try {
if (name.indexOf('[') > -1) {
setIndexedProperty(object, name, value);
} else {
if (object instanceof Map) {
((Map) object).put(name, value);
} else {
if (classCache.getSetter(name) == null) {
throw new NoSuchMethodException(
"No SET method for property " + name
+ " on instance of "
+ object.getClass().getName());
}
if ((XmlObject[].class.isAssignableFrom(classCache
.getSetter(name).getParameterTypes()[0]))
&& !value.getClass().isArray()) {
String propertyName = name.substring(0, 1)
.toUpperCase().concat(name.substring(1));
Method addNewMethod = object.getClass().getMethod(
"addNew"
+ propertyName.substring (0,
propertyName.length()
- "Array".length()),
null);
Method setIndexedMethod = object.getClass().getMethod(
"set" + propertyName,
new Class[] { int.class,
addNewMethod.getReturnType() });
Method sizeOfMethod = object.getClass().getMethod(
"sizeOf" + propertyName, null);
addNewMethod.invoke(object, null);
setIndexedMethod
.invoke(object, new Object[] {
new Integer(((Integer) sizeOfMethod
.invoke(object, null))
.intValue() - 1), value });
} else {
try {
classCache.getSetter(name).invoke(object,
new Object[] { value });
} catch (Throwable t) {
throw ClassInfo.unwrapThrowable(t);
}
}
}
}
} catch (ProbeException e) {
throw e;
} catch (Throwable t) {
if (object == null) {
throw new ProbeException("Could not set property '" + name
+ "' for null reference. Cause: " + t.toString(),
t);
} else {
throw new ProbeException("Could not set property '" + name
+ "' for " + object.getClass().getName() + ".
Cause: "
+ t.toString(), t);
}
}
}
The most important changes were highlighted.
For those of you interested i can give a detailed explanation about each
change.
That´s all.
--
Visto como se não executa logo a sentença sobre a má obra, o coração dos
filhos dos homens está inteiramente disposto a praticar o mal.
--Nerd´s sign
If you have four classes, Everybody, Somebody, Anybody, and Nobody, if
Somebody has a bug, it could be Anybody 's fault but Nobody really knows,
while Everybody shares responsibility.
"Programming today is a race between software engineers striving to build
bigger and better idiot-proof programs, and the universe trying to build
bigger and better idiots. So far, the universe is winning." - Rick Cook
--
Visto como se não executa logo a sentença sobre a má obra, o coração dos
filhos dos homens está inteiramente disposto a praticar o mal.
--Nerd´s sign
If you have four classes, Everybody, Somebody, Anybody, and Nobody, if
Somebody has a bug, it could be Anybody 's fault but Nobody really knows,
while Everybody shares responsibility.
"Programming today is a race between software engineers striving to build
bigger and better idiot-proof programs, and the universe trying to build
bigger and better idiots. So far, the universe is winning." - Rick Cook
Re: Mapping xmlbeans arrays using Ibatis
Posted by Fábio Pisaruk <pi...@gmail.com>.
You are right but i´ve prefered it to be posted as a separeted thread...
[]´s
On 9/17/07, Brandon Goodin <br...@gmail.com> wrote:
>
> Wasn't this posted three days ago?
>
> Brandon
>
> On 9/17/07, Fábio Pisaruk <pi...@gmail.com> wrote:
> >
> > Hello
> >
> > For those one you that wish Ibatis to be capable of mapping xmlbeans
> > arrays
> > i´ve changed its code to do so and, as far as i´m concerned it´s working
> > fine.
> >
> > There are two scenarios concerning xmlbean arrays:
> >
> > 1-) Map xmlbeans array property using nested resultMap.
> >
> > <resultMap id="resultMap-Person" class="Person">
> > <result property="name" column="nome">
> > <result property="addressArray" resultMap="resultMap-address">
> > </resultMap>
> >
> > <select id="get-person" resultMap="resultMap-Person">
> > select * from person p ,address a where p.person_id=a.person_idand
> > p.person_id=#value#
> > </select>
> >
> > 2-) Map xmlbeans array property using nested select
> > <resultMap id="resultMap-Person" class="Person">
> > <result property="name" column="nome">
> > <result property="addressArray" select="resultMap-address"
> > column="person_id">
> > </resultMap>
> >
> > <select id="get-person" resultMap="resultMap-Person">
> > select * from person p where p.person_id=a.person_id
> > </select>
> >
> > <select id="get-addresses" resultMap="resultMap-Address">
> > select * from address where a.person_id=#value#
> > </select>
> >
> >
> > Both issues have been correct and now xmlbeans and ibatis have a smooth
> > integration.
> > To make it work you have to change the following methods of the class
> > com.ibatis.common.beans.ComplexBeanProbe:
> > - public void setObject(Object object, String name, Object value)
> > - protected void setProperty(Object object, String name, Object value)
> >
> > Original Code:
> >
> > public void setObject(Object object, String name, Object value) {
> > if (name.indexOf('.') > -1) {
> > StringTokenizer parser = new StringTokenizer(name, ".");
> > String property = parser.nextToken();
> > Object child = object;
> > while (parser.hasMoreTokens()) {
> > Class type = getPropertyTypeForSetter(child, property);
> > Object parent = child;
> > child = getProperty(parent, property);
> > if (child == null) {
> > if (value == null) {
> > return; // don't instantiate child path if value is null
> > } else {
> > try {
> > child = ResultObjectFactoryUtil.createObjectThroughFactory
> > (type);
> > setObject(parent, property, child);
> > } catch (Exception e) {
> > throw new ProbeException("Cannot set value of property '"
> > + name + "' because '" + property + "' is null and cannot be instantiated on
> > instance of " + type.getName () + ". Cause:" + e.toString(), e);
> > }
> > }
> > }
> > property = parser.nextToken();
> > }
> > setProperty(child, property, value);
> > } else {
> > setProperty(object, name, value);
> > }
> > }
> >
> > protected void setProperty(Object object, String name, Object value) {
> > ClassInfo classCache = ClassInfo.getInstance(object.getClass());
> > try {
> > if (name.indexOf('[') > -1) {
> > setIndexedProperty(object, name, value);
> > } else {
> > if (object instanceof Map) {
> > ((Map) object).put(name, value);
> > } else {
> > Method method = classCache.getSetter (name);
> > if (method == null) {
> > throw new NoSuchMethodException("No SET method for property
> > " + name + " on instance of " + object.getClass().getName());
> > }
> > Object[] params = new Object[1];
> > params[0] = value;
> > try {
> > method.invoke(object, params);
> > } catch (Throwable t) {
> > throw ClassInfo.unwrapThrowable(t);
> > }
> > }
> > }
> > } catch (ProbeException e) {
> > throw e;
> > } catch (Throwable t) {
> > if (object == null) {
> > throw new ProbeException("Could not set property '" + name + "'
> > for null reference. Cause: " + t.toString(), t);
> > } else {
> > throw new ProbeException("Could not set property '" + name + "'
> > for " + object.getClass().getName() + ". Cause: " + t.toString(), t);
> > }
> > }
> > }
> >
> > New code claiming to have correct the two issues exposed above:
> >
> > public void setObject(Object object, String name, Object value) {
> > if (name.indexOf('.') > -1) {
> > StringTokenizer parser = new StringTokenizer(name, ".");
> > String property = parser.nextToken();
> > Object child = object;
> > while (parser.hasMoreTokens()) {
> > Class type = getPropertyTypeForSetter(child, property);
> > Object parent = child;
> > child = getProperty(parent, property);
> > if (child == null)
> > if (value == null)
> > return; // don't instantiate child path if value
> > is null
> > else
> > try {
> > setObject(parent, property,
> > ResultObjectFactoryUtil
> > .createObjectThroughFactory(type));
> > child = getProperty(parent, property);
> > } catch (Exception e) {
> > throw new ProbeException(
> > "Cannot set value of property '"
> > + name
> > + "' because '"
> > + property
> > + "' is null and cannot be
> > instantiated on instance of "
> > + type.getName() + ".
> > Cause:"
> > + e.toString(), e);
> > }
> > property = parser.nextToken ();
> > }
> > setProperty(child, property, value);
> > } else
> > setProperty(object, name, value);
> > }
> >
> > protected void setProperty(Object object, String name, Object value) {
> > ClassInfo classCache = ClassInfo.getInstance(object.getClass());
> > try {
> > if (name.indexOf('[') > -1) {
> > setIndexedProperty(object, name, value);
> > } else {
> > if (object instanceof Map) {
> > ((Map) object).put(name, value);
> > } else {
> > if (classCache.getSetter(name) == null) {
> > throw new NoSuchMethodException(
> > "No SET method for property " + name
> > + " on instance of "
> > + object.getClass().getName());
> > }
> > if ((XmlObject[].class.isAssignableFrom(classCache
> > .getSetter(name).getParameterTypes()[0]))
> > && !value.getClass().isArray()) {
> > String propertyName = name.substring(0, 1)
> > .toUpperCase().concat(name.substring
> > (1));
> > Method addNewMethod = object.getClass
> > ().getMethod(
> > "addNew"
> > + propertyName.substring (0,
> > propertyName.length()
> > -
> > "Array".length()),
> > null);
> > Method setIndexedMethod = object.getClass().getMethod(
> >
> > "set" + propertyName,
> > new Class[] { int.class,
> > addNewMethod.getReturnType() });
> > Method sizeOfMethod = object.getClass
> > ().getMethod(
> > "sizeOf" + propertyName, null);
> > addNewMethod.invoke(object, null);
> > setIndexedMethod
> > .invoke(object, new Object[] {
> > new Integer(((Integer)
> > sizeOfMethod
> > .invoke(object, null))
> > .intValue() - 1), value
> > });
> > } else {
> > try {
> > classCache.getSetter(name).invoke(object,
> > new Object[] { value });
> > } catch (Throwable t) {
> > throw ClassInfo.unwrapThrowable(t);
> > }
> > }
> > }
> > }
> > } catch (ProbeException e) {
> > throw e;
> > } catch (Throwable t) {
> > if (object == null) {
> > throw new ProbeException("Could not set property '" +
> > name
> > + "' for null reference. Cause: " + t.toString(),
> > t);
> > } else {
> > throw new ProbeException("Could not set property '" +
> > name
> > + "' for " + object.getClass().getName() + ".
> > Cause: "
> > + t.toString(), t);
> > }
> > }
> > }
> >
> > The most important changes were highlighted.
> > For those of you interested i can give a detailed explanation about each
> > change.
> >
> > That´s all.
> >
> > --
> > Visto como se não executa logo a sentença sobre a má obra, o coração dos
> > filhos dos homens está inteiramente disposto a praticar o mal.
> >
> >
> > --Nerd´s sign
> >
> > If you have four classes, Everybody, Somebody, Anybody, and Nobody, if
> > Somebody has a bug, it could be Anybody 's fault but Nobody really knows,
> > while Everybody shares responsibility.
> >
> > "Programming today is a race between software engineers striving to
> > build bigger and better idiot-proof programs, and the universe trying to
> > build bigger and better idiots. So far, the universe is winning." - Rick
> > Cook
> >
> > --
> > Visto como se não executa logo a sentença sobre a má obra, o coração dos
> > filhos dos homens está inteiramente disposto a praticar o mal.
> >
> >
> > --Nerd´s sign
> >
> > If you have four classes, Everybody, Somebody, Anybody, and Nobody, if
> > Somebody has a bug, it could be Anybody 's fault but Nobody really knows,
> > while Everybody shares responsibility.
> >
> > "Programming today is a race between software engineers striving to
> > build bigger and better idiot-proof programs, and the universe trying to
> > build bigger and better idiots. So far, the universe is winning." - Rick
> > Cook
>
>
>
--
Visto como se não executa logo a sentença sobre a má obra, o coração dos
filhos dos homens está inteiramente disposto a praticar o mal.
--Nerd´s sign
If you have four classes, Everybody, Somebody, Anybody, and Nobody, if
Somebody has a bug, it could be Anybody 's fault but Nobody really knows,
while Everybody shares responsibility.
"Programming today is a race between software engineers striving to build
bigger and better idiot-proof programs, and the universe trying to build
bigger and better idiots. So far, the universe is winning." - Rick Cook
Re: Mapping xmlbeans arrays using Ibatis
Posted by Brandon Goodin <br...@gmail.com>.
Wasn't this posted three days ago?
Brandon
On 9/17/07, Fábio Pisaruk <pi...@gmail.com> wrote:
>
> Hello
>
> For those one you that wish Ibatis to be capable of mapping xmlbeans
> arrays
> i´ve changed its code to do so and, as far as i´m concerned it´s working
> fine.
>
> There are two scenarios concerning xmlbean arrays:
>
> 1-) Map xmlbeans array property using nested resultMap.
>
> <resultMap id="resultMap-Person" class="Person">
> <result property="name" column="nome">
> <result property="addressArray" resultMap="resultMap-address">
> </resultMap>
>
> <select id="get-person" resultMap="resultMap-Person">
> select * from person p ,address a where p.person_id=a.person_id and
> p.person_id=#value#
> </select>
>
> 2-) Map xmlbeans array property using nested select
> <resultMap id="resultMap-Person" class="Person">
> <result property="name" column="nome">
> <result property="addressArray" select="resultMap-address"
> column="person_id">
> </resultMap>
>
> <select id="get-person" resultMap="resultMap-Person">
> select * from person p where p.person_id=a.person_id
> </select>
>
> <select id="get-addresses" resultMap="resultMap-Address">
> select * from address where a.person_id=#value#
> </select>
>
>
> Both issues have been correct and now xmlbeans and ibatis have a smooth
> integration.
> To make it work you have to change the following methods of the class
> com.ibatis.common.beans.ComplexBeanProbe:
> - public void setObject(Object object, String name, Object value)
> - protected void setProperty(Object object, String name, Object value)
>
> Original Code:
>
> public void setObject(Object object, String name, Object value) {
> if (name.indexOf('.') > -1) {
> StringTokenizer parser = new StringTokenizer(name, ".");
> String property = parser.nextToken();
> Object child = object;
> while (parser.hasMoreTokens()) {
> Class type = getPropertyTypeForSetter(child, property);
> Object parent = child;
> child = getProperty(parent, property);
> if (child == null) {
> if (value == null) {
> return; // don't instantiate child path if value is null
> } else {
> try {
> child = ResultObjectFactoryUtil.createObjectThroughFactory
> (type);
> setObject(parent, property, child);
> } catch (Exception e) {
> throw new ProbeException("Cannot set value of property '" +
> name + "' because '" + property + "' is null and cannot be instantiated on
> instance of " + type.getName () + ". Cause:" + e.toString(), e);
> }
> }
> }
> property = parser.nextToken();
> }
> setProperty(child, property, value);
> } else {
> setProperty(object, name, value);
> }
> }
>
> protected void setProperty(Object object, String name, Object value) {
> ClassInfo classCache = ClassInfo.getInstance(object.getClass());
> try {
> if (name.indexOf('[') > -1) {
> setIndexedProperty(object, name, value);
> } else {
> if (object instanceof Map) {
> ((Map) object).put(name, value);
> } else {
> Method method = classCache.getSetter (name);
> if (method == null) {
> throw new NoSuchMethodException("No SET method for property "
> + name + " on instance of " + object.getClass().getName());
> }
> Object[] params = new Object[1];
> params[0] = value;
> try {
> method.invoke(object, params);
> } catch (Throwable t) {
> throw ClassInfo.unwrapThrowable(t);
> }
> }
> }
> } catch (ProbeException e) {
> throw e;
> } catch (Throwable t) {
> if (object == null) {
> throw new ProbeException("Could not set property '" + name + "'
> for null reference. Cause: " + t.toString(), t);
> } else {
> throw new ProbeException("Could not set property '" + name + "'
> for " + object.getClass().getName() + ". Cause: " + t.toString(), t);
> }
> }
> }
>
> New code claiming to have correct the two issues exposed above:
>
> public void setObject(Object object, String name, Object value) {
> if (name.indexOf('.') > -1) {
> StringTokenizer parser = new StringTokenizer(name, ".");
> String property = parser.nextToken();
> Object child = object;
> while (parser.hasMoreTokens()) {
> Class type = getPropertyTypeForSetter(child, property);
> Object parent = child;
> child = getProperty(parent, property);
> if (child == null)
> if (value == null)
> return; // don't instantiate child path if value
> is null
> else
> try {
> setObject(parent, property,
> ResultObjectFactoryUtil
> .createObjectThroughFactory(type));
> child = getProperty(parent, property);
> } catch (Exception e) {
> throw new ProbeException(
> "Cannot set value of property '"
> + name
> + "' because '"
> + property
> + "' is null and cannot be
> instantiated on instance of "
> + type.getName() + ". Cause:"
> + e.toString(), e);
> }
> property = parser.nextToken ();
> }
> setProperty(child, property, value);
> } else
> setProperty(object, name, value);
> }
>
> protected void setProperty(Object object, String name, Object value) {
> ClassInfo classCache = ClassInfo.getInstance(object.getClass());
> try {
> if (name.indexOf('[') > -1) {
> setIndexedProperty(object, name, value);
> } else {
> if (object instanceof Map) {
> ((Map) object).put(name, value);
> } else {
> if (classCache.getSetter(name) == null) {
> throw new NoSuchMethodException(
> "No SET method for property " + name
> + " on instance of "
> + object.getClass().getName());
> }
> if ((XmlObject[].class.isAssignableFrom(classCache
> .getSetter(name).getParameterTypes()[0]))
> && !value.getClass().isArray()) {
> String propertyName = name.substring(0, 1)
> .toUpperCase().concat(name.substring(1));
> Method addNewMethod = object.getClass().getMethod(
> "addNew"
> + propertyName.substring (0,
> propertyName.length()
> -
> "Array".length()),
> null);
> Method setIndexedMethod = object.getClass().getMethod(
>
> "set" + propertyName,
> new Class[] { int.class,
> addNewMethod.getReturnType() });
> Method sizeOfMethod = object.getClass().getMethod(
> "sizeOf" + propertyName, null);
> addNewMethod.invoke(object, null);
> setIndexedMethod
> .invoke(object, new Object[] {
> new Integer(((Integer)
> sizeOfMethod
> .invoke(object, null))
> .intValue() - 1), value
> });
> } else {
> try {
> classCache.getSetter(name).invoke(object,
> new Object[] { value });
> } catch (Throwable t) {
> throw ClassInfo.unwrapThrowable(t);
> }
> }
> }
> }
> } catch (ProbeException e) {
> throw e;
> } catch (Throwable t) {
> if (object == null) {
> throw new ProbeException("Could not set property '" + name
> + "' for null reference. Cause: " + t.toString(),
> t);
> } else {
> throw new ProbeException("Could not set property '" + name
> + "' for " + object.getClass().getName() + ".
> Cause: "
> + t.toString(), t);
> }
> }
> }
>
> The most important changes were highlighted.
> For those of you interested i can give a detailed explanation about each
> change.
>
> That´s all.
>
> --
> Visto como se não executa logo a sentença sobre a má obra, o coração dos
> filhos dos homens está inteiramente disposto a praticar o mal.
>
>
> --Nerd´s sign
>
> If you have four classes, Everybody, Somebody, Anybody, and Nobody, if
> Somebody has a bug, it could be Anybody 's fault but Nobody really knows,
> while Everybody shares responsibility.
>
> "Programming today is a race between software engineers striving to build
> bigger and better idiot-proof programs, and the universe trying to build
> bigger and better idiots. So far, the universe is winning." - Rick Cook
>
> --
> Visto como se não executa logo a sentença sobre a má obra, o coração dos
> filhos dos homens está inteiramente disposto a praticar o mal.
>
>
> --Nerd´s sign
>
> If you have four classes, Everybody, Somebody, Anybody, and Nobody, if
> Somebody has a bug, it could be Anybody 's fault but Nobody really knows,
> while Everybody shares responsibility.
>
> "Programming today is a race between software engineers striving to build
> bigger and better idiot-proof programs, and the universe trying to build
> bigger and better idiots. So far, the universe is winning." - Rick Cook