You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by dk...@apache.org on 2015/07/23 21:49:09 UTC

camel git commit: [CAMEL-9006] Prototype for review of being able to configure multiple restCOnfigurations for hte rest DSL

Repository: camel
Updated Branches:
  refs/heads/master 1a5df0b67 -> 87e3249f2


[CAMEL-9006] Prototype for review of being able to configure multiple restCOnfigurations for hte rest DSL


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/87e3249f
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/87e3249f
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/87e3249f

Branch: refs/heads/master
Commit: 87e3249f235c99bceacd76ab5aed16a6ad7d4ff1
Parents: 1a5df0b
Author: Daniel Kulp <dk...@apache.org>
Authored: Thu Jul 23 15:48:16 2015 -0400
Committer: Daniel Kulp <dk...@apache.org>
Committed: Thu Jul 23 15:48:52 2015 -0400

----------------------------------------------------------------------
 .../java/org/apache/camel/CamelContext.java     | 24 +++++++++-
 .../org/apache/camel/builder/RouteBuilder.java  | 34 ++++++++++---
 .../apache/camel/impl/DefaultCamelContext.java  | 35 ++++++++++++--
 .../camel/model/rest/RestBindingDefinition.java | 50 ++++++++++++++------
 .../apache/camel/model/rest/RestDefinition.java | 16 +++++--
 components/camel-coap/pom.xml                   |  5 ++
 .../org/apache/camel/coap/CoAPComponent.java    | 23 ++++-----
 .../camel/coap/CoAPRestComponentTest.java       | 20 ++++++--
 .../component/jetty/JettyHttpComponent.java     | 22 ++++-----
 .../netty4/http/NettyHttpComponent.java         | 22 ++++-----
 .../component/restlet/RestletComponent.java     | 32 ++++++-------
 11 files changed, 195 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/camel-core/src/main/java/org/apache/camel/CamelContext.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/CamelContext.java b/camel-core/src/main/java/org/apache/camel/CamelContext.java
