in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java [553:650]
private <E> Collection<E> parseTableIntoCollection(XmlReader r, Collection<E> l,
ClassMeta<E> type, BeanPropertyMeta pMeta) throws IOException, ParseException, ExecutableException, XMLStreamException {
HtmlTag tag = nextTag(r, TR);
List<String> keys = list();
while (true) {
tag = nextTag(r, TH, xTR);
if (tag == xTR)
break;
keys.add(getElementText(r));
}
int argIndex = 0;
while (true) {
r.nextTag();
tag = HtmlTag.forEvent(this, r);
if (tag == xTABLE)
break;
ClassMeta elementType = null;
String beanType = getAttribute(r, getBeanTypePropertyName(type), null);
if (beanType != null)
elementType = getClassMeta(beanType, pMeta, null);
if (elementType == null)
elementType = type.isArgs() ? type.getArg(argIndex++) : type.getElementType();
if (elementType == null)
elementType = object();
BuilderSwap<E,Object> builder = elementType.getBuilderSwap(this);
if (builder != null || elementType.canCreateNewBean(l)) {
BeanMap m =
builder != null
? toBeanMap(builder.create(this, elementType))
: newBeanMap(l, elementType.getInnerClass())
;
for (String key : keys) {
tag = nextTag(r, xTD, TD, NULL);
if (tag == xTD)
tag = nextTag(r, TD, NULL);
if (tag == NULL) {
m = null;
nextTag(r, xNULL);
break;
}
BeanMapEntry e = m.getProperty(key);
if (e == null) {
//onUnknownProperty(key, m, -1, -1);
parseAnything(object(), r, l, false, null);
} else {
BeanPropertyMeta bpm = e.getMeta();
ClassMeta<?> cm = bpm.getClassMeta();
Object value = parseAnything(cm, r, m.getBean(false), false, bpm);
setName(cm, value, key);
bpm.set(m, key, value);
}
}
l.add(
m == null
? null
: builder != null
? builder.build(this, m.getBean(), elementType)
: (E)m.getBean()
);
} else {
String c = getAttributes(r).get(getBeanTypePropertyName(type.getElementType()));
Map m = (Map)(elementType.isMap() && elementType.canCreateNewInstance(l) ? elementType.newInstance(l)
: newGenericMap(elementType));
for (String key : keys) {
tag = nextTag(r, TD, NULL);
if (tag == NULL) {
m = null;
nextTag(r, xNULL);
break;
}
if (m != null) {
ClassMeta<?> kt = elementType.getKeyType(), vt = elementType.getValueType();
Object value = parseAnything(vt, r, l, false, pMeta);
setName(vt, value, key);
m.put(convertToType(key, kt), value);
}
}
if (m != null && c != null) {
JsonMap m2 = (m instanceof JsonMap ? (JsonMap)m : new JsonMap(m).session(this));
m2.put(getBeanTypePropertyName(type.getElementType()), c);
l.add((E)cast(m2, pMeta, elementType));
} else {
if (m instanceof JsonMap)
l.add((E)convertToType(m, elementType));
else
l.add((E)m);
}
}
nextTag(r, xTR);
}
return l;
}