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

