Skip to content

Commit 9edb3d4

Browse files
authored
Make JAX-B API optional (#4634)
* Make JAX-B API optional Signed-off-by: Jan Supol <[email protected]>
1 parent 21e8faf commit 9edb3d4

File tree

31 files changed

+367
-191
lines changed

31 files changed

+367
-191
lines changed

bundles/jaxrs-ri/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,21 @@
285285
javax.persistence.*;resolution:=optional,
286286
javax.validation.*;resolution:=optional;version="${range;[==,3);${javax.validation.api.version}}",
287287
sun.misc.*;resolution:=optional,
288+
javax.activation.*;version="!";resolution:=optional,
289+
javax.imageio;resolution:=optional,
290+
javax.imageio.spi;resolution:=optional,
291+
javax.imageio.stream;resolution:=optional,
292+
javax.xml.bind;version="!";resolution:=optional,
293+
javax.xml.bind.annotation;version="!";resolution:=optional,
294+
javax.xml.bind.annotation.adapters;version="!";resolution:=optional,
295+
javax.xml.namespace;resolution:=optional,
296+
javax.xml.parsers;resolution:=optional,
297+
javax.xml.transform;resolution:=optional,
298+
javax.xml.transform.dom;resolution:=optional,
299+
javax.xml.transform.sax;resolution:=optional,
300+
javax.xml.transform.stream;resolution:=optional,
301+
org.w3c.dom;resolution:=optional,
302+
org.xml.sax;resolution:=optional,
288303
${hk2.osgi.version},
289304
*
290305
]]></Import-Package>

connectors/jetty-connector/pom.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0"?>
22
<!--
33
4-
Copyright (c) 2011, 2019 Oracle and/or its affiliates. All rights reserved.
4+
Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
55
66
This program and the accompanying materials are made available under the
77
terms of the Eclipse Public License v. 2.0, which is available at
@@ -41,6 +41,12 @@
4141
<groupId>org.eclipse.jetty</groupId>
4242
<artifactId>jetty-client</artifactId>
4343
</dependency>
44+
<dependency>
45+
<groupId>org.glassfish.jersey.media</groupId>
46+
<artifactId>jersey-media-jaxb</artifactId>
47+
<version>${project.version}</version>
48+
<scope>test</scope>
49+
</dependency>
4450

4551
<dependency>
4652
<groupId>org.glassfish.jersey.containers</groupId>

core-common/pom.xml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,21 @@
126126
<!-- Note: When you're changing these properties change them also in bundles/jaxrs-ri/pom.xml. -->
127127
<Import-Package>
128128
sun.misc.*;resolution:=optional,
129-
javax.activation.*;version="!",
129+
javax.activation.*;version="!";resolution:=optional,
130+
javax.imageio;resolution:=optional,
131+
javax.imageio.spi;resolution:=optional,
132+
javax.imageio.stream;resolution:=optional,
133+
javax.xml.bind;version="!";resolution:=optional,
134+
javax.xml.bind.annotation;version="!";resolution:=optional,
135+
javax.xml.bind.annotation.adapters;version="!";resolution:=optional,
136+
javax.xml.namespace;resolution:=optional,
137+
javax.xml.parsers;resolution:=optional,
138+
javax.xml.transform;resolution:=optional,
139+
javax.xml.transform.dom;resolution:=optional,
140+
javax.xml.transform.sax;resolution:=optional,
141+
javax.xml.transform.stream;resolution:=optional,
142+
org.w3c.dom;resolution:=optional,
143+
org.xml.sax;resolution:=optional,
130144
${javax.annotation.osgi.version},
131145
*
132146
</Import-Package>
@@ -297,6 +311,8 @@
297311
<dependency>
298312
<groupId>com.sun.activation</groupId>
299313
<artifactId>jakarta.activation</artifactId>
314+
<scope>provided</scope>
315+
<optional>true</optional>
300316
</dependency>
301317
</dependencies>
302318
<build>
@@ -686,7 +702,6 @@
686702
</plugins>
687703
</build>
688704
</profile>
689-
690705
</profiles>
691706

