diff -Nru jackson-jaxrs-providers-2.7.3/base/pom.xml jackson-jaxrs-providers-2.8.5/base/pom.xml --- jackson-jaxrs-providers-2.7.3/base/pom.xml 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/pom.xml 2016-11-16 02:14:44.000000000 +0000 @@ -4,7 +4,7 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-providers - 2.7.3 + 2.8.5 jackson-jaxrs-base Jackson-JAXRS-base diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/annotation/package-info.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/annotation/package-info.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/annotation/package-info.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/annotation/package-info.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,12 @@ +/** + * Package that contains annotations applicable to all content types. + * Currently defined are: + * + */ +package com.fasterxml.jackson.jaxrs.annotation; diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/JsonMappingExceptionMapper.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/JsonMappingExceptionMapper.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/JsonMappingExceptionMapper.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/JsonMappingExceptionMapper.java 2016-11-16 02:14:44.000000000 +0000 @@ -4,15 +4,16 @@ import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; /** * Implementation if {@link ExceptionMapper} to send down a "400 Bad Request" * response in the event that unmappable JSON is received. + *

+ * Note that {@link javax.ws.rs.ext.Provider} annotation was include up to + * Jackson 2.7, but removed from 2.8 (as per [jaxrs-providers#22] * * @since 2.2 */ -@Provider public class JsonMappingExceptionMapper implements ExceptionMapper { @Override public Response toResponse(JsonMappingException exception) { diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/JsonParseExceptionMapper.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/JsonParseExceptionMapper.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/JsonParseExceptionMapper.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/JsonParseExceptionMapper.java 2016-11-16 02:14:44.000000000 +0000 @@ -4,15 +4,16 @@ import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; -import javax.ws.rs.ext.Provider; /** * Implementation of {@link ExceptionMapper} to send down a "400 Bad Request" * in the event unparsable JSON is received. + *

+ * Note that {@link javax.ws.rs.ext.Provider} annotation was include up to + * Jackson 2.7, but removed from 2.8 (as per [jaxrs-providers#22] * * @since 2.2 */ -@Provider public class JsonParseExceptionMapper implements ExceptionMapper { @Override public Response toResponse(JsonParseException exception) { diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS1NoContentExceptionSupplier.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS1NoContentExceptionSupplier.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS1NoContentExceptionSupplier.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS1NoContentExceptionSupplier.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,18 @@ +package com.fasterxml.jackson.jaxrs.base.nocontent; + +import com.fasterxml.jackson.jaxrs.base.NoContentExceptionSupplier; + +import java.io.IOException; + +/** + * Create plain IOException for JaxRS 1.x because {@link javax.ws.rs.core.NoContentException} + * has been introduced in JaxRS 2.x + */ +public class JaxRS1NoContentExceptionSupplier implements NoContentExceptionSupplier +{ + @Override + public IOException createNoContentException() + { + return new IOException(NO_CONTENT_MESSAGE); + } +} diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS2NoContentExceptionSupplier.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS2NoContentExceptionSupplier.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS2NoContentExceptionSupplier.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS2NoContentExceptionSupplier.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,16 @@ +package com.fasterxml.jackson.jaxrs.base.nocontent; + +import com.fasterxml.jackson.jaxrs.base.NoContentExceptionSupplier; + +import javax.ws.rs.core.NoContentException; +import java.io.IOException; + +/** + * This supplier creates fair NoContentException from JaxRS 2.x + */ +public class JaxRS2NoContentExceptionSupplier implements NoContentExceptionSupplier { + @Override + public IOException createNoContentException() { + return new NoContentException(NoContentExceptionSupplier.NO_CONTENT_MESSAGE); + } +} diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/NoContentExceptionSupplier.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/NoContentExceptionSupplier.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/NoContentExceptionSupplier.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/NoContentExceptionSupplier.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,13 @@ +package com.fasterxml.jackson.jaxrs.base; + +import java.io.IOException; + +/** + * Implementors of this class contains strategies for NoContentException creation + */ +public interface NoContentExceptionSupplier +{ + String NO_CONTENT_MESSAGE = "No content (empty input stream)"; + + IOException createNoContentException(); +} diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java 2016-11-16 02:14:44.000000000 +0000 @@ -14,6 +14,8 @@ import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.jaxrs.base.nocontent.JaxRS1NoContentExceptionSupplier; +import com.fasterxml.jackson.jaxrs.base.nocontent.JaxRS2NoContentExceptionSupplier; import com.fasterxml.jackson.jaxrs.cfg.*; import com.fasterxml.jackson.jaxrs.util.ClassKey; import com.fasterxml.jackson.jaxrs.util.LRUMap; @@ -34,15 +36,10 @@ */ public final static String HEADER_CONTENT_TYPE_OPTIONS = "X-Content-Type-Options"; - /** - * Since class javax.ws.rs.core.NoContentException only exists in - * JAX-RS 2.0, but we need 1.1 compatibility, need to (unfortunately!) dynamically - * load class. - */ protected final static String CLASS_NAME_NO_CONTENT_EXCEPTION = "javax.ws.rs.core.NoContentException"; - protected final static String NO_CONTENT_MESSAGE = "No content (empty input stream)"; - + protected final NoContentExceptionSupplier noContentExceptionSupplier = _createNoContentExceptionSupplier(); + /** * Looks like we need to worry about accidental * data binding for types we shouldn't be handling. This is @@ -453,6 +450,9 @@ */ protected abstract boolean hasMatchingMediaType(MediaType mediaType); + /** + * Helper method that is called if no mapper has been explicitly configured. + */ protected abstract MAPPER _locateMapperViaProvider(Class type, MediaType mediaType); protected EP_CONFIG _configForReading(MAPPER mapper, @@ -552,7 +552,7 @@ } return true; } - + /** * Method that JAX-RS container calls to serialize given value. */ @@ -562,20 +562,8 @@ MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException { - AnnotationBundleKey key = new AnnotationBundleKey(annotations, type); - EP_CONFIG endpoint; - synchronized (_writers) { - endpoint = _writers.get(key); - } - // not yet resolved (or not cached any more)? Resolve! - if (endpoint == null) { - MAPPER mapper = locateMapper(type, mediaType); - endpoint = _configForWriting(mapper, annotations, _defaultWriteView); - // and cache for future reuse - synchronized (_writers) { - _writers.put(key.immutableKey(), endpoint); - } - } + EP_CONFIG endpoint = _endpointForWriting(value, type, genericType, annotations, + mediaType, httpHeaders); // Any headers we should write? _modifyHeaders(value, type, genericType, annotations, httpHeaders, endpoint); @@ -594,12 +582,12 @@ } JavaType rootType = null; - if (genericType != null && value != 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' + if (!(genericType instanceof 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. @@ -608,7 +596,9 @@ // since forcing of type will then force use of content serializer, which is // generally not the intent. Fix may require addition of functionality in databind - rootType = writer.getTypeFactory().constructType(genericType); + TypeFactory typeFactory = writer.getTypeFactory(); + JavaType baseType = typeFactory.constructType(genericType); + rootType = typeFactory.constructSpecializedType(baseType, type); /* 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. @@ -663,7 +653,7 @@ EP_CONFIG endpoint) throws IOException { - // [Issue#6]: Add "nosniff" header? + // Add "nosniff" header? if (isEnabled(JaxRSFeature.ADD_NO_SNIFF_HEADER)) { httpHeaders.add(HEADER_CONTENT_TYPE_OPTIONS, "nosniff"); } @@ -684,7 +674,32 @@ g.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET); return g; } - + + protected EP_CONFIG _endpointForWriting(Object value, Class type, Type genericType, + Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders) + { + // 29-Jun-2016, tatu: As per [jaxrs-providers#86] allow skipping caching + if (!isEnabled(JaxRSFeature.CACHE_ENDPOINT_WRITERS)) { + return _configForWriting(locateMapper(type, mediaType), annotations, _defaultWriteView); + } + + EP_CONFIG endpoint; + AnnotationBundleKey key = new AnnotationBundleKey(annotations, type); + synchronized (_writers) { + endpoint = _writers.get(key); + } + // not yet resolved (or not cached any more)? Resolve! + if (endpoint == null) { + MAPPER mapper = locateMapper(type, mediaType); + endpoint = _configForWriting(mapper, annotations, _defaultWriteView); + // and cache for future reuse + synchronized (_writers) { + _writers.put(key.immutableKey(), endpoint); + } + } + return endpoint; + } + /* /********************************************************** /* MessageBodyReader impl @@ -748,20 +763,9 @@ InputStream entityStream) throws IOException { - AnnotationBundleKey key = new AnnotationBundleKey(annotations, type); - EP_CONFIG endpoint; - synchronized (_readers) { - endpoint = _readers.get(key); - } - // not yet resolved (or not cached any more)? Resolve! - if (endpoint == null) { - MAPPER mapper = locateMapper(type, mediaType); - endpoint = _configForReading(mapper, annotations, _defaultReadView); - // and cache for future reuse - synchronized (_readers) { - _readers.put(key.immutableKey(), endpoint); - } - } + EP_CONFIG endpoint = _endpointForReading(type, genericType, annotations, + mediaType, httpHeaders); + ObjectReader reader = endpoint.getReader(); JsonParser p = _createParser(reader, entityStream); @@ -829,6 +833,38 @@ return p; } + /** + * Overridable helper method that will basically fetch representation of the + * endpoint that can be used to get {@link ObjectReader} to use for deserializing + * content + * + * @since 2.8 + */ + protected EP_CONFIG _endpointForReading(Class type, Type genericType, Annotation[] annotations, + MediaType mediaType, MultivaluedMap httpHeaders) + { + // 29-Jun-2016, tatu: As per [jaxrs-providers#86] allow skipping caching + if (!isEnabled(JaxRSFeature.CACHE_ENDPOINT_READERS)) { + return _configForReading(locateMapper(type, mediaType), annotations, _defaultReadView); + } + + EP_CONFIG endpoint; + AnnotationBundleKey key = new AnnotationBundleKey(annotations, type); + synchronized (_readers) { + endpoint = _readers.get(key); + } + // not yet resolved (or not cached any more)? Resolve! + if (endpoint == null) { + MAPPER mapper = locateMapper(type, mediaType); + endpoint = _configForReading(mapper, annotations, _defaultReadView); + // and cache for future reuse + synchronized (_readers) { + _readers.put(key.immutableKey(), endpoint); + } + } + return endpoint; + } + /* /********************************************************** /* Overridable helper methods @@ -837,15 +873,30 @@ /** * Method called to locate {@link ObjectMapper} to use for serialization - * and deserialization. If an instance has been explicitly defined by + * and deserialization. Exact logic depends on setting of + * {@link JaxRSFeature#DYNAMIC_OBJECT_MAPPER_LOOKUP}. + * + *

+ * If {@link JaxRSFeature#DYNAMIC_OBJECT_MAPPER_LOOKUP} is disabled (default + * setting unless changed), behavior is as follows: + *

    + *
  1. If an instance has been explicitly defined by * {@link #setMapper} (or non-null instance passed in constructor), that - * will be used. - * If not, will try to locate it using standard JAX-RS + * will be used. + *
  2. + *
  3. If not, will try to locate it using standard JAX-RS * ContextResolver mechanism, if it has been properly configured * to access it (by JAX-RS runtime). - * Finally, if no mapper is found, will return a default unconfigured + *
  4. + *
  5. Finally, if no mapper is found, will return a default unconfigured * {@link ObjectMapper} instance (one constructed with default constructor * and not modified in any way) + *
  6. + *
+ *

+ * If {@link JaxRSFeature#DYNAMIC_OBJECT_MAPPER_LOOKUP} is enabled, steps + * 1 and 2 are reversed, such that JAX-RS ContextResolver + * is first used, and only if none is defined will configured mapper be used. * * @param type Class of object being serialized or deserialized; * not checked at this point, since it is assumed that unprocessable @@ -857,7 +908,21 @@ */ public MAPPER locateMapper(Class type, MediaType mediaType) { - // First: were we configured with a specific instance? + // 29-Jun-2016, tatu: As per [jaxrs-providers#86] may want to do provider lookup first + if (isEnabled(JaxRSFeature.DYNAMIC_OBJECT_MAPPER_LOOKUP)) { + MAPPER m = _locateMapperViaProvider(type, mediaType); + if (m == null) { + m = _mapperConfig.getConfiguredMapper(); + if (m == null) { + m = _mapperConfig.getDefaultMapper(); + } + } + return m; + } + + // Otherwise start with (pre-)configured Mapper and only check provider + // if not found + MAPPER m = _mapperConfig.getConfiguredMapper(); if (m == null) { // If not, maybe we can get one configured via context? @@ -909,18 +974,9 @@ */ protected IOException _createNoContentException() { - Class cls = null; - try { - cls = Class.forName(CLASS_NAME_NO_CONTENT_EXCEPTION); - Constructor ctor = cls.getDeclaredConstructor(String.class); - if (ctor != null) { - return (IOException) ctor.newInstance(NO_CONTENT_MESSAGE); - } - } catch (Exception e) { // no can do... - } - return new IOException(NO_CONTENT_MESSAGE); + return noContentExceptionSupplier.createNoContentException(); } - + /* /********************************************************** /* Private/sub-class helper methods @@ -995,4 +1051,24 @@ private final THIS _this() { return (THIS) this; } + + /** + * Since class javax.ws.rs.core.NoContentException only exists in + * JAX-RS 2.0, but we want to have 1.x compatibility, need to dynamically select exception supplier + */ + private static NoContentExceptionSupplier _createNoContentExceptionSupplier() { + try { + Class cls = Class.forName(CLASS_NAME_NO_CONTENT_EXCEPTION); + Constructor ctor = cls.getDeclaredConstructor(String.class); + if (ctor != null) { + return new JaxRS2NoContentExceptionSupplier(); + } else { + return new JaxRS1NoContentExceptionSupplier(); + } + } catch (ClassNotFoundException ex) { + return new JaxRS1NoContentExceptionSupplier(); + } catch (NoSuchMethodException e) { + return new JaxRS1NoContentExceptionSupplier(); + } + } } diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/JaxRSFeature.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/JaxRSFeature.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/JaxRSFeature.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/cfg/JaxRSFeature.java 2016-11-16 02:14:44.000000000 +0000 @@ -10,9 +10,9 @@ public enum JaxRSFeature implements ConfigFeature { /* - /****************************************************** + /********************************************************** /* Input handling - /****************************************************** + /********************************************************** */ /** @@ -26,11 +26,11 @@ * but this is not defined in JAX-RS 1.x. */ ALLOW_EMPTY_INPUT(true), - + /* - /****************************************************** + /********************************************************** /* HTTP headers - /****************************************************** + /********************************************************** */ /** @@ -44,9 +44,56 @@ ADD_NO_SNIFF_HEADER(false), /* - /****************************************************** + /********************************************************** + /* Caching, related + /********************************************************** + */ + + /** + * Feature that may be enabled to force dynamic lookup of ObjectMapper + * via JAX-RS Provider interface, regardless of whether MapperConfigurator + * has explicitly configured mapper or not; if disabled, static configuration will + * take precedence. + * Note that if this feature is enabled, it typically makes sense to also disable + * {@link JaxRSFeature#CACHE_ENDPOINT_READERS} and {@link JaxRSFeature#CACHE_ENDPOINT_WRITERS} + * since caching would prevent lookups. + *

+ * Feature is disabled by default. + * + * @since 2.8 + */ + DYNAMIC_OBJECT_MAPPER_LOOKUP(false), + + /** + * [jaxrs-providers#86]: Feature that determines whether provider will cache endpoint + * definitions for reading or not (including caching of actual ObjectReader to use). + * Feature may be disabled if reconfiguration or alternate isntance of ObjectMapper is needed. + *

+ * Note that disabling of the feature may add significant amount of overhead for processing. + *

+ * Feature is enabled by default. + * + * @since 2.8 + */ + CACHE_ENDPOINT_READERS(true), + + /** + * [jaxrs-providers#86]: Feature that determines whether provider will cache endpoint + * definitions for writing or not (including caching of actual ObjectWriter to use). + * Feature may be disabled if reconfiguration or alternate isntance of ObjectMapper is needed. + *

+ * Note that disabling of the feature may add significant amount of overhead for processing. + *

+ * Feature is enabled by default. + * + * @since 2.8 + */ + CACHE_ENDPOINT_WRITERS(true), + + /* + /********************************************************** /* Other - /****************************************************** + /********************************************************** */ ; @@ -71,5 +118,6 @@ @Override public int getMask() { return (1 << ordinal()); } + @Override public boolean enabledIn(int flags) { return (flags & getMask()) != 0; } } diff -Nru jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/util/package-info.java jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/util/package-info.java --- jackson-jaxrs-providers-2.7.3/base/src/main/java/com/fasterxml/jackson/jaxrs/util/package-info.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/base/src/main/java/com/fasterxml/jackson/jaxrs/util/package-info.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,4 @@ +/** + * Miscellaneous helper classes used by providers. + */ +package com.fasterxml.jackson.jaxrs.util; diff -Nru jackson-jaxrs-providers-2.7.3/cbor/pom.xml jackson-jaxrs-providers-2.8.5/cbor/pom.xml --- jackson-jaxrs-providers-2.7.3/cbor/pom.xml 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/cbor/pom.xml 2016-11-16 02:14:44.000000000 +0000 @@ -4,7 +4,7 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-providers - 2.7.3 + 2.8.5 jackson-jaxrs-cbor-provider Jackson-JAXRS-CBOR diff -Nru jackson-jaxrs-providers-2.7.3/cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/JacksonCBORProvider.java jackson-jaxrs-providers-2.8.5/cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/JacksonCBORProvider.java --- jackson-jaxrs-providers-2.7.3/cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/JacksonCBORProvider.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/JacksonCBORProvider.java 2016-11-16 02:14:44.000000000 +0000 @@ -43,8 +43,8 @@ * @author Tatu Saloranta */ @Provider -@Consumes(CBORMediaTypes.APPLICATION_JACKSON_CBOR) -@Produces(CBORMediaTypes.APPLICATION_JACKSON_CBOR) +@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants +@Produces(MediaType.WILDCARD) public class JacksonCBORProvider extends ProviderBase com.fasterxml.jackson.jaxrs jackson-jaxrs-providers - 2.7.0-rc3-SNAPSHOT + 2.8.5 + + com.fasterxml.jackson.datatype jackson-datatype-jaxrs Jackson-JAXRS-Datatypes bundle diff -Nru jackson-jaxrs-providers-2.7.3/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/Jaxrs2TypesModule.java jackson-jaxrs-providers-2.8.5/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/Jaxrs2TypesModule.java --- jackson-jaxrs-providers-2.7.3/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/Jaxrs2TypesModule.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/Jaxrs2TypesModule.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,48 @@ +package com.fasterxml.jackson.datatype.jaxrs; + +import javax.ws.rs.core.Link; + +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; + +/** + * Simple datatype module that adds serialization and deserialization + * support for following JAX-RS 2.0 types: + *

    + *
  • {@link javax.ws.rs.core.Link}: serialized using "link header" representation + *
  • + *
+ * + * @since 2.8 + */ +public class Jaxrs2TypesModule extends SimpleModule +{ + private static final long serialVersionUID = 1L; + + public Jaxrs2TypesModule() { + super(PackageVersion.VERSION); + + // 26-Dec-2015, tatu: TODO: add custom serializers/deserializers for Link, + // other new JAX-RS 2.0 datatypes. + + addDeserializer(Link.class, new LinkDeserializer()); + + addSerializer(Link.class, new ToStringSerializer(Link.class)); + } + + // yes, will try to avoid duplicate registrations (if MapperFeature enabled) + @Override + public String getModuleName() { + return getClass().getSimpleName(); + } + + @Override + public int hashCode() { + return getClass().hashCode(); + } + + @Override + public boolean equals(Object o) { + return this == o; + } +} diff -Nru jackson-jaxrs-providers-2.7.3/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/JaxRsModule.java jackson-jaxrs-providers-2.8.5/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/JaxRsModule.java --- jackson-jaxrs-providers-2.7.3/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/JaxRsModule.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/JaxRsModule.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -package com.fasterxml.jackson.datatype.jaxrs; - -import com.fasterxml.jackson.databind.module.SimpleModule; - -public class JaxRsModule extends SimpleModule -{ - private static final long serialVersionUID = 1L; - - public JaxRsModule() { - super(PackageVersion.VERSION); - - // 26-Dec-2015, tatu: TODO: add custom serializers/deserializers for Link, - // other new JAX-RS 2.0 datatypes. - } - - // yes, will try to avoid duplicate registrations (if MapperFeature enabled) - @Override - public String getModuleName() { - return getClass().getSimpleName(); - } - - @Override - public int hashCode() { - return getClass().hashCode(); - } - - @Override - public boolean equals(Object o) { - return this == o; - } -} diff -Nru jackson-jaxrs-providers-2.7.3/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/LinkDeserializer.java jackson-jaxrs-providers-2.8.5/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/LinkDeserializer.java --- jackson-jaxrs-providers-2.7.3/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/LinkDeserializer.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/datatypes/src/main/java/com/fasterxml/jackson/datatype/jaxrs/LinkDeserializer.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,55 @@ +package com.fasterxml.jackson.datatype.jaxrs; + +import java.io.IOException; + +import javax.ws.rs.core.Link; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; + +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; + +/** + * @since 2.8 + */ +public class LinkDeserializer extends StdScalarDeserializer +{ + private static final long serialVersionUID = 1L; + + public LinkDeserializer() { + super(Link.class); + } + + @Override + public Link deserialize(JsonParser p, DeserializationContext ctxt) + throws IOException + { + String text = p.getValueAsString(); + if (text != null) { // has String representation + // should we check for empty, and if so, should it become null-value/empty-value? + return Link.valueOf(text); + } + JsonToken t = p.getCurrentToken(); + if (t == JsonToken.START_ARRAY && ctxt.isEnabled(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS)) { + p.nextToken(); + final Link value = deserialize(p, ctxt); + if (p.nextToken() != JsonToken.END_ARRAY) { + handleMissingEndArrayForSingle(p, ctxt); + } + return value; + } + if (t == JsonToken.VALUE_EMBEDDED_OBJECT) { + Object ob = p.getEmbeddedObject(); + if (ob == null) { + return null; + } + if (ob instanceof Link) { + return (Link) ob; + } + } + return (Link) ctxt.handleUnexpectedToken(_valueClass, p); + } + +} diff -Nru jackson-jaxrs-providers-2.7.3/datatypes/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module jackson-jaxrs-providers-2.8.5/datatypes/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module --- jackson-jaxrs-providers-2.7.3/datatypes/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/datatypes/src/main/resources/META-INF/services/com.fasterxml.jackson.databind.Module 2016-11-16 02:14:44.000000000 +0000 @@ -1 +1 @@ -com.fasterxml.jackson.datatype.jaxrs.JaxRsModule +com.fasterxml.jackson.datatype.jaxrs.Jaxrs2TypesModule diff -Nru jackson-jaxrs-providers-2.7.3/datatypes/src/test/java/com/fasterxml/jackson/datatype/jaxrs/LinkTest.java jackson-jaxrs-providers-2.8.5/datatypes/src/test/java/com/fasterxml/jackson/datatype/jaxrs/LinkTest.java --- jackson-jaxrs-providers-2.7.3/datatypes/src/test/java/com/fasterxml/jackson/datatype/jaxrs/LinkTest.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/datatypes/src/test/java/com/fasterxml/jackson/datatype/jaxrs/LinkTest.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,24 @@ +package com.fasterxml.jackson.datatype.jaxrs; + +import javax.ws.rs.core.Link; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class LinkTest extends ModuleTestBase +{ + private final ObjectMapper MAPPER = mapperWithModule(); + + public void testLink() throws Exception + { + Link input = Link.fromUri("http://dot.com?foo=bar") + .type("someType") + .build(); + String json = MAPPER.writeValueAsString(input); + + Link output = MAPPER.readValue(json, Link.class); + + assertNotNull(output); + + assertEquals(input, output); + } +} diff -Nru jackson-jaxrs-providers-2.7.3/datatypes/src/test/java/com/fasterxml/jackson/datatype/jaxrs/ModuleTestBase.java jackson-jaxrs-providers-2.8.5/datatypes/src/test/java/com/fasterxml/jackson/datatype/jaxrs/ModuleTestBase.java --- jackson-jaxrs-providers-2.7.3/datatypes/src/test/java/com/fasterxml/jackson/datatype/jaxrs/ModuleTestBase.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/datatypes/src/test/java/com/fasterxml/jackson/datatype/jaxrs/ModuleTestBase.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,60 @@ +package com.fasterxml.jackson.datatype.jaxrs; + +import java.util.Arrays; + +import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.databind.ObjectMapper; + +public abstract class ModuleTestBase + extends junit.framework.TestCase +{ + protected ObjectMapper mapperWithModule() { + return new ObjectMapper() + .registerModule(new Jaxrs2TypesModule()); + } + + /* + /********************************************************** + /* Additional assertion methods + /********************************************************** + */ + + protected void assertToken(JsonToken expToken, JsonToken actToken) + { + if (actToken != expToken) { + fail("Expected token "+expToken+", current token "+actToken); + } + } + + protected void assertToken(JsonToken expToken, JsonParser jp) + { + assertToken(expToken, jp.getCurrentToken()); + } + + protected void verifyException(Throwable e, String... matches) + { + String msg = e.getMessage(); + String lmsg = (msg == null) ? "" : msg.toLowerCase(); + for (String match : matches) { + String lmatch = match.toLowerCase(); + if (lmsg.indexOf(lmatch) >= 0) { + return; + } + } + fail("Expected an exception with one of substrings ("+Arrays.asList(matches)+"): got one with message \""+msg+"\""); + } + + /* + /********************************************************** + /* Other helper methods + /********************************************************** + */ + + public String quote(String str) { + return '"'+str+'"'; + } + + protected String aposToQuotes(String json) { + return json.replace("'", "\""); + } +} diff -Nru jackson-jaxrs-providers-2.7.3/debian/changelog jackson-jaxrs-providers-2.8.5/debian/changelog --- jackson-jaxrs-providers-2.7.3/debian/changelog 2016-04-09 22:27:20.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/changelog 2017-02-05 22:39:06.000000000 +0000 @@ -1,3 +1,23 @@ +jackson-jaxrs-providers (2.8.5-2) unstable; urgency=medium + + * Team upload. + * Modify buildsystem patch for jackson-core 2.8.6 and build-depend + on this version in debian/control. Addresses FTBFS (Closes: #852919). + + -- tony mancill Sun, 05 Feb 2017 14:39:06 -0800 + +jackson-jaxrs-providers (2.8.5-1) unstable; urgency=medium + + * Team upload. + * New upstream release + - New build dependency on libjaxrs-api-java + * Build the jackson-jaxrs-{cbor,xml,yaml}-provider modules + * Inherit from the parent POM and simplified the packaging + * Merged the Build-Depends-Indep field into Build-Depends + * Switch to debhelper level 10 + + -- Emmanuel Bourg Wed, 21 Dec 2016 15:01:56 +0100 + jackson-jaxrs-providers (2.7.3-1) unstable; urgency=medium * Team upload. diff -Nru jackson-jaxrs-providers-2.7.3/debian/compat jackson-jaxrs-providers-2.8.5/debian/compat --- jackson-jaxrs-providers-2.7.3/debian/compat 2016-04-09 07:44:58.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/compat 2017-02-05 22:39:06.000000000 +0000 @@ -1 +1 @@ -9 +10 diff -Nru jackson-jaxrs-providers-2.7.3/debian/control jackson-jaxrs-providers-2.8.5/debian/control --- jackson-jaxrs-providers-2.7.3/debian/control 2016-04-09 22:13:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/control 2017-02-05 22:39:06.000000000 +0000 @@ -3,15 +3,24 @@ Priority: optional Maintainer: Debian Java Maintainers Uploaders: Timo Aaltonen -Build-Depends: debhelper (>= 9), default-jdk, maven-debian-helper (>= 1.5), - xmlstarlet, -Build-Depends-Indep: - libjackson2-core-java (>= 2.7.3), - libjackson2-databind-java (>= 2.7.3), +Build-Depends: + debhelper (>= 10), + default-jdk, + libbuild-helper-maven-plugin-java, + libjackson2-core-java (>= 2.8.6), + libjackson2-databind-java (>= 2.8.6), + libjackson2-dataformat-cbor (>= 2.7.3), libjackson2-dataformat-smile (>= 2.7.3), + libjackson2-dataformat-xml-java (>= 2.8.6), + libjackson2-dataformat-yaml (>= 2.8.6), libjackson2-module-jaxb-annotations-java (>= 2.4), + libjaxrs-api-java, libjsr311-api-java, libmaven-bundle-plugin-java, + libreplacer-java, + libwoodstox-java, + maven-debian-helper (>= 1.5), + xmlstarlet Standards-Version: 3.9.8 Vcs-Git: https://anonscm.debian.org/git/pkg-java/jackson-jaxrs-providers.git Vcs-Browser: https://anonscm.debian.org/cgit/pkg-java/jackson-jaxrs-providers.git diff -Nru jackson-jaxrs-providers-2.7.3/debian/libjackson2-jaxrs-providers-java.poms jackson-jaxrs-providers-2.8.5/debian/libjackson2-jaxrs-providers-java.poms --- jackson-jaxrs-providers-2.7.3/debian/libjackson2-jaxrs-providers-java.poms 2016-04-09 22:09:29.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/libjackson2-jaxrs-providers-java.poms 2017-02-05 22:39:06.000000000 +0000 @@ -25,10 +25,10 @@ # --site-xml=: Optional, the location for site.xml if it needs to be installed. # Empty by default. [mh_install] # -pom.xml --no-parent --has-package-version -base/pom.xml --has-package-version -cbor/pom.xml --ignore -json/pom.xml --has-package-version -smile/pom.xml --has-package-version -xml/pom.xml --ignore -yaml/pom.xml --ignore +pom.xml --has-package-version +base/pom.xml --has-package-version --java-lib +cbor/pom.xml --has-package-version --java-lib +json/pom.xml --has-package-version --java-lib +smile/pom.xml --has-package-version --java-lib +xml/pom.xml --has-package-version --java-lib +yaml/pom.xml --has-package-version --java-lib diff -Nru jackson-jaxrs-providers-2.7.3/debian/maven.ignoreRules jackson-jaxrs-providers-2.8.5/debian/maven.ignoreRules --- jackson-jaxrs-providers-2.7.3/debian/maven.ignoreRules 2016-04-09 22:09:29.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/maven.ignoreRules 2017-02-05 22:39:06.000000000 +0000 @@ -1,10 +1,11 @@ -com.fasterxml.jackson.jaxrs jackson-jaxrs-cbor-provider bundle * * * -com.fasterxml.jackson.jaxrs jackson-jaxrs-xml-provider bundle * * * -com.google.code.maven-replacer-plugin replacer * * * * com.sun.jersey jersey-core * * * * com.sun.jersey jersey-server * * * * com.sun.jersey jersey-servlet * * * * org.eclipse.jetty jetty-server * * * * org.eclipse.jetty jetty-servlet * * * * org.jboss.resteasy resteasy-jackson2-provider * * * * +org.jboss.resteasy resteasy-jaxrs * * * * +org.glassfish.jersey.core jersey-server * * * * +org.glassfish.jersey.containers jersey-container-servlet * * * * +junit junit * * * * diff -Nru jackson-jaxrs-providers-2.7.3/debian/maven.publishedRules jackson-jaxrs-providers-2.8.5/debian/maven.publishedRules --- jackson-jaxrs-providers-2.7.3/debian/maven.publishedRules 2016-04-09 22:09:29.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/maven.publishedRules 2017-02-05 22:39:06.000000000 +0000 @@ -1,5 +1,8 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-providers pom s/2\..*/2.x/ * * com.fasterxml.jackson.jaxrs jackson-jaxrs-base * s/2\..*/2.x/ * * +com.fasterxml.jackson.jaxrs jackson-jaxrs-cbor-provider * s/2\..*/2.x/ * * com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider * s/2\..*/2.x/ * * com.fasterxml.jackson.jaxrs jackson-jaxrs-smile-provider * s/2\..*/2.x/ * * +com.fasterxml.jackson.jaxrs jackson-jaxrs-xml-provider * s/2\..*/2.x/ * * +com.fasterxml.jackson.jaxrs jackson-jaxrs-yaml-provider * s/2\..*/2.x/ * * diff -Nru jackson-jaxrs-providers-2.7.3/debian/maven.rules jackson-jaxrs-providers-2.8.5/debian/maven.rules --- jackson-jaxrs-providers-2.7.3/debian/maven.rules 2016-04-09 22:12:39.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/maven.rules 2017-02-05 22:39:06.000000000 +0000 @@ -1,9 +1,18 @@ +com.fasterxml.jackson jackson-parent pom s/.*/debian/ * * com.fasterxml.jackson.jaxrs jackson-jaxrs-base * s/.*/2.x/ * * +com.fasterxml.jackson.jaxrs jackson-jaxrs-cbor-provider * s/.*/2.x/ * * com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider * s/.*/2.x/ * * com.fasterxml.jackson.jaxrs jackson-jaxrs-smile-provider * s/.*/2.x/ * * +com.fasterxml.jackson.jaxrs jackson-jaxrs-xml-provider * s/.*/2.x/ * * +com.fasterxml.jackson.jaxrs jackson-jaxrs-yaml-provider * s/.*/2.x/ * * com.fasterxml.jackson.jaxrs jackson-jaxrs-providers pom s/.*/2.x/ * * com.fasterxml.jackson.core jackson-core * s/.*/2.x/ * * com.fasterxml.jackson.core jackson-databind * s/.*/2.x/ * * com.fasterxml.jackson.module jackson-module-jaxb-annotations * s/.*/2.x/ * * +com.fasterxml.jackson.dataformat jackson-dataformat-cbor * s/.*/2.x/ * * com.fasterxml.jackson.dataformat jackson-dataformat-smile * s/.*/2.x/ * * +com.fasterxml.jackson.dataformat jackson-dataformat-xml * s/.*/2.x/ * * +com.fasterxml.jackson.dataformat jackson-dataformat-yaml * s/.*/2.x/ * * +junit junit * s/.*/4.x/ * * +org.codehaus.woodstox s/woodstox-core-asl/woodstox-core-lgpl/ * s/.*/debian/ * * diff -Nru jackson-jaxrs-providers-2.7.3/debian/patches/fix-bundle-dependencies.patch jackson-jaxrs-providers-2.8.5/debian/patches/fix-bundle-dependencies.patch --- jackson-jaxrs-providers-2.7.3/debian/patches/fix-bundle-dependencies.patch 2016-04-09 22:09:03.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/patches/fix-bundle-dependencies.patch 2017-02-05 22:39:06.000000000 +0000 @@ -1,20 +1,90 @@ --- a/smile/pom.xml +++ b/smile/pom.xml -@@ -34,6 +34,7 @@ +@@ -34,12 +34,14 @@ jackson-jaxrs-base - com.fasterxml.jackson.jaxrs - 2.7.3 + ${project.groupId} + ${project.version} + bundle + com.fasterxml.jackson.core + jackson-core + ${version.jackson.core} ++ bundle + + + com.fasterxml.jackson.core --- a/json/pom.xml +++ b/json/pom.xml +@@ -34,12 +34,14 @@ + jackson-jaxrs-base + ${project.groupId} + ${project.version} ++ bundle + + + + com.fasterxml.jackson.core + jackson-core + ${version.jackson.core} ++ bundle + + + com.fasterxml.jackson.core +--- a/xml/pom.xml ++++ b/xml/pom.xml +@@ -33,6 +33,7 @@ + jackson-jaxrs-base + ${project.groupId} + ${project.version} ++ bundle + + + +--- a/cbor/pom.xml ++++ b/cbor/pom.xml @@ -34,6 +34,7 @@ jackson-jaxrs-base - com.fasterxml.jackson.jaxrs - 2.7.3 + ${project.groupId} + ${project.version} ++ bundle + + + +--- a/yaml/pom.xml ++++ b/yaml/pom.xml +@@ -35,6 +35,7 @@ + jackson-jaxrs-base + ${project.groupId} + ${project.version} + bundle +@@ -64,12 +65,14 @@ + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${project.version} ++ bundle + test + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-smile-provider + ${project.version} ++ bundle + test + + +--- a/pom.xml ++++ b/pom.xml +@@ -33,7 +33,7 @@ + + UTF-8 + +- 2.8.5 ++ 2.8.6 + ${version.jackson.core} + + ${version.dataformats} diff -Nru jackson-jaxrs-providers-2.7.3/debian/patches/fix-using-bundle.diff jackson-jaxrs-providers-2.8.5/debian/patches/fix-using-bundle.diff --- jackson-jaxrs-providers-2.7.3/debian/patches/fix-using-bundle.diff 2016-04-09 22:05:13.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/patches/fix-using-bundle.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ ---- a/pom.xml -+++ b/pom.xml -@@ -109,4 +109,16 @@ - - - -+ -+ -+ -+ -+ org.apache.felix -+ maven-bundle-plugin -+ 2.3.5 -+ true -+ -+ -+ -+ - diff -Nru jackson-jaxrs-providers-2.7.3/debian/patches/force-core-version.diff jackson-jaxrs-providers-2.8.5/debian/patches/force-core-version.diff --- jackson-jaxrs-providers-2.7.3/debian/patches/force-core-version.diff 2016-04-09 21:49:08.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/patches/force-core-version.diff 1970-01-01 00:00:00.000000000 +0000 @@ -1,89 +0,0 @@ ---- a/base/pom.xml -+++ b/base/pom.xml -@@ -32,12 +32,12 @@ - - com.fasterxml.jackson.core - jackson-core -- ${version.jackson.core} -+ 2.7.3 - - - com.fasterxml.jackson.core - jackson-databind -- ${version.jackson.core} -+ 2.7.3 - - - ---- a/json/pom.xml -+++ b/json/pom.xml -@@ -32,25 +32,25 @@ - - - jackson-jaxrs-base -- ${project.groupId} -- ${project.version} -+ com.fasterxml.jackson.jaxrs -+ 2.7.3 - - - - com.fasterxml.jackson.core - jackson-core -- ${version.jackson.core} -+ 2.7.3 - - - com.fasterxml.jackson.core - jackson-databind -- ${version.jackson.core} -+ 2.7.3 - - - - com.fasterxml.jackson.module - jackson-module-jaxb-annotations -- ${version.jackson.jaxb} -+ 2.7.3 - - - ---- a/smile/pom.xml -+++ b/smile/pom.xml -@@ -32,30 +32,30 @@ - - - jackson-jaxrs-base -- ${project.groupId} -- ${project.version} -+ com.fasterxml.jackson.jaxrs -+ 2.7.3 - - - - com.fasterxml.jackson.core - jackson-core -- ${version.jackson.core} -+ 2.7.3 - - - com.fasterxml.jackson.core - jackson-databind -- ${version.jackson.core} -+ 2.7.3 - - - com.fasterxml.jackson.dataformat - jackson-dataformat-smile -- ${version.jackson.smile} -+ 2.7.3 - - - - com.fasterxml.jackson.module - jackson-module-jaxb-annotations -- ${version.jackson.jaxb} -+ 2.7.3 - - - diff -Nru jackson-jaxrs-providers-2.7.3/debian/patches/series jackson-jaxrs-providers-2.8.5/debian/patches/series --- jackson-jaxrs-providers-2.7.3/debian/patches/series 2016-04-09 22:14:05.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/patches/series 2017-02-05 22:39:06.000000000 +0000 @@ -1,3 +1 @@ -force-core-version.diff -fix-using-bundle.diff fix-bundle-dependencies.patch diff -Nru jackson-jaxrs-providers-2.7.3/debian/replace-generate.sh jackson-jaxrs-providers-2.8.5/debian/replace-generate.sh --- jackson-jaxrs-providers-2.7.3/debian/replace-generate.sh 2016-04-09 07:44:58.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/replace-generate.sh 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -#!/bin/sh - -# Simple replacement for mavan-replacer-plugin - -set -e - -TARGET=$1; shift - -TEMPLATE=$TARGET.in - -get_attr() { - < pom.xml xmlstarlet sel \ - -N pom=http://maven.apache.org/POM/4.0.0 \ - -T -t -v $1 -} - -package=$(dirname $TARGET | sed -e 's,.*src/main/java/\(.*\)$,\1,' | tr / .) -projectversion=$(get_attr '/pom:project/pom:version') -projectgroupid=$(get_attr '/pom:project/pom:groupId') -projectartifactid=$(get_attr '/pom:project/pom:artifactId') - -sed \ - -e "s,@package@,$package,g" \ - -e "s,@projectversion@,$projectversion,g" \ - -e "s,@projectgroupid@,$projectgroupid,g" \ - -e "s,@projectartifactid@,$projectartifactid,g" \ - < $TEMPLATE > $TARGET.t - -if grep -i '@[a-z]*@' $TARGET.t >&2; then - echo 'Not all tags were - replaced' >&2 exit 1 -fi - -mv $TARGET.t $TARGET diff -Nru jackson-jaxrs-providers-2.7.3/debian/rules jackson-jaxrs-providers-2.8.5/debian/rules --- jackson-jaxrs-providers-2.7.3/debian/rules 2016-04-09 22:27:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/debian/rules 2017-02-05 22:39:06.000000000 +0000 @@ -1,23 +1,7 @@ #!/usr/bin/make -f -VERSION_FILES = \ - json/src/main/java/com/fasterxml/jackson/jaxrs/json/PackageVersion.java \ - xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/PackageVersion.java \ - smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/PackageVersion.java \ - cbor/src/main/java/com/fasterxml/jackson/jaxrs/cbor/PackageVersion.java - %: - dh $@ --buildsystem=maven - -override_dh_auto_configure: - for file in $(VERSION_FILES); do \ - sh debian/replace-generate.sh $$file \ - ; done - dh_auto_configure - -override_dh_auto_clean: - rm -f $(VERSION_FILES) - dh_auto_clean + dh $@ get-orig-source: uscan --download-current-version --force-download --rename diff -Nru jackson-jaxrs-providers-2.7.3/.gitattributes jackson-jaxrs-providers-2.8.5/.gitattributes --- jackson-jaxrs-providers-2.7.3/.gitattributes 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/.gitattributes 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,3 @@ +# Do not merge `pom.xml` from older version, as it will typically conflict + +pom.xml merge=ours diff -Nru jackson-jaxrs-providers-2.7.3/json/pom.xml jackson-jaxrs-providers-2.8.5/json/pom.xml --- jackson-jaxrs-providers-2.7.3/json/pom.xml 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/json/pom.xml 2016-11-16 02:14:44.000000000 +0000 @@ -4,7 +4,7 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-providers - 2.7.3 + 2.8.5 jackson-jaxrs-json-provider Jackson-JAXRS-JSON @@ -53,11 +53,21 @@ ${version.jackson.jaxb} - + + org.jboss.resteasy resteasy-jackson2-provider - 3.0.6.Final + 3.0.17.Final + test + + + org.jboss.resteasy + resteasy-jaxrs + 3.0.17.Final test diff -Nru jackson-jaxrs-providers-2.7.3/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JsonMappingExceptionMapper.java jackson-jaxrs-providers-2.8.5/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JsonMappingExceptionMapper.java --- jackson-jaxrs-providers-2.7.3/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JsonMappingExceptionMapper.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JsonMappingExceptionMapper.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -package com.fasterxml.jackson.jaxrs.json; - -import javax.ws.rs.ext.Provider; - -/** - * @deprecated Since 2.2 use {@link com.fasterxml.jackson.jaxrs.base.JsonMappingExceptionMapper} instead. - */ -@Deprecated -@Provider -public class JsonMappingExceptionMapper extends com.fasterxml.jackson.jaxrs.base.JsonMappingExceptionMapper { } diff -Nru jackson-jaxrs-providers-2.7.3/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JsonParseExceptionMapper.java jackson-jaxrs-providers-2.8.5/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JsonParseExceptionMapper.java --- jackson-jaxrs-providers-2.7.3/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JsonParseExceptionMapper.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/json/src/main/java/com/fasterxml/jackson/jaxrs/json/JsonParseExceptionMapper.java 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -package com.fasterxml.jackson.jaxrs.json; - -import javax.ws.rs.ext.Provider; - -/** - * @deprecated Use {@link com.fasterxml.jackson.jaxrs.base.JsonParseExceptionMapper} instead. - */ -@Deprecated -@Provider -public class JsonParseExceptionMapper extends com.fasterxml.jackson.jaxrs.base.JsonParseExceptionMapper { } diff -Nru jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/dw/SimpleEndpointTestBase.java jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/dw/SimpleEndpointTestBase.java --- jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/dw/SimpleEndpointTestBase.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/dw/SimpleEndpointTestBase.java 2016-11-16 02:14:44.000000000 +0000 @@ -1,20 +1,58 @@ package com.fasterxml.jackson.jaxrs.json.dw; -import java.io.*; -import java.net.*; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; import java.util.List; +import java.util.Map.Entry; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Invocation.Builder; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.GenericEntity; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.Link; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; +import javax.ws.rs.core.UriBuilder; +import javax.ws.rs.core.UriInfo; import org.eclipse.jetty.server.Server; import org.junit.Assert; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.MappingIterator; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; public abstract class SimpleEndpointTestBase extends ResourceTestBase { @@ -40,6 +78,105 @@ } } + protected static abstract class Page { + + public static final String PREV_PAGE_REL = "prev"; + public static final String NEXT_PAGE_REL = "next"; + + public final Link getPreviousPageLink() { + return getLink(PREV_PAGE_REL); + } + + public final Link getNextPageLink() { + return getLink(NEXT_PAGE_REL); + } + + public abstract List getEntities(); + + public abstract Link getLink(String rel); + + } + + @JsonPropertyOrder({ "entities", "links" }) + @JsonAutoDetect(fieldVisibility = Visibility.ANY, creatorVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, isGetterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) + protected static class PageImpl extends Page { + + protected static class JsonLinkSerializer extends JsonSerializer { + + static final String HREF_PROPERTY = "href"; + + @Override + public void serialize(Link link, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) + throws IOException { + jsonGenerator.writeStartObject(); + jsonGenerator.writeStringField(HREF_PROPERTY, link.getUri().toString()); + for (Entry entry : link.getParams().entrySet()) { + jsonGenerator.writeStringField(entry.getKey(), entry.getValue()); + } + jsonGenerator.writeEndObject(); + } + + } + + protected static class JsonLinkDeserializer extends JsonDeserializer { + + @Override + public Link deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) + throws IOException { + Link link = null; + JsonNode jsonNode = jsonParser.getCodec(). readTree(jsonParser); + JsonNode hrefJsonNode = jsonNode.get(JsonLinkSerializer.HREF_PROPERTY); + if (hrefJsonNode != null) { + Link.Builder linkBuilder = Link.fromUri(hrefJsonNode.asText()); + Iterator fieldNamesIterator = jsonNode.fieldNames(); + while (fieldNamesIterator.hasNext()) { + String fieldName = fieldNamesIterator.next(); + if (!JsonLinkSerializer.HREF_PROPERTY.equals(fieldName)) { + linkBuilder.param(fieldName, jsonNode.get(fieldName).asText()); + } + } + link = linkBuilder.build(); + } + return link; + } + + } + + private final List entities; + @JsonSerialize(contentUsing = JsonLinkSerializer.class) + @JsonDeserialize(contentUsing = JsonLinkDeserializer.class) + private final List links; + + protected PageImpl() { + this.entities = new ArrayList<>(); + this.links = new ArrayList<>(); + } + + public void addEntities(E... entitities) { + Collections.addAll(this.entities, entitities); + } + + public void addLinks(Link... links) { + Collections.addAll(this.links, links); + } + + @Override + public List getEntities() { + return this.entities; + } + + @Override + public Link getLink(String rel) { + for (Link link : this.links) { + if (link.getRel().equals(rel)) { + return link; + } + } + return null; + } + + } + @Path("/point") public static class SimpleResource { @@ -57,6 +194,13 @@ return new Point(1, 2); } + @Path("/custom") + @GET + @Produces({ MediaType.APPLICATION_JSON, "application/vnd.com.example.v1+json" }) + public Point getPointCustomMediaType() { + return new Point(1, 2); + } + @Path("/max") @POST @Consumes(MediaType.APPLICATION_JSON) @@ -142,6 +286,9 @@ @Path("/dynamic") public static class DynamicTypingResource { + @Context + private UriInfo uriInfo; + @GET @Path("single") @Produces(MediaType.APPLICATION_JSON) @@ -155,6 +302,53 @@ public List getPoints() { return Arrays.asList(getPoint()); } + + @GET + @Path("genericPageEntity") + @Produces(MediaType.APPLICATION_JSON) + public Response getPointsAsGenericPageEntity() { + PageImpl page = new PageImpl<>(); + page.addEntities(getPoint()); + URI selfUri = UriBuilder.fromUri(this.uriInfo.getBaseUri()).path(DynamicTypingResource.class) + .path(DynamicTypingResource.class, "getPointsAsGenericPageEntity").build(); + page.addLinks(Link.fromUri(selfUri).rel("self").build()); + return Response.ok(new GenericEntity>(page) { + }).build(); + } + + @GET + @Path("genericPageImplEntity") + @Produces(MediaType.APPLICATION_JSON) + public Response getPointsAsGenericPageImplEntity() { + PageImpl page = new PageImpl<>(); + page.addEntities(getPoint()); + URI selfUri = UriBuilder.fromUri(this.uriInfo.getBaseUri()).path(DynamicTypingResource.class) + .path(DynamicTypingResource.class, "getPointsAsGenericPageImplEntity").build(); + page.addLinks(Link.fromUri(selfUri).rel("self").build()); + return Response.ok(new GenericEntity>(page) { + }).build(); + } + + @GET + @Path("genericCollectionEntity") + @Produces(MediaType.APPLICATION_JSON) + public Response getPointsAsGenericCollectionEntity() { + Collection list = new ArrayList<>(); + list.add(getPoint()); + return Response.ok(new GenericEntity>(list) { + }).build(); + } + + @GET + @Path("genericCollectionImplEntity") + @Produces(MediaType.APPLICATION_JSON) + public Response getPointsAsGenericCollectionImplEntity() { + ArrayList list = new ArrayList<>(); + list.add(getPoint()); + return Response.ok(new GenericEntity>(list) { + }).build(); + } + } public static class SimpleRawApp extends JsonApplicationWithJackson { @@ -200,6 +394,7 @@ Server server = startServer(TEST_PORT, SimpleResourceApp.class); URL urlJS = new URL("http://localhost:"+TEST_PORT+"/point/javascript"); URL urlJsonX = new URL("http://localhost:"+TEST_PORT+"/point/jsonx"); + URL urlCustom = new URL("http://localhost:"+TEST_PORT+"/point/custom"); try { HttpURLConnection conn = (HttpURLConnection) urlJS.openConnection(); @@ -241,6 +436,21 @@ assertEquals(1, p.x); assertEquals(2, p.y); conn.disconnect(); + + conn = (HttpURLConnection) urlCustom.openConnection(); + conn.setRequestProperty("Accept", "application/vnd.com.example.v1+json"); + assertEquals(HttpURLConnection.HTTP_OK, conn.getResponseCode()); + in = conn.getInputStream(); + p = null; + try { + p = mapper.readValue(in, Point.class); + } finally { + in.close(); + } + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + conn.disconnect(); } finally { server.stop(); } @@ -384,4 +594,73 @@ fail("Expected p.z == 3, was "+p.z+"; most likely due to incorrect serialization using base type (issue #60)"); } } + + // for [#87], problems with GenericEntity where type != rawType + public void testDynamicTypingGenericPageEntity() throws Exception { + testDynamicTypingPage(URI.create("http://localhost:" + TEST_PORT + "/dynamic/genericPageEntity")); + } + + // for [#87], problems with GenericEntity where type != rawType + public void testDynamicTypingGenericPageImplEntity() throws Exception { + testDynamicTypingPage(URI.create("http://localhost:" + TEST_PORT + "/dynamic/genericPageImplEntity")); + } + + // for [#87], problems with GenericEntity where type != rawType + private void testDynamicTypingPage(URI uri) throws Exception { + Server server = startServer(TEST_PORT, SimpleDynamicTypingApp.class); + Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class); + try { + Builder invocationBuilder = client.target(uri).request(MediaType.APPLICATION_JSON_TYPE); + + // Test that JSON serialization on server side correctly take + // @JsonAutoDetect into account + String response = invocationBuilder.get(String.class); + assertFalse(response.contains("previousPageLink")); + + PageImpl page = invocationBuilder.get(new GenericType>() { + }); + Link expectedLink = Link.fromUri(uri).rel("self").build(); + Link currentLink = page.getLink("self"); + assertEquals(expectedLink, currentLink); + } finally { + server.stop(); + client.close(); + } + } + + // for [#87], problems with GenericEntity where type != rawType + public void testDynamicTypingGenericCollectionEntity() throws Exception { + testDynamicTypingCollection(URI.create("http://localhost:" + TEST_PORT + "/dynamic/genericCollectionEntity")); + } + + // for [#87], problems with GenericEntity where type != rawType + public void testDynamicTypingGenericCollectionImplEntity() throws Exception { + testDynamicTypingCollection(URI + .create("http://localhost:" + TEST_PORT + "/dynamic/genericCollectionImplEntity")); + } + + // for [#87], problems with GenericEntity where type != rawType + private void testDynamicTypingCollection(URI uri) throws Exception { + Server server = startServer(TEST_PORT, SimpleDynamicTypingApp.class); + Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class); + try { + ArrayList collection = client.target(uri).request(MediaType.APPLICATION_JSON_TYPE) + .get(new GenericType>() { + }); + assertNotNull(collection); + assertEquals(1, collection.size()); + // ensure we got a valid Point + ExtendedPoint p = collection.iterator().next(); + assertEquals(1, p.x); + assertEquals(2, p.y); + if (p.z != 3) { + fail("Expected p.z == 3, was " + p.z + + "; most likely due to incorrect serialization using base type (issue #60)"); + } + } finally { + server.stop(); + client.close(); + } + } + } diff -Nru jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/AnnotationTest.java jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/AnnotationTest.java --- jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/AnnotationTest.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/AnnotationTest.java 2016-11-16 02:14:44.000000000 +0000 @@ -3,7 +3,8 @@ import javax.servlet.Servlet; import com.fasterxml.jackson.jaxrs.json.dw.AnnotationTestBase; -import com.sun.jersey.spi.container.servlet.ServletContainer; + +import org.glassfish.jersey.servlet.ServletContainer; public class AnnotationTest extends AnnotationTestBase { @Override diff -Nru jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/SimpleEndpointTest.java jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/SimpleEndpointTest.java --- jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/SimpleEndpointTest.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/SimpleEndpointTest.java 2016-11-16 02:14:44.000000000 +0000 @@ -3,7 +3,8 @@ import javax.servlet.Servlet; import com.fasterxml.jackson.jaxrs.json.dw.SimpleEndpointTestBase; -import com.sun.jersey.spi.container.servlet.ServletContainer; + +import org.glassfish.jersey.servlet.ServletContainer; public class SimpleEndpointTest extends SimpleEndpointTestBase { @Override diff -Nru jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/WriteModificationsTest.java jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/WriteModificationsTest.java --- jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/WriteModificationsTest.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/jersey/WriteModificationsTest.java 2016-11-16 02:14:44.000000000 +0000 @@ -3,7 +3,8 @@ import javax.servlet.Servlet; import com.fasterxml.jackson.jaxrs.json.dw.WriteModificationsTestBase; -import com.sun.jersey.spi.container.servlet.ServletContainer; + +import org.glassfish.jersey.servlet.ServletContainer; public class WriteModificationsTest extends WriteModificationsTestBase { @Override diff -Nru jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/TestJSONVersions.java jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/TestJSONVersions.java --- jackson-jaxrs-providers-2.7.3/json/src/test/java/com/fasterxml/jackson/jaxrs/json/TestJSONVersions.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/json/src/test/java/com/fasterxml/jackson/jaxrs/json/TestJSONVersions.java 2016-11-16 02:14:44.000000000 +0000 @@ -19,7 +19,7 @@ private void assertVersion(Versioned vers) { final Version v = vers.version(); - assertFalse("Should find version information (got "+v+")", v.isUknownVersion()); + assertFalse("Should find version information (got "+v+")", v.isUnknownVersion()); Version exp = PackageVersion.VERSION; assertEquals(exp.toFullString(), v.toFullString()); assertEquals(exp, v); diff -Nru jackson-jaxrs-providers-2.7.3/pom.xml jackson-jaxrs-providers-2.8.5/pom.xml --- jackson-jaxrs-providers-2.7.3/pom.xml 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/pom.xml 2016-11-16 02:14:44.000000000 +0000 @@ -4,38 +4,36 @@ com.fasterxml.jackson jackson-parent - 2.7 + 2.8 com.fasterxml.jackson.jaxrs jackson-jaxrs-providers Jackson JAX-RS - 2.7.3 + 2.8.5 pom Parent for Jackson JAX-RS providers base - cbor json smile xml yaml - http://wiki.fasterxml.com/JacksonHome + http://github.com/FasterXML/jackson-jaxrs-providers scm:git:git@github.com:FasterXML/jackson-jaxrs-providers.git scm:git:git@github.com:FasterXML/jackson-jaxrs-providers.git http://github.com/FasterXML/jackson-jaxrs-providers - jackson-jaxrs-providers-2.7.3 + jackson-jaxrs-providers-2.8.5 UTF-8 - 2.7.3 + 2.8.5 ${version.jackson.core} ${version.dataformats} @@ -45,12 +43,12 @@ ${version.jackson.core} - - 1.17.1 - 8.1.10.v20130312 + + 2.22.2 + 9.2.13.v20150730 - [1.1.1,2.1) + [2.0,2.1) @@ -62,12 +60,8 @@ javax.ws.rs - jsr311-api - 1.1.1 - + 2.0.1 provided @@ -76,6 +70,12 @@ NOTE: use 1.2 as that's JDK 1.5; later (1.8) versions need JDK 1.6 --> + + junit + junit + test + + org.eclipse.jetty jetty-server @@ -90,23 +90,44 @@ - com.sun.jersey - jersey-core - ${version.jersey} - test - - - com.sun.jersey + org.glassfish.jersey.core jersey-server ${version.jersey} test + + + com.google.guava + guava + + + org.slf4j + slf4j-api + + - com.sun.jersey - jersey-servlet + org.glassfish.jersey.containers + jersey-container-servlet ${version.jersey} test + + + + + + org.apache.felix + maven-bundle-plugin + 3.2.0 + + + <_nouses>false + + + + + + diff -Nru jackson-jaxrs-providers-2.7.3/README.md jackson-jaxrs-providers-2.8.5/README.md --- jackson-jaxrs-providers-2.7.3/README.md 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/README.md 2016-11-16 02:14:44.000000000 +0000 @@ -6,7 +6,7 @@ * [Smile](https://github.com/FasterXML/jackson-dataformat-smile) (binary JSON) * [CBOR](https://github.com/FasterXML/jackson-dataformat-cbor) (another kind of binary JSON) * [XML](https://github.com/FasterXML/jackson-dataformat-xml) -* [YAML](https://github.com/FasterXML/jackson-dataformat-yaml) (starting with 2.6.0, to be released) +* [YAML](https://github.com/FasterXML/jackson-dataformat-yaml) Providers implement JAX-RS `MessageBodyReader` and `MessageBodyWriter` handlers for specific data formats. They also contain SPI settings for auto-registration. @@ -17,7 +17,7 @@ ## Status -As of Jackson 2.2, this module replaces individual JAX-RS provider modules that were used with earlier Jackson versions. +Module is fully functional and considered mature. ## Maven dependency @@ -27,13 +27,13 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider - 2.5.4 + 2.7.4 ``` (above is for JSON provider; modify appropriately for other providers) -## Usage +## Usage: registering providers Due to auto-registration, it should be possible to simply add Maven dependency (or include jar if using other build systems) and let JAX-RS implementation discover @@ -42,10 +42,26 @@ To use Jackson with Jersey see [their documentation](https://jersey.java.net/documentation/latest/media.html#json.jackson). +### Usage: registering supporting datatypes module + +As of Jackson 2.8, there is a small supporting datatype module, `jackson-datatype-jaxrs` (see under `datatypes/`). +It will not be auto-registered automatically (unless user calls `ObjectMapper.findAndRegisterModules()`); instead, +user has to register it by normal means: + +```java +ObjectMapper mapper = new ObjectMapper(); +mapper.registerModule(new Jaxrs2TypesModule()); +// and then register mapper with JAX-RS provider(s) +``` + +and ensuring that configured mapper is used by JAX-RS providers. + +It is possible that later versions of providers may offer additional ways to get datatype module registered. + ### Annotations on resources In addition to annotation value classes, it is also possible to use a subset -of Jackson annotations with provider (versions 2.3.0 and above). +of Jackson annotations with provider. Here is a short list of supported annotations that work with all formats: diff -Nru jackson-jaxrs-providers-2.7.3/release-notes/CREDITS jackson-jaxrs-providers-2.8.5/release-notes/CREDITS --- jackson-jaxrs-providers-2.7.3/release-notes/CREDITS 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/release-notes/CREDITS 2016-11-16 02:14:44.000000000 +0000 @@ -41,3 +41,14 @@ M. Tarık Yurt (mtyurt@github) * Contributed #68: Add YAML provider (2.6.0) + +Nick Kleinschmidt (kleinsch@github) + +* Reported, contributed fix for #80: Non-JSON providers don't + support custom MIME types with extensions + (2.7.4) + +Tim Ward (timothyjward@github) + +* Contributed #93: Jackson OSGi metadata is incomplete + (2.8.5) diff -Nru jackson-jaxrs-providers-2.7.3/release-notes/VERSION jackson-jaxrs-providers-2.8.5/release-notes/VERSION --- jackson-jaxrs-providers-2.7.3/release-notes/VERSION 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/release-notes/VERSION 2016-11-16 02:14:44.000000000 +0000 @@ -9,6 +9,42 @@ === Releases === ------------------------------------------------------------------------ +2.8.5 (16-Nov-2016) + +#91: Implemented dynamic selection of NoContentException to try to + support JAX-RS 1.x. + (contributed by Spikhalskiy@github) +#93: Jackson OSGi metadata is incomplete + (contributed by Tim W) + +2.8.4 (14-Oct-2016) +2.8.3 (17-Sep-2016) +2.8.2 (30-Aug-2016) + +No changes since 2.8.1 + +2.8.1 (20-Jul-2016) + +#87: JacksonJaxbJsonProvider should use the real "value.getClass()" to build the root type + +2.8.0 (05-Jul-2016) + +#22: Remove `@Provider` annotation from `JsonParseExceptionMapper` and + `JsonMappingExceptionMapper` +#48: Support compact serialization of `javax.ws.rs.core.Link`, deserialization +#82: Upgrade JAX-RS dependency to 2.0 +#86: ContextResolver must be called first when provided + (requested by NicoNes@github) + +2.7.5 (11-Jun-2016) + +No change since 2.7.4 + +2.7.4 (29-Apr-2016) + +#80: Non-JSON providers don't support custom MIME types with extensions + (reported and fixed by Nick K) + 2.7.3 (16-Mar-2016) 2.7.2 (27-Feb-2016) 2.7.1 (02-Feb-2016) @@ -19,6 +55,9 @@ No changes since 2.6. +2.6.6 (05-Apr-2016) +2.6.5 (19-Jan-2016) +2.6.4 (07-Dec-2015) 2.6.3 (12-Oct-2015) 2.6.2 (15-Sep-2015) 2.6.1 (09-Aug-2015) diff -Nru jackson-jaxrs-providers-2.7.3/smile/pom.xml jackson-jaxrs-providers-2.8.5/smile/pom.xml --- jackson-jaxrs-providers-2.7.3/smile/pom.xml 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/smile/pom.xml 2016-11-16 02:14:44.000000000 +0000 @@ -4,7 +4,7 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-providers - 2.7.3 + 2.8.5 jackson-jaxrs-smile-provider Jackson-JAXRS-Smile diff -Nru jackson-jaxrs-providers-2.7.3/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonJaxbSmileProvider.java jackson-jaxrs-providers-2.8.5/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonJaxbSmileProvider.java --- jackson-jaxrs-providers-2.7.3/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonJaxbSmileProvider.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonJaxbSmileProvider.java 2016-11-16 02:14:44.000000000 +0000 @@ -2,6 +2,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.Provider; import com.fasterxml.jackson.databind.ObjectMapper; @@ -22,8 +23,8 @@ * in sync if changed. */ @Provider -@Consumes(SmileMediaTypes.APPLICATION_JACKSON_SMILE) -@Produces(SmileMediaTypes.APPLICATION_JACKSON_SMILE) +@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants +@Produces(MediaType.WILDCARD) public class JacksonJaxbSmileProvider extends JacksonSmileProvider { /** * Default annotation sets to use, if not explicitly defined during diff -Nru jackson-jaxrs-providers-2.7.3/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java jackson-jaxrs-providers-2.8.5/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java --- jackson-jaxrs-providers-2.7.3/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/JacksonSmileProvider.java 2016-11-16 02:14:44.000000000 +0000 @@ -43,8 +43,8 @@ * @author Tatu Saloranta */ @Provider -@Consumes(SmileMediaTypes.APPLICATION_JACKSON_SMILE) -@Produces(SmileMediaTypes.APPLICATION_JACKSON_SMILE) +@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants +@Produces(MediaType.WILDCARD) public class JacksonSmileProvider extends ProviderBase - * Also continues supporting functionality, such as - * exception mappers that can simplify handling of - * error conditions. - *

- * There are two default provider classes: - *

    - *
  • {@link com.fasterxml.jackson.jaxrs.smile.JacksonSmileProvider} is the basic - * provider configured to use Jackson annotations - *
  • - *
  • {@link com.fasterxml.jackson.jaxrs.smile.JacksonJaxbSmileProvider} is extension - * of the basic provider, configured to additionally use JAXB annotations, - * in addition to (or in addition of, if so configured) Jackson annotations. - *
  • - *
- */ -package com.fasterxml.jackson.jaxrs.smile; \ No newline at end of file diff -Nru jackson-jaxrs-providers-2.7.3/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/package-info.java jackson-jaxrs-providers-2.8.5/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/package-info.java --- jackson-jaxrs-providers-2.7.3/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/package-info.java 1970-01-01 00:00:00.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/smile/src/main/java/com/fasterxml/jackson/jaxrs/smile/package-info.java 2016-11-16 02:14:44.000000000 +0000 @@ -0,0 +1,21 @@ +/** + * Jackson-based JAX-RS provider that can automatically + * serialize and deserialize resources for + * Smile content type. + *

+ * Also continues supporting functionality, such as + * exception mappers that can simplify handling of + * error conditions. + *

+ * There are two default provider classes: + *

    + *
  • {@link com.fasterxml.jackson.jaxrs.smile.JacksonSmileProvider} is the basic + * provider configured to use Jackson annotations + *
  • + *
  • {@link com.fasterxml.jackson.jaxrs.smile.JacksonJaxbSmileProvider} is extension + * of the basic provider, configured to additionally use JAXB annotations, + * in addition to (or in addition of, if so configured) Jackson annotations. + *
  • + *
+ */ +package com.fasterxml.jackson.jaxrs.smile; diff -Nru jackson-jaxrs-providers-2.7.3/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java jackson-jaxrs-providers-2.8.5/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java --- jackson-jaxrs-providers-2.7.3/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java 2016-11-16 02:14:44.000000000 +0000 @@ -34,6 +34,13 @@ public Point getPoint() { return new Point(1, 2); } + + @Path("/custom") + @GET + @Produces({ "application/vnd.com.example.v1+smile" }) + public Point getPointCustom() { + return new Point(1, 2); + } } public static class SimpleResourceApp extends SmileApplicationWithJackson { @@ -74,6 +81,28 @@ p = mapper.readValue(in, Point.class); in.close(); } finally { + server.stop(); + } + // ensure we got a valid Point + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + } + + public void testCustomMediaTypeWithSmileExtension() throws Exception + { + final ObjectMapper mapper = new ObjectMapper(new SmileFactory()); + Server server = startServer(TEST_PORT, SimpleResourceApp.class); + Point p; + + try { + final URL url = new URL("http://localhost:" + TEST_PORT + "/point/custom"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", "application/vnd.com.example.v1+smile"); + InputStream in = conn.getInputStream(); + p = mapper.readValue(in, Point.class); + in.close(); + } finally { server.stop(); } // ensure we got a valid Point diff -Nru jackson-jaxrs-providers-2.7.3/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/jersey/SimpleEndpointTest.java jackson-jaxrs-providers-2.8.5/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/jersey/SimpleEndpointTest.java --- jackson-jaxrs-providers-2.7.3/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/jersey/SimpleEndpointTest.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/jersey/SimpleEndpointTest.java 2016-11-16 02:14:44.000000000 +0000 @@ -3,7 +3,8 @@ import javax.servlet.Servlet; import com.fasterxml.jackson.jaxrs.smile.dw.SimpleEndpointTestBase; -import com.sun.jersey.spi.container.servlet.ServletContainer; + +import org.glassfish.jersey.servlet.ServletContainer; public class SimpleEndpointTest extends SimpleEndpointTestBase { @Override diff -Nru jackson-jaxrs-providers-2.7.3/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/TestSmileVersions.java jackson-jaxrs-providers-2.8.5/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/TestSmileVersions.java --- jackson-jaxrs-providers-2.7.3/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/TestSmileVersions.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/TestSmileVersions.java 2016-11-16 02:14:44.000000000 +0000 @@ -19,7 +19,7 @@ private void assertVersion(Versioned vers) { final Version v = vers.version(); - assertFalse("Should find version information (got "+v+")", v.isUknownVersion()); + assertFalse("Should find version information (got "+v+")", v.isUnknownVersion()); Version exp = PackageVersion.VERSION; assertEquals(exp.toFullString(), v.toFullString()); assertEquals(exp, v); diff -Nru jackson-jaxrs-providers-2.7.3/.travis.yml jackson-jaxrs-providers-2.8.5/.travis.yml --- jackson-jaxrs-providers-2.7.3/.travis.yml 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/.travis.yml 2016-11-16 02:14:44.000000000 +0000 @@ -2,3 +2,10 @@ jdk: - oraclejdk7 + - oraclejdk8 + +# whitelist +branches: + only: + - master + - "2.7" diff -Nru jackson-jaxrs-providers-2.7.3/xml/pom.xml jackson-jaxrs-providers-2.8.5/xml/pom.xml --- jackson-jaxrs-providers-2.7.3/xml/pom.xml 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/xml/pom.xml 2016-11-16 02:14:44.000000000 +0000 @@ -4,7 +4,7 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-providers - 2.7.3 + 2.8.5 jackson-jaxrs-xml-provider Jackson-JAXRS-XML diff -Nru jackson-jaxrs-providers-2.7.3/xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/JacksonJaxbXMLProvider.java jackson-jaxrs-providers-2.8.5/xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/JacksonJaxbXMLProvider.java --- jackson-jaxrs-providers-2.7.3/xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/JacksonJaxbXMLProvider.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/JacksonJaxbXMLProvider.java 2016-11-16 02:14:44.000000000 +0000 @@ -23,8 +23,8 @@ * in sync if changed. */ @Provider -@Consumes({MediaType.TEXT_XML, MediaType.APPLICATION_XML}) -@Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML}) +@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants +@Produces(MediaType.WILDCARD) public class JacksonJaxbXMLProvider extends JacksonXMLProvider { /** * Default annotation sets to use, if not explicitly defined during diff -Nru jackson-jaxrs-providers-2.7.3/xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/JacksonXMLProvider.java jackson-jaxrs-providers-2.8.5/xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/JacksonXMLProvider.java --- jackson-jaxrs-providers-2.7.3/xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/JacksonXMLProvider.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/xml/src/main/java/com/fasterxml/jackson/jaxrs/xml/JacksonXMLProvider.java 2016-11-16 02:14:44.000000000 +0000 @@ -45,8 +45,8 @@ * @author Tatu Saloranta */ @Provider -@Consumes({MediaType.TEXT_XML, MediaType.APPLICATION_XML}) -@Produces({MediaType.TEXT_XML, MediaType.APPLICATION_XML}) +@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants +@Produces(MediaType.WILDCARD) public class JacksonXMLProvider extends ProviderBase com.fasterxml.jackson.jaxrs jackson-jaxrs-providers - 2.7.3 + 2.8.5 jackson-jaxrs-yaml-provider Jackson-JAXRS-YAML @@ -58,6 +58,20 @@ jackson-module-jaxb-annotations ${version.jackson.jaxb} + + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-json-provider + ${project.version} + test + + + com.fasterxml.jackson.jaxrs + jackson-jaxrs-smile-provider + ${project.version} + test + diff -Nru jackson-jaxrs-providers-2.7.3/yaml/src/main/java/com/fasterxml/jackson/jaxrs/yaml/JacksonJaxbYAMLProvider.java jackson-jaxrs-providers-2.8.5/yaml/src/main/java/com/fasterxml/jackson/jaxrs/yaml/JacksonJaxbYAMLProvider.java --- jackson-jaxrs-providers-2.7.3/yaml/src/main/java/com/fasterxml/jackson/jaxrs/yaml/JacksonJaxbYAMLProvider.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/yaml/src/main/java/com/fasterxml/jackson/jaxrs/yaml/JacksonJaxbYAMLProvider.java 2016-11-16 02:14:44.000000000 +0000 @@ -5,6 +5,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.Provider; /** @@ -22,8 +23,8 @@ * in sync if changed. */ @Provider -@Consumes({ YAMLMediaTypes.TEXT_JACKSON_YAML, YAMLMediaTypes.APPLICATION_JACKSON_YAML }) -@Produces({ YAMLMediaTypes.TEXT_JACKSON_YAML, YAMLMediaTypes.APPLICATION_JACKSON_YAML }) +@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants +@Produces(MediaType.WILDCARD) public class JacksonJaxbYAMLProvider extends JacksonYAMLProvider { /** * Default annotation sets to use, if not explicitly defined during diff -Nru jackson-jaxrs-providers-2.7.3/yaml/src/main/java/com/fasterxml/jackson/jaxrs/yaml/JacksonYAMLProvider.java jackson-jaxrs-providers-2.8.5/yaml/src/main/java/com/fasterxml/jackson/jaxrs/yaml/JacksonYAMLProvider.java --- jackson-jaxrs-providers-2.7.3/yaml/src/main/java/com/fasterxml/jackson/jaxrs/yaml/JacksonYAMLProvider.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/yaml/src/main/java/com/fasterxml/jackson/jaxrs/yaml/JacksonYAMLProvider.java 2016-11-16 02:14:44.000000000 +0000 @@ -51,8 +51,8 @@ * @author Tatu Saloranta */ @Provider -@Consumes({ YAMLMediaTypes.TEXT_JACKSON_YAML, YAMLMediaTypes.APPLICATION_JACKSON_YAML }) -@Produces({ YAMLMediaTypes.TEXT_JACKSON_YAML, YAMLMediaTypes.APPLICATION_JACKSON_YAML }) +@Consumes(MediaType.WILDCARD) // NOTE: required to support "non-standard" JSON variants +@Produces(MediaType.WILDCARD) public class JacksonYAMLProvider extends ProviderBase getSingletons() { HashSet singletons = new HashSet(); - singletons.add(_provider); + for(Object provider : _providers) { + singletons.add(provider); + } singletons.add(_resource); return singletons; } @@ -41,7 +43,7 @@ protected static abstract class YAMLApplicationWithJackson extends YAMLApplication { public YAMLApplicationWithJackson(Object resource) { - super(new JacksonYAMLProvider(), resource); + super(resource, new JacksonYAMLProvider()); } } diff -Nru jackson-jaxrs-providers-2.7.3/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/dw/SimpleEndpointTestBase.java jackson-jaxrs-providers-2.8.5/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/dw/SimpleEndpointTestBase.java --- jackson-jaxrs-providers-2.7.3/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/dw/SimpleEndpointTestBase.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/dw/SimpleEndpointTestBase.java 2016-11-16 02:14:44.000000000 +0000 @@ -1,7 +1,12 @@ package com.fasterxml.jackson.jaxrs.yaml.dw; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.smile.SmileFactory; import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; +import com.fasterxml.jackson.jaxrs.smile.JacksonSmileProvider; +import com.fasterxml.jackson.jaxrs.smile.SmileMediaTypes; +import com.fasterxml.jackson.jaxrs.yaml.JacksonYAMLProvider; import com.fasterxml.jackson.jaxrs.yaml.YAMLMediaTypes; import org.eclipse.jetty.server.Server; @@ -10,9 +15,11 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; import java.io.IOException; import java.io.InputStream; +import java.net.HttpURLConnection; import java.net.URL; public abstract class SimpleEndpointTestBase extends ResourceTestBase @@ -37,12 +44,42 @@ public Point getPoint() { return new Point(1, 2); } + + @GET + @Path("/custom") + @Produces({ "application/vnd.com.example.v1+yaml" }) + public Point getPointCustom() { + return new Point(1, 2); + } + } + + @Path("/point") + public static class MultiMediaTypeResource + { + @GET + @Produces({ + YAMLMediaTypes.APPLICATION_JACKSON_YAML, + "application/vnd.com.example.v1+yaml", + MediaType.APPLICATION_JSON, + "application/vnd.com.example.v1+json", + SmileMediaTypes.APPLICATION_JACKSON_SMILE, + "application/vnd.com.example.v1+smile" + }) + public Point getPoint() { + return new Point(1, 2); + } } public static class SimpleResourceApp extends YAMLApplicationWithJackson { public SimpleResourceApp() { super(new SimpleResource()); } } + public static class MultiMediaTypeResourceApp extends YAMLApplication { + public MultiMediaTypeResourceApp() { + super(new MultiMediaTypeResource(), new JacksonYAMLProvider(), new JacksonJsonProvider(), new JacksonSmileProvider()); + } + } + private final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; @Path("/raw") @@ -93,6 +130,125 @@ } } + public void testCustomMediaTypeWithYamlExtension() throws Exception + { + final ObjectMapper mapper = new YAMLMapper(); + Server server = startServer(TEST_PORT, SimpleResourceApp.class); + Point p; + + try { + final URL url = new URL("http://localhost:" + TEST_PORT + "/point/custom"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", "application/vnd.com.example.v1+yaml"); + InputStream in = conn.getInputStream(); + p = mapper.readValue(in, Point.class); + in.close(); + } finally { + server.stop(); + } + // ensure we got a valid Point + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + } + + // Tests that if multiple providers are registered, content negotiation works properly across regular and irregular + // mime types + public void testMultipleMediaTypes() throws Exception + { + Server server = startServer(TEST_PORT, MultiMediaTypeResourceApp.class); + final URL url = new URL("http://localhost:" + TEST_PORT + "/point"); + Point p; + + final ObjectMapper yamlMapper = new YAMLMapper(); + final ObjectMapper jsonMapper = new ObjectMapper(); + final ObjectMapper smileMapper = new ObjectMapper(new SmileFactory()); + + try { + + // Standard YAML + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", YAMLMediaTypes.APPLICATION_JACKSON_YAML); + InputStream in = conn.getInputStream(); + assertEquals(YAMLMediaTypes.APPLICATION_JACKSON_YAML, conn.getHeaderField("Content-Type")); + p = yamlMapper.readValue(in, Point.class); + in.close(); + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + + // Custom media type YAML + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", "application/vnd.com.example.v1+yaml"); + in = conn.getInputStream(); + assertEquals("application/vnd.com.example.v1+yaml", conn.getHeaderField("Content-Type")); + p = yamlMapper.readValue(in, Point.class); + in.close(); + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + + + // Standard JSON + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", MediaType.APPLICATION_JSON); + in = conn.getInputStream(); + assertEquals(MediaType.APPLICATION_JSON, conn.getHeaderField("Content-Type")); + p = jsonMapper.readValue(in, Point.class); + in.close(); + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + + // Custom media type JSON + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", "application/vnd.com.example.v1+json"); + in = conn.getInputStream(); + assertEquals("application/vnd.com.example.v1+json", conn.getHeaderField("Content-Type")); + p = jsonMapper.readValue(in, Point.class); + in.close(); + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + + // Standard Smile + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", SmileMediaTypes.APPLICATION_JACKSON_SMILE); + in = conn.getInputStream(); + assertEquals(SmileMediaTypes.APPLICATION_JACKSON_SMILE, conn.getHeaderField("Content-Type")); + p = smileMapper.readValue(in, Point.class); + in.close(); + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + + // Custom media type Smile + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", "application/vnd.com.example.v1+smile"); + in = conn.getInputStream(); + assertEquals("application/vnd.com.example.v1+smile", conn.getHeaderField("Content-Type")); + p = smileMapper.readValue(in, Point.class); + in.close(); + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + + // If everything is acceptable, YAML should be used because it occurs first in the @Produces annotation + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Accept", "*/*"); + in = conn.getInputStream(); + assertEquals(YAMLMediaTypes.APPLICATION_JACKSON_YAML, conn.getHeaderField("Content-Type")); + p = yamlMapper.readValue(in, Point.class); + in.close(); + assertNotNull(p); + assertEquals(1, p.x); + assertEquals(2, p.y); + } finally { + server.stop(); + } + + } + // [Issue#34] Verify that Untouchables act the way as they should @SuppressWarnings("resource") public void testUntouchables() throws Exception diff -Nru jackson-jaxrs-providers-2.7.3/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/jersey/SimpleEndpointTest.java jackson-jaxrs-providers-2.8.5/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/jersey/SimpleEndpointTest.java --- jackson-jaxrs-providers-2.7.3/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/jersey/SimpleEndpointTest.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/jersey/SimpleEndpointTest.java 2016-11-16 02:14:44.000000000 +0000 @@ -1,7 +1,8 @@ package com.fasterxml.jackson.jaxrs.yaml.jersey; import com.fasterxml.jackson.jaxrs.yaml.dw.SimpleEndpointTestBase; -import com.sun.jersey.spi.container.servlet.ServletContainer; + +import org.glassfish.jersey.servlet.ServletContainer; import javax.servlet.Servlet; diff -Nru jackson-jaxrs-providers-2.7.3/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/TestYAMLVersions.java jackson-jaxrs-providers-2.8.5/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/TestYAMLVersions.java --- jackson-jaxrs-providers-2.7.3/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/TestYAMLVersions.java 2016-03-17 01:09:34.000000000 +0000 +++ jackson-jaxrs-providers-2.8.5/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/TestYAMLVersions.java 2016-11-16 02:14:44.000000000 +0000 @@ -19,7 +19,7 @@ private void assertVersion(Versioned vers) { final Version v = vers.version(); - assertFalse("Should find version information (got "+v+")", v.isUknownVersion()); + assertFalse("Should find version information (got "+v+")", v.isUnknownVersion()); Version exp = PackageVersion.VERSION; assertEquals(exp.toFullString(), v.toFullString()); assertEquals(exp, v);