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) {