package com.fasterxml.jackson.dataformat.xml.ser;
import javax.xml.namespace.QName;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.*;
import com.fasterxml.jackson.databind.ser.impl.PropertySerializerMap;
Property writer sub-class used for handling element wrapping needed for serializing
collection (array, Collection; possibly Map) types.
/**
* Property writer sub-class used for handling element wrapping needed for serializing
* collection (array, Collection; possibly Map) types.
*/
public class XmlBeanPropertyWriter
extends BeanPropertyWriter
{
private static final long serialVersionUID = 1L;
/*
/**********************************************************
/* Config settings
/**********************************************************
*/
Element name used as wrapper for collection.
/**
* Element name used as wrapper for collection.
*/
protected final QName _wrapperQName;
Element name used for items in the collection
/**
* Element name used for items in the collection
*/
protected final QName _wrappedQName;
/*
/**********************************************************
/* Life-cycle: construction, configuration
/**********************************************************
*/
public XmlBeanPropertyWriter(BeanPropertyWriter wrapped,
PropertyName wrapperName, PropertyName wrappedName) {
this(wrapped, wrapperName, wrappedName, null);
}
public XmlBeanPropertyWriter(BeanPropertyWriter wrapped,
PropertyName wrapperName, PropertyName wrappedName,
JsonSerializer<Object> serializer)
{
super(wrapped);
_wrapperQName = _qname(wrapperName);
_wrappedQName = _qname(wrappedName);
if (serializer != null) {
assignSerializer(serializer);
}
}
private QName _qname(PropertyName n)
{
String ns = n.getNamespace();
if (ns == null) {
ns = "";
}
return new QName(ns, n.getSimpleName());
}
/*
/**********************************************************
/* Overridden methods
/**********************************************************
*/
Overridden version so that we can wrap output within wrapper element if
and as necessary.
/**
* Overridden version so that we can wrap output within wrapper element if
* and as necessary.
*/
@Override
public void serializeAsField(Object bean, JsonGenerator jgen, SerializerProvider prov)
throws Exception
{
Object value = get(bean);
/* 13-Feb-2014, tatu: As per [#103], default handling does not really
* work here. Rather, we need just a wrapping and should NOT call
* null handler, as it does not know what to do...
*
* Question, however, is what should it be serialized as. We have two main
* choices; equivalent empty List, and "nothing" (missing). Let's start with
* empty List? But producing missing entry is non-trivial...
*/
if (value == null) {
// if (_nullSerializer != null) { ... }
// For Empty List, we'd do this:
/*
@SuppressWarnings("resource")
final ToXmlGenerator xmlGen = (jgen instanceof ToXmlGenerator) ? (ToXmlGenerator) jgen : null;
if (xmlGen != null) {
xmlGen.startWrappedValue(_wrapperQName, _wrappedQName);
xmlGen.finishWrappedValue(_wrapperQName, _wrappedQName);
}
*/
// but for missing thing, well, just output nothing
return;
}
// then find serializer to use
JsonSerializer<Object> ser = _serializer;
if (ser == null) {
Class<?> cls = value.getClass();
PropertySerializerMap map = _dynamicSerializers;
ser = map.serializerFor(cls);
if (ser == null) {
ser = _findAndAddDynamic(map, cls, prov);
}
}
// and then see if we must suppress certain values (default, empty)
if (_suppressableValue != null) {
if (MARKER_FOR_EMPTY == _suppressableValue) {
if (ser.isEmpty(prov, value)) {
return;
}
} else if (_suppressableValue.equals(value)) {
return;
}
}
// For non-nulls: simple check for direct cycles
if (value == bean) {
// NOTE: method signature here change 2.3->2.4
if (_handleSelfReference(bean, jgen, prov, ser)) {
return;
}
}
final ToXmlGenerator xmlGen = (jgen instanceof ToXmlGenerator) ? (ToXmlGenerator) jgen : null;
// Ok then; addition we want to do is to add wrapper element, and that's what happens here
// 19-Aug-2013, tatu: ... except for those nasty 'convertValue()' calls...
if (xmlGen != null) {
xmlGen.startWrappedValue(_wrapperQName, _wrappedQName);
}
jgen.writeFieldName(_name);
if (_typeSerializer == null) {
ser.serialize(value, jgen, prov);
} else {
ser.serializeWithType(value, jgen, prov, _typeSerializer);
}
if (xmlGen != null) {
xmlGen.finishWrappedValue(_wrapperQName, _wrappedQName);
}
}
}