package com.fasterxml.jackson.databind.deser.impl;
import java.io.IOException;
import java.util.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.SettableBeanProperty;
import com.fasterxml.jackson.databind.util.NameTransformer;
import com.fasterxml.jackson.databind.util.TokenBuffer;
/**
* Object that is responsible for handling acrobatics related to
* deserializing "unwrapped" values; sets of properties that are
* embedded (inlined) as properties of parent JSON object.
*/
public class UnwrappedPropertyHandler
{
protected final ArrayList<SettableBeanProperty> _properties = new ArrayList<SettableBeanProperty>();
public UnwrappedPropertyHandler() { }
public void addProperty(SettableBeanProperty property) {
_properties.add(property);
}
public void renameAll(NameTransformer transformer)
{
ArrayList<SettableBeanProperty> oldProps = new ArrayList<SettableBeanProperty>(_properties);
Iterator<SettableBeanProperty> it = oldProps.iterator();
_properties.clear();
while (it.hasNext()) {
SettableBeanProperty prop = it.next();
String newName = transformer.transform(prop.getName());
prop = prop.withName(newName);
JsonDeserializer<?> deser = prop.getValueDeserializer();
if (deser != null) {
@SuppressWarnings("unchecked")
JsonDeserializer<Object> newDeser = (JsonDeserializer<Object>)
deser.unwrappingDeserializer(transformer);
if (newDeser != deser) {
prop = prop.withValueDeserializer(newDeser);
}
}
_properties.add(prop);
}
}
public Object processUnwrapped(JsonParser originalParser, DeserializationContext ctxt, Object bean,
TokenBuffer buffered)
throws IOException, JsonProcessingException
{
for (int i = 0, len = _properties.size(); i < len; ++i) {
SettableBeanProperty prop = _properties.get(i);
JsonParser jp = buffered.asParser();
jp.nextToken();
prop.deserializeAndSet(jp, ctxt, bean);
}
return bean;
}
}