package com.fasterxml.jackson.dataformat.xml.deser;
import java.io.IOException;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.deser.*;
import com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
Delegating deserializer that is used in the special cases where
we may sometimes see a "plain" String value but need to map it
as if it was a property of POJO. The impedance is introduced by
heuristic conversion from XML events into rough JSON equivalents;
and this is one work-around that can only be done after the fact.
/**
* Delegating deserializer that is used in the special cases where
* we may sometimes see a "plain" String value but need to map it
* as if it was a property of POJO. The impedance is introduced by
* heuristic conversion from XML events into rough JSON equivalents;
* and this is one work-around that can only be done after the fact.
*/
public class XmlTextDeserializer
extends DelegatingDeserializer
{
private static final long serialVersionUID = 1L;
Property index of the "XML text property"; needed for finding actual
property instance after resolution and contextualization: instance
may change, but index will remain constant.
/**
* Property index of the "XML text property"; needed for finding actual
* property instance after resolution and contextualization: instance
* may change, but index will remain constant.
*/
protected final int _xmlTextPropertyIndex;
Actual property that is indicated to be of type "XML Text" (and
is the only element-valued property)
/**
* Actual property that is indicated to be of type "XML Text" (and
* is the only element-valued property)
*/
protected final SettableBeanProperty _xmlTextProperty;
protected final ValueInstantiator _valueInstantiator;
/*
/**********************************************************************
/* Construction
/**********************************************************************
*/
public XmlTextDeserializer(BeanDeserializerBase delegate, SettableBeanProperty prop)
{
super(delegate);
_xmlTextProperty = prop;
_xmlTextPropertyIndex = prop.getPropertyIndex();
_valueInstantiator = delegate.getValueInstantiator();
}
public XmlTextDeserializer(BeanDeserializerBase delegate, int textPropIndex)
{
super(delegate);
_xmlTextPropertyIndex = textPropIndex;
_valueInstantiator = delegate.getValueInstantiator();
_xmlTextProperty = delegate.findProperty(textPropIndex);
}
/*
/**********************************************************************
/* Abstract method implementations
/**********************************************************************
*/
@Override
protected JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegatee0) {
// default not enough, as we need to create a new wrapping deserializer
// even if delegatee does not change
throw new IllegalStateException("Internal error: should never get called");
}
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
BeanProperty property)
throws JsonMappingException
{
return new XmlTextDeserializer(_verifyDeserType(_delegatee), _xmlTextPropertyIndex);
}
/*
/**********************************************************************
/* Overridden deserialization methods
/**********************************************************************
*/
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException
{
if (p.getCurrentToken() == JsonToken.VALUE_STRING) {
Object bean = _valueInstantiator.createUsingDefault(ctxt);
_xmlTextProperty.deserializeAndSet(p, ctxt, bean);
return bean;
}
return _delegatee.deserialize(p, ctxt);
}
@SuppressWarnings("unchecked")
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt,
Object bean) throws IOException
{
if (p.getCurrentToken() == JsonToken.VALUE_STRING) {
_xmlTextProperty.deserializeAndSet(p, ctxt, bean);
return bean;
}
return ((JsonDeserializer<Object>)_delegatee).deserialize(p, ctxt, bean);
}
@Override
public Object deserializeWithType(JsonParser p, DeserializationContext ctxt,
TypeDeserializer typeDeserializer)
throws IOException
{
return _delegatee.deserializeWithType(p, ctxt, typeDeserializer);
}
/*
/**********************************************************************
/* Internal methods
/**********************************************************************
*/
protected BeanDeserializerBase _verifyDeserType(JsonDeserializer<?> deser)
{
if (!(deser instanceof BeanDeserializerBase)) {
throw new IllegalArgumentException("Can not change delegate to be of type "
+deser.getClass().getName());
}
return (BeanDeserializerBase) deser;
}
}