You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/03/14 15:55:42 UTC
camel git commit: CAMEL-9705: rest-dsl should detect duplicate
verb:uri paths and fail.
Repository: camel
Updated Branches:
refs/heads/master a012502d2 -> 8e5dbe513
CAMEL-9705: rest-dsl should detect duplicate verb:uri paths and fail.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/8e5dbe51
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/8e5dbe51
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/8e5dbe51
Branch: refs/heads/master
Commit: 8e5dbe5136766ff1f6aa497c41a4696b5ddefaf4
Parents: a012502
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Mar 14 15:44:38 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Mar 14 15:44:38 2016 +0100
----------------------------------------------------------------------
.../apache/camel/model/rest/RestDefinition.java | 18 +++++
.../component/rest/FromRestDuplicateTest.java | 80 ++++++++++++++++++++
.../rest/SpringFromRestDuplicateTest.java | 49 ++++++++++++
.../rest/SpringFromRestDuplicateTest.xml | 47 ++++++++++++
4 files changed, 194 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/8e5dbe51/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 ab8b746..cd815f4 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
@@ -19,8 +19,10 @@ package org.apache.camel.model.rest;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
@@ -547,6 +549,9 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
* REST DSL and turn those into regular Camel routes.
*/
public List<RouteDefinition> asRouteDefinition(CamelContext camelContext) {
+ // sanity check this rest definition do not have duplicates
+ validateUniquePaths();
+
List<RouteDefinition> answer = new ArrayList<RouteDefinition>();
if (camelContext.getRestConfigurations().isEmpty()) {
camelContext.getRestConfiguration();
@@ -557,6 +562,19 @@ public class RestDefinition extends OptionalIdentifiedDefinition<RestDefinition>
return answer;
}
+ protected void validateUniquePaths() {
+ Set<String> paths = new HashSet<String>();
+ for (VerbDefinition verb : verbs) {
+ String path = verb.asVerb();
+ if (verb.getUri() != null) {
+ path += ":" + verb.getUri();
+ }
+ if (!paths.add(path)) {
+ throw new IllegalArgumentException("Duplicate verb detected in rest-dsl: " + path);
+ }
+ }
+ }
+
/**
* Transforms the rest api configuration into a {@link org.apache.camel.model.RouteDefinition} which
* Camel routing engine uses to service the rest api docs.
http://git-wip-us.apache.org/repos/asf/camel/blob/8e5dbe51/camel-core/src/test/java/org/apache/camel/component/rest/FromRestDuplicateTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/component/rest/FromRestDuplicateTest.java b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestDuplicateTest.java
new file mode 100644
index 0000000..d9f22cf
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/component/rest/FromRestDuplicateTest.java
@@ -0,0 +1,80 @@
+/**
+ * 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.rest;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+
+public class FromRestDuplicateTest extends ContextTestSupport {
+
+ @Override
+ public boolean isUseRouteBuilder() {
+ return false;
+ }
+
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ JndiRegistry jndi = super.createRegistry();
+ jndi.bind("dummy-rest", new DummyRestConsumerFactory());
+ return jndi;
+ }
+
+ public void testDuplicateGet() throws Exception {
+ try {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ restConfiguration().host("localhost");
+
+ rest("/users")
+ .get("{id}").to("log:foo")
+ .post().to("log:foo")
+ .get("").to("log:foo")
+ .get("{id}").to("log:foo");
+
+ }
+ });
+ fail("Should throw exception");
+ } catch (IllegalArgumentException e) {
+ assertEquals("Duplicate verb detected in rest-dsl: get:{id}", e.getMessage());
+ }
+ }
+
+ public void testDuplicatePost() throws Exception {
+ try {
+ context.addRoutes(new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ restConfiguration().host("localhost");
+
+ rest("/users")
+ .get("{id}").to("log:foo")
+ .post().to("log:foo")
+ .get("").to("log:foo")
+ .put().to("log:foo")
+ .post().to("log:foo");
+
+ }
+ });
+ fail("Should throw exception");
+ } catch (IllegalArgumentException e) {
+ assertEquals("Duplicate verb detected in rest-dsl: post", e.getMessage());
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/8e5dbe51/components/camel-spring/src/test/java/org/apache/camel/component/rest/SpringFromRestDuplicateTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/component/rest/SpringFromRestDuplicateTest.java b/components/camel-spring/src/test/java/org/apache/camel/component/rest/SpringFromRestDuplicateTest.java
new file mode 100644
index 0000000..fc6b70b
--- /dev/null
+++ b/components/camel-spring/src/test/java/org/apache/camel/component/rest/SpringFromRestDuplicateTest.java
@@ -0,0 +1,49 @@
+/**
+ * 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.rest;
+
+import org.apache.camel.spring.SpringTestSupport;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * @version
+ */
+public class SpringFromRestDuplicateTest extends SpringTestSupport {
+
+ @Override
+ protected AbstractXmlApplicationContext createApplicationContext() {
+ try {
+ new ClassPathXmlApplicationContext("org/apache/camel/component/rest/SpringFromRestDuplicateTest.xml");
+ fail("Should throw exception");
+ } catch (Exception e) {
+ IllegalArgumentException iae = assertIsInstanceOf(IllegalArgumentException.class, e.getCause());
+ assertEquals("Duplicate verb detected in rest-dsl: get:{id}", iae.getMessage());
+ }
+ return null;
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ // must override as there is no valid spring xml file
+ createApplicationContext();
+ }
+
+ public void testDuplicate() throws Exception {
+ // noop
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/8e5dbe51/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestDuplicateTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestDuplicateTest.xml b/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestDuplicateTest.xml
new file mode 100644
index 0000000..3893464
--- /dev/null
+++ b/components/camel-spring/src/test/resources/org/apache/camel/component/rest/SpringFromRestDuplicateTest.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+ ">
+
+ <!-- use a dummy rest consumer factory for the rest engine -->
+ <bean id="dummy-rest" class="org.apache.camel.component.rest.DummyRestConsumerFactory"/>
+
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+
+ <rest path="/users">
+ <get uri="{id}">
+ <to uri="log:foo"/>
+ </get>
+ <post>
+ <to uri="log:foo"/>
+ </post>
+ <get>
+ <to uri="log:foo"/>
+ </get>
+ <get uri="{id}">
+ <to uri="log:foo"/>
+ </get>
+ </rest>
+
+ </camelContext>
+
+</beans>