You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ni...@apache.org on 2012/08/08 05:16:32 UTC

svn commit: r1370653 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/component/directvm/ test/java/org/apache/camel/component/directvm/

Author: ningjiang
Date: Wed Aug  8 03:16:32 2012
New Revision: 1370653

URL: http://svn.apache.org/viewvc?rev=1370653&view=rev
Log:
CAMEL-5489 Support for selection of direct-vm consumers

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumerExpression.java
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmConsumerExpressionTest.java
Modified:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java

Modified: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java?rev=1370653&r1=1370652&r2=1370653&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmComponent.java Wed Aug  8 03:16:32 2012
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.component.directvm;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -37,6 +39,19 @@ public class DirectVmComponent extends D
     // on DefaultCamelContext
     private static final ConcurrentMap<String, DirectVmConsumer> CONSUMERS = new ConcurrentHashMap<String, DirectVmConsumer>();
 
+    /**
+     * Gets all the consumer endpoints.
+     *
+     * @return consumer endpoints
+     */
+    public static Collection<Endpoint> getConsumerEndpoints() {
+        Collection<Endpoint> endpoints = new ArrayList<Endpoint>(CONSUMERS.size());
+        for (DirectVmConsumer consumer : CONSUMERS.values()) {
+            endpoints.add(consumer.getEndpoint());
+        }
+        return endpoints;
+    }
+
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
         DirectVmEndpoint answer = new DirectVmEndpoint(uri, this);

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumerExpression.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumerExpression.java?rev=1370653&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumerExpression.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumerExpression.java Wed Aug  8 03:16:32 2012
@@ -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.directvm;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.support.ExpressionAdapter;
+import org.apache.camel.util.AntPathMatcher;
+
+/**
+ * The expression to select direct-vm consumers based on ant-like path pattern matching.
+ */
+public class DirectVmConsumerExpression extends ExpressionAdapter {
+
+    private final AntPathMatcher matcher;
+    private final String pattern;
+
+    public DirectVmConsumerExpression(String pattern) {
+        this.matcher = new AntPathMatcher();
+        this.pattern = pattern;
+    }
+
+    @Override
+    public Object evaluate(Exchange exchange) {
+        Collection<Endpoint> endpoints = new ArrayList<Endpoint>();
+        for (Endpoint endpoint : DirectVmComponent.getConsumerEndpoints()) {
+            if (matcher.match(pattern, endpoint.getEndpointKey())) {
+                endpoints.add(endpoint);
+            }
+        }
+        return endpoints;
+    }
+
+    @Override
+    public String toString() {
+        return "DirectVmConsumerExpression[" + pattern + "]";
+    }
+}

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmConsumerExpressionTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmConsumerExpressionTest.java?rev=1370653&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmConsumerExpressionTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/directvm/DirectVmConsumerExpressionTest.java Wed Aug  8 03:16:32 2012
@@ -0,0 +1,110 @@
+/**
+ * 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.directvm;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.util.ServiceHelper;
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ *
+ */
+public class DirectVmConsumerExpressionTest extends ContextTestSupport {
+
+    private CamelContext context2;
+    private CamelContext context3;
+
+    @Override
+    @Before
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        context2 = new DefaultCamelContext();
+        context3 = new DefaultCamelContext();
+
+        ServiceHelper.startServices(context2);
+        ServiceHelper.startServices(context3);
+
+        // add routes after CamelContext has been started
+        RouteBuilder routeBuilder = createRouteBuilderCamelContext2();
+        if (routeBuilder != null) {
+            context2.addRoutes(routeBuilder);
+        }
+
+        routeBuilder = createRouteBuilderCamelContext3();
+        if (routeBuilder != null) {
+            context3.addRoutes(routeBuilder);
+        }
+    }
+
+    @Override
+    @After
+    protected void tearDown() throws Exception {
+        ServiceHelper.stopServices(context2, context3);
+        super.tearDown();
+    }
+
+    public void testSelectEndpoint() throws Exception {
+        MockEndpoint result2 = context2.getEndpoint("mock:result2", MockEndpoint.class);
+        result2.expectedBodiesReceived("Hello World");
+
+        MockEndpoint result3 = context3.getEndpoint("mock:result3", MockEndpoint.class);
+        result3.expectedBodiesReceived("Hello World");
+
+        template.sendBody("direct:start", "Hello World");
+
+        MockEndpoint.assertIsSatisfied(context2);
+        MockEndpoint.assertIsSatisfied(context3);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .recipientList(new DirectVmConsumerExpression("direct-vm://parent/**/context*"));
+            }
+        };
+    }
+
+    private RouteBuilder createRouteBuilderCamelContext2() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct-vm:parent/child/context2")
+                    .to("mock:result2");
+            }
+        };
+    }
+
+    private RouteBuilder createRouteBuilderCamelContext3() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct-vm:parent/child/grandchild/context3")
+                    .to("mock:result3");
+            }
+        };
+    }
+
+}