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

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

commit c6ef21d20f00d363f5b70cd99e36671fed51a690
Author: Tatu Saloranta <[email protected]>
Date:   Tue May 14 20:36:09 2013 -0700

    Trying to fix #11, problems with caching of ObjectReaders/-Writers
---
 .../fasterxml/jackson/jaxrs/base/ProviderBase.java |  4 +-
 .../jackson/jaxrs/cfg/AnnotationBundleKey.java     | 43 +++++++++++++++++-----
 .../jackson/jaxrs/cfg/EndpointConfigBase.java      |  4 --
 .../jaxrs/json/util/TestAnnotationBundleKey.java   |  6 +--
 4 files changed, 39 insertions(+), 18 deletions(-)

diff --git 
a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java 
b/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java
index 003faa6..34775e5 100644
--- a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java
+++ b/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java
@@ -399,7 +399,7 @@ public abstract class ProviderBase<
             MultivaluedMap<String,Object> httpHeaders, OutputStream 
entityStream) 
         throws IOException
     {
-        AnnotationBundleKey key = new AnnotationBundleKey(annotations);
+        AnnotationBundleKey key = new AnnotationBundleKey(annotations, type);
         EP_CONFIG endpoint;
         synchronized (_writers) {
             endpoint = _writers.get(key);
@@ -536,7 +536,7 @@ public abstract class ProviderBase<
     public Object readFrom(Class<Object> type, Type genericType, Annotation[] 
annotations, MediaType mediaType, MultivaluedMap<String,String> httpHeaders, 
InputStream entityStream) 
         throws IOException
     {
-        AnnotationBundleKey key = new AnnotationBundleKey(annotations);
+        AnnotationBundleKey key = new AnnotationBundleKey(annotations, type);
         EP_CONFIG endpoint;
         synchronized (_readers) {
             endpoint = _readers.get(key);
diff --git 
a/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/AnnotationBundleKey.java 
b/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/AnnotationBundleKey.java
index 83c5f56..09337a2 100644
--- 
a/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/AnnotationBundleKey.java
+++ 
b/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/AnnotationBundleKey.java
@@ -15,6 +15,14 @@ public final class AnnotationBundleKey
     private final static Annotation[] NO_ANNOTATIONS = new Annotation[0];
     
     private final Annotation[] _annotations;
+
+    /**
+     * We also seem to need the type as part of the key (as per [Issue#11]);
+     * hopefully that and annotations are enough (if not, may need to 
reconsider
+     * the way caching is done, and possibly only cache derivation of 
annotations,
+     * not mapper or reader/writer).
+     */
+    private final Class<?> _type;
     
     private final boolean _annotationsCopied;
 
@@ -25,24 +33,38 @@ public final class AnnotationBundleKey
     /* Construction
     /**********************************************************
      */
-    
+
+    /**
+     * @deprecated Since 2.2.2: use variant that takes explicit Class
+     */
+    @Deprecated
     public AnnotationBundleKey(Annotation[] annotations)
     {
+        // could use a private inner class, but this'll do for now; no one 
should call anyway
+        this(annotations, AnnotationBundleKey.class);
+    }
+
+    public AnnotationBundleKey(Annotation[] annotations, Class<?> type)
+    {
+        _type = type;
+        // getting hash of name is faster than Class.hashCode() just because 
latter uses system identity hash:
+        final int typeHash = type.getName().hashCode();
         if (annotations == null || annotations.length == 0) {
             annotations = NO_ANNOTATIONS;
             _annotationsCopied = true;
-            _hashCode = -1;
+            _hashCode = typeHash;
         } else {
             _annotationsCopied = false;
-            _hashCode = calcHash(annotations);
+            _hashCode = calcHash(annotations) ^ typeHash;
         }
-        _annotations = annotations;  
+        _annotations = annotations;
     }
 
-    private AnnotationBundleKey(Annotation[] annotations, int hashCode)
+    private AnnotationBundleKey(Annotation[] annotations, Class<?> type, int 
hashCode)
     {
-        _annotations = annotations;            
+        _annotations = annotations;
         _annotationsCopied = true;
+        _type = type;
         _hashCode = hashCode;
     }
 
@@ -70,7 +92,7 @@ public final class AnnotationBundleKey
         int len = _annotations.length;
         Annotation[] newAnnotations = new Annotation[len];
         System.arraycopy(_annotations, 0, newAnnotations, 0, len);
-        return new AnnotationBundleKey(newAnnotations, _hashCode);
+        return new AnnotationBundleKey(newAnnotations, _type, _hashCode);
     }
     
     /*
@@ -86,7 +108,8 @@ public final class AnnotationBundleKey
     
     @Override
     public String toString() {
-        return "[Annotations: "+_annotations.length+", hash 
0x"+Integer.toHexString(_hashCode)
+        return "[Annotations: "+_annotations.length+", type: "
+                +_type.getName()+", hash 0x"+Integer.toHexString(_hashCode)
                 +", copied: "+_annotationsCopied+"]";
     }
 
@@ -97,7 +120,9 @@ public final class AnnotationBundleKey
         if (o == null) return false;
         if (o.getClass() != getClass()) return false;
         AnnotationBundleKey other = (AnnotationBundleKey) o;
-        if (other._hashCode != _hashCode) return false;
+        if ((other._hashCode != _hashCode) || (other._type != _type)) {
+            return false;
+        }
         return _equals(other._annotations);
     }
     
diff --git 
a/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase.java 
b/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase.java
index 043e5b9..41496f0 100644
--- a/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase.java
+++ b/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/EndpointConfigBase.java
@@ -133,10 +133,6 @@ public abstract class EndpointConfigBase<THIS extends 
EndpointConfigBase<THIS>>
         if (_serDisable != null) {
             _writer = _writer.withoutFeatures(_serDisable);
         }
-        // then others
-
-        // Finally: couple of features we always set
-
         /* Important: we are NOT to close the underlying stream after
          * mapping, so we need to instruct parser:
          */
diff --git 
a/json/src/test/java/com/fasterxml/jackson/jaxrs/json/util/TestAnnotationBundleKey.java
 
b/json/src/test/java/com/fasterxml/jackson/jaxrs/json/util/TestAnnotationBundleKey.java
index 1039a22..488a6ba 100644
--- 
a/json/src/test/java/com/fasterxml/jackson/jaxrs/json/util/TestAnnotationBundleKey.java
+++ 
b/json/src/test/java/com/fasterxml/jackson/jaxrs/json/util/TestAnnotationBundleKey.java
@@ -34,9 +34,9 @@ public class TestAnnotationBundleKey extends JaxrsTestBase
        Annotation[] ann2 = m2.getAnnotations();
        assertEquals(1, ann2.length);
 
-       AnnotationBundleKey key1 = new AnnotationBundleKey(ann1);
-       AnnotationBundleKey key2 = new AnnotationBundleKey(ann2);
-       AnnotationBundleKey key1dup = new AnnotationBundleKey(ann1);
+       AnnotationBundleKey key1 = new AnnotationBundleKey(ann1, Object.class);
+       AnnotationBundleKey key2 = new AnnotationBundleKey(ann2, Object.class);
+       AnnotationBundleKey key1dup = new AnnotationBundleKey(ann1, 
Object.class);
        AnnotationBundleKey key1immutable = key1.immutableKey();
 
        // identity checks first

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

_______________________________________________
pkg-java-commits mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

Reply via email to