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 2012/11/01 16:42:40 UTC

svn commit: r1404647 - in /camel/trunk/camel-core/src: main/java/org/apache/camel/component/controlbus/ main/resources/META-INF/services/org/apache/camel/component/ test/java/org/apache/camel/component/controlbus/

Author: davsclaus
Date: Thu Nov  1 15:42:39 2012
New Revision: 1404647

URL: http://svn.apache.org/viewvc?rev=1404647&view=rev
Log:
CAMEL-5651: Initial spike of control bus EIP / component.

Added:
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java   (with props)
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java   (with props)
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java   (with props)
    camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/package.html
      - copied, changed from r1404502, camel/trunk/camel-core/src/main/java/org/apache/camel/component/binding/package.html
    camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/controlbus
      - copied, changed from r1404498, camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/binding
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusLanguageSimpleStartRouteTest.java   (with props)
    camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusStartRouteTest.java   (with props)

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java?rev=1404647&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java Thu Nov  1 15:42:39 2012
@@ -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.controlbus;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+
+/**
+ * The <a href="http://camel.apache.org/controlbus.html">control bus</a> component.
+ */
+public class ControlBusComponent extends DefaultComponent {
+
+    // TODO: allow to use a thread pool for tasks so you dont have to wait
+    // TODO: management command, to use the JMX mbeans easier
+    // TODO: Bulk status in POJO / JSON format
+    // TODO: a header with the action to do instead of uri, as we may want to be lenient
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        ControlBusEndpoint answer = new ControlBusEndpoint(uri, this);
+
+        // does the control bus use a language
+        if (remaining != null && remaining.startsWith("language:")) {
+            String lan = remaining.substring(9);
+            if (lan != null) {
+                answer.setLanguage(getCamelContext().resolveLanguage(lan));
+            } else {
+                throw new IllegalArgumentException("Language must be configured in endpoint uri: " + uri);
+            }
+        }
+
+        setProperties(answer, parameters);
+        return answer;
+    }
+}

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusComponent.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java?rev=1404647&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java Thu Nov  1 15:42:39 2012
@@ -0,0 +1,79 @@
+/**
+ * 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.controlbus;
+
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.impl.DefaultEndpoint;
+import org.apache.camel.spi.Language;
+
+/**
+ * The control bus endpoint.
+ */
+public class ControlBusEndpoint extends DefaultEndpoint {
+
+    private Language language;
+    private String routeId;
+    private String action;
+
+    public ControlBusEndpoint(String endpointUri, Component component) {
+        super(endpointUri, component);
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new ControlBusProducer(this);
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new RuntimeCamelException("Cannot consume from a ControlBusEndpoint: " + getEndpointUri());
+    }
+
+    @Override
+    public boolean isSingleton() {
+        // we dont want to be enlisted in JMX, so lets just be non-singleton
+        return false;
+    }
+
+    public Language getLanguage() {
+        return language;
+    }
+
+    public void setLanguage(Language language) {
+        this.language = language;
+    }
+
+    public String getRouteId() {
+        return routeId;
+    }
+
+    public void setRouteId(String routeId) {
+        this.routeId = routeId;
+    }
+
+    public String getAction() {
+        return action;
+    }
+
+    public void setAction(String action) {
+        this.action = action;
+    }
+}

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusEndpoint.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java?rev=1404647&view=auto
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java (added)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java Thu Nov  1 15:42:39 2012
@@ -0,0 +1,89 @@
+/**
+ * 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.controlbus;
+
+import org.apache.camel.AsyncCallback;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Expression;
+import org.apache.camel.ServiceStatus;
+import org.apache.camel.impl.DefaultAsyncProducer;
+import org.apache.camel.spi.Language;
+import org.apache.camel.util.ExchangeHelper;
+
+/**
+ * The control bus producer.
+ */
+public class ControlBusProducer extends DefaultAsyncProducer {
+
+    public ControlBusProducer(Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public ControlBusEndpoint getEndpoint() {
+        return (ControlBusEndpoint) super.getEndpoint();
+    }
+
+    @Override
+    public boolean process(Exchange exchange, AsyncCallback callback) {
+        if (getEndpoint().getLanguage() != null) {
+            try {
+                processByLanguage(exchange, getEndpoint().getLanguage());
+            } catch (Exception e) {
+                exchange.setException(e);
+            }
+        } else if (getEndpoint().getAction() != null) {
+            try {
+                processByAction(exchange, getEndpoint().getRouteId(), getEndpoint().getAction());
+            } catch (Exception e) {
+                exchange.setException(e);
+            }
+        }
+
+        callback.done(true);
+        return true;
+    }
+
+    protected void processByLanguage(Exchange exchange, Language language) throws Exception {
+        // create dummy exchange
+        Exchange dummy = ExchangeHelper.createCopy(exchange, true);
+
+        String body = dummy.getIn().getMandatoryBody(String.class);
+        if (body != null) {
+            Expression exp = language.createExpression(body);
+            Object out = exp.evaluate(dummy, Object.class);
+            if (out != null) {
+                exchange.getIn().setBody(out);
+            }
+        }
+    }
+
+    protected void processByAction(Exchange exchange, String id, String action) throws Exception {
+        if ("start".equals(action)) {
+            getEndpoint().getCamelContext().startRoute(id);
+        } else if ("stop".equals(action)) {
+            getEndpoint().getCamelContext().stopRoute(id);
+        } else if ("status".equals(action)) {
+            ServiceStatus status = getEndpoint().getCamelContext().getRouteStatus(id);
+            if (status != null) {
+                exchange.getIn().setBody(status.name());
+            }
+        }
+    }
+
+}

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/ControlBusProducer.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Copied: camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/package.html (from r1404502, camel/trunk/camel-core/src/main/java/org/apache/camel/component/binding/package.html)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/package.html?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/package.html&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/component/binding/package.html&r1=1404502&r2=1404647&rev=1404647&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/java/org/apache/camel/component/binding/package.html (original)
+++ camel/trunk/camel-core/src/main/java/org/apache/camel/component/controlbus/package.html Thu Nov  1 15:42:39 2012
@@ -19,8 +19,8 @@
 </head>
 <body>
 
-The <a href="http://camel.apache.org/binding.html">Binding Component</a> which is
-a way of wrapping an Endpoint in a contract; such as a Data Format, a Content Enricher or validation step.
+The <a href="http://camel.apache.org/controlbus.html">Control Bus Component</a> which
+allows to manage Camel at runtime.
 
 </body>
 </html>

Copied: camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/controlbus (from r1404498, camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/binding)
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/controlbus?p2=camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/controlbus&p1=camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/binding&r1=1404498&r2=1404647&rev=1404647&view=diff
==============================================================================
--- camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/binding (original)
+++ camel/trunk/camel-core/src/main/resources/META-INF/services/org/apache/camel/component/controlbus Thu Nov  1 15:42:39 2012
@@ -15,4 +15,4 @@
 # limitations under the License.
 #
 
-class=org.apache.camel.component.binding.BindingNameComponent
\ No newline at end of file
+class=org.apache.camel.component.controlbus.ControlBusComponent
\ No newline at end of file

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusLanguageSimpleStartRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusLanguageSimpleStartRouteTest.java?rev=1404647&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusLanguageSimpleStartRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusLanguageSimpleStartRouteTest.java Thu Nov  1 15:42:39 2012
@@ -0,0 +1,67 @@
+/**
+ * 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.controlbus;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ *
+ */
+public class ControlBusLanguageSimpleStartRouteTest extends ContextTestSupport {
+
+    public void testControlBusStartStop() throws Exception {
+        assertEquals("Stopped", context.getRouteStatus("foo").name());
+
+        // store a pending message
+        getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
+        template.sendBody("seda:foo", "Hello World");
+
+        // start the route using control bus
+        template.sendBody("controlbus:language:simple", "camelContext.startRoute('foo')");
+
+        assertMockEndpointsSatisfied();
+
+        // now stop the route, using a header
+        template.sendBodyAndHeader("controlbus:language:simple", "camelContext.stopRoute(header.me)", "me", "foo");
+
+        assertEquals("Stopped", context.getRouteStatus("foo").name());
+    }
+
+    public void testControlBusStatus() throws Exception {
+        assertEquals("Stopped", context.getRouteStatus("foo").name());
+
+        String status = template.requestBody("controlbus:language:simple", "camelContext.getRouteStatus('foo')", String.class);
+        assertEquals("Stopped", status);
+
+        context.startRoute("foo");
+
+        status = template.requestBody("controlbus:language:simple", "camelContext.getRouteStatus('foo')", String.class);
+        assertEquals("Started", status);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:foo").routeId("foo").noAutoStartup()
+                    .to("mock:foo");
+            }
+        };
+    }
+}

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusLanguageSimpleStartRouteTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusLanguageSimpleStartRouteTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusStartRouteTest.java
URL: http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusStartRouteTest.java?rev=1404647&view=auto
==============================================================================
--- camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusStartRouteTest.java (added)
+++ camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusStartRouteTest.java Thu Nov  1 15:42:39 2012
@@ -0,0 +1,67 @@
+/**
+ * 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.controlbus;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+/**
+ *
+ */
+public class ControlBusStartRouteTest extends ContextTestSupport {
+
+    public void testControlBusStartStop() throws Exception {
+        assertEquals("Stopped", context.getRouteStatus("foo").name());
+
+        // store a pending message
+        getMockEndpoint("mock:foo").expectedBodiesReceived("Hello World");
+        template.sendBody("seda:foo", "Hello World");
+
+        // start the route using control bus
+        template.sendBody("controlbus:route?routeId=foo&action=start", null);
+
+        assertMockEndpointsSatisfied();
+
+        // now stop the route, using a header
+        template.sendBody("controlbus:route?routeId=foo&action=stop", null);
+
+        assertEquals("Stopped", context.getRouteStatus("foo").name());
+    }
+
+    public void testControlBusStatus() throws Exception {
+        assertEquals("Stopped", context.getRouteStatus("foo").name());
+
+        String status = template.requestBody("controlbus:route?routeId=foo&action=status", null, String.class);
+        assertEquals("Stopped", status);
+
+        context.startRoute("foo");
+
+        status = template.requestBody("controlbus:route?routeId=foo&action=status", null, String.class);
+        assertEquals("Started", status);
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:foo").routeId("foo").noAutoStartup()
+                    .to("mock:foo");
+            }
+        };
+    }
+}

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusStartRouteTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: camel/trunk/camel-core/src/test/java/org/apache/camel/component/controlbus/ControlBusStartRouteTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date