692707
<properties>

core-common/src/main/java/org/glassfish/jersey/CommonProperties.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -230,13 +230,15 @@ public final class CommonProperties {
230230
* Disable some of the default providers from being loaded. The following providers extend application footprint
231231
* by XML dependencies, which is too heavy for native image, or by AWT which may possibly be not available by JDK 11 desktop:
232232
* <ul>
233+
* <li>javax.activation.DataSource</li>
233234
* <li>java.awt.image.RenderedImage</li>
234235
* <li>javax.xml.transform.Source</li>
235236
* <li>javax.xml.transform.dom.DOMSource</li>
236237
* <li>javax.xml.transform.sax.SAXSource</li>
237238
* <li>javax.xml.transform.stream.StreamSource</li>
238239
* </ul>
239-
* The following are the options to disable the provides: {@code DOMSOURCE, RENDEREDIMAGE, SAXSOURCE, SOURCE, STREAMSOURCE},
240+
* The following are the options to disable the provides:
241+
* {@code DATASOURCE, DOMSOURCE, RENDEREDIMAGE, SAXSOURCE, SOURCE, STREAMSOURCE},
240242
* or to disable all: {@code ALL}. Multiple options can be disabled by adding multiple comma separated values.
241243
*
242244
* @since 2.30

core-common/src/main/java/org/glassfish/jersey/internal/util/ReflectionHelper.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
33
*
44
* This program and the accompanying materials are made available under the
55
* terms of the Eclipse Public License v. 2.0, which is available at
@@ -1557,4 +1557,20 @@ public static Class<?> getRawClass(Type type) {
15571557

15581558
return null;
15591559
}
1560+
1561+
/**
1562+
* Returns true iff JAX-B API is available on classpath.
1563+
*/
1564+
public static boolean isJaxbAvailable() {
1565+
final Class<?> aClass = AccessController.doPrivileged(ReflectionHelper.classForNamePA("javax.xml.bind.JAXBException"));
1566+
return aClass != null;
1567+
}
1568+
1569+
/**
1570+
* Returns true iff javax.xml.transform package is available on classpath.
1571+
*/
1572+
public static boolean isXmlTransformAvailable() {
1573+
final Class<?> aClass = AccessController.doPrivileged(ReflectionHelper.classForNamePA("javax.xml.transform.Source"));
1574+
return aClass != null;
1575+
}
15601576
}

