in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlParserSession.java [648:802]
private <T> BeanMap<T> parseIntoBean(XmlReader r, BeanMap<T> m, boolean isNil) throws IOException, ParseException, ExecutableException, XMLStreamException {
BeanMeta<?> bMeta = m.getMeta();
XmlBeanMeta xmlMeta = getXmlBeanMeta(bMeta);
for (int i = 0; i < r.getAttributeCount(); i++) {
String key = getAttributeName(r, i);
if (! ("nil".equals(key) || isSpecialAttr(key))) {
String val = r.getAttributeValue(i);
String ns = r.getAttributeNamespace(i);
BeanPropertyMeta bpm = xmlMeta.getPropertyMeta(key);
if (bpm == null) {
if (xmlMeta.getAttrsProperty() != null) {
xmlMeta.getAttrsProperty().add(m, key, key, val);
} else if (ns == null) {
onUnknownProperty(key, m, val);
}
} else {
try {
bpm.set(m, key, val);
} catch (BeanRuntimeException e) {
onBeanSetterException(bpm, e);
throw e;
}
}
}
}
BeanPropertyMeta cp = xmlMeta.getContentProperty();
XmlFormat cpf = xmlMeta.getContentFormat();
boolean trim = cp == null || ! cpf.isOneOf(MIXED_PWS, TEXT_PWS);
ClassMeta<?> cpcm = (cp == null ? object() : cp.getClassMeta());
StringBuilder sb = null;
BeanRegistry breg = cp == null ? null : cp.getBeanRegistry();
LinkedList<Object> l = null;
int depth = 0;
do {
int event = r.next();
String currAttr;
// We only care about text in MIXED mode.
// Ignore if in ELEMENTS mode.
if (event == CHARACTERS) {
if (cp != null && cpf.isOneOf(MIXED, MIXED_PWS)) {
if (cpcm.isCollectionOrArray()) {
if (l == null)
l = new LinkedList<>();
l.add(getText(r, false));
} else {
cp.set(m, null, getText(r, trim));
}
} else if (cpf != ELEMENTS) {
String s = getText(r, trim);
if (s != null) {
if (sb == null)
sb = getStringBuilder();
sb.append(s);
}
} else {
// Do nothing...we're in ELEMENTS mode.
}
} else if (event == START_ELEMENT) {
if (cp != null && cpf.isOneOf(TEXT, TEXT_PWS)) {
String s = parseText(r);
if (s != null) {
if (sb == null)
sb = getStringBuilder();
sb.append(s);
}
depth--;
} else if (cpf == XMLTEXT) {
if (sb == null)
sb = getStringBuilder();
sb.append(getElementAsString(r));
depth++;
} else if (cp != null && cpf.isOneOf(MIXED, MIXED_PWS)) {
if (isWhitespaceElement(r) && (breg == null || ! breg.hasName(r.getLocalName()))) {
if (cpcm.isCollectionOrArray()) {
if (l == null)
l = new LinkedList<>();
l.add(parseWhitespaceElement(r));
} else {
cp.set(m, null, parseWhitespaceElement(r));
}
} else {
if (cpcm.isCollectionOrArray()) {
if (l == null)
l = new LinkedList<>();
l.add(parseAnything(cpcm.getElementType(), cp.getName(), r, m.getBean(false), false, cp));
} else {
cp.set(m, null, parseAnything(cpcm, cp.getName(), r, m.getBean(false), false, cp));
}
}
} else if (cp != null && cpf == ELEMENTS) {
cp.add(m, null, parseAnything(cpcm.getElementType(), cp.getName(), r, m.getBean(false), false, cp));
} else {
currAttr = getNameProperty(r);
if (currAttr == null)
currAttr = getElementName(r);
BeanPropertyMeta pMeta = xmlMeta.getPropertyMeta(currAttr);
if (pMeta == null) {
Object value = parseAnything(object(), currAttr, r, m.getBean(false), false, null);
onUnknownProperty(currAttr, m, value);
} else {
setCurrentProperty(pMeta);
XmlFormat xf = getXmlBeanPropertyMeta(pMeta).getXmlFormat();
if (xf == COLLAPSED) {
ClassMeta<?> et = pMeta.getClassMeta().getElementType();
Object value = parseAnything(et, currAttr, r, m.getBean(false), false, pMeta);
setName(et, value, currAttr);
pMeta.add(m, currAttr, value);
} else if (xf == ATTR) {
pMeta.set(m, currAttr, getAttributeValue(r, 0));
r.nextTag();
} else {
ClassMeta<?> cm = pMeta.getClassMeta();
Object value = parseAnything(cm, currAttr, r, m.getBean(false), false, pMeta);
setName(cm, value, currAttr);
pMeta.set(m, currAttr, value);
}
setCurrentProperty(null);
}
}
} else if (event == END_ELEMENT) {
if (depth > 0) {
if (cpf == XMLTEXT) {
if (sb == null)
sb = getStringBuilder();
sb.append(getElementAsString(r));
}
else
throw new ParseException("End element found where one was not expected. {0}", XmlUtils.toReadableEvent(r));
}
depth--;
} else if (event == COMMENT) {
// Ignore comments.
} else {
throw new ParseException("Unexpected event type: {0}", XmlUtils.toReadableEvent(r));
}
} while (depth >= 0);
if (cp != null && ! isNil) {
if (sb != null)
cp.set(m, null, sb.toString());
else if (l != null)
cp.set(m, null, XmlUtils.collapseTextNodes(l));
else if (cpcm.isCollectionOrArray()) {
Object o = cp.get(m, null);
if (o == null)
cp.set(m, cp.getName(), list());
}
}
returnStringBuilder(sb);
return m;
}