in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java [443:565]
protected <T> T parseAnything(ClassMeta<T> eType, String currAttr, XmlReader r,
Object outer, boolean isRoot, BeanPropertyMeta pMeta) throws IOException, ParseException, ExecutableException, XMLStreamException {
if (eType == null)
eType = (ClassMeta<T>)object();
ObjectSwap<T,Object> swap = (ObjectSwap<T,Object>)eType.getSwap(this);
BuilderSwap<T,Object> builder = (BuilderSwap<T,Object>)eType.getBuilderSwap(this);
ClassMeta<?> sType = null;
if (builder != null)
sType = builder.getBuilderClassMeta(this);
else if (swap != null)
sType = swap.getSwapClassMeta(this);
else
sType = eType;
if (sType.isOptional())
return (T)optional(parseAnything(eType.getElementType(), currAttr, r, outer, isRoot, pMeta));
setCurrentClass(sType);
String wrapperAttr = (isRoot && isPreserveRootElement()) ? r.getName().getLocalPart() : null;
String typeAttr = r.getAttributeValue(null, getBeanTypePropertyName(eType));
boolean isNil = "true".equals(r.getAttributeValue(null, "nil"));
int jsonType = getJsonType(typeAttr);
String elementName = getElementName(r);
if (jsonType == 0) {
if (elementName == null || elementName.equals(currAttr))
jsonType = UNKNOWN;
else {
typeAttr = elementName;
jsonType = getJsonType(elementName);
}
}
ClassMeta tcm = getClassMeta(typeAttr, pMeta, eType);
if (tcm == null && elementName != null && ! elementName.equals(currAttr))
tcm = getClassMeta(elementName, pMeta, eType);
if (tcm != null)
sType = eType = tcm;
Object o = null;
if (jsonType == NULL) {
r.nextTag(); // Discard end tag
return null;
}
if (sType.isObject()) {
if (jsonType == OBJECT) {
JsonMap m = new JsonMap(this);
parseIntoMap(r, m, string(), object(), pMeta);
if (wrapperAttr != null)
m = new JsonMap(this).append(wrapperAttr, m);
o = cast(m, pMeta, eType);
} else if (jsonType == ARRAY)
o = parseIntoCollection(r, new JsonList(this), null, pMeta);
else if (jsonType == STRING) {
o = getElementText(r);
if (sType.isChar())
o = parseCharacter(o);
}
else if (jsonType == NUMBER)
o = parseNumber(getElementText(r), null);
else if (jsonType == BOOLEAN)
o = Boolean.parseBoolean(getElementText(r));
else if (jsonType == UNKNOWN)
o = getUnknown(r);
} else if (sType.isBoolean()) {
o = Boolean.parseBoolean(getElementText(r));
} else if (sType.isCharSequence()) {
o = getElementText(r);
} else if (sType.isChar()) {
o = parseCharacter(getElementText(r));
} else if (sType.isMap()) {
Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : newGenericMap(sType));
o = parseIntoMap(r, m, sType.getKeyType(), sType.getValueType(), pMeta);
if (wrapperAttr != null)
o = new JsonMap(this).append(wrapperAttr, m);
} else if (sType.isCollection()) {
Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance(outer) : new JsonList(this));
o = parseIntoCollection(r, l, sType, pMeta);
} else if (sType.isNumber()) {
o = parseNumber(getElementText(r), (Class<? extends Number>)sType.getInnerClass());
} else if (builder != null || sType.canCreateNewBean(outer)) {
if (getXmlClassMeta(sType).getFormat() == COLLAPSED) {
String fieldName = r.getLocalName();
BeanMap<?> m = builder != null ? toBeanMap(builder.create(this, eType)) : newBeanMap(outer, sType.getInnerClass());
BeanPropertyMeta bpm = getXmlBeanMeta(m.getMeta()).getPropertyMeta(fieldName);
ClassMeta<?> cm = m.getMeta().getClassMeta();
Object value = parseAnything(cm, currAttr, r, m.getBean(false), false, null);
setName(cm, value, currAttr);
bpm.set(m, currAttr, value);
o = builder != null ? builder.build(this, m.getBean(), eType) : m.getBean();
} else {
BeanMap m = builder != null ? toBeanMap(builder.create(this, eType)) : newBeanMap(outer, sType.getInnerClass());
m = parseIntoBean(r, m, isNil);
o = builder != null ? builder.build(this, m.getBean(), eType) : m.getBean();
}
} else if (sType.isArray() || sType.isArgs()) {
ArrayList l = (ArrayList)parseIntoCollection(r, list(), sType, pMeta);
o = toArray(sType, l);
} else if (sType.canCreateNewInstanceFromString(outer)) {
o = sType.newInstanceFromString(outer, getElementText(r));
} else if (sType.getProxyInvocationHandler() != null) {
JsonMap m = new JsonMap(this);
parseIntoMap(r, m, string(), object(), pMeta);
if (wrapperAttr != null)
m = new JsonMap(this).append(wrapperAttr, m);
o = newBeanMap(outer, sType.getInnerClass()).load(m).getBean();
} else {
throw new ParseException(this,
"Class ''{0}'' could not be instantiated. Reason: ''{1}'', property: ''{2}''",
sType.getInnerClass().getName(), sType.getNotABeanReason(), pMeta == null ? null : pMeta.getName());
}
if (swap != null && o != null)
o = unswap(swap, o, eType);
if (outer != null)
setParent(eType, o, outer);
return (T)o;
}