{
int refId = Integer.parseInt(changeset.attributeValue("refid"));
if (changeset.elements("member").size() > 0)
{
Wrapper target = model.getCallContext().getOutRefs().get(refId);
if (!(target instanceof BeanWrapper))
{
throw new IllegalStateException("Changeset for refId [" +
refId + "] does not reference a valid bean object");
}
for (Element member : (List<Element>) changeset.elements("member"))
{
String name = member.attributeValue("name");
Wrapper source = model.getCallContext().createWrapperFromElement(
(Element) member.elementIterator().next());
if (source instanceof BagWrapper)
{
Object targetBag = ((BeanWrapper) target).getBeanProperty(name);
if (targetBag == null)
{
((BeanWrapper) target).setBeanProperty(name, source);
}
else
{
Type t = ((BeanWrapper) target).getBeanPropertyType(name);
if (!cloneBagContents(source.convert(t), ((Wrapper) targetBag).getValue()))
{
((BeanWrapper) target).setBeanProperty(name, source);
}
}
}
else if (source instanceof MapWrapper)
{
Object targetMap = ((BeanWrapper) target).getBeanProperty(name);
if (!Map.class.isAssignableFrom(targetMap.getClass()))
{
throw new IllegalStateException("Cannot assign Map value " +
"to non Map property [" + target.getClass().getName() +
"." + name + "]");
}
if (targetMap == null)
{
((BeanWrapper) target).setBeanProperty(name, source);
}
else
{
Type t = ((BeanWrapper) target).getBeanPropertyType(name);
cloneMapContents((Map<Object,Object>) source.convert(t),
(Map<Object,Object>) targetMap);
}
}
else
{
((BeanWrapper) target).setBeanProperty(name, source);
}
}
}
if (changeset.elements("bag").size() > 0)
{
Wrapper target = model.getCallContext().getOutRefs().get(refId);
Wrapper source = model.getCallContext().createWrapperFromElement(
(Element) changeset.element("bag"));
cloneBagContents(source.convert(target.getValue().getClass()),
target.getValue());
}
else if (changeset.elements("map").size() > 0)
{
Wrapper target = model.getCallContext().getOutRefs().get(refId);
Wrapper source = model.getCallContext().createWrapperFromElement(
(Element) changeset.element("map"));
cloneMapContents((Map<Object,Object>) source.convert(target.getValue().getClass()),
(Map<Object,Object>) target.getValue());
}
}
}