diff --git a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/NoContentExceptionSupplier.java b/base/src/main/java/com/fasterxml/jackson/jaxrs/base/NoContentExceptionSupplier.java deleted file mode 100644 index 9aea2150..00000000 --- a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/NoContentExceptionSupplier.java +++ /dev/null @@ -1,13 +0,0 @@ -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 --git a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java b/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java index 67eaeaf2..e84795c4 100644 --- a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java +++ b/base/src/main/java/com/fasterxml/jackson/jaxrs/base/ProviderBase.java @@ -2,22 +2,18 @@ import java.io.*; import java.lang.annotation.Annotation; -import java.lang.reflect.Constructor; import java.lang.reflect.Type; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.*; -import java.util.concurrent.atomic.AtomicReference; import javax.ws.rs.core.*; import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.MessageBodyWriter; 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; @@ -40,7 +36,7 @@ public abstract class ProviderBase< protected final static String CLASS_NAME_NO_CONTENT_EXCEPTION = "javax.ws.rs.core.NoContentException"; - protected final NoContentExceptionSupplier noContentExceptionSupplier = _createNoContentExceptionSupplier(); + private final static String NO_CONTENT_MESSAGE = "No content (empty input stream)"; /** * Looks like we need to worry about accidental @@ -171,9 +167,6 @@ public abstract class ProviderBase< protected final LRUMap _writers = new LRUMap(16, 120); - protected final AtomicReference _noContentExceptionRef - = new AtomicReference(); - /* /********************************************************** /* Life-cycle @@ -186,9 +179,8 @@ protected ProviderBase(MAPPER_CONFIG mconfig) { } /** - * Constructor that is only added to resolve - * issue #10; problems with combination of - * RESTeasy and CDI. + * Constructor that is only added to resolve [jaxrs-providers#10]; problems + * with combination of RESTeasy and CDI. * Should NOT be used by any code explicitly; only exists * for proxy support. */ @@ -533,9 +525,8 @@ public boolean isWriteable(Class type, Type genericType, Annotation[] annotat // negation: Boolean.TRUE means untouchable -> can not write return !customUntouchable.booleanValue(); } - /* Ok: looks like we must weed out some core types here; ones that - * make no sense to try to bind from JSON: - */ + // Ok: looks like we must weed out some core types here; ones that + // make no sense to try to bind from JSON: if (_isIgnorableForWriting(new ClassKey(type))) { return false; } @@ -730,9 +721,8 @@ public boolean isReadable(Class type, Type genericType, Annotation[] annotati // negation: Boolean.TRUE means untouchable -> can not write return !customUntouchable.booleanValue(); } - /* Ok: looks like we must weed out some core types here; ones that - * make no sense to try to bind from JSON: - */ + // Ok: looks like we must weed out some core types here; ones that + // make no sense to try to bind from JSON: if (_isIgnorableForReading(new ClassKey(type))) { return false; } @@ -776,14 +766,11 @@ public Object readFrom(Class type, Type genericType, Annotation[] annota if (JaxRSFeature.ALLOW_EMPTY_INPUT.enabledIn(_jaxRSFeatures)) { return null; } - /* 05-Apr-2014, tatu: Trick-ee. NoContentFoundException only available in JAX-RS 2.0... - * so need bit of obfuscated code to reach it. - */ - IOException fail = _noContentExceptionRef.get(); - if (fail == null) { - fail = _createNoContentException(); - } - throw fail; + // 05-Apr-2014, tatu: Trick-ee. NoContentFoundException only available in JAX-RS 2.0... + // so need bit of obfuscated code to reach it. + + // 20-Jan-2021, tatu: as per [jaxrs-providers#134], simplify + throw _createNoContentException(); } Class rawType = type; if (rawType == JsonParser.class) { @@ -969,13 +956,9 @@ protected boolean _isIgnorableForWriting(ClassKey typeKey) { return _untouchables.contains(typeKey); } - - /** - * @since 2.4 - */ - protected IOException _createNoContentException() - { - return noContentExceptionSupplier.createNoContentException(); + + protected IOException _createNoContentException() { + return new NoContentException(NO_CONTENT_MESSAGE); } /* @@ -1052,45 +1035,4 @@ protected static void _addSuperTypes(Class cls, Class endBefore, Collectio 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 { - final Class cls = Class.forName(CLASS_NAME_NO_CONTENT_EXCEPTION, false, getClassLoader()); - Constructor ctor; - if (System.getSecurityManager() == null) { - ctor = cls.getDeclaredConstructor(String.class); - } else { - ctor = AccessController.doPrivileged(new PrivilegedAction>() { - @Override - public Constructor run() { - try { - return cls.getDeclaredConstructor(String.class); - } catch (NoSuchMethodException ignore) { - return null; - } - } - }); - } - if (ctor != null) { - return new JaxRS2NoContentExceptionSupplier(); - } - } catch (ClassNotFoundException | NoSuchMethodException ex) { } - return new JaxRS1NoContentExceptionSupplier(); - } - - private static ClassLoader getClassLoader() { - if (System.getSecurityManager() == null) { - return ProviderBase.class.getClassLoader(); - } - return AccessController.doPrivileged(new PrivilegedAction() { - @Override - public ClassLoader run() { - return ProviderBase.class.getClassLoader(); - } - }); - } } diff --git a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS1NoContentExceptionSupplier.java b/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS1NoContentExceptionSupplier.java deleted file mode 100644 index 7646ba4f..00000000 --- a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS1NoContentExceptionSupplier.java +++ /dev/null @@ -1,18 +0,0 @@ -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 --git a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS2NoContentExceptionSupplier.java b/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS2NoContentExceptionSupplier.java deleted file mode 100644 index 6519d359..00000000 --- a/base/src/main/java/com/fasterxml/jackson/jaxrs/base/nocontent/JaxRS2NoContentExceptionSupplier.java +++ /dev/null @@ -1,16 +0,0 @@ -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 --git a/base/src/moditect/module-info.java b/base/src/moditect/module-info.java index 9ceee9e5..c5158411 100644 --- a/base/src/moditect/module-info.java +++ b/base/src/moditect/module-info.java @@ -2,7 +2,6 @@ module com.fasterxml.jackson.jaxrs.base { exports com.fasterxml.jackson.jaxrs.annotation; exports com.fasterxml.jackson.jaxrs.base; - exports com.fasterxml.jackson.jaxrs.base.nocontent; exports com.fasterxml.jackson.jaxrs.cfg; exports com.fasterxml.jackson.jaxrs.util; diff --git a/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/SimpleEndpointTestBase.java b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/SimpleEndpointTestBase.java index 0e9150e0..b9caccd7 100644 --- a/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/SimpleEndpointTestBase.java +++ b/cbor/src/test/java/com/fasterxml/jackson/jaxrs/cbor/dw/SimpleEndpointTestBase.java @@ -49,7 +49,7 @@ public static class SimpleResourceApp extends CBORApplicationWithJackson { public SimpleResourceApp() { super(new SimpleResource()); } } - private final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; + final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; @Path("/raw") public static class RawResource diff --git a/json/src/test/java/com/fasterxml/jackson/jaxrs/json/dw/SimpleEndpointTestBase.java b/json/src/test/java/com/fasterxml/jackson/jaxrs/json/dw/SimpleEndpointTestBase.java index 2450a02e..f4af8283 100644 --- a/json/src/test/java/com/fasterxml/jackson/jaxrs/json/dw/SimpleEndpointTestBase.java +++ b/json/src/test/java/com/fasterxml/jackson/jaxrs/json/dw/SimpleEndpointTestBase.java @@ -39,10 +39,11 @@ 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; @@ -52,6 +53,7 @@ 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 @@ -152,8 +154,8 @@ protected PageImpl() { this.links = new ArrayList<>(); } - public void addEntities(E... entitities) { - Collections.addAll(this.entities, entitities); + public void addEntities(E... entities) { + Collections.addAll(this.entities, entities); } public void addLinks(Link... links) { diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index a87d3ff5..55dd3379 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -12,7 +12,7 @@ Sub-modules: 2.13.0 (not yet released) -No changes since 2.12 +#134: Remove work-around for JAX-RS 1.x wrt JAX-RS 2 type `NoContentException` 2.12.1 (08-Jan-2021) diff --git a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java index 456e6d25..2e35ec46 100644 --- a/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java +++ b/smile/src/test/java/com/fasterxml/jackson/jaxrs/smile/dw/SimpleEndpointTestBase.java @@ -47,7 +47,7 @@ public static class SimpleResourceApp extends SmileApplicationWithJackson { public SimpleResourceApp() { super(new SimpleResource()); } } - private final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; + final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; @Path("/raw") public static class RawResource diff --git a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestJacksonFeaturesWithXML.java b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestJacksonFeaturesWithXML.java index 39d5dc6c..4d77cae5 100644 --- a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestJacksonFeaturesWithXML.java +++ b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestJacksonFeaturesWithXML.java @@ -13,7 +13,6 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.jaxrs.annotation.JacksonFeatures; -import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider; /** * Tests for [Issue-2], Addition of {@link JacksonFeatures}. diff --git a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestJsonView.java b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestJsonView.java index f8e556c7..79f9d508 100644 --- a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestJsonView.java +++ b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestJsonView.java @@ -7,7 +7,6 @@ import javax.ws.rs.core.MediaType; import com.fasterxml.jackson.annotation.JsonView; -import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider; public class TestJsonView extends JaxrsTestBase { diff --git a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestRootType.java b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestRootType.java index 74724063..cfef4a59 100644 --- a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestRootType.java +++ b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestRootType.java @@ -11,7 +11,6 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo.As; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider; public class TestRootType extends JaxrsTestBase diff --git a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestUntouchables.java b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestUntouchables.java index 87aac964..acff42a2 100644 --- a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestUntouchables.java +++ b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestUntouchables.java @@ -5,8 +5,6 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.StreamingOutput; -import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider; - /** * Unit tests for verifying that certain JDK base types will be * ignored by default Jackson JAX-RS conversion provider. diff --git a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestXMLVersions.java b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestXMLVersions.java index 15024a4a..73a2ad54 100644 --- a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestXMLVersions.java +++ b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/TestXMLVersions.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.core.Versioned; -import com.fasterxml.jackson.jaxrs.xml.JacksonXMLProvider; public class TestXMLVersions extends JaxrsTestBase { diff --git a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/dw/SimpleEndpointTestBase.java b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/dw/SimpleEndpointTestBase.java index c172327d..7c0f7a4e 100644 --- a/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/dw/SimpleEndpointTestBase.java +++ b/xml/src/test/java/com/fasterxml/jackson/jaxrs/xml/dw/SimpleEndpointTestBase.java @@ -49,7 +49,7 @@ public static class SimpleResourceApp extends XMLApplicationWithJackson { public SimpleResourceApp() { super(new SimpleResource()); } } - private final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; + final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; @Path("/raw") public static class RawResource diff --git a/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/dw/SimpleEndpointTestBase.java b/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/dw/SimpleEndpointTestBase.java index 0e48db98..d5e2d751 100644 --- a/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/dw/SimpleEndpointTestBase.java +++ b/yaml/src/test/java/com/fasterxml/jackson/jaxrs/yaml/dw/SimpleEndpointTestBase.java @@ -80,7 +80,7 @@ public MultiMediaTypeResourceApp() { } } - private final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; + final static byte[] UNTOUCHABLE_RESPONSE = new byte[] { 1, 2, 3, 4 }; @Path("/raw") public static class RawResource