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 <drr...@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
r...@apache.org.

Reply via email to