package com.fasterxml.jackson.dataformat.xml;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.introspect.Annotated;
import com.fasterxml.jackson.databind.introspect.AnnotationIntrospectorPair;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector;
Additional extension interface used above and beyond AnnotationIntrospector
to handle XML-specific configuration. /**
* Additional extension interface used above and beyond
* {@link AnnotationIntrospector} to handle XML-specific configuration.
*/
public interface XmlAnnotationIntrospector
{
Method that can be called to figure out generic namespace
property for an annotated object.
Returns: Null if annotated thing does not define any
namespace information; non-null namespace (which may
be empty String) otherwise
/**
* Method that can be called to figure out generic namespace
* property for an annotated object.
*
* @return Null if annotated thing does not define any
* namespace information; non-null namespace (which may
* be empty String) otherwise
*/
public String findNamespace(Annotated ann);
Method used to check whether given annotated element
(field, method, constructor parameter) has indicator that suggests
it be output as an XML attribute or not (as element)
/**
* Method used to check whether given annotated element
* (field, method, constructor parameter) has indicator that suggests
* it be output as an XML attribute or not (as element)
*/
public Boolean isOutputAsAttribute(Annotated ann);
Method used to check whether given annotated element
(field, method, constructor parameter) has indicator that suggests
it should be serialized as text, without element wrapper.
/**
* Method used to check whether given annotated element
* (field, method, constructor parameter) has indicator that suggests
* it should be serialized as text, without element wrapper.
*/
public Boolean isOutputAsText(Annotated ann);
Method used to check whether given annotated element
(field, method, constructor parameter) has indicator that suggests
it should be wrapped in a CDATA tag.
/**
* Method used to check whether given annotated element
* (field, method, constructor parameter) has indicator that suggests
* it should be wrapped in a CDATA tag.
*/
public Boolean isOutputAsCData(Annotated ann);
Since: 2.7
/**
* @since 2.7
*/
public void setDefaultUseWrapper(boolean b);
/*
/**********************************************************************
/* Replacement of 'AnnotationIntrospector.Pair' to use when combining
/* (potential) XMLAnnotationIntrospector instance
/**********************************************************************
*/
Extension of AnnotationIntrospector.Pair
that can
also dispatch 'XmlAnnotationIntrospector' methods.
/**
* Extension of <code>AnnotationIntrospector.Pair</code> that can
* also dispatch 'XmlAnnotationIntrospector' methods.
*/
public static class Pair extends AnnotationIntrospectorPair
implements XmlAnnotationIntrospector
{
private static final long serialVersionUID = 1L;
protected final XmlAnnotationIntrospector _xmlPrimary;
protected final XmlAnnotationIntrospector _xmlSecondary;
public Pair(AnnotationIntrospector p, AnnotationIntrospector s)
{
super(p, s);
if (p instanceof XmlAnnotationIntrospector) {
_xmlPrimary = (XmlAnnotationIntrospector) p;
} else if (p instanceof JaxbAnnotationIntrospector) {
_xmlPrimary = new JaxbWrapper((JaxbAnnotationIntrospector) p);
} else {
_xmlPrimary = null;
}
if (s instanceof XmlAnnotationIntrospector) {
_xmlSecondary = (XmlAnnotationIntrospector) s;
} else if (s instanceof JaxbAnnotationIntrospector) {
_xmlSecondary = new JaxbWrapper((JaxbAnnotationIntrospector) s);
} else {
_xmlSecondary = null;
}
}
public static XmlAnnotationIntrospector.Pair instance(AnnotationIntrospector a1, AnnotationIntrospector a2) {
return new XmlAnnotationIntrospector.Pair(a1, a2);
}
@Override
public String findNamespace(Annotated ann)
{
String value = (_xmlPrimary == null) ? null : _xmlPrimary.findNamespace(ann);
if ((value == null) && (_xmlSecondary != null)) {
value = _xmlSecondary.findNamespace(ann);
}
return value;
}
@Override
public Boolean isOutputAsAttribute(Annotated ann)
{
Boolean value = (_xmlPrimary == null) ? null : _xmlPrimary.isOutputAsAttribute(ann);
if ((value == null) && (_xmlSecondary != null)) {
value = _xmlSecondary.isOutputAsAttribute(ann);
}
return value;
}
@Override
public Boolean isOutputAsText(Annotated ann)
{
Boolean value = (_xmlPrimary == null) ? null : _xmlPrimary.isOutputAsText(ann);
if ((value == null) && (_xmlSecondary != null)) {
value = _xmlSecondary.isOutputAsText(ann);
}
return value;
}
@Override
public Boolean isOutputAsCData(Annotated ann) {
Boolean value = (_xmlPrimary == null) ? null : _xmlPrimary.isOutputAsCData(ann);
if ((value == null) && (_xmlSecondary != null)) {
value = _xmlSecondary.isOutputAsCData(ann);
}
return value;
}
@Override
public void setDefaultUseWrapper(boolean b) {
if (_xmlPrimary != null) {
_xmlPrimary.setDefaultUseWrapper(b);
}
if (_xmlSecondary != null) {
_xmlSecondary.setDefaultUseWrapper(b);
}
}
}
/*
/**********************************************************************
/* Helper class used to adapt JaxbAnnoationIntrospector as
/* XmlAnnotationIntrospector
/**********************************************************************
*/
Wrapper we need to adapt JaxbAnnotationIntrospector
as XmlAnnotationIntrospector
: something we can not (alas!) do in JAXB module because of dependency direction (JAXB module has no knowledge of this module). /**
* Wrapper we need to adapt {@link JaxbAnnotationIntrospector} as
* {@link XmlAnnotationIntrospector}: something we can not (alas!)
* do in JAXB module because of dependency direction (JAXB module
* has no knowledge of this module).
*/
static class JaxbWrapper implements XmlAnnotationIntrospector
{
protected final JaxbAnnotationIntrospector _intr;
public JaxbWrapper(JaxbAnnotationIntrospector i) {
_intr = i;
}
@Override
public String findNamespace(Annotated ann) {
return _intr.findNamespace(ann);
}
@Override
public Boolean isOutputAsAttribute(Annotated ann) {
return _intr.isOutputAsAttribute(ann);
}
@Override
public Boolean isOutputAsText(Annotated ann) {
return _intr.isOutputAsText(ann);
}
@Override
public Boolean isOutputAsCData(Annotated ann) {
//There is no CData annotation in JAXB
return null;
}
@Override
public void setDefaultUseWrapper(boolean b) {
// not used with JAXB
}
}
}