CAMEL-7354: camel-spark component.

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

Branch: refs/heads/master
Commit: 321ab9324c0ea9e9db4e15e39c5146d4bde0df3f
Parents: 4529963
Author: Claus Ibsen <davscl...@apache.org>
Authored: Fri Jun 27 16:13:16 2014 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Fri Jun 27 16:13:16 2014 +0200

----------------------------------------------------------------------
 .../camel/component/spark/CamelSparkRoute.java  |  10 +-
 .../component/spark/DefaultSparkBinding.java    | 123 +++++++++++++++++++
 .../camel/component/spark/SparkBinding.java     |  40 ++++++
 .../camel/component/spark/SparkComponent.java   |  31 ++++-
 .../component/spark/SparkConfiguration.java     |  55 +++++++++
 .../camel/component/spark/SparkConsumer.java    |   7 +-
 .../camel/component/spark/SparkEndpoint.java    |  30 +++++
 .../spark/SparkHeaderFilterStrategy.java        |  53 ++++++++
 .../camel/component/spark/SparkHelper.java      |  56 +++++++++
 .../camel/component/spark/SparkMessage.java     |  51 ++++++++
 .../component/spark/CamelSparkParamTest.java    |  46 +++++++
 11 files changed, 495 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSparkRoute.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSparkRoute.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSparkRoute.java
index 2550668..c418f88 100644
--- 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSparkRoute.java
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSparkRoute.java
@@ -18,6 +18,7 @@ package org.apache.camel.component.spark;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import spark.Request;
 import spark.Response;
@@ -35,16 +36,21 @@ public class CamelSparkRoute implements Route {
 
     @Override
     public Object handle(Request request, Response response) {
-
         Exchange exchange = endpoint.createExchange(ExchangePattern.InOut);
-        exchange.getIn().setBody(request);
 
         try {
+            Message in = endpoint.getSparkBinding().toCamelMessage(request, 
exchange, endpoint.getSparkConfiguration());
+            exchange.setIn(in);
+
             processor.process(exchange);
         } catch (Exception e) {
             exchange.setException(e);
         }
 
+        if (exchange.getException() != null) {
+            // TODO: how to handle exchange failures
+        }
+
         if (exchange.hasOut()) {
             return exchange.getOut().getBody();
         } else {

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/DefaultSparkBinding.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/DefaultSparkBinding.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/DefaultSparkBinding.java
new file mode 100644
index 0000000..4f1251a
--- /dev/null
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/DefaultSparkBinding.java
@@ -0,0 +1,123 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.spark;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.spi.HeaderFilterStrategy;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import spark.Request;
+
+public class DefaultSparkBinding implements SparkBinding {
+
+    private static final Logger LOG = 
LoggerFactory.getLogger(DefaultSparkBinding.class);
+    private HeaderFilterStrategy headerFilterStrategy = new 
SparkHeaderFilterStrategy();
+
+    @Override
+    public Message toCamelMessage(Request request, Exchange exchange, 
SparkConfiguration configuration) throws Exception {
+        LOG.trace("toCamelMessage: {}", request);
+
+        SparkMessage answer = new SparkMessage(request, null);
+        answer.setExchange(exchange);
+        if (configuration.isMapHeaders()) {
+            populateCamelHeaders(request, answer.getHeaders(), exchange, 
configuration);
+        }
+
+        if (configuration.isDisableStreamCache()) {
+            // keep the body as a input stream
+            answer.setBody(request.raw().getInputStream());
+        } else {
+            answer.setBody(request.body());
+        }
+        return answer;
+    }
+
+    @Override
+    public void populateCamelHeaders(Request request, Map<String, Object> 
headers, Exchange exchange, SparkConfiguration configuration) throws Exception {
+        // store the method and query and other info in headers as String types
+        headers.put(Exchange.HTTP_METHOD, request.raw().getMethod());
+        headers.put(Exchange.HTTP_QUERY, request.raw().getQueryString());
+        headers.put(Exchange.HTTP_URL, 
request.raw().getRequestURL().toString());
+        headers.put(Exchange.HTTP_URI, request.raw().getRequestURI());
+        headers.put(Exchange.HTTP_PATH, request.raw().getPathInfo());
+        headers.put(Exchange.CONTENT_TYPE, request.raw().getContentType());
+
+        for (String key : request.attributes()) {
+            Object value = request.attribute(key);
+            Object decoded = shouldUrlDecodeHeader(configuration, key, value, 
"UTF-8");
+            if (headerFilterStrategy != null
+                    && !headerFilterStrategy.applyFilterToExternalHeaders(key, 
decoded, exchange)) {
+                SparkHelper.appendHeader(headers, key, decoded);
+            }
+        }
+
+        for (String key : request.headers()) {
+            Object value = request.headers(key);
+            Object decoded = shouldUrlDecodeHeader(configuration, key, value, 
"UTF-8");
+            if (headerFilterStrategy != null
+                    && !headerFilterStrategy.applyFilterToExternalHeaders(key, 
decoded, exchange)) {
+                SparkHelper.appendHeader(headers, key, decoded);
+            }
+        }
+
+        for (Map.Entry<String, String> entry : request.params().entrySet()) {
+            String key = mapKey(entry.getKey());
+            String value = entry.getValue();
+            Object decoded = shouldUrlDecodeHeader(configuration, key, value, 
"UTF-8");
+            if (headerFilterStrategy != null
+                    && !headerFilterStrategy.applyFilterToExternalHeaders(key, 
decoded, exchange)) {
+                SparkHelper.appendHeader(headers, key, decoded);
+            }
+        }
+    }
+
+    /**
+     * Decodes the header if needed to, or returns the header value as is.
+     *
+     * @param configuration the configuration
+     * @param headerName    the header name
+     * @param value         the current header value
+     * @param charset       the charset to use for decoding
+     * @return the decoded value (if decoded was needed) or a 
<tt>toString</tt> representation of the value.
+     * @throws java.io.UnsupportedEncodingException is thrown if error 
decoding.
+     */
+    protected String shouldUrlDecodeHeader(SparkConfiguration configuration, 
String headerName, Object value, String charset) throws
+            UnsupportedEncodingException {
+        // do not decode Content-Type
+        if (Exchange.CONTENT_TYPE.equals(headerName)) {
+            return value.toString();
+        } else if (configuration.isUrlDecodeHeaders()) {
+            return URLDecoder.decode(value.toString(), charset);
+        } else {
+            return value.toString();
+        }
+    }
+
+    protected String mapKey(String key) {
+        if (key.startsWith(":")) {
+            return key.substring(1);
+        } else {
+            return key;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkBinding.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkBinding.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkBinding.java
new file mode 100644
index 0000000..61d8798
--- /dev/null
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkBinding.java
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.spark;
+
+import java.util.Map;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import spark.Request;
+
+public interface SparkBinding {
+
+    /**
+     * Binds from Spark {@link Request} to Camel {@link 
org.apache.camel.Message}.
+     *
+     * @param request       the netty http request
+     * @param exchange      the exchange that should contain the returned 
message.
+     * @param configuration configuration
+     * @return the message to store on the given exchange
+     * @throws Exception is thrown if error during binding
+     */
+    Message toCamelMessage(Request request, Exchange exchange, 
SparkConfiguration configuration) throws Exception;
+
+    void populateCamelHeaders(Request request, Map<String, Object> headers, 
Exchange exchange, SparkConfiguration configuration) throws Exception;
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkComponent.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkComponent.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkComponent.java
index db3b6b1..c2ff687 100644
--- 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkComponent.java
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkComponent.java
@@ -20,12 +20,15 @@ import java.util.Map;
 
 import org.apache.camel.Endpoint;
 import org.apache.camel.impl.UriEndpointComponent;
+import org.apache.camel.util.ObjectHelper;
 import spark.Spark;
 import spark.SparkBase;
 
 public class SparkComponent extends UriEndpointComponent {
 
     private int port = SparkBase.SPARK_DEFAULT_PORT;
+    private SparkConfiguration sparkConfiguration = new SparkConfiguration();
+    private SparkBinding sparkBinding = new DefaultSparkBinding();
 
     public SparkComponent() {
         super(SparkEndpoint.class);
@@ -39,18 +42,38 @@ public class SparkComponent extends UriEndpointComponent {
         this.port = port;
     }
 
+    public SparkConfiguration getSparkConfiguration() {
+        return sparkConfiguration;
+    }
+
+    public void setSparkConfiguration(SparkConfiguration sparkConfiguration) {
+        this.sparkConfiguration = sparkConfiguration;
+    }
+
+    public SparkBinding getSparkBinding() {
+        return sparkBinding;
+    }
+
+    public void setSparkBinding(SparkBinding sparkBinding) {
+        this.sparkBinding = sparkBinding;
+    }
+
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, 
Map<String, Object> parameters) throws Exception {
         SparkEndpoint answer = new SparkEndpoint(uri, this);
+        answer.setSparkConfiguration(getSparkConfiguration());
+        answer.setSparkBinding(getSparkBinding());
         setProperties(answer, parameters);
 
-        String[] parts = remaining.split(":");
-        if (parts.length != 2) {
+        if (!remaining.contains(":")) {
             throw new IllegalArgumentException("Invalid syntax. Must be 
spark:verb:path");
         }
 
-        answer.setVerb(parts[0]);
-        answer.setPath(parts[1]);
+        String verb = ObjectHelper.before(remaining, ":");
+        String path = ObjectHelper.after(remaining, ":");
+
+        answer.setVerb(verb);
+        answer.setPath(path);
 
         return answer;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConfiguration.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConfiguration.java
new file mode 100644
index 0000000..0c6d2b7
--- /dev/null
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConfiguration.java
@@ -0,0 +1,55 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.spark;
+
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+
+@UriParams
+public class SparkConfiguration {
+
+    @UriParam
+    private boolean mapHeaders = true;
+    @UriParam
+    private boolean disableStreamCache;
+    @UriParam
+    private boolean urlDecodeHeaders;
+
+    public boolean isMapHeaders() {
+        return mapHeaders;
+    }
+
+    public void setMapHeaders(boolean mapHeaders) {
+        this.mapHeaders = mapHeaders;
+    }
+
+    public boolean isDisableStreamCache() {
+        return disableStreamCache;
+    }
+
+    public void setDisableStreamCache(boolean disableStreamCache) {
+        this.disableStreamCache = disableStreamCache;
+    }
+
+    public boolean isUrlDecodeHeaders() {
+        return urlDecodeHeaders;
+    }
+
+    public void setUrlDecodeHeaders(boolean urlDecodeHeaders) {
+        this.urlDecodeHeaders = urlDecodeHeaders;
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConsumer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConsumer.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConsumer.java
index 5db1b40..8450636 100644
--- 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConsumer.java
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkConsumer.java
@@ -41,10 +41,15 @@ public class SparkConsumer extends DefaultConsumer {
 
         String path = getEndpoint().getPath();
         String verb = getEndpoint().getVerb();
+        String acceptType = getEndpoint().getAcceptType();
 
         if ("get".equals(verb)) {
             log.info("get(/{})", verb);
-            Spark.get(path, route);
+            if (acceptType != null) {
+                Spark.get(path, acceptType, route);
+            } else {
+                Spark.get(path, route);
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkEndpoint.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkEndpoint.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkEndpoint.java
index b46e647..05c9082 100644
--- 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkEndpoint.java
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkEndpoint.java
@@ -28,14 +28,36 @@ import org.apache.camel.spi.UriParam;
 public class SparkEndpoint extends DefaultEndpoint {
 
     @UriParam
+    SparkConfiguration sparkConfiguration;
+    @UriParam
+    private SparkBinding sparkBinding;
+    @UriParam
     private String verb;
     @UriParam
     private String path;
+    @UriParam
+    private String acceptType;
 
     public SparkEndpoint(String endpointUri, Component component) {
         super(endpointUri, component);
     }
 
+    public SparkConfiguration getSparkConfiguration() {
+        return sparkConfiguration;
+    }
+
+    public void setSparkConfiguration(SparkConfiguration sparkConfiguration) {
+        this.sparkConfiguration = sparkConfiguration;
+    }
+
+    public SparkBinding getSparkBinding() {
+        return sparkBinding;
+    }
+
+    public void setSparkBinding(SparkBinding sparkBinding) {
+        this.sparkBinding = sparkBinding;
+    }
+
     public String getVerb() {
         return verb;
     }
@@ -52,6 +74,14 @@ public class SparkEndpoint extends DefaultEndpoint {
         this.path = path;
     }
 
+    public String getAcceptType() {
+        return acceptType;
+    }
+
+    public void setAcceptType(String acceptType) {
+        this.acceptType = acceptType;
+    }
+
     @Override
     public Producer createProducer() throws Exception {
         throw new UnsupportedOperationException("Producer not supported");

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkHeaderFilterStrategy.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkHeaderFilterStrategy.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkHeaderFilterStrategy.java
new file mode 100644
index 0000000..33e0eb0
--- /dev/null
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkHeaderFilterStrategy.java
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.spark;
+
+import org.apache.camel.impl.DefaultHeaderFilterStrategy;
+
+/**
+ * Default Spark {@link org.apache.camel.spi.HeaderFilterStrategy} used when 
binding with {@link org.apache.camel.component.spark.SparkBinding}.
+ */
+public class SparkHeaderFilterStrategy extends DefaultHeaderFilterStrategy {
+
+    public SparkHeaderFilterStrategy() {
+        initialize();
+    }
+
+    protected void initialize() {
+        getOutFilter().add("content-length");
+        getOutFilter().add("content-type");
+        getOutFilter().add("host");
+        // Add the filter for the Generic Message header
+        // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.5
+        getOutFilter().add("cache-control");
+        getOutFilter().add("connection");
+        getOutFilter().add("date");
+        getOutFilter().add("pragma");
+        getOutFilter().add("trailer");
+        getOutFilter().add("transfer-encoding");
+        getOutFilter().add("upgrade");
+        getOutFilter().add("via");
+        getOutFilter().add("warning");
+
+        setLowerCase(true);
+
+        // filter headers begin with "Camel" or "org.apache.camel"
+        // must ignore case for Http based transports
+        
setOutFilterPattern("(?i)(Camel|org\\.apache\\.camel)[\\.|a-z|A-z|0-9]*");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkHelper.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkHelper.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkHelper.java
new file mode 100644
index 0000000..eda26b6
--- /dev/null
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkHelper.java
@@ -0,0 +1,56 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.spark;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public final class SparkHelper {
+
+    private SparkHelper() {
+    }
+
+    /**
+     * Appends the key/value to the headers.
+     * <p/>
+     * This implementation supports keys with multiple values. In such 
situations the value
+     * will be a {@link java.util.List} that contains the multiple values.
+     *
+     * @param headers  headers
+     * @param key      the key
+     * @param value    the value
+     */
+    @SuppressWarnings("unchecked")
+    public static void appendHeader(Map<String, Object> headers, String key, 
Object value) {
+        if (headers.containsKey(key)) {
+            Object existing = headers.get(key);
+            List<Object> list;
+            if (existing instanceof List) {
+                list = (List<Object>) existing;
+            } else {
+                list = new ArrayList<Object>();
+                list.add(existing);
+            }
+            list.add(value);
+            value = list;
+        }
+
+        headers.put(key, value);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkMessage.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkMessage.java
 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkMessage.java
new file mode 100644
index 0000000..0d02da3
--- /dev/null
+++ 
b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkMessage.java
@@ -0,0 +1,51 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.spark;
+
+import org.apache.camel.impl.DefaultMessage;
+import spark.Request;
+import spark.Response;
+
+/**
+ * Spark based {@link org.apache.camel.Message}.
+ * <p/>
+ * This implementation allows direct access to the Spark {@link Request} using
+ * the {@link #getRequest()} method.
+ */
+public class SparkMessage extends DefaultMessage {
+
+    private final transient Request request;
+    private final transient Response response;
+
+    public SparkMessage(Request request, Response response) {
+        this.request = request;
+        this.response = response;
+    }
+
+    public Request getRequest() {
+        return request;
+    }
+
+    public Response getResponse() {
+        return response;
+    }
+
+    @Override
+    public DefaultMessage newInstance() {
+        return new SparkMessage(request, response);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/321ab932/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkParamTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkParamTest.java
 
b/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkParamTest.java
new file mode 100644
index 0000000..ad40fb4
--- /dev/null
+++ 
b/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkParamTest.java
@@ -0,0 +1,46 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.spark;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.junit.Test;
+
+public class CamelSparkParamTest extends BaseSparkTest {
+
+    @Test
+    public void testSparkGet() throws Exception {
+        getMockEndpoint("mock:foo").expectedMessageCount(1);
+        getMockEndpoint("mock:foo").expectedHeaderReceived("name", "world");
+
+        String out = template.requestBody("http://0.0.0.0:"; + getPort() + 
"/hello/world", null, String.class);
+        assertEquals("Bye world", out);
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("spark:get:/hello/:name")
+                        .to("mock:foo")
+                        .transform().simple("Bye ${header.name}");
+            }
+        };
+    }
+}

Reply via email to