Backport server side configuration. Is it worth it?
diff --git a/deps/cxf-shade/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java b/deps/cxf-shade/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
index 95fe661..032481c 100644
--- a/deps/cxf-shade/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
+++ b/deps/cxf-shade/src/patch/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
@@ -210,20 +210,28 @@
return new ProviderCache(checkAll);
}
protected static void initFactory(ProviderFactory factory) {
+
+ final List<Object> providers = new ArrayList<>();
+ providers.add(new BinaryDataProvider<Object>());
+ providers.add(new SourceProvider<Object>());
+ providers.add(DATA_SOURCE_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+ providers.add(new FormEncodingProvider<Object>());
+ providers.add(new StringTextProvider());
+ providers.add(new PrimitiveTextProvider<Object>());
+ providers.add(JAXB_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+ providers.add(MULTIPART_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+
+ // property set in CxfRsHttpListener
+ if (!PropertyUtils.isFalse(factory.getBus().getProperty("org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider.activated"))) {
+ providers.add(JSONP_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+ }
+ if (!PropertyUtils.isFalse(factory.getBus().getProperty("org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider.activated"))) {
+ providers.add(JSONB_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+ }
+
// ensure to not load providers not available in a module environment if not needed
- factory.setProviders(false,
- false,
- new BinaryDataProvider<Object>(),
- new SourceProvider<Object>(),
- DATA_SOURCE_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
- new FormEncodingProvider<Object>(),
- new StringTextProvider(),
- new PrimitiveTextProvider<Object>(),
- JAXB_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
- JAXB_ELEMENT_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
- JSONP_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
- JSONB_PROVIDER_CLASS.tryCreateInstance(factory.getBus()),
- MULTIPART_PROVIDER_CLASS.tryCreateInstance(factory.getBus()));
+ factory.setProviders(false, false, providers.toArray(new Object[0]));
+
Object prop = factory.getBus().getProperty("skip.default.json.provider.registration");
if (!PropertyUtils.isTrue(prop)) {
factory.setProviders(false, false, createProvider(JSON_PROVIDER_NAME, factory.getBus()));
diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
index 6abf1e9..7f56b3e 100644
--- a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
+++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
@@ -130,7 +130,6 @@
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.URL;
@@ -760,7 +759,7 @@
factory.setProvider(new TomEESseEventSinkContextProvider());
server = factory.create();
- fixProviderIfKnown();
+ fixProviders(serviceConfiguration);
fireServerCreated(oldLoader);
final ServerProviderFactory spf = ServerProviderFactory.class.cast(server.getEndpoint().get(ServerProviderFactory.class.getName()));
@@ -846,7 +845,13 @@
return Singleton.class == scope || Dependent.class == scope;
}
- private void fixProviderIfKnown() {
+ /**
+ * Fix providers set in ProviderFactory
+ * - changes default Jonhzon by the TomEE specific one
+ * - remove deactivated providers
+ * @param serviceConfiguration
+ */
+ private void fixProviders(final ServiceConfiguration serviceConfiguration) {
final ServerProviderFactory spf = ServerProviderFactory.class.cast(server.getEndpoint().get(ServerProviderFactory.class.getName()));
for (final String field : asList("messageWriters", "messageReaders")) {
final List<ProviderInfo<?>> values = List.class.cast(Reflections.get(spf, field));
@@ -863,21 +868,31 @@
}
}
- if (customJsonProvider) { // remove JohnzonProvider default versions
- final Iterator<ProviderInfo<?>> it = values.iterator();
- while (it.hasNext()) {
- final String name = it.next().getResourceClass().getName();
- if ("org.apache.johnzon.jaxrs.JohnzonProvider".equals(name) ||
- "org.apache.openejb.server.cxf.rs.CxfRSService$TomEEJohnzonProvider".equals(name)) {
- it.remove();
- break;
- }
+ final Iterator<ProviderInfo<?>> it = values.iterator();
+ while (it.hasNext()) {
+ final String name = it.next().getResourceClass().getName();
+
+ // remove JohnzonProvider default versions
+ if (("org.apache.johnzon.jaxrs.JohnzonProvider".equals(name) ||
+ "org.apache.openejb.server.cxf.rs.CxfRSService$TomEEJohnzonProvider".equals(name)) && customJsonProvider) {
+ it.remove();
+ }
+
+ // remove deactivated providers
+ if (!isActive(name, serviceConfiguration)) {
+ it.remove();
}
}
+
}
}
+ public boolean isActive(final String name, final ServiceConfiguration serviceConfiguration) {
+ final String key = name + ".activated";
+ return "true".equalsIgnoreCase(SystemInstance.get().getProperty(key, serviceConfiguration.getProperties().getProperty(key, "true")));
+ }
+
private static Class<?> realClass(final Class<?> aClass) {
Class<?> result = aClass;
while (result.getName().contains("$$")) {
diff --git a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
index c6f0bc1..5fd13db 100644
--- a/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
+++ b/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/DisableTomEEJohnzonTest.java
@@ -51,7 +51,8 @@
@Classes(DisableTomEEJohnzonTest.Endpoint.class)
@JaxrsProviders(DisableTomEEJohnzonTest.TestWriter.class)
@ContainerProperties({
- @ContainerProperties.Property(name = "org.apache.openejb.server.cxf.rs.johnzon.TomEEJohnzonProvider.activated", value = "false")
+ @ContainerProperties.Property(name = "org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonbProvider.activated", value = "false"),
+ @ContainerProperties.Property(name = "org.apache.openejb.server.cxf.rs.johnzon.TomEEJsonpProvider.activated", value = "false")
})
@RunWith(ApplicationComposer.class)
public class DisableTomEEJohnzonTest {