You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/03/23 14:29:27 UTC

camel git commit: CAMEL-10337: camel-asterix - Endpoint should be singleton

Repository: camel
Updated Branches:
  refs/heads/master 64c57a8db -> d032095f7


CAMEL-10337: camel-asterix - Endpoint should be singleton


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

Branch: refs/heads/master
Commit: d032095f79f947f115bcbff19a53c948d10c46a5
Parents: 64c57a8
Author: lburgazzoli <lb...@gmail.com>
Authored: Fri Mar 17 14:38:21 2017 +0100
Committer: lburgazzoli <lb...@gmail.com>
Committed: Thu Mar 23 15:29:11 2017 +0100

----------------------------------------------------------------------
 .../component/asterisk/AsteriskAction.java      | 49 ++++++++++++
 .../component/asterisk/AsteriskActionEnum.java  | 21 -----
 .../component/asterisk/AsteriskComponent.java   |  7 +-
 .../component/asterisk/AsteriskConnection.java  | 31 +++++---
 .../component/asterisk/AsteriskConstants.java   |  3 +-
 .../component/asterisk/AsteriskConsumer.java    | 41 ++++++++--
 .../component/asterisk/AsteriskEndpoint.java    | 81 +++++---------------
 .../asterisk/AsteriskListenerTask.java          | 43 -----------
 .../component/asterisk/AsteriskProducer.java    | 47 ++++++------
 .../asterisk/CamelAsteriskException.java        |  6 --
 .../asterisk/AsteriskProducerTest.java          |  2 +-
 11 files changed, 154 insertions(+), 177 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskAction.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskAction.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskAction.java