core-common/src/main/java/org/glassfish/jersey/message/internal/MessagingBinders.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ protected void configure() {
8080

8181
// Message body providers (both readers & writers)
8282
bindSingletonWorker(ByteArrayProvider.class);
83-
bindSingletonWorker(DataSourceProvider.class);
83+
// bindSingletonWorker(DataSourceProvider.class);
8484
bindSingletonWorker(FileProvider.class);
8585
bindSingletonWorker(FormMultivaluedMapProvider.class);
8686
bindSingletonWorker(FormProvider.class);
@@ -158,6 +158,7 @@ public Set<HeaderDelegateProvider> getHeaderDelegateProviders() {
158158

159159
private static final class EnabledProvidersBinder {
160160
private enum Provider {
161+
DATASOURCE("javax.activation.DataSource"),
161162
DOMSOURCE("javax.xml.transform.dom.DOMSource"),
162163
RENDEREDIMAGE("java.awt.image.RenderedImage"),
163164
SAXSOURCE("javax.xml.transform.sax.SAXSource"),
@@ -200,6 +201,9 @@ private void bindToBinder(AbstractBinder binder) {
200201
for (Provider provider : enabledProviders) {
201202
if (isClass(provider.className)) {
202203
switch (provider) {
204+
case DATASOURCE:
205+
providerBinder = new DataSourceBinder();
206+
break;
203207
case DOMSOURCE:
204208
providerBinder = new DomSourceBinder();
205209
break;
@@ -226,6 +230,7 @@ private void bindToBinder(AbstractBinder binder) {
226230
"MessageBodyReader<" + provider.className + ">")
227231
);
228232
break;
233+
case DATASOURCE:
229234
case RENDEREDIMAGE:
230235
case SOURCE:
231236
LOGGER.warning(LocalizationMessages.DEPENDENT_CLASS_OF_DEFAULT_PROVIDER_NOT_FOUND(provider.className,
@@ -241,11 +246,18 @@ private static boolean isClass(String className) {
241246
return null != AccessController.doPrivileged(ReflectionHelper.classForNamePA(className));
242247
}
243248

244-
245249
private interface ProviderBinder {
246250
void bind(AbstractBinder binder, Provider provider);
247251
}
248252

253+
private static class DataSourceBinder implements ProviderBinder {
254+
@Override
255+
public void bind(AbstractBinder binder, Provider provider) {
256+
binder.bind(DataSourceProvider.class)
257+
.to(MessageBodyReader.class).to(MessageBodyWriter.class).in(Singleton.class);
258+
}
259+
}
260+
249261
private static class DomSourceBinder implements ProviderBinder {
250262
@Override
251263
public void bind(AbstractBinder binder, Provider provider) {

core-server/pom.xml

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!--
33
4-
Copyright (c) 2010, 2019 Oracle and/or its affiliates. All rights reserved.
4+
Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
55
66
This program and the accompanying materials are made available under the
77
terms of the Eclipse Public License v. 2.0, which is available at
@@ -95,6 +95,14 @@
9595
</Export-Package>
9696
<Import-Package>
9797
${javax.annotation.osgi.version},
98+
javax.xml.bind;version="!";resolution:=optional,
99+
javax.xml.bind.annotation;version="!";resolution:=optional,
100+
javax.xml.bind.annotation.adapters;version="!";resolution:=optional,
101+
javax.xml.namespace;resolution:=optional,
102+
javax.xml.parsers;resolution:=optional,
103+
javax.xml.transform;resolution:=optional,
104+
javax.xml.transform.sax;resolution:=optional,
105+
javax.xml.transform.stream;resolution:=optional,
98106
javax.validation.*;resolution:=optional;version="${range;[==,3);${javax.validation.api.version}}",
99107
*
100108
</Import-Package>
@@ -172,12 +180,6 @@
172180
<artifactId>jakarta.ws.rs-api</artifactId>
173181
</dependency>
174182

175-
<dependency>
176-
<groupId>org.glassfish.jersey.media</groupId>
177-
<artifactId>jersey-media-jaxb</artifactId>
178-
<version>${project.version}</version>
179-
</dependency>
180-
181183
<dependency>
182184
<groupId>jakarta.annotation</groupId>
183185
<artifactId>jakarta.annotation-api</artifactId>
@@ -198,7 +200,18 @@
198200
<artifactId>org.osgi.core</artifactId>
199201
<scope>provided</scope>
200202
</dependency>
201-
203+
<dependency>
204+
<groupId>jakarta.xml.bind</groupId>
205+
<artifactId>jakarta.xml.bind-api</artifactId>
206+
<scope>provided</scope>
207+
<optional>true</optional>
208+
</dependency>
209+
<dependency>
210+
<groupId>org.glassfish.jersey.media</groupId>
211+
<artifactId>jersey-media-jaxb</artifactId>
212+
<version>${project.version}</version>
213+
<scope>test</scope>
214+
</dependency>
202215
<dependency>
203216
<groupId>junit</groupId>
204217
<artifactId>junit</artifactId>
@@ -232,10 +245,6 @@
232245
<jdk>[11,)</jdk>
233246
</activation>
234247
<dependencies>
235-
<dependency>
236-
<groupId>jakarta.xml.bind</groupId>
237-
<artifactId>jakarta.xml.bind-api</artifactId>
238-
</dependency>
239248
<dependency>
240249
<groupId>com.sun.xml.bind</groupId>
241250
<artifactId>jaxb-osgi</artifactId>

core-server/src/main/java/org/glassfish/jersey/server/wadl/WadlFeature.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,14 @@
2020
import javax.ws.rs.core.FeatureContext;
2121

2222
import javax.inject.Singleton;
23-
import javax.xml.bind.JAXBException;
2423

2524
import org.glassfish.jersey.internal.inject.AbstractBinder;
2625
import org.glassfish.jersey.internal.util.PropertiesHelper;
26+
import org.glassfish.jersey.internal.util.ReflectionHelper;
2727
import org.glassfish.jersey.server.ServerProperties;
2828
import org.glassfish.jersey.server.internal.LocalizationMessages;
2929
import org.glassfish.jersey.server.model.ModelProcessor;
3030
import org.glassfish.jersey.server.wadl.internal.WadlApplicationContextImpl;
31-
import org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator;
3231
import org.glassfish.jersey.server.wadl.processor.WadlModelProcessor;
3332

3433
import java.util.logging.Logger;
@@ -53,7 +52,17 @@ public boolean configure(FeatureContext context) {
5352
return false;
5453
}
5554

56-
if (!isJaxB()) {
55+
if (!ReflectionHelper.isJaxbAvailable()) {
56+
LOGGER.warning(LocalizationMessages.WADL_FEATURE_DISABLED_NOJAXB());
57+
return false;
58+
}
59+
60+
if (!ReflectionHelper.isXmlTransformAvailable()) {
61+
LOGGER.warning(LocalizationMessages.WADL_FEATURE_DISABLED_NOTRANSFORM());
62+
return false;
63+
}
64+
65+
if (!WadlApplicationContextImpl.isJaxbImplAvailable()) {
5766
LOGGER.warning(LocalizationMessages.WADL_FEATURE_DISABLED());
5867
return false;
5968
}
@@ -68,12 +77,4 @@ protected void configure() {
6877

6978
return true;
7079
}
71-
72-
private static boolean isJaxB() {
73-
try {
74-
return null != WadlApplicationContextImpl.getJAXBContextFromWadlGenerator(new WadlGeneratorJAXBGrammarGenerator());
75-
} catch (JAXBException je) {
76-
return false;
77-
}
78-
}
7980
}

core-server/src/main/java/org/glassfish/jersey/server/wadl/internal/WadlApplicationContextImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.sun.research.ws.wadl.Include;
4848
import com.sun.research.ws.wadl.Resource;
4949
import com.sun.research.ws.wadl.Resources;
50+
import org.glassfish.jersey.server.wadl.internal.generators.WadlGeneratorJAXBGrammarGenerator;
5051

5152
/**
5253
* WADL application context implementation.
@@ -263,4 +264,12 @@ private void attachExternalGrammar(
263264
throw new ProcessingException(LocalizationMessages.ERROR_WADL_EXTERNAL_GRAMMAR(), e);
264265
}
265266
}
267+
268+
public static boolean isJaxbImplAvailable() {
269+
try {
270+
return null != WadlApplicationContextImpl.getJAXBContextFromWadlGenerator(new WadlGeneratorJAXBGrammarGenerator());
271+
} catch (JAXBException je) {
272+
return false;
273+
}
274+
}
266275
}

core-server/src/main/resources/org/glassfish/jersey/server/internal/localization.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ unsupported.uri.injection.type="@Uri"-based injection of "{0}" type is not suppo
185185
user.not.authorized=User not authorized.
186186
wadl.doc.extended.wadl=This is full WADL including extended resources. To get simplified WADL with users resources only do not use the query parameter {0}. Link: {1}
187187
wadl.doc.simple.wadl=This is simplified WADL with user and core resources only. To get full WADL with extended resources use the query parameter {0}. Link: {1}
188+
wadl.feature.disabled.nojaxb=JAX-B API not found . WADL feature is disabled.
189+
wadl.feature.disabled.notransform=javax.xml.transform package could not be found. WADL feature is disabled.
188190
wadl.feature.disabled=JAXBContext implementation could not be found. WADL feature is disabled.
189191
wadl.jaxb.context.fallback=Error creating a JAXBContext for wadl serialization. Trying a fallback solution for osgi environments.
190192
wadl.resourcedoc.ambiguous.method.entries=Ambiguous resource documentation detected: \

0 commit comments

Comments
 (0)