forked from FasterXML/jackson-databind
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initial fix for issue FasterXML#351, handle simple case.
- Loading branch information
Pascal Gélinas
committed
Nov 26, 2013
1 parent
76bf34f
commit 82d08ed
Showing
4 changed files
with
149 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
116 changes: 116 additions & 0 deletions
116
src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdReference.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
package com.fasterxml.jackson.databind.deser.impl; | ||
|
||
import java.io.IOException; | ||
import java.lang.annotation.Annotation; | ||
|
||
import com.fasterxml.jackson.core.JsonParser; | ||
import com.fasterxml.jackson.core.JsonProcessingException; | ||
import com.fasterxml.jackson.core.JsonToken; | ||
import com.fasterxml.jackson.databind.DeserializationContext; | ||
import com.fasterxml.jackson.databind.JsonDeserializer; | ||
import com.fasterxml.jackson.databind.PropertyName; | ||
import com.fasterxml.jackson.databind.deser.SettableBeanProperty; | ||
import com.fasterxml.jackson.databind.introspect.AnnotatedMember; | ||
import com.fasterxml.jackson.databind.introspect.ObjectIdInfo; | ||
|
||
public class ObjectIdReference extends SettableBeanProperty { | ||
private static final long serialVersionUID = 8465266677345565407L; | ||
private static final Object UNRESOLVED = new Object(); | ||
private SettableBeanProperty _forward; | ||
private ObjectIdInfo _objectIdInfo; | ||
|
||
public ObjectIdReference(SettableBeanProperty forward, ObjectIdInfo objectIdInfo) { | ||
super(forward.getFullName(), | ||
forward.getType(), | ||
forward.getWrapperName(), | ||
forward.getValueTypeDeserializer(), | ||
null, | ||
forward.getMetadata()); | ||
_forward = forward; | ||
_objectIdInfo = objectIdInfo; | ||
} | ||
|
||
public ObjectIdReference(ObjectIdReference src, JsonDeserializer<?> deser) { | ||
super(src, deser); | ||
_forward = src._forward; | ||
_objectIdInfo = src._objectIdInfo; | ||
} | ||
|
||
public ObjectIdReference(ObjectIdReference src, PropertyName newName) { | ||
super(src, newName); | ||
_forward = src._forward; | ||
_objectIdInfo = src._objectIdInfo; | ||
} | ||
|
||
@Override | ||
public SettableBeanProperty withValueDeserializer(JsonDeserializer<?> deser) { | ||
return new ObjectIdReference(this, deser); | ||
} | ||
|
||
@Override | ||
public SettableBeanProperty withName(PropertyName newName) { | ||
return new ObjectIdReference(this, newName); | ||
} | ||
|
||
@Override | ||
public <A extends Annotation> A getAnnotation(Class<A> acls) { | ||
return _forward.getAnnotation(acls); | ||
} | ||
|
||
@Override | ||
public AnnotatedMember getMember() { | ||
return _forward.getMember(); | ||
} | ||
|
||
@Override | ||
public void deserializeAndSet(JsonParser jp, DeserializationContext ctxt, Object instance) throws IOException, | ||
JsonProcessingException { | ||
set(instance, _deserialize(jp, ctxt, instance)); | ||
} | ||
|
||
@Override | ||
public Object deserializeSetAndReturn(JsonParser jp, DeserializationContext ctxt, Object instance) | ||
throws IOException, JsonProcessingException { | ||
return setAndReturn(instance, _deserialize(jp, ctxt, instance)); | ||
} | ||
|
||
private Object _deserialize(JsonParser jp, DeserializationContext ctxt, Object instance) throws JsonProcessingException, IOException { | ||
if(_objectIdInfo != null &&_objectIdInfo.getAlwaysAsId()){ | ||
return deserializeFromObjectId(jp, ctxt, instance); | ||
} | ||
|
||
JsonToken currentToken = jp.getCurrentToken(); | ||
if(currentToken == JsonToken.VALUE_STRING || currentToken == JsonToken.VALUE_NUMBER_INT){ | ||
return deserializeFromObjectId(jp, ctxt, instance); | ||
} | ||
return _forward.deserialize(jp, ctxt); | ||
} | ||
|
||
protected Object deserializeFromObjectId(JsonParser jp, DeserializationContext ctxt, Object instance) throws IOException, | ||
JsonProcessingException { | ||
ObjectIdReader reader = _forward.getValueDeserializer().getObjectIdReader(); | ||
Object id = reader.getDeserializer().deserialize(jp, ctxt); | ||
ReadableObjectId roid = ctxt.findObjectId(id, reader.generator); | ||
// do we have it resolved? | ||
Object pojo = roid.item; | ||
if (pojo == null) { // not yet; should wait... | ||
roid.appendReferring(instance, _forward); | ||
return UNRESOLVED; | ||
} | ||
return pojo; | ||
} | ||
|
||
@Override | ||
public void set(Object instance, Object value) throws IOException { | ||
if(value == UNRESOLVED) return; | ||
_forward.set(instance, value); | ||
} | ||
|
||
@Override | ||
public Object setAndReturn(Object instance, Object value) throws IOException { | ||
if(value== UNRESOLVED){ | ||
return null; | ||
} | ||
return _forward.setAndReturn(instance, value); | ||
} | ||
} |