Make JAX-B API optional (#4634)

* Make JAX-B API optional

Signed-off-by: Jan Supol <jan.supol@oracle.com>
diff --git a/core-common/pom.xml b/core-common/pom.xml
index 6869ea7..c35cb1e 100644
--- a/core-common/pom.xml
+++ b/core-common/pom.xml
@@ -126,7 +126,21 @@
                         <!-- Note: When you're changing these properties change them also in bundles/jaxrs-ri/pom.xml. -->
                         <Import-Package>
                             sun.misc.*;resolution:=optional,
-                            javax.activation.*;version="!",
+                            javax.activation.*;version="!";resolution:=optional,
+                            javax.imageio;resolution:=optional,
+                            javax.imageio.spi;resolution:=optional,
+                            javax.imageio.stream;resolution:=optional,
+                            javax.xml.bind;version="!";resolution:=optional,
+                            javax.xml.bind.annotation;version="!";resolution:=optional,
+                            javax.xml.bind.annotation.adapters;version="!";resolution:=optional,
+                            javax.xml.namespace;resolution:=optional,
+                            javax.xml.parsers;resolution:=optional,
+                            javax.xml.transform;resolution:=optional,
+                            javax.xml.transform.dom;resolution:=optional,
+                            javax.xml.transform.sax;resolution:=optional,
+                            javax.xml.transform.stream;resolution:=optional,
+                            org.w3c.dom;resolution:=optional,
+                            org.xml.sax;resolution:=optional,
                             ${javax.annotation.osgi.version},
                             *
                         </Import-Package>
@@ -297,6 +311,8 @@
                 <dependency>
                     <groupId>com.sun.activation</groupId>
                     <artifactId>jakarta.activation</artifactId>
+                    <scope>provided</scope>
+                    <optional>true</optional>
                 </dependency>
             </dependencies>
             <build>
@@ -686,7 +702,6 @@
                 </plugins>
             </build>
         </profile>
-
     </profiles>
 
     <properties>
diff --git a/core-common/src/main/java/org/glassfish/jersey/CommonProperties.java b/core-common/src/main/java/org/glassfish/jersey/CommonProperties.java
index b6adbcc..94c54ed 100644
--- a/core-common/src/main/java/org/glassfish/jersey/CommonProperties.java
+++ b/core-common/src/main/java/org/glassfish/jersey/CommonProperties.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -230,13 +230,15 @@
      * Disable some of the default providers from being loaded. The following providers extend application footprint
      * by XML dependencies, which is too heavy for native image, or by AWT which may possibly be not available by JDK 11 desktop:
      * <ul>
+     *     <li>javax.activation.DataSource</li>
      *     <li>java.awt.image.RenderedImage</li>
      *     <li>javax.xml.transform.Source</li>
      *     <li>javax.xml.transform.dom.DOMSource</li>
      *     <li>javax.xml.transform.sax.SAXSource</li>
      *     <li>javax.xml.transform.stream.StreamSource</li>
      * </ul>
-     * The following are the options to disable the provides: {@code DOMSOURCE, RENDEREDIMAGE, SAXSOURCE, SOURCE, STREAMSOURCE},
+     * The following are the options to disable the provides:
+     * {@code DATASOURCE, DOMSOURCE, RENDEREDIMAGE, SAXSOURCE, SOURCE, STREAMSOURCE},
      * or to disable all: {@code ALL}. Multiple options can be disabled by adding multiple comma separated values.
      *
      * @since 2.30
diff --git a/core-common/src/main/java/org/glassfish/jersey/internal/util/ReflectionHelper.java b/core-common/src/main/java/org/glassfish/jersey/internal/util/ReflectionHelper.java
index b0a0447..e4a202b 100644
--- a/core-common/src/main/java/org/glassfish/jersey/internal/util/ReflectionHelper.java
+++ b/core-common/src/main/java/org/glassfish/jersey/internal/util/ReflectionHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -1557,4 +1557,20 @@
 
         return null;
     }
+
+    /**
+     * Returns true iff JAX-B API is available on classpath.
+     */
+    public static boolean isJaxbAvailable() {
+        final Class<?> aClass = AccessController.doPrivileged(ReflectionHelper.classForNamePA("javax.xml.bind.JAXBException"));
+        return aClass != null;
+    }
+
+    /**
+     * Returns true iff javax.xml.transform package is available on classpath.
+     */
+    public static boolean isXmlTransformAvailable() {
+        final Class<?> aClass = AccessController.doPrivileged(ReflectionHelper.classForNamePA("javax.xml.transform.Source"));
+        return aClass != null;
+    }
 }
diff --git a/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java b/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java
index c01da3d..8c5e67d 100644
--- a/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java
+++ b/core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java
@@ -80,7 +80,7 @@
 
             // Message body providers (both readers & writers)
             bindSingletonWorker(ByteArrayProvider.class);
-            bindSingletonWorker(DataSourceProvider.class);
+            // bindSingletonWorker(DataSourceProvider.class);
             bindSingletonWorker(FileProvider.class);
             bindSingletonWorker(FormMultivaluedMapProvider.class);
             bindSingletonWorker(FormProvider.class);
@@ -158,6 +158,7 @@
 
     private static final class EnabledProvidersBinder {
         private enum Provider {
+            DATASOURCE("javax.activation.DataSource"),
             DOMSOURCE("javax.xml.transform.dom.DOMSource"),
             RENDEREDIMAGE("java.awt.image.RenderedImage"),
             SAXSOURCE("javax.xml.transform.sax.SAXSource"),
@@ -200,6 +201,9 @@
             for (Provider provider : enabledProviders) {
                 if (isClass(provider.className)) {
                     switch (provider) {
+                        case DATASOURCE:
+                            providerBinder = new DataSourceBinder();
+                            break;
                         case DOMSOURCE:
                             providerBinder = new DomSourceBinder();
                             break;
@@ -226,6 +230,7 @@
                                     "MessageBodyReader<" + provider.className + ">")
                             );
                             break;
+                        case DATASOURCE:
                         case RENDEREDIMAGE:
                         case SOURCE:
                             LOGGER.warning(LocalizationMessages.DEPENDENT_CLASS_OF_DEFAULT_PROVIDER_NOT_FOUND(provider.className,
@@ -241,11 +246,18 @@
             return null != AccessController.doPrivileged(ReflectionHelper.classForNamePA(className));
         }
 
-
         private interface ProviderBinder {
             void bind(AbstractBinder binder, Provider provider);
         }
 
+        private static class DataSourceBinder implements ProviderBinder {
+            @Override
+            public void bind(AbstractBinder binder, Provider provider) {
+                binder.bind(DataSourceProvider.class)
+                        .to(MessageBodyReader.class).to(MessageBodyWriter.class).in(Singleton.class);
+            }
+        }
+
         private static class DomSourceBinder implements ProviderBinder {
             @Override
             public void bind(AbstractBinder binder, Provider provider) {