new file mode 100644
index 0000000..2f83b44
--- /dev/null
+++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskAction.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.asterisk;
+
+import java.util.function.Function;
+
+import org.apache.camel.Exchange;
+import org.asteriskjava.manager.action.ExtensionStateAction;
+import org.asteriskjava.manager.action.ManagerAction;
+import org.asteriskjava.manager.action.QueueStatusAction;
+import org.asteriskjava.manager.action.SipPeersAction;
+
+public enum AsteriskAction implements Function<Exchange, ManagerAction> {
+    QUEUE_STATUS {
+        @Override
+        public ManagerAction apply(Exchange exchange) {
+            return new QueueStatusAction();
+        }
+    },
+    SIP_PEERS {
+        @Override
+        public ManagerAction apply(Exchange exchange) {
+            return new SipPeersAction();
+        }
+    },
+    EXTENSION_STATE {
+        @Override
+        public ManagerAction apply(Exchange exchange) {
+            return new ExtensionStateAction(
+                exchange.getIn().getHeader(AsteriskConstants.EXTENSION, String.class),
+                exchange.getIn().getHeader(AsteriskConstants.CONTEXT, String.class)
+            );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskActionEnum.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskActionEnum.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskActionEnum.java
deleted file mode 100644
index da1c0fd..0000000
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskActionEnum.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * 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.asterisk;
-
-public enum AsteriskActionEnum {
-    QUEUE_STATUS, SIP_PEERS, EXTENSION_STATE;
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskComponent.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskComponent.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskComponent.java
index 32b7aa1..97e5691 100644
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskComponent.java
+++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskComponent.java
@@ -20,19 +20,18 @@ import java.util.Map;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
-import org.apache.camel.impl.UriEndpointComponent;
+import org.apache.camel.impl.DefaultComponent;
 
 /**
  * Represents the component that manages {@link AsteriskEndpoint}.
  */
-public class AsteriskComponent extends UriEndpointComponent {
+public class AsteriskComponent extends DefaultComponent {
 
     public AsteriskComponent() {
-        super(AsteriskEndpoint.class);
     }
 
     public AsteriskComponent(CamelContext context) {
-        super(context, AsteriskEndpoint.class);
+        super(context);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConnection.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConnection.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConnection.java
index 468d7e8..75ba26c 100644
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConnection.java
+++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConnection.java
@@ -29,35 +29,35 @@ import org.asteriskjava.manager.response.ManagerResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AsteriskConnection {
+public final class AsteriskConnection {
     private static final Logger LOG = LoggerFactory.getLogger(AsteriskConnection.class);
 
-    private String host;
-    private String username;
-    private String password;
-
+    private final String host;
+    private final String username;
+    private final String password;
     private ManagerConnection managerConnection;
 
     public AsteriskConnection(String host, String username, String password) {
         this.host = host;
         this.username = username;
         this.password = password;
-
-        this.connect();
     }
 
-    private void connect() {
+    public void connect() {
         if (managerConnection == null) {
             LOG.debug("asterisk connection attempt to {} username: {}", host, username);
 
             ManagerConnectionFactory factory = new ManagerConnectionFactory(host, username, password);
             managerConnection = factory.createManagerConnection();
-            
+
             LOG.debug("asterisk connection established!");
         }
     }
-    
+
     public void login() throws IllegalStateException, IOException, AuthenticationFailedException, TimeoutException, CamelAsteriskException {
+        // Lazy connect if not done before
+        connect();
+
         if (managerConnection != null && (managerConnection.getState() == ManagerConnectionState.DISCONNECTED || managerConnection.getState() == ManagerConnectionState.INITIAL)) {
             managerConnection.login("on");
         
@@ -87,10 +87,19 @@ public class AsteriskConnection {
         }
     }
 
+    public void removeListener(ManagerEventListener listener) throws CamelAsteriskException {
+        if (managerConnection != null) {
+            managerConnection.removeEventListener(listener);
+
+            LOG.debug("asterisk removed listener {}", listener);
+        } else {
+            throw new CamelAsteriskException("Add listener operation, managerConnection is empty!");
+        }
+    }
+
     public ManagerResponse sendAction(ManagerAction action) throws IllegalArgumentException, IllegalStateException, IOException, TimeoutException {
         ManagerResponse response = managerConnection.sendAction(action);
 
         return response;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConstants.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConstants.java
index f49a00b..ff505f7 100644
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConstants.java
+++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConstants.java
@@ -17,12 +17,11 @@
 package org.apache.camel.component.asterisk;
 
 public final class AsteriskConstants {
-
     public static final String EVENT_NAME = "CamelAsteriskEventName";
     public static final String EXTENSION = "CamelAsteriskExtension";
     public static final String CONTEXT = "CamelAsteriskContext";
+    public static final String ACTION = "CamelAsteriskAction";
 
     private AsteriskConstants() {
     }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConsumer.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConsumer.java
index 3d3a9cd..89d94a2 100644
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConsumer.java
+++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskConsumer.java
@@ -16,34 +16,61 @@
  */
 package org.apache.camel.component.asterisk;
 
+import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.impl.DefaultConsumer;
+import org.asteriskjava.manager.ManagerEventListener;
+import org.asteriskjava.manager.event.ManagerEvent;
 
 /**
  * The Asterisk consumer.
  */
 public class AsteriskConsumer extends DefaultConsumer {
     private final AsteriskEndpoint endpoint;
-    private final AsteriskListenerTask task;
+    private final AsteriskConnection connection;
+    private final ManagerEventListener listener;
 
     public AsteriskConsumer(AsteriskEndpoint endpoint, Processor processor) {
         super(endpoint, processor);
+
         this.endpoint = endpoint;
-        this.task = new AsteriskListenerTask(endpoint, this);
+        this.connection = new AsteriskConnection(endpoint.getHostname(), endpoint.getUsername(), endpoint.getPassword());
+        this.listener = new EventListener();
     }
 
     @Override
     protected void doStart() throws Exception {
+        connection.connect();
+        connection.addListener(listener);
+        connection.login();
+
         super.doStart();
-        log.info("Starting Asterisk AMI Event Listener");
-        endpoint.addListener(task);
-        endpoint.login();
     }
 
     @Override
     protected void doStop() throws Exception {
         super.doStop();
-        log.info("Stopping Asterisk AMI Event Listener");
-        endpoint.logoff();
+
+        connection.removeListener(listener);
+        connection.logoff();
+    }
+
+    // *******************************
+    //
+    // *******************************
+
+    private final class EventListener implements ManagerEventListener {
+        @Override
+        public void onManagerEvent(ManagerEvent event) {
+            Exchange exchange = endpoint.createExchange();
+            exchange.getIn().setHeader(AsteriskConstants.EVENT_NAME, event.getClass().getSimpleName());
+            exchange.getIn().setBody(event);
+
+            try {
+                getProcessor().process(exchange);
+            } catch (Exception e) {
+                getExceptionHandler().handleException("Error processing exchange.", exchange, e);
+            }
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java
index d7fe808..280929f 100644
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java
+++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskEndpoint.java
@@ -16,10 +16,7 @@
  */
 package org.apache.camel.component.asterisk;
 
-import java.io.IOException;
-
 import org.apache.camel.Consumer;
-import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
 import org.apache.camel.impl.DefaultEndpoint;
@@ -27,34 +24,30 @@ import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
-import org.asteriskjava.manager.AuthenticationFailedException;
-import org.asteriskjava.manager.ManagerEventListener;
-import org.asteriskjava.manager.TimeoutException;
-import org.asteriskjava.manager.action.ManagerAction;
-import org.asteriskjava.manager.event.ManagerEvent;
-import org.asteriskjava.manager.response.ManagerResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.camel.util.ObjectHelper;
 
 /**
  * The asterisk component is used to interact with Asterisk PBX Server <a href="http://www.asterisk.org">Asterisk PBX Server</a>.
  */
 @UriEndpoint(firstVersion = "2.18.0", scheme = "asterisk", title = "Asterisk", syntax = "asterisk:name", consumerClass = AsteriskConsumer.class, label = "voip")
 public class AsteriskEndpoint extends DefaultEndpoint {
-    @SuppressWarnings("unused")
-    private static final Logger LOG = LoggerFactory.getLogger(AsteriskProducer.class);
-
-    private AsteriskConnection asteriskConnection;
-
-    @UriPath(description = "Name of component") @Metadata(required = "true")
+    @UriPath(description = "Name of component")
+    @Metadata(required = "true")
     private String name;
+
     @UriParam
+    @Metadata(required = "true")
     private String hostname;
+
     @UriParam(label = "producer")
-    private AsteriskActionEnum action;
+    private AsteriskAction action;
+
     @UriParam(secret = true)
+    @Metadata(required = "true")
     private String username;
+
     @UriParam(secret = true)
+    @Metadata(required = "true")
     private String password;
 
     public AsteriskEndpoint(String uri, AsteriskComponent component) {
@@ -63,57 +56,25 @@ public class AsteriskEndpoint extends DefaultEndpoint {
 
     @Override
     protected void doStart() throws Exception {
-        super.doStart();
-
-        asteriskConnection = new AsteriskConnection(hostname, username, password);
+        // Validate mandatory option
+        ObjectHelper.notNull(hostname, "hostname");
+        ObjectHelper.notNull(username, "username");
+        ObjectHelper.notNull(password, "password");
     }
 
     @Override
-    protected void doStop() throws Exception {
-        super.doStop();
-        // do not exist disconnect operation!!!
-        asteriskConnection = null;
-    }
-
     public Producer createProducer() throws Exception {
-        if (action == null) {
-            throw new IllegalArgumentException("Missing required action parameter");
-        }
-        
         return new AsteriskProducer(this);
     }
 
+    @Override
     public Consumer createConsumer(Processor processor) throws Exception {
         return new AsteriskConsumer(this, processor);
     }
 
+    @Override
     public boolean isSingleton() {
-        // TODO: prefer to be singleton and do not have state on the endpoint
-        // the asteriskConnection should be createed on the consumer / producer instance and be private there
-        return false;
-    }
-
-    public void addListener(ManagerEventListener listener) throws CamelAsteriskException {
-        asteriskConnection.addListener(listener);
-    }
-
-    public void login() throws IllegalStateException, IOException, AuthenticationFailedException, TimeoutException, CamelAsteriskException {
-        asteriskConnection.login();
-    }
-
-    public void logoff() throws CamelAsteriskException {
-        asteriskConnection.logoff();
-    }
-
-    public Exchange createExchange(ManagerEvent event) {
-        Exchange exchange = super.createExchange();
-        exchange.getIn().setHeader(AsteriskConstants.EVENT_NAME, event.getClass().getSimpleName());
-        exchange.getIn().setBody(event);
-        return exchange;
-    }
-
-    public ManagerResponse sendAction(ManagerAction action) throws IllegalArgumentException, IllegalStateException, IOException, TimeoutException {
-        return asteriskConnection.sendAction(action);
+        return true;
     }
 
     public String getUsername() {
@@ -138,14 +99,14 @@ public class AsteriskEndpoint extends DefaultEndpoint {
         this.password = password;
     }
 
-    public AsteriskActionEnum getAction() {
+    public AsteriskAction getAction() {
         return action;
     }
 
     /**
      * What action to perform such as getting queue status, sip peers or extension state.
      */
-    public void setAction(AsteriskActionEnum action) {
+    public void setAction(AsteriskAction action) {
         this.action = action;
     }
 
@@ -154,7 +115,7 @@ public class AsteriskEndpoint extends DefaultEndpoint {
     }
 
     /**
-     * The hostname of the asterix server
+     * The hostname of the asterisk server
      */
     public void setHostname(String hostname) {
         this.hostname = hostname;

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskListenerTask.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskListenerTask.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskListenerTask.java
deleted file mode 100644
index ddc41a9..0000000
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskListenerTask.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 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.asterisk;
-
-import org.apache.camel.Exchange;
-import org.asteriskjava.manager.ManagerEventListener;
-import org.asteriskjava.manager.event.ManagerEvent;
-
-public class AsteriskListenerTask extends Thread implements ManagerEventListener {
-    private final AsteriskEndpoint endpoint;
-    private final AsteriskConsumer consumer;
-
-    public AsteriskListenerTask(AsteriskEndpoint endpoint, AsteriskConsumer consumer) {
-        super();
-        this.endpoint = endpoint;
-        this.consumer = consumer;
-    }
-
-    @Override
-    public void onManagerEvent(ManagerEvent event) {
-        Exchange exchange = endpoint.createExchange(event);
-        try {
-            consumer.getProcessor().process(exchange);
-        } catch (Exception e) {
-            consumer.getExceptionHandler().handleException("Error processing exchange.", exchange, e);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskProducer.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskProducer.java
index f7ea5ee..5537c59 100644
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskProducer.java
+++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/AsteriskProducer.java
@@ -20,12 +20,10 @@ import java.io.IOException;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultProducer;
+import org.apache.camel.util.ObjectHelper;
 import org.asteriskjava.manager.AuthenticationFailedException;
 import org.asteriskjava.manager.TimeoutException;
-import org.asteriskjava.manager.action.ExtensionStateAction;
 import org.asteriskjava.manager.action.ManagerAction;
-import org.asteriskjava.manager.action.QueueStatusAction;
-import org.asteriskjava.manager.action.SipPeersAction;
 import org.asteriskjava.manager.response.ManagerResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,43 +34,48 @@ import org.slf4j.LoggerFactory;
 public class AsteriskProducer extends DefaultProducer {
     private static final Logger LOG = LoggerFactory.getLogger(AsteriskProducer.class);
 
-    private AsteriskEndpoint endpoint;
+    private final AsteriskEndpoint endpoint;
+    private final AsteriskConnection connection;
 
     public AsteriskProducer(AsteriskEndpoint endpoint) throws IllegalStateException, IOException, AuthenticationFailedException, TimeoutException, CamelAsteriskException {
         super(endpoint);
+
         this.endpoint = endpoint;
+        this.connection = new AsteriskConnection(endpoint.getHostname(), endpoint.getUsername(), endpoint.getPassword());
     }
 
     @Override
     protected void doStart() throws Exception {
-        endpoint.login();
+        connection.login();
+
+        super.doStart();
     }
 
     @Override
     protected void doStop() throws Exception {
-        endpoint.logoff();
+        super.doStop();
+
+        connection.logoff();
     }
 
+    @Override
     public void process(Exchange exchange) throws Exception {
-        ManagerAction action;
-        switch (endpoint.getAction()) {
-        case QUEUE_STATUS:
-            action = new QueueStatusAction();
-            break;
-        case SIP_PEERS:
-            action = new SipPeersAction();
-            break;
-        case EXTENSION_STATE:
-            action = new ExtensionStateAction((String)exchange.getIn().getHeader(AsteriskConstants.EXTENSION), (String)exchange.getIn().getHeader(AsteriskConstants.CONTEXT));
-            break;
-        default:
-            throw new IllegalStateException("Unknown action");
+        // The action set in the URI can be overridden using the message
+        // header CamelAsteriskAction
+        AsteriskAction action = exchange.getIn().getHeader(AsteriskConstants.ACTION, AsteriskAction.class);
+        if (action == null) {
+            action = endpoint.getAction();
         }
 
-        LOG.debug("Asterisk, send action {} ", endpoint.getAction());
+        // Action must be set
+        ObjectHelper.notNull(action, "action");
+
+        LOG.debug("Send action {} ", action);
+
+        ManagerAction managerAction = action.apply(exchange);
+        ManagerResponse managerResponse = connection.sendAction(managerAction);
 
-        ManagerResponse response = endpoint.sendAction(action);
-        exchange.getIn().setBody(response);
+        exchange.getIn().setBody(managerResponse);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/CamelAsteriskException.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/CamelAsteriskException.java b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/CamelAsteriskException.java
index 77e33d0..80ab7ee 100644
--- a/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/CamelAsteriskException.java
+++ b/components/camel-asterisk/src/main/java/org/apache/camel/component/asterisk/CamelAsteriskException.java
@@ -21,13 +21,7 @@ import org.apache.camel.CamelException;
 public class CamelAsteriskException extends CamelException {
     private static final long serialVersionUID = -8873987361491963823L;
 
-    public CamelAsteriskException() {
-        super();
-    }
-
     public CamelAsteriskException(String message) {
         super(message);
     }
-
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/d032095f/components/camel-asterisk/src/test/java/org/apache/camel/component/asterisk/AsteriskProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-asterisk/src/test/java/org/apache/camel/component/asterisk/AsteriskProducerTest.java b/components/camel-asterisk/src/test/java/org/apache/camel/component/asterisk/AsteriskProducerTest.java
index 243c220..a226029 100644
--- a/components/camel-asterisk/src/test/java/org/apache/camel/component/asterisk/AsteriskProducerTest.java
+++ b/components/camel-asterisk/src/test/java/org/apache/camel/component/asterisk/AsteriskProducerTest.java
@@ -30,7 +30,7 @@ public class AsteriskProducerTest extends CamelTestSupport {
     private String hostname = "192.168.0.254";
     private String username = "username";
     private String password = "password";
-    private String action = AsteriskActionEnum.EXTENSION_STATE.name();
+    private String action = AsteriskAction.EXTENSION_STATE.name();
 
     @Test
     public void testSnmpProducer() throws Exception {