[jackson-jaxrs-providers] 21/162: refactor...
Timo Aaltonen
tjaalton at moszumanska.debian.org
Mon Sep 8 22:16:24 UTC 2014
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 9296d9edf305e4a58bfc40b32c175a8181972cbb
Author: Tatu Saloranta <tsaloranta at gmail.com>
Date: Fri Mar 15 23:56:11 2013 -0700
refactor...
---
.../jackson/jaxrs/json/JacksonJsonProvider.java | 14 +-
...EndpointConfig.java => JsonEndpointConfig.java} | 14 +-
.../jackson/jaxrs/smile/JacksonSmileProvider.java | 565 ++-------------------
.../jaxrs/smile/annotation/EndpointConfig.java | 185 -------
.../smile/annotation/SmileEndpointConfig.java | 44 ++
5 files changed, 94 insertions(+), 728 deletions(-)
diff --git a/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JacksonJsonProvider.java b/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JacksonJsonProvider.java
index 9a211db..b0f1e5e 100644
--- a/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JacksonJsonProvider.java
+++ b/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JacksonJsonProvider.java
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.jaxrs.base.ProviderBase;
-import com.fasterxml.jackson.jaxrs.json.annotation.EndpointConfig;
+import com.fasterxml.jackson.jaxrs.json.annotation.JsonEndpointConfig;
import com.fasterxml.jackson.jaxrs.json.cfg.MapperConfigurator;
/**
@@ -50,7 +50,7 @@ import com.fasterxml.jackson.jaxrs.json.cfg.MapperConfigurator;
public class JacksonJsonProvider
extends ProviderBase<JacksonJsonProvider,
ObjectMapper, Annotations,
- EndpointConfig, MapperConfigurator>
+ JsonEndpointConfig, MapperConfigurator>
{
/**
* Default annotation sets to use, if not explicitly defined during
@@ -147,7 +147,7 @@ public class JacksonJsonProvider
/*
/**********************************************************
- /* Abstract method impl
+ /* Abstract method impls
/**********************************************************
*/
@@ -200,12 +200,12 @@ public class JacksonJsonProvider
}
@Override
- protected EndpointConfig _configForReading(ObjectMapper mapper, Annotation[] annotations) {
- return EndpointConfig.forReading(mapper, annotations);
+ protected JsonEndpointConfig _configForReading(ObjectMapper mapper, Annotation[] annotations) {
+ return JsonEndpointConfig.forReading(mapper, annotations);
}
@Override
- protected EndpointConfig _configForWriting(ObjectMapper mapper, Annotation[] annotations) {
- return EndpointConfig.forWriting(mapper, annotations, _jsonpFunctionName);
+ protected JsonEndpointConfig _configForWriting(ObjectMapper mapper, Annotation[] annotations) {
+ return JsonEndpointConfig.forWriting(mapper, annotations, _jsonpFunctionName);
}
}
diff --git a/json/src/main/java/com/fasterxml/jackson/jaxrs/json/annotation/EndpointConfig.java b/json/src/main/java/com/fasterxml/jackson/jaxrs/json/annotation/JsonEndpointConfig.java
similarity index 88%
rename from json/src/main/java/com/fasterxml/jackson/jaxrs/json/annotation/EndpointConfig.java
rename to json/src/main/java/com/fasterxml/jackson/jaxrs/json/annotation/JsonEndpointConfig.java
index ee10375..217dd6e 100644
--- a/json/src/main/java/com/fasterxml/jackson/jaxrs/json/annotation/EndpointConfig.java
+++ b/json/src/main/java/com/fasterxml/jackson/jaxrs/json/annotation/JsonEndpointConfig.java
@@ -12,8 +12,8 @@ import com.fasterxml.jackson.jaxrs.base.cfg.EndpointConfigBase;
* Container class for figuring out annotation-based configuration
* for JAX-RS end points.
*/
-public class EndpointConfig
- extends EndpointConfigBase<EndpointConfig>
+public class JsonEndpointConfig
+ extends EndpointConfigBase<JsonEndpointConfig>
{
// // Serialization-only config
@@ -25,19 +25,19 @@ public class EndpointConfig
/**********************************************************
*/
- protected EndpointConfig() { }
+ protected JsonEndpointConfig() { }
- public static EndpointConfig forReading(ObjectMapper mapper, Annotation[] annotations)
+ public static JsonEndpointConfig forReading(ObjectMapper mapper, Annotation[] annotations)
{
- return new EndpointConfig()
+ return new JsonEndpointConfig()
.add(annotations, false)
.initReader(mapper);
}
- public static EndpointConfig forWriting(ObjectMapper mapper, Annotation[] annotations,
+ public static JsonEndpointConfig forWriting(ObjectMapper mapper, Annotation[] annotations,
String defaultJsonpMethod)
{
- EndpointConfig config = new EndpointConfig();
+ JsonEndpointConfig config = new JsonEndpointConfig();
if (defaultJsonpMethod != null) {
config._jsonp = new JSONP.Def(defaultJsonpMethod);
}
diff --git a/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java b/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java
index 132aa02..2c171b7 100644
--- a/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java
+++ b/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java
@@ -1,24 +1,15 @@
package com.fasterxml.jackson.jaxrs.smile;
-import java.io.*;
import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.*;
import javax.ws.rs.*;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.StreamingOutput;
+import javax.ws.rs.core.*;
import javax.ws.rs.ext.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
-import com.fasterxml.jackson.databind.util.LRUMap;
-import com.fasterxml.jackson.jaxrs.base.util.AnnotationBundleKey;
-import com.fasterxml.jackson.jaxrs.base.util.ClassKey;
-import com.fasterxml.jackson.jaxrs.smile.annotation.EndpointConfig;
+import com.fasterxml.jackson.jaxrs.base.ProviderBase;
+import com.fasterxml.jackson.jaxrs.smile.annotation.SmileEndpointConfig;
import com.fasterxml.jackson.jaxrs.smile.cfg.MapperConfigurator;
/**
@@ -55,10 +46,11 @@ import com.fasterxml.jackson.jaxrs.smile.cfg.MapperConfigurator;
@Consumes(SmileMediaTypes.APPLICATION_JACKSON_SMILE)
@Produces(SmileMediaTypes.APPLICATION_JACKSON_SMILE)
public class JacksonSmileProvider
- implements
- MessageBodyReader<Object>,
- MessageBodyWriter<Object>,
- Versioned
+extends ProviderBase<JacksonSmileProvider,
+ ObjectMapper, Annotations,
+ SmileEndpointConfig,
+ MapperConfigurator
+>
{
/**
* Default annotation sets to use, if not explicitly defined during
@@ -69,89 +61,6 @@ public class JacksonSmileProvider
Annotations.JACKSON
};
- /**
- * Looks like we need to worry about accidental
- * data binding for types we shouldn't be handling. This is
- * probably not a very good way to do it, but let's start by
- * blacklisting things we are not to handle.
- *<p>
- * (why ClassKey? since plain old Class has no hashCode() defined,
- * lookups are painfully slow)
- */
- public final static HashSet<ClassKey> _untouchables = new HashSet<ClassKey>();
- static {
- // First, I/O things (direct matches)
- _untouchables.add(new ClassKey(java.io.InputStream.class));
- _untouchables.add(new ClassKey(java.io.Reader.class));
- _untouchables.add(new ClassKey(java.io.OutputStream.class));
- _untouchables.add(new ClassKey(java.io.Writer.class));
-
- // then some primitive types
- _untouchables.add(new ClassKey(char[].class));
-
- /* 28-Jan-2012, tatu: 1.x excluded some additional types;
- * but let's relax these a bit:
- */
- /* 27-Apr-2012, tatu: Ugh. As per
- * [https://github.com/FasterXML/jackson-jaxrs-json-provider/issues/12]
- * better revert this back, to make them untouchable again.
- */
- _untouchables.add(new ClassKey(String.class));
- _untouchables.add(new ClassKey(byte[].class));
- }
-
- /**
- * These are classes that we never use for reading
- * (never try to deserialize instances of these types).
- */
- public final static Class<?>[] _unreadableClasses = new Class<?>[] {
- InputStream.class, Reader.class
- };
-
- /**
- * These are classes that we never use for writing
- * (never try to serialize instances of these types).
- */
- public final static Class<?>[] _unwritableClasses = new Class<?>[] {
- OutputStream.class, Writer.class,
- StreamingOutput.class, Response.class
- };
-
- /*
- /**********************************************************
- /* Bit of caching
- /**********************************************************
- */
-
- /**
- * Cache for resolved endpoint configurations when reading Smile data
- */
- protected final LRUMap<AnnotationBundleKey, EndpointConfig> _readers
- = new LRUMap<AnnotationBundleKey, EndpointConfig>(16, 120);
-
- /**
- * Cache for resolved endpoint configurations when writing Smile data
- */
- protected final LRUMap<AnnotationBundleKey, EndpointConfig> _writers
- = new LRUMap<AnnotationBundleKey, EndpointConfig>(16, 120);
-
- /*
- /**********************************************************
- /* General configuration
- /**********************************************************
- */
-
- /**
- * Helper object used for encapsulating configuration aspects
- * of {@link ObjectMapper}
- */
- protected final MapperConfigurator _mapperConfig;
-
- /**
- * Set of types (classes) that provider should ignore for data binding
- */
- protected HashSet<ClassKey> _cfgCustomUntouchables;
-
/*
/**********************************************************
/* Context configuration
@@ -168,28 +77,6 @@ public class JacksonSmileProvider
/*
/**********************************************************
- /* Configuration
- /**********************************************************
- */
-
- /**
- * Whether we want to actually check that Jackson has
- * a serializer for given type. Since this should generally
- * be the case (due to auto-discovery) and since the call
- * to check availability can be bit expensive, defaults to false.
- */
- protected boolean _cfgCheckCanSerialize = false;
-
- /**
- * Whether we want to actually check that Jackson has
- * a deserializer for given type. Since this should generally
- * be the case (due to auto-discovery) and since the call
- * to check availability can be bit expensive, defaults to false.
- */
- protected boolean _cfgCheckCanDeserialize = false;
-
- /*
- /**********************************************************
/* Construction
/**********************************************************
*/
@@ -198,8 +85,7 @@ public class JacksonSmileProvider
* Default constructor, usually used when provider is automatically
* configured to be used with JAX-RS implementation.
*/
- public JacksonSmileProvider()
- {
+ public JacksonSmileProvider() {
this(null, BASIC_ANNOTATIONS);
}
@@ -227,7 +113,7 @@ public class JacksonSmileProvider
*/
public JacksonSmileProvider(ObjectMapper mapper, Annotations[] annotationsToUse)
{
- _mapperConfig = new MapperConfigurator(mapper, annotationsToUse);
+ super(new MapperConfigurator(mapper, annotationsToUse));
}
/**
@@ -240,349 +126,18 @@ public class JacksonSmileProvider
/*
/**********************************************************
- /* Configuring
- /**********************************************************
- */
-
- /**
- * Method for defining whether actual detection for existence of
- * a deserializer for type should be done when {@link #isReadable}
- * is called.
- */
- public void checkCanDeserialize(boolean state) { _cfgCheckCanDeserialize = state; }
-
- /**
- * Method for defining whether actual detection for existence of
- * a serializer for type should be done when {@link #isWriteable}
- * is called.
- */
- public void checkCanSerialize(boolean state) { _cfgCheckCanSerialize = state; }
-
- /**
- * Method for configuring which annotation sets to use (including none).
- * Annotation sets are defined in order decreasing precedence; that is,
- * first one has the priority over following ones.
- *
- * @param annotationsToUse Ordered list of annotation sets to use; if null,
- * default
- */
- public void setAnnotationsToUse(Annotations[] annotationsToUse) {
- _mapperConfig.setAnnotationsToUse(annotationsToUse);
- }
-
- /**
- * Method that can be used to directly define {@link ObjectMapper} to use
- * for serialization and deserialization; if null, will use the standard
- * provider discovery from context instead. Default setting is null.
- */
- public void setMapper(ObjectMapper m) {
- _mapperConfig.setMapper(m);
- }
-
- public JacksonSmileProvider configure(DeserializationFeature f, boolean state) {
- _mapperConfig.configure(f, state);
- return this;
- }
-
- public JacksonSmileProvider configure(SerializationFeature f, boolean state) {
- _mapperConfig.configure(f, state);
- return this;
- }
-
- public JacksonSmileProvider configure(JsonParser.Feature f, boolean state) {
- _mapperConfig.configure(f, state);
- return this;
- }
-
- public JacksonSmileProvider configure(JsonGenerator.Feature f, boolean state) {
- _mapperConfig.configure(f, state);
- return this;
- }
-
- public JacksonSmileProvider enable(DeserializationFeature f, boolean state) {
- _mapperConfig.configure(f, true);
- return this;
- }
-
- public JacksonSmileProvider enable(SerializationFeature f, boolean state) {
- _mapperConfig.configure(f, true);
- return this;
- }
-
- public JacksonSmileProvider enable(JsonParser.Feature f, boolean state) {
- _mapperConfig.configure(f, true);
- return this;
- }
-
- public JacksonSmileProvider enable(JsonGenerator.Feature f, boolean state) {
- _mapperConfig.configure(f, true);
- return this;
- }
-
- public JacksonSmileProvider disable(DeserializationFeature f, boolean state) {
- _mapperConfig.configure(f, false);
- return this;
- }
-
- public JacksonSmileProvider disable(SerializationFeature f, boolean state) {
- _mapperConfig.configure(f, false);
- return this;
- }
-
- public JacksonSmileProvider disable(JsonParser.Feature f, boolean state) {
- _mapperConfig.configure(f, false);
- return this;
- }
-
- public JacksonSmileProvider disable(JsonGenerator.Feature f, boolean state) {
- _mapperConfig.configure(f, false);
- return this;
- }
-
- /**
- * Method for marking specified type as "untouchable", meaning that provider
- * will not try to read or write values of this type (or its subtypes).
- *
- * @param type Type to consider untouchable; can be any kind of class,
- * including abstract class or interface. No instance of this type
- * (including subtypes, i.e. types assignable to this type) will
- * be read or written by provider
- */
- public void addUntouchable(Class<?> type)
- {
- if (_cfgCustomUntouchables == null) {
- _cfgCustomUntouchables = new HashSet<ClassKey>();
- }
- _cfgCustomUntouchables.add(new ClassKey(type));
- }
-
- /*
- /**********************************************************
- /* MessageBodyReader impl
+ /* Abstract method impls
/**********************************************************
*/
/**
- * Method that JAX-RS container calls to try to check whether
- * values of given type (and media type) can be deserialized by
- * this provider.
- * Implementation will first check that expected media type is
- * a Smile type (via call to {@link #isSmileType}; then verify
- * that type is not one of "untouchable" types (types we will never
- * automatically handle), and finally that there is a deserializer
- * for type (iff {@link #checkCanDeserialize} has been called with
- * true argument -- otherwise assumption is there will be a handler)
- */
- public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
- {
- if (!isSmileType(mediaType)) {
- return false;
- }
-
- /* Ok: looks like we must weed out some core types here; ones that
- * make no sense to try to bind from Smile:
- */
- if (_untouchables.contains(new ClassKey(type))) {
- return false;
- }
- // and there are some other abstract/interface types to exclude too:
- for (Class<?> cls : _unreadableClasses) {
- if (cls.isAssignableFrom(type)) {
- return false;
- }
- }
- // as well as possible custom exclusions
- if (_containedIn(type, _cfgCustomUntouchables)) {
- return false;
- }
-
- // Finally: if we really want to verify that we can serialize, we'll check:
- if (_cfgCheckCanSerialize) {
- ObjectMapper mapper = locateMapper(type, mediaType);
- if (!mapper.canDeserialize(mapper.constructType(type))) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Method that JAX-RS container calls to deserialize given value.
- */
- 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);
- EndpointConfig endpoint;
- synchronized (_readers) {
- endpoint = _readers.get(key);
- }
- // not yet resolved (or not cached any more)? Resolve!
- if (endpoint == null) {
- ObjectMapper mapper = locateMapper(type, mediaType);
- endpoint = EndpointConfig.forReading(mapper, annotations);
- // and cache for future reuse
- synchronized (_readers) {
- _readers.put(key.immutableKey(), endpoint);
- }
- }
- ObjectReader reader = endpoint.getReader();
- JsonParser jp = reader.getFactory().createParser(entityStream);
- // [Issue#1]: should return null for empty/missing payload
- // (note! Requires smile module v2.1.1)
- if (jp.nextToken() == null) {
- return null;
- }
- return reader.withType(genericType).readValue(jp);
- }
-
- /*
- /**********************************************************
- /* MessageBodyWriter impl
- /**********************************************************
- */
-
- /**
- * Method that JAX-RS container calls to try to figure out
- * serialized length of given value. Since computation of
- * this length is about as expensive as serialization itself,
- * implementation will return -1 to denote "not known", so
- * that container will determine length from actual serialized
- * output (if needed).
- */
- public long getSize(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
- {
- /* In general figuring output size requires actual writing; usually not
- * worth it to write everything twice.
- */
- return -1;
- }
-
- /**
- * Method that JAX-RS container calls to try to check whether
- * given value (of specified type) can be serialized by
- * this provider.
- * Implementation will first check that expected media type is
- * a Smile type (via call to {@link #isSmileType}; then verify
- * that type is not one of "untouchable" types (types we will never
- * automatically handle), and finally that there is a serializer
- * for type (iff {@link #checkCanSerialize} has been called with
- * true argument -- otherwise assumption is there will be a handler)
- */
- public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType)
- {
- if (!isSmileType(mediaType)) {
- return false;
- }
-
- /* Ok: looks like we must weed out some core types here; ones that
- * make no sense to try to bind from Smile:
- */
- if (_untouchables.contains(new ClassKey(type))) {
- return false;
- }
- // but some are interface/abstract classes, so
- for (Class<?> cls : _unwritableClasses) {
- if (cls.isAssignableFrom(type)) {
- return false;
- }
- }
- // and finally, may have additional custom types to exclude
- if (_containedIn(type, _cfgCustomUntouchables)) {
- return false;
- }
-
- // Also: if we really want to verify that we can deserialize, we'll check:
- if (_cfgCheckCanSerialize) {
- if (!locateMapper(type, mediaType).canSerialize(type)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Method that JAX-RS container calls to serialize given value.
- */
- public void writeTo(Object value, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
- MultivaluedMap<String,Object> httpHeaders, OutputStream entityStream)
- throws IOException
- {
- AnnotationBundleKey key = new AnnotationBundleKey(annotations);
- EndpointConfig endpoint;
- synchronized (_writers) {
- endpoint = _writers.get(key);
- }
- // not yet resolved (or not cached any more)? Resolve!
- if (endpoint == null) {
- ObjectMapper mapper = locateMapper(type, mediaType);
- endpoint = EndpointConfig.forWriting(mapper, annotations);
- // and cache for future reuse
- synchronized (_writers) {
- _writers.put(key.immutableKey(), endpoint);
- }
- }
-
- ObjectWriter writer = endpoint.getWriter();
-
- /* 27-Feb-2009, tatu: Where can we find desired encoding? Within
- * HTTP headers?
- */
- JsonEncoding enc = findEncoding(mediaType, httpHeaders);
- JsonGenerator jg = writer.getFactory().createGenerator(entityStream, enc);
-
- // Want indentation?
- if (writer.isEnabled(SerializationFeature.INDENT_OUTPUT)) {
- jg.useDefaultPrettyPrinter();
- }
- // 04-Mar-2010, tatu: How about type we were given? (if any)
- JavaType rootType = null;
-
- if (genericType != null && value != null) {
- /* 10-Jan-2011, tatu: as per [JACKSON-456], it's not safe to just force root
- * type since it prevents polymorphic type serialization. Since we really
- * just need this for generics, let's only use generic type if it's truly
- * generic.
- */
- if (genericType.getClass() != Class.class) { // generic types are other impls of 'java.lang.reflect.Type'
- /* This is still not exactly right; should root type be further
- * specialized with 'value.getClass()'? Let's see how well this works before
- * trying to come up with more complete solution.
- */
- rootType = writer.getTypeFactory().constructType(genericType);
- /* 26-Feb-2011, tatu: To help with [JACKSON-518], we better recognize cases where
- * type degenerates back into "Object.class" (as is the case with plain TypeVariable,
- * for example), and not use that.
- */
- if (rootType.getRawClass() == Object.class) {
- rootType = null;
- }
- }
- }
- // Most of the configuration now handled through EndpointConfig, ObjectWriter
- // but we may need to force root type:
- if (rootType != null) {
- writer = writer.withType(rootType);
- }
-
- writer.writeValue(jg, value);
- }
-
- /**
- * Helper method to use for determining desired output encoding.
- * For now, will always just use UTF-8...
+ * @deprecated Since 2.2 use {@link #hasMatchingMediaType(MediaType)} instead
*/
- protected JsonEncoding findEncoding(MediaType mediaType, MultivaluedMap<String,Object> httpHeaders)
- {
- return JsonEncoding.UTF8;
+ @Deprecated
+ protected boolean isSmileType(MediaType mediaType) {
+ return hasMatchingMediaType(mediaType);
}
- /*
- /**********************************************************
- /* Public helper methods
- /**********************************************************
- */
-
/**
* Helper method used to check whether given media type
* is Smile type or sub type.
@@ -590,7 +145,8 @@ public class JacksonSmileProvider
* {@link MediaType#getSubtype} returns
* "smile" or something ending with "+smile".
*/
- protected boolean isSmileType(MediaType mediaType)
+ @Override
+ protected boolean hasMatchingMediaType(MediaType mediaType)
{
/* As suggested by Stephen D, there are 2 ways to check: either
* being as inclusive as possible (if subtype is "smile"), or
@@ -630,81 +186,32 @@ public class JacksonSmileProvider
* not used by this method,
* but will be passed to {@link ContextResolver} as is.
*/
- public ObjectMapper locateMapper(Class<?> type, MediaType mediaType)
+ protected ObjectMapper _locateMapperViaProvider(Class<?> type, MediaType mediaType)
{
- // First: were we configured with a specific instance?
- ObjectMapper m = _mapperConfig.getConfiguredMapper();
- if (m == null) {
- // If not, maybe we can get one configured via context?
- if (_providers != null) {
- ContextResolver<ObjectMapper> resolver = _providers.getContextResolver(ObjectMapper.class, mediaType);
- /* Above should work as is, but due to this bug
- * [https://jersey.dev.java.net/issues/show_bug.cgi?id=288]
- * in Jersey, it doesn't. But this works until resolution of
- * the issue:
- */
- if (resolver == null) {
- resolver = _providers.getContextResolver(ObjectMapper.class, null);
- }
- if (resolver != null) {
- m = resolver.getContext(type);
- }
- }
- if (m == null) {
- // If not, let's get the fallback default instance
- m = _mapperConfig.getDefaultMapper();
+ if (_providers != null) {
+ ContextResolver<ObjectMapper> resolver = _providers.getContextResolver(ObjectMapper.class, mediaType);
+ /* Above should work as is, but due to this bug
+ * [https://jersey.dev.java.net/issues/show_bug.cgi?id=288]
+ * in Jersey, it doesn't. But this works until resolution of
+ * the issue:
+ */
+ if (resolver == null) {
+ resolver = _providers.getContextResolver(ObjectMapper.class, null);
}
- }
- return m;
- }
-
- /*
- /**********************************************************
- /* Private/sub-class helper methods
- /**********************************************************
- */
-
- protected static boolean _containedIn(Class<?> mainType, HashSet<ClassKey> set)
- {
- if (set != null) {
- ClassKey key = new ClassKey(mainType);
- // First: type itself?
- if (set.contains(key)) return true;
- // Then supertypes (note: will not contain Object.class)
- for (Class<?> cls : findSuperTypes(mainType, null)) {
- key.reset(cls);
- if (set.contains(key)) return true;
+ if (resolver != null) {
+ return resolver.getContext(type);
}
}
- return false;
+ return null;
}
- private static List<Class<?>> findSuperTypes(Class<?> cls, Class<?> endBefore)
- {
- return findSuperTypes(cls, endBefore, new ArrayList<Class<?>>(8));
+ @Override
+ protected SmileEndpointConfig _configForReading(ObjectMapper mapper, Annotation[] annotations) {
+ return SmileEndpointConfig.forReading(mapper, annotations);
}
- private static List<Class<?>> findSuperTypes(Class<?> cls, Class<?> endBefore, List<Class<?>> result)
- {
- _addSuperTypes(cls, endBefore, result, false);
- return result;
- }
-
- private static void _addSuperTypes(Class<?> cls, Class<?> endBefore, Collection<Class<?>> result, boolean addClassItself)
- {
- if (cls == endBefore || cls == null || cls == Object.class) {
- return;
- }
- if (addClassItself) {
- if (result.contains(cls)) { // already added, no need to check supers
- return;
- }
- result.add(cls);
- }
- for (Class<?> intCls : cls.getInterfaces()) {
- _addSuperTypes(intCls, endBefore, result, true);
- }
- _addSuperTypes(cls.getSuperclass(), endBefore, result, true);
+ @Override
+ protected SmileEndpointConfig _configForWriting(ObjectMapper mapper, Annotation[] annotations) {
+ return SmileEndpointConfig.forWriting(mapper, annotations);
}
-
}
diff --git a/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/annotation/EndpointConfig.java b/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/annotation/EndpointConfig.java
deleted file mode 100644
index 0c6d9af..0000000
--- a/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/annotation/EndpointConfig.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package com.fasterxml.jackson.jaxrs.smile.annotation;
-
-import java.lang.annotation.Annotation;
-
-import com.fasterxml.jackson.annotation.*;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.*;
-
-/**
- * Container class for figuring out annotation-based configuration
- * for JAX-RS end points.
- */
-public class EndpointConfig
-{
- // // General configuration
-
- protected Class<?> _activeView;
-
- protected String _rootName;
-
- // // Deserialization-only config
-
- protected DeserializationFeature[] _deserEnable;
- protected DeserializationFeature[] _deserDisable;
-
- protected ObjectReader _reader;
-
- // // Serialization-only config
-
- protected SerializationFeature[] _serEnable;
- protected SerializationFeature[] _serDisable;
-
- protected ObjectWriter _writer;
-
- /*
- /**********************************************************
- /* Construction
- /**********************************************************
- */
-
- protected EndpointConfig() { }
-
- public static EndpointConfig forReading(ObjectMapper mapper, Annotation[] annotations)
- {
- return new EndpointConfig()
- .add(annotations, false)
- .initReader(mapper);
- }
-
- public static EndpointConfig forWriting(ObjectMapper mapper, Annotation[] annotations)
- {
- EndpointConfig config = new EndpointConfig();
- return config
- .add(annotations, true)
- .initWriter(mapper)
- ;
- }
-
- protected EndpointConfig add(Annotation[] annotations, boolean forWriting)
- {
- // Same as [issue-10] with JSON provider; must check for null:
- if (annotations != null) {
- for (Annotation annotation : annotations) {
- Class<?> type = annotation.annotationType();
- if (type == JsonView.class) {
- // Can only use one view; but if multiple defined, use first (no exception)
- Class<?>[] views = ((JsonView) annotation).value();
- _activeView = (views.length > 0) ? views[0] : null;
- } else if (type == JsonRootName.class) {
- _rootName = ((JsonRootName) annotation).value();
- } else if (type == JacksonFeatures.class) {
- JacksonFeatures feats = (JacksonFeatures) annotation;
- if (forWriting) {
- _serEnable = nullIfEmpty(feats.serializationEnable());
- _serDisable = nullIfEmpty(feats.serializationDisable());
- } else {
- _deserEnable = nullIfEmpty(feats.deserializationEnable());
- _deserDisable = nullIfEmpty(feats.deserializationDisable());
- }
- } else if (type == JacksonAnnotationsInside.class) {
- // skip; processed below (in parent), so encountering here is of no use
- } else {
- // For all unrecognized types, check meta-annotation(s) to see if they are bundles
- JacksonAnnotationsInside inside = type.getAnnotation(JacksonAnnotationsInside.class);
- if (inside != null) {
- add(type.getAnnotations(), forWriting);
- }
- }
- }
- }
- return this;
- }
-
- protected EndpointConfig initReader(ObjectMapper mapper)
- {
- // first common config
- if (_activeView != null) {
- _reader = mapper.readerWithView(_activeView);
- } else {
- _reader = mapper.reader();
- }
-
- if (_rootName != null) {
- _reader = _reader.withRootName(_rootName);
- }
- // Then deser features
- if (_deserEnable != null) {
- _reader = _reader.withFeatures(_deserEnable);
- }
- if (_deserDisable != null) {
- _reader = _reader.withoutFeatures(_deserDisable);
- }
- /* Important: we are NOT to close the underlying stream after
- * mapping, so we need to instruct parser:
- */
- _reader.getFactory().disable(JsonParser.Feature.AUTO_CLOSE_SOURCE);
-
- return this;
- }
-
- protected EndpointConfig initWriter(ObjectMapper mapper)
- {
- // first common config
- if (_activeView != null) {
- _writer = mapper.writerWithView(_activeView);
- } else {
- _writer = mapper.writer();
- }
- if (_rootName != null) {
- _writer = _writer.withRootName(_rootName);
- }
- // Then features
- if (_serEnable != null) {
- _writer = _writer.withFeatures(_serEnable);
- }
- 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:
- */
- _writer.getFactory().disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
-
- return this;
- }
-
- /*
- /**********************************************************
- /* Accessors
- /**********************************************************
- */
-
- public ObjectReader getReader() {
- if (_reader == null) { // sanity check, should never happen
- throw new IllegalStateException();
- }
- return _reader;
- }
-
- public ObjectWriter getWriter() {
- if (_writer == null) { // sanity check, should never happen
- throw new IllegalStateException();
- }
- return _writer;
- }
-
- /*
- /**********************************************************
- /* Helper methods
- /**********************************************************
- */
-
- private static <T> T[] nullIfEmpty(T[] arg) {
- if (arg == null || arg.length == 0) {
- return null;
- }
- return arg;
- }
-}
diff --git a/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/annotation/SmileEndpointConfig.java b/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/annotation/SmileEndpointConfig.java
new file mode 100644
index 0000000..a085d12
--- /dev/null
+++ b/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/annotation/SmileEndpointConfig.java
@@ -0,0 +1,44 @@
+package com.fasterxml.jackson.jaxrs.smile.annotation;
+
+import java.lang.annotation.Annotation;
+
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.jaxrs.base.cfg.EndpointConfigBase;
+
+/**
+ * Container class for figuring out annotation-based configuration
+ * for JAX-RS end points.
+ */
+public class SmileEndpointConfig
+ extends EndpointConfigBase<SmileEndpointConfig>
+{
+ /*
+ /**********************************************************
+ /* Construction
+ /**********************************************************
+ */
+
+ protected SmileEndpointConfig() { }
+
+ public static SmileEndpointConfig forReading(ObjectMapper mapper, Annotation[] annotations)
+ {
+ return new SmileEndpointConfig()
+ .add(annotations, false)
+ .initReader(mapper);
+ }
+
+ public static SmileEndpointConfig forWriting(ObjectMapper mapper, Annotation[] annotations)
+ {
+ SmileEndpointConfig config = new SmileEndpointConfig();
+ return config
+ .add(annotations, true)
+ .initWriter(mapper)
+ ;
+ }
+
+ @Override
+ public Object modifyBeforeWrite(Object value) {
+ // nothing to add
+ return value;
+ }
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jackson-jaxrs-providers.git
More information about the pkg-java-commits
mailing list