Adopt Jackson 2.10.1 (#4339)

* Updated Jackson to 2.10.1

Signed-off-by: Jan Supol <jan.supol@oracle.com>
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/annotation/JacksonFeatures.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/annotation/JacksonFeatures.java
index 8b79319..c1d0475 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/annotation/JacksonFeatures.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/annotation/JacksonFeatures.java
@@ -12,7 +12,7 @@
  * Annotation that can be used enable and/or disable various
  * features for <code>ObjectReader</code>s and <code>ObjectWriter</code>s.
  */
-@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD })
+@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.PARAMETER })
 @Retention(RetentionPolicy.RUNTIME)
 @com.fasterxml.jackson.annotation.JacksonAnnotation
 public @interface JacksonFeatures
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/JsonMappingExceptionMapper.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/JsonMappingExceptionMapper.java
index 7ccfd3d..25e13e5 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/JsonMappingExceptionMapper.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/JsonMappingExceptionMapper.java
@@ -1,10 +1,9 @@
 package org.glassfish.jersey.jackson.internal.jackson.jaxrs.base;
+import com.fasterxml.jackson.databind.JsonMappingException;
 
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.ExceptionMapper;
 
-import com.fasterxml.jackson.databind.JsonMappingException;
-
 /**
  * Implementation if {@link ExceptionMapper} to send down a "400 Bad Request"
  * response in the event that unmappable JSON is received.
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/JsonParseExceptionMapper.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/JsonParseExceptionMapper.java
index 9f8d55f..4be9aa5 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/JsonParseExceptionMapper.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/JsonParseExceptionMapper.java
@@ -1,10 +1,9 @@
 package org.glassfish.jersey.jackson.internal.jackson.jaxrs.base;
+import com.fasterxml.jackson.core.JsonParseException;
 
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.ExceptionMapper;
 
-import com.fasterxml.jackson.core.JsonParseException;
-
 /**
  * Implementation of {@link ExceptionMapper} to send down a "400 Bad Request"
  * in the event unparsable JSON is received.
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/ProviderBase.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/ProviderBase.java
index 170e0f8..e42e163 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/ProviderBase.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/base/ProviderBase.java
@@ -83,10 +83,9 @@
         // then some primitive types
         DEFAULT_UNTOUCHABLES.add(new ClassKey(char[].class));
 
-        /* 27-Apr-2012, tatu: Ugh. As per
-         *   [https://github.com/FasterXML/jackson-jaxrs-json-provider/issues/12]
-         *  better revert this back, to make them untouchable again.
-         */
+        // 27-Apr-2012, tatu: Ugh. As per
+        //   [https://github.com/FasterXML/jackson-jaxrs-json-provider/issues/12]
+        //  better revert this back, to make them untouchable again.
         DEFAULT_UNTOUCHABLES.add(new ClassKey(String.class));
         DEFAULT_UNTOUCHABLES.add(new ClassKey(byte[].class));
     }
