in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlSerializerSession.java [700:835]
private ContentResult serializeBeanMap(XmlWriter out, BeanMap<?> m,
Namespace elementNs, boolean isCollapsed, boolean isMixedOrText) throws SerializeException {
boolean hasChildren = false;
BeanMeta<?> bm = m.getMeta();
List<BeanPropertyValue> lp = new ArrayList<>();
Predicate<Object> checkNull = x -> isKeepNullProperties() || x != null;
m.forEachValue(checkNull, (pMeta,key,value,thrown) -> {
lp.add(new BeanPropertyValue(pMeta, key, value, thrown));
});
XmlBeanMeta xbm = getXmlBeanMeta(bm);
Set<String>
attrs = xbm.getAttrPropertyNames(),
elements = xbm.getElementPropertyNames(),
collapsedElements = xbm.getCollapsedPropertyNames();
String
attrsProperty = xbm.getAttrsPropertyName(),
contentProperty = xbm.getContentPropertyName();
XmlFormat cf = null;
Object content = null;
ClassMeta<?> contentType = null;
for (BeanPropertyValue p : lp) {
String n = p.getName();
if (attrs.contains(n) || attrs.contains("*") || n.equals(attrsProperty)) {
BeanPropertyMeta pMeta = p.getMeta();
if (pMeta.canRead()) {
ClassMeta<?> cMeta = p.getClassMeta();
String key = p.getName();
Object value = p.getValue();
Throwable t = p.getThrown();
if (t != null)
onBeanGetterException(pMeta, t);
if (canIgnoreValue(cMeta, key, value))
continue;
XmlBeanPropertyMeta bpXml = getXmlBeanPropertyMeta(pMeta);
Namespace ns = (isEnableNamespaces() && bpXml.getNamespace() != elementNs ? bpXml.getNamespace() : null);
if (pMeta.isUri() ) {
out.attrUri(ns, key, value);
} else if (n.equals(attrsProperty)) {
if (value instanceof BeanMap) {
BeanMap<?> bm2 = (BeanMap)value;
bm2.forEachValue(x -> true, (pMeta2,key2,value2,thrown2) -> {
if (thrown2 != null)
onBeanGetterException(pMeta, thrown2);
out.attr(ns, key2, value2);
});
} else /* Map */ {
Map m2 = (Map)value;
if (m2 != null)
m2.forEach((k,v) -> out.attr(ns, stringify(k), v));
}
} else {
out.attr(ns, key, value);
}
}
}
}
boolean
hasContent = false,
preserveWhitespace = false,
isVoidElement = xbm.getContentFormat() == VOID;
for (BeanPropertyValue p : lp) {
BeanPropertyMeta pMeta = p.getMeta();
if (pMeta.canRead()) {
ClassMeta<?> cMeta = p.getClassMeta();
String n = p.getName();
if (n.equals(contentProperty)) {
content = p.getValue();
contentType = p.getClassMeta();
hasContent = true;
cf = xbm.getContentFormat();
if (cf.isOneOf(MIXED,MIXED_PWS,TEXT,TEXT_PWS,XMLTEXT))
isMixedOrText = true;
if (cf.isOneOf(MIXED_PWS, TEXT_PWS))
preserveWhitespace = true;
if (contentType.isCollection() && ((Collection)content).isEmpty())
hasContent = false;
else if (contentType.isArray() && Array.getLength(content) == 0)
hasContent = false;
} else if (elements.contains(n) || collapsedElements.contains(n) || elements.contains("*") || collapsedElements.contains("*") ) {
String key = p.getName();
Object value = p.getValue();
Throwable t = p.getThrown();
if (t != null)
onBeanGetterException(pMeta, t);
if (canIgnoreValue(cMeta, key, value))
continue;
if (! hasChildren) {
hasChildren = true;
out.appendIf(! isCollapsed, '>').nlIf(! isMixedOrText, indent);
}
XmlBeanPropertyMeta bpXml = getXmlBeanPropertyMeta(pMeta);
serializeAnything(out, value, cMeta, key, null, bpXml.getNamespace(), false, bpXml.getXmlFormat(), isMixedOrText, false, pMeta);
}
}
}
if (contentProperty == null && ! hasContent)
return (hasChildren ? CR_ELEMENTS : isVoidElement ? CR_VOID : CR_EMPTY);
// Serialize XML content.
if (content != null) {
out.w('>').nlIf(! isMixedOrText, indent);
if (contentType == null) {
} else if (contentType.isCollection()) {
Collection c = (Collection)content;
for (Object value : c) {
serializeAnything(out, value, contentType.getElementType(), null, null, null, false, cf, isMixedOrText, preserveWhitespace, null);
}
} else if (contentType.isArray()) {
Collection c = toList(Object[].class, content);
for (Object value : c) {
serializeAnything(out, value, contentType.getElementType(), null, null, null, false, cf, isMixedOrText, preserveWhitespace, null);
}
} else {
serializeAnything(out, content, contentType, null, null, null, false, cf, isMixedOrText, preserveWhitespace, null);
}
} else {
out.attr("nil", "true").w('>').nlIf(! isMixedOrText, indent);
}
return isMixedOrText ? CR_MIXED : CR_ELEMENTS;
}