[jackson-annotations] 22/207: Last mods for ObjectId generation?

Timo Aaltonen tjaalton at moszumanska.debian.org
Sat Sep 6 13:55:35 UTC 2014


This is an automated email from the git hooks/post-receive script.

tjaalton pushed a commit to branch master
in repository jackson-annotations.

commit 5c5dd56f7e1a500c4d6af7157670a488e80d5125
Author: Tatu Saloranta <tsaloranta at gmail.com>
Date:   Thu Feb 9 11:02:57 2012 -0800

    Last mods for ObjectId generation?
---
 .../jackson/annotation/ObjectIdGenerator.java      | 96 ++++++++++++++--------
 .../jackson/annotation/ObjectIdGenerators.java     | 89 ++++++--------------
 2 files changed, 88 insertions(+), 97 deletions(-)

diff --git a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java
index 0b86233..995c522 100644
--- a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java
+++ b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerator.java
@@ -17,6 +17,15 @@ public abstract class ObjectIdGenerator<T>
      */
 
     public abstract Class<?> getScope();
+
+    /**
+     * Method called to check whether this generator instance can
+     * be used for Object Ids of specific generator type and
+     * scope.
+     * 
+     * @return True if this instance can be used as-is; false if not
+     */
+    public abstract boolean canUseFor(ObjectIdGenerator<?> gen);
     
     /*
     /**********************************************************
@@ -32,27 +41,16 @@ public abstract class ObjectIdGenerator<T>
     
     /**
      * Factory method called to create a new instance to use for
-     * serialization. This includes initializing storage for keeping
-     * track of serialized instances, along with id used.
+     * serialization: needed since generators may have state
+     * (next id to produce)
      */
     public abstract ObjectIdGenerator<T> newForSerialization();
 
     /**
-     * Factory method called to create a new instance to use for
-     * serialization. This includes initializing storage for keeping
-     * track of deserialized instances, along with id used.
+     * Method for constructing key to use for ObjectId-to-POJO maps.
      */
-    public abstract ObjectIdGenerator<T> newForDeserialization();
+    public abstract IdKey key(Object key);
     
-    /**
-     * Method called to check whether this generator instance can
-     * be used for Object Ids of specific generator type and
-     * scope.
-     * 
-     * @return True if this instance can be used as-is; false if not
-     */
-    public abstract boolean canUseFor(ObjectIdGenerator<?> gen);
-
     /*
     /**********************************************************
     /* Methods for serialization
@@ -60,12 +58,6 @@ public abstract class ObjectIdGenerator<T>
      */
     
     /**
-     * Method used during serialization, to try to find an Object Id for given already serialized
-     * Object: if none found, returns null.
-     */
-    public abstract T findId(Object forPojo);
-
-    /**
      * Method used for generating a new Object Identifier to serialize
      * for given POJO.
      * 
@@ -74,23 +66,63 @@ public abstract class ObjectIdGenerator<T>
      * @return Object Identifier to use.
      */
     public abstract T generateId(Object forPojo);
-    
+
     /*
     /**********************************************************
-    /* Methods for deserialization
+    /* Helper classes
     /**********************************************************
      */
-    
-    /**
-     * Method used during deserialization, to try to find an item for which given
-     * id was used.
-     */
-    public abstract Object findItem(T id);
 
     /**
-     * Method called during deserialization to establishing mapping between
-     * given item, and the id it was using.
+     * Simple key class that can be used as a key for
+     * ObjectId-to-POJO mappings, when multiple ObjectId types
+     * and scopes are used.
      */
-    public abstract void addItem(Object item, T id);
+    public final static class IdKey
+    {
+        /**
+         * Type of {@link ObjectIdGenerator} used for generating Object Id
+         */
+        private final Class<?> type;
+
+        /**
+         * Scope of the Object Id (may be null, to denote global)
+         */
+        private final Class<?> scope;
+
+        /**
+         * Object for which Object Id was generated: can NOT be null.
+         */
+        private final Object key;
+
+        /**
+         * Hash code
+         */
+        private final int hashCode;
+        
+        public IdKey(Class<?> type, Class<?> scope, Object key) {
+            this.type = type;
+            this.scope = scope;
+            this.key = key;
+            
+            int h = key.hashCode() + type.getName().hashCode();
+            if (scope != null) {
+                h ^= scope.getName().hashCode();
+            }
+            hashCode = h;
+        }
+
+        @Override
+        public int hashCode() { return hashCode; }
 
+        @Override
+        public boolean equals(Object o)
+        {
+            if (o == this) return true;
+            if (o == null) return false;
+            if (o.getClass() != getClass()) return false;
+            IdKey other = (IdKey) o;
+            return (other.key.equals(key)) && (other.type == type) && (other.scope == scope);
+        }
+    }
 }