@@ -997,9 +996,7 @@
      */
     protected IOException _createNoContentException()
     {
-        // 29-Jun-2016, tatu: With Jackson 2.8 we require JAX-RS 2.0 so this
-        //    is fine; earlier had complicated Reflection-based access
-        return new NoContentException("No content (empty input stream)");
+     return new NoContentException("No content (empty input stream)");
     }
 
     /*
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/cfg/AnnotationBundleKey.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/cfg/AnnotationBundleKey.java
index 854a7ed..79157f1 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/cfg/AnnotationBundleKey.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/cfg/AnnotationBundleKey.java
@@ -122,11 +122,39 @@
         if (otherAnn.length != len) {
             return false;
         }
-        for (int i = 0; i < len; ++i) {
-            if (_annotations[i] != otherAnn[i]) {
+
+        // 05-May-2019, tatu: If we wanted to true equality of contents we should
+        //   do order-insensitive check; however, our use case is not unifying all
+        //   possible permutations but rather trying to ensure that caching of same
+        //   method signature is likely to match. So false negatives are acceptable
+        //   over having to do order-insensitive comparison.
+        
+        switch (len) {
+        default:
+            for (int i = 0; i < len; ++i) {
+                if (!_annotations[i].equals(otherAnn[i])) {
+                    return false;
+                }
+            }
+            return true;
+            
+        case 3:
+            if (!_annotations[2].equals(otherAnn[2])) {
                 return false;
             }
+            // fall through
+        case 2:
+            if (!_annotations[1].equals(otherAnn[1])) {
+                return false;
+            }
+            // fall through
+        case 1:
+            if (!_annotations[0].equals(otherAnn[0])) {
+                return false;
+            }
+            // fall through
+        case 0:
         }
         return true;
     }
-}
+}
\ No newline at end of file
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/cfg/EndpointConfigBase.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/cfg/EndpointConfigBase.java
index afc8e1a..c48b597 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/cfg/EndpointConfigBase.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/cfg/EndpointConfigBase.java
@@ -54,11 +54,6 @@
         _config = config;
     }
     
-    @Deprecated // since 2.6
-    protected EndpointConfigBase() {
-        _config = null;
-    }
-
     @SuppressWarnings("unchecked")
     protected THIS add(Annotation[] annotations, boolean forWriting)
     {
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/JacksonJsonProvider.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/JacksonJsonProvider.java
index d766495..dc5fff8 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/JacksonJsonProvider.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/JacksonJsonProvider.java
@@ -231,12 +231,4 @@
         return JsonEndpointConfig.forWriting(writer, annotations,
                 _jsonpFunctionName);
     }
-
-    /**
-     * @deprecated Since 2.2 use {@link #hasMatchingMediaType(MediaType)} instead
-     */
-    @Deprecated
-    protected boolean isJsonType(MediaType mediaType) {
-        return hasMatchingMediaType(mediaType);
-    }
 }
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/JsonEndpointConfig.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/JsonEndpointConfig.java
index 5a4d9a6..cbe0b58 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/JsonEndpointConfig.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/JsonEndpointConfig.java
@@ -4,7 +4,6 @@
 
 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.cfg.EndpointConfigBase;
 import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.annotation.JSONP;
-import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.annotation.JacksonFeatures;
 
 import com.fasterxml.jackson.databind.ObjectReader;
 import com.fasterxml.jackson.databind.ObjectWriter;
@@ -61,7 +60,6 @@
     /**********************************************************
      */
 
-    @SuppressWarnings("deprecation")
     @Override
     protected void addAnnotation(Class<? extends Annotation> type,
             Annotation annotation, boolean forWriting)
@@ -70,15 +68,6 @@
             if (forWriting) {
                 _jsonp = new JSONP.Def((JSONP) annotation);
             }
-        } else if (type == JacksonFeatures.class) {
-            JacksonFeatures feats = (JacksonFeatures) annotation;
-            if (forWriting) {
-                _serEnable = nullIfEmpty(feats.serializationEnable());
-                _serDisable = nullIfEmpty(feats.serializationDisable());
-            } else {
-                _deserEnable = nullIfEmpty(feats.deserializationEnable());
-                _deserDisable = nullIfEmpty(feats.deserializationDisable());
-            }
         } else {
             super.addAnnotation(type, annotation, forWriting);
         }
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/PackageVersion.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/PackageVersion.java
index 05d75b9..46376a4 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/PackageVersion.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/PackageVersion.java
@@ -11,7 +11,7 @@
  */
 public final class PackageVersion implements Versioned {
     public final static Version VERSION = VersionUtil.parseVersion(
-        "2.8.4", "com.fasterxml.jackson.jaxrs", "jackson-jaxrs-json-provider");
+        "2.10.1", "com.fasterxml.jackson.jaxrs", "jackson-jaxrs-json-provider");
 
     @Override
     public Version version() {
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/annotation/JacksonFeatures.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/annotation/JacksonFeatures.java
deleted file mode 100644
index 483107a..0000000
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/json/annotation/JacksonFeatures.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.SerializationFeature;
-
-/**
- * Annotation that can be used enable and/or disable various
- * features for <code>ObjectReader</code>s and <code>ObjectWriter</code>s.
- * 
- * @deprecated Since 2.2, use shared {@link com.fasterxml.jackson.jaxrs.annotation.JacksonFeatures} instead
- */
-@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD })
-@Retention(RetentionPolicy.RUNTIME)
-@com.fasterxml.jackson.annotation.JacksonAnnotation
-@Deprecated // since 2.2
-public @interface JacksonFeatures
-{
-    /**
-     * Deserialization features to enable.
-     */
-    public DeserializationFeature[] deserializationEnable() default { };
-
-    /**
-     * Deserialization features to disable.
-     */
-    public DeserializationFeature[] deserializationDisable() default { };
-    
-    /**
-     * Serialization features to enable.
-     */
-    public SerializationFeature[] serializationEnable() default { };
-
-    /**
-     * Serialization features to disable.
-     */
-    public SerializationFeature[] serializationDisable() default { };
-}
diff --git a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/util/EndpointAsBeanProperty.java b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/util/EndpointAsBeanProperty.java
index 89ed89a..876a708 100644
--- a/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/util/EndpointAsBeanProperty.java
+++ b/media/json-jackson/src/main/java/org/glassfish/jersey/jackson/internal/jackson/jaxrs/util/EndpointAsBeanProperty.java
@@ -16,11 +16,12 @@
  * limitations, we are only given annotations associated, and that
  * has to do.
  *<p>
