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 <[email protected]> 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 _______________________________________________ pkg-java-commits mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-java-commits