index 4b2b246..c820dff 100644
--- a/camel-core/src/main/java/org/apache/camel/CamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/CamelContext.java
@@ -485,11 +485,33 @@ public interface CamelContext extends SuspendableService, RuntimeConfiguration {
     void setRestConfiguration(RestConfiguration restConfiguration);
 
     /**
-     * Gets the current REST configuration
+     * Gets the default REST configuration
      *
      * @return the configuration, or <tt>null</tt> if none has been configured.
      */
     RestConfiguration getRestConfiguration();
+    
+    /**
+     * Sets a custom {@link org.apache.camel.spi.RestConfiguration}
+     *
+     * @param restConfiguration the REST configuration
+     */
+    void addRestConfiguration(RestConfiguration restConfiguration);
+
+    /**
+     * Gets the REST configuration for the given component
+     * @param component the component name to get the configuration
+     * @param defaultIfNotFound determine if the default configuration is returned if there isn't a 
+     *        specific configuration for the given component  
+     * @return the configuration, or <tt>null</tt> if none has been configured.
+     */
+    RestConfiguration getRestConfiguration(String component, boolean defaultIfNotFound);
+    
+    /**
+     * Gets all the RestConfigurations 
+     * @return
+     */
+    Collection<RestConfiguration> getRestConfigurations();
 
     /**
      * Returns the order in which the route inputs was started.

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
index 32f382f..d12298a 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -16,7 +16,9 @@
  */
 package org.apache.camel.builder;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.camel.CamelContext;
@@ -48,7 +50,7 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
     protected Logger log = LoggerFactory.getLogger(getClass());
     private AtomicBoolean initialized = new AtomicBoolean(false);
     private RestsDefinition restCollection = new RestsDefinition();
-    private RestConfigurationDefinition restConfiguration;
+    private Map<String, RestConfigurationDefinition> restConfigurations;
     private RoutesDefinition routeCollection = new RoutesDefinition();
 
     public RouteBuilder() {
@@ -80,12 +82,26 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
      * @return the builder
      */
     public RestConfigurationDefinition restConfiguration() {
+        return restConfiguration("default");
+    }
+
+    /**
+     * Configures the REST service for the given component
+     *
+     * @return the builder
+     */
+    public RestConfigurationDefinition restConfiguration(String component) {
+        if (restConfigurations == null) {
+            restConfigurations = new HashMap<String, RestConfigurationDefinition>();
+        }
+        RestConfigurationDefinition restConfiguration = restConfigurations.get(component);
         if (restConfiguration == null) {
             restConfiguration = new RestConfigurationDefinition();
+            restConfiguration.component(component);
+            restConfigurations.put(component, restConfiguration);
         }
         return restConfiguration;
     }
-
     /**
      * Creates a new REST service
      *
@@ -407,8 +423,14 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
 
         // setup rest configuration before adding the rests
         if (getRestConfiguration() != null) {
-            RestConfiguration config = getRestConfiguration().asRestConfiguration(getContext());
-            camelContext.setRestConfiguration(config);
+            for (Map.Entry<String, RestConfigurationDefinition> entry : getRestConfiguration().entrySet()) {
+                RestConfiguration config = entry.getValue().asRestConfiguration(getContext());
+                if ("default".equals(entry.getKey())) {
+                    camelContext.setRestConfiguration(config);
+                } else {
+                    camelContext.addRestConfiguration(config);
+                }
+            }
         }
         camelContext.addRestDefinitions(getRestCollection().getRests());
 
@@ -425,8 +447,8 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         return restCollection;
     }
 
-    public RestConfigurationDefinition getRestConfiguration() {
-        return restConfiguration;
+    public Map<String, RestConfigurationDefinition> getRestConfiguration() {
+        return restConfigurations;
     }
 
     public void setRestCollection(RestsDefinition restCollection) {

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index 0ed913a..5fefcfa 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -34,10 +34,12 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+
 import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 import javax.naming.Context;
@@ -196,7 +198,7 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     private ManagementMBeanAssembler managementMBeanAssembler;
     private final List<RouteDefinition> routeDefinitions = new ArrayList<RouteDefinition>();
     private final List<RestDefinition> restDefinitions = new ArrayList<RestDefinition>();
-    private RestConfiguration restConfiguration = new RestConfiguration();
+    private Map<String, RestConfiguration> restConfigurations = new ConcurrentHashMap<>();
     private RestRegistry restRegistry = new DefaultRestRegistry();
     private List<InterceptStrategy> interceptStrategies = new ArrayList<InterceptStrategy>();
     private List<RoutePolicyFactory> routePolicyFactories = new ArrayList<RoutePolicyFactory>();
@@ -2296,13 +2298,40 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
     }
 
     public RestConfiguration getRestConfiguration() {
-        return restConfiguration;
+        RestConfiguration config = restConfigurations.get("default");
+        if (config == null) {
+            config = new RestConfiguration();
+            setRestConfiguration(config);
+        }
+        return config;
     }
 
     public void setRestConfiguration(RestConfiguration restConfiguration) {
-        this.restConfiguration = restConfiguration;
+        restConfigurations.put("default", restConfiguration);
+    }
+    public Collection<RestConfiguration> getRestConfigurations() {
+        return restConfigurations.values();
     }
 
+
+    public void addRestConfiguration(RestConfiguration restConfiguration) {
+        restConfigurations.put(restConfiguration.getComponent(), restConfiguration);        
+    }
+    public RestConfiguration getRestConfiguration(String component, boolean defaultIfNotExist) {
+        if (component == null) {
+            component = "default";
+        }
+        RestConfiguration config = restConfigurations.get(component);
+        if (config == null && defaultIfNotExist) {
+            config = getRestConfiguration();
+            if (config != null && config.getComponent() != null && !component.equals(component)) {
+                config = new RestConfiguration();
+                restConfigurations.put(component, config);
+            }
+        }
+        return config;
+    }
+    
     public List<InterceptStrategy> getInterceptStrategies() {
         return interceptStrategies;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java b/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
index de75691..a7f01d9 100644
--- a/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/rest/RestBindingDefinition.java
@@ -18,6 +18,7 @@ package org.apache.camel.model.rest;
 
 import java.util.HashMap;
 import java.util.Map;
+
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -30,6 +31,7 @@ import org.apache.camel.model.NoOutputDefinition;
 import org.apache.camel.processor.binding.RestBindingProcessor;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RouteContext;
 import org.apache.camel.util.IntrospectionSupport;
 
@@ -61,33 +63,40 @@ public class RestBindingDefinition extends NoOutputDefinition<RestBindingDefinit
 
     @XmlAttribute
     private Boolean enableCORS;
+    
+    @XmlAttribute
+    private String component;
+
+    public RestBindingDefinition() {   
+    }
 
     @Override
     public String toString() {
         return "RestBinding";
     }
-
+    
     @Override
     public Processor createProcessor(RouteContext routeContext) throws Exception {
 
         CamelContext context = routeContext.getCamelContext();
-
+        RestConfiguration config = context.getRestConfiguration(component, true);
+        
         // these options can be overriden per rest verb
-        String mode = context.getRestConfiguration().getBindingMode().name();
+        String mode = config.getBindingMode().name();
         if (bindingMode != null) {
             mode = bindingMode.name();
         }
-        boolean cors = context.getRestConfiguration().isEnableCORS();
+        boolean cors = config.isEnableCORS();
         if (enableCORS != null) {
             cors = enableCORS;
         }
-        boolean skip = context.getRestConfiguration().isSkipBindingOnErrorCode();
+        boolean skip = config.isSkipBindingOnErrorCode();
         if (skipBindingOnErrorCode != null) {
             skip = skipBindingOnErrorCode;
         }
 
         // cors headers
-        Map<String, String> corsHeaders = context.getRestConfiguration().getCorsHeaders();
+        Map<String, String> corsHeaders = config.getCorsHeaders();
 
         if (mode == null || "off".equals(mode)) {
             // binding mode is off, so create a off mode binding processor
@@ -95,7 +104,7 @@ public class RestBindingDefinition extends NoOutputDefinition<RestBindingDefinit
         }
 
         // setup json data format
-        String name = context.getRestConfiguration().getJsonDataFormat();
+        String name = config.getJsonDataFormat();
         if (name != null) {
             // must only be a name, not refer to an existing instance
             Object instance = context.getRegistry().lookupByName(name);
@@ -124,7 +133,7 @@ public class RestBindingDefinition extends NoOutputDefinition<RestBindingDefinit
                 IntrospectionSupport.setProperty(context.getTypeConverter(), json, "unmarshalType", clazz);
                 IntrospectionSupport.setProperty(context.getTypeConverter(), json, "useList", type.endsWith("[]"));
             }
-            setAdditionalConfiguration(context, json, "json.in.");
+            setAdditionalConfiguration(config, context, json, "json.in.");
             context.addService(json);
 
             Class<?> outClazz = null;
@@ -136,12 +145,12 @@ public class RestBindingDefinition extends NoOutputDefinition<RestBindingDefinit
                 IntrospectionSupport.setProperty(context.getTypeConverter(), outJson, "unmarshalType", outClazz);
                 IntrospectionSupport.setProperty(context.getTypeConverter(), outJson, "useList", outType.endsWith("[]"));
             }
-            setAdditionalConfiguration(context, outJson, "json.out.");
+            setAdditionalConfiguration(config, context, outJson, "json.out.");
             context.addService(outJson);
         }
 
         // setup xml data format
-        name = context.getRestConfiguration().getXmlDataFormat();
+        name = config.getXmlDataFormat();
         if (name != null) {
             // must only be a name, not refer to an existing instance
             Object instance = context.getRegistry().lookupByName(name);
@@ -170,7 +179,7 @@ public class RestBindingDefinition extends NoOutputDefinition<RestBindingDefinit
                 JAXBContext jc = JAXBContext.newInstance(clazz);
                 IntrospectionSupport.setProperty(context.getTypeConverter(), jaxb, "context", jc);
             }
-            setAdditionalConfiguration(context, jaxb, "xml.in.");
+            setAdditionalConfiguration(config, context, jaxb, "xml.in.");
             context.addService(jaxb);
 
             Class<?> outClazz = null;
@@ -186,22 +195,23 @@ public class RestBindingDefinition extends NoOutputDefinition<RestBindingDefinit
                 JAXBContext jc = JAXBContext.newInstance(clazz);
                 IntrospectionSupport.setProperty(context.getTypeConverter(), outJaxb, "context", jc);
             }
-            setAdditionalConfiguration(context, outJaxb, "xml.out.");
+            setAdditionalConfiguration(config, context, outJaxb, "xml.out.");
             context.addService(outJaxb);
         }
 
         return new RestBindingProcessor(json, jaxb, outJson, outJaxb, consumes, produces, mode, skip, cors, corsHeaders);
     }
 
-    private void setAdditionalConfiguration(CamelContext context, DataFormat dataFormat, String prefix) throws Exception {
-        if (context.getRestConfiguration().getDataFormatProperties() != null && !context.getRestConfiguration().getDataFormatProperties().isEmpty()) {
+    private void setAdditionalConfiguration(RestConfiguration config, CamelContext context, 
+                                            DataFormat dataFormat, String prefix) throws Exception {
+        if (config.getDataFormatProperties() != null && !config.getDataFormatProperties().isEmpty()) {
             // must use a copy as otherwise the options gets removed during introspection setProperties
             Map<String, Object> copy = new HashMap<String, Object>();
 
             // filter keys on prefix
             // - either its a known prefix and must match the prefix parameter
             // - or its a common configuration that we should always use
-            for (Map.Entry<String, Object> entry : context.getRestConfiguration().getDataFormatProperties().entrySet()) {
+            for (Map.Entry<String, Object> entry : config.getDataFormatProperties().entrySet()) {
                 String key = entry.getKey();
                 String copyKey;
                 boolean known = isKeyKnownPrefix(key);
@@ -228,6 +238,16 @@ public class RestBindingDefinition extends NoOutputDefinition<RestBindingDefinit
     public String getConsumes() {
         return consumes;
     }
+    
+    /**
+     * Sets the component name that this definition will apply to  
+     */
+    public void setComponent(String component) {
+        this.component = component;
+    }
+    public String getComponent() {
+        return component;
+    }
 
     /**
      * To define the content type what the REST service consumes (accept as input), such as application/xml or application/json

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java b/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
index b25c189..5f01e80 100644
--- a/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
+++ b/camel-core/src/main/java/org/apache/camel/model/rest/RestDefinition.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
@@ -34,6 +35,7 @@ import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.ToDefinition;
 import org.apache.camel.model.ToDynamicDefinition;
 import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.URISupport;
@@ -477,7 +479,13 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
      */
     public List<RouteDefinition> asRouteDefinition(CamelContext camelContext) {
         List<RouteDefinition> answer = new ArrayList<RouteDefinition>();
-
+        for (RestConfiguration config : camelContext.getRestConfigurations()) {
+            addRouteDefinition(camelContext, answer, config.getComponent());
+        }
+        return answer;
+    }
+    
+    private void addRouteDefinition(CamelContext camelContext, List<RouteDefinition> answer, String component) {
         for (VerbDefinition verb : getVerbs()) {
             // either the verb has a singular to or a embedded route
             RouteDefinition route = verb.getRoute();
@@ -491,6 +499,7 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
 
             // add the binding
             RestBindingDefinition binding = new RestBindingDefinition();
+            binding.setComponent(component);
             binding.setType(verb.getType());
             binding.setOutType(verb.getOutType());
             // verb takes precedence over configuration on rest
@@ -557,6 +566,9 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
             }
             String routeId = route.idOrCreate(camelContext.getNodeIdFactory());
             options.put("routeId", routeId);
+            if (component != null) {
+                options.put("componentName", component);
+            }
 
             // include optional description, which we favor from 1) to/route description 2) verb description 3) rest description
             // this allows end users to define general descriptions and override then per to/route or verb
@@ -635,8 +647,6 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
             route.setRestDefinition(this);
             answer.add(route);
         }
-
-        return answer;
     }
 
     private String buildUri(VerbDefinition verb) {

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/components/camel-coap/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-coap/pom.xml b/components/camel-coap/pom.xml
index f70ab85..596207a 100644
--- a/components/camel-coap/pom.xml
+++ b/components/camel-coap/pom.xml
@@ -68,6 +68,11 @@
       <artifactId>camel-test</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-jetty9</artifactId>
+        <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
index 8c96224..a0f265b 100644
--- a/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
+++ b/components/camel-coap/src/main/java/org/apache/camel/coap/CoAPComponent.java
@@ -82,14 +82,11 @@ public class CoAPComponent extends UriEndpointComponent implements RestConsumerF
                                    String consumes, 
                                    String produces,
                                    Map<String, Object> parameters) throws Exception {
-        RestConfiguration config = getCamelContext().getRestConfiguration();
+        RestConfiguration config = getCamelContext().getRestConfiguration("coap", true);
         Map<String, Object> map = new HashMap<String, Object>();
-        // build query string, and append any endpoint configuration properties
-        if (config != null && (config.getComponent() == null || config.getComponent().equals("restlet"))) {
-            // setup endpoint options
-            if (config.getEndpointProperties() != null && !config.getEndpointProperties().isEmpty()) {
-                map.putAll(config.getEndpointProperties());
-            }
+        // setup endpoint options
+        if (config.getEndpointProperties() != null && !config.getEndpointProperties().isEmpty()) {
+            map.putAll(config.getEndpointProperties());
         }
 
         String query = URISupport.createQueryString(map);
@@ -118,14 +115,12 @@ public class CoAPComponent extends UriEndpointComponent implements RestConsumerF
     protected void doStart() throws Exception {
         super.doStart();
 
-        RestConfiguration config = getCamelContext().getRestConfiguration();
-        if (config != null && (config.getComponent() == null || config.getComponent().equals("coap"))) {
-            // configure additional options on spark configuration
-            if (config.getComponentProperties() != null && !config.getComponentProperties().isEmpty()) {
-                setProperties(this, config.getComponentProperties());
-            }
-            defaultServer = getServer(config.getPort());
+        RestConfiguration config = getCamelContext().getRestConfiguration("coap", true);
+        // configure additional options on spark configuration
+        if (config.getComponentProperties() != null && !config.getComponentProperties().isEmpty()) {
+            setProperties(this, config.getComponentProperties());
         }
+        defaultServer = getServer(config.getPort());
         
         for (CoapServer s : servers.values()) {
             s.start();

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPRestComponentTest.java
----------------------------------------------------------------------
diff --git a/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPRestComponentTest.java b/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPRestComponentTest.java
index f2b56ec..2ac3137 100644
--- a/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPRestComponentTest.java
+++ b/components/camel-coap/src/test/java/org/apache/camel/coap/CoAPRestComponentTest.java
@@ -16,9 +16,14 @@
  */
 package org.apache.camel.coap;
 
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.converter.IOConverter;
 import org.apache.camel.test.AvailablePortFinder;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.eclipse.californium.core.CoapClient;
@@ -28,7 +33,8 @@ import org.eclipse.californium.core.network.config.NetworkConfig;
 import org.junit.Test;
 
 public class CoAPRestComponentTest extends CamelTestSupport {
-    int port = AvailablePortFinder.getNextAvailable();
+    int coapport = AvailablePortFinder.getNextAvailable();
+    int jettyport = AvailablePortFinder.getNextAvailable();
     
     @Test
     public void testCoAP() throws Exception {
@@ -36,19 +42,24 @@ public class CoAPRestComponentTest extends CamelTestSupport {
         CoapClient client;
         CoapResponse rsp;
         
-        client = new CoapClient("coap://localhost:" + port + "/TestResource/Ducky");
+        client = new CoapClient("coap://localhost:" + coapport + "/TestResource/Ducky");
         client.setTimeout(1000000);
         rsp = client.get();
         assertEquals("Hello Ducky", rsp.getResponseText());
         rsp = client.post("data", MediaTypeRegistry.TEXT_PLAIN);
         assertEquals("Hello Ducky: data", rsp.getResponseText());
         
-        client = new CoapClient("coap://localhost:" + port + "/TestParms?id=Ducky");
+        client = new CoapClient("coap://localhost:" + coapport + "/TestParms?id=Ducky");
         client.setTimeout(1000000);
         rsp = client.get();
         assertEquals("Hello Ducky", rsp.getResponseText());
         rsp = client.post("data", MediaTypeRegistry.TEXT_PLAIN);
         assertEquals("Hello Ducky: data", rsp.getResponseText());
+        
+        
+        URL url = new URL("http://localhost:" + jettyport + "/TestResource/Ducky");
+        InputStream ins = url.openConnection().getInputStream();
+        assertEquals("Hello Ducky", IOConverter.toString(new InputStreamReader(ins)));
     }
 
     @Override
@@ -56,7 +67,8 @@ public class CoAPRestComponentTest extends CamelTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                restConfiguration().component("coap").host("localhost").scheme("coap").port(port);
+                restConfiguration("coap").host("localhost").port(coapport);
+                restConfiguration("jetty").host("localhost").port(jettyport);
                 rest("/TestParms")
                     .get().to("direct:get1")
                     .post().to("direct:post1");

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
index fa03902..f5ec313 100644
--- a/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
+++ b/components/camel-jetty-common/src/main/java/org/apache/camel/component/jetty/JettyHttpComponent.java
@@ -997,18 +997,16 @@ public abstract class JettyHttpComponent extends HttpCommonComponent implements
         int port = 0;
 
         // if no explicit port/host configured, then use port from rest configuration
-        RestConfiguration config = getCamelContext().getRestConfiguration();
-        if (config.getComponent() == null || config.getComponent().equals("jetty")) {
-            if (config.getScheme() != null) {
-                scheme = config.getScheme();
-            }
-            if (config.getHost() != null) {
-                host = config.getHost();
-            }
-            int num = config.getPort();
-            if (num > 0) {
-                port = num;
-            }
+        RestConfiguration config = getCamelContext().getRestConfiguration("jetty", true);
+        if (config.getScheme() != null) {
+            scheme = config.getScheme();
+        }
+        if (config.getHost() != null) {
+            host = config.getHost();
+        }
+        int num = config.getPort();
+        if (num > 0) {
+            port = num;
         }
 
         // if no explicit hostname set then resolve the hostname

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java b/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
index bb77cbf..0a4502c 100644
--- a/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
+++ b/components/camel-netty4-http/src/main/java/org/apache/camel/component/netty4/http/NettyHttpComponent.java
@@ -242,18 +242,16 @@ public class NettyHttpComponent extends NettyComponent implements HeaderFilterSt
         int port = 0;
 
         // if no explicit port/host configured, then use port from rest configuration
-        RestConfiguration config = getCamelContext().getRestConfiguration();
-        if (config.getComponent() == null || config.getComponent().equals("netty4-http")) {
-            if (config.getScheme() != null) {
-                scheme = config.getScheme();
-            }
-            if (config.getHost() != null) {
-                host = config.getHost();
-            }
-            int num = config.getPort();
-            if (num > 0) {
-                port = num;
-            }
+        RestConfiguration config = getCamelContext().getRestConfiguration("netty4-http", true);
+        if (config.getScheme() != null) {
+            scheme = config.getScheme();
+        }
+        if (config.getHost() != null) {
+            host = config.getHost();
+        }
+        int num = config.getPort();
+        if (num > 0) {
+            port = num;
         }
 
         // if no explicit hostname set then resolve the hostname

http://git-wip-us.apache.org/repos/asf/camel/blob/87e3249f/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
index 99b8118..345d89d 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/RestletComponent.java
@@ -142,12 +142,10 @@ public class RestletComponent extends HeaderFilterStrategyComponent implements R
         super.doStart();
 
         // configure component options
-        RestConfiguration config = getCamelContext().getRestConfiguration();
-        if (config != null && (config.getComponent() == null || config.getComponent().equals("restlet"))) {
-            // configure additional options on spark configuration
-            if (config.getComponentProperties() != null && !config.getComponentProperties().isEmpty()) {
-                setProperties(this, config.getComponentProperties());
-            }
+        RestConfiguration config = getCamelContext().getRestConfiguration("restlet", true);
+        // configure additional options on spark configuration
+        if (config.getComponentProperties() != null && !config.getComponentProperties().isEmpty()) {
+            setProperties(this, config.getComponentProperties());
         }
 
         component.start();
@@ -685,18 +683,16 @@ public class RestletComponent extends HeaderFilterStrategyComponent implements R
         int port = this.getPort();
 
         // if no explicit port/host configured, then use port from rest configuration
-        RestConfiguration config = getCamelContext().getRestConfiguration();
-        if (config.getComponent() == null || config.getComponent().equals("restlet")) {
-            if (config.getScheme() != null) {
-                scheme = config.getScheme();
-            }
-            if (config.getHost() != null) {
-                host = config.getHost();
-            }
-            int num = config.getPort();
-            if (num > 0) {
-                port = num;
-            }
+        RestConfiguration config = getCamelContext().getRestConfiguration("restlet", true);
+        if (config.getScheme() != null) {
+            scheme = config.getScheme();
+        }
+        if (config.getHost() != null) {
+            host = config.getHost();
+        }
+        int num = config.getPort();
+        if (num > 0) {
+            port = num;
         }
 
         // if no explicit hostname set then resolve the hostname