- * NOTE: not yet used by JAX-RS provider, directly, as of Jackson 2.6.
+ * NOTE: not yet used by JAX-RS provider, directly, as of Jackson 2.9
  */
 public class EndpointAsBeanProperty
     extends BeanProperty.Std
 {
+    private static final long serialVersionUID = 1L;
     public final static PropertyName ENDPOINT_NAME = new PropertyName("JAX-RS/endpoint");
 
     private final static AnnotationMap NO_ANNOTATIONS = new AnnotationMap();
@@ -33,7 +34,7 @@
     {
         // TODO: find and pass wrapper; isRequired marker?
         super(name, type, /*PropertyName wrapperName*/ null,
-                null, null, PropertyMetadata.STD_OPTIONAL);
+                null, PropertyMetadata.STD_OPTIONAL);
         _rawAnnotations = annotations;
         _annotations = null;
     }
diff --git a/pom.xml b/pom.xml
index 4f3d057..7cc4167 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2099,7 +2099,7 @@
         <hk2.config.version>5.1.0</hk2.config.version>
         <httpclient.version>4.5.9</httpclient.version>
         <istack.commons.runtime.version>3.0.8</istack.commons.runtime.version>
-        <jackson.version>2.9.9</jackson.version>
+        <jackson.version>2.10.1</jackson.version>
         <jackson1.version>1.9.13</jackson1.version>
         <jakarta.activation.version>1.2.1</jakarta.activation.version>
         <javassist.version>3.25.0-GA</javassist.version>
diff --git a/tests/osgi/functional/pom.xml b/tests/osgi/functional/pom.xml
index 088ca5f..d6175cc 100644
--- a/tests/osgi/functional/pom.xml
+++ b/tests/osgi/functional/pom.xml
@@ -376,12 +376,13 @@
             <artifactId>jakarta.xml.bind-api</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>com.sun.activation</groupId>
-            <artifactId>jakarta.activation</artifactId>
-            <version>${jakarta.activation.version}</version>
-            <scope>test</scope>
-        </dependency>
+<!--        <dependency>-->
+<!--            Not needed since Jackson 2.10.1 -->
+<!--            <groupId>com.sun.activation</groupId>-->
+<!--            <artifactId>jakarta.activation</artifactId>-->
+<!--            <version>${jakarta.activation.version}</version>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
 
         <!-- logging -->
         <dependency>
diff --git a/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/util/Helper.java b/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/util/Helper.java
index 9108cd6..c334e71 100644
--- a/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/util/Helper.java
+++ b/tests/osgi/functional/src/test/java/org/glassfish/jersey/osgi/test/util/Helper.java
@@ -168,9 +168,10 @@
                     mavenBundle().groupId("org.glassfish.jersey.core").artifactId("jersey-client").versionAsInProject(),
 
                     // Jersey Injection provider
-                    mavenBundle().groupId("org.glassfish.jersey.inject").artifactId("jersey-hk2").versionAsInProject(),
+                    mavenBundle().groupId("org.glassfish.jersey.inject").artifactId("jersey-hk2").versionAsInProject()
 //                     Jaxb - api
-                    mavenBundle().groupId("com.sun.activation").artifactId("jakarta.activation").versionAsInProject()
+                    // not needed since Jackson 2.10.1
+                    // mavenBundle().groupId("com.sun.activation").artifactId("jakarta.activation").versionAsInProject()
             ));
         }