You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by re...@apache.org on 2018/03/02 14:45:43 UTC
[cxf] branch master updated: CXF-7659: Improve SSE automatic
configuration. (#386)
This is an automated email from the ASF dual-hosted git repository.
reta pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/master by this push:
new 982e4de CXF-7659: Improve SSE automatic configuration. (#386)
982e4de is described below
commit 982e4de7bd30563cde2582df702fa2994e52765f
Author: Andriy Redko <dr...@gmail.com>
AuthorDate: Fri Mar 2 09:45:38 2018 -0500
CXF-7659: Improve SSE automatic configuration. (#386)
CXF-7659: Improve SSE automatic configuration. Enhanced the default transport selection mechanism to consult bus property and already registered destination factories
---
.../managers/DestinationFactoryManagerImpl.java | 10 ++++++-
.../cxf/transport/AbstractTransportFactory.java | 2 ++
.../cxf/transport/DestinationFactoryManager.java | 16 +++++++++++
.../ext/SseTransportCustomizationExtension.java | 7 +++++
.../cxf/transport/servlet/CXFNonSpringServlet.java | 33 +++++++++++++++++++---
5 files changed, 63 insertions(+), 5 deletions(-)
diff --git a/core/src/main/java/org/apache/cxf/bus/managers/DestinationFactoryManagerImpl.java b/core/src/main/java/org/apache/cxf/bus/managers/DestinationFactoryManagerImpl.java
index 57478c4..0de1f53 100644
--- a/core/src/main/java/org/apache/cxf/bus/managers/DestinationFactoryManagerImpl.java
+++ b/core/src/main/java/org/apache/cxf/bus/managers/DestinationFactoryManagerImpl.java
@@ -19,6 +19,7 @@
package org.apache.cxf.bus.managers;
+import java.util.Collections;
import java.util.Map;
import java.util.Properties;
import java.util.ResourceBundle;
@@ -108,6 +109,7 @@ public final class DestinationFactoryManagerImpl implements DestinationFactoryMa
*
* @param namespace the namespace.
*/
+ @Override
public DestinationFactory getDestinationFactory(String namespace) throws BusException {
DestinationFactory factory = destinationFactories.get(namespace);
if (factory == null && !failed.contains(namespace)) {
@@ -124,11 +126,17 @@ public final class DestinationFactoryManagerImpl implements DestinationFactoryMa
return factory;
}
+ @Override
public DestinationFactory getDestinationFactoryForUri(String uri) {
return new TransportFinder<DestinationFactory>(bus,
destinationFactories,
loaded,
DestinationFactory.class).findTransportForURI(uri);
}
-
+
+ @Override
+ public Set<String> getRegisteredDestinationFactoryNames() {
+ return destinationFactories == null ? Collections.emptySet()
+ : Collections.unmodifiableSet(destinationFactories.keySet());
+ }
}
diff --git a/core/src/main/java/org/apache/cxf/transport/AbstractTransportFactory.java b/core/src/main/java/org/apache/cxf/transport/AbstractTransportFactory.java
index ea7d407..4d756a4 100644
--- a/core/src/main/java/org/apache/cxf/transport/AbstractTransportFactory.java
+++ b/core/src/main/java/org/apache/cxf/transport/AbstractTransportFactory.java
@@ -26,6 +26,8 @@ import java.util.Set;
* Helper methods for {@link DestinationFactory}s and {@link ConduitInitiator}s.
*/
public abstract class AbstractTransportFactory {
+ public static final String PREFERRED_TRANSPORT_ID = "org.apache.cxf.preferred.transport.id";
+
private List<String> transportIds;
public AbstractTransportFactory() {
diff --git a/core/src/main/java/org/apache/cxf/transport/DestinationFactoryManager.java b/core/src/main/java/org/apache/cxf/transport/DestinationFactoryManager.java
index 41c69f4..433f868 100644
--- a/core/src/main/java/org/apache/cxf/transport/DestinationFactoryManager.java
+++ b/core/src/main/java/org/apache/cxf/transport/DestinationFactoryManager.java
@@ -19,6 +19,8 @@
package org.apache.cxf.transport;
+import java.util.Set;
+
import org.apache.cxf.BusException;
/**
@@ -42,6 +44,12 @@ public interface DestinationFactoryManager {
* <code>DestinationFactory</code>.
*/
void deregisterDestinationFactory(String name);
+
+ /**
+ * Returns all registered (as of the moment of the call) destination factories.
+ * @return all registered (as of the moment of the call) destination factories.
+ */
+ Set<String> getRegisteredDestinationFactoryNames();
/**
* Returns the <code>DestinationFactory</code> registered with the specified name,
@@ -53,5 +61,13 @@ public interface DestinationFactoryManager {
*/
DestinationFactory getDestinationFactory(String name) throws BusException;
+ /**
+ * Returns the <code>DestinationFactory</code> registered with the specified URI,
+ * loading the appropriate plugin if necessary.
+ *
+ * @param uri the uri to look up <code>DestinationFactory</code>
+ * @return the registered <code>DestinationFactory</code>
+ * @throws BusException
+ */
DestinationFactory getDestinationFactoryForUri(String uri);
}
diff --git a/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/ext/SseTransportCustomizationExtension.java b/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/ext/SseTransportCustomizationExtension.java
index 84a0a9a..b0123d0 100644
--- a/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/ext/SseTransportCustomizationExtension.java
+++ b/rt/rs/sse/src/main/java/org/apache/cxf/jaxrs/sse/ext/SseTransportCustomizationExtension.java
@@ -18,10 +18,12 @@
*/
package org.apache.cxf.jaxrs.sse.ext;
+import org.apache.cxf.Bus;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.ext.JAXRSServerFactoryCustomizationExtension;
import org.apache.cxf.jaxrs.sse.SseContextProvider;
import org.apache.cxf.jaxrs.sse.atmosphere.SseAtmosphereEventSinkContextProvider;
+import org.apache.cxf.transport.AbstractTransportFactory;
import org.apache.cxf.transport.sse.SseHttpTransportFactory;
public class SseTransportCustomizationExtension implements JAXRSServerFactoryCustomizationExtension {
@@ -30,5 +32,10 @@ public class SseTransportCustomizationExtension implements JAXRSServerFactoryCus
bean.setTransportId(SseHttpTransportFactory.TRANSPORT_ID);
bean.setProvider(new SseContextProvider());
bean.setProvider(new SseAtmosphereEventSinkContextProvider());
+
+ final Bus bus = bean.getBus();
+ if (bus != null) {
+ bus.setProperty(AbstractTransportFactory.PREFERRED_TRANSPORT_ID, SseHttpTransportFactory.TRANSPORT_ID);
+ }
}
}
diff --git a/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFNonSpringServlet.java b/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFNonSpringServlet.java
index b8b5f02..4a28fba 100644
--- a/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFNonSpringServlet.java
+++ b/rt/transports/http/src/main/java/org/apache/cxf/transport/servlet/CXFNonSpringServlet.java
@@ -21,6 +21,7 @@ package org.apache.cxf.transport.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Collection;
+import java.util.Set;
import javax.servlet.FilterChain;
import javax.servlet.ServletConfig;
@@ -41,6 +42,7 @@ import org.apache.cxf.common.classloader.ClassLoaderUtils.ClassLoaderHolder;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.resource.ResourceManager;
+import org.apache.cxf.transport.AbstractTransportFactory;
import org.apache.cxf.transport.DestinationFactory;
import org.apache.cxf.transport.DestinationFactoryManager;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
@@ -53,7 +55,8 @@ public class CXFNonSpringServlet extends AbstractHTTPServlet {
private static final long serialVersionUID = -2437897227486327166L;
private static final String IGNORE_SERVLET_CONTEXT_RESOLVER = "ignore.servlet.context.resolver";
-
+ private static final String DEFAULT_TRANSPORT_ID = "http://cxf.apache.org/transports/http/configuration";
+
protected Bus bus;
private DestinationRegistry destinationRegistry;
private boolean globalRegistry;
@@ -116,9 +119,31 @@ public class CXFNonSpringServlet extends AbstractHTTPServlet {
protected DestinationRegistry getDestinationRegistryFromBusOrDefault(final String transportId) {
DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class);
try {
- DestinationFactory df = StringUtils.isEmpty(transportId)
- ? dfm.getDestinationFactory("http://cxf.apache.org/transports/http/configuration")
- : dfm.getDestinationFactory(transportId);
+ String peferredTransportId = transportId;
+
+ // Check if the preferred transport is set on a bus level (f.e., from any
+ // extension or customization).
+ if (StringUtils.isEmpty(peferredTransportId) && getBus() != null) {
+ peferredTransportId = (String)getBus().getProperty(AbstractTransportFactory.PREFERRED_TRANSPORT_ID);
+ }
+
+ if (StringUtils.isEmpty(peferredTransportId)) {
+ final Set<String> candidates = dfm.getRegisteredDestinationFactoryNames();
+
+ // If the default transport is present, fall back to it and don't even
+ // consider other candidates
+ if (!candidates.contains(DEFAULT_TRANSPORT_ID)) {
+ peferredTransportId = candidates
+ .stream()
+ .filter(name -> name.endsWith("/configuration"))
+ .findAny()
+ .orElse(DEFAULT_TRANSPORT_ID);
+ }
+ }
+
+ DestinationFactory df = StringUtils.isEmpty(peferredTransportId)
+ ? dfm.getDestinationFactory(DEFAULT_TRANSPORT_ID)
+ : dfm.getDestinationFactory(peferredTransportId);
if (df instanceof HTTPTransportFactory) {
HTTPTransportFactory transportFactory = (HTTPTransportFactory)df;
return transportFactory.getRegistry();
--
To stop receiving notification emails like this one, please contact
reta@apache.org.