diff --git a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerators.java b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerators.java
index 9615911..40f4215 100644
--- a/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerators.java
+++ b/src/main/java/com/fasterxml/jackson/annotation/ObjectIdGenerators.java
@@ -1,6 +1,5 @@
 package com.fasterxml.jackson.annotation;
 
-import java.util.IdentityHashMap;
 import java.util.UUID;
 
 /**
@@ -22,13 +21,6 @@ public class ObjectIdGenerators
     {
         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;
         }
@@ -44,50 +36,7 @@ public class ObjectIdGenerators
         }
         
         @Override
-        public T findId(Object item) {
-            if (_ids == null) {
-                return null;
-            }
-            return _ids.get(item);
-        }
-
-        
-        @Override
-        public T generateId(Object forPojo) {
-            T id = _generateId(forPojo);
-            addId(forPojo, id);
-            return id;
-        }
-
-        protected abstract T _generateId(Object forPojo);
-        
-        @Override
-        public Object findItem(T id) {
-            if (_items == null) {
-                return null;
-            }
-            return _items.get(id);
-        }
-
-        /**
-         * Method called during deserialization to keep track of items we have
-         * deserialized, along with ids they had.
-         */
-        @Override
-        public void addItem(Object item, T id) {
-            if (_items == null) {
-                _items = new IdentityHashMap<T, Object>(16);
-            }
-            _ids.put(item, id);
-        }
-
-        protected void addId(Object item, T id) {
-            if (_ids == null) {
-                _ids = new IdentityHashMap<Object, T>(16);
-            }
-            _ids.put(item, id);
-        }
-
+        public abstract T generateId(Object forPojo);
     }
 
     /*
@@ -136,12 +85,12 @@ public class ObjectIdGenerators
         }
 
         @Override
-        public ObjectIdGenerator<Integer> newForDeserialization() {
-            return new IntSequenceGenerator(_scope, initialValue());
+        public IdKey key(Object key) {
+            return new IdKey(getClass(), _scope, key);
         }
-
+        
         @Override
-        public Integer _generateId(Object forPojo) {
+        public Integer generateId(Object forPojo) {
             int id = _nextValue;
             ++_nextValue;
             return id;
@@ -152,34 +101,44 @@ public class ObjectIdGenerators
      * Implementation that just uses {@link java.util.UUID}s as reliably
      * unique identifiers: downside is that resulting String is
      * 36 characters long.
+     *<p>
+     * One difference to other generators is that scope is always
+     * set as <code>Object.class</code> (regardless of arguments): this
+     * because UUIDs are globally unique, and scope has no meaning.
      */
     public final static class UUIDGenerator extends Base<UUID>
     {
         public UUIDGenerator() { this(Object.class); }
-        public UUIDGenerator(Class<?> scope) {
-            super(scope);
+        private UUIDGenerator(Class<?> scope) {
+            super(Object.class);
         }
 
+        /**
+         * Can just return base instance since this is essentially scopeless
+         */
         @Override
         public ObjectIdGenerator<UUID> forScope(Class<?> scope) {
-            return (_scope == scope) ? this : new UUIDGenerator(scope);
+            return this;
         }
         
+        /**
+         * Can just return base instance since this is essentially scopeless
+         */
         @Override
         public ObjectIdGenerator<UUID> newForSerialization() {
-            return new UUIDGenerator(_scope);
+            return this;
         }
 
         @Override
-        public ObjectIdGenerator<UUID> newForDeserialization() {
-            return new UUIDGenerator(_scope);
+        public UUID generateId(Object forPojo) {
+            return UUID.randomUUID();
         }
 
         @Override
-        protected UUID _generateId(Object forPojo) {
-            return UUID.randomUUID();
+        public IdKey key(Object key) {
+            return new IdKey(getClass(), null, key);
         }
-        
+
         /**
          * Since UUIDs are always unique, let's fully ignore scope definition
          */

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jackson-annotations.git



More information about the pkg-java-commits mailing list