This is an automated email from the git hooks/post-receive script. tjaalton pushed a commit to branch master in repository jackson-annotations.
commit 9aa54e082ad397cd3294f8eab6a7f9e3a1777fe1 Author: Tatu <[email protected]> Date: Tue Feb 7 15:00:22 2012 -0800 Bit more work on ObjectIdGenerator definition --- .../jackson/annotation/JsonIdentityInfo.java | 19 +++--- .../jackson/annotation/ObjectIdGenerator.java | 22 ++----- .../jackson/annotation/ObjectIdGenerators.java | 69 ++++++++++++++-------- 3 files changed, 59 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/annotation/JsonIdentityInfo.java b/src/main/java/com/fasterxml/jackson/annotation/JsonIdentityInfo.java index 28c0724..bb729a8 100644 --- a/src/main/java/com/fasterxml/jackson/annotation/JsonIdentityInfo.java +++ b/src/main/java/com/fasterxml/jackson/annotation/JsonIdentityInfo.java @@ -52,15 +52,16 @@ public @interface JsonIdentityInfo public Class<? extends ObjectIdGenerator<?>> generator(); /** - * Scope is a concept used by {@link ObjectIdGenerator} created based - * on {@link #property}, iff {@link ObjectIdGenerator#usesGlobalScope()} - * returns false. If so, separate generator instances are created for - * each distinct scope. If not defined (i.e. left at default value of - * {@link JsonIdentityInfo}), will just use type of the annotated - * class or property as scope. + * 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. + * Comparison is simple equivalence, meaning that both type + * generator type and scope class must be the same. *<p> - * If {@link ObjectIdGenerator#usesGlobalScope()} returns true, - * value of this property is ignored. + * Scope is used for determining how many generators are needed; + * more than one scope is typically only needed if external Object Ids + * have overlapping value domains (i.e. are only unique within some + * limited scope) */ - public Class<?> scope() default JsonIdentityInfo.class; + public Class<?> scope() default Object.class; } diff --git a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java index 83d176c..a7b9099 100644 --- a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java +++ b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java @@ -29,25 +29,13 @@ public abstract class ObjectIdGenerator<T> public abstract ObjectIdGenerator<T> newForDeserialization(Class<?> scope); /** - * Accessor called to determine whether scope of Object Identifiers - * is global (within context of a single serialization) or not; - * if not, scope is assumed to be per-type (using statically declared - * type). Definition of scope is that all identifiers produced must - * be unique within a scope: thus global scope would guarantee - * that all produced identifiers are unique for full serialization - * process, whereas local scopes only guarantee it for the supported - * type (within single serialization). - *<p> - * One generator instance is needed per scope, and for deserialization, - * separate Maps are kept on per-scope basis. - *<p> - * Standard generators (UUID, sequence-number) support global scope; - * custom generators may support + * Method called to check whether this generator instance can + * be used for Object Ids of specific generator type and + * scope. * - * @return True if global (one per serialization) scope is needed by - * generator; false if per-type scope is needed. + * @return True if this instance can be used as-is; false if not */ - public abstract boolean usesGlobalScope(); + public abstract boolean canUseFor(ObjectIdGenerator<?> gen, Class<?> scope); /** * Method used for generating an Object Identifier to serialize diff --git a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerators.java b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerators.java index 2fc08f8..d5c0fdb 100644 --- a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerators.java +++ b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerators.java @@ -10,7 +10,7 @@ public class ObjectIdGenerators { /* /********************************************************** - /* Implementation classes + /* Shared base class for concrete implementations /********************************************************** */ @@ -18,14 +18,29 @@ public class ObjectIdGenerators * Helper class that implements scoped storage for Object * references. */ - private abstract static class Base<T> extends ObjectIdGenerator<T> + protected abstract static class Base<T> extends ObjectIdGenerator<T> { + protected final Class<?> _scope; + /** * Lazily constructed mapping of "ids-to-Objects" used by deserialization. */ protected IdentityHashMap<Object, T> _ids; protected IdentityHashMap<T, Object> _items; + + protected Base(Class<?> scope) { + _scope = scope; + } + + @Override + public boolean canUseFor(ObjectIdGenerator<?> gen, Class<?> scope) { + return (gen.getClass() == getClass()) && (scope == _scope); + } + + public Class<?> getScope() { + return _scope; + } protected T findId(Object item) { if (_ids == null) { @@ -63,6 +78,12 @@ public class ObjectIdGenerators _ids.put(item, id); } } + + /* + /********************************************************** + /* Implementation classes + /********************************************************** + */ /** * Abstract place-holder class which is used to denote case @@ -73,39 +94,33 @@ public class ObjectIdGenerators * Actual implementation class is part of <code>databind</code> * package. */ - public abstract class PropertyGenerator<T> extends Base<T> { } + public abstract class PropertyGenerator<T> extends Base<T> { + protected PropertyGenerator(Class<?> scope) { super(scope); } + } /** * Simple sequence-number based generator, which uses basic Java * <code>int</code>s (starting with value 1) as Object Identifiers. */ - public static class IntSequenceGenerator extends Base<Integer> + public final static class IntSequenceGenerator extends Base<Integer> { protected int _nextValue; - public IntSequenceGenerator() { this(1); } - public IntSequenceGenerator(int fv) { - super(); + public IntSequenceGenerator(Class<?> scope) { this(scope, 1); } + public IntSequenceGenerator(Class<?> scope, int fv) { + super(scope); _nextValue = fv; } @Override public ObjectIdGenerator<Integer> newForSerialization(Class<?> scope) { - return new IntSequenceGenerator(_nextValue); + return new IntSequenceGenerator(scope, _nextValue); } // we don't really need value for deserialization but... @Override public ObjectIdGenerator<Integer> newForDeserialization(Class<?> scope) { - return new IntSequenceGenerator(_nextValue); - } - - /** - * We can easily support global scope with simple sequences, so return true - */ - @Override - public boolean usesGlobalScope() { - return true; + return new IntSequenceGenerator(scope, _nextValue); } @Override @@ -121,26 +136,30 @@ public class ObjectIdGenerators * unique identifiers: downside is that resulting String is * 36 characters long. */ - public static class UUIDGenerator extends Base<UUID> + public final static class UUIDGenerator extends Base<UUID> { + public UUIDGenerator(Class<?> scope) { + super(scope); + } + @Override public ObjectIdGenerator<UUID> newForSerialization(Class<?> scope) { - return new UUIDGenerator(); + return new UUIDGenerator(scope); } @Override public ObjectIdGenerator<UUID> newForDeserialization(Class<?> scope) { - return new UUIDGenerator(); + return new UUIDGenerator(scope); } - + /** - * UUIDs are globally unique, so yes we can support global scope + * Since UUIDs are always unique, let's fully ignore scope definition */ @Override - public boolean usesGlobalScope() { - return true; + public boolean canUseFor(ObjectIdGenerator<?> gen, Class<?> scope) { + return (gen.getClass() == getClass()); } - + @Override public UUID generateId(Object forPojo) { return UUID.randomUUID(); -- 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

