This is an automated email from the git hooks/post-receive script. tjaalton pushed a commit to branch master in repository jackson-annotations.
commit f3cbf27e7176fd71b5e06ed07dc1ef6a963fb2c8 Author: Pascal Gélinas <[email protected]> Date: Wed Feb 5 17:29:00 2014 -0500 API for custom Object Identifier resolution. --- .../jackson/annotation/JsonIdentityInfo.java | 9 ++++ .../jackson/annotation/ObjectIdGenerator.java | 6 +-- .../jackson/annotation/ObjectIdResolver.java | 61 ++++++++++++++++++++++ .../jackson/annotation/SimpleObjectIdResolver.java | 43 +++++++++++++++ 4 files changed, 116 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/annotation/JsonIdentityInfo.java b/src/main/java/com/fasterxml/jackson/annotation/JsonIdentityInfo.java index 9ccde66..aa37216 100644 --- a/src/main/java/com/fasterxml/jackson/annotation/JsonIdentityInfo.java +++ b/src/main/java/com/fasterxml/jackson/annotation/JsonIdentityInfo.java @@ -60,6 +60,15 @@ public @interface JsonIdentityInfo public Class<? extends ObjectIdGenerator<?>> generator(); /** + * Resolver to use for producing POJO from Object Identifier. + * <p> + * Default value is {@link SimpleObjectIdResolver} + * + * @since 2.4 + */ + public Class<? extends ObjectIdResolver> resolver() default SimpleObjectIdResolver.class; + + /** * Scope is used to define applicability of an Object Id: all ids * must be unique within their scope; where scope is defined * as combination of this value and generator type. diff --git a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java index ce7ec69..b426562 100644 --- a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java +++ b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java @@ -100,17 +100,17 @@ public abstract class ObjectIdGenerator<T> /** * Type of {@link ObjectIdGenerator} used for generating Object Id */ - private final Class<?> type; + public final Class<?> type; /** * Scope of the Object Id (may be null, to denote global) */ - private final Class<?> scope; + public final Class<?> scope; /** * Object for which Object Id was generated: can NOT be null. */ - private final Object key; + public final Object key; /** * Hash code diff --git a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdResolver.java b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdResolver.java new file mode 100644 index 0000000..afbb0b6 --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdResolver.java @@ -0,0 +1,61 @@ +package com.fasterxml.jackson.annotation; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator.IdKey; + +/** + * Definition of API used for constructing POJO from Object Identifiers (as + * annotated using {@link JsonIdentityInfo}). + * + * @since 2.4 + */ +public interface ObjectIdResolver { + /** + * Method called when a POJO is deserialized and has an Object Identifier. + * Method exists so that implementation can keep track of existing object in + * json stream that could be useful for further resolution. + * + * @param id + * The Object Identifer + * @param ob + * The POJO associated to that Identifier + */ + void bindItem(IdKey id, Object pojo); + + /** + * Method called when deserialization encounters the given Object Identifier + * and requires the POJO associated with it. + * + * @param id + * The Object Identifier + * @return The POJO, or null if unable to resolve. + */ + Object resolveId(IdKey id); + + /** + * Factory method called to create a new instance to use for + * deserialization: needed since resolvers may have state (a pool of + * objects). + * <p> + * Note that actual type of 'context' is + * <code>com.fasterxml.jackson.databind.DeserializationContext</code>, but + * can not be declared here as type itself (as well as call to this object) + * comes from databind package. + * + * @param context + * Deserialization context object used (of type + * <code>com.fasterxml.jackson.databind.DeserializationContext</code> + * ; may be needed by more complex resolvers to access contextual + * information such as configuration. + */ + ObjectIdResolver newForDeserialization(Object context); + + /** + * Method called to check whether this resolver instance can be used for + * Object Ids of specific resolver type; determination is based by passing a + * configured "blueprint" (prototype) instance; from which the actual + * instances are created (using {@link #newForDeserialization}). + * + * @return True if this instance can be used as-is; false if not + */ + boolean canUseFor(ObjectIdResolver resolverType); +} diff --git a/src/main/java/com/fasterxml/jackson/annotation/SimpleObjectIdResolver.java b/src/main/java/com/fasterxml/jackson/annotation/SimpleObjectIdResolver.java new file mode 100644 index 0000000..b383ddd --- /dev/null +++ b/src/main/java/com/fasterxml/jackson/annotation/SimpleObjectIdResolver.java @@ -0,0 +1,43 @@ +package com.fasterxml.jackson.annotation; + +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.ObjectIdGenerator.IdKey; + +/** + * Simple implementation of {@link ObjectIdResolver} + * + * @author Pascal Gélinas + */ +public class SimpleObjectIdResolver implements ObjectIdResolver { + private Map<IdKey,Object> _items = new HashMap<ObjectIdGenerator.IdKey,Object>(); + + @Override + public void bindItem(IdKey id, Object ob) + { + if (_items.containsKey(id)) { + throw new IllegalStateException("Already had POJO for id (" + id.key.getClass().getName() + ") [" + id + + "]"); + } + _items.put(id, ob); + } + + @Override + public Object resolveId(IdKey id) + { + return _items.get(id); + } + + @Override + public boolean canUseFor(ObjectIdResolver resolverType) + { + return resolverType.getClass() == getClass(); + } + + @Override + public ObjectIdResolver newForDeserialization(Object context) + { + return this; + } +} -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jackson-annotations.git _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

