object = clazz.newInstance();
}
// Read attributes
while (reader.hasMoreAttributeReaders()) {
MessageReader childReader = reader.getNextAttributeReader();
QName name = childReader.getName();
Type type = inf.getType(name);
if (type != null) {
Object writeObj = type.readObject(childReader, context);
if (isProxy) {
delegate.writeProperty(name.getLocalPart(), writeObj);
} else {
writeProperty(name, object, writeObj, clazz, inf);
}
}
}
// Read child elements
while (reader.hasMoreElementReaders()) {
MessageReader childReader = reader.getNextElementReader();
QName name = childReader.getName();
BeanType parent = getBeanTypeWithProperty(name);
Type defaultType = null;
if (parent != null) {
info = parent.getTypeInfo();
defaultType = info.getType(name);
}
Type type = TypeUtil.getReadType(childReader.getXMLStreamReader(), context, defaultType);
// If the xsi:type lookup didn't work or there was none, use the
// normal Type.
if (type == null) {
parent = getBeanTypeWithProperty(name);
if (parent != null) {
inf = parent.getTypeInfo();
type = inf.getType(name);
} else {
type = null;
}
}
if (type != null) {
if (!childReader.isXsiNil()) {
Object writeObj = type.readObject(childReader, context);
if (isProxy) {
delegate.writeProperty(name.getLocalPart(), writeObj);
} else {
writeProperty(name, object, writeObj, clazz, inf);
}
} else {
if (!inf.isNillable(name)) {
throw new DatabindingException(name.getLocalPart()
+ " is nil, but not nillable.");
}
childReader.readToEnd();
}
} else {
childReader.readToEnd();
}
}
return object;
} catch (IllegalAccessException e) {