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/6f83cbeb Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6f83cbeb Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6f83cbeb Branch: refs/heads/master Commit: 6f83cbebda4c1054366e32eb1dd95262ae439b6f Parents: f994a4e Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Jun 27 18:22:55 2014 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Jun 27 18:25:30 2014 +0200 ---------------------------------------------------------------------- .../camel/component/spark/CamelSpark.java | 84 ++++++++++++++++++ .../camel/component/spark/SparkConsumer.java | 17 ++-- .../camel/component/spark/SparkEndpoint.java | 14 ++- .../component/spark/SparkRouteBuilder.java | 91 ++++++++++++++++++++ .../spark/CamelSparkRouteBuilderPostTest.java | 45 ++++++++++ .../spark/CamelSparkRouteBuilderTest.java | 45 ++++++++++ 6 files changed, 284 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/6f83cbeb/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSpark.java ---------------------------------------------------------------------- diff --git a/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSpark.java b/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSpark.java new file mode 100644 index 0000000..860ac5a --- /dev/null +++ b/components/camel-spark/src/main/java/org/apache/camel/component/spark/CamelSpark.java @@ -0,0 +1,84 @@ +/** + * 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 spark.Route; +import spark.Spark; + +public final class CamelSpark { + + private CamelSpark() { + } + + public static void spark(String verb, String path, String accept, Route route) { + if ("get".equals(verb)) { + if (accept != null) { + Spark.get(path, accept, route); + } else { + Spark.get(path, route); + } + } else if ("post".equals(verb)) { + if (accept != null) { + Spark.post(path, accept, route); + } else { + Spark.post(path, route); + } + } else if ("put".equals(verb)) { + if (accept != null) { + Spark.put(path, accept, route); + } else { + Spark.put(path, route); + } + } else if ("patch".equals(verb)) { + if (accept != null) { + Spark.patch(path, accept, route); + } else { + Spark.patch(path, route); + } + } else if ("delete".equals(verb)) { + if (accept != null) { + Spark.delete(path, accept, route); + } else { + Spark.delete(path, route); + } + } else if ("head".equals(verb)) { + if (accept != null) { + Spark.head(path, accept, route); + } else { + Spark.head(path, route); + } + } else if ("trace".equals(verb)) { + if (accept != null) { + Spark.trace(path, accept, route); + } else { + Spark.trace(path, route); + } + } else if ("connect".equals(verb)) { + if (accept != null) { + Spark.connect(path, accept, route); + } else { + Spark.connect(path, route); + } + } else if ("options".equals(verb)) { + if (accept != null) { + Spark.options(path, accept, route); + } else { + Spark.options(path, route); + } + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/6f83cbeb/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 16d350d..58390f0 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 @@ -19,7 +19,6 @@ package org.apache.camel.component.spark; import org.apache.camel.Endpoint; import org.apache.camel.Processor; import org.apache.camel.impl.DefaultConsumer; -import spark.Spark; public class SparkConsumer extends DefaultConsumer { @@ -39,20 +38,16 @@ public class SparkConsumer extends DefaultConsumer { protected void doStart() throws Exception { super.doStart(); - String path = getEndpoint().getPath(); String verb = getEndpoint().getVerb(); + String path = getEndpoint().getPath(); String accept = getEndpoint().getAccept(); - // TODO: reuse our spark route builder DSL instead of this code - - if ("get".equals(verb)) { - log.info("get(/{})", verb); - if (accept != null) { - Spark.get(path, accept, route); - } else { - Spark.get(path, route); - } + if (accept != null) { + log.info("Spark: {}({}) accepting: {}", new Object[]{verb, path, accept}); + } else { + log.info("Spark: {}({})", verb, path); } + CamelSpark.spark(verb, path, accept, route); } } http://git-wip-us.apache.org/repos/asf/camel/blob/6f83cbeb/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 9d291ca..db88544 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 @@ -23,6 +23,8 @@ import org.apache.camel.Producer; import org.apache.camel.impl.DefaultEndpoint; import org.apache.camel.spi.UriEndpoint; import org.apache.camel.spi.UriParam; +import org.apache.camel.util.ObjectHelper; +import spark.route.HttpMethod; @UriEndpoint(scheme = "spark", consumerClass = SparkConsumer.class) public class SparkEndpoint extends DefaultEndpoint { @@ -90,7 +92,6 @@ public class SparkEndpoint extends DefaultEndpoint { @Override public Consumer createConsumer(Processor processor) throws Exception { CamelSparkRoute route = new CamelSparkRoute(this, processor); - Consumer consumer = new SparkConsumer(this, processor, route); configureConsumer(consumer); return consumer; @@ -100,4 +101,15 @@ public class SparkEndpoint extends DefaultEndpoint { public boolean isSingleton() { return true; } + + @Override + protected void doStart() throws Exception { + super.doStart(); + + ObjectHelper.notEmpty(verb, "verb", this); + ObjectHelper.notEmpty(path, "path", this); + + // verb must be supported by Spark + HttpMethod.valueOf(verb); + } } http://git-wip-us.apache.org/repos/asf/camel/blob/6f83cbeb/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkRouteBuilder.java ---------------------------------------------------------------------- diff --git a/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkRouteBuilder.java b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkRouteBuilder.java new file mode 100644 index 0000000..c00b276 --- /dev/null +++ b/components/camel-spark/src/main/java/org/apache/camel/component/spark/SparkRouteBuilder.java @@ -0,0 +1,91 @@ +/** + * 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.apache.camel.model.RouteDefinition; + +/** + * A Spark extended {@link org.apache.camel.builder.RouteBuilder} which allows to define routes using the Spark DSL. + */ +public abstract class SparkRouteBuilder extends RouteBuilder { + + public RouteDefinition get(String path) { + return from("spark:get:" + path); + } + + public RouteDefinition get(String path, String accept) { + return from("spark:get:" + path + "?accept=" + accept); + } + + public RouteDefinition post(String path) { + return from("spark:post:" + path); + } + + public RouteDefinition post(String path, String accept) { + return from("spark:post:" + path + "?accept=" + accept); + } + + public RouteDefinition put(String path) { + return from("spark:post:" + path); + } + + public RouteDefinition put(String path, String accept) { + return from("spark:post:" + path + "?accept=" + accept); + } + + public RouteDefinition delete(String path) { + return from("spark:delete:" + path); + } + + public RouteDefinition delete(String path, String accept) { + return from("spark:delete:" + path + "?accept=" + accept); + } + + public RouteDefinition head(String path) { + return from("spark:head:" + path); + } + + public RouteDefinition head(String path, String accept) { + return from("spark:head:" + path + "?accept=" + accept); + } + + public RouteDefinition trace(String path) { + return from("spark:trace:" + path); + } + + public RouteDefinition trace(String path, String accept) { + return from("spark:trace:" + path + "?accept=" + accept); + } + + public RouteDefinition connect(String path) { + return from("spark:connect:" + path); + } + + public RouteDefinition connect(String path, String accept) { + return from("spark:connect:" + path + "?accept=" + accept); + } + + public RouteDefinition options(String path) { + return from("spark:options:" + path); + } + + public RouteDefinition options(String path, String accept) { + return from("spark:options:" + path + "?accept=" + accept); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/6f83cbeb/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkRouteBuilderPostTest.java ---------------------------------------------------------------------- diff --git a/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkRouteBuilderPostTest.java b/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkRouteBuilderPostTest.java new file mode 100644 index 0000000..b455e1c --- /dev/null +++ b/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkRouteBuilderPostTest.java @@ -0,0 +1,45 @@ +/** + * 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 CamelSparkRouteBuilderPostTest extends BaseSparkTest { + + @Test + public void testSparkPost() throws Exception { + getMockEndpoint("mock:foo").expectedMessageCount(1); + + String out = template.requestBody("http://0.0.0.0:" + getPort() + "/hello", "I was here", String.class); + assertEquals("Bye I was here", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new SparkRouteBuilder() { + @Override + public void configure() throws Exception { + post("hello") + .to("mock:foo") + .transform().simple("Bye ${body}"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/6f83cbeb/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkRouteBuilderTest.java ---------------------------------------------------------------------- diff --git a/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkRouteBuilderTest.java b/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkRouteBuilderTest.java new file mode 100644 index 0000000..e670b062 --- /dev/null +++ b/components/camel-spark/src/test/java/org/apache/camel/component/spark/CamelSparkRouteBuilderTest.java @@ -0,0 +1,45 @@ +/** + * 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 CamelSparkRouteBuilderTest extends BaseSparkTest { + + @Test + public void testSparkGet() throws Exception { + getMockEndpoint("mock:foo").expectedMessageCount(1); + + String out = template.requestBody("http://0.0.0.0:" + getPort() + "/hello", null, String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new SparkRouteBuilder() { + @Override + public void configure() throws Exception { + get("hello") + .to("mock:foo") + .transform().constant("Bye World"); + } + }; + } +}