in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java [691:845]
private void serializeCollection(XmlWriter out, Object in, ClassMeta<?> sType, ClassMeta<?> eType, String name, BeanPropertyMeta ppMeta) throws SerializeException {
HtmlClassMeta cHtml = getHtmlClassMeta(sType);
HtmlBeanPropertyMeta bpHtml = getHtmlBeanPropertyMeta(ppMeta);
Collection c = (sType.isCollection() ? (Collection)in : toList(sType.getInnerClass(), in));
boolean isCdc = cHtml.isHtmlCdc() || bpHtml.isHtmlCdc();
boolean isSdc = cHtml.isHtmlSdc() || bpHtml.isHtmlSdc();
boolean isDc = isCdc || isSdc;
int i = indent;
if (c.isEmpty()) {
out.appendln(i, "<ul></ul>");
return;
}
String type2 = null;
if (sType != eType)
type2 = sType.getDictionaryName();
if (type2 == null)
type2 = "array";
c = sort(c);
String btpn = getBeanTypePropertyName(eType);
// Look at the objects to see how we're going to handle them. Check the first object to see how we're going to
// handle this.
// If it's a map or bean, then we'll create a table.
// Otherwise, we'll create a list.
Object[] th = getTableHeaders(c, bpHtml);
if (th != null) {
out.oTag(i, "table").attr(btpn, type2).w('>').nl(i+1);
if (th.length > 0) {
out.sTag(i+1, "tr").nl(i+2);
for (Object key : th) {
out.sTag(i+2, "th");
out.text(convertToType(key, String.class));
out.eTag("th").nl(i+2);
}
out.ie(i+1).eTag("tr").nl(i+1);
} else {
th = null;
}
for (Object o : c) {
ClassMeta<?> cm = getClassMetaForObject(o);
if (cm != null && cm.getSwap(this) != null) {
ObjectSwap swap = cm.getSwap(this);
o = swap(swap, o);
cm = swap.getSwapClassMeta(this);
}
out.oTag(i+1, "tr");
String typeName = (cm == null ? null : cm.getDictionaryName());
String typeProperty = getBeanTypePropertyName(cm);
if (typeName != null && eType.getElementType() != cm)
out.attr(typeProperty, typeName);
out.cTag().nl(i+2);
if (cm == null) {
out.i(i+2);
serializeAnything(out, o, null, null, null, 1, false, false);
out.nl(0);
} else if (cm.isMap() && ! (cm.isBeanMap())) {
Map m2 = sort((Map)o);
if (th == null)
th = m2.keySet().toArray(new Object[m2.size()]);
for (Object k : th) {
out.sTag(i+2, "td");
ContentResult cr = serializeAnything(out, m2.get(k), eType.getElementType(), toString(k), null, 2, false, true);
if (cr == CR_ELEMENTS)
out.i(i+2);
out.eTag("td").nl(i+2);
}
} else {
BeanMap m2 = toBeanMap(o);
if (th == null)
th = m2.keySet().toArray(new Object[m2.size()]);
for (Object k : th) {
BeanMapEntry p = m2.getProperty(toString(k));
BeanPropertyMeta pMeta = p.getMeta();
if (pMeta.canRead()) {
Object value = p.getValue();
String link = null, anchorText = null;
if (! pMeta.getClassMeta().isCollectionOrArray()) {
link = m2.resolveVars(getLink(pMeta));
anchorText = m2.resolveVars(getAnchorText(pMeta));
}
if (anchorText != null)
value = anchorText;
String style = getStyle(this, pMeta, value);
out.oTag(i+2, "td");
if (style != null)
out.attr("style", style);
out.cTag();
if (link != null)
out.oTag("a").attrUri("href", link).cTag();
ContentResult cr = serializeAnything(out, value, pMeta.getClassMeta(), p.getKey().toString(), pMeta, 2, false, true);
if (cr == CR_ELEMENTS)
out.i(i+2);
if (link != null)
out.eTag("a");
out.eTag("td").nl(i+2);
}
}
}
out.ie(i+1).eTag("tr").nl(i+1);
}
out.ie(i).eTag("table").nl(i);
} else {
out.oTag(i, isDc ? "p" : "ul");
if (! type2.equals("array"))
out.attr(btpn, type2);
out.w('>').nl(i+1);
boolean isFirst = true;
for (Object o : c) {
if (isDc && ! isFirst)
out.append(isCdc ? ", " : " ");
if (! isDc)
out.oTag(i+1, "li");
String style = getStyle(this, ppMeta, o);
String link = getLink(ppMeta);
if (style != null && ! isDc)
out.attr("style", style);
if (! isDc)
out.cTag();
if (link != null)
out.oTag(i+2, "a").attrUri("href", link.replace("{#}", stringify(o))).cTag();
ContentResult cr = serializeAnything(out, o, eType.getElementType(), name, null, 1, false, true);
if (link != null)
out.eTag("a");
if (cr == CR_ELEMENTS)
out.ie(i+1);
if (! isDc)
out.eTag("li").nl(i+1);
isFirst = false;
}
out.ie(i).eTag(isDc ? "p" : "ul").nl(i);
}
}