From d955be2b9d930ff4700dd28cfd0e1222c9297558 Mon Sep 17 00:00:00 2001 From: Stefan Reuter Date: Thu, 6 Oct 2011 04:29:47 +0200 Subject: [PATCH 0001/1055] Fixed file names --- ...{DAHDIShowChannelsAction.java => DahdiShowChannelsAction.java} | 0 ...nelsCompleteEvent.java => DahdiShowChannelsCompleteEvent.java} | 0 .../{DAHDIShowChannelsEvent.java => DahdiShowChannelsEvent.java} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/org/asteriskjava/manager/action/{DAHDIShowChannelsAction.java => DahdiShowChannelsAction.java} (100%) rename src/main/java/org/asteriskjava/manager/event/{DAHDIShowChannelsCompleteEvent.java => DahdiShowChannelsCompleteEvent.java} (100%) rename src/main/java/org/asteriskjava/manager/event/{DAHDIShowChannelsEvent.java => DahdiShowChannelsEvent.java} (100%) diff --git a/src/main/java/org/asteriskjava/manager/action/DAHDIShowChannelsAction.java b/src/main/java/org/asteriskjava/manager/action/DahdiShowChannelsAction.java similarity index 100% rename from src/main/java/org/asteriskjava/manager/action/DAHDIShowChannelsAction.java rename to src/main/java/org/asteriskjava/manager/action/DahdiShowChannelsAction.java diff --git a/src/main/java/org/asteriskjava/manager/event/DAHDIShowChannelsCompleteEvent.java b/src/main/java/org/asteriskjava/manager/event/DahdiShowChannelsCompleteEvent.java similarity index 100% rename from src/main/java/org/asteriskjava/manager/event/DAHDIShowChannelsCompleteEvent.java rename to src/main/java/org/asteriskjava/manager/event/DahdiShowChannelsCompleteEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/DAHDIShowChannelsEvent.java b/src/main/java/org/asteriskjava/manager/event/DahdiShowChannelsEvent.java similarity index 100% rename from src/main/java/org/asteriskjava/manager/event/DAHDIShowChannelsEvent.java rename to src/main/java/org/asteriskjava/manager/event/DahdiShowChannelsEvent.java From c6bef164471a8480657ba600788e0403bbcad17b Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:08:35 +0400 Subject: [PATCH 0002/1055] -https://secure.reucon.net/issues/browse/AJ-299 --- .../org/asteriskjava/tools/HtmlEventTracer.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java index 875411246..3f2a9aa16 100644 --- a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java +++ b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java @@ -133,7 +133,7 @@ public void write() StringBuilder line = new StringBuilder(); line.append(""); - line.append(getLocalName(event.getClass())); + line.append(event.getClass().getSimpleName()); line.append("
"); line.append(event.getDateReceived()); line.append(""); @@ -187,7 +187,8 @@ protected String getProperty(Object obj, String property) continue; } - return propertyDescriptor.getReadMethod().invoke(obj).toString(); + final Object o = propertyDescriptor.getReadMethod().invoke(obj); + return o != null ? o.toString() : null; } } catch (Exception e) @@ -199,14 +200,6 @@ protected String getProperty(Object obj, String property) return null; } - protected String getLocalName(Class c) - { - String s; - - s = c.getName(); - return s.substring(s.lastIndexOf(".") + 1, s.length()); - } - protected String getText(String uniqueId, ManagerEvent event) { String format = null; From e7c22e170f7f96bca80d37b84aa6caf72dc684c2 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:18:07 +0400 Subject: [PATCH 0003/1055] *Immutable, monitor friendly ManagerEventListenerProxy --- .../manager/ManagerEventListenerProxy.java | 79 ++++++++----------- 1 file changed, 33 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/ManagerEventListenerProxy.java b/src/main/java/org/asteriskjava/manager/ManagerEventListenerProxy.java index b7d39b7a6..4779bace8 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerEventListenerProxy.java +++ b/src/main/java/org/asteriskjava/manager/ManagerEventListenerProxy.java @@ -1,11 +1,14 @@ package org.asteriskjava.manager; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.util.DaemonThreadFactory; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + /** * Proxies a ManagerEventListener and dispatches events asynchronously by using * a single threaded executor.

@@ -26,62 +29,46 @@ * * * @author srt + * @author fink * @since 0.3 - * @version $Id$ */ -public class ManagerEventListenerProxy implements ManagerEventListener -{ - private final ExecutorService executor; - private ManagerEventListener target; +public class ManagerEventListenerProxy implements ManagerEventListener { + private final ThreadPoolExecutor executor; + private final ManagerEventListener target; - /** - * Creates a new ManagerEventListenerProxy.

- * You must set the target by calling {@link #setTarget(ManagerEventListener)}. - */ - public ManagerEventListenerProxy() - { - this.executor = Executors.newSingleThreadExecutor(new DaemonThreadFactory()); - } /** * Creates a new ManagerEventListenerProxy that notifies the given target * asynchronously when new events are received. * * @param target the target listener to invoke. + * @see Executors#newSingleThreadExecutor(ThreadFactory) */ - public ManagerEventListenerProxy(ManagerEventListener target) - { - this(); - this.target = target; - } + public ManagerEventListenerProxy(ManagerEventListener target) { + executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), new DaemonThreadFactory()); + this.target = target; + if (target == null) { + throw new NullPointerException("ManagerEventListener target is null!"); + } + }//new + + + @Override public void onManagerEvent(final ManagerEvent event) { + executor.execute(new Runnable() { + @Override public void run() { + target.onManagerEvent(event); + } + }); + }//onManagerEvent - /** - * Sets the target listener that is notified asynchronously when new events - * are received. - * c - * @param target the target listener to invoke. - */ - public synchronized void setTarget(ManagerEventListener target) - { - this.target = target; - } - public synchronized void onManagerEvent(final ManagerEvent event) - { - if (target != null) - { - executor.execute(new Runnable() - { - public void run() - { - target.onManagerEvent(event); - } - }); - } - } - public void shutdown() { - executor.shutdown(); } + + public static class Access { + public static int getThreadQueueSize (ManagerEventListenerProxy proxy) { + return proxy.executor.getQueue().size(); + } + }//Access } From e472e45f4856f3952596e6e8ec1365da6b7aa72b Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:19:34 +0400 Subject: [PATCH 0004/1055] *fix for some Asterisk versions --- .../asteriskjava/manager/event/PeerEntryEvent.java | 12 ++++++++++++ .../asteriskjava/manager/response/PingResponse.java | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/PeerEntryEvent.java b/src/main/java/org/asteriskjava/manager/event/PeerEntryEvent.java index 5a67336e0..8a673be55 100644 --- a/src/main/java/org/asteriskjava/manager/event/PeerEntryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/PeerEntryEvent.java @@ -44,6 +44,7 @@ public class PeerEntryEvent extends ResponseEvent private Integer port; private Boolean dynamic; private Boolean natSupport; + private Boolean forceRport; private Boolean videoSupport; private Boolean textSupport; private Boolean acl; @@ -190,6 +191,17 @@ public void setNatSupport(Boolean natSupport) this.natSupport = natSupport; } + /** + * Returns whether the nat option is set to force_rport.
+ * Available since Asterisk 1.8 + * + * @return true if the nat option is set to force_rport, + * false otherwise or null if not supported by Asterisk. + */ + public Boolean getForceRport() { return forceRport;} + + public void setForceRport(Boolean forceRport) { this.forceRport = forceRport;} + /** * Available since Asterisk 1.4. * diff --git a/src/main/java/org/asteriskjava/manager/response/PingResponse.java b/src/main/java/org/asteriskjava/manager/response/PingResponse.java index c0b77282c..211c70b25 100644 --- a/src/main/java/org/asteriskjava/manager/response/PingResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/PingResponse.java @@ -28,6 +28,7 @@ public class PingResponse extends ManagerResponse private static final long serialVersionUID = 0L; private String ping; + private Double timestamp; /** * Returns always "Pong". @@ -43,4 +44,16 @@ public void setPing(String ping) { this.ping = ping; } + + /** + * Returns the timestamp for this response. + * In contains the time the response was generated in seconds since the epoch. + *

+ * Example: 1300978224.745639 + * + * @return the timestamp for this response. + */ + public Double getTimestamp() { return timestamp;} + public void setTimestamp(Double timestamp) { this.timestamp = timestamp;} + } \ No newline at end of file From e8e73b718f9dce74cb325ffcfb33f5d0f6e2fde7 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:23:00 +0400 Subject: [PATCH 0005/1055] *shorter log --- .../asteriskjava/util/DaemonThreadFactory.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/asteriskjava/util/DaemonThreadFactory.java b/src/main/java/org/asteriskjava/util/DaemonThreadFactory.java index 490a7b563..c54139b6c 100644 --- a/src/main/java/org/asteriskjava/util/DaemonThreadFactory.java +++ b/src/main/java/org/asteriskjava/util/DaemonThreadFactory.java @@ -20,19 +20,16 @@ public class DaemonThreadFactory implements ThreadFactory /** * Creates a new instance. */ - public DaemonThreadFactory() - { - namePrefix = "Asterisk-Java DaemonPool-" + poolNumber.getAndIncrement() + "-thread-"; - } + public DaemonThreadFactory() { + namePrefix = "AJ DaemonPool-"+ poolNumber.getAndIncrement() +'.'; + }//new - public Thread newThread(Runnable r) - { - final Thread thread; - thread = new Thread(r); + @Override public Thread newThread (Runnable r) { + final Thread thread = new Thread(r); thread.setDaemon(true); thread.setName(namePrefix + threadNumber.getAndIncrement()); return thread; } -} +} \ No newline at end of file From 0e32ccdd6d6b477e7da7cf0226d43aac6447cb7b Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:23:59 +0400 Subject: [PATCH 0006/1055] *monitoring api --- .../fastagi/AbstractAgiServer.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/fastagi/AbstractAgiServer.java b/src/main/java/org/asteriskjava/fastagi/AbstractAgiServer.java index 0e4bcb00c..1d7349b1f 100644 --- a/src/main/java/org/asteriskjava/fastagi/AbstractAgiServer.java +++ b/src/main/java/org/asteriskjava/fastagi/AbstractAgiServer.java @@ -1,15 +1,15 @@ package org.asteriskjava.fastagi; +import org.asteriskjava.fastagi.internal.AgiChannelFactory; +import org.asteriskjava.fastagi.internal.DefaultAgiChannelFactory; import org.asteriskjava.util.DaemonThreadFactory; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; -import org.asteriskjava.fastagi.internal.AgiChannelFactory; -import org.asteriskjava.fastagi.internal.DefaultAgiChannelFactory; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.SynchronousQueue; /** * Abstract base class for FastAGI and AsyncAGI servers. @@ -241,6 +241,27 @@ private synchronized ThreadPoolExecutor getPool() return pool; } + + /** + * Returns the approximate number of AgiConnectionHandler threads that are actively executing tasks. + * @see ThreadPoolExecutor#getActiveCount() + * @see #getPoolActiveThreadCount() + * @see org.asteriskjava.fastagi.internal.AgiConnectionHandler#AGI_CONNECTION_HANDLERS + */ + public int getPoolActiveTaskCount () { + if (pool != null) { + return pool.getActiveCount(); + } + return -1; + }//getPoolActiveCount + + public int getPoolActiveThreadCount () { + if (pool != null) { + return pool.getPoolSize(); + } + return -1; + }//getPoolActiveThreadCount + /** * Creates a new ThreadPoolExecutor to serve the AGI requests. The nature of this pool * defines how many concurrent requests can be handled. The default implementation From 192d7ec8088f3543ab5a3dcde14f1e8d7578379c Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:25:08 +0400 Subject: [PATCH 0007/1055] *monitoring api --- .../fastagi/internal/AgiChannelImpl.java | 3 +++ .../internal/AgiConnectionHandler.java | 20 ++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java index 184a91866..af14a6089 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java @@ -499,4 +499,7 @@ public void gosub(String context, String extension, String priority, String... a { sendCommand(new GosubCommand(context, extension, priority, arguments)); } + + + public AgiRequest getInternalAgiRequest () { return request;} } diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiConnectionHandler.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiConnectionHandler.java index c3d6e85f8..1373b1763 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiConnectionHandler.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiConnectionHandler.java @@ -21,6 +21,9 @@ import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + /** * An AgiConnectionHandler is created and run by the AgiServer whenever a new * AGI connection from an Asterisk Server is received. @@ -43,6 +46,10 @@ public abstract class AgiConnectionHandler implements Runnable private AgiScript script = null; private AgiChannelFactory agiChannelFactory; + + public static final ConcurrentMap AGI_CONNECTION_HANDLERS = + new ConcurrentHashMap(32); + /** * The strategy to use to determine which script to run. */ @@ -93,8 +100,7 @@ protected AgiScript getScript() */ public abstract void release(); - public void run() - { + @Override public void run() { AgiChannel channel = null; try @@ -126,8 +132,8 @@ public void run() setStatusVariable(channel, AJ_AGISTATUS_NOT_FOUND); logToAsterisk(channel, errorMessage); } - else if (script != null) - { + else if (script != null) { + AGI_CONNECTION_HANDLERS.put(this, channel); runScript(script, request, channel); } } @@ -141,12 +147,12 @@ else if (script != null) setStatusVariable(channel, AJ_AGISTATUS_FAILED); logger.error("Unexpected Exception while handling request", e); } - finally - { + finally { + AGI_CONNECTION_HANDLERS.remove(this); AgiConnectionHandler.channel.set(null); release(); } - } + }//run private void runScript(AgiScript script, AgiRequest request, AgiChannel channel) { From ae70091cc3dfe3d86ca49eff4aa8598acf2b8a65 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:28:12 +0400 Subject: [PATCH 0008/1055] *performance, less verbose log --- .../org/asteriskjava/fastagi/DefaultAgiServer.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java b/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java index f695e72b4..16519cea0 100644 --- a/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java +++ b/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java @@ -20,7 +20,11 @@ import org.asteriskjava.fastagi.internal.AgiConnectionHandler; import org.asteriskjava.fastagi.internal.DefaultAgiChannelFactory; import org.asteriskjava.fastagi.internal.FastAgiConnectionHandler; -import org.asteriskjava.util.*; +import org.asteriskjava.util.Log; +import org.asteriskjava.util.LogFactory; +import org.asteriskjava.util.ReflectionUtil; +import org.asteriskjava.util.ServerSocketFacade; +import org.asteriskjava.util.SocketConnectionFacade; import org.asteriskjava.util.internal.ServerSocketFacadeImpl; import java.io.IOException; @@ -256,9 +260,12 @@ private void loadConfig() } } + /** Default 50? Windows server max 200? */ + private static final int BACKLOG = 200; + protected ServerSocketFacade createServerSocket() throws IOException { - return new ServerSocketFacadeImpl(port, 0, null); + return new ServerSocketFacadeImpl(port, BACKLOG, null); } public void startup() throws IOException, IllegalStateException @@ -301,7 +308,7 @@ public void startup() throws IOException, IllegalStateException } } - logger.info("Received connection from " + socket.getRemoteAddress()); + logger.debug("Received connection from " + socket.getRemoteAddress()); // execute connection handler final AgiConnectionHandler connectionHandler = new FastAgiConnectionHandler(getMappingStrategy(), socket, this.getAgiChannelFactory()); From cf4605756b06cb9c8b1f1b6a62c9b7a1d98d618f Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:30:29 +0400 Subject: [PATCH 0009/1055] *agi tcp connection hang-up protection --- .../internal/SocketConnectionFacadeImpl.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java index 1f395ff6a..54a877adf 100644 --- a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java +++ b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java @@ -16,25 +16,18 @@ */ package org.asteriskjava.util.internal; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; +import org.asteriskjava.util.SocketConnectionFacade; + +import javax.net.SocketFactory; +import javax.net.ssl.SSLSocketFactory; +import java.io.*; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; -import java.util.Scanner; import java.util.NoSuchElementException; +import java.util.Scanner; import java.util.regex.Pattern; -import javax.net.SocketFactory; -import javax.net.ssl.SSLSocketFactory; - -import org.asteriskjava.util.SocketConnectionFacade; - /** * Default implementation of the SocketConnectionFacade interface using java.io. @@ -65,7 +58,7 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou { this(host, port, ssl, timeout, readTimeout, CRNL_PATTERN); } - + /** * Creates a new instance for use with the Manager API that uses the given line delimiter. * @@ -105,11 +98,15 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou * @param socket the underlying socket. * @throws IOException if the connection cannot be initialized. */ - SocketConnectionFacadeImpl(Socket socket) throws IOException - { - initialize(socket, NL_PATTERN); + SocketConnectionFacadeImpl(Socket socket) throws IOException { + socket.setSoTimeout(MAX_SOCKET_READ_TIMEOUT_MILLIS); + initialize(socket, NL_PATTERN); } + /** 70 mi = 70 * 60 * 1000 */ + private static final int MAX_SOCKET_READ_TIMEOUT_MILLIS = 4200000; + + private void initialize(Socket socket, Pattern pattern) throws IOException { this.socket = socket; From 5982863726393ab3acf1ca28aa81782b0dd687f1 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:38:38 +0400 Subject: [PATCH 0010/1055] -ManagerConnectionPool https://secure.reucon.net/issues/browse/AJ-300. Fewer AMI connections - better performance. +VAR_AJ_DIAL_STATUS = "AJ_DIAL_STATUS" +management api -better shutdown *better perfomance *better log --- .../asteriskjava/live/AsteriskChannel.java | 2 + .../live/internal/AsteriskServerImpl.java | 72 +++++---- .../live/internal/ChannelManager.java | 100 +++++++------ .../live/internal/ManagerConnectionPool.java | 140 ------------------ 4 files changed, 93 insertions(+), 221 deletions(-) delete mode 100644 src/main/java/org/asteriskjava/live/internal/ManagerConnectionPool.java diff --git a/src/main/java/org/asteriskjava/live/AsteriskChannel.java b/src/main/java/org/asteriskjava/live/AsteriskChannel.java index e3f86a54b..7618f02b1 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskChannel.java +++ b/src/main/java/org/asteriskjava/live/AsteriskChannel.java @@ -65,6 +65,8 @@ public interface AsteriskChannel extends LiveObject String VARIABLE_MONITOR_EXEC = "MONITOR_EXEC"; String VARIABLE_MONITOR_EXEC_ARGS = "MONITOR_EXEC_ARGS"; + /** Pseudo-variable to store {@link org.asteriskjava.manager.event.DialEvent#getDialStatus()} */ + String VAR_AJ_DIAL_STATUS = "AJ_DIAL_STATUS"; /** * Returns the unique id of this channel, for example "1099015093.165". * diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index d87b5a68c..c5183fde7 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -16,17 +16,21 @@ */ package org.asteriskjava.live.internal; +import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.config.ConfigFile; import org.asteriskjava.live.*; -import org.asteriskjava.manager.*; +import org.asteriskjava.manager.ManagerConnection; +import org.asteriskjava.manager.ManagerConnectionState; +import org.asteriskjava.manager.ManagerEventListener; +import org.asteriskjava.manager.ManagerEventListenerProxy; +import org.asteriskjava.manager.ResponseEvents; import org.asteriskjava.manager.action.*; import org.asteriskjava.manager.event.*; import org.asteriskjava.manager.response.*; +import org.asteriskjava.util.AstUtil; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; -import org.asteriskjava.util.AstUtil; -import org.asteriskjava.config.ConfigFile; -import org.asteriskjava.AsteriskVersion; import java.util.*; import java.util.concurrent.atomic.AtomicLong; @@ -58,21 +62,16 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener */ private ManagerConnection eventConnection; private ManagerEventListener eventListener = null; - private ManagerEventListenerProxy managerEventListenerProxy = null; - - private boolean initialized = false; + ManagerEventListenerProxy managerEventListenerProxy; - /** - * A pool of manager connections to use for sending actions to Asterisk. - */ - private final ManagerConnectionPool connectionPool; + boolean initialized = false; - private final List listeners; + final Set listeners; - private final ChannelManager channelManager; - private final MeetMeManager meetMeManager; - private final QueueManager queueManager; - private final AgentManager agentManager; + final ChannelManager channelManager; + final MeetMeManager meetMeManager; + final QueueManager queueManager; + final AgentManager agentManager; /** * The exact version string of the Asterisk server we are connected to. @@ -117,9 +116,8 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener */ public AsteriskServerImpl() { - connectionPool = new ManagerConnectionPool(1); idCounter = new AtomicLong(); - listeners = new ArrayList(); + listeners = new LinkedHashSet(); originateCallbacks = new HashMap(); channelManager = new ChannelManager(this); agentManager = new AgentManager(this); @@ -136,7 +134,7 @@ public AsteriskServerImpl() public AsteriskServerImpl(ManagerConnection eventConnection) { this(); - setManagerConnection(eventConnection); //todo: !!! Possible bug !!!: call to overridable method over object construction + setManagerConnection(eventConnection); //todo: !!! Possible bug !!!: call to overridable method over object construction } /** @@ -164,8 +162,6 @@ public void setManagerConnection(ManagerConnection eventConnection) } this.eventConnection = eventConnection; - this.connectionPool.clear(); - this.connectionPool.add(eventConnection); } public ManagerConnection getManagerConnection() @@ -1163,7 +1159,7 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) return; } } - + if (channel.wasInState(ChannelState.DOWN)) { cb.onNoAnswer(channel); @@ -1179,19 +1175,31 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) } } - public void shutdown() - { - if (eventConnection != null && (eventConnection.getState() == ManagerConnectionState.CONNECTED || eventConnection.getState() == ManagerConnectionState.RECONNECTING)) - { - eventConnection.logoff(); - } - if (managerEventListenerProxy != null) - { + @Override public void shutdown() { + if (eventConnection != null && (eventConnection.getState() == ManagerConnectionState.CONNECTED || eventConnection.getState() == ManagerConnectionState.RECONNECTING)) { + try { + eventConnection.logoff(); + } catch (Exception ignore) {} + } + + if (managerEventListenerProxy != null) { + if (eventConnection != null) { + eventConnection.removeEventListener(managerEventListenerProxy); + } managerEventListenerProxy.shutdown(); } - managerEventListenerProxy = null; + + if (eventConnection != null && eventListener != null) { + eventConnection.removeEventListener(eventListener); + } + + managerEventListenerProxy = null; eventListener = null; - } + + if (initialized) {//incredible, but it happened + handleDisconnectEvent(null); + }//i + }//shutdown public List getPeerEntries() throws ManagerCommunicationException { diff --git a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java index e3334ccb9..0c6c5c20c 100644 --- a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java +++ b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java @@ -20,11 +20,14 @@ import org.asteriskjava.manager.ResponseEvents; import org.asteriskjava.manager.action.StatusAction; import org.asteriskjava.manager.event.*; +import org.asteriskjava.util.DaemonThreadFactory; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; import java.util.*; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * Manages channel events on behalf of an AsteriskServer. @@ -47,7 +50,10 @@ class ChannelManager /** * A map of all active channel by their unique id. */ - private final Set channels; + final Set channels; + + + ScheduledThreadPoolExecutor traceScheduledExecutorService; /** * Creates a new instance. @@ -70,6 +76,9 @@ void initialize(List variables) throws ManagerCommunicationException ResponseEvents re; disconnected(); + + traceScheduledExecutorService = new ScheduledThreadPoolExecutor(1, new DaemonThreadFactory());//Executors.newSingleThreadScheduledExecutor + StatusAction sa = new StatusAction(); sa.setVariables(variables); re = server.sendEventGeneratingAction(sa); @@ -84,6 +93,9 @@ void initialize(List variables) throws ManagerCommunicationException void disconnected() { + if (traceScheduledExecutorService != null) { + traceScheduledExecutorService.shutdown(); + } synchronized (channels) { channels.clear(); @@ -147,56 +159,42 @@ private void removeOldChannels() } } - private AsteriskChannelImpl addNewChannel(String uniqueId, String name, + private AsteriskChannelImpl addNewChannel(String uniqueId, final String name, Date dateOfCreation, String callerIdNumber, String callerIdName, ChannelState state, String account) { - final AsteriskChannelImpl channel; - final String traceId; - - channel = new AsteriskChannelImpl(server, name, uniqueId, dateOfCreation); + final AsteriskChannelImpl channel = new AsteriskChannelImpl(server, name, uniqueId, dateOfCreation); channel.setCallerId(new CallerId(callerIdName, callerIdNumber)); channel.setAccount(account); channel.stateChanged(dateOfCreation, state); logger.info("Adding channel " + channel.getName() + "(" + channel.getId() + ")"); + addChannel(channel); - if (SLEEP_TIME_BEFORE_GET_VAR > 0) - { - try - { - Thread.sleep(SLEEP_TIME_BEFORE_GET_VAR); - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - } - } + //todo getChannelImplById -> LinkedHashMap, callbacks order + traceScheduledExecutorService.schedule(new Runnable(){ + @Override public void run () { + final String traceId = getTraceId(channel); + channel.setTraceId(traceId); - traceId = getTraceId(channel); - channel.setTraceId(traceId); + if (traceId != null && (!name.toLowerCase(Locale.ENGLISH).startsWith("local/") || name.endsWith(",1") || name.endsWith(";1"))) { + final OriginateCallbackData callbackData = server.getOriginateCallbackDataByTraceId(traceId); + + if (callbackData != null && callbackData.getChannel() == null) { + callbackData.setChannel(channel); + try { + callbackData.getCallback().onDialing(channel); + } catch (Throwable t) { + logger.warn("Exception dispatching originate progress. "+ channel, t); + }//t + }//i + }//i + }}, SLEEP_TIME_BEFORE_GET_VAR, TimeUnit.MILLISECONDS); - addChannel(channel); - if (traceId != null && (!name.toLowerCase(Locale.ENGLISH).startsWith("local/") || (name.endsWith(",1") || name.endsWith(";1")))) - { - final OriginateCallbackData callbackData; - callbackData = server.getOriginateCallbackDataByTraceId(traceId); - if (callbackData != null && callbackData.getChannel() == null) - { - callbackData.setChannel(channel); - try - { - callbackData.getCallback().onDialing(channel); - } - catch (Throwable t) - { - logger.warn("Exception dispatching originate progress.", t); - } - } - } server.fireNewAsteriskChannel(channel); return channel; - } + }//addNewChannel + void handleStatusEvent(StatusEvent event) { @@ -447,7 +445,7 @@ void handleNewExtenEvent(NewExtenEvent event) channel = getChannelImplById(event.getUniqueId()); if (channel == null) { - logger.error("Ignored NewExtenEvent for unknown channel " + event.getChannel()); + logger.warn("handleNewExtenEvent: Ignored NewExtenEvent for unknown channel " + event.getChannel()); return; } @@ -573,7 +571,7 @@ void handleHangupEvent(HangupEvent event) if (channel == null) { - logger.error("Ignored HangupEvent for unknown channel " + event.getChannel()); + logger.warn("handleHangupEvent: Ignored HangupEvent for unknown channel " + event.getChannel()); return; } @@ -598,14 +596,18 @@ void handleDialEvent(DialEvent event) if (sourceChannel == null) { - logger.error("Ignored DialEvent for unknown source channel " + event.getChannel() + " with unique id " + event.getUniqueId()); - return; - } - if (destinationChannel == null) - { - logger.error("Ignored DialEvent for unknown destination channel " + event.getDestination() + " with unique id " + event.getDestUniqueId()); + logger.warn("handleDialEvent: Ignored DialEvent for unknown source channel " + event.getChannel() + " with unique id " + event.getUniqueId()); return; } + if (destinationChannel == null) { + if (DialEvent.SUBEVENT_END.equalsIgnoreCase(event.getSubEvent())) { + sourceChannel.updateVariable(AsteriskChannel.VAR_AJ_DIAL_STATUS, event.getDialStatus()); + logger.info("handleDialEvent: Ignored DialEvent for unknown dst channel "+ event.getDestination() +" with unique_id "+ event.getDestUniqueId()); + } else { + logger.warn("handleDialEvent: Ignored DialEvent for unknown dst channel "+ event.getDestination() +" with unique_id "+ event.getDestUniqueId()); + } + return; + }//i logger.info(sourceChannel.getName() + " dialed " + destinationChannel.getName()); getTraceId(sourceChannel); @@ -627,12 +629,12 @@ void handleBridgeEvent(BridgeEvent event) if (channel1 == null) { - logger.error("Ignored BridgeEvent for unknown channel " + event.getChannel1()); + logger.warn("handleBridgeEvent: Ignored BridgeEvent for unknown channel " + event.getChannel1()); return; } if (channel2 == null) { - logger.error("Ignored BridgeEvent for unknown channel " + event.getChannel2()); + logger.warn("handleBridgeEvent: Ignored BridgeEvent for unknown channel " + event.getChannel2()); return; } @@ -671,7 +673,7 @@ void handleRenameEvent(RenameEvent event) if (channel == null) { - logger.error("Ignored RenameEvent for unknown channel with uniqueId " + event.getUniqueId()); + logger.warn("handleRenameEvent: Ignored RenameEvent for unknown channel with uniqueId " + event.getUniqueId()); return; } diff --git a/src/main/java/org/asteriskjava/live/internal/ManagerConnectionPool.java b/src/main/java/org/asteriskjava/live/internal/ManagerConnectionPool.java deleted file mode 100644 index 21612197e..000000000 --- a/src/main/java/org/asteriskjava/live/internal/ManagerConnectionPool.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2005-2006 Stefan Reuter - * - * Licensed 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.asteriskjava.live.internal; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - -import org.asteriskjava.live.ManagerCommunicationException; -import org.asteriskjava.manager.ManagerConnection; -import org.asteriskjava.manager.ResponseEvents; -import org.asteriskjava.manager.action.EventGeneratingAction; -import org.asteriskjava.manager.action.ManagerAction; -import org.asteriskjava.manager.response.ManagerResponse; -import org.asteriskjava.util.Log; -import org.asteriskjava.util.LogFactory; - -class ManagerConnectionPool -{ - private final Log logger = LogFactory.getLog(getClass()); - private final BlockingQueue connections; - - ManagerConnectionPool(int size) - { - this.connections = new ArrayBlockingQueue(size); - } - - void clear() - { - connections.clear(); - } - - void add(ManagerConnection connection) - { - put(connection); - } - - ManagerResponse sendAction(ManagerAction action) throws ManagerCommunicationException - { - ManagerConnection connection; - ManagerResponse response; - - connection = get(); - try - { - response = connection.sendAction(action); - } - catch (Exception e) - { - throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); - } - finally - { - put(connection); - } - - return response; - } - - ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws ManagerCommunicationException - { - return sendEventGeneratingAction(action, -1); - } - - ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) - throws ManagerCommunicationException - { - ManagerConnection connection; - ResponseEvents responseEvents; - - connection = get(); - try - { - if (timeout > 0) - { - responseEvents = connection.sendEventGeneratingAction(action, timeout); - } - else - { - responseEvents = connection.sendEventGeneratingAction(action); - } - } - catch (Exception e) - { - throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); - } - finally - { - put(connection); - } - - return responseEvents; - } - - /** - * Retrieves a connection from the pool. - * - * @return the retrieved connection, or null if interrupted - * while waiting for a connection to become available. - */ - private ManagerConnection get() - { - try - { - return connections.take(); - } - catch (InterruptedException e) - { - logger.error("Interrupted while waiting for ManagerConnection to become available", e); - Thread.currentThread().interrupt(); - return null; - } - } - - private void put(ManagerConnection connection) - { - try - { - connections.put(connection); - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - throw new RuntimeException("Interrupted while trying to add connection to pool"); - } - } -} From 609fc24ebdd5f05f6e3db8585d45cd595c02a9ae Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 14:04:37 +0400 Subject: [PATCH 0011/1055] *prepare for Set->LinkedHashMap --- .../live/internal/ChannelManager.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java index 0c6c5c20c..4ed75bbad 100644 --- a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java +++ b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java @@ -459,6 +459,14 @@ void handleNewExtenEvent(NewExtenEvent event) } } + private void idChanged (AsteriskChannelImpl channel, AbstractChannelEvent event) { + if (channel != null) { + logger.info("Changing unique_id for '" + channel.getName() + "' from " + channel.getId() + " to " + event.getUniqueId() +" < "+ event); + channel.idChanged(event.getDateReceived(), event.getUniqueId()); + } + }//idChanged + + void handleNewStateEvent(NewStateEvent event) { AsteriskChannelImpl channel = getChannelImplById(event.getUniqueId()); @@ -467,11 +475,7 @@ void handleNewStateEvent(NewStateEvent event) { // NewStateEvent can occur for an existing channel that now has a different unique id (originate with Local/) channel = getChannelImplByNameAndActive(event.getChannel()); - if (channel != null) - { - logger.info("Changing unique id for '" + channel.getName() + "' from " + channel.getId() + " to " + event.getUniqueId()); - channel.idChanged(event.getDateReceived(), event.getUniqueId()); - } + idChanged(channel, event); if (channel == null) { @@ -542,11 +546,7 @@ void handleNewCallerIdEvent(NewCallerIdEvent event) { // NewCallerIdEvent can occur for an existing channel that now has a different unique id (originate with Local/) channel = getChannelImplByNameAndActive(event.getChannel()); - if (channel != null) - { - logger.info("Changing unique id for '" + channel.getName() + "' from " + channel.getId() + " to " + event.getUniqueId()); - channel.idChanged(event.getDateReceived(), event.getUniqueId()); - } + idChanged(channel, event); if (channel == null) { From 4550d63145968f763fee2c8bee60cc737c5ca999 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 15:14:06 +0400 Subject: [PATCH 0012/1055] *Set->LinkedHashMap for high performance --- .../live/internal/ChannelManager.java | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java index 4ed75bbad..327b73604 100644 --- a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java +++ b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java @@ -50,7 +50,7 @@ class ChannelManager /** * A map of all active channel by their unique id. */ - final Set channels; + final LinkedHashMap channels = new LinkedHashMap(); ScheduledThreadPoolExecutor traceScheduledExecutorService; @@ -63,7 +63,6 @@ class ChannelManager ChannelManager(AsteriskServerImpl server) { this.server = server; - this.channels = new HashSet(); } void initialize() throws ManagerCommunicationException @@ -114,7 +113,7 @@ Collection getChannels() synchronized (channels) { copy = new ArrayList(channels.size() + 2); - for (AsteriskChannel channel : channels) + for (AsteriskChannel channel : channels.values()) { if (channel.getState() != ChannelState.HUNGUP) { @@ -129,7 +128,7 @@ private void addChannel(AsteriskChannelImpl channel) { synchronized (channels) { - channels.add(channel); + channels.put(channel.getId(), channel); } } @@ -142,7 +141,7 @@ private void removeOldChannels() synchronized (channels) { - i = channels.iterator(); + i = channels.values().iterator(); while (i.hasNext()) { final AsteriskChannel channel = i.next(); @@ -290,9 +289,9 @@ AsteriskChannelImpl getChannelImplByName(String name) synchronized (channels) { - for (AsteriskChannelImpl tmp : channels) + for (AsteriskChannelImpl tmp : channels.values()) { - if (tmp.getName() != null && tmp.getName().equals(name)) + if (name.equals(tmp.getName())) { // return the most recent channel or when dates are similar, the active one if (dateOfCreation == null || @@ -332,9 +331,9 @@ AsteriskChannelImpl getChannelImplByNameAndActive(String name) synchronized (channels) { - for (AsteriskChannelImpl tmp : channels) + for (AsteriskChannelImpl tmp : channels.values()) { - if (tmp.getName() != null && tmp.getName().equals(name) && tmp.getState() != ChannelState.HUNGUP) + if (name.equals(tmp.getName()) && tmp.getState() != ChannelState.HUNGUP) { channel = tmp; } @@ -343,25 +342,13 @@ AsteriskChannelImpl getChannelImplByNameAndActive(String name) return channel; } - AsteriskChannelImpl getChannelImplById(String id) - { - if (id == null) - { - return null; - } + AsteriskChannelImpl getChannelImplById(String uniqueId) { + if (uniqueId == null) { return null;} - synchronized (channels) - { - for (AsteriskChannelImpl channel : channels) - { - if (id.equals(channel.getId())) - { - return channel; - } - } - } - return null; - } + synchronized (channels) { + return channels.get(uniqueId); + } + }//getChannelImplById /** * Returns the other side of a local channel. @@ -461,8 +448,17 @@ void handleNewExtenEvent(NewExtenEvent event) private void idChanged (AsteriskChannelImpl channel, AbstractChannelEvent event) { if (channel != null) { - logger.info("Changing unique_id for '" + channel.getName() + "' from " + channel.getId() + " to " + event.getUniqueId() +" < "+ event); - channel.idChanged(event.getDateReceived(), event.getUniqueId()); + final String oldId = channel.getId(); + final String newId = event.getUniqueId(); + + if (oldId != null && oldId.equals(newId)) { return;} + + logger.info("Changing unique_id for '" + channel.getName() + "' from " + oldId + " to " + newId +" < "+ event); + synchronized(channels) { + channels.remove(oldId); + channels.put(newId, channel); + channel.idChanged(event.getDateReceived(), newId); + } } }//idChanged From 3f9e5ee12a7f6299c5155b290d78d49897cd1c41 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:20:35 +1100 Subject: [PATCH 0013/1055] add support for MuteAudio action. --- .../manager/action/MuteAudioAction.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java new file mode 100644 index 000000000..15fe0f385 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -0,0 +1,119 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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.asteriskjava.manager.action; + +/** + * Action: MuteAudio Synopsis: Mute an audio stream Privilege: system,all + * Description: Mute an incoming or outbound audio stream in a channel. + * Variables: Channel: The channel you want to mute. Direction: in | out + * |all The stream you want to mute. State: on | off Whether to turn mute on or + * off. ActionID: Optional action ID for this AMI transaction. + * + * It is defined in res/res_mutestream.c. + *

+ * Available since Asterisk 1.8 + * + * @author sbs + * @version $Id: MuteAction.java 938 2007-12-31 03:23:38Z srt $ + * @since 1.0.0 + */ +public class MuteAudioAction extends AbstractManagerAction +{ + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 0L; + + private String channel; + + /** The audio direct (relative to the pbx) which is to be muted. */ + enum Direction + { + in, out, all + } + + private Direction direction; + + /** Controls whether to mute (on) or unmute (off) the call **/ + enum State + { + mute("on"), unmute("off"); //$NON-NLS-1$//$NON-NLS-2$ + + String value; + + State(String value) + { + this.value = value; + } + + } + + private State state; + + /** + * Creates a new empty MuteAction. + */ + public MuteAudioAction() + { + + } + + /** + * Creates a new MuteAction that Mutes or Unmutes the two given channel. + * + * @param channel + * the name of the channel to Mute. + * + * @param direction + * the audio direction which is to be muted/unmuted + * + * @param state controls whether we are muting or unmuting the channel. + */ + + public MuteAudioAction(String channel, Direction direction, State state) + { + this.channel = channel; + this.direction = direction; + this.state = state; + } + + /** + * Returns the name of this action, i.e. "MuteAudio". + */ + @Override + public String getAction() + { + return "MuteAudio"; //$NON-NLS-1$ + } + + String getChannel() + { + return this.channel; + } + + Direction getDirection() + { + return this.direction; + } + + State getState() + { + return this.state; + } + + +} \ No newline at end of file From 4d81ccce65e83b492178d11fbe6ed5f006c8ec15 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:23:26 +1100 Subject: [PATCH 0014/1055] Added toString method to the State enum so that it will output the correct value. --- .../org/asteriskjava/manager/action/MuteAudioAction.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index 15fe0f385..ea5c2679e 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -60,6 +60,11 @@ enum State this.value = value; } + public String toString() + { + return this.value; + } + } private State state; From 6243c857b2816200461fc99ef41b0ff5595347cf Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:40:51 +1100 Subject: [PATCH 0015/1055] Change the enums to upper case to match convention. --- .../java/org/asteriskjava/manager/action/MuteAudioAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index ea5c2679e..b6c45d80f 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -43,7 +43,7 @@ public class MuteAudioAction extends AbstractManagerAction /** The audio direct (relative to the pbx) which is to be muted. */ enum Direction { - in, out, all + IN, OUT, ALL } private Direction direction; @@ -51,7 +51,7 @@ enum Direction /** Controls whether to mute (on) or unmute (off) the call **/ enum State { - mute("on"), unmute("off"); //$NON-NLS-1$//$NON-NLS-2$ + MUTE("on"), UNMUTE("off"); //$NON-NLS-1$//$NON-NLS-2$ String value; From 0c524d3c796934c3bd6774fd103238fa682185ba Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 23:17:21 +1100 Subject: [PATCH 0016/1055] Made the State and Direction enums public so that they can actually be used when creating a MuteAudioAction. --- .../java/org/asteriskjava/manager/action/MuteAudioAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index b6c45d80f..7c52b2dd4 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -41,7 +41,7 @@ public class MuteAudioAction extends AbstractManagerAction private String channel; /** The audio direct (relative to the pbx) which is to be muted. */ - enum Direction + public enum Direction { IN, OUT, ALL } @@ -49,7 +49,7 @@ enum Direction private Direction direction; /** Controls whether to mute (on) or unmute (off) the call **/ - enum State + public enum State { MUTE("on"), UNMUTE("off"); //$NON-NLS-1$//$NON-NLS-2$ From 28546fc0a7fccae6d7765a5fb9854b8598cad06b Mon Sep 17 00:00:00 2001 From: Stefan Reuter Date: Thu, 26 Jan 2012 14:06:51 +0100 Subject: [PATCH 0017/1055] AJ-268 - Unable to set property 'class' to 'default' on org.asteriskjava.manager.event.MusicOnHoldEvent --- .../manager/event/MusicOnHoldEvent.java | 15 +++++++++++++-- .../manager/internal/AbstractBuilder.java | 4 ++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldEvent.java b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldEvent.java index eb7791bcd..c0f8cea63 100644 --- a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldEvent.java @@ -33,9 +33,10 @@ public class MusicOnHoldEvent extends ManagerEvent public static final String STATE_STOP = "Stop"; private String channel; + private String clazz; private String uniqueId; private String state; - + public MusicOnHoldEvent(Object source) { super(source); @@ -61,6 +62,16 @@ public void setChannel(String channel) this.channel = channel; } + public String getClazz() + { + return this.clazz; + } + + public void setClazz(String clazz) + { + this.clazz = clazz; + } + /** * Returns the unique id of the channel. * @@ -120,4 +131,4 @@ public boolean isStop() { return STATE_STOP.equals(state); } -} \ No newline at end of file +} diff --git a/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java b/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java index 94295d16e..90e715ad7 100644 --- a/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java +++ b/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java @@ -47,6 +47,10 @@ protected void setAttributes(Object target, Map attributes, Set< if ("source".equals(setterName)) { setterName = "src"; + } + else if ("class".equals(setterName)) + { + setterName = "clazz"; } setter = setters.get(setterName); From d99448f4a1021ad00bc2d75899852f6216cb62ed Mon Sep 17 00:00:00 2001 From: Stefan Reuter Date: Sat, 3 Mar 2012 16:15:20 +0100 Subject: [PATCH 0018/1055] Updated parent pom --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 25e0c9dc8..ca8f39962 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.asteriskjava asterisk-java-parent - 3 + 4 asterisk-java Asterisk-Java From 12cb515390d23b66183538cf633000b7813cce44 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Sat, 17 Mar 2012 15:07:34 +1100 Subject: [PATCH 0019/1055] Made the getters public so that they would be found during introspection. --- pom.xml | 13 +++++++++++++ .../manager/action/MuteAudioAction.java | 6 +++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4ef4d4426..37d1b1d1c 100644 --- a/pom.xml +++ b/pom.xml @@ -224,4 +224,17 @@ org.apache.log4j;resolution:=optional --> + + + + noojeeit-releases + Noojee IT Release Repository + http://artifactory.noojeeit.com.au/artifactory/libs-releases-local + + + noojeeit-snapshots + Noojee IT Snapshot Repository + http://artifactory.noojeeit.com.au/artifactory/libs-snapshots-local + + diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index 7c52b2dd4..e807e2be2 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -105,17 +105,17 @@ public String getAction() return "MuteAudio"; //$NON-NLS-1$ } - String getChannel() + public String getChannel() { return this.channel; } - Direction getDirection() + public Direction getDirection() { return this.direction; } - State getState() + public State getState() { return this.state; } From c6df7a2ec66209a8f15e6610602ef899ad3d9ba6 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 9 Jul 2012 13:49:51 +1000 Subject: [PATCH 0020/1055] The chainListener allows a listener to receive manager events after they have been processed by the AsteriskServer. If the AsteriskServer is handling messages using the asyncEventHandling then these messages will also be async. You would use the chainListener if you are processing raw events and using the AJ live ChannelManager. If you don't use the chain listener then you can't be certain that a channel name passed in a raw event will match the channel name held by the Channel Manager. By chaining events you can be certain that events such as channel Rename events have been processed by the live ChannelManager before you receive an event and as such the names will always match. --- .../live/internal/AsteriskServerImpl.java | 2636 +++++++++-------- 1 file changed, 1387 insertions(+), 1249 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index c5183fde7..0ce194ad9 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -16,1273 +16,1411 @@ */ package org.asteriskjava.live.internal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import org.asteriskjava.AsteriskVersion; import org.asteriskjava.config.ConfigFile; -import org.asteriskjava.live.*; +import org.asteriskjava.live.AsteriskAgent; +import org.asteriskjava.live.AsteriskChannel; +import org.asteriskjava.live.AsteriskQueue; +import org.asteriskjava.live.AsteriskQueueEntry; +import org.asteriskjava.live.AsteriskServer; +import org.asteriskjava.live.AsteriskServerListener; +import org.asteriskjava.live.CallerId; +import org.asteriskjava.live.ChannelState; +import org.asteriskjava.live.LiveException; +import org.asteriskjava.live.ManagerCommunicationException; +import org.asteriskjava.live.MeetMeRoom; +import org.asteriskjava.live.MeetMeUser; +import org.asteriskjava.live.NoSuchChannelException; +import org.asteriskjava.live.OriginateCallback; +import org.asteriskjava.live.Voicemailbox; import org.asteriskjava.manager.ManagerConnection; import org.asteriskjava.manager.ManagerConnectionState; import org.asteriskjava.manager.ManagerEventListener; import org.asteriskjava.manager.ManagerEventListenerProxy; import org.asteriskjava.manager.ResponseEvents; -import org.asteriskjava.manager.action.*; -import org.asteriskjava.manager.event.*; -import org.asteriskjava.manager.response.*; +import org.asteriskjava.manager.action.CommandAction; +import org.asteriskjava.manager.action.DbGetAction; +import org.asteriskjava.manager.action.DbPutAction; +import org.asteriskjava.manager.action.EventGeneratingAction; +import org.asteriskjava.manager.action.GetConfigAction; +import org.asteriskjava.manager.action.GetVarAction; +import org.asteriskjava.manager.action.MailboxCountAction; +import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.manager.action.ModuleCheckAction; +import org.asteriskjava.manager.action.ModuleLoadAction; +import org.asteriskjava.manager.action.OriginateAction; +import org.asteriskjava.manager.action.SetVarAction; +import org.asteriskjava.manager.action.SipPeersAction; +import org.asteriskjava.manager.event.AbstractMeetMeEvent; +import org.asteriskjava.manager.event.AgentCallbackLoginEvent; +import org.asteriskjava.manager.event.AgentCallbackLogoffEvent; +import org.asteriskjava.manager.event.AgentCalledEvent; +import org.asteriskjava.manager.event.AgentCompleteEvent; +import org.asteriskjava.manager.event.AgentConnectEvent; +import org.asteriskjava.manager.event.AgentLoginEvent; +import org.asteriskjava.manager.event.AgentLogoffEvent; +import org.asteriskjava.manager.event.AgentsEvent; +import org.asteriskjava.manager.event.BridgeEvent; +import org.asteriskjava.manager.event.CdrEvent; +import org.asteriskjava.manager.event.ConnectEvent; +import org.asteriskjava.manager.event.DbGetResponseEvent; +import org.asteriskjava.manager.event.DialEvent; +import org.asteriskjava.manager.event.DisconnectEvent; +import org.asteriskjava.manager.event.DtmfEvent; +import org.asteriskjava.manager.event.HangupEvent; +import org.asteriskjava.manager.event.JoinEvent; +import org.asteriskjava.manager.event.LeaveEvent; +import org.asteriskjava.manager.event.ManagerEvent; +import org.asteriskjava.manager.event.NewCallerIdEvent; +import org.asteriskjava.manager.event.NewChannelEvent; +import org.asteriskjava.manager.event.NewExtenEvent; +import org.asteriskjava.manager.event.NewStateEvent; +import org.asteriskjava.manager.event.OriginateResponseEvent; +import org.asteriskjava.manager.event.ParkedCallEvent; +import org.asteriskjava.manager.event.ParkedCallGiveUpEvent; +import org.asteriskjava.manager.event.ParkedCallTimeOutEvent; +import org.asteriskjava.manager.event.PeerEntryEvent; +import org.asteriskjava.manager.event.QueueMemberAddedEvent; +import org.asteriskjava.manager.event.QueueMemberPausedEvent; +import org.asteriskjava.manager.event.QueueMemberPenaltyEvent; +import org.asteriskjava.manager.event.QueueMemberRemovedEvent; +import org.asteriskjava.manager.event.QueueMemberStatusEvent; +import org.asteriskjava.manager.event.RenameEvent; +import org.asteriskjava.manager.event.ResponseEvent; +import org.asteriskjava.manager.event.UnparkedCallEvent; +import org.asteriskjava.manager.event.VarSetEvent; +import org.asteriskjava.manager.response.CommandResponse; +import org.asteriskjava.manager.response.GetConfigResponse; +import org.asteriskjava.manager.response.MailboxCountResponse; +import org.asteriskjava.manager.response.ManagerError; +import org.asteriskjava.manager.response.ManagerResponse; +import org.asteriskjava.manager.response.ModuleCheckResponse; import org.asteriskjava.util.AstUtil; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; -import java.util.*; -import java.util.concurrent.atomic.AtomicLong; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * Default implementation of the {@link AsteriskServer} interface. - * + * * @author srt * @version $Id$ */ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener { - private static final String ACTION_ID_PREFIX_ORIGINATE = "AJ_ORIGINATE_"; - private static final String SHOW_VERSION_COMMAND = "show version"; - private static final String SHOW_VERSION_1_6_COMMAND = "core show version"; - private static final String SHOW_VERSION_FILES_COMMAND = "show version files"; - private static final String SHOW_VERSION_FILES_1_6_COMMAND = "core show file version"; - private static final Pattern SHOW_VERSION_FILES_PATTERN = Pattern.compile("^([\\S]+)\\s+Revision: ([0-9\\.]+)"); - private static final String SHOW_VOICEMAIL_USERS_COMMAND = "show voicemail users"; - private static final String SHOW_VOICEMAIL_USERS_1_6_COMMAND = "voicemail show users"; - private static final Pattern SHOW_VOICEMAIL_USERS_PATTERN = Pattern.compile("^(\\S+)\\s+(\\S+)\\s+(.{25})"); - - private final Log logger = LogFactory.getLog(this.getClass()); - - /** - * The underlying manager connection used to receive events from Asterisk. - */ - private ManagerConnection eventConnection; - private ManagerEventListener eventListener = null; - ManagerEventListenerProxy managerEventListenerProxy; - - boolean initialized = false; - - final Set listeners; - - final ChannelManager channelManager; - final MeetMeManager meetMeManager; - final QueueManager queueManager; - final AgentManager agentManager; - - /** - * The exact version string of the Asterisk server we are connected to. - *

- * Contains null until lazily initialized. - */ - private String version; - - /** - * Holds the version of Asterisk's source files. - *

- * That corresponds to the output of the CLI command - * show version files. - *

- * Contains null until lazily initialized. - */ - private Map versions; - - /** - * Maps the traceId to the corresponding callback data. - */ - private final Map originateCallbacks; - - private final AtomicLong idCounter; - - /* config options */ - - /** - * Flag to skip initializing queues as that results in a timeout on Asterisk - * 1.0.x. - */ - private boolean skipQueues; - - /** - * Set to true to not handle ManagerEvents in the reader - * tread but process them asynchronously. This is a good idea :) - */ - private boolean asyncEventHandling = true; - - /** - * Creates a new instance. - */ - public AsteriskServerImpl() - { - idCounter = new AtomicLong(); - listeners = new LinkedHashSet(); - originateCallbacks = new HashMap(); - channelManager = new ChannelManager(this); - agentManager = new AgentManager(this); - meetMeManager = new MeetMeManager(this, channelManager); - queueManager = new QueueManager(this, channelManager); - } - - /** - * Creates a new instance. - * - * @param eventConnection the ManagerConnection to use for receiving events - * from Asterisk. - */ - public AsteriskServerImpl(ManagerConnection eventConnection) - { - this(); - setManagerConnection(eventConnection); //todo: !!! Possible bug !!!: call to overridable method over object construction - } - - /** - * Determines if queue status is retrieved at startup. If you don't need - * queue information and still run Asterisk 1.0.x you can set this to - * true to circumvent the startup delay caused by the missing - * QueueStatusComplete event. - *

- * Default is false. - * - * @param skipQueues true to skip queue initialization, - * false to not skip. - * @since 0.2 - */ - public void setSkipQueues(boolean skipQueues) - { - this.skipQueues = skipQueues; - } - - public void setManagerConnection(ManagerConnection eventConnection) - { - if (this.eventConnection != null) - { - throw new IllegalStateException("ManagerConnection already set."); - } - - this.eventConnection = eventConnection; - } - - public ManagerConnection getManagerConnection() - { - return eventConnection; - } - - public void initialize() throws ManagerCommunicationException - { - initializeIfNeeded(); - } - - private synchronized void initializeIfNeeded() throws ManagerCommunicationException - { - if (initialized) - { - return; - } - - if (eventConnection.getState() == ManagerConnectionState.INITIAL - || eventConnection.getState() == ManagerConnectionState.DISCONNECTED) - { - try - { - eventConnection.login(); - } - catch (Exception e) - { - throw new ManagerCommunicationException("Unable to login: " + e.getMessage(), e); - } - } - - channelManager.initialize(); - agentManager.initialize(); - meetMeManager.initialize(); - if (!skipQueues) - { - queueManager.initialize(); - } - - if (asyncEventHandling && managerEventListenerProxy == null) - { - managerEventListenerProxy = new ManagerEventListenerProxy(this); - eventConnection.addEventListener(managerEventListenerProxy); - } - else if (!asyncEventHandling && eventListener == null) - { - eventListener = this; - eventConnection.addEventListener(eventListener); - } - logger.info("Initializing done"); - initialized = true; - } - - /* Implementation of the AsteriskServer interface */ - - public AsteriskChannel originateToExtension(String channel, String context, - String exten, int priority, long timeout) - throws ManagerCommunicationException, NoSuchChannelException - { - return originateToExtension(channel, context, exten, priority, timeout, null, null); - } - - public AsteriskChannel originateToExtension(String channel, String context, - String exten, int priority, long timeout, CallerId callerId, - Map variables) - throws ManagerCommunicationException, NoSuchChannelException - { - final OriginateAction originateAction; - - originateAction = new OriginateAction(); - originateAction.setChannel(channel); - originateAction.setContext(context); - originateAction.setExten(exten); - originateAction.setPriority(priority); - originateAction.setTimeout(timeout); - if (callerId != null) - { - originateAction.setCallerId(callerId.toString()); - } - originateAction.setVariables(variables); - - return originate(originateAction); - } - - public AsteriskChannel originateToApplication(String channel, - String application, String data, long timeout) - throws ManagerCommunicationException, NoSuchChannelException - { - return originateToApplication(channel, application, data, timeout, null, null); - } - - public AsteriskChannel originateToApplication(String channel, - String application, String data, long timeout, CallerId callerId, - Map variables) - throws ManagerCommunicationException, NoSuchChannelException - { - final OriginateAction originateAction; - - originateAction = new OriginateAction(); - originateAction.setChannel(channel); - originateAction.setApplication(application); - originateAction.setData(data); - originateAction.setTimeout(timeout); - if (callerId != null) - { - originateAction.setCallerId(callerId.toString()); - } - originateAction.setVariables(variables); - - return originate(originateAction); - } - - public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, NoSuchChannelException - { - final ResponseEvents responseEvents; - final Iterator responseEventIterator; - String uniqueId; - AsteriskChannel channel = null; - - // must set async to true to receive OriginateEvents. - originateAction.setAsync(Boolean.TRUE); - - initializeIfNeeded(); - - // 2000 ms extra for the OriginateFailureEvent should be fine - responseEvents = sendEventGeneratingAction(originateAction, originateAction.getTimeout() + 2000); - - responseEventIterator = responseEvents.getEvents().iterator(); - if (responseEventIterator.hasNext()) - { - ResponseEvent responseEvent; - - responseEvent = responseEventIterator.next(); - if (responseEvent instanceof OriginateResponseEvent) - { - uniqueId = ((OriginateResponseEvent) responseEvent).getUniqueId(); - logger.debug(responseEvent.getClass().getName() + " received with uniqueId " + uniqueId); - channel = getChannelById(uniqueId); - } - } - - if (channel == null) - { - throw new NoSuchChannelException("Channel '" + originateAction.getChannel() + "' is not available"); - } - - return channel; - } - - public void originateToExtensionAsync(String channel, String context, - String exten, int priority, long timeout, OriginateCallback cb) - throws ManagerCommunicationException - { - originateToExtensionAsync(channel, context, exten, priority, timeout, null, null, cb); - } - - public void originateToExtensionAsync(String channel, String context, - String exten, int priority, long timeout, CallerId callerId, - Map variables, OriginateCallback cb) - throws ManagerCommunicationException - { - final OriginateAction originateAction; - - originateAction = new OriginateAction(); - originateAction.setChannel(channel); - originateAction.setContext(context); - originateAction.setExten(exten); - originateAction.setPriority(priority); - originateAction.setTimeout(timeout); - if (callerId != null) - { - originateAction.setCallerId(callerId.toString()); - } - originateAction.setVariables(variables); - - originateAsync(originateAction, cb); - } - - public void originateToApplicationAsync(String channel, String application, - String data, long timeout, OriginateCallback cb) - throws ManagerCommunicationException - { - originateToApplicationAsync(channel, application, data, timeout, null, null, cb); - } - - public void originateToApplicationAsync(String channel, String application, - String data, long timeout, CallerId callerId, - Map variables, OriginateCallback cb) - throws ManagerCommunicationException - { - final OriginateAction originateAction; - - originateAction = new OriginateAction(); - originateAction.setChannel(channel); - originateAction.setApplication(application); - originateAction.setData(data); - originateAction.setTimeout(timeout); - if (callerId != null) - { - originateAction.setCallerId(callerId.toString()); - } - originateAction.setVariables(variables); - - originateAsync(originateAction, cb); - } - - public void originateAsync(OriginateAction originateAction, - OriginateCallback cb) throws ManagerCommunicationException - { - final Map variables; - final String traceId; - - traceId = ACTION_ID_PREFIX_ORIGINATE + idCounter.getAndIncrement(); - if (originateAction.getVariables() == null) - { - variables = new HashMap(); - } - else - { - variables = new HashMap(originateAction.getVariables()); - } - - // prefix variable name by "__" to enable variable inheritence across channels - variables.put("__" + Constants.VARIABLE_TRACE_ID, traceId); - originateAction.setVariables(variables); - - // async must be set to true to receive OriginateEvents. - originateAction.setAsync(Boolean.TRUE); - originateAction.setActionId(traceId); - - if (cb != null) - { - final OriginateCallbackData callbackData; - - callbackData = new OriginateCallbackData(originateAction, DateUtil.getDate(), cb); - // register callback - synchronized (originateCallbacks) - { - originateCallbacks.put(traceId, callbackData); - } - } - - initializeIfNeeded(); - sendActionOnEventConnection(originateAction); - } - - public Collection getChannels() throws ManagerCommunicationException - { - initializeIfNeeded(); - return channelManager.getChannels(); - } - - public AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException - { - initializeIfNeeded(); - return channelManager.getChannelImplByName(name); - } - - public AsteriskChannel getChannelById(String id) throws ManagerCommunicationException - { - initializeIfNeeded(); - return channelManager.getChannelImplById(id); - } - - public Collection getMeetMeRooms() throws ManagerCommunicationException - { - initializeIfNeeded(); - return meetMeManager.getMeetMeRooms(); - } - - public MeetMeRoom getMeetMeRoom(String name) throws ManagerCommunicationException - { - initializeIfNeeded(); - return meetMeManager.getOrCreateRoomImpl(name); - } - - public Collection getQueues() throws ManagerCommunicationException - { - initializeIfNeeded(); - return queueManager.getQueues(); - } - - public synchronized String getVersion() throws ManagerCommunicationException - { - final ManagerResponse response; - final String command; - - initializeIfNeeded(); - if (version == null) - { - if (eventConnection.getVersion().isAtLeast(AsteriskVersion.ASTERISK_1_6)) - { - command = SHOW_VERSION_1_6_COMMAND; - } - else - { - command = SHOW_VERSION_COMMAND; - } - - response = sendAction(new CommandAction(command)); - if (response instanceof CommandResponse) - { - final List result; - - result = ((CommandResponse) response).getResult(); - if (result.size() > 0) - { - version = (String) result.get(0); - } - } - else - { - logger.error("Response to CommandAction(\"" + command + "\") was not a CommandResponse but " + response); - } - } - - return version; - } - - public int[] getVersion(String file) throws ManagerCommunicationException - { - String fileVersion = null; - String[] parts; - int[] intParts; - - initializeIfNeeded(); - if (versions == null) - { - Map map; - ManagerResponse response; - - map = new HashMap(); - try - { - final String command; - - if (eventConnection.getVersion().isAtLeast(AsteriskVersion.ASTERISK_1_6)) - { - command = SHOW_VERSION_FILES_1_6_COMMAND; - } - else - { - command = SHOW_VERSION_FILES_COMMAND; - } - response = sendAction(new CommandAction(command)); - if (response instanceof CommandResponse) - { - List result; - - result = ((CommandResponse) response).getResult(); - for (int i = 2; i < result.size(); i++) - { - String line; - Matcher matcher; - - line = result.get(i); - matcher = SHOW_VERSION_FILES_PATTERN.matcher(line); - if (matcher.find()) - { - String key = matcher.group(1); - String value = matcher.group(2); - - map.put(key, value); - } - } - - fileVersion = map.get(file); - versions = map; - } - else - { - logger.error("Response to CommandAction(\"" - + command + "\") was not a CommandResponse but " + response); - } - } - catch (Exception e) - { - logger.warn("Unable to send '" + SHOW_VERSION_FILES_COMMAND + "' command.", e); - } - } - else - { - synchronized (versions) - { - fileVersion = versions.get(file); - } - } - - if (fileVersion == null) - { - return null; - } - - parts = fileVersion.split("\\."); - intParts = new int[parts.length]; - - for (int i = 0; i < parts.length; i++) - { - try - { - intParts[i] = Integer.parseInt(parts[i]); - } - catch (NumberFormatException e) - { - intParts[i] = 0; - } - } - - return intParts; - } - - public String getGlobalVariable(String variable) throws ManagerCommunicationException - { - ManagerResponse response; - String value; - - initializeIfNeeded(); - response = sendAction(new GetVarAction(variable)); - if (response instanceof ManagerError) - { - return null; - } - value = response.getAttribute("Value"); - if (value == null) - { - value = response.getAttribute(variable); // for Asterisk 1.0.x - } - return value; - } - - public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException - { - ManagerResponse response; - - initializeIfNeeded(); - response = sendAction(new SetVarAction(variable, value)); - if (response instanceof ManagerError) - { - logger.error("Unable to set global variable '" + variable - + "' to '" + value + "':" + response.getMessage()); - } - } - - public Collection getVoicemailboxes() throws ManagerCommunicationException - { - final Collection voicemailboxes; - ManagerResponse response; - final List result; - - initializeIfNeeded(); - voicemailboxes = new ArrayList(); - if (eventConnection.getVersion().isAtLeast(AsteriskVersion.ASTERISK_1_6)) - { - response = sendAction(new CommandAction(SHOW_VOICEMAIL_USERS_1_6_COMMAND)); - } - else - { - response = sendAction(new CommandAction(SHOW_VOICEMAIL_USERS_COMMAND)); - } - if (!(response instanceof CommandResponse)) - { - logger.error("Response to CommandAction(\"" + SHOW_VOICEMAIL_USERS_COMMAND + "\") was not a CommandResponse but " + response); - return voicemailboxes; - } - - result = ((CommandResponse) response).getResult(); - if (result == null || result.size() < 1) - { - return voicemailboxes; - } - - // remove headline - result.remove(0); - - for (String line : result) - { - final Matcher matcher; - final Voicemailbox voicemailbox; - final String context; - final String mailbox; - final String user; - - matcher = SHOW_VOICEMAIL_USERS_PATTERN.matcher(line); - if (!matcher.find()) - { - continue; - } - - context = matcher.group(1); - mailbox = matcher.group(2); - user = matcher.group(3).trim(); - - voicemailbox = new Voicemailbox(mailbox, context, user); - voicemailboxes.add(voicemailbox); - } - - // get message count for each mailbox - for (Voicemailbox voicemailbox : voicemailboxes) - { - final String fullname; - - fullname = voicemailbox.getMailbox() + "@" - + voicemailbox.getContext(); - response = sendAction(new MailboxCountAction(fullname)); - if (response instanceof MailboxCountResponse) - { - MailboxCountResponse mailboxCountResponse; - - mailboxCountResponse = (MailboxCountResponse) response; - voicemailbox.setNewMessages(mailboxCountResponse.getNewMessages()); - voicemailbox.setOldMessages(mailboxCountResponse.getOldMessages()); - } - else - { - logger.error("Response to MailboxCountAction was not a MailboxCountResponse but " + response); - } - } - - return voicemailboxes; - } - - public List executeCliCommand(String command) throws ManagerCommunicationException - { - final ManagerResponse response; - - initializeIfNeeded(); - response = sendAction(new CommandAction(command)); - if (!(response instanceof CommandResponse)) - { - throw new ManagerCommunicationException("Response to CommandAction(\"" + command - + "\") was not a CommandResponse but " + response, null); - } - - return ((CommandResponse) response).getResult(); - } - - public boolean isModuleLoaded(String module) throws ManagerCommunicationException - { - return sendAction(new ModuleCheckAction(module)) instanceof ModuleCheckResponse; - } - - public void loadModule(String module) throws ManagerCommunicationException - { - sendModuleLoadAction(module, ModuleLoadAction.LOAD_TYPE_LOAD); - } - - public void unloadModule(String module) throws ManagerCommunicationException - { - sendModuleLoadAction(module, ModuleLoadAction.LOAD_TYPE_UNLOAD); - } - - public void reloadModule(String module) throws ManagerCommunicationException - { - sendModuleLoadAction(module, ModuleLoadAction.LOAD_TYPE_RELOAD); - } - - public void reloadAllModules() throws ManagerCommunicationException - { - sendModuleLoadAction(null, ModuleLoadAction.LOAD_TYPE_RELOAD); - } - - protected void sendModuleLoadAction(String module, String loadType) throws ManagerCommunicationException - { - final ManagerResponse response; - - response = sendAction(new ModuleLoadAction(module, loadType)); - if (response instanceof ManagerError) - { - final ManagerError error = (ManagerError) response; - throw new ManagerCommunicationException(error.getMessage(), null); - } - } - - public ConfigFile getConfig(String filename) throws ManagerCommunicationException - { - final ManagerResponse response; - final GetConfigResponse getConfigResponse; - - initializeIfNeeded(); - response = sendAction(new GetConfigAction(filename)); - if (!(response instanceof GetConfigResponse)) - { - throw new ManagerCommunicationException("Response to GetConfigAction(\"" + filename - + "\") was not a CommandResponse but " + response, null); - } - - getConfigResponse = (GetConfigResponse) response; - - final Map> categories = new LinkedHashMap>(); - final Map categoryMap = getConfigResponse.getCategories(); - for (Map.Entry categoryEntry : categoryMap.entrySet()) - { - final List lines; - final Map lineMap = getConfigResponse.getLines(categoryEntry.getKey()); - - if (lineMap == null) - { - lines = new ArrayList(); - } - else - { - lines = new ArrayList(lineMap.values()); - } - - categories.put(categoryEntry.getValue(), lines); - } - - return new ConfigFileImpl(filename, categories); - } - - public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException - { - initializeIfNeeded(); - synchronized (listeners) - { - listeners.add(listener); - } - } - - public void removeAsteriskServerListener(AsteriskServerListener listener) - { - synchronized (listeners) - { - listeners.remove(listener); - } - } - - void fireNewAsteriskChannel(AsteriskChannel channel) - { - synchronized (listeners) - { - for (AsteriskServerListener listener : listeners) - { - try - { - listener.onNewAsteriskChannel(channel); - } - catch (Exception e) - { - logger.warn("Exception in onNewAsteriskChannel()", e); - } - } - } - } - - void fireNewMeetMeUser(MeetMeUser user) - { - synchronized (listeners) - { - for (AsteriskServerListener listener : listeners) - { - try - { - listener.onNewMeetMeUser(user); - } - catch (Exception e) - { - logger.warn("Exception in onNewMeetMeUser()", e); - } - } - } - } - - ManagerResponse sendActionOnEventConnection(ManagerAction action) throws ManagerCommunicationException - { - try - { - return eventConnection.sendAction(action); - } - catch (Exception e) - { - throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); - } - } - - ManagerResponse sendAction(ManagerAction action) throws ManagerCommunicationException - { - // return connectionPool.sendAction(action); - try - { - return eventConnection.sendAction(action); - } - catch (Exception e) - { - throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); - } - } - - ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws ManagerCommunicationException - { - // return connectionPool.sendEventGeneratingAction(action); - try - { - return eventConnection.sendEventGeneratingAction(action); - } - catch (Exception e) - { - throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); - } - } - - ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, - long timeout) throws ManagerCommunicationException - { - // return connectionPool.sendEventGeneratingAction(action, timeout); - try - { - return eventConnection.sendEventGeneratingAction(action, timeout); - } - catch (Exception e) - { - throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); - } - } - - OriginateCallbackData getOriginateCallbackDataByTraceId(String traceId) - { - synchronized (originateCallbacks) - { - return originateCallbacks.get(traceId); - } - } - - /* Implementation of the ManagerEventListener interface */ - - /** - * Handles all events received from the Asterisk server. - *

- * Events are queued until channels and queues are initialized and then - * delegated to the dispatchEvent method. - */ - public void onManagerEvent(ManagerEvent event) - { - // Handle Channel related events - if (event instanceof ConnectEvent) - { - handleConnectEvent((ConnectEvent) event); - } - else if (event instanceof DisconnectEvent) - { - handleDisconnectEvent((DisconnectEvent) event); - } - else if (event instanceof NewChannelEvent) - { - channelManager.handleNewChannelEvent((NewChannelEvent) event); - } - else if (event instanceof NewExtenEvent) - { - channelManager.handleNewExtenEvent((NewExtenEvent) event); - } - else if (event instanceof NewStateEvent) - { - channelManager.handleNewStateEvent((NewStateEvent) event); - } - else if (event instanceof NewCallerIdEvent) - { - channelManager.handleNewCallerIdEvent((NewCallerIdEvent) event); - } - else if (event instanceof DialEvent) - { - channelManager.handleDialEvent((DialEvent) event); - } - else if (event instanceof BridgeEvent) - { - channelManager.handleBridgeEvent((BridgeEvent) event); - } - else if (event instanceof RenameEvent) - { - channelManager.handleRenameEvent((RenameEvent) event); - } - else if (event instanceof HangupEvent) - { - channelManager.handleHangupEvent((HangupEvent) event); - } - else if (event instanceof CdrEvent) - { - channelManager.handleCdrEvent((CdrEvent) event); - } - else if (event instanceof VarSetEvent) - { - channelManager.handleVarSetEvent((VarSetEvent) event); - } - else if (event instanceof DtmfEvent) - { - channelManager.handleDtmfEvent((DtmfEvent) event); - } - // End of channel related events - // Handle parking related event - else if (event instanceof ParkedCallEvent) - { - channelManager.handleParkedCallEvent((ParkedCallEvent) event); - } - else if (event instanceof ParkedCallGiveUpEvent) - { - channelManager.handleParkedCallGiveUpEvent((ParkedCallGiveUpEvent) event); - } - else if (event instanceof ParkedCallTimeOutEvent) - { - channelManager.handleParkedCallTimeOutEvent((ParkedCallTimeOutEvent) event); - } - else if (event instanceof UnparkedCallEvent) - { - channelManager.handleUnparkedCallEvent((UnparkedCallEvent) event); - } - // End of parking related events - // Handle queue related event - else if (event instanceof JoinEvent) - { - queueManager.handleJoinEvent((JoinEvent) event); - } - else if (event instanceof LeaveEvent) - { - queueManager.handleLeaveEvent((LeaveEvent) event); - } - else if (event instanceof QueueMemberStatusEvent) - { - queueManager.handleQueueMemberStatusEvent((QueueMemberStatusEvent) event); - } - else if (event instanceof QueueMemberPenaltyEvent) - { - queueManager.handleQueueMemberPenaltyEvent((QueueMemberPenaltyEvent) event); - } - else if (event instanceof QueueMemberAddedEvent) - { - queueManager.handleQueueMemberAddedEvent((QueueMemberAddedEvent) event); - } - else if (event instanceof QueueMemberRemovedEvent) - { - queueManager.handleQueueMemberRemovedEvent((QueueMemberRemovedEvent) event); - } - else if (event instanceof QueueMemberPausedEvent) - { - queueManager.handleQueueMemberPausedEvent((QueueMemberPausedEvent) event); - } - // >>>>>> AJ 94 - // Handle meetMeEvents - else if (event instanceof AbstractMeetMeEvent) - { - meetMeManager.handleMeetMeEvent((AbstractMeetMeEvent) event); - } - else if (event instanceof OriginateResponseEvent) - { - handleOriginateEvent((OriginateResponseEvent) event); - } - // Handle agents-related events - else if (event instanceof AgentsEvent) - { - agentManager.handleAgentsEvent((AgentsEvent) event); - } - else if (event instanceof AgentCalledEvent) - { - agentManager.handleAgentCalledEvent((AgentCalledEvent) event); - } - else if (event instanceof AgentConnectEvent) - { - agentManager.handleAgentConnectEvent((AgentConnectEvent) event); - } - else if (event instanceof AgentCompleteEvent) - { - agentManager.handleAgentCompleteEvent((AgentCompleteEvent) event); - } - else if (event instanceof AgentCallbackLoginEvent) - { - agentManager.handleAgentCallbackLoginEvent((AgentCallbackLoginEvent) event); - } - else if (event instanceof AgentCallbackLogoffEvent) - { - agentManager.handleAgentCallbackLogoffEvent((AgentCallbackLogoffEvent) event); - } - else if (event instanceof AgentLoginEvent) - { - agentManager.handleAgentLoginEvent((AgentLoginEvent) event); - } - else if (event instanceof AgentLogoffEvent) - { - agentManager.handleAgentLogoffEvent((AgentLogoffEvent) event); - } - // End of agent-related events - } - - /* - * Resets the internal state when the connection to the asterisk server is - * lost. - */ - - private void handleDisconnectEvent(DisconnectEvent disconnectEvent) - { - // reset version information as it might have changed while Asterisk restarted - version = null; - versions = null; - - // same for channels, agents and queues rooms, they are reinitialized when reconnected - channelManager.disconnected(); - agentManager.disconnected(); - meetMeManager.disconnected(); - queueManager.disconnected(); - initialized = false; - } - - /* - * Requests the current state from the asterisk server after the connection - * to the asterisk server is restored. - */ - - private void handleConnectEvent(ConnectEvent connectEvent) - { - try - { - initialize(); - } - catch (Exception e) - { - logger.error("Unable to reinitialize state after reconnection", e); - } - } - - private void handleOriginateEvent(OriginateResponseEvent originateEvent) - { - final String traceId; - final OriginateCallbackData callbackData; - final OriginateCallback cb; - final AsteriskChannelImpl channel; - final AsteriskChannelImpl otherChannel; // the other side if local channel - - traceId = originateEvent.getActionId(); - if (traceId == null) - { - return; - } - - synchronized (originateCallbacks) - { - callbackData = originateCallbacks.get(traceId); - if (callbackData == null) - { - return; - } - originateCallbacks.remove(traceId); - } - - cb = callbackData.getCallback(); - if (!AstUtil.isNull(originateEvent.getUniqueId())) - { - channel = channelManager.getChannelImplById(originateEvent.getUniqueId()); - } - else - { - channel = callbackData.getChannel(); - } - - try - { - if (channel == null) - { - final LiveException cause; - - cause = new NoSuchChannelException("Channel '" + callbackData.getOriginateAction().getChannel() + "' is not available"); - cb.onFailure(cause); - return; - } - - if (channel.wasBusy()) - { - cb.onBusy(channel); - return; - } - - otherChannel = channelManager.getOtherSideOfLocalChannel(channel); - // special treatment of local channels: - // the interesting things happen to the other side so we have a look at that - if (otherChannel != null) - { - final AsteriskChannel dialedChannel; - - dialedChannel = otherChannel.getDialedChannel(); - - // on busy the other channel is in state busy when we receive the originate event - if (otherChannel.wasBusy()) - { - cb.onBusy(channel); - return; - } - - // alternative: - // on busy the dialed channel is hung up when we receive the - // originate event having a look at the hangup cause reveals the - // information we are interested in - // this alternative has the drawback that there might by - // multiple channels that have been dialed by the local channel - // but we only look at the last one. - if (dialedChannel != null && dialedChannel.wasBusy()) - { - cb.onBusy(channel); - return; - } - } - - if (channel.wasInState(ChannelState.DOWN)) - { - cb.onNoAnswer(channel); - return; - } - - // if nothing else matched we asume success - cb.onSuccess(channel); - } - catch (Throwable t) - { - logger.warn("Exception dispatching originate progress", t); - } - } - - @Override public void shutdown() { - if (eventConnection != null && (eventConnection.getState() == ManagerConnectionState.CONNECTED || eventConnection.getState() == ManagerConnectionState.RECONNECTING)) { - try { - eventConnection.logoff(); - } catch (Exception ignore) {} - } - - if (managerEventListenerProxy != null) { - if (eventConnection != null) { - eventConnection.removeEventListener(managerEventListenerProxy); + private static final String ACTION_ID_PREFIX_ORIGINATE = "AJ_ORIGINATE_"; + private static final String SHOW_VERSION_COMMAND = "show version"; + private static final String SHOW_VERSION_1_6_COMMAND = "core show version"; + private static final String SHOW_VERSION_FILES_COMMAND = "show version files"; + private static final String SHOW_VERSION_FILES_1_6_COMMAND = "core show file version"; + private static final Pattern SHOW_VERSION_FILES_PATTERN = Pattern.compile("^([\\S]+)\\s+Revision: ([0-9\\.]+)"); + private static final String SHOW_VOICEMAIL_USERS_COMMAND = "show voicemail users"; + private static final String SHOW_VOICEMAIL_USERS_1_6_COMMAND = "voicemail show users"; + private static final Pattern SHOW_VOICEMAIL_USERS_PATTERN = Pattern.compile("^(\\S+)\\s+(\\S+)\\s+(.{25})"); + + private final Log logger = LogFactory.getLog(this.getClass()); + + /** + * The underlying manager connection used to receive events from Asterisk. + */ + private ManagerConnection eventConnection; + private ManagerEventListener eventListener = null; + ManagerEventListenerProxy managerEventListenerProxy; + + boolean initialized = false; + + final Set listeners; + + final ChannelManager channelManager; + final MeetMeManager meetMeManager; + final QueueManager queueManager; + final AgentManager agentManager; + + /** + * The exact version string of the Asterisk server we are connected to. + *

+ * Contains null until lazily initialized. + */ + private String version; + + /** + * Holds the version of Asterisk's source files. + *

+ * That corresponds to the output of the CLI command + * show version files. + *

+ * Contains null until lazily initialized. + */ + private Map versions; + + /** + * Maps the traceId to the corresponding callback data. + */ + private final Map originateCallbacks; + + private final AtomicLong idCounter; + + /* config options */ + + /** + * Flag to skip initializing queues as that results in a timeout on Asterisk + * 1.0.x. + */ + private boolean skipQueues; + + /** + * Set to true to not handle ManagerEvents in the reader tread + * but process them asynchronously. This is a good idea :) + */ + private boolean asyncEventHandling = true; + + /** + * The chainListener allows a listener to receive manager events after they + * have been processed by the AsteriskServer. If the AsteriskServer is + * handling messages using the asyncEventHandling then these messages will + * also be async. You would use the chainListener if you are processing raw + * events and using the AJ live ChannelManager. If you don't use the chain + * listener then you can't be certain that a channel name passed in a raw + * event will match the channel name held by the Channel Manager. By + * chaining events you can be certain that events such as channel Rename + * events have been processed by the live ChannelManager before you receive + * an event and as such the names will always match. + * + */ + private List chainListeners = new ArrayList(); + + /** + * Creates a new instance. + */ + public AsteriskServerImpl() + { + idCounter = new AtomicLong(); + listeners = new LinkedHashSet(); + originateCallbacks = new HashMap(); + channelManager = new ChannelManager(this); + agentManager = new AgentManager(this); + meetMeManager = new MeetMeManager(this, channelManager); + queueManager = new QueueManager(this, channelManager); + } + + /** + * Creates a new instance. + * + * @param eventConnection + * the ManagerConnection to use for receiving events from + * Asterisk. + */ + public AsteriskServerImpl(ManagerConnection eventConnection) + { + this(); + setManagerConnection(eventConnection); // todo: !!! Possible bug !!!: + // call to overridable method + // over object construction + } + + /** + * Determines if queue status is retrieved at startup. If you don't need + * queue information and still run Asterisk 1.0.x you can set this to + * true to circumvent the startup delay caused by the missing + * QueueStatusComplete event. + *

+ * Default is false. + * + * @param skipQueues + * true to skip queue initialization, + * false to not skip. + * @since 0.2 + */ + public void setSkipQueues(boolean skipQueues) + { + this.skipQueues = skipQueues; + } + + public void setManagerConnection(ManagerConnection eventConnection) + { + if (this.eventConnection != null) + { + throw new IllegalStateException("ManagerConnection already set."); + } + + this.eventConnection = eventConnection; + } + + public ManagerConnection getManagerConnection() + { + return eventConnection; + } + + public void initialize() throws ManagerCommunicationException + { + initializeIfNeeded(); + } + + private synchronized void initializeIfNeeded() throws ManagerCommunicationException + { + if (initialized) + { + return; + } + + if (eventConnection.getState() == ManagerConnectionState.INITIAL + || eventConnection.getState() == ManagerConnectionState.DISCONNECTED) + { + try + { + eventConnection.login(); + } + catch (Exception e) + { + throw new ManagerCommunicationException("Unable to login: " + e.getMessage(), e); + } + } + + channelManager.initialize(); + agentManager.initialize(); + meetMeManager.initialize(); + if (!skipQueues) + { + queueManager.initialize(); + } + + if (asyncEventHandling && managerEventListenerProxy == null) + { + managerEventListenerProxy = new ManagerEventListenerProxy(this); + eventConnection.addEventListener(managerEventListenerProxy); + } + else if (!asyncEventHandling && eventListener == null) + { + eventListener = this; + eventConnection.addEventListener(eventListener); + } + logger.info("Initializing done"); + initialized = true; + } + + /* Implementation of the AsteriskServer interface */ + + public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout) + throws ManagerCommunicationException, NoSuchChannelException + { + return originateToExtension(channel, context, exten, priority, timeout, null, null); + } + + public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, + long timeout, CallerId callerId, Map variables) throws ManagerCommunicationException, + NoSuchChannelException + { + final OriginateAction originateAction; + + originateAction = new OriginateAction(); + originateAction.setChannel(channel); + originateAction.setContext(context); + originateAction.setExten(exten); + originateAction.setPriority(priority); + originateAction.setTimeout(timeout); + if (callerId != null) + { + originateAction.setCallerId(callerId.toString()); + } + originateAction.setVariables(variables); + + return originate(originateAction); + } + + public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout) + throws ManagerCommunicationException, NoSuchChannelException + { + return originateToApplication(channel, application, data, timeout, null, null); + } + + public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout, + CallerId callerId, Map variables) throws ManagerCommunicationException, + NoSuchChannelException + { + final OriginateAction originateAction; + + originateAction = new OriginateAction(); + originateAction.setChannel(channel); + originateAction.setApplication(application); + originateAction.setData(data); + originateAction.setTimeout(timeout); + if (callerId != null) + { + originateAction.setCallerId(callerId.toString()); + } + originateAction.setVariables(variables); + + return originate(originateAction); + } + + public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, + NoSuchChannelException + { + final ResponseEvents responseEvents; + final Iterator responseEventIterator; + String uniqueId; + AsteriskChannel channel = null; + + // must set async to true to receive OriginateEvents. + originateAction.setAsync(Boolean.TRUE); + + initializeIfNeeded(); + + // 2000 ms extra for the OriginateFailureEvent should be fine + responseEvents = sendEventGeneratingAction(originateAction, originateAction.getTimeout() + 2000); + + responseEventIterator = responseEvents.getEvents().iterator(); + if (responseEventIterator.hasNext()) + { + ResponseEvent responseEvent; + + responseEvent = responseEventIterator.next(); + if (responseEvent instanceof OriginateResponseEvent) + { + uniqueId = ((OriginateResponseEvent) responseEvent).getUniqueId(); + logger.debug(responseEvent.getClass().getName() + " received with uniqueId " + uniqueId); + channel = getChannelById(uniqueId); + } + } + + if (channel == null) + { + throw new NoSuchChannelException("Channel '" + originateAction.getChannel() + "' is not available"); + } + + return channel; + } + + public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + OriginateCallback cb) throws ManagerCommunicationException + { + originateToExtensionAsync(channel, context, exten, priority, timeout, null, null, cb); + } + + public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + CallerId callerId, Map variables, OriginateCallback cb) + throws ManagerCommunicationException + { + final OriginateAction originateAction; + + originateAction = new OriginateAction(); + originateAction.setChannel(channel); + originateAction.setContext(context); + originateAction.setExten(exten); + originateAction.setPriority(priority); + originateAction.setTimeout(timeout); + if (callerId != null) + { + originateAction.setCallerId(callerId.toString()); + } + originateAction.setVariables(variables); + + originateAsync(originateAction, cb); + } + + public void originateToApplicationAsync(String channel, String application, String data, long timeout, + OriginateCallback cb) throws ManagerCommunicationException + { + originateToApplicationAsync(channel, application, data, timeout, null, null, cb); + } + + public void originateToApplicationAsync(String channel, String application, String data, long timeout, + CallerId callerId, Map variables, OriginateCallback cb) + throws ManagerCommunicationException + { + final OriginateAction originateAction; + + originateAction = new OriginateAction(); + originateAction.setChannel(channel); + originateAction.setApplication(application); + originateAction.setData(data); + originateAction.setTimeout(timeout); + if (callerId != null) + { + originateAction.setCallerId(callerId.toString()); + } + originateAction.setVariables(variables); + + originateAsync(originateAction, cb); + } + + public void originateAsync(OriginateAction originateAction, OriginateCallback cb) + throws ManagerCommunicationException + { + final Map variables; + final String traceId; + + traceId = ACTION_ID_PREFIX_ORIGINATE + idCounter.getAndIncrement(); + if (originateAction.getVariables() == null) + { + variables = new HashMap(); + } + else + { + variables = new HashMap(originateAction.getVariables()); + } + + // prefix variable name by "__" to enable variable inheritence across + // channels + variables.put("__" + Constants.VARIABLE_TRACE_ID, traceId); + originateAction.setVariables(variables); + + // async must be set to true to receive OriginateEvents. + originateAction.setAsync(Boolean.TRUE); + originateAction.setActionId(traceId); + + if (cb != null) + { + final OriginateCallbackData callbackData; + + callbackData = new OriginateCallbackData(originateAction, DateUtil.getDate(), cb); + // register callback + synchronized (originateCallbacks) + { + originateCallbacks.put(traceId, callbackData); + } + } + + initializeIfNeeded(); + sendActionOnEventConnection(originateAction); + } + + public Collection getChannels() throws ManagerCommunicationException + { + initializeIfNeeded(); + return channelManager.getChannels(); + } + + public AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException + { + initializeIfNeeded(); + return channelManager.getChannelImplByName(name); + } + + public AsteriskChannel getChannelById(String id) throws ManagerCommunicationException + { + initializeIfNeeded(); + return channelManager.getChannelImplById(id); + } + + public Collection getMeetMeRooms() throws ManagerCommunicationException + { + initializeIfNeeded(); + return meetMeManager.getMeetMeRooms(); + } + + public MeetMeRoom getMeetMeRoom(String name) throws ManagerCommunicationException + { + initializeIfNeeded(); + return meetMeManager.getOrCreateRoomImpl(name); + } + + public Collection getQueues() throws ManagerCommunicationException + { + initializeIfNeeded(); + return queueManager.getQueues(); + } + + public synchronized String getVersion() throws ManagerCommunicationException + { + final ManagerResponse response; + final String command; + + initializeIfNeeded(); + if (version == null) + { + if (eventConnection.getVersion().isAtLeast(AsteriskVersion.ASTERISK_1_6)) + { + command = SHOW_VERSION_1_6_COMMAND; + } + else + { + command = SHOW_VERSION_COMMAND; + } + + response = sendAction(new CommandAction(command)); + if (response instanceof CommandResponse) + { + final List result; + + result = ((CommandResponse) response).getResult(); + if (result.size() > 0) + { + version = (String) result.get(0); + } + } + else + { + logger.error("Response to CommandAction(\"" + command + "\") was not a CommandResponse but " + response); + } + } + + return version; + } + + public int[] getVersion(String file) throws ManagerCommunicationException + { + String fileVersion = null; + String[] parts; + int[] intParts; + + initializeIfNeeded(); + if (versions == null) + { + Map map; + ManagerResponse response; + + map = new HashMap(); + try + { + final String command; + + if (eventConnection.getVersion().isAtLeast(AsteriskVersion.ASTERISK_1_6)) + { + command = SHOW_VERSION_FILES_1_6_COMMAND; + } + else + { + command = SHOW_VERSION_FILES_COMMAND; + } + response = sendAction(new CommandAction(command)); + if (response instanceof CommandResponse) + { + List result; + + result = ((CommandResponse) response).getResult(); + for (int i = 2; i < result.size(); i++) + { + String line; + Matcher matcher; + + line = result.get(i); + matcher = SHOW_VERSION_FILES_PATTERN.matcher(line); + if (matcher.find()) + { + String key = matcher.group(1); + String value = matcher.group(2); + + map.put(key, value); } - managerEventListenerProxy.shutdown(); - } - - if (eventConnection != null && eventListener != null) { - eventConnection.removeEventListener(eventListener); - } - - managerEventListenerProxy = null; - eventListener = null; - - if (initialized) {//incredible, but it happened - handleDisconnectEvent(null); - }//i - }//shutdown - - public List getPeerEntries() throws ManagerCommunicationException - { - ResponseEvents responseEvents = sendEventGeneratingAction(new SipPeersAction(), 2000); - List peerEntries = new ArrayList(30); - for (ResponseEvent re : responseEvents.getEvents()) - { - if (re instanceof PeerEntryEvent) - { - peerEntries.add((PeerEntryEvent) re); - } - } - return peerEntries; - } - - public DbGetResponseEvent dbGet(String family, String key) throws ManagerCommunicationException - { - ResponseEvents responseEvents = sendEventGeneratingAction(new DbGetAction(family, key), 2000); - DbGetResponseEvent dbgre = null; - for (ResponseEvent re : responseEvents.getEvents()) - { - dbgre = (DbGetResponseEvent) re; - } - return dbgre; - } - - public void dbDel(String family, String key) throws ManagerCommunicationException - { - // The following only works with BRIStuffed asrterisk: sendAction(new DbDelAction(family,key)); - // Use cli command instead ... - sendAction(new CommandAction("database del " + family + " " + key)); - } - - public void dbPut(String family, String key, String value) throws ManagerCommunicationException - { - sendAction(new DbPutAction(family, key, value)); - } - - public AsteriskChannel getChannelByNameAndActive(String name) throws ManagerCommunicationException - { - initializeIfNeeded(); - return channelManager.getChannelImplByNameAndActive(name); - } - - public Collection getAgents() throws ManagerCommunicationException - { - initializeIfNeeded(); - return agentManager.getAgents(); - } - - void fireNewAgent(AsteriskAgentImpl agent) - { - synchronized (listeners) - { - for (AsteriskServerListener listener : listeners) - { - try - { - listener.onNewAgent(agent); - } - catch (Exception e) - { - logger.warn("Exception in onNewAgent()", e); - } - } - } - } - - void fireNewQueueEntry(AsteriskQueueEntry entry) - { - synchronized (listeners) - { - for (AsteriskServerListener listener : listeners) - { - try - { - listener.onNewQueueEntry(entry); - } - catch (Exception e) - { - logger.warn("Exception in onNewQueueEntry()", e); - } - } - } - } + } + + fileVersion = map.get(file); + versions = map; + } + else + { + logger.error("Response to CommandAction(\"" + command + "\") was not a CommandResponse but " + + response); + } + } + catch (Exception e) + { + logger.warn("Unable to send '" + SHOW_VERSION_FILES_COMMAND + "' command.", e); + } + } + else + { + synchronized (versions) + { + fileVersion = versions.get(file); + } + } + + if (fileVersion == null) + { + return null; + } + + parts = fileVersion.split("\\."); + intParts = new int[parts.length]; + + for (int i = 0; i < parts.length; i++) + { + try + { + intParts[i] = Integer.parseInt(parts[i]); + } + catch (NumberFormatException e) + { + intParts[i] = 0; + } + } + + return intParts; + } + + public String getGlobalVariable(String variable) throws ManagerCommunicationException + { + ManagerResponse response; + String value; + + initializeIfNeeded(); + response = sendAction(new GetVarAction(variable)); + if (response instanceof ManagerError) + { + return null; + } + value = response.getAttribute("Value"); + if (value == null) + { + value = response.getAttribute(variable); // for Asterisk 1.0.x + } + return value; + } + + public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException + { + ManagerResponse response; + + initializeIfNeeded(); + response = sendAction(new SetVarAction(variable, value)); + if (response instanceof ManagerError) + { + logger.error("Unable to set global variable '" + variable + "' to '" + value + "':" + response.getMessage()); + } + } + + public Collection getVoicemailboxes() throws ManagerCommunicationException + { + final Collection voicemailboxes; + ManagerResponse response; + final List result; + + initializeIfNeeded(); + voicemailboxes = new ArrayList(); + if (eventConnection.getVersion().isAtLeast(AsteriskVersion.ASTERISK_1_6)) + { + response = sendAction(new CommandAction(SHOW_VOICEMAIL_USERS_1_6_COMMAND)); + } + else + { + response = sendAction(new CommandAction(SHOW_VOICEMAIL_USERS_COMMAND)); + } + if (!(response instanceof CommandResponse)) + { + logger.error("Response to CommandAction(\"" + SHOW_VOICEMAIL_USERS_COMMAND + + "\") was not a CommandResponse but " + response); + return voicemailboxes; + } + + result = ((CommandResponse) response).getResult(); + if (result == null || result.size() < 1) + { + return voicemailboxes; + } + + // remove headline + result.remove(0); + + for (String line : result) + { + final Matcher matcher; + final Voicemailbox voicemailbox; + final String context; + final String mailbox; + final String user; + + matcher = SHOW_VOICEMAIL_USERS_PATTERN.matcher(line); + if (!matcher.find()) + { + continue; + } + + context = matcher.group(1); + mailbox = matcher.group(2); + user = matcher.group(3).trim(); + + voicemailbox = new Voicemailbox(mailbox, context, user); + voicemailboxes.add(voicemailbox); + } + + // get message count for each mailbox + for (Voicemailbox voicemailbox : voicemailboxes) + { + final String fullname; + + fullname = voicemailbox.getMailbox() + "@" + voicemailbox.getContext(); + response = sendAction(new MailboxCountAction(fullname)); + if (response instanceof MailboxCountResponse) + { + MailboxCountResponse mailboxCountResponse; + + mailboxCountResponse = (MailboxCountResponse) response; + voicemailbox.setNewMessages(mailboxCountResponse.getNewMessages()); + voicemailbox.setOldMessages(mailboxCountResponse.getOldMessages()); + } + else + { + logger.error("Response to MailboxCountAction was not a MailboxCountResponse but " + response); + } + } + + return voicemailboxes; + } + + public List executeCliCommand(String command) throws ManagerCommunicationException + { + final ManagerResponse response; + + initializeIfNeeded(); + response = sendAction(new CommandAction(command)); + if (!(response instanceof CommandResponse)) + { + throw new ManagerCommunicationException("Response to CommandAction(\"" + command + + "\") was not a CommandResponse but " + response, null); + } + + return ((CommandResponse) response).getResult(); + } + + public boolean isModuleLoaded(String module) throws ManagerCommunicationException + { + return sendAction(new ModuleCheckAction(module)) instanceof ModuleCheckResponse; + } + + public void loadModule(String module) throws ManagerCommunicationException + { + sendModuleLoadAction(module, ModuleLoadAction.LOAD_TYPE_LOAD); + } + + public void unloadModule(String module) throws ManagerCommunicationException + { + sendModuleLoadAction(module, ModuleLoadAction.LOAD_TYPE_UNLOAD); + } + + public void reloadModule(String module) throws ManagerCommunicationException + { + sendModuleLoadAction(module, ModuleLoadAction.LOAD_TYPE_RELOAD); + } + + public void reloadAllModules() throws ManagerCommunicationException + { + sendModuleLoadAction(null, ModuleLoadAction.LOAD_TYPE_RELOAD); + } + + protected void sendModuleLoadAction(String module, String loadType) throws ManagerCommunicationException + { + final ManagerResponse response; + + response = sendAction(new ModuleLoadAction(module, loadType)); + if (response instanceof ManagerError) + { + final ManagerError error = (ManagerError) response; + throw new ManagerCommunicationException(error.getMessage(), null); + } + } + + public ConfigFile getConfig(String filename) throws ManagerCommunicationException + { + final ManagerResponse response; + final GetConfigResponse getConfigResponse; + + initializeIfNeeded(); + response = sendAction(new GetConfigAction(filename)); + if (!(response instanceof GetConfigResponse)) + { + throw new ManagerCommunicationException("Response to GetConfigAction(\"" + filename + + "\") was not a CommandResponse but " + response, null); + } + + getConfigResponse = (GetConfigResponse) response; + + final Map> categories = new LinkedHashMap>(); + final Map categoryMap = getConfigResponse.getCategories(); + for (Map.Entry categoryEntry : categoryMap.entrySet()) + { + final List lines; + final Map lineMap = getConfigResponse.getLines(categoryEntry.getKey()); + + if (lineMap == null) + { + lines = new ArrayList(); + } + else + { + lines = new ArrayList(lineMap.values()); + } + + categories.put(categoryEntry.getValue(), lines); + } + + return new ConfigFileImpl(filename, categories); + } + + public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException + { + initializeIfNeeded(); + synchronized (listeners) + { + listeners.add(listener); + } + } + + public void removeAsteriskServerListener(AsteriskServerListener listener) + { + synchronized (listeners) + { + listeners.remove(listener); + } + } + + public void addChainListener(ManagerEventListener chainListener) + { + synchronized (this.chainListeners) + { + if (!this.chainListeners.contains(chainListener)) + this.chainListeners.add(chainListener); + } + + } + + public void removeChainListner(ManagerEventListener chainListener) + { + this.chainListeners.remove(chainListener); + } + + void fireNewAsteriskChannel(AsteriskChannel channel) + { + synchronized (listeners) + { + for (AsteriskServerListener listener : listeners) + { + try + { + listener.onNewAsteriskChannel(channel); + } + catch (Exception e) + { + logger.warn("Exception in onNewAsteriskChannel()", e); + } + } + } + } + + void fireNewMeetMeUser(MeetMeUser user) + { + synchronized (listeners) + { + for (AsteriskServerListener listener : listeners) + { + try + { + listener.onNewMeetMeUser(user); + } + catch (Exception e) + { + logger.warn("Exception in onNewMeetMeUser()", e); + } + } + } + } + + ManagerResponse sendActionOnEventConnection(ManagerAction action) throws ManagerCommunicationException + { + try + { + return eventConnection.sendAction(action); + } + catch (Exception e) + { + throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); + } + } + + ManagerResponse sendAction(ManagerAction action) throws ManagerCommunicationException + { + // return connectionPool.sendAction(action); + try + { + return eventConnection.sendAction(action); + } + catch (Exception e) + { + throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); + } + } + + ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws ManagerCommunicationException + { + // return connectionPool.sendEventGeneratingAction(action); + try + { + return eventConnection.sendEventGeneratingAction(action); + } + catch (Exception e) + { + throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); + } + } + + ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) + throws ManagerCommunicationException + { + // return connectionPool.sendEventGeneratingAction(action, timeout); + try + { + return eventConnection.sendEventGeneratingAction(action, timeout); + } + catch (Exception e) + { + throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); + } + } + + OriginateCallbackData getOriginateCallbackDataByTraceId(String traceId) + { + synchronized (originateCallbacks) + { + return originateCallbacks.get(traceId); + } + } + + /* Implementation of the ManagerEventListener interface */ + + /** + * Handles all events received from the Asterisk server. + *

+ * Events are queued until channels and queues are initialized and then + * delegated to the dispatchEvent method. + */ + public void onManagerEvent(ManagerEvent event) + { + // Handle Channel related events + if (event instanceof ConnectEvent) + { + handleConnectEvent((ConnectEvent) event); + } + else if (event instanceof DisconnectEvent) + { + handleDisconnectEvent((DisconnectEvent) event); + } + else if (event instanceof NewChannelEvent) + { + channelManager.handleNewChannelEvent((NewChannelEvent) event); + } + else if (event instanceof NewExtenEvent) + { + channelManager.handleNewExtenEvent((NewExtenEvent) event); + } + else if (event instanceof NewStateEvent) + { + channelManager.handleNewStateEvent((NewStateEvent) event); + } + else if (event instanceof NewCallerIdEvent) + { + channelManager.handleNewCallerIdEvent((NewCallerIdEvent) event); + } + else if (event instanceof DialEvent) + { + channelManager.handleDialEvent((DialEvent) event); + } + else if (event instanceof BridgeEvent) + { + channelManager.handleBridgeEvent((BridgeEvent) event); + } + else if (event instanceof RenameEvent) + { + channelManager.handleRenameEvent((RenameEvent) event); + } + else if (event instanceof HangupEvent) + { + channelManager.handleHangupEvent((HangupEvent) event); + } + else if (event instanceof CdrEvent) + { + channelManager.handleCdrEvent((CdrEvent) event); + } + else if (event instanceof VarSetEvent) + { + channelManager.handleVarSetEvent((VarSetEvent) event); + } + else if (event instanceof DtmfEvent) + { + channelManager.handleDtmfEvent((DtmfEvent) event); + } + // End of channel related events + // Handle parking related event + else if (event instanceof ParkedCallEvent) + { + channelManager.handleParkedCallEvent((ParkedCallEvent) event); + } + else if (event instanceof ParkedCallGiveUpEvent) + { + channelManager.handleParkedCallGiveUpEvent((ParkedCallGiveUpEvent) event); + } + else if (event instanceof ParkedCallTimeOutEvent) + { + channelManager.handleParkedCallTimeOutEvent((ParkedCallTimeOutEvent) event); + } + else if (event instanceof UnparkedCallEvent) + { + channelManager.handleUnparkedCallEvent((UnparkedCallEvent) event); + } + // End of parking related events + // Handle queue related event + else if (event instanceof JoinEvent) + { + queueManager.handleJoinEvent((JoinEvent) event); + } + else if (event instanceof LeaveEvent) + { + queueManager.handleLeaveEvent((LeaveEvent) event); + } + else if (event instanceof QueueMemberStatusEvent) + { + queueManager.handleQueueMemberStatusEvent((QueueMemberStatusEvent) event); + } + else if (event instanceof QueueMemberPenaltyEvent) + { + queueManager.handleQueueMemberPenaltyEvent((QueueMemberPenaltyEvent) event); + } + else if (event instanceof QueueMemberAddedEvent) + { + queueManager.handleQueueMemberAddedEvent((QueueMemberAddedEvent) event); + } + else if (event instanceof QueueMemberRemovedEvent) + { + queueManager.handleQueueMemberRemovedEvent((QueueMemberRemovedEvent) event); + } + else if (event instanceof QueueMemberPausedEvent) + { + queueManager.handleQueueMemberPausedEvent((QueueMemberPausedEvent) event); + } + // >>>>>> AJ 94 + // Handle meetMeEvents + else if (event instanceof AbstractMeetMeEvent) + { + meetMeManager.handleMeetMeEvent((AbstractMeetMeEvent) event); + } + else if (event instanceof OriginateResponseEvent) + { + handleOriginateEvent((OriginateResponseEvent) event); + } + // Handle agents-related events + else if (event instanceof AgentsEvent) + { + agentManager.handleAgentsEvent((AgentsEvent) event); + } + else if (event instanceof AgentCalledEvent) + { + agentManager.handleAgentCalledEvent((AgentCalledEvent) event); + } + else if (event instanceof AgentConnectEvent) + { + agentManager.handleAgentConnectEvent((AgentConnectEvent) event); + } + else if (event instanceof AgentCompleteEvent) + { + agentManager.handleAgentCompleteEvent((AgentCompleteEvent) event); + } + else if (event instanceof AgentCallbackLoginEvent) + { + agentManager.handleAgentCallbackLoginEvent((AgentCallbackLoginEvent) event); + } + else if (event instanceof AgentCallbackLogoffEvent) + { + agentManager.handleAgentCallbackLogoffEvent((AgentCallbackLogoffEvent) event); + } + else if (event instanceof AgentLoginEvent) + { + agentManager.handleAgentLoginEvent((AgentLoginEvent) event); + } + else if (event instanceof AgentLogoffEvent) + { + agentManager.handleAgentLogoffEvent((AgentLogoffEvent) event); + } + // End of agent-related events + + // dispatch the events to the chainListener if they exist. + fireChainListeners(event); + } + + /** + * dispatch the event to the chainListener if they exist. + * + * @param event + */ + private void fireChainListeners(ManagerEvent event) + { + synchronized (this.chainListeners) + { + for (ManagerEventListener listener : this.chainListeners) + listener.onManagerEvent(event); + } + } + + /* + * Resets the internal state when the connection to the asterisk server is + * lost. + */ + private void handleDisconnectEvent(DisconnectEvent disconnectEvent) + { + // reset version information as it might have changed while Asterisk + // restarted + version = null; + versions = null; + + // same for channels, agents and queues rooms, they are reinitialized + // when reconnected + channelManager.disconnected(); + agentManager.disconnected(); + meetMeManager.disconnected(); + queueManager.disconnected(); + initialized = false; + } + + /* + * Requests the current state from the asterisk server after the connection + * to the asterisk server is restored. + */ + + private void handleConnectEvent(ConnectEvent connectEvent) + { + try + { + initialize(); + } + catch (Exception e) + { + logger.error("Unable to reinitialize state after reconnection", e); + } + } + + private void handleOriginateEvent(OriginateResponseEvent originateEvent) + { + final String traceId; + final OriginateCallbackData callbackData; + final OriginateCallback cb; + final AsteriskChannelImpl channel; + final AsteriskChannelImpl otherChannel; // the other side if local + // channel + + traceId = originateEvent.getActionId(); + if (traceId == null) + { + return; + } + + synchronized (originateCallbacks) + { + callbackData = originateCallbacks.get(traceId); + if (callbackData == null) + { + return; + } + originateCallbacks.remove(traceId); + } + + cb = callbackData.getCallback(); + if (!AstUtil.isNull(originateEvent.getUniqueId())) + { + channel = channelManager.getChannelImplById(originateEvent.getUniqueId()); + } + else + { + channel = callbackData.getChannel(); + } + + try + { + if (channel == null) + { + final LiveException cause; + + cause = new NoSuchChannelException("Channel '" + callbackData.getOriginateAction().getChannel() + + "' is not available"); + cb.onFailure(cause); + return; + } + + if (channel.wasBusy()) + { + cb.onBusy(channel); + return; + } + + otherChannel = channelManager.getOtherSideOfLocalChannel(channel); + // special treatment of local channels: + // the interesting things happen to the other side so we have a look + // at that + if (otherChannel != null) + { + final AsteriskChannel dialedChannel; + + dialedChannel = otherChannel.getDialedChannel(); + + // on busy the other channel is in state busy when we receive + // the originate event + if (otherChannel.wasBusy()) + { + cb.onBusy(channel); + return; + } + + // alternative: + // on busy the dialed channel is hung up when we receive the + // originate event having a look at the hangup cause reveals the + // information we are interested in + // this alternative has the drawback that there might by + // multiple channels that have been dialed by the local channel + // but we only look at the last one. + if (dialedChannel != null && dialedChannel.wasBusy()) + { + cb.onBusy(channel); + return; + } + } + + if (channel.wasInState(ChannelState.DOWN)) + { + cb.onNoAnswer(channel); + return; + } + + // if nothing else matched we asume success + cb.onSuccess(channel); + } + catch (Throwable t) + { + logger.warn("Exception dispatching originate progress", t); + } + } + + @Override + public void shutdown() + { + if (eventConnection != null + && (eventConnection.getState() == ManagerConnectionState.CONNECTED || eventConnection.getState() == ManagerConnectionState.RECONNECTING)) + { + try + { + eventConnection.logoff(); + } + catch (Exception ignore) + { + } + } + + if (managerEventListenerProxy != null) + { + if (eventConnection != null) + { + eventConnection.removeEventListener(managerEventListenerProxy); + } + managerEventListenerProxy.shutdown(); + } + + if (eventConnection != null && eventListener != null) + { + eventConnection.removeEventListener(eventListener); + } + + managerEventListenerProxy = null; + eventListener = null; + + if (initialized) + {// incredible, but it happened + handleDisconnectEvent(null); + }// i + }// shutdown + + public List getPeerEntries() throws ManagerCommunicationException + { + ResponseEvents responseEvents = sendEventGeneratingAction(new SipPeersAction(), 2000); + List peerEntries = new ArrayList(30); + for (ResponseEvent re : responseEvents.getEvents()) + { + if (re instanceof PeerEntryEvent) + { + peerEntries.add((PeerEntryEvent) re); + } + } + return peerEntries; + } + + public DbGetResponseEvent dbGet(String family, String key) throws ManagerCommunicationException + { + ResponseEvents responseEvents = sendEventGeneratingAction(new DbGetAction(family, key), 2000); + DbGetResponseEvent dbgre = null; + for (ResponseEvent re : responseEvents.getEvents()) + { + dbgre = (DbGetResponseEvent) re; + } + return dbgre; + } + + public void dbDel(String family, String key) throws ManagerCommunicationException + { + // The following only works with BRIStuffed asrterisk: sendAction(new + // DbDelAction(family,key)); + // Use cli command instead ... + sendAction(new CommandAction("database del " + family + " " + key)); + } + + public void dbPut(String family, String key, String value) throws ManagerCommunicationException + { + sendAction(new DbPutAction(family, key, value)); + } + + public AsteriskChannel getChannelByNameAndActive(String name) throws ManagerCommunicationException + { + initializeIfNeeded(); + return channelManager.getChannelImplByNameAndActive(name); + } + + public Collection getAgents() throws ManagerCommunicationException + { + initializeIfNeeded(); + return agentManager.getAgents(); + } + + void fireNewAgent(AsteriskAgentImpl agent) + { + synchronized (listeners) + { + for (AsteriskServerListener listener : listeners) + { + try + { + listener.onNewAgent(agent); + } + catch (Exception e) + { + logger.warn("Exception in onNewAgent()", e); + } + } + } + } + + void fireNewQueueEntry(AsteriskQueueEntry entry) + { + synchronized (listeners) + { + for (AsteriskServerListener listener : listeners) + { + try + { + listener.onNewQueueEntry(entry); + } + catch (Exception e) + { + logger.warn("Exception in onNewQueueEntry()", e); + } + } + } + } } From 0a6967553323f7665b75c494cc53adb9948fcbfc Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 16 Jul 2012 09:31:55 +1000 Subject: [PATCH 0021/1055] Removed potential memory leak as listeners where not being removed if an exception was being thrown. --- .../internal/ManagerConnectionImpl.java | 2996 +++++++++-------- 1 file changed, 1518 insertions(+), 1478 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index f2dac8155..d7ada5bc0 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -63,1488 +63,1528 @@ /** * Internal implemention of the ManagerConnection interface. - * + * * @author srt * @version $Id$ * @see org.asteriskjava.manager.ManagerConnectionFactory */ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher { - private static final int RECONNECTION_INTERVAL_1 = 50; - private static final int RECONNECTION_INTERVAL_2 = 5000; - private static final String DEFAULT_HOSTNAME = "localhost"; - private static final int DEFAULT_PORT = 5038; - private static final int RECONNECTION_VERSION_INTERVAL = 500; - private static final int MAX_VERSION_ATTEMPTS = 4; - private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); - - private static final AtomicLong idCounter = new AtomicLong(0); - - /** - * Instance logger. - */ - private final Log logger = LogFactory.getLog(getClass()); - - private final long id; - - /** - * Used to construct the internalActionId. - */ - private AtomicLong actionIdCounter = new AtomicLong(0); - - /* Config attributes */ - /** - * Hostname of the Asterisk server to connect to. - */ - private String hostname = DEFAULT_HOSTNAME; - - /** - * TCP port to connect to. - */ - private int port = DEFAULT_PORT; - - /** - * true to use SSL for the connection, false - * for a plain text connection. - */ - private boolean ssl = false; - - /** - * The username to use for login as defined in Asterisk's - * manager.conf. - */ - protected String username; - - /** - * The password to use for login as defined in Asterisk's - * manager.conf. - */ - protected String password; - - /** - * The default timeout to wait for a ManagerResponse after sending a - * ManagerAction. - */ - private long defaultResponseTimeout = 2000; - - /** - * The default timeout to wait for the last ResponseEvent after sending an - * EventGeneratingAction. - */ - private long defaultEventTimeout = 5000; - - /** - * The timeout to use when connecting the the Asterisk server. - */ - private int socketTimeout = 0; - - /** - * Closes the connection (and reconnects) if no input has been read for the given amount - * of milliseconds. A timeout of zero is interpreted as an infinite timeout. - * - * @see Socket#setSoTimeout(int) - */ - private int socketReadTimeout = 0; - - /** - * true to continue to reconnect after an authentication failure. - */ - private boolean keepAliveAfterAuthenticationFailure = true; - - /** - * The socket to use for TCP/IP communication with Asterisk. - */ - private SocketConnectionFacade socket; - - /** - * The thread that runs the reader. - */ - private Thread readerThread; - private final AtomicLong readerThreadCounter = new AtomicLong(0); - - private final AtomicLong reconnectThreadCounter = new AtomicLong(0); - - /** - * The reader to use to receive events and responses from asterisk. - */ - private ManagerReader reader; - - /** - * The writer to use to send actions to asterisk. - */ - private ManagerWriter writer; - - /** - * The protocol identifer Asterisk sends on connect wrapped into an object - * to be used as mutex. - */ - private final ProtocolIdentifierWrapper protocolIdentifier; - - /** - * The version of the Asterisk server we are connected to. - */ - private AsteriskVersion version; - - /** - * Contains the registered handlers that process the ManagerResponses. - *

- * Key is the internalActionId of the Action sent and value the - * corresponding ResponseListener. - */ - private final Map responseListeners; - - /** - * Contains the event handlers that handle ResponseEvents for the - * sendEventGeneratingAction methods. - *

- * Key is the internalActionId of the Action sent and value the - * corresponding EventHandler. - */ - private final Map responseEventListeners; - - /** - * Contains the event handlers that users registered. - */ - private final List eventListeners; - - protected ManagerConnectionState state = INITIAL; - - private String eventMask; - - /** - * Creates a new instance. - */ - public ManagerConnectionImpl() - { - this.id = idCounter.getAndIncrement(); - this.responseListeners = new HashMap(); - this.responseEventListeners = new HashMap(); - this.eventListeners = new ArrayList(); - this.protocolIdentifier = new ProtocolIdentifierWrapper(); - } - - // the following two methods can be overriden when running test cases to - // return a mock object - protected ManagerReader createReader(Dispatcher dispatcher, Object source) - { - return new ManagerReaderImpl(dispatcher, source); - } - - protected ManagerWriter createWriter() - { - return new ManagerWriterImpl(); - } - - /** - * Sets the hostname of the asterisk server to connect to. - *

- * Default is localhost. - * - * @param hostname the hostname to connect to - */ - public void setHostname(String hostname) - { - this.hostname = hostname; - } - - /** - * Sets the port to use to connect to the asterisk server. This is the port - * specified in asterisk's manager.conf file. - *

- * Default is 5038. - * - * @param port the port to connect to - */ - public void setPort(int port) - { - if (port <= 0) - { - this.port = DEFAULT_PORT; - } - else - { - this.port = port; - } - } - - /** - * Sets whether to use SSL. - *

- * Default is false. - * - * @param ssl true to use SSL for the connection, - * false for a plain text connection. - * @since 0.3 - */ - public void setSsl(boolean ssl) - { - this.ssl = ssl; - } - - /** - * Sets the username to use to connect to the asterisk server. This is the - * username specified in asterisk's manager.conf file. - * - * @param username the username to use for login - */ - public void setUsername(String username) - { - this.username = username; - } - - /** - * Sets the password to use to connect to the asterisk server. This is the - * password specified in Asterisk's manager.conf file. - * - * @param password the password to use for login - */ - public void setPassword(String password) - { - this.password = password; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendAction(ManagerAction)} will wait for a response before - * throwing a TimeoutException. - *

- * Default is 2000. - * - * @param defaultResponseTimeout default response timeout in milliseconds - * @since 0.2 - */ - public void setDefaultResponseTimeout(long defaultResponseTimeout) - { - this.defaultResponseTimeout = defaultResponseTimeout; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a - * response and the last response event before throwing a TimeoutException. - *

- * Default is 5000. - * - * @param defaultEventTimeout default event timeout in milliseconds - * @since 0.2 - */ - public void setDefaultEventTimeout(long defaultEventTimeout) - { - this.defaultEventTimeout = defaultEventTimeout; - } - - /** - * Set to true to try reconnecting to ther asterisk serve - * even if the reconnection attempt threw an AuthenticationFailedException. - *

- * Default is true. - * - * @param keepAliveAfterAuthenticationFailure - * true to try reconnecting to ther asterisk serve - * even if the reconnection attempt threw an AuthenticationFailedException, - * false otherwise. - */ - public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) - { - this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; - } - - /* Implementation of ManagerConnection interface */ - - public String getUsername() - { - return username; - } - - public String getPassword() - { - return password; - } - - public AsteriskVersion getVersion() - { - return version; - } - - public String getHostname() - { - return hostname; - } - - public int getPort() - { - return port; - } - - public boolean isSsl() - { - return ssl; - } - - public InetAddress getLocalAddress() - { - return socket.getLocalAddress(); - } - - public int getLocalPort() - { - return socket.getLocalPort(); - } - - public InetAddress getRemoteAddress() - { - return socket.getRemoteAddress(); - } - - public int getRemotePort() - { - return socket.getRemotePort(); - } - - public void registerUserEventClass(Class userEventClass) - { - if (reader == null) - { - reader = createReader(this, this); - } - - reader.registerEventClass(userEventClass); - } - - public void setSocketTimeout(int socketTimeout) - { - this.socketTimeout = socketTimeout; - } - - public void setSocketReadTimeout(int socketReadTimeout) - { - this.socketReadTimeout = socketReadTimeout; - } - - public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException - { - login(null); - } - - public synchronized void login(String eventMask) throws IOException, AuthenticationFailedException, TimeoutException - { - if (state != INITIAL && state != DISCONNECTED) - { - throw new IllegalStateException("Login may only be perfomed when in state " - + "INITIAL or DISCONNECTED, but connection is in state " + state); - } - - state = CONNECTING; - this.eventMask = eventMask; - try - { - doLogin(defaultResponseTimeout, eventMask); - } - finally - { - if (state != CONNECTED) - { - state = DISCONNECTED; - } - } - } - - /** - * Does the real login, following the steps outlined below. - *

- *

    - *
  1. Connects to the asterisk server by calling {@link #connect()} if not - * already connected - *
  2. Waits until the protocol identifier is received but not longer than - * timeout ms. - *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType - * MD5. - *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} - * is sent using the calculated key (MD5 hash of the password appended to - * the received challenge). - *
- * - * @param timeout the maximum time to wait for the protocol identifier (in - * ms) - * @param eventMask the event mask. Set to "on" if all events should be - * send, "off" if not events should be sent or a combination of - * "system", "call" and "log" (separated by ',') to specify what - * kind of events should be sent. - * @throws IOException if there is an i/o problem. - * @throws AuthenticationFailedException if username or password are - * incorrect and the login action returns an error or if the MD5 - * hash cannot be computed. The connection is closed in this - * case. - * @throws TimeoutException if a timeout occurs while waiting for the - * protocol identifier. The connection is closed in this case. - */ - protected synchronized void doLogin(long timeout, String eventMask) throws IOException, AuthenticationFailedException, - TimeoutException - { - ChallengeAction challengeAction; - ManagerResponse challengeResponse; - String challenge; - String key; - LoginAction loginAction; - ManagerResponse loginResponse; - - if (socket == null) - { - connect(); - } - - synchronized (protocolIdentifier) - { - if (protocolIdentifier.value == null) - { - try - { - protocolIdentifier.wait(timeout); - } - catch (InterruptedException e) // NOPMD - { - Thread.currentThread().interrupt(); - } - } - - if (protocolIdentifier.value == null) - { - disconnect(); - if (reader != null && reader.getTerminationException() != null) - { - throw reader.getTerminationException(); - } - else - { - throw new TimeoutException("Timeout waiting for protocol identifier"); - } - } - } - - challengeAction = new ChallengeAction("MD5"); - try - { - challengeResponse = sendAction(challengeAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send challenge action", e); - } - - if (challengeResponse instanceof ChallengeResponse) - { - challenge = ((ChallengeResponse) challengeResponse).getChallenge(); - } - else - { - disconnect(); - throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " - + challengeResponse.getMessage()); - } - - try - { - MessageDigest md; - - md = MessageDigest.getInstance("MD5"); - if (challenge != null) - { - md.update(challenge.getBytes()); - } - if (password != null) - { - md.update(password.getBytes()); - } - key = ManagerUtil.toHexString(md.digest()); - } - catch (NoSuchAlgorithmException ex) - { - disconnect(); - throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); - } - - loginAction = new LoginAction(username, "MD5", key, eventMask); - try - { - loginResponse = sendAction(loginAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send login action", e); - } - - if (loginResponse instanceof ManagerError) - { - disconnect(); - throw new AuthenticationFailedException(loginResponse.getMessage()); - } - - logger.info("Successfully logged in"); - - version = determineVersion(); - - state = CONNECTED; - - writer.setTargetVersion(version); - - logger.info("Determined Asterisk version: " + version); - - // generate pseudo event indicating a successful login - ConnectEvent connectEvent = new ConnectEvent(this); - connectEvent.setProtocolIdentifier(getProtocolIdentifier()); - connectEvent.setDateReceived(DateUtil.getDate()); - // TODO could this cause a deadlock? - fireEvent(connectEvent); - } - - protected AsteriskVersion determineVersion() throws IOException, TimeoutException - { - int attempts = 0; - -// if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) -// { -// return AsteriskVersion.ASTERISK_1_6; -// } - - while (attempts++ < MAX_VERSION_ATTEMPTS) - { - final ManagerResponse showVersionFilesResponse; - final List showVersionFilesResult; - - // increase timeout as output is quite large - showVersionFilesResponse = sendAction(new CommandAction("show version files pbx.c"), defaultResponseTimeout * 2); - if (!(showVersionFilesResponse instanceof CommandResponse)) - { - // return early in case of permission problems - // org.asteriskjava.manager.response.ManagerError: - // actionId='null'; message='Permission denied'; response='Error'; - // uniqueId='null'; systemHashcode=15231583 - break; - } - - showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); - if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) - { - final String line1; - - line1 = showVersionFilesResult.get(0); - if (line1 != null && line1.startsWith("File")) - { - final String rawVersion; - - rawVersion = getRawVersion(); - if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) - { - return AsteriskVersion.ASTERISK_1_4; - } - return AsteriskVersion.ASTERISK_1_2; - } - else if (line1 != null && line1.contains("No such command")) - { - final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction("core show version"), defaultResponseTimeout * 2); - - if(coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse){ - final List coreShowVersionResult = ((CommandResponse) coreShowVersionResponse).getResult(); - - if(coreShowVersionResult != null && coreShowVersionResult.size() > 0){ - final String coreLine = coreShowVersionResult.get(0); - - if (coreLine != null && coreLine.startsWith("Asterisk 1.6")) - { - return AsteriskVersion.ASTERISK_1_6; - } - else if (coreLine != null && coreLine.startsWith("Asterisk 1.8")) - { - return AsteriskVersion.ASTERISK_1_8; - } - } - } - - try - { - Thread.sleep(RECONNECTION_VERSION_INTERVAL); - } - catch (Exception ex) - { - // ingnore - } // NOPMD - } - else - { - // if it isn't the "no such command", break and return the lowest version immediately - break; - } - } - } - - // as a fallback assume 1.6 - return AsteriskVersion.ASTERISK_1_6; - } - - protected String getRawVersion() - { - final ManagerResponse showVersionResponse; - - try - { - showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); - } - catch (Exception e) - { - return null; - } - - if (showVersionResponse instanceof CommandResponse) - { - final List showVersionResult; - - showVersionResult = ((CommandResponse) showVersionResponse).getResult(); - if (showVersionResult != null && showVersionResult.size() > 0) - { - return showVersionResult.get(0); - } - } - - return null; - } - - protected synchronized void connect() throws IOException - { - logger.info("Connecting to " + hostname + ":" + port); - - if (reader == null) - { - logger.debug("Creating reader for " + hostname + ":" + port); - reader = createReader(this, this); - } - - if (writer == null) - { - logger.debug("Creating writer"); - writer = createWriter(); - } - - logger.debug("Creating socket"); - socket = createSocket(); - - logger.debug("Passing socket to reader"); - reader.setSocket(socket); - - if (readerThread == null || !readerThread.isAlive() || reader.isDead()) - { - logger.debug("Creating and starting reader thread"); - readerThread = new Thread(reader); - readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" - + readerThreadCounter.getAndIncrement()); - readerThread.setDaemon(true); - readerThread.start(); - } - - logger.debug("Passing socket to writer"); - writer.setSocket(socket); - } - - protected SocketConnectionFacade createSocket() throws IOException - { - return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); - } - - public synchronized void logoff() throws IllegalStateException - { - if (state != CONNECTED && state != RECONNECTING) - { - throw new IllegalStateException("Logoff may only be perfomed when in state " - + "CONNECTED or RECONNECTING, but connection is in state " + state); - } - - state = DISCONNECTING; - - if (socket != null) - { - try - { - sendAction(new LogoffAction()); - } - catch (Exception e) - { - logger.warn("Unable to send LogOff action", e); - } - } - cleanup(); - state = DISCONNECTED; - } - - /** - * Closes the socket connection. - */ - protected synchronized void disconnect() - { - if (socket != null) - { - logger.info("Closing socket."); - try - { - socket.close(); - } - catch (IOException ex) - { - logger.warn("Unable to close socket: " + ex.getMessage()); - } - socket = null; - } - protocolIdentifier.value = null; - } - - public ManagerResponse sendAction(ManagerAction action) throws IOException, TimeoutException, IllegalArgumentException, - IllegalStateException - { - return sendAction(action, defaultResponseTimeout); - } - - /* - * Implements synchronous sending of "simple" actions. - */ - public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, - IllegalArgumentException, IllegalStateException - { - ResponseHandlerResult result; - SendActionCallback callbackHandler; - - result = new ResponseHandlerResult(); - callbackHandler = new DefaultSendActionCallback(result); - - synchronized (result) - { - sendAction(action, callbackHandler); - - // definitely return null for the response of user events - if (action instanceof UserEventAction) - { - return null; - } - - // only wait if we did not yet receive the response. - // Responses may be returned really fast. - if (result.getResponse() == null) - { - try - { - result.wait(timeout); - } - catch (InterruptedException ex) - { - logger.warn("Interrupted while waiting for result"); - Thread.currentThread().interrupt(); - } - } - } - - // still no response? - if (result.getResponse() == null) - { - throw new TimeoutException("Timeout waiting for response to " + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); - } - - return result.getResponse(); - } - - public void sendAction(ManagerAction action, SendActionCallback callback) throws IOException, IllegalArgumentException, - IllegalStateException - { - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - - // In general sending actions is only allowed while connected, though - // there are a few exceptions, these are handled here: - if ((state == CONNECTING || state == RECONNECTING) - && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) - { - // when (re-)connecting challenge and login actions are ok. - } // NOPMD - else if (state == DISCONNECTING && action instanceof LogoffAction) - { - // when disconnecting logoff action is ok. - } // NOPMD - else if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED, but connection is in state " + state); - } - - if (socket == null) - { - throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); - } - - internalActionId = createInternalActionId(); - - // if the callbackHandler is null the user is obviously not interested - // in the response, thats fine. - if (callback != null) - { - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, callback); - } - } - - Class responseClass = getExpectedResponseClass(action.getClass()); - if (responseClass != null) - { - reader.expectResponseClass(internalActionId, responseClass); - } - - writer.sendAction(action, internalActionId); - } - - boolean isShowVersionCommandAction(ManagerAction action) - { - if (! (action instanceof CommandAction)) { - return false; - } - final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction)action).getCommand()); - return showVersionMatcher.matches(); - } - - private Class getExpectedResponseClass(Class actionClass) - { - final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); - if (annotation == null) - { - return null; - } - - return annotation.value(); - } - - public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws IOException, EventTimeoutException, - IllegalArgumentException, IllegalStateException - { - return sendEventGeneratingAction(action, defaultEventTimeout); - } - - /* - * Implements synchronous sending of event generating actions. - */ - public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, - EventTimeoutException, IllegalArgumentException, IllegalStateException - { - final ResponseEventsImpl responseEvents; - final ResponseEventHandler responseEventHandler; - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - else if (action.getActionCompleteEventClass() == null) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " - + action.getClass().getName() + " is null."); - } - else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" - + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() - + " is not a ResponseEvent."); - } - - if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED but connection is in state " + state); - } - - responseEvents = new ResponseEventsImpl(); - responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); - - internalActionId = createInternalActionId(); - - // register response handler... - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, responseEventHandler); - } - - // ...and event handler. - synchronized (this.responseEventListeners) - { - this.responseEventListeners.put(internalActionId, responseEventHandler); - } - - synchronized (responseEvents) - { - writer.sendAction(action, internalActionId); - // only wait if response has not yet arrived. - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - try - { - responseEvents.wait(timeout); - } - catch (InterruptedException e) - { - logger.warn("Interrupted while waiting for response events."); - Thread.currentThread().interrupt(); - } - } - } - - // still no response or not all events received and timed out? - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - // clean up - synchronized (this.responseEventListeners) - { - this.responseEventListeners.remove(internalActionId); - } - - throw new EventTimeoutException("Timeout waiting for response or response events to " + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), responseEvents); - } - - // remove the event handler - // Note: The response handler has already been removed - // when the response was received - synchronized (this.responseEventListeners) - { - this.responseEventListeners.remove(internalActionId); - } - - return responseEvents; - } - - /** - * Creates a new unique internal action id based on the hash code of this - * connection and a sequence. - * - * @return a new internal action id - * @see ManagerUtil#addInternalActionId(String,String) - * @see ManagerUtil#getInternalActionId(String) - * @see ManagerUtil#stripInternalActionId(String) - */ - private String createInternalActionId() - { - final StringBuffer sb; - - sb = new StringBuffer(); - sb.append(this.hashCode()); - sb.append("_"); - sb.append(actionIdCounter.getAndIncrement()); - - return sb.toString(); - } - - public void addEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - // only add it if its not already there - if (!this.eventListeners.contains(listener)) - { - this.eventListeners.add(listener); - } - } - } - - public void removeEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - if (this.eventListeners.contains(listener)) - { - this.eventListeners.remove(listener); - } - } - } - - public String getProtocolIdentifier() - { - return protocolIdentifier.value; - } - - public ManagerConnectionState getState() - { - return state; - } - - /* Implementation of Dispatcher: callbacks for ManagerReader */ - - /** - * This method is called by the reader whenever a {@link ManagerResponse} is - * received. The response is dispatched to the associated - * {@link SendActionCallback}. - * - * @param response the response received by the reader - * @see ManagerReader - */ - public void dispatchResponse(ManagerResponse response) - { - final String actionId; - String internalActionId; - SendActionCallback listener; - - // shouldn't happen - if (response == null) - { - logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); - return; - } - - actionId = response.getActionId(); - internalActionId = null; - listener = null; - - if (actionId != null) - { - internalActionId = ManagerUtil.getInternalActionId(actionId); - response.setActionId(ManagerUtil.stripInternalActionId(actionId)); - } - - logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); - - if (internalActionId != null) - { - synchronized (this.responseListeners) - { - listener = responseListeners.get(internalActionId); - if (listener != null) - { - this.responseListeners.remove(internalActionId); - } - else - { - // when using the async sendAction it's ok not to register a - // callback so if we don't find a response handler thats ok - logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); - } - } - } - else - { - logger.error("Unable to retrieve internalActionId from response: " + "actionId '" + actionId + "':\n" + response); - } - - if (listener != null) - { - try - { - listener.onResponse(response); - } - catch (Exception e) - { - logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); - } - } - } - - /** - * This method is called by the reader whenever a ManagerEvent is received. - * The event is dispatched to all registered ManagerEventHandlers. - * - * @param event the event received by the reader - * @see #addEventListener(ManagerEventListener) - * @see #removeEventListener(ManagerEventListener) - * @see ManagerReader - */ - public void dispatchEvent(ManagerEvent event) - { - // shouldn't happen - if (event == null) - { - logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); - return; - } - - logger.debug("Dispatching event:\n" + event.toString()); - - // Some events need special treatment besides forwarding them to the - // registered eventListeners (clients) - // These events are handled here at first: - - // Dispatch ResponseEvents to the appropriate responseEventListener - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - String internalActionId; - - responseEvent = (ResponseEvent) event; - internalActionId = responseEvent.getInternalActionId(); - if (internalActionId != null) - { - synchronized (responseEventListeners) - { - ManagerEventListener listener; - - listener = responseEventListeners.get(internalActionId); - if (listener != null) - { - try - { - listener.onManagerEvent(event); - } - catch (Exception e) - { - logger.warn("Unexpected exception in response event listener " + listener.getClass().getName(), - e); - } - } - } - } - else - { - // ResponseEvent without internalActionId: - // this happens if the same event class is used as response - // event - // and as an event that is not triggered by a Manager command - // Example: QueueMemberStatusEvent. - // logger.debug("ResponseEvent without " - // + "internalActionId:\n" + responseEvent); - } // NOPMD - } - if (event instanceof DisconnectEvent) - { - // When we receive get disconnected while we are connected start - // a new reconnect thread and set the state to RECONNECTING. - if (state == CONNECTED) - { - state = RECONNECTING; - // close socket if still open and remove reference to - // readerThread - // After sending the DisconnectThread that thread will die - // anyway. - cleanup(); - Thread reconnectThread = new Thread(new Runnable() - { - public void run() - { - reconnect(); - } - }); - reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" - + reconnectThreadCounter.getAndIncrement()); - reconnectThread.setDaemon(true); - reconnectThread.start(); - // now the DisconnectEvent is dispatched to registered - // eventListeners - // (clients) and after that the ManagerReaderThread is gone. - // So effectively we replaced the reader thread by a - // ReconnectThread. - } - else - { - // when we receive a DisconnectEvent while not connected we - // ignore it and do not send it to clients - return; - } - } - if (event instanceof ProtocolIdentifierReceivedEvent) - { - ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; - String protocolIdentifier; - - protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; - protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); - setProtocolIdentifier(protocolIdentifier); - // no need to send this event to clients - return; - } - - fireEvent(event); - } - - /** - * Notifies all {@link ManagerEventListener}s registered by users. - * - * @param event the event to propagate - */ - private void fireEvent(ManagerEvent event) - { - synchronized (eventListeners) - { - for (ManagerEventListener listener : eventListeners) - { - try - { - listener.onManagerEvent(event); - } - catch (RuntimeException e) - { - logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); - } - } - } - } - - /** - * This method is called when a {@link ProtocolIdentifierReceivedEvent} is - * received from the reader. Having received a correct protocol identifier - * is the precodition for logging in. - * - * @param identifier the protocol version used by the Asterisk server. - */ - private void setProtocolIdentifier(final String identifier) - { - logger.info("Connected via " + identifier); - - if (!"Asterisk Call Manager/1.0".equals(identifier) - && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk 1.6 - && !"Asterisk Call Manager/1.2".equals(identifier) // bri stuffed - && !"OpenPBX Call Manager/1.0".equals(identifier) - && !"CallWeaver Call Manager/1.0".equals(identifier) - && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) - { - logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); - } - - synchronized (protocolIdentifier) - { - protocolIdentifier.value = identifier; - protocolIdentifier.notifyAll(); - } - } - - /** - * Reconnects to the asterisk server when the connection is lost. - *

- * While keepAlive is true we will try to reconnect. - * Reconnection attempts will be stopped when the {@link #logoff()} method - * is called or when the login after a successful reconnect results in an - * {@link AuthenticationFailedException} suggesting that the manager - * credentials have changed and keepAliveAfterAuthenticationFailure is not - * set. - *

- * This method is called when a {@link DisconnectEvent} is received from the - * reader. - */ - private void reconnect() - { - int numTries; - - // try to reconnect - numTries = 0; - while (state == RECONNECTING) - { - try - { - if (numTries < 10) - { - // try to reconnect quite fast for the firt 10 times - // this succeeds if the server has just been restarted - Thread.sleep(RECONNECTION_INTERVAL_1); - } - else - { - // slow down after 10 unsuccessful attempts asuming a - // shutdown of the server - Thread.sleep(RECONNECTION_INTERVAL_2); - } - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - } - - try - { - connect(); - - try - { - doLogin(defaultResponseTimeout, eventMask); - logger.info("Successfully reconnected."); - // everything is ok again, so we leave - // when successful doLogin set the state to CONNECTED so no - // need to adjust it - break; - } - catch (AuthenticationFailedException e1) - { - if (keepAliveAfterAuthenticationFailure) - { - logger.error("Unable to log in after reconnect: " + e1.getMessage()); - } - else - { - logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); - state = DISCONNECTED; - } - } - catch (TimeoutException e1) - { - // shouldn't happen - but happens! - logger.error("TimeoutException while trying to log in " + "after reconnect."); - } - } - catch (IOException e) - { - // server seems to be still down, just continue to attempt - // reconnection - logger.warn("Exception while trying to reconnect: " + e.getMessage()); - } - numTries++; - } - } - - private void cleanup() - { - disconnect(); - this.readerThread = null; - } - - @Override - public String toString() - { - StringBuffer sb; - - sb = new StringBuffer("ManagerConnection["); - sb.append("id='").append(id).append("',"); - sb.append("hostname='").append(hostname).append("',"); - sb.append("port=").append(port).append(","); - sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); - - return sb.toString(); - } - - /* Helper classes */ - - /** - * A simple data object to store a ManagerResult. - */ - private static class ResponseHandlerResult implements Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 7831097958568769220L; - private ManagerResponse response; - - public ResponseHandlerResult() - { - } - - public ManagerResponse getResponse() - { - return this.response; - } - - public void setResponse(ManagerResponse response) - { - this.response = response; - } - } - - /** - * A simple response handler that stores the received response in a - * ResponseHandlerResult for further processing. - */ - private static class DefaultSendActionCallback implements SendActionCallback, Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 2926598671855316803L; - private final ResponseHandlerResult result; - - /** - * Creates a new instance. - * - * @param result the result to store the response in - */ - public DefaultSendActionCallback(ResponseHandlerResult result) - { - this.result = result; - } - - public void onResponse(ManagerResponse response) - { - synchronized (result) - { - result.setResponse(response); - result.notifyAll(); - } - } - } - - /** - * A combinded event and response handler that adds received events and the - * response to a ResponseEvents object. - */ - private static class ResponseEventHandler implements ManagerEventListener, SendActionCallback - { - private final ResponseEventsImpl events; - private final Class actionCompleteEventClass; - - /** - * Creates a new instance. - * - * @param events the ResponseEventsImpl to store the events in - * @param actionCompleteEventClass the type of event that indicates that - * all events have been received - */ - public ResponseEventHandler(ResponseEventsImpl events, Class actionCompleteEventClass) - { - this.events = events; - this.actionCompleteEventClass = actionCompleteEventClass; - } - - public void onManagerEvent(ManagerEvent event) - { - synchronized (events) - { - // should always be a ResponseEvent, anyway... - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - - responseEvent = (ResponseEvent) event; - events.addEvent(responseEvent); - } - - // finished? - if (actionCompleteEventClass.isAssignableFrom(event.getClass())) - { - events.setComplete(true); - // notify if action complete event and response have been - // received - if (events.getResponse() != null) - { - events.notifyAll(); - } - } - } - } - - public void onResponse(ManagerResponse response) - { - synchronized (events) - { - events.setRepsonse(response); - if (response instanceof ManagerError) - { - events.setComplete(true); - } - - // finished? - // notify if action complete event and response have been - // received - if (events.isComplete()) - { - events.notifyAll(); - } - } - } - } - - private static class ProtocolIdentifierWrapper - { - String value; - } + private static final int RECONNECTION_INTERVAL_1 = 50; + private static final int RECONNECTION_INTERVAL_2 = 5000; + private static final String DEFAULT_HOSTNAME = "localhost"; + private static final int DEFAULT_PORT = 5038; + private static final int RECONNECTION_VERSION_INTERVAL = 500; + private static final int MAX_VERSION_ATTEMPTS = 4; + private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); + + private static final AtomicLong idCounter = new AtomicLong(0); + + /** + * Instance logger. + */ + private final Log logger = LogFactory.getLog(getClass()); + + private final long id; + + /** + * Used to construct the internalActionId. + */ + private AtomicLong actionIdCounter = new AtomicLong(0); + + /* Config attributes */ + /** + * Hostname of the Asterisk server to connect to. + */ + private String hostname = DEFAULT_HOSTNAME; + + /** + * TCP port to connect to. + */ + private int port = DEFAULT_PORT; + + /** + * true to use SSL for the connection, false for a + * plain text connection. + */ + private boolean ssl = false; + + /** + * The username to use for login as defined in Asterisk's + * manager.conf. + */ + protected String username; + + /** + * The password to use for login as defined in Asterisk's + * manager.conf. + */ + protected String password; + + /** + * The default timeout to wait for a ManagerResponse after sending a + * ManagerAction. + */ + private long defaultResponseTimeout = 2000; + + /** + * The default timeout to wait for the last ResponseEvent after sending an + * EventGeneratingAction. + */ + private long defaultEventTimeout = 5000; + + /** + * The timeout to use when connecting the the Asterisk server. + */ + private int socketTimeout = 0; + + /** + * Closes the connection (and reconnects) if no input has been read for the + * given amount of milliseconds. A timeout of zero is interpreted as an + * infinite timeout. + * + * @see Socket#setSoTimeout(int) + */ + private int socketReadTimeout = 0; + + /** + * true to continue to reconnect after an authentication + * failure. + */ + private boolean keepAliveAfterAuthenticationFailure = true; + + /** + * The socket to use for TCP/IP communication with Asterisk. + */ + private SocketConnectionFacade socket; + + /** + * The thread that runs the reader. + */ + private Thread readerThread; + private final AtomicLong readerThreadCounter = new AtomicLong(0); + + private final AtomicLong reconnectThreadCounter = new AtomicLong(0); + + /** + * The reader to use to receive events and responses from asterisk. + */ + private ManagerReader reader; + + /** + * The writer to use to send actions to asterisk. + */ + private ManagerWriter writer; + + /** + * The protocol identifer Asterisk sends on connect wrapped into an object + * to be used as mutex. + */ + private final ProtocolIdentifierWrapper protocolIdentifier; + + /** + * The version of the Asterisk server we are connected to. + */ + private AsteriskVersion version; + + /** + * Contains the registered handlers that process the ManagerResponses. + *

+ * Key is the internalActionId of the Action sent and value the + * corresponding ResponseListener. + */ + private final Map responseListeners; + + /** + * Contains the event handlers that handle ResponseEvents for the + * sendEventGeneratingAction methods. + *

+ * Key is the internalActionId of the Action sent and value the + * corresponding EventHandler. + */ + private final Map responseEventListeners; + + /** + * Contains the event handlers that users registered. + */ + private final List eventListeners; + + protected ManagerConnectionState state = INITIAL; + + private String eventMask; + + /** + * Creates a new instance. + */ + public ManagerConnectionImpl() + { + this.id = idCounter.getAndIncrement(); + this.responseListeners = new HashMap(); + this.responseEventListeners = new HashMap(); + this.eventListeners = new ArrayList(); + this.protocolIdentifier = new ProtocolIdentifierWrapper(); + } + + // the following two methods can be overriden when running test cases to + // return a mock object + protected ManagerReader createReader(Dispatcher dispatcher, Object source) + { + return new ManagerReaderImpl(dispatcher, source); + } + + protected ManagerWriter createWriter() + { + return new ManagerWriterImpl(); + } + + /** + * Sets the hostname of the asterisk server to connect to. + *

+ * Default is localhost. + * + * @param hostname + * the hostname to connect to + */ + public void setHostname(String hostname) + { + this.hostname = hostname; + } + + /** + * Sets the port to use to connect to the asterisk server. This is the port + * specified in asterisk's manager.conf file. + *

+ * Default is 5038. + * + * @param port + * the port to connect to + */ + public void setPort(int port) + { + if (port <= 0) + { + this.port = DEFAULT_PORT; + } + else + { + this.port = port; + } + } + + /** + * Sets whether to use SSL. + *

+ * Default is false. + * + * @param ssl + * true to use SSL for the connection, + * false for a plain text connection. + * @since 0.3 + */ + public void setSsl(boolean ssl) + { + this.ssl = ssl; + } + + /** + * Sets the username to use to connect to the asterisk server. This is the + * username specified in asterisk's manager.conf file. + * + * @param username + * the username to use for login + */ + public void setUsername(String username) + { + this.username = username; + } + + /** + * Sets the password to use to connect to the asterisk server. This is the + * password specified in Asterisk's manager.conf file. + * + * @param password + * the password to use for login + */ + public void setPassword(String password) + { + this.password = password; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendAction(ManagerAction)} will wait for a response before + * throwing a TimeoutException. + *

+ * Default is 2000. + * + * @param defaultResponseTimeout + * default response timeout in milliseconds + * @since 0.2 + */ + public void setDefaultResponseTimeout(long defaultResponseTimeout) + { + this.defaultResponseTimeout = defaultResponseTimeout; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a + * response and the last response event before throwing a TimeoutException. + *

+ * Default is 5000. + * + * @param defaultEventTimeout + * default event timeout in milliseconds + * @since 0.2 + */ + public void setDefaultEventTimeout(long defaultEventTimeout) + { + this.defaultEventTimeout = defaultEventTimeout; + } + + /** + * Set to true to try reconnecting to ther asterisk serve even + * if the reconnection attempt threw an AuthenticationFailedException. + *

+ * Default is true. + * + * @param keepAliveAfterAuthenticationFailure + * true to try reconnecting to ther asterisk serve + * even if the reconnection attempt threw an + * AuthenticationFailedException, false otherwise. + */ + public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) + { + this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; + } + + /* Implementation of ManagerConnection interface */ + + public String getUsername() + { + return username; + } + + public String getPassword() + { + return password; + } + + public AsteriskVersion getVersion() + { + return version; + } + + public String getHostname() + { + return hostname; + } + + public int getPort() + { + return port; + } + + public boolean isSsl() + { + return ssl; + } + + public InetAddress getLocalAddress() + { + return socket.getLocalAddress(); + } + + public int getLocalPort() + { + return socket.getLocalPort(); + } + + public InetAddress getRemoteAddress() + { + return socket.getRemoteAddress(); + } + + public int getRemotePort() + { + return socket.getRemotePort(); + } + + public void registerUserEventClass(Class userEventClass) + { + if (reader == null) + { + reader = createReader(this, this); + } + + reader.registerEventClass(userEventClass); + } + + public void setSocketTimeout(int socketTimeout) + { + this.socketTimeout = socketTimeout; + } + + public void setSocketReadTimeout(int socketReadTimeout) + { + this.socketReadTimeout = socketReadTimeout; + } + + public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException + { + login(null); + } + + public synchronized void login(String eventMask) throws IOException, AuthenticationFailedException, + TimeoutException + { + if (state != INITIAL && state != DISCONNECTED) + { + throw new IllegalStateException("Login may only be perfomed when in state " + + "INITIAL or DISCONNECTED, but connection is in state " + state); + } + + state = CONNECTING; + this.eventMask = eventMask; + try + { + doLogin(defaultResponseTimeout, eventMask); + } + finally + { + if (state != CONNECTED) + { + state = DISCONNECTED; + } + } + } + + /** + * Does the real login, following the steps outlined below. + *

+ *

    + *
  1. Connects to the asterisk server by calling {@link #connect()} if not + * already connected + *
  2. Waits until the protocol identifier is received but not longer than + * timeout ms. + *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType + * MD5. + *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} + * is sent using the calculated key (MD5 hash of the password appended to + * the received challenge). + *
+ * + * @param timeout + * the maximum time to wait for the protocol identifier (in ms) + * @param eventMask + * the event mask. Set to "on" if all events should be send, + * "off" if not events should be sent or a combination of + * "system", "call" and "log" (separated by ',') to specify what + * kind of events should be sent. + * @throws IOException + * if there is an i/o problem. + * @throws AuthenticationFailedException + * if username or password are incorrect and the login action + * returns an error or if the MD5 hash cannot be computed. The + * connection is closed in this case. + * @throws TimeoutException + * if a timeout occurs while waiting for the protocol + * identifier. The connection is closed in this case. + */ + protected synchronized void doLogin(long timeout, String eventMask) throws IOException, + AuthenticationFailedException, TimeoutException + { + ChallengeAction challengeAction; + ManagerResponse challengeResponse; + String challenge; + String key; + LoginAction loginAction; + ManagerResponse loginResponse; + + if (socket == null) + { + connect(); + } + + synchronized (protocolIdentifier) + { + if (protocolIdentifier.value == null) + { + try + { + protocolIdentifier.wait(timeout); + } + catch (InterruptedException e) // NOPMD + { + Thread.currentThread().interrupt(); + } + } + + if (protocolIdentifier.value == null) + { + disconnect(); + if (reader != null && reader.getTerminationException() != null) + { + throw reader.getTerminationException(); + } + else + { + throw new TimeoutException("Timeout waiting for protocol identifier"); + } + } + } + + challengeAction = new ChallengeAction("MD5"); + try + { + challengeResponse = sendAction(challengeAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send challenge action", e); + } + + if (challengeResponse instanceof ChallengeResponse) + { + challenge = ((ChallengeResponse) challengeResponse).getChallenge(); + } + else + { + disconnect(); + throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " + + challengeResponse.getMessage()); + } + + try + { + MessageDigest md; + + md = MessageDigest.getInstance("MD5"); + if (challenge != null) + { + md.update(challenge.getBytes()); + } + if (password != null) + { + md.update(password.getBytes()); + } + key = ManagerUtil.toHexString(md.digest()); + } + catch (NoSuchAlgorithmException ex) + { + disconnect(); + throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); + } + + loginAction = new LoginAction(username, "MD5", key, eventMask); + try + { + loginResponse = sendAction(loginAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send login action", e); + } + + if (loginResponse instanceof ManagerError) + { + disconnect(); + throw new AuthenticationFailedException(loginResponse.getMessage()); + } + + logger.info("Successfully logged in"); + + version = determineVersion(); + + state = CONNECTED; + + writer.setTargetVersion(version); + + logger.info("Determined Asterisk version: " + version); + + // generate pseudo event indicating a successful login + ConnectEvent connectEvent = new ConnectEvent(this); + connectEvent.setProtocolIdentifier(getProtocolIdentifier()); + connectEvent.setDateReceived(DateUtil.getDate()); + // TODO could this cause a deadlock? + fireEvent(connectEvent); + } + + protected AsteriskVersion determineVersion() throws IOException, TimeoutException + { + int attempts = 0; + + // if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) + // { + // return AsteriskVersion.ASTERISK_1_6; + // } + + while (attempts++ < MAX_VERSION_ATTEMPTS) + { + final ManagerResponse showVersionFilesResponse; + final List showVersionFilesResult; + + // increase timeout as output is quite large + showVersionFilesResponse = sendAction(new CommandAction("show version files pbx.c"), + defaultResponseTimeout * 2); + if (!(showVersionFilesResponse instanceof CommandResponse)) + { + // return early in case of permission problems + // org.asteriskjava.manager.response.ManagerError: + // actionId='null'; message='Permission denied'; + // response='Error'; + // uniqueId='null'; systemHashcode=15231583 + break; + } + + showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); + if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) + { + final String line1; + + line1 = showVersionFilesResult.get(0); + if (line1 != null && line1.startsWith("File")) + { + final String rawVersion; + + rawVersion = getRawVersion(); + if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) + { + return AsteriskVersion.ASTERISK_1_4; + } + return AsteriskVersion.ASTERISK_1_2; + } + else if (line1 != null && line1.contains("No such command")) + { + final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction("core show version"), + defaultResponseTimeout * 2); + + if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) + { + final List coreShowVersionResult = ((CommandResponse) coreShowVersionResponse) + .getResult(); + + if (coreShowVersionResult != null && coreShowVersionResult.size() > 0) + { + final String coreLine = coreShowVersionResult.get(0); + + if (coreLine != null && coreLine.startsWith("Asterisk 1.6")) + { + return AsteriskVersion.ASTERISK_1_6; + } + else if (coreLine != null && coreLine.startsWith("Asterisk 1.8")) + { + return AsteriskVersion.ASTERISK_1_8; + } + } + } + + try + { + Thread.sleep(RECONNECTION_VERSION_INTERVAL); + } + catch (Exception ex) + { + // ingnore + } // NOPMD + } + else + { + // if it isn't the "no such command", break and return the + // lowest version immediately + break; + } + } + } + + // as a fallback assume 1.6 + return AsteriskVersion.ASTERISK_1_6; + } + + protected String getRawVersion() + { + final ManagerResponse showVersionResponse; + + try + { + showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); + } + catch (Exception e) + { + return null; + } + + if (showVersionResponse instanceof CommandResponse) + { + final List showVersionResult; + + showVersionResult = ((CommandResponse) showVersionResponse).getResult(); + if (showVersionResult != null && showVersionResult.size() > 0) + { + return showVersionResult.get(0); + } + } + + return null; + } + + protected synchronized void connect() throws IOException + { + logger.info("Connecting to " + hostname + ":" + port); + + if (reader == null) + { + logger.debug("Creating reader for " + hostname + ":" + port); + reader = createReader(this, this); + } + + if (writer == null) + { + logger.debug("Creating writer"); + writer = createWriter(); + } + + logger.debug("Creating socket"); + socket = createSocket(); + + logger.debug("Passing socket to reader"); + reader.setSocket(socket); + + if (readerThread == null || !readerThread.isAlive() || reader.isDead()) + { + logger.debug("Creating and starting reader thread"); + readerThread = new Thread(reader); + readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" + + readerThreadCounter.getAndIncrement()); + readerThread.setDaemon(true); + readerThread.start(); + } + + logger.debug("Passing socket to writer"); + writer.setSocket(socket); + } + + protected SocketConnectionFacade createSocket() throws IOException + { + return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); + } + + public synchronized void logoff() throws IllegalStateException + { + if (state != CONNECTED && state != RECONNECTING) + { + throw new IllegalStateException("Logoff may only be perfomed when in state " + + "CONNECTED or RECONNECTING, but connection is in state " + state); + } + + state = DISCONNECTING; + + if (socket != null) + { + try + { + sendAction(new LogoffAction()); + } + catch (Exception e) + { + logger.warn("Unable to send LogOff action", e); + } + } + cleanup(); + state = DISCONNECTED; + } + + /** + * Closes the socket connection. + */ + protected synchronized void disconnect() + { + if (socket != null) + { + logger.info("Closing socket."); + try + { + socket.close(); + } + catch (IOException ex) + { + logger.warn("Unable to close socket: " + ex.getMessage()); + } + socket = null; + } + protocolIdentifier.value = null; + } + + public ManagerResponse sendAction(ManagerAction action) throws IOException, TimeoutException, + IllegalArgumentException, IllegalStateException + { + return sendAction(action, defaultResponseTimeout); + } + + /* + * Implements synchronous sending of "simple" actions. + */ + public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, + IllegalArgumentException, IllegalStateException + { + ResponseHandlerResult result; + SendActionCallback callbackHandler; + + result = new ResponseHandlerResult(); + callbackHandler = new DefaultSendActionCallback(result); + + synchronized (result) + { + sendAction(action, callbackHandler); + + // definitely return null for the response of user events + if (action instanceof UserEventAction) + { + return null; + } + + // only wait if we did not yet receive the response. + // Responses may be returned really fast. + if (result.getResponse() == null) + { + try + { + result.wait(timeout); + } + catch (InterruptedException ex) + { + logger.warn("Interrupted while waiting for result"); + Thread.currentThread().interrupt(); + } + } + } + + // still no response? + if (result.getResponse() == null) + { + throw new TimeoutException("Timeout waiting for response to " + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); + } + + return result.getResponse(); + } + + public void sendAction(ManagerAction action, SendActionCallback callback) throws IOException, + IllegalArgumentException, IllegalStateException + { + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + + // In general sending actions is only allowed while connected, though + // there are a few exceptions, these are handled here: + if ((state == CONNECTING || state == RECONNECTING) + && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) + { + // when (re-)connecting challenge and login actions are ok. + } // NOPMD + else if (state == DISCONNECTING && action instanceof LogoffAction) + { + // when disconnecting logoff action is ok. + } // NOPMD + else if (state != CONNECTED) + { + throw new IllegalStateException("Actions may only be sent when in state " + + "CONNECTED, but connection is in state " + state); + } + + if (socket == null) + { + throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); + } + + internalActionId = createInternalActionId(); + + // if the callbackHandler is null the user is obviously not interested + // in the response, thats fine. + if (callback != null) + { + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, callback); + } + } + + Class responseClass = getExpectedResponseClass(action.getClass()); + if (responseClass != null) + { + reader.expectResponseClass(internalActionId, responseClass); + } + + writer.sendAction(action, internalActionId); + } + + boolean isShowVersionCommandAction(ManagerAction action) + { + if (!(action instanceof CommandAction)) + { + return false; + } + final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction) action).getCommand()); + return showVersionMatcher.matches(); + } + + private Class getExpectedResponseClass(Class actionClass) + { + final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); + if (annotation == null) + { + return null; + } + + return annotation.value(); + } + + public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws IOException, + EventTimeoutException, IllegalArgumentException, IllegalStateException + { + return sendEventGeneratingAction(action, defaultEventTimeout); + } + + /* + * Implements synchronous sending of event generating actions. + */ + public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, + EventTimeoutException, IllegalArgumentException, IllegalStateException + { + final ResponseEventsImpl responseEvents; + final ResponseEventHandler responseEventHandler; + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + else if (action.getActionCompleteEventClass() == null) + { + throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " + + action.getClass().getName() + " is null."); + } + else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) + { + throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" + + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() + + " is not a ResponseEvent."); + } + + if (state != CONNECTED) + { + throw new IllegalStateException("Actions may only be sent when in state " + + "CONNECTED but connection is in state " + state); + } + + responseEvents = new ResponseEventsImpl(); + responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); + + internalActionId = createInternalActionId(); + + try + { + // register response handler... + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, responseEventHandler); + } + + // ...and event handler. + synchronized (this.responseEventListeners) + { + this.responseEventListeners.put(internalActionId, responseEventHandler); + } + + synchronized (responseEvents) + { + writer.sendAction(action, internalActionId); + // only wait if response has not yet arrived. + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + try + { + responseEvents.wait(timeout); + } + catch (InterruptedException e) + { + logger.warn("Interrupted while waiting for response events."); + Thread.currentThread().interrupt(); + } + } + } + + // still no response or not all events received and timed out? + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + throw new EventTimeoutException("Timeout waiting for response or response events to " + + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), + responseEvents); + } + + } + finally + { + // remove the event handler + synchronized (this.responseEventListeners) + { + this.responseEventListeners.remove(internalActionId); + } + + + // Note: The response handler should has already been removed + // when the response was received, however we remove it here + // just in case it was never received. + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, responseEventHandler); + } + + } + + return responseEvents; + } + + /** + * Creates a new unique internal action id based on the hash code of this + * connection and a sequence. + * + * @return a new internal action id + * @see ManagerUtil#addInternalActionId(String,String) + * @see ManagerUtil#getInternalActionId(String) + * @see ManagerUtil#stripInternalActionId(String) + */ + private String createInternalActionId() + { + final StringBuffer sb; + + sb = new StringBuffer(); + sb.append(this.hashCode()); + sb.append("_"); + sb.append(actionIdCounter.getAndIncrement()); + + return sb.toString(); + } + + public void addEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + // only add it if its not already there + if (!this.eventListeners.contains(listener)) + { + this.eventListeners.add(listener); + } + } + } + + public void removeEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + if (this.eventListeners.contains(listener)) + { + this.eventListeners.remove(listener); + } + } + } + + public String getProtocolIdentifier() + { + return protocolIdentifier.value; + } + + public ManagerConnectionState getState() + { + return state; + } + + /* Implementation of Dispatcher: callbacks for ManagerReader */ + + /** + * This method is called by the reader whenever a {@link ManagerResponse} is + * received. The response is dispatched to the associated + * {@link SendActionCallback}. + * + * @param response + * the response received by the reader + * @see ManagerReader + */ + public void dispatchResponse(ManagerResponse response) + { + final String actionId; + String internalActionId; + SendActionCallback listener; + + // shouldn't happen + if (response == null) + { + logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); + return; + } + + actionId = response.getActionId(); + internalActionId = null; + listener = null; + + if (actionId != null) + { + internalActionId = ManagerUtil.getInternalActionId(actionId); + response.setActionId(ManagerUtil.stripInternalActionId(actionId)); + } + + logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); + + if (internalActionId != null) + { + synchronized (this.responseListeners) + { + listener = responseListeners.get(internalActionId); + if (listener != null) + { + this.responseListeners.remove(internalActionId); + } + else + { + // when using the async sendAction it's ok not to register a + // callback so if we don't find a response handler thats ok + logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); + } + } + } + else + { + logger.error("Unable to retrieve internalActionId from response: " + "actionId '" + actionId + "':\n" + + response); + } + + if (listener != null) + { + try + { + listener.onResponse(response); + } + catch (Exception e) + { + logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); + } + } + } + + /** + * This method is called by the reader whenever a ManagerEvent is received. + * The event is dispatched to all registered ManagerEventHandlers. + * + * @param event + * the event received by the reader + * @see #addEventListener(ManagerEventListener) + * @see #removeEventListener(ManagerEventListener) + * @see ManagerReader + */ + public void dispatchEvent(ManagerEvent event) + { + // shouldn't happen + if (event == null) + { + logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); + return; + } + + logger.debug("Dispatching event:\n" + event.toString()); + + // Some events need special treatment besides forwarding them to the + // registered eventListeners (clients) + // These events are handled here at first: + + // Dispatch ResponseEvents to the appropriate responseEventListener + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + String internalActionId; + + responseEvent = (ResponseEvent) event; + internalActionId = responseEvent.getInternalActionId(); + if (internalActionId != null) + { + synchronized (responseEventListeners) + { + ManagerEventListener listener; + + listener = responseEventListeners.get(internalActionId); + if (listener != null) + { + try + { + listener.onManagerEvent(event); + } + catch (Exception e) + { + logger.warn("Unexpected exception in response event listener " + + listener.getClass().getName(), e); + } + } + } + } + else + { + // ResponseEvent without internalActionId: + // this happens if the same event class is used as response + // event + // and as an event that is not triggered by a Manager command + // Example: QueueMemberStatusEvent. + // logger.debug("ResponseEvent without " + // + "internalActionId:\n" + responseEvent); + } // NOPMD + } + if (event instanceof DisconnectEvent) + { + // When we receive get disconnected while we are connected start + // a new reconnect thread and set the state to RECONNECTING. + if (state == CONNECTED) + { + state = RECONNECTING; + // close socket if still open and remove reference to + // readerThread + // After sending the DisconnectThread that thread will die + // anyway. + cleanup(); + Thread reconnectThread = new Thread(new Runnable() + { + public void run() + { + reconnect(); + } + }); + reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" + + reconnectThreadCounter.getAndIncrement()); + reconnectThread.setDaemon(true); + reconnectThread.start(); + // now the DisconnectEvent is dispatched to registered + // eventListeners + // (clients) and after that the ManagerReaderThread is gone. + // So effectively we replaced the reader thread by a + // ReconnectThread. + } + else + { + // when we receive a DisconnectEvent while not connected we + // ignore it and do not send it to clients + return; + } + } + if (event instanceof ProtocolIdentifierReceivedEvent) + { + ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; + String protocolIdentifier; + + protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; + protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); + setProtocolIdentifier(protocolIdentifier); + // no need to send this event to clients + return; + } + + fireEvent(event); + } + + /** + * Notifies all {@link ManagerEventListener}s registered by users. + * + * @param event + * the event to propagate + */ + private void fireEvent(ManagerEvent event) + { + synchronized (eventListeners) + { + for (ManagerEventListener listener : eventListeners) + { + try + { + listener.onManagerEvent(event); + } + catch (RuntimeException e) + { + logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); + } + } + } + } + + /** + * This method is called when a {@link ProtocolIdentifierReceivedEvent} is + * received from the reader. Having received a correct protocol identifier + * is the precodition for logging in. + * + * @param identifier + * the protocol version used by the Asterisk server. + */ + private void setProtocolIdentifier(final String identifier) + { + logger.info("Connected via " + identifier); + + if (!"Asterisk Call Manager/1.0".equals(identifier) + && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk + // 1.6 + && !"Asterisk Call Manager/1.2".equals(identifier) // bri + // stuffed + && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) + && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) + { + logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); + } + + synchronized (protocolIdentifier) + { + protocolIdentifier.value = identifier; + protocolIdentifier.notifyAll(); + } + } + + /** + * Reconnects to the asterisk server when the connection is lost. + *

+ * While keepAlive is true we will try to reconnect. + * Reconnection attempts will be stopped when the {@link #logoff()} method + * is called or when the login after a successful reconnect results in an + * {@link AuthenticationFailedException} suggesting that the manager + * credentials have changed and keepAliveAfterAuthenticationFailure is not + * set. + *

+ * This method is called when a {@link DisconnectEvent} is received from the + * reader. + */ + private void reconnect() + { + int numTries; + + // try to reconnect + numTries = 0; + while (state == RECONNECTING) + { + try + { + if (numTries < 10) + { + // try to reconnect quite fast for the firt 10 times + // this succeeds if the server has just been restarted + Thread.sleep(RECONNECTION_INTERVAL_1); + } + else + { + // slow down after 10 unsuccessful attempts asuming a + // shutdown of the server + Thread.sleep(RECONNECTION_INTERVAL_2); + } + } + catch (InterruptedException e) + { + Thread.currentThread().interrupt(); + } + + try + { + connect(); + + try + { + doLogin(defaultResponseTimeout, eventMask); + logger.info("Successfully reconnected."); + // everything is ok again, so we leave + // when successful doLogin set the state to CONNECTED so no + // need to adjust it + break; + } + catch (AuthenticationFailedException e1) + { + if (keepAliveAfterAuthenticationFailure) + { + logger.error("Unable to log in after reconnect: " + e1.getMessage()); + } + else + { + logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); + state = DISCONNECTED; + } + } + catch (TimeoutException e1) + { + // shouldn't happen - but happens! + logger.error("TimeoutException while trying to log in " + "after reconnect."); + } + } + catch (IOException e) + { + // server seems to be still down, just continue to attempt + // reconnection + logger.warn("Exception while trying to reconnect: " + e.getMessage()); + } + numTries++; + } + } + + private void cleanup() + { + disconnect(); + this.readerThread = null; + } + + @Override + public String toString() + { + StringBuffer sb; + + sb = new StringBuffer("ManagerConnection["); + sb.append("id='").append(id).append("',"); + sb.append("hostname='").append(hostname).append("',"); + sb.append("port=").append(port).append(","); + sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); + + return sb.toString(); + } + + /* Helper classes */ + + /** + * A simple data object to store a ManagerResult. + */ + private static class ResponseHandlerResult implements Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 7831097958568769220L; + private ManagerResponse response; + + public ResponseHandlerResult() + { + } + + public ManagerResponse getResponse() + { + return this.response; + } + + public void setResponse(ManagerResponse response) + { + this.response = response; + } + } + + /** + * A simple response handler that stores the received response in a + * ResponseHandlerResult for further processing. + */ + private static class DefaultSendActionCallback implements SendActionCallback, Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 2926598671855316803L; + private final ResponseHandlerResult result; + + /** + * Creates a new instance. + * + * @param result + * the result to store the response in + */ + public DefaultSendActionCallback(ResponseHandlerResult result) + { + this.result = result; + } + + public void onResponse(ManagerResponse response) + { + synchronized (result) + { + result.setResponse(response); + result.notifyAll(); + } + } + } + + /** + * A combinded event and response handler that adds received events and the + * response to a ResponseEvents object. + */ + private static class ResponseEventHandler implements ManagerEventListener, SendActionCallback + { + private final ResponseEventsImpl events; + private final Class actionCompleteEventClass; + + /** + * Creates a new instance. + * + * @param events + * the ResponseEventsImpl to store the events in + * @param actionCompleteEventClass + * the type of event that indicates that all events have been + * received + */ + public ResponseEventHandler(ResponseEventsImpl events, Class actionCompleteEventClass) + { + this.events = events; + this.actionCompleteEventClass = actionCompleteEventClass; + } + + public void onManagerEvent(ManagerEvent event) + { + synchronized (events) + { + // should always be a ResponseEvent, anyway... + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + + responseEvent = (ResponseEvent) event; + events.addEvent(responseEvent); + } + + // finished? + if (actionCompleteEventClass.isAssignableFrom(event.getClass())) + { + events.setComplete(true); + // notify if action complete event and response have been + // received + if (events.getResponse() != null) + { + events.notifyAll(); + } + } + } + } + + public void onResponse(ManagerResponse response) + { + synchronized (events) + { + events.setRepsonse(response); + if (response instanceof ManagerError) + { + events.setComplete(true); + } + + // finished? + // notify if action complete event and response have been + // received + if (events.isComplete()) + { + events.notifyAll(); + } + } + } + } + + private static class ProtocolIdentifierWrapper + { + String value; + } } From 14fbd736f6bec6dab3617435a0f4b7c0d9bbd1f7 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Thu, 19 Jul 2012 12:44:10 +1000 Subject: [PATCH 0022/1055] Added chainlistener so that we can coherently deal with channel renames and masq events. --- .../org/asteriskjava/live/AsteriskServer.java | 27 +++++ .../live/DefaultAsteriskServer.java | 98 +++++++++++-------- .../live/internal/AsteriskServerImpl.java | 2 +- .../manager/action/SipPeersAction.java | 2 + 4 files changed, 86 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/AsteriskServer.java b/src/main/java/org/asteriskjava/live/AsteriskServer.java index 7ebabaa22..b41778ac7 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/AsteriskServer.java @@ -21,6 +21,7 @@ import java.util.List; import org.asteriskjava.manager.ManagerConnection; +import org.asteriskjava.manager.ManagerEventListener; import org.asteriskjava.manager.action.OriginateAction; import org.asteriskjava.config.ConfigFile; @@ -477,6 +478,32 @@ void setGlobalVariable(String variable, String value) */ void removeAsteriskServerListener(AsteriskServerListener listener); + /** + * The chainListener allows a listener to receive manager events after they + * have been processed by the AsteriskServer. If the AsteriskServer is + * handling messages using the asyncEventHandling then these messages will + * also be async. You would use the chainListener if you are processing raw + * events and using the AJ live ChannelManager. If you don't use the chain + * listener then you can't be certain that a channel name passed in a raw + * event will match the channel name held by the live Channel Manager. By + * chaining events you can be certain that events such as channel Rename + * events have been processed by the live ChannelManager before you receive + * an event and as such the names will always match. + * + * Whilst name matching is not always critical (as you should be matching by the + * channels unique id) the channel name does also contain state information (Zombie, Masq) + * in these cases it can be critical that you have the same name otherwise your + * state information will be out of date. + * + */ + public void addChainListener(ManagerEventListener chainListener); + + /** + * remove the chain listener. + * @param chainListener + */ + public void removeChainListener(ManagerEventListener chainListener); + /** * Closes the connection to this server. */ diff --git a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java index 7b7aba35c..a2a879c32 100644 --- a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java @@ -17,14 +17,15 @@ package org.asteriskjava.live; import java.util.Collection; -import java.util.Map; import java.util.List; +import java.util.Map; +import org.asteriskjava.config.ConfigFile; import org.asteriskjava.live.internal.AsteriskServerImpl; import org.asteriskjava.manager.DefaultManagerConnection; import org.asteriskjava.manager.ManagerConnection; +import org.asteriskjava.manager.ManagerEventListener; import org.asteriskjava.manager.action.OriginateAction; -import org.asteriskjava.config.ConfigFile; /** * Default implementation of the AsteriskServer interface. @@ -45,7 +46,7 @@ public class DefaultAsteriskServer implements AsteriskServer */ public DefaultAsteriskServer() { - impl = new AsteriskServerImpl(); + this.impl = new AsteriskServerImpl(); } /** @@ -60,7 +61,7 @@ public DefaultAsteriskServer(String hostname, String username, String password) { final ManagerConnection connection; connection = createManagerConnection(hostname, 0, username, password); - impl = new AsteriskServerImpl(connection); + this.impl = new AsteriskServerImpl(connection); } /** @@ -77,7 +78,7 @@ public DefaultAsteriskServer(String hostname, int port, String username, String { final ManagerConnection connection; connection = createManagerConnection(hostname, port, username, password); - impl = new AsteriskServerImpl(connection); + this.impl = new AsteriskServerImpl(connection); } protected DefaultManagerConnection createManagerConnection(String hostname, int port, String username, String password) @@ -95,7 +96,7 @@ protected DefaultManagerConnection createManagerConnection(String hostname, int */ public DefaultAsteriskServer(ManagerConnection eventConnection) { - impl = new AsteriskServerImpl(eventConnection); + this.impl = new AsteriskServerImpl(eventConnection); } /** @@ -112,29 +113,29 @@ public DefaultAsteriskServer(ManagerConnection eventConnection) */ public void setSkipQueues(boolean skipQueues) { - impl.setSkipQueues(skipQueues); + this.impl.setSkipQueues(skipQueues); } public void setManagerConnection(ManagerConnection eventConnection) { - impl.setManagerConnection(eventConnection); + this.impl.setManagerConnection(eventConnection); } public void initialize() throws ManagerCommunicationException { - impl.initialize(); + this.impl.initialize(); } /* Implementation of the AsteriskServer interface */ public ManagerConnection getManagerConnection() { - return impl.getManagerConnection(); + return this.impl.getManagerConnection(); } public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originate(originateAction); + return this.impl.originate(originateAction); } @@ -142,7 +143,7 @@ public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originateToExtension(channel, context, exten, priority, timeout); + return this.impl.originateToExtension(channel, context, exten, priority, timeout); } public AsteriskChannel originateToExtension(String channel, String context, @@ -150,14 +151,14 @@ public AsteriskChannel originateToExtension(String channel, String context, Map variables) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originateToExtension(channel, context, exten, priority, timeout, callerId, variables); + return this.impl.originateToExtension(channel, context, exten, priority, timeout, callerId, variables); } public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originateToApplication(channel, application, data, timeout); + return this.impl.originateToApplication(channel, application, data, timeout); } public AsteriskChannel originateToApplication(String channel, @@ -165,13 +166,13 @@ public AsteriskChannel originateToApplication(String channel, Map variables) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originateToApplication(channel, application, data, timeout, callerId, variables); + return this.impl.originateToApplication(channel, application, data, timeout, callerId, variables); } public void originateAsync(OriginateAction originateAction, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateAsync(originateAction, cb); + this.impl.originateAsync(originateAction, cb); } public void originateToApplicationAsync(String channel, String application, @@ -179,14 +180,14 @@ public void originateToApplicationAsync(String channel, String application, Map variables, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateToApplicationAsync(channel, application, data, timeout, callerId, variables, cb); + this.impl.originateToApplicationAsync(channel, application, data, timeout, callerId, variables, cb); } public void originateToApplicationAsync(String channel, String application, String data, long timeout, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateToApplicationAsync(channel, application, data, timeout, cb); + this.impl.originateToApplicationAsync(channel, application, data, timeout, cb); } public void originateToExtensionAsync(String channel, String context, @@ -194,123 +195,136 @@ public void originateToExtensionAsync(String channel, String context, Map variables, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateToExtensionAsync(channel, context, exten, priority, timeout, callerId, variables, cb); + this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, callerId, variables, cb); } public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateToExtensionAsync(channel, context, exten, priority, timeout, cb); + this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, cb); } public Collection getChannels() throws ManagerCommunicationException { - return impl.getChannels(); + return this.impl.getChannels(); } public AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException { - return impl.getChannelByName(name); + return this.impl.getChannelByName(name); } public AsteriskChannel getChannelById(String id) throws ManagerCommunicationException { - return impl.getChannelById(id); + return this.impl.getChannelById(id); } public Collection getMeetMeRooms() throws ManagerCommunicationException { - return impl.getMeetMeRooms(); + return this.impl.getMeetMeRooms(); } public MeetMeRoom getMeetMeRoom(String name) throws ManagerCommunicationException { - return impl.getMeetMeRoom(name); + return this.impl.getMeetMeRoom(name); } public Collection getQueues() throws ManagerCommunicationException { - return impl.getQueues(); + return this.impl.getQueues(); } public String getVersion() throws ManagerCommunicationException { - return impl.getVersion(); + return this.impl.getVersion(); } public int[] getVersion(String file) throws ManagerCommunicationException { - return impl.getVersion(file); + return this.impl.getVersion(file); } public String getGlobalVariable(String variable) throws ManagerCommunicationException { - return impl.getGlobalVariable(variable); + return this.impl.getGlobalVariable(variable); } public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException { - impl.setGlobalVariable(variable, value); + this.impl.setGlobalVariable(variable, value); } public Collection getVoicemailboxes() throws ManagerCommunicationException { - return impl.getVoicemailboxes(); + return this.impl.getVoicemailboxes(); } public List executeCliCommand(String command) throws ManagerCommunicationException { - return impl.executeCliCommand(command); + return this.impl.executeCliCommand(command); } public boolean isModuleLoaded(String module) throws ManagerCommunicationException { - return impl.isModuleLoaded(module); + return this.impl.isModuleLoaded(module); } public ConfigFile getConfig(String filename) throws ManagerCommunicationException { - return impl.getConfig(filename); + return this.impl.getConfig(filename); } public void reloadAllModules() throws ManagerCommunicationException { - impl.reloadAllModules(); + this.impl.reloadAllModules(); } public void reloadModule(String module) throws ManagerCommunicationException { - impl.reloadModule(module); + this.impl.reloadModule(module); } public void unloadModule(String module) throws ManagerCommunicationException { - impl.unloadModule(module); + this.impl.unloadModule(module); } public void loadModule(String module) throws ManagerCommunicationException { - impl.loadModule(module); + this.impl.loadModule(module); } public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException { - impl.addAsteriskServerListener(listener); + this.impl.addAsteriskServerListener(listener); } public void removeAsteriskServerListener(AsteriskServerListener listener) { - impl.removeAsteriskServerListener(listener); + this.impl.removeAsteriskServerListener(listener); } public void shutdown() { - impl.shutdown(); + this.impl.shutdown(); } public Collection getAgents() throws ManagerCommunicationException { - return impl.getAgents(); + return this.impl.getAgents(); } + + @Override + public void addChainListener(ManagerEventListener chainListener) + { + this.impl.addChainListener(chainListener); + } + + @Override + public void removeChainListener(ManagerEventListener chainListener) + { + this.impl.removeChainListener(chainListener); + + } } diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 0ce194ad9..ccd32fafa 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -888,7 +888,7 @@ public void addChainListener(ManagerEventListener chainListener) } - public void removeChainListner(ManagerEventListener chainListener) + public void removeChainListener(ManagerEventListener chainListener) { this.chainListeners.remove(chainListener); } diff --git a/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java b/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java index 11de4f2af..47cfb2094 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java @@ -25,6 +25,8 @@ * the details. When all peers have been reported a PeerlistCompleteEvent is * sent.

* Available since Asterisk 1.2 + * + * Permission required: write=system * * @author srt * @version $Id$ From da53d55f889fc734bc7f597b4ebf4669145f3639 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Sun, 29 Jul 2012 13:58:31 +1000 Subject: [PATCH 0023/1055] Fixed a bug where a response handler was re-added to the response listener list when it should have been removed. Looks like a cut and paste bug. --- .../asteriskjava/manager/internal/ManagerConnectionImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index d7ada5bc0..892e56240 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -1044,7 +1044,7 @@ else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClas // just in case it was never received. synchronized (this.responseListeners) { - this.responseListeners.put(internalActionId, responseEventHandler); + this.responseListeners.remove(internalActionId); } } From fc36094a7be42fcf658d0debebad08aae0a68e84 Mon Sep 17 00:00:00 2001 From: Yuri Orlov Date: Thu, 24 Oct 2013 14:27:24 +0300 Subject: [PATCH 0024/1055] apply patch AJ-289 --- .../manager/event/AbstractChannelEvent.java | 24 ++++++++++++ .../manager/event/CoreShowChannelEvent.java | 23 ++++++++++- .../manager/event/MeetMeLeaveEvent.java | 23 +++++++++++ .../manager/event/PickupEvent.java | 38 +++++++++++++++++++ .../manager/event/QueueEntryEvent.java | 23 +++++++++++ .../manager/event/StatusEvent.java | 23 +++++++++++ .../manager/internal/EventBuilderImpl.java | 1 + 7 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/asteriskjava/manager/event/PickupEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java index 3f43b0023..5ca467dc3 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java @@ -48,6 +48,9 @@ public abstract class AbstractChannelEvent extends ManagerEvent * The unique id of the channel. */ private String uniqueId; + + private String connectedlinenum; + private String connectedlinename; protected AbstractChannelEvent(Object source) { @@ -137,4 +140,25 @@ public final void setCallerIdName(String callerIdName) { this.callerIdName = callerIdName; } + + public String getConnectedlinenum() + { + return connectedlinenum; + } + + public void setConnectedlinenum(String connectedlinenum) + { + this.connectedlinenum = connectedlinenum; + } + + public String getConnectedlinename() + { + return connectedlinename; + } + + public void setConnectedlinename(String connectedlinename) + { + this.connectedlinename = connectedlinename; + } + } diff --git a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java index 531123167..8ada954c5 100644 --- a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java @@ -45,6 +45,8 @@ public class CoreShowChannelEvent extends ResponseEvent private String accountcode; private String bridgedChannel; private String bridgeduniqueid; + private String connectedlinenum; + private String connectedlinename; public CoreShowChannelEvent(Object source) { @@ -263,5 +265,24 @@ public void setUniqueid(String uniqueid) this.uniqueid = uniqueid; } - + public String getConnectedlinenum() + { + return connectedlinenum; + } + + public void setConnectedlinenum(String connectedlinenum) + { + this.connectedlinenum = connectedlinenum; + } + + public String getConnectedlinename() + { + return connectedlinename; + } + + public void setConnectedlinename(String connectedlinename) + { + this.connectedlinename = connectedlinename; + } + } diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java index 022bc99ed..e70b5738c 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java @@ -33,6 +33,8 @@ public class MeetMeLeaveEvent extends AbstractMeetMeEvent private String callerIdNum; private String callerIdName; + private String connectedlinename; + private String connectedlinenum; private Long duration; /** @@ -105,4 +107,25 @@ public void setDuration(Long duration) { this.duration = duration; } + + public String getConnectedlinename() + { + return connectedlinename; + } + + public void setConnectedlinename(String connectedlinename) + { + this.connectedlinename = connectedlinename; + } + + public String getConnectedlinenum() + { + return connectedlinenum; + } + + public void setConnectedlinenum(String connectedlinenum) + { + this.connectedlinenum = connectedlinenum; + } + } diff --git a/src/main/java/org/asteriskjava/manager/event/PickupEvent.java b/src/main/java/org/asteriskjava/manager/event/PickupEvent.java new file mode 100644 index 000000000..b7c829cda --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/PickupEvent.java @@ -0,0 +1,38 @@ +package org.asteriskjava.manager.event; + +public class PickupEvent extends ManagerEvent +{ + private String channel; + private String targetchannel; + + public PickupEvent(Object source) + { + super(source); + } + + /** + * + */ + private static final long serialVersionUID = 1L; + + public String getChannel() + { + return channel; + } + + public void setChannel(String channel) + { + this.channel = channel; + } + + public String getTargetchannel() + { + return targetchannel; + } + + public void setTargetchannel(String targetchannel) + { + this.targetchannel = targetchannel; + } + +} diff --git a/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java index a9543ab1e..c9b7327f6 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java @@ -38,6 +38,8 @@ public class QueueEntryEvent extends ResponseEvent private String callerId; private String callerIdName; private String callerIdNum; + private String connectedlinename; + private String connectedlinenum; private Long wait; /** @@ -194,4 +196,25 @@ public void setWait(Long wait) { this.wait = wait; } + + public String getConnectedlinename() + { + return connectedlinename; + } + + public void setConnectedlinename(String connectedlinename) + { + this.connectedlinename = connectedlinename; + } + + public String getConnectedlinenum() + { + return connectedlinenum; + } + + public void setConnectedlinenum(String connectedlinenum) + { + this.connectedlinenum = connectedlinenum; + } + } diff --git a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java index 9f3f6606f..5a8c53207 100644 --- a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java @@ -46,6 +46,8 @@ public class StatusEvent extends ResponseEvent private String bridgedChannel; private String bridgedUniqueId; private String uniqueId; + private String connectedlinenum; + private String connectedlinename; private Map variables; public StatusEvent(Object source) @@ -400,4 +402,25 @@ public void setVariables(Map variables) { this.variables = variables; } + + public String getConnectedlinenum() + { + return connectedlinenum; + } + + public void setConnectedlinenum(String connectedlinenum) + { + this.connectedlinenum = connectedlinenum; + } + + public String getConnectedlinename() + { + return connectedlinename; + } + + public void setConnectedlinename(String connectedlinename) + { + this.connectedlinename = connectedlinename; + } + } diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 62e425f30..a7ec801f6 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -136,6 +136,7 @@ private void registerBuiltinEventClasses() registerEventClass(PeerEntryEvent.class); registerEventClass(PeerlistCompleteEvent.class); registerEventClass(PeerStatusEvent.class); + registerEventClass(PickupEvent.class); registerEventClass(PriEventEvent.class); registerEventClass(QueueCallerAbandonEvent.class); registerEventClass(QueueEntryEvent.class); From 955f0817a9de051c62ddb8696480ebfbf25fff9a Mon Sep 17 00:00:00 2001 From: Pavel Derendyaev Date: Sat, 2 Nov 2013 21:29:20 +0400 Subject: [PATCH 0025/1055] [AJ-329] Peers event is returned in response to SIPPeers (or IAXPeers) action. It holds PeerEntryEvent list with all peers information. --- .../manager/event/PeersEvent.java | 62 ++++++++++++ .../manager/internal/EventBuilderImpl.java | 97 ++++++++++++++----- .../internal/EventBuilderImplTest.java | 45 +++++++++ 3 files changed, 180 insertions(+), 24 deletions(-) create mode 100644 src/main/java/org/asteriskjava/manager/event/PeersEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/PeersEvent.java b/src/main/java/org/asteriskjava/manager/event/PeersEvent.java new file mode 100644 index 000000000..2e1692d9c --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/PeersEvent.java @@ -0,0 +1,62 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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.asteriskjava.manager.event; + +import java.util.List; + +/** + * A PeersEvent is triggered in response to a {@link org.asteriskjava.manager.action.SipPeersAction}, + * {@link org.asteriskjava.manager.action.SipShowPeerAction} or {@link org.asteriskjava.manager.action.IaxPeerListAction} + * and contains information about a SIP or IAX peers.

+ * It is implemented in channels/chan_sip.c and channels/chan_iax.c + * + * @author ddpaul + * @version $Id$ + * @since 0.2 + */ +public class PeersEvent extends ResponseEvent +{ + /** + * Serial version identifier. + */ + private static final long serialVersionUID = 0L; + + /** + * This field holds actual information about SIP/IAX peers + */ + private List childEvents; + + /** + * Creates a new instance. + * + * @param source + */ + public PeersEvent( Object source ) + { + super(source); + } + + public List getChildEvents() + { + return childEvents; + } + + public void setChildEvents( List childEvents ) + { + this.childEvents = childEvents; + } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 62e425f30..54a1b5563 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -135,6 +135,7 @@ private void registerBuiltinEventClasses() registerEventClass(ParkedCallsCompleteEvent.class); registerEventClass(PeerEntryEvent.class); registerEventClass(PeerlistCompleteEvent.class); + registerEventClass(PeersEvent.class); registerEventClass(PeerStatusEvent.class); registerEventClass(PriEventEvent.class); registerEventClass(QueueCallerAbandonEvent.class); @@ -252,7 +253,7 @@ public final void registerEventClass(String eventType, Class attributes) { ManagerEvent event; - String eventType; + String eventType = null; Class eventClass; Constructor constructor; @@ -261,33 +262,65 @@ public ManagerEvent buildEvent(Object source, Map attributes) logger.error("No event type in properties"); return null; } - if (!(attributes.get("event") instanceof String)) - { - logger.error("Event type is not a String"); - return null; - } - - eventType = ((String) attributes.get("event")).toLowerCase(Locale.US); - // Change in Asterisk 1.4 where the name of the UserEvent is sent as property instead - // of the event name (AJ-48) - if ("userevent".equals(eventType)) - { - String userEventType; - - if (attributes.get("userevent") == null) - { - logger.error("No user event type in properties"); - return null; + if (attributes.get("event") instanceof List ) { + List eventNames = (List) attributes.get( "event" ); + if (eventNames.size() > 0 && "PeerEntry".equals(eventNames.get(0))) { + // List of PeerEntry events was received (AJ-329) + // Convert map of lists to list of maps - one map for each PeerEntry event + int peersAmount = attributes.get("listitems") != null ? + Integer.valueOf((String) attributes.get("listitems")) : + eventNames.size() - 1; // Last event is PeerlistComplete + List> peersAttributes = new ArrayList>(); + for (Map.Entry attribute : attributes.entrySet()) { + String key = attribute.getKey(); + Object value = attribute.getValue(); + for (int i = 0; i < peersAmount; i++) { + Map peerAttrs; + if (peersAttributes.size() > i) { + peerAttrs = peersAttributes.get(i); + } else { + peerAttrs = new HashMap(); + peersAttributes.add(i, peerAttrs); + } + if (value instanceof List) { + peerAttrs.put(key, ((List) value).get(i)); + } else if (value instanceof String && !"listitems".equals(key)) { + peerAttrs.put(key, value); + } + } + } + attributes.put("peersAttributes", peersAttributes); + eventType = "peers"; } - if (!(attributes.get("userevent") instanceof String)) - { - logger.error("User event type is not a String"); + } else { + if (!(attributes.get("event") instanceof String)) { + logger.error("Event type is not a String or List"); return null; } - userEventType = ((String) attributes.get("userevent")).toLowerCase(Locale.US); - eventType = eventType + userEventType; + eventType = ((String) attributes.get("event")).toLowerCase(Locale.US); + + // Change in Asterisk 1.4 where the name of the UserEvent is sent as property instead + // of the event name (AJ-48) + if ("userevent".equals(eventType)) + { + String userEventType; + + if (attributes.get("userevent") == null) + { + logger.error("No user event type in properties"); + return null; + } + if (!(attributes.get("userevent") instanceof String)) + { + logger.error("User event type is not a String"); + return null; + } + + userEventType = ((String) attributes.get("userevent")).toLowerCase(Locale.US); + eventType = eventType + userEventType; + } } eventClass = registeredEventClasses.get(eventType); @@ -318,7 +351,23 @@ public ManagerEvent buildEvent(Object source, Map attributes) return null; } - setAttributes(event, attributes, ignoredAttributes); + if (attributes.get("peersAttributes") != null && attributes.get( "peersAttributes" ) instanceof List) { + // Fill Peers event with list of PeerEntry events (AJ-329) + PeersEvent peersEvent = (PeersEvent) event; + for( Map peerAttrs : (List>) attributes.get("peersAttributes")) { + PeerEntryEvent peerEntryEvent = new PeerEntryEvent( source ); + setAttributes(peerEntryEvent, peerAttrs, ignoredAttributes); + List peerEntryEvents = peersEvent.getChildEvents(); + if (peerEntryEvents == null) { + peerEntryEvents = new ArrayList(); + peersEvent.setChildEvents(peerEntryEvents); + } + peerEntryEvents.add(peerEntryEvent); + } + peersEvent.setActionId((peersEvent.getChildEvents().get(0).getActionId())); + } else { + setAttributes(event, attributes, ignoredAttributes); + } // ResponseEvents are sent in response to a ManagerAction if the // response contains lots of data. They include the actionId of diff --git a/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java index 38db1b9e0..4e56c4f0c 100644 --- a/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java @@ -28,6 +28,7 @@ import org.asteriskjava.manager.event.*; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; public class EventBuilderImplTest @@ -500,4 +501,48 @@ public void testBuildEventWithSpace() assertEquals("Returned event is of wrong type", T38FaxStatusEvent.class, event.getClass()); assertEquals("Property 'T38 Session Duration' is not set correctly", "120", event.getT38SessionDuration()); } + + @Test + public void testBuildEventWithPeerEntryEventList() + { + PeersEvent event; + + properties.put("event", Arrays.asList( "PeerEntry", "PeerEntry", "PeerEntry", "PeerlistComplete" )); + properties.put("actionid", Arrays.asList( "1378144905_4#123", "1378144905_4#123", "1378144905_4#123" )); + properties.put("objectname", Arrays.asList( "a101", "a102", "a103" )); + properties.put("status", Arrays.asList( "OK", "UNKNOWN", "LAGGED" )); + properties.put("listitems", "3"); + event = (PeersEvent) eventBuilder.buildEvent(this, properties); + + assertNotNull(event); + assertEquals("Returned event is of wrong type", PeersEvent.class, event.getClass()); + assertEquals("ActionId is invalid", "123", event.getActionId()); + assertEquals("Property events[objectname] is not set correctly", "a101", event.getChildEvents().get(0).getObjectName()); + assertEquals("Property events[status] is not set correctly", "OK", event.getChildEvents().get(0).getStatus()); + assertEquals("Property events[objectname] is not set correctly", "a102", event.getChildEvents().get(1).getObjectName()); + assertNull("UNKNOWN literal returns NULL status", event.getChildEvents().get(1).getStatus()); + assertEquals("Property events[objectname] is not set correctly", "a103", event.getChildEvents().get(2).getObjectName()); + assertEquals("Property events[status] is not set correctly", "LAGGED", event.getChildEvents().get(2).getStatus()); + assertEquals("Invalid size of peers property", 3, event.getChildEvents().size()); + } + + @Test + public void testBuildEventWithOnePeerEntryEventList() + { + PeersEvent event; + + properties.put("event", Arrays.asList( "PeerEntry", "PeerlistComplete" )); + properties.put("actionid", "1378144905_4#123" ); + properties.put("objectname", "a101" ); + properties.put("status", "OK" ); + properties.put("listitems", "1"); + event = (PeersEvent) eventBuilder.buildEvent(this, properties); + + assertNotNull(event); + assertEquals( "Returned event is of wrong type", PeersEvent.class, event.getClass() ); + assertEquals("ActionId is invalid", "123", event.getActionId()); + assertEquals( "Property events[objectname] is not set correctly", "a101", event.getChildEvents().get( 0 ).getObjectName() ); + assertEquals( "Property events[status] is not set correctly", "OK", event.getChildEvents().get( 0 ).getStatus() ); + assertEquals("Invalid size of peers property", 1, event.getChildEvents().size()); + } } From 26455a07cc67d69631c14b95a7a519d09bb26769 Mon Sep 17 00:00:00 2001 From: Octavio Luna Date: Wed, 18 Dec 2013 16:43:59 -0600 Subject: [PATCH 0026/1055] Gather Statistics from the Queues and Asterisk and monitor changes on Objects --- .gitignore | 1 + pom.xml | 13 + .../org/asteriskjava/live/AsteriskQueue.java | 65 +++++ .../live/AsteriskQueueMember.java | 17 ++ .../org/asteriskjava/live/AsteriskServer.java | 31 ++ .../live/DefaultAsteriskServer.java | 20 ++ .../org/asteriskjava/live/LiveObject.java | 6 + .../asteriskjava/live/QueueMemberState.java | 31 +- .../live/internal/AbstractLiveObject.java | 20 +- .../live/internal/AsteriskQueueImpl.java | 198 ++++++++++++- .../internal/AsteriskQueueMemberImpl.java | 105 +++++-- .../live/internal/AsteriskServerImpl.java | 31 +- .../live/internal/ConfigFileImpl.java | 61 ---- .../live/internal/QueueManager.java | 264 ++++++++++++++---- .../internal/AsteriskQueueMemberImplTest.java | 5 +- 15 files changed, 722 insertions(+), 146 deletions(-) delete mode 100644 src/main/java/org/asteriskjava/live/internal/ConfigFileImpl.java diff --git a/.gitignore b/.gitignore index 65f9df09a..642253e4d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ target .project .settings/* .idea +.gradle classes diff --git a/pom.xml b/pom.xml index ca8f39962..ddc5d5394 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,13 @@ Bureau of Economic and Business Research, University of Florida -5 + + Octavio Luna + itaqua + octavio.luna at gmail.com + N4Utilus Take your Business to the Cloud + -6 + scm:git:git://github.com/srt/asterisk-java.git @@ -130,6 +137,12 @@ org.apache.log4j;resolution:=optional 1.2.16 compile + + org.apache.commons + commons-lang3 + 3.1 + compile + org.slf4j slf4j-api diff --git a/src/main/java/org/asteriskjava/live/AsteriskQueue.java b/src/main/java/org/asteriskjava/live/AsteriskQueue.java index 6d83d4907..2c0c27fb2 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskQueue.java +++ b/src/main/java/org/asteriskjava/live/AsteriskQueue.java @@ -17,12 +17,14 @@ package org.asteriskjava.live; import java.util.Collection; +import java.util.Date; import java.util.List; /** * An Asterisk ACD queue. * * @author srt + * @author itaqua * @version $Id$ */ public interface AsteriskQueue @@ -134,4 +136,67 @@ public interface AsteriskQueue * @since 0.3 */ void removeAsteriskQueueListener(AsteriskQueueListener listener); + + /** + * Returns the number of abandoned calls. + * @author itaqua + * @return the number of abandoned calls. + */ + Integer getAbandoned(); + + /** + * Returns the ratio of calls answered within the specified service level per total completed + * calls (in percent). + * @author itaqua + * @return the ratio of calls answered within the specified service level per total completed + * calls (in percent). + */ + public Double getServiceLevelPerf(); + + /** + * Returns the number of completed calls. + * @author itaqua + * @return the number of completed calls. + */ + public Integer getCompleted(); + + /** + * Returns the current average talk time for this queue based on an exponential average. + * + * @return the current average talk time for this queue. + */ + public Integer getTalkTime(); + + /** + * Returns the current average holdtime for this queue (in seconds). + * @author itaqua + * @return the current average holdtime for this queue (in seconds). + */ + public Integer getHoldTime(); + + /** + * Returns the number of calls currently waiting in the queue. + * Is better to use get Waiting() + * @author itaqua + * @see getWaiting() + * @return the number of calls currently waiting in the queue. + */ + public Integer getCalls(); + + /** + * Returns the number of calls currently waiting in the queue. + * More verbose Method than getCalls() + * @author itaqua + * @return the number of calls currently waiting in the queue. + */ + public Integer getWaiting(); + + /** + * timestamp (miliseconds) of last update of this object + * @todo maybe change this to an immutable object + * @author itaqua + * @return + */ + long getLastUpdateMillis(); + } diff --git a/src/main/java/org/asteriskjava/live/AsteriskQueueMember.java b/src/main/java/org/asteriskjava/live/AsteriskQueueMember.java index e38851285..f3a4a3ceb 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskQueueMember.java +++ b/src/main/java/org/asteriskjava/live/AsteriskQueueMember.java @@ -27,6 +27,7 @@ * * * @author Patrick Breucking + * @author itaqua * @version $Id$ * @since 0.3.1 */ @@ -35,6 +36,8 @@ public interface AsteriskQueueMember extends LiveObject String PROPERTY_STATE = "state"; String PROPERTY_PENALTY = "penalty"; String PROPERTY_PAUSED = "paused"; + String PROPERTY_CALLSTAKEN = "callsTaken"; + String PROPERTY_LASTCALL = "lastCall"; /** * Returns the location of this member. @@ -143,4 +146,18 @@ public interface AsteriskQueueMember extends LiveObject * @since 1.0.0 */ void setPenalty(int penalty) throws IllegalArgumentException, ManagerCommunicationException, InvalidPenaltyException; + + /** + * get the timestamp when the last call was terminated + * @author itaqua + * @return + */ + public abstract Long getLastCall(); + + /** + * total calls taken + * @author itaqua + * @return + */ + public abstract Integer getCallsTaken(); } diff --git a/src/main/java/org/asteriskjava/live/AsteriskServer.java b/src/main/java/org/asteriskjava/live/AsteriskServer.java index 7ebabaa22..37311cae4 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/AsteriskServer.java @@ -17,6 +17,7 @@ package org.asteriskjava.live; import java.util.Collection; +import java.util.Date; import java.util.Map; import java.util.List; @@ -488,4 +489,34 @@ void setGlobalVariable(String variable, String value) * @throws ManagerCommunicationException if login fails */ void initialize() throws ManagerCommunicationException; + + /** + * get Asterisk Queue by name + * @author itaqua + * @param queueName Name of the queue to retrieve + * @return + */ + public AsteriskQueue getQueueByName(String queueName); + + /** + * List of Queues Objects updated after certain date + * @author itaqua + * @param date + * @return + */ + public List getQueuesUpdatedAfter(Date date); + + /** + * every time we get an event of a queue we reload the information about it from + * the Asterisk Server + * @author itaqua + */ + public void forceQueuesMonitor(boolean force); + + /** + * Check if the Queue Information is forced + * @author itaqua + * @return + */ + public boolean isQueuesMonitorForced(); } diff --git a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java index 7b7aba35c..ea5712890 100644 --- a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java @@ -17,6 +17,7 @@ package org.asteriskjava.live; import java.util.Collection; +import java.util.Date; import java.util.Map; import java.util.List; @@ -313,4 +314,23 @@ public Collection getAgents() throws ManagerCommunicationExceptio { return impl.getAgents(); } + + public AsteriskQueue getQueueByName(String queueName) { + return impl.getQueueByName(queueName); + } + + @Override + public List getQueuesUpdatedAfter(Date date) { + return impl.getQueuesUpdatedAfter(date); + } + + @Override + public void forceQueuesMonitor(boolean force) { + impl.forceQueuesMonitor(force); + } + + @Override + public boolean isQueuesMonitorForced() { + return impl.isQueuesMonitorForced(); + } } diff --git a/src/main/java/org/asteriskjava/live/LiveObject.java b/src/main/java/org/asteriskjava/live/LiveObject.java index cc0e87321..3186f4d34 100644 --- a/src/main/java/org/asteriskjava/live/LiveObject.java +++ b/src/main/java/org/asteriskjava/live/LiveObject.java @@ -72,4 +72,10 @@ public interface LiveObject * @param listener listener to remove */ void removePropertyChangeListener(String propertyName, PropertyChangeListener listener); + + /** + * Timestamp of last update of the Object + * @return + */ + long getLastUpdateMillis(); } diff --git a/src/main/java/org/asteriskjava/live/QueueMemberState.java b/src/main/java/org/asteriskjava/live/QueueMemberState.java index 03d95d3b7..849d27043 100644 --- a/src/main/java/org/asteriskjava/live/QueueMemberState.java +++ b/src/main/java/org/asteriskjava/live/QueueMemberState.java @@ -19,7 +19,7 @@ import org.asteriskjava.manager.event.QueueMemberEvent; /** - * Represents the status of a Queue memeber. + * Represents the status of a Queue member. * *

* Valid status codes are: @@ -36,9 +36,16 @@ *

?
*
AST_DEVICE_UNAVAILABLE (5)
*
?
+ *
AST_DEVICE_RINGING (6)
+ *
?
+ *
AST_DEVICE_RINGINUSE (7)
+ *
?
+ *
AST_DEVICE_ONHOLD (8)
+ *
?
* * * @author Patrick Breucking + * @author itaqua * @version $Id$ * @since 0.3.1 * @see org.asteriskjava.manager.event.QueueMemberEvent @@ -62,9 +69,27 @@ public enum QueueMemberState DEVICE_INVALID(QueueMemberEvent.AST_DEVICE_INVALID), /** - * Device is not availible for call, eg. Agent is logged off. + * Device is not available for call, eg. Agent is logged off. + */ + DEVICE_UNAVAILABLE(QueueMemberEvent.AST_DEVICE_UNAVAILABLE), + + /** + * Device is ringing. */ - DEVICE_UNAVAILABLE(QueueMemberEvent.AST_DEVICE_UNAVAILABLE); + DEVICE_RINGING(QueueMemberEvent.AST_DEVICE_RINGING), + + /** + * Device is ringing *and* in use. + */ + DEVICE_RINGINUSE(QueueMemberEvent.AST_DEVICE_RINGINUSE), + + /** + * Device is on hold + */ + DEVICE_ONHOLD(QueueMemberEvent.AST_DEVICE_ONHOLD); + + + private final int status; diff --git a/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java b/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java index f607d99f8..48a49c602 100644 --- a/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java +++ b/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java @@ -16,14 +16,14 @@ */ package org.asteriskjava.live.internal; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; - import org.asteriskjava.live.AsteriskServer; import org.asteriskjava.live.LiveObject; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + /** * Abstract base class for all live objects. * @@ -36,10 +36,14 @@ abstract class AbstractLiveObject implements LiveObject private final PropertyChangeSupport changes; protected final AsteriskServerImpl server; + //last time this object was updated + private long lastUpdate; + AbstractLiveObject(AsteriskServerImpl server) { this.server = server; this.changes = new PropertyChangeSupport(this); + stampLastUpdate(); } public AsteriskServer getServer() @@ -71,6 +75,7 @@ protected void firePropertyChange(String propertyName, Object oldValue, Object n { if (oldValue != null || newValue != null) { + stampLastUpdate(); try { changes.firePropertyChange(propertyName, oldValue, newValue); @@ -81,4 +86,13 @@ protected void firePropertyChange(String propertyName, Object oldValue, Object n } } } + + @Override + public long getLastUpdateMillis() { + return lastUpdate; + } + + public void stampLastUpdate(){ + lastUpdate = System.currentTimeMillis(); + } } diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueImpl.java index 2b0bf4c78..ae2281460 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueImpl.java @@ -24,6 +24,7 @@ import java.util.Timer; import java.util.TimerTask; +import org.apache.commons.lang3.ObjectUtils; import org.asteriskjava.live.AsteriskQueue; import org.asteriskjava.live.AsteriskQueueEntry; import org.asteriskjava.live.AsteriskQueueListener; @@ -65,6 +66,16 @@ public void run() private Integer max; private String strategy; private Integer serviceLevel; + + /** 101118 Octavio Luna Agregado para Ver cambios en Vivo **/ + private Integer calls; + private Integer holdTime; + private Integer talkTime; + private Integer completed; + private Integer abandoned; + private Double serviceLevelPerf; + /****/ + private Integer weight; private final ArrayList entries; private final Timer timer; @@ -73,7 +84,9 @@ public void run() private final HashMap serviceLevelTimerTasks; AsteriskQueueImpl(AsteriskServerImpl server, String name, Integer max, - String strategy, Integer serviceLevel, Integer weight) + String strategy, Integer serviceLevel, Integer weight, + Integer calls, Integer holdTime, Integer talkTime, + Integer completed, Integer abandoned, Double serviceLevelPerf) { super(server); this.name = name; @@ -86,6 +99,14 @@ public void run() members = new HashMap(); timer = new Timer("ServiceLevelTimer-" + name, true); serviceLevelTimerTasks = new HashMap(); + this.calls = calls; + this.holdTime = holdTime; + this.talkTime = talkTime; + this.completed = completed; + this.abandoned = abandoned; + this.serviceLevelPerf = serviceLevelPerf; + + stampLastUpdate(); } void cancelServiceLevelTimer() @@ -108,9 +129,19 @@ public String getStrategy() return strategy; } - void setMax(Integer max) + /** + * + * @param max + * @return true if value updated, false otherwise + */ + boolean setMax(Integer max) { - this.max = max; + if(!ObjectUtils.equals(this.max, max)){ + this.max = max; + stampLastUpdate(); + return true; + } + return false; } public Integer getServiceLevel() @@ -118,19 +149,160 @@ public Integer getServiceLevel() return serviceLevel; } - void setServiceLevel(Integer serviceLevel) + /** + * + * @param serviceLevel + * @return + */ + boolean setServiceLevel(Integer serviceLevel) { - this.serviceLevel = serviceLevel; + if(!ObjectUtils.equals(this.serviceLevel, serviceLevel)){ + this.serviceLevel = serviceLevel; + stampLastUpdate(); + return true; + } + return false; + + } + + @Override + public Integer getCalls() { + return calls; + } + + /** + * + * @param calls + * @return true if value updated, false otherwise + */ + boolean setCalls(Integer calls) { + if(!ObjectUtils.equals(this.calls, calls)){ + this.calls = calls; + stampLastUpdate(); + return true; + } + return false; + } + + @Override + public Integer getWaiting() { + return calls; } + @Override + public Integer getHoldTime() { + return holdTime; + } + + /** + * + * @param holdTime + * @return true if value updated, false otherwise + */ + boolean setHoldTime(Integer holdTime) { + if(!ObjectUtils.equals(this.holdTime, holdTime)){ + this.holdTime = holdTime; + stampLastUpdate(); + return true; + } + return false; + } + + @Override + public Integer getTalkTime() { + return talkTime; + } + + /** + * + * @param talkTime + * @return true if value updated, false otherwise + */ + boolean setTalkTime(Integer talkTime) { + if(!ObjectUtils.equals(this.talkTime, talkTime)){ + this.talkTime = talkTime; + stampLastUpdate(); + return true; + } + return false; + } + + @Override + public Integer getCompleted() { + return completed; + } + + /** + * + * @param completed + * @return true if value updated, false otherwise + */ + boolean setCompleted(Integer completed) { + if(!ObjectUtils.equals(this.completed, completed)){ + this.completed = completed; + stampLastUpdate(); + return true; + } + return false; + } + + @Override + public Integer getAbandoned() { + return abandoned; + } + + /** + * + * @param abandoned + * @return true if value updated, false otherwise + */ + boolean setAbandoned(Integer abandoned) { + if(!ObjectUtils.equals(this.abandoned, abandoned)){ + this.abandoned = abandoned; + stampLastUpdate(); + return true; + } + + return false; + } + + @Override + public Double getServiceLevelPerf() { + return serviceLevelPerf; + } + + /** + * + * @param serviceLevelPerf + * @return true if value updated, false otherwise + */ + boolean setServiceLevelPerf(Double serviceLevelPerf) { + if(!ObjectUtils.equals(this.serviceLevelPerf, serviceLevelPerf)){ + this.serviceLevelPerf = serviceLevelPerf; + stampLastUpdate(); + return true; + } + return false; + } + public Integer getWeight() { return weight; } - void setWeight(Integer weight) + /** + * + * @param weight + * @return true if value updated, false otherwise + */ + boolean setWeight(Integer weight) { - this.weight = weight; + if(!ObjectUtils.equals(this.weight, weight)){ + this.weight = weight; + stampLastUpdate(); + return true; + } + return false; } public List getEntries() @@ -267,6 +439,13 @@ public String toString() sb.append("strategy='").append(getStrategy()).append("',"); sb.append("serviceLevel='").append(getServiceLevel()).append("',"); sb.append("weight='").append(getWeight()).append("',"); + sb.append("calls='").append(getCalls()).append("',"); + sb.append("holdTime='").append(getHoldTime()).append("',"); + sb.append("talkTime='").append(getTalkTime()).append("',"); + sb.append("completed='").append(getCompleted()).append("',"); + sb.append("abandoned='").append(getAbandoned()).append("',"); + sb.append("serviceLevelPerf='").append(getServiceLevelPerf()).append("',"); + synchronized (entries) { sb.append("entries='").append(entries.toString()).append("',"); @@ -443,7 +622,7 @@ void addMember(AsteriskQueueMemberImpl member) logger.info("Adding new member to the queue " + getName() + ": " + member.toString()); members.put(member.getLocation(), member); } - + fireMemberAdded(member); } @@ -531,7 +710,7 @@ public void removeMember(AsteriskQueueMemberImpl member) + member.toString()); members.remove(member.getLocation()); } - + fireMemberRemoved(member); } @@ -578,4 +757,5 @@ AsteriskQueueEntryImpl getEntry(int position) } return foundEntry; } + } diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java index 3f7ed7b43..9eaddd072 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java @@ -16,11 +16,17 @@ */ package org.asteriskjava.live.internal; -import org.asteriskjava.live.*; -import org.asteriskjava.manager.response.ManagerResponse; -import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.action.QueuePenaltyAction; +import org.apache.commons.lang3.ObjectUtils; +import org.asteriskjava.live.AsteriskQueue; +import org.asteriskjava.live.AsteriskQueueMember; +import org.asteriskjava.live.InvalidPenaltyException; +import org.asteriskjava.live.ManagerCommunicationException; +import org.asteriskjava.live.NoSuchInterfaceException; +import org.asteriskjava.live.QueueMemberState; import org.asteriskjava.manager.action.QueuePauseAction; +import org.asteriskjava.manager.action.QueuePenaltyAction; +import org.asteriskjava.manager.response.ManagerError; +import org.asteriskjava.manager.response.ManagerResponse; /** * Default implementation of a queue member. @@ -37,6 +43,8 @@ class AsteriskQueueMemberImpl extends AbstractLiveObject implements AsteriskQueu private String location; private Integer penalty; private boolean paused; + private Integer callsTaken; + private Long lastCall; private String membership; /** @@ -54,7 +62,8 @@ class AsteriskQueueMemberImpl extends AbstractLiveObject implements AsteriskQueu AsteriskQueueMemberImpl(final AsteriskServerImpl server, final AsteriskQueueImpl queue, String location, QueueMemberState state, boolean paused, - Integer penalty, String membership) + Integer penalty, String membership, + Integer callsTaken, Long lastCall) { super(server); this.queue = queue; @@ -62,6 +71,8 @@ class AsteriskQueueMemberImpl extends AbstractLiveObject implements AsteriskQueu this.state = state; this.penalty = penalty; this.paused = paused; + this.callsTaken =callsTaken; + this.lastCall = lastCall; this.membership = membership; } @@ -80,6 +91,31 @@ public QueueMemberState getState() return state; } + @Override + public Integer getCallsTaken() { + return callsTaken; + } + + public void setCallsTaken(Integer callsTaken) { + this.callsTaken = callsTaken; + } + + /** + * Returns the time the last successful call answered by the added member + * was hungup. + * + * @return the time (in seconds since 01/01/1970) the last successful call + * answered by the added member was hungup. + */ + @Override + public Long getLastCall() { + return lastCall; + } + + public void setLastCall(Long lastCall) { + this.lastCall = lastCall; + } + @Deprecated public boolean getPaused() { return isPaused(); @@ -168,30 +204,65 @@ public String toString() sb.append("paused='").append(paused).append("'"); sb.append("membership='").append(membership).append("'"); sb.append("queue='").append(queue.getName()).append("'"); + sb.append("callsTaken='").append(getCallsTaken()).append("'"); + sb.append("lastCall='").append(getLastCall()).append("'"); sb.append("systemHashcode=").append(System.identityHashCode(this)); sb.append("]"); return sb.toString(); } - synchronized void stateChanged(QueueMemberState state) + synchronized boolean stateChanged(QueueMemberState state) { - QueueMemberState oldState = this.state; - this.state = state; - firePropertyChange(PROPERTY_STATE, oldState, state); + if(!ObjectUtils.equals(this.state, state)){ + QueueMemberState oldState = this.state; + this.state = state; + firePropertyChange(PROPERTY_STATE, oldState, state); + return true; + } + return false; } - synchronized void penaltyChanged(Integer penalty) + synchronized boolean penaltyChanged(Integer penalty) { - Integer oldPenalty = this.penalty; - this.penalty = penalty; - firePropertyChange(PROPERTY_PENALTY, oldPenalty, penalty); + if(!ObjectUtils.equals(this.penalty, penalty)){ + Integer oldPenalty = this.penalty; + this.penalty = penalty; + firePropertyChange(PROPERTY_PENALTY, oldPenalty, penalty); + return true; + } + + return false; } - synchronized void pausedChanged(boolean paused) + synchronized boolean pausedChanged(boolean paused) { - boolean oldPaused = this.paused; - this.paused = paused; - firePropertyChange(PROPERTY_PAUSED, oldPaused, paused); + if(!ObjectUtils.equals(this.paused, paused)){ + boolean oldPaused = this.paused; + this.paused = paused; + firePropertyChange(PROPERTY_PAUSED, oldPaused, paused); + return true; + } + return false; + } + + synchronized boolean callsTakenChanged(Integer callsTaken){ + if(!ObjectUtils.equals(this.callsTaken, callsTaken)){ + Integer oldcallsTaken = this.callsTaken; + this.callsTaken = callsTaken; + firePropertyChange(PROPERTY_CALLSTAKEN, oldcallsTaken, callsTaken); + return true; + } + return false; + } + + synchronized boolean lastCallChanged(Long lastCall){ + if(!ObjectUtils.equals(this.lastCall, lastCall)){ + Long oldlastCall = this.lastCall; + this.lastCall = lastCall; + firePropertyChange(PROPERTY_LASTCALL, oldlastCall, lastCall); + return true; + } + return false; } } diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index d87b5a68c..d3674b4b0 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -449,6 +449,18 @@ public Collection getQueues() throws ManagerCommunicationExceptio return queueManager.getQueues(); } + @Override + public AsteriskQueue getQueueByName(String queueName){ + initializeIfNeeded(); + return queueManager.getQueueByName(queueName); + } + + @Override + public List getQueuesUpdatedAfter(Date date){ + initializeIfNeeded(); + return queueManager.getQueuesUpdatedAfter(date); + } + public synchronized String getVersion() throws ManagerCommunicationException { final ManagerResponse response; @@ -469,7 +481,7 @@ public synchronized String getVersion() throws ManagerCommunicationException response = sendAction(new CommandAction(command)); if (response instanceof CommandResponse) { - final List result; + final List result; result = ((CommandResponse) response).getResult(); if (result.size() > 0) @@ -1128,6 +1140,12 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) return; } + if (channel.wasInState(ChannelState.UP)) + { + cb.onSuccess(channel); + return; + } + if (channel.wasBusy()) { cb.onBusy(channel); @@ -1277,4 +1295,15 @@ void fireNewQueueEntry(AsteriskQueueEntry entry) } } } + + /* OCTAVIO LUNA */ + @Override + public void forceQueuesMonitor(boolean force) { + queueManager.forceQueuesMonitor(force); + } + + @Override + public boolean isQueuesMonitorForced() { + return queueManager.isQueuesMonitorForced(); + } } diff --git a/src/main/java/org/asteriskjava/live/internal/ConfigFileImpl.java b/src/main/java/org/asteriskjava/live/internal/ConfigFileImpl.java deleted file mode 100644 index e3e40ccd2..000000000 --- a/src/main/java/org/asteriskjava/live/internal/ConfigFileImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2004-2006 Stefan Reuter - * - * Licensed 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.asteriskjava.live.internal; - -import org.asteriskjava.config.ConfigFile; - -import java.util.Map; -import java.util.List; - -/** - * ConfigFile implementation based on the config actions of the Manager API. - * - * @author srt - * @version $Id$ - * @since 1.0.0 - */ -public class ConfigFileImpl implements ConfigFile -{ - private final String filename; - private final Map> categories; - - public ConfigFileImpl(String filename, Map> categories) - { - this.filename = filename; - this.categories = categories; - } - - public String getFilename() - { - return filename; - } - - public Map> getCategories() - { - return categories; - } - - public String getValue(String category, String key) - { - throw new UnsupportedOperationException("Not yet inmplemented"); - } - - public List getValues(String category, String key) - { - throw new UnsupportedOperationException("Not yet inmplemented"); - } -} \ No newline at end of file diff --git a/src/main/java/org/asteriskjava/live/internal/QueueManager.java b/src/main/java/org/asteriskjava/live/internal/QueueManager.java index 62e5ad5bf..3a8d9624c 100644 --- a/src/main/java/org/asteriskjava/live/internal/QueueManager.java +++ b/src/main/java/org/asteriskjava/live/internal/QueueManager.java @@ -18,8 +18,11 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.ListIterator; +import java.util.Map.Entry; import org.asteriskjava.live.AsteriskQueue; import org.asteriskjava.live.ManagerCommunicationException; @@ -27,7 +30,17 @@ import org.asteriskjava.manager.EventTimeoutException; import org.asteriskjava.manager.ResponseEvents; import org.asteriskjava.manager.action.QueueStatusAction; -import org.asteriskjava.manager.event.*; +import org.asteriskjava.manager.event.JoinEvent; +import org.asteriskjava.manager.event.LeaveEvent; +import org.asteriskjava.manager.event.ManagerEvent; +import org.asteriskjava.manager.event.QueueEntryEvent; +import org.asteriskjava.manager.event.QueueMemberAddedEvent; +import org.asteriskjava.manager.event.QueueMemberEvent; +import org.asteriskjava.manager.event.QueueMemberPausedEvent; +import org.asteriskjava.manager.event.QueueMemberPenaltyEvent; +import org.asteriskjava.manager.event.QueueMemberRemovedEvent; +import org.asteriskjava.manager.event.QueueMemberStatusEvent; +import org.asteriskjava.manager.event.QueueParamsEvent; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; @@ -43,17 +56,20 @@ class QueueManager private final AsteriskServerImpl server; private final ChannelManager channelManager; + private boolean queuesMonitorForced = false; + private long queueMonitorLastTimeReloaded; + private long queuesMonitorLeaseTime = 1000; /** * A map of ACD queues by there name. + * 101119 OLB: Modified to act as a LRU Cache to optimize updates */ - private final Map queues; + private final LinkedHashMap queuesLRU = new LinkedHashMap(); QueueManager(AsteriskServerImpl server, ChannelManager channelManager) { this.server = server; this.channelManager = channelManager; - this.queues = new HashMap(); } void initialize() throws ManagerCommunicationException @@ -95,17 +111,71 @@ else if (event instanceof QueueEntryEvent) handleQueueEntryEvent((QueueEntryEvent) event); } } + } + /** + * Method to ask for a Queue data update + * @author Octavio Luna + * @param queue + * @throws ManagerCommunicationException + */ + void updateQueue(String queue) throws ManagerCommunicationException + { + ResponseEvents re; + + try + { + QueueStatusAction queueStatusAction = new QueueStatusAction(); + queueStatusAction.setQueue(queue); + re = server.sendEventGeneratingAction(queueStatusAction); + } + catch (ManagerCommunicationException e) + { + final Throwable cause = e.getCause(); + + if (cause instanceof EventTimeoutException) + { + // this happens with Asterisk 1.0.x as it doesn't send a + // QueueStatusCompleteEvent + re = ((EventTimeoutException) cause).getPartialResult(); + } + else + { + throw e; + } + } + + for (ManagerEvent event : re.getEvents()) + { + //101119 OLB: solo actualizamos el QUEUE por ahora + if (event instanceof QueueParamsEvent) + { + handleQueueParamsEvent((QueueParamsEvent) event); + } + + else if (event instanceof QueueMemberEvent) + { + handleQueueMemberEvent((QueueMemberEvent) event); + } + else if (event instanceof QueueEntryEvent) + { + handleQueueEntryEvent((QueueEntryEvent) event); + } + + } + } + + void disconnected() { - synchronized (queues) + synchronized (queuesLRU) { - for(AsteriskQueueImpl queue : queues.values()) + for(AsteriskQueueImpl queue : queuesLRU.values()) { queue.cancelServiceLevelTimer(); } - queues.clear(); + queuesLRU.clear(); } } @@ -116,15 +186,42 @@ void disconnected() */ Collection getQueues() { - Collection copy; + refreshQueuesIfForced(); + + Collection copy; - synchronized (queues) + synchronized (queuesLRU) { - copy = new ArrayList(queues.values()); + copy = new ArrayList(queuesLRU.values()); } return copy; } + public List getQueuesUpdatedAfter(Date date) { + refreshQueuesIfForced(); + + List copy = new ArrayList(); + synchronized (queuesLRU) { + List>list = + new ArrayList>(queuesLRU.entrySet()); + ListIterator> iter = + list.listIterator(list.size()); + + Entry entry; + while(iter.hasPrevious()){ + entry = iter.previous(); + AsteriskQueueImpl astQueue = entry.getValue(); + if(astQueue.getLastUpdateMillis() <= date.getTime()){ + break; + } + copy.add(astQueue); + } + + } + + return copy; + } + /** * Adds a queue to the internal map, keyed by name. * @@ -132,9 +229,9 @@ Collection getQueues() */ private void addQueue(AsteriskQueueImpl queue) { - synchronized (queues) + synchronized (queuesLRU) { - queues.put(queue.getName(), queue); + queuesLRU.put(queue.getName(), queue); } } @@ -146,23 +243,27 @@ private void addQueue(AsteriskQueueImpl queue) private void handleQueueParamsEvent(QueueParamsEvent event) { AsteriskQueueImpl queue; - final String name; - final Integer max; - final String strategy; - final Integer serviceLevel; - final Integer weight; - name = event.getQueue(); - max = event.getMax(); - strategy = event.getStrategy(); - serviceLevel = event.getServiceLevel(); - weight = event.getWeight(); + final String name = event.getQueue(); + final Integer max = event.getMax(); + final String strategy = event.getStrategy(); + final Integer serviceLevel = event.getServiceLevel(); + final Integer weight = event.getWeight(); + final Integer calls = event.getCalls(); + final Integer holdTime = event.getHoldTime(); + final Integer talkTime = event.getTalkTime(); + final Integer completed = event.getCompleted(); + final Integer abandoned = event.getAbandoned(); + final Double serviceLevelPerf = event.getServiceLevelPerf(); + - queue = queues.get(name); + queue = getInternalQueueByName(name); if (queue == null) { - queue = new AsteriskQueueImpl(server, name, max, strategy, serviceLevel, weight); + queue = new AsteriskQueueImpl( + server, name, max, strategy, serviceLevel, weight, + calls, holdTime, talkTime, completed, abandoned, serviceLevelPerf); logger.info("Adding new queue " + queue); addQueue(queue); } @@ -172,9 +273,22 @@ private void handleQueueParamsEvent(QueueParamsEvent event) // So the queue should never be in the queues list synchronized (queue) { - queue.setMax(max); - queue.setServiceLevel(serviceLevel); - queue.setWeight(weight); + synchronized (queuesLRU){ + + if(queue.setMax(max) | + queue.setServiceLevel(serviceLevel) | + queue.setWeight(weight) | + queue.setCalls(calls) | + queue.setHoldTime(holdTime) | + queue.setTalkTime(talkTime) | + queue.setCompleted(completed) | + queue.setAbandoned(abandoned) | + queue.setServiceLevelPerf(serviceLevelPerf)){ + + queuesLRU.remove(queue.getName()); + queuesLRU.put(queue.getName(), queue); + } + } } } } @@ -186,7 +300,7 @@ private void handleQueueParamsEvent(QueueParamsEvent event) */ private void handleQueueMemberEvent(QueueMemberEvent event) { - final AsteriskQueueImpl queue = queues.get(event.getQueue()); + final AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); if (queue == null) { logger.error("Ignored QueueEntryEvent for unknown queue " + event.getQueue()); @@ -197,10 +311,21 @@ private void handleQueueMemberEvent(QueueMemberEvent event) if (member == null) { member = new AsteriskQueueMemberImpl(server, queue, event.getLocation(), - QueueMemberState.valueOf(event.getStatus()), event.getPaused(), - event.getPenalty(), event.getMembership()); + QueueMemberState.valueOf(event.getStatus()), event.getPaused(), + event.getPenalty(), event.getMembership(), event.getCallsTaken(), + event.getLastCall()); + + queue.addMember(member); + }else{ + if(member.stateChanged(QueueMemberState.valueOf(event.getStatus())) | + member.pausedChanged(event.getPaused()) | + member.penaltyChanged(event.getPenalty()) | + member.callsTakenChanged(event.getCallsTaken()) | + member.lastCallChanged(event.getLastCall())){ + queue.stampLastUpdate(); + } } - queue.addMember(member); + } /** @@ -211,7 +336,7 @@ private void handleQueueMemberEvent(QueueMemberEvent event) */ private void handleQueueEntryEvent(QueueEntryEvent event) { - final AsteriskQueueImpl queue = getQueueByName(event.getQueue()); + final AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); final AsteriskChannelImpl channel = channelManager .getChannelImplByName(event.getChannel()); @@ -228,7 +353,7 @@ private void handleQueueEntryEvent(QueueEntryEvent event) if (queue.getEntry(event.getChannel()) != null) { - logger.error("Ignored duplicate queue entry during population in queue " + logger.debug("Ignored duplicate queue entry during population in queue " + event.getQueue() + " for channel " + event.getChannel()); return; } @@ -249,7 +374,7 @@ private void handleQueueEntryEvent(QueueEntryEvent event) */ void handleJoinEvent(JoinEvent event) { - final AsteriskQueueImpl queue = getQueueByName(event.getQueue()); + final AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); final AsteriskChannelImpl channel = channelManager.getChannelImplByName(event.getChannel()); if (queue == null) @@ -286,7 +411,7 @@ void handleJoinEvent(JoinEvent event) */ void handleLeaveEvent(LeaveEvent event) { - final AsteriskQueueImpl queue = getQueueByName(event.getQueue()); + final AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); final AsteriskChannelImpl channel = channelManager.getChannelImplByName(event.getChannel()); if (queue == null) @@ -319,7 +444,7 @@ void handleLeaveEvent(LeaveEvent event) */ void handleQueueMemberStatusEvent(QueueMemberStatusEvent event) { - AsteriskQueueImpl queue = getQueueByName(event.getQueue()); + AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); if (queue == null) { @@ -334,13 +459,18 @@ void handleQueueMemberStatusEvent(QueueMemberStatusEvent event) return; } + updateQueue(queue.getName()); + member.stateChanged(QueueMemberState.valueOf(event.getStatus())); member.penaltyChanged(event.getPenalty()); + member.lastCallChanged(event.getLastCall()); + member.callsTakenChanged(event.getCallsTaken()); + queue.fireMemberStateChanged(member); } void handleQueueMemberPausedEvent(QueueMemberPausedEvent event) { - AsteriskQueueImpl queue = getQueueByName(event.getQueue()); + AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); if (queue == null) { @@ -357,10 +487,10 @@ void handleQueueMemberPausedEvent(QueueMemberPausedEvent event) { member.pausedChanged(event.getPaused()); } - + void handleQueueMemberPenaltyEvent(QueueMemberPenaltyEvent event) { - AsteriskQueueImpl queue = getQueueByName(event.getQueue()); + AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); if (queue == null) { @@ -384,29 +514,54 @@ void handleQueueMemberPenaltyEvent(QueueMemberPenaltyEvent event) * @param queueName name of the queue. * @return the requested queue or null if there is no queue with the given name. */ - private AsteriskQueueImpl getQueueByName(String queueName) + AsteriskQueueImpl getQueueByName(String queueName) { - AsteriskQueueImpl queue; + refreshQueueIfForced(queueName); - synchronized (queues) - { - queue = queues.get(queueName); - } + AsteriskQueueImpl queue = getInternalQueueByName(queueName); if (queue == null) { logger.error("Requested queue '" + queueName + "' not found!"); } + + return queue; + } + + private AsteriskQueueImpl getInternalQueueByName(String queueName) + { + AsteriskQueueImpl queue; + + synchronized (queuesLRU) + { + queue = queuesLRU.get(queueName); + } return queue; } - /** + private void refreshQueueIfForced(String queueName) { + if(queuesMonitorForced){ + updateQueue(queueName); + } + } + + private void refreshQueuesIfForced() { + if(queuesMonitorForced){ + if((System.currentTimeMillis()-queueMonitorLastTimeReloaded) > + queuesMonitorLeaseTime){ + initialize(); + queueMonitorLastTimeReloaded = System.currentTimeMillis(); + } + } + } + + /** * Challange a QueueMemberAddedEvent. * * @param event - the generated QueueMemberAddedEvent. */ public void handleQueueMemberAddedEvent(QueueMemberAddedEvent event) { - final AsteriskQueueImpl queue = queues.get(event.getQueue()); + final AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); if (queue == null) { logger.error("Ignored QueueMemberAddedEvent for unknown queue " + event.getQueue()); @@ -418,7 +573,8 @@ public void handleQueueMemberAddedEvent(QueueMemberAddedEvent event) { member = new AsteriskQueueMemberImpl(server, queue, event.getLocation(), QueueMemberState.valueOf(event.getStatus()), event.getPaused(), - event.getPenalty(), event.getMembership()); + event.getPenalty(), event.getMembership(), event.getCallsTaken(), + event.getLastCall()); } queue.addMember(member); @@ -431,7 +587,7 @@ public void handleQueueMemberAddedEvent(QueueMemberAddedEvent event) */ public void handleQueueMemberRemovedEvent(QueueMemberRemovedEvent event) { - final AsteriskQueueImpl queue = queues.get(event.getQueue()); + final AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); if (queue == null) { logger.error("Ignored QueueMemberRemovedEvent for unknown queue " + event.getQueue()); @@ -449,4 +605,12 @@ public void handleQueueMemberRemovedEvent(QueueMemberRemovedEvent event) queue.removeMember(member); } + + public void forceQueuesMonitor(boolean force) { + queuesMonitorForced = force; + } + + public boolean isQueuesMonitorForced() { + return queuesMonitorForced; + } } diff --git a/src/test/java/org/asteriskjava/live/internal/AsteriskQueueMemberImplTest.java b/src/test/java/org/asteriskjava/live/internal/AsteriskQueueMemberImplTest.java index d361b1c69..475c467dd 100644 --- a/src/test/java/org/asteriskjava/live/internal/AsteriskQueueMemberImplTest.java +++ b/src/test/java/org/asteriskjava/live/internal/AsteriskQueueMemberImplTest.java @@ -46,9 +46,10 @@ public void setUp() server = new AsteriskServerImpl(); // ChannelManager channelManager = new ChannelManager(server); // qManager = new QueueManager(server, channelManager); - queue = new AsteriskQueueImpl(server, "test", 25, "RoundRobin", 15, 5); + queue = new AsteriskQueueImpl(server, "test", 25, "RoundRobin", 15, 5, + 0, 0, 1, 1, 1, 1.0); queueMember = new AsteriskQueueMemberImpl(server, queue, "Agent/777", QueueMemberState.DEVICE_UNKNOWN, false, 10, - "dynamic"); + "dynamic", 3, 6000l); numberOfChanges = 0; } From b512499eb1ba617951f504b2b11c4c0a81c6b5f5 Mon Sep 17 00:00:00 2001 From: Octavio Luna Date: Thu, 23 Jan 2014 16:42:08 -0600 Subject: [PATCH 0027/1055] Added a missing file and a fix for initialization of the live Server --- .../live/internal/AsteriskServerImpl.java | 43 ++++++------- .../live/internal/ConfigFileImpl.java | 61 +++++++++++++++++++ 2 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 src/main/java/org/asteriskjava/live/internal/ConfigFileImpl.java diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index d3674b4b0..6248a555a 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -198,26 +198,6 @@ private synchronized void initializeIfNeeded() throws ManagerCommunicationExcept } } - channelManager.initialize(); - agentManager.initialize(); - meetMeManager.initialize(); - if (!skipQueues) - { - queueManager.initialize(); - } - - if (asyncEventHandling && managerEventListenerProxy == null) - { - managerEventListenerProxy = new ManagerEventListenerProxy(this); - eventConnection.addEventListener(managerEventListenerProxy); - } - else if (!asyncEventHandling && eventListener == null) - { - eventListener = this; - eventConnection.addEventListener(eventListener); - } - logger.info("Initializing done"); - initialized = true; } /* Implementation of the AsteriskServer interface */ @@ -767,8 +747,8 @@ public ConfigFile getConfig(String filename) throws ManagerCommunicationExceptio getConfigResponse = (GetConfigResponse) response; - final Map> categories = new LinkedHashMap>(); final Map categoryMap = getConfigResponse.getCategories(); + final Map> categories = new LinkedHashMap>(); for (Map.Entry categoryEntry : categoryMap.entrySet()) { final List lines; @@ -1088,6 +1068,27 @@ private void handleConnectEvent(ConnectEvent connectEvent) try { initialize(); + + channelManager.initialize(); + agentManager.initialize(); + meetMeManager.initialize(); + if (!skipQueues) + { + queueManager.initialize(); + } + + if (asyncEventHandling && managerEventListenerProxy == null) + { + managerEventListenerProxy = new ManagerEventListenerProxy(this); + eventConnection.addEventListener(managerEventListenerProxy); + } + else if (!asyncEventHandling && eventListener == null) + { + eventListener = this; + eventConnection.addEventListener(eventListener); + } + logger.info("Initializing done"); + initialized = true; } catch (Exception e) { diff --git a/src/main/java/org/asteriskjava/live/internal/ConfigFileImpl.java b/src/main/java/org/asteriskjava/live/internal/ConfigFileImpl.java new file mode 100644 index 000000000..e3e40ccd2 --- /dev/null +++ b/src/main/java/org/asteriskjava/live/internal/ConfigFileImpl.java @@ -0,0 +1,61 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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.asteriskjava.live.internal; + +import org.asteriskjava.config.ConfigFile; + +import java.util.Map; +import java.util.List; + +/** + * ConfigFile implementation based on the config actions of the Manager API. + * + * @author srt + * @version $Id$ + * @since 1.0.0 + */ +public class ConfigFileImpl implements ConfigFile +{ + private final String filename; + private final Map> categories; + + public ConfigFileImpl(String filename, Map> categories) + { + this.filename = filename; + this.categories = categories; + } + + public String getFilename() + { + return filename; + } + + public Map> getCategories() + { + return categories; + } + + public String getValue(String category, String key) + { + throw new UnsupportedOperationException("Not yet inmplemented"); + } + + public List getValues(String category, String key) + { + throw new UnsupportedOperationException("Not yet inmplemented"); + } +} \ No newline at end of file From 351e6bdf0acdd841687039e9eecc30697eaac6a3 Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Thu, 7 Aug 2014 10:44:05 +0300 Subject: [PATCH 0028/1055] AJ-430 AJ-341 -- added asterisk version 11 --- .../org/asteriskjava/AsteriskVersion.java | 9 + .../fastagi/internal/AgiChannelFactory.java | 52 ++--- .../internal/DefaultAgiChannelFactory.java | 36 +-- .../asteriskjava/manager/event/DialEvent.java | 51 ++++- .../manager/event/HangupEvent.java | 50 +++++ .../manager/event/QueueMemberStatusEvent.java | 13 +- .../internal/ManagerConnectionImpl.java | 4 + .../manager/response/PingResponse.java | 11 + .../manager/response/SipShowPeerResponse.java | 205 +++++++++++++++++- 9 files changed, 384 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/asteriskjava/AsteriskVersion.java b/src/main/java/org/asteriskjava/AsteriskVersion.java index 1c4c27ae8..5e196d725 100644 --- a/src/main/java/org/asteriskjava/AsteriskVersion.java +++ b/src/main/java/org/asteriskjava/AsteriskVersion.java @@ -60,6 +60,15 @@ public class AsteriskVersion implements Comparable, Serializabl * @since 1.0.0 */ public static final AsteriskVersion ASTERISK_1_8 = new AsteriskVersion(180, "Asterisk 1.8"); + + /** + * Represents the Asterisk 1.8 series. + * + * @since 1.0.0 + */ + public static final AsteriskVersion ASTERISK_11 = new AsteriskVersion(111, "Asterisk 11"); + + /** * Serial version identifier. */ diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelFactory.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelFactory.java index 01a221f25..2365a186d 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelFactory.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelFactory.java @@ -1,26 +1,26 @@ -package org.asteriskjava.fastagi.internal; - -import org.asteriskjava.fastagi.AgiChannel; -import org.asteriskjava.fastagi.AgiRequest; - -/** - * An AgiChannelFactory creates instances of AgiChannels, - * that are passed to agi scripts. - *

- * An instance of the AgiChannelFactory can be passed to the - * DefaultAgiServer's constructor. - * - * @since 1.0.0 - */ -public interface AgiChannelFactory -{ - /** - * Creates a new AgiChannel. - * - * @param request the request to build the channel for. - * @param agiWriter the writer. - * @param agiReader the reader. - * @return the created channel. - */ - AgiChannel createAgiChannel(AgiRequest request, AgiWriter agiWriter, AgiReader agiReader); -} +package org.asteriskjava.fastagi.internal; + +import org.asteriskjava.fastagi.AgiChannel; +import org.asteriskjava.fastagi.AgiRequest; + +/** + * An AgiChannelFactory creates instances of AgiChannels, + * that are passed to agi scripts. + *

+ * An instance of the AgiChannelFactory can be passed to the + * DefaultAgiServer's constructor. + * + * @since 1.0.0 + */ +public interface AgiChannelFactory +{ + /** + * Creates a new AgiChannel. + * + * @param request the request to build the channel for. + * @param agiWriter the writer. + * @param agiReader the reader. + * @return the created channel. + */ + AgiChannel createAgiChannel(AgiRequest request, AgiWriter agiWriter, AgiReader agiReader); +} diff --git a/src/main/java/org/asteriskjava/fastagi/internal/DefaultAgiChannelFactory.java b/src/main/java/org/asteriskjava/fastagi/internal/DefaultAgiChannelFactory.java index 9193bdd45..44ced44d0 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/DefaultAgiChannelFactory.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/DefaultAgiChannelFactory.java @@ -1,18 +1,18 @@ -package org.asteriskjava.fastagi.internal; - -import org.asteriskjava.fastagi.AgiChannel; -import org.asteriskjava.fastagi.AgiRequest; - -/** - * If no other factory is passed to DefaultAgiServer's constructor, - * an instance of this one will be used. The DefaultAgiChannelFactory - * creates AgiChannelImpl instances, that are passed to the agi scripts. - */ -public class DefaultAgiChannelFactory implements AgiChannelFactory -{ - @Override - public AgiChannel createAgiChannel(AgiRequest request, AgiWriter agiWriter, AgiReader agiReader) - { - return new AgiChannelImpl(request, agiWriter, agiReader); - } -} +package org.asteriskjava.fastagi.internal; + +import org.asteriskjava.fastagi.AgiChannel; +import org.asteriskjava.fastagi.AgiRequest; + +/** + * If no other factory is passed to DefaultAgiServer's constructor, + * an instance of this one will be used. The DefaultAgiChannelFactory + * creates AgiChannelImpl instances, that are passed to the agi scripts. + */ +public class DefaultAgiChannelFactory implements AgiChannelFactory +{ + @Override + public AgiChannel createAgiChannel(AgiRequest request, AgiWriter agiWriter, AgiReader agiReader) + { + return new AgiChannelImpl(request, agiWriter, agiReader); + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DialEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEvent.java index 8d95c9405..25e27edd8 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEvent.java @@ -79,7 +79,11 @@ public class DialEvent extends ManagerEvent private String dialString; private String dialStatus; - + + private String connectedLineNum; + + private String connectedLineName; + public DialEvent(Object source) { super(source); @@ -343,4 +347,49 @@ public void setDialStatus(String dialStatus) { this.dialStatus = dialStatus; } + + public String getConnectedLineNum() { + return connectedLineNum; + } + + public void setConnectedLineNum(String connectedLineNum) { + this.connectedLineNum = connectedLineNum; + } + + public String getConnectedLineName() { + return connectedLineName; + } + + public void setConnectedLineName(String connectedLineName) { + this.connectedLineName = connectedLineName; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("DialEvent [subEvent="); + builder.append(subEvent); + builder.append(", channel="); + builder.append(channel); + builder.append(", destination="); + builder.append(destination); + builder.append(", callerIdNum="); + builder.append(callerIdNum); + builder.append(", callerIdName="); + builder.append(callerIdName); + builder.append(", uniqueId="); + builder.append(uniqueId); + builder.append(", destUniqueId="); + builder.append(destUniqueId); + builder.append(", dialString="); + builder.append(dialString); + builder.append(", dialStatus="); + builder.append(dialStatus); + builder.append(", connectedLineNum="); + builder.append(connectedLineNum); + builder.append(", connectedLineName="); + builder.append(connectedLineName); + builder.append("]"); + return builder.toString(); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/HangupEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupEvent.java index 83c4c42ac..3cda9e209 100644 --- a/src/main/java/org/asteriskjava/manager/event/HangupEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HangupEvent.java @@ -33,6 +33,13 @@ public class HangupEvent extends AbstractChannelEvent private Integer cause; private String causeTxt; + private String accountCode; + + private String connectedLineNum; + + private String connectedLineName; + + public HangupEvent(Object source) { super(source); @@ -80,4 +87,47 @@ public void setCauseTxt(String causeTxt) { this.causeTxt = causeTxt; } + + public String getAccountCode() { + return accountCode; + } + + public void setAccountCode(String accountCode) { + this.accountCode = accountCode; + } + + public String getConnectedLineNum() { + return connectedLineNum; + } + + public void setConnectedLineNum(String connectedLineNum) { + this.connectedLineNum = connectedLineNum; + } + + public String getConnectedLineName() { + return connectedLineName; + } + + public void setConnectedLineName(String connectedLineName) { + this.connectedLineName = connectedLineName; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("HangupEvent [cause="); + builder.append(cause); + builder.append(", causeTxt="); + builder.append(causeTxt); + builder.append(", accountCode="); + builder.append(accountCode); + builder.append(", connectedLineNum="); + builder.append(connectedLineNum); + builder.append(", connectedLineName="); + builder.append(connectedLineName); + builder.append("]"); + return builder.toString(); + } + + } diff --git a/src/main/java/org/asteriskjava/manager/event/QueueMemberStatusEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueMemberStatusEvent.java index 6c6062189..5f43208da 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueMemberStatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueMemberStatusEvent.java @@ -29,7 +29,18 @@ public class QueueMemberStatusEvent extends QueueMemberEvent */ private static final long serialVersionUID = -2293926744791895763L; - /** + private String stateInterface; + + + public String getStateInterface() { + return stateInterface; + } + + public void setStateInterface(String stateInterface) { + this.stateInterface = stateInterface; + } + + /** * @param source */ public QueueMemberStatusEvent(Object source) diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index f2dac8155..aaabceef6 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -658,6 +658,10 @@ else if (line1 != null && line1.contains("No such command")) else if (coreLine != null && coreLine.startsWith("Asterisk 1.8")) { return AsteriskVersion.ASTERISK_1_8; + } + else if (coreLine != null && coreLine.startsWith("Asterisk 11")) + { + return AsteriskVersion.ASTERISK_11; } } } diff --git a/src/main/java/org/asteriskjava/manager/response/PingResponse.java b/src/main/java/org/asteriskjava/manager/response/PingResponse.java index c0b77282c..8869c3576 100644 --- a/src/main/java/org/asteriskjava/manager/response/PingResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/PingResponse.java @@ -29,6 +29,8 @@ public class PingResponse extends ManagerResponse private String ping; + private String timestamp; + /** * Returns always "Pong". * @@ -43,4 +45,13 @@ public void setPing(String ping) { this.ping = ping; } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + } \ No newline at end of file diff --git a/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java b/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java index a87d07d98..38c1efb05 100644 --- a/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java @@ -68,7 +68,16 @@ public class SipShowPeerResponse extends ManagerResponse private String sipUserAgent; private String regContact; private Integer qualifyFreq; // "%d ms" - private String parkingLot; + private String parkingLot; + private Integer maxForwards; + + private String toneZone; + private String sipUseReasonHeader; + private String sipEncryption; + private String sipForcerport; + private String sipRtpEngine; + private String sipComedia; + private Map chanVariable; @@ -643,4 +652,198 @@ public Map getChanVariable() { public void setChanVariable(final Map chanVariable) { this.chanVariable = chanVariable; } + + + public Integer getMaxForwards() { + return maxForwards; + } + + public void setMaxForwards(Integer maxForwards) { + this.maxForwards = maxForwards; + } + + public String getToneZone() { + return toneZone; + } + + public void setToneZone(String toneZone) { + this.toneZone = toneZone; + } + + public String getSipUseReasonHeader() { + return sipUseReasonHeader; + } + + public void setSipUseReasonHeader(String sipUseReasonHeader) { + this.sipUseReasonHeader = sipUseReasonHeader; + } + + + + public String getSipEncryption() { + return sipEncryption; + } + + public void setSipEncryption(String sipEncryption) { + this.sipEncryption = sipEncryption; + } + + public String getSipForcerport() { + return sipForcerport; + } + + public void setSipForcerport(String sipForcerport) { + this.sipForcerport = sipForcerport; + } + + public String getSipRtpEngine() { + return sipRtpEngine; + } + + public void setSipRtpEngine(String sipRtpEngine) { + this.sipRtpEngine = sipRtpEngine; + } + + public String getSipComedia() { + return sipComedia; + } + + public void setSipComedia(String sipComedia) { + this.sipComedia = sipComedia; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("SipShowPeerResponse [channelType="); + builder.append(channelType); + builder.append(", objectName="); + builder.append(objectName); + builder.append(", chanObjectType="); + builder.append(chanObjectType); + builder.append(", secretExist="); + builder.append(secretExist); + builder.append(", md5SecretExist="); + builder.append(md5SecretExist); + builder.append(", remoteSecretExist="); + builder.append(remoteSecretExist); + builder.append(", context="); + builder.append(context); + builder.append(", language="); + builder.append(language); + builder.append(", accountCode="); + builder.append(accountCode); + builder.append(", amaFlags="); + builder.append(amaFlags); + builder.append(", cidCallingPres="); + builder.append(cidCallingPres); + builder.append(", sipFromUser="); + builder.append(sipFromUser); + builder.append(", sipFromDomain="); + builder.append(sipFromDomain); + builder.append(", callGroup="); + builder.append(callGroup); + builder.append(", pickupGroup="); + builder.append(pickupGroup); + builder.append(", voiceMailbox="); + builder.append(voiceMailbox); + builder.append(", transferMode="); + builder.append(transferMode); + builder.append(", lastMsgsSent="); + builder.append(lastMsgsSent); + builder.append(", callLimit="); + builder.append(callLimit); + builder.append(", busyLevel="); + builder.append(busyLevel); + builder.append(", maxCallBr="); + builder.append(maxCallBr); + builder.append(", dynamic="); + builder.append(dynamic); + builder.append(", callerId="); + builder.append(callerId); + builder.append(", regExpire="); + builder.append(regExpire); + builder.append(", sipAuthInsecure="); + builder.append(sipAuthInsecure); + builder.append(", sipNatSupport="); + builder.append(sipNatSupport); + builder.append(", acl="); + builder.append(acl); + builder.append(", sipT38support="); + builder.append(sipT38support); + builder.append(", sipT38ec="); + builder.append(sipT38ec); + builder.append(", sipT38MaxDtgrm="); + builder.append(sipT38MaxDtgrm); + builder.append(", sipDirectMedia="); + builder.append(sipDirectMedia); + builder.append(", sipCanReinvite="); + builder.append(sipCanReinvite); + builder.append(", sipPromiscRedir="); + builder.append(sipPromiscRedir); + builder.append(", sipUserPhone="); + builder.append(sipUserPhone); + builder.append(", sipVideoSupport="); + builder.append(sipVideoSupport); + builder.append(", sipTextSupport="); + builder.append(sipTextSupport); + builder.append(", sipSessTimers="); + builder.append(sipSessTimers); + builder.append(", sipSessRefresh="); + builder.append(sipSessRefresh); + builder.append(", sipSessExpires="); + builder.append(sipSessExpires); + builder.append(", sipSessMin="); + builder.append(sipSessMin); + builder.append(", sipDtmfMode="); + builder.append(sipDtmfMode); + builder.append(", toHost="); + builder.append(toHost); + builder.append(", addressIp="); + builder.append(addressIp); + builder.append(", addressPort="); + builder.append(addressPort); + builder.append(", defaultAddrIp="); + builder.append(defaultAddrIp); + builder.append(", defaultAddrPort="); + builder.append(defaultAddrPort); + builder.append(", defaultUsername="); + builder.append(defaultUsername); + builder.append(", regExtension="); + builder.append(regExtension); + builder.append(", codecs="); + builder.append(codecs); + builder.append(", codecOrder="); + builder.append(codecOrder); + builder.append(", status="); + builder.append(status); + builder.append(", sipUserAgent="); + builder.append(sipUserAgent); + builder.append(", regContact="); + builder.append(regContact); + builder.append(", qualifyFreq="); + builder.append(qualifyFreq); + builder.append(", parkingLot="); + builder.append(parkingLot); + builder.append(", maxForwards="); + builder.append(maxForwards); + builder.append(", toneZone="); + builder.append(toneZone); + builder.append(", sipUseReasonHeader="); + builder.append(sipUseReasonHeader); + builder.append(", sipEncryption="); + builder.append(sipEncryption); + builder.append(", sipForcerport="); + builder.append(sipForcerport); + builder.append(", sipRtpEngine="); + builder.append(sipRtpEngine); + builder.append(", sipComedia="); + builder.append(sipComedia); + builder.append(", chanVariable="); + builder.append(chanVariable); + builder.append("]"); + return builder.toString(); + } + + } From 21dd6532376a04b9868553077bc889f1a3e1bd40 Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Thu, 7 Aug 2014 10:48:03 +0300 Subject: [PATCH 0029/1055] -- fixed asterisk 11 comment version --- src/main/java/org/asteriskjava/AsteriskVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/AsteriskVersion.java b/src/main/java/org/asteriskjava/AsteriskVersion.java index 5e196d725..cb44d53ab 100644 --- a/src/main/java/org/asteriskjava/AsteriskVersion.java +++ b/src/main/java/org/asteriskjava/AsteriskVersion.java @@ -62,7 +62,7 @@ public class AsteriskVersion implements Comparable, Serializabl public static final AsteriskVersion ASTERISK_1_8 = new AsteriskVersion(180, "Asterisk 1.8"); /** - * Represents the Asterisk 1.8 series. + * Represents the Asterisk 11 series. * * @since 1.0.0 */ From 97c3fe3f49a0912ca95b6d3d7ccb297150f53e76 Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Tue, 23 Sep 2014 07:54:03 +0300 Subject: [PATCH 0030/1055] -- fix for https://issues.reucon.com/browse/AJ-342 regarding asterisk java does not reconnect if the tace feature is disabled --- .../util/internal/SocketConnectionFacadeImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java index 21b87b942..ac5c55e32 100644 --- a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java +++ b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java @@ -180,7 +180,11 @@ public void close() throws IOException { socket.close(); scanner.close(); - trace.close(); + + // close the trace only if it was activated (the object is not null) + if (trace != null){ + trace.close(); + } } public boolean isConnected() From e152245580515c4937dc490b23b801f6af401f66 Mon Sep 17 00:00:00 2001 From: woru Date: Fri, 14 Nov 2014 10:32:35 +0100 Subject: [PATCH 0031/1055] fixed https://issues.reucon.com/browse/AJ-346 --- .../manager/AbstractManagerEventListener.java | 16 +++--- .../AbstractManagerEventListenerTest.java | 49 +++++++++++++++++++ 2 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 src/test/java/org/asteriskjava/manager/AbstractManagerEventListenerTest.java diff --git a/src/main/java/org/asteriskjava/manager/AbstractManagerEventListener.java b/src/main/java/org/asteriskjava/manager/AbstractManagerEventListener.java index 38bd4725b..d1c5040c5 100755 --- a/src/main/java/org/asteriskjava/manager/AbstractManagerEventListener.java +++ b/src/main/java/org/asteriskjava/manager/AbstractManagerEventListener.java @@ -475,6 +475,14 @@ else if (event instanceof ProtocolIdentifierReceivedEvent) { handleEvent((ProtocolIdentifierReceivedEvent) event); } + else if (event instanceof JoinEvent) + { + handleEvent((JoinEvent) event); + } + else if (event instanceof LeaveEvent) + { + handleEvent((LeaveEvent) event); + } else if (event instanceof QueueEvent) { handleEvent((QueueEvent) event); @@ -619,14 +627,6 @@ else if (event instanceof DbGetResponseEvent) { handleEvent((DbGetResponseEvent) event); } - else if (event instanceof JoinEvent) - { - handleEvent((JoinEvent) event); - } - else if (event instanceof LeaveEvent) - { - handleEvent((LeaveEvent) event); - } else if (event instanceof BridgeEvent) { handleEvent((BridgeEvent) event); diff --git a/src/test/java/org/asteriskjava/manager/AbstractManagerEventListenerTest.java b/src/test/java/org/asteriskjava/manager/AbstractManagerEventListenerTest.java new file mode 100644 index 000000000..6d12547fe --- /dev/null +++ b/src/test/java/org/asteriskjava/manager/AbstractManagerEventListenerTest.java @@ -0,0 +1,49 @@ +package org.asteriskjava.manager; + +import org.asteriskjava.manager.event.JoinEvent; +import org.asteriskjava.manager.event.LeaveEvent; +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +public class AbstractManagerEventListenerTest { + + @Test + public void shouldHandleJoinEvent() { + //given + EventListener listener = new EventListener(); + + //when + listener.onManagerEvent(new JoinEvent(this)); + + //then + assertTrue(listener.joinEventHandled); + } + + @Test + public void shouldHandleLeaveEvent() { + //given + EventListener listener = new EventListener(); + + //when + listener.onManagerEvent(new LeaveEvent(this)); + + //then + assertTrue(listener.leaveEventHandled); + } + + private static class EventListener extends AbstractManagerEventListener { + public boolean joinEventHandled; + public boolean leaveEventHandled; + + @Override + protected void handleEvent(JoinEvent event) { + this.joinEventHandled = true; + } + + @Override + protected void handleEvent(LeaveEvent event) { + this.leaveEventHandled = true; + } + } +} \ No newline at end of file From da42e77f375d3d65d42ec00485a23133b28796b1 Mon Sep 17 00:00:00 2001 From: Jirka Hlavacek Date: Tue, 16 Dec 2014 15:38:07 +0100 Subject: [PATCH 0032/1055] Add monitor start/stop event processing --- .../asteriskjava/live/AsteriskChannel.java | 9 ++++ .../live/internal/AsteriskChannelImpl.java | 14 +++++ .../live/internal/AsteriskServerImpl.java | 8 +++ .../live/internal/ChannelManager.java | 51 +++++++++++++++++++ 4 files changed, 82 insertions(+) diff --git a/src/main/java/org/asteriskjava/live/AsteriskChannel.java b/src/main/java/org/asteriskjava/live/AsteriskChannel.java index ef4895da6..15b7621b2 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskChannel.java +++ b/src/main/java/org/asteriskjava/live/AsteriskChannel.java @@ -63,6 +63,7 @@ public interface AsteriskChannel extends LiveObject String PROPERTY_PARKED_AT = "parkedAt"; String PROPERTY_DTMF_RECEIVED = "dtmfReceived"; String PROPERTY_DTMF_SENT = "dtmfSent"; + String PROPERTY_MONITORED = "monitored"; String VARIABLE_MONITOR_EXEC = "MONITOR_EXEC"; String VARIABLE_MONITOR_EXEC_ARGS = "MONITOR_EXEC_ARGS"; @@ -301,6 +302,14 @@ public interface AsteriskChannel extends LiveObject */ Character getDtmfSent(); + /** + * Return the actual MONITOR state. + * + * @retrun the actual Monitor state of this channel. + * @since 1.0.1 + */ + boolean isMonitored(); + /* Actions */ /** diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index 7d8f5cb35..c373ef89a 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -150,6 +150,11 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel */ private Character dtmfSent; + /** + * Actual monitor state + */ + private boolean isMonitored; + private final Map variables; /** @@ -897,6 +902,15 @@ void setQueueEntry(AsteriskQueueEntryImpl queueEntry) firePropertyChange(PROPERTY_QUEUE_ENTRY, oldQueueEntry, queueEntry); } + public boolean isMonitored() {return this.isMonitored; } + + void setMonitored(boolean monitored) { + final boolean oldMonitored = this.isMonitored; + + this.isMonitored = monitored; + firePropertyChange(PROPERTY_MONITORED, oldMonitored, monitored); + } + @Override public String toString() { diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index d87b5a68c..3770b13ff 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -953,6 +953,14 @@ else if (event instanceof DtmfEvent) { channelManager.handleDtmfEvent((DtmfEvent) event); } + else if (event instanceof MonitorStartEvent) + { + channelManager.handleMonitorStartEvent((MonitorStartEvent) event); + } + else if (event instanceof MonitorStopEvent) + { + channelManager.handleMonitorStopEvent((MonitorStopEvent) event); + } // End of channel related events // Handle parking related event else if (event instanceof ParkedCallEvent) diff --git a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java index e3334ccb9..560762f4b 100644 --- a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java +++ b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java @@ -881,4 +881,55 @@ void handleDtmfEvent(DtmfEvent event) } } } + + void handleMonitorStartEvent(MonitorStartEvent event) + { + final AsteriskChannelImpl channel = getChannelImplByNameAndActive(event.getChannel()); + + if (channel == null) + { + logger.info("Ignored MonitorStartEvent for unknown channel " + event.getChannel()); + return; + } + + boolean isMonitored = channel.isMonitored(); + + if (isMonitored == true) + { + logger.info("Ignored MonitorStartEvent as the channel was already monitored"); + return; + } + + synchronized (channel) + { + channel.setMonitored(true); + } + logger.info("Channel " + channel.getName() + " is monitored"); + } + + void handleMonitorStopEvent(MonitorStopEvent event) + { + final AsteriskChannelImpl channel = getChannelImplByNameAndActive(event.getChannel()); + + if (channel == null) + { + logger.info("Ignored MonitorStopEvent for unknown channel " + event.getChannel()); + return; + } + + boolean isMonitored = channel.isMonitored(); + + if (isMonitored == false) + { + logger.info("Ignored MonitorStopEvent as the channel was not monitored"); + return; + } + + synchronized (channel) + { + channel.setMonitored(false); + } + logger.info("Channel " + channel.getName() + " is not monitored"); + } + } From 43d3cf5a09d403652af929221f7fd174f697f21a Mon Sep 17 00:00:00 2001 From: Stefan Reuter Date: Sat, 20 Dec 2014 14:31:46 +0100 Subject: [PATCH 0033/1055] Update plugins and dependencies and fix javadoc to allow building with JDK 8 --- pom.xml | 29 +++++---- .../asteriskjava/config/ConfigFileReader.java | 4 +- .../fastagi/AbstractAgiServer.java | 12 ++-- .../fastagi/AbstractMappingStrategy.java | 2 +- .../org/asteriskjava/fastagi/AgiChannel.java | 19 +++--- .../org/asteriskjava/fastagi/AgiRequest.java | 4 +- .../fastagi/ClassNameMappingStrategy.java | 2 +- .../fastagi/DefaultAgiServer.java | 6 +- .../fastagi/ScriptEngineMappingStrategy.java | 2 +- .../fastagi/command/GetOptionCommand.java | 2 +- .../fastagi/command/GosubCommand.java | 4 +- .../fastagi/internal/AgiChannelFactory.java | 2 +- .../internal/AgiConnectionHandler.java | 2 +- .../internal/AsyncAgiConnectionHandler.java | 2 +- .../internal/FastAgiConnectionHandler.java | 2 +- .../org/asteriskjava/live/AgentState.java | 2 +- .../org/asteriskjava/live/AsteriskAgent.java | 6 +- .../asteriskjava/live/AsteriskChannel.java | 7 ++- .../org/asteriskjava/live/AsteriskQueue.java | 8 +-- .../live/AsteriskQueueMember.java | 2 +- .../org/asteriskjava/live/AsteriskServer.java | 14 ++--- .../live/AsteriskServerListener.java | 2 +- .../java/org/asteriskjava/live/CallerId.java | 2 +- .../live/DefaultAsteriskServer.java | 2 +- .../asteriskjava/live/QueueMemberState.java | 4 +- .../live/internal/AgentManager.java | 3 +- .../live/internal/AsteriskAgentImpl.java | 2 +- .../live/internal/AsteriskQueueEntryImpl.java | 2 +- .../live/internal/AsteriskQueueImpl.java | 2 +- .../internal/AsteriskQueueMemberImpl.java | 2 +- .../live/internal/AsteriskServerImpl.java | 10 +-- .../live/internal/ChannelManager.java | 2 +- .../org/asteriskjava/manager/PingThread.java | 6 +- .../manager/action/AgiAction.java | 2 +- .../manager/action/HangupAction.java | 4 +- .../manager/action/LoginAction.java | 2 +- .../manager/action/OriginateAction.java | 4 +- .../manager/action/QueueSummaryAction.java | 2 +- .../manager/action/SetVarAction.java | 2 +- .../action/VoicemailUsersListAction.java | 2 +- .../manager/event/AbstractAgentEvent.java | 2 +- .../event/AbstractChannelStateEvent.java | 7 ++- .../manager/event/AgentCalledEvent.java | 4 +- .../manager/event/AgiExecEvent.java | 4 +- .../manager/event/AsyncAgiEvent.java | 2 +- .../manager/event/BridgeEvent.java | 2 +- .../manager/event/ChannelReloadEvent.java | 8 +-- .../event/CoreShowChannelsCompleteEvent.java | 2 +- .../event/DahdiShowChannelsCompleteEvent.java | 2 +- .../manager/event/DahdiShowChannelsEvent.java | 6 +- .../asteriskjava/manager/event/DialEvent.java | 8 +-- .../event/DongleShowDevicesCompleteEvent.java | 2 +- .../asteriskjava/manager/event/DtmfEvent.java | 2 +- .../manager/event/ExtensionStatusEvent.java | 26 ++++---- .../manager/event/FullyBootedEvent.java | 6 +- .../manager/event/ManagerEvent.java | 18 +++--- .../manager/event/MeetMeJoinEvent.java | 4 +- .../manager/event/PeerStatusEvent.java | 2 +- .../manager/event/QueueMemberStatusEvent.java | 2 +- .../manager/event/QueueSummaryEvent.java | 6 +- .../manager/event/RenameEvent.java | 2 +- .../event/VoicemailUserEntryEvent.java | 2 +- .../manager/event/ZapShowChannelsEvent.java | 6 +- .../internal/ManagerConnectionImpl.java | 22 +++---- .../manager/internal/ManagerWriter.java | 2 +- .../manager/response/ManagerResponse.java | 2 +- .../java/org/asteriskjava/util/AstUtil.java | 22 +++---- .../java/org/asteriskjava/util/Base64.java | 10 +-- .../live/internal/AsteriskAgentImplTest.java | 61 +++++++------------ .../internal/AsteriskQueueMemberImplTest.java | 3 +- 70 files changed, 211 insertions(+), 226 deletions(-) diff --git a/pom.xml b/pom.xml index ca8f39962..40d3e8e5b 100644 --- a/pom.xml +++ b/pom.xml @@ -47,7 +47,7 @@ org.apache.maven.plugins maven-jar-plugin - 2.3.2 + 2.5 @@ -92,7 +92,7 @@ org.apache.log4j;resolution:=optional maven-assembly-plugin - 2.2.2 + 2.5.3 src/main/assembly/bin.xml @@ -115,39 +115,40 @@ org.apache.log4j;resolution:=optional org.easymock easymock - 3.1 + 3.3 test junit junit - 4.10 + 4.12 test log4j log4j - 1.2.16 + 1.2.17 compile org.slf4j slf4j-api - 1.6.4 + 1.7.9 compile ch.qos.logback logback-classic - 1.0.0 + 1.1.2 test + org.apache.maven.plugins maven-javadoc-plugin - 2.8 + 2.10.1 @@ -169,35 +170,37 @@ org.apache.log4j;resolution:=optional org.apache.maven.plugins maven-jxr-plugin - 2.3 + 2.5 org.apache.maven.plugins maven-surefire-report-plugin - 2.11 + 2.18 org.apache.maven.plugins maven-changelog-plugin - 2.2 + 2.3 org.apache.maven.plugins maven-pmd-plugin - 2.5 + 3.3 1.6 100 true + org.codehaus.mojo findbugs-maven-plugin - 2.3.3 + 3.0.0 + + + release + + + release + + + + + + org.apache.maven.plugins + maven-jarsigner-plugin + 1.3.2 + + + + sign + + + + + + Stefan_Reuter_Code_Signing + true + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + C47292FB + + + + + + From ff6295f8ddc200e56670c0f2f68e7e2a05dcb5b1 Mon Sep 17 00:00:00 2001 From: Stefan Reuter Date: Sat, 20 Dec 2014 15:39:20 +0100 Subject: [PATCH 0035/1055] Fix Javadoc --- src/main/java/org/asteriskjava/live/AsteriskChannel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/live/AsteriskChannel.java b/src/main/java/org/asteriskjava/live/AsteriskChannel.java index 433a462a0..37c52afb1 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskChannel.java +++ b/src/main/java/org/asteriskjava/live/AsteriskChannel.java @@ -305,7 +305,7 @@ public interface AsteriskChannel extends LiveObject /** * Return the actual MONITOR state. * - * @retrun the actual Monitor state of this channel. + * @return the actual Monitor state of this channel. * @since 1.0.1 */ boolean isMonitored(); From f1e14b18298864c10504bb92524e2a072af573d4 Mon Sep 17 00:00:00 2001 From: Stefan Reuter Date: Sat, 20 Dec 2014 15:47:29 +0100 Subject: [PATCH 0036/1055] Remove clover and fisheye links (products are no longer used) --- lib/clover/clover.license | 164 -------------------------------------- src/site/site.xml | 8 -- 2 files changed, 172 deletions(-) delete mode 100644 lib/clover/clover.license diff --git a/lib/clover/clover.license b/lib/clover/clover.license deleted file mode 100644 index 0731f52df..000000000 --- a/lib/clover/clover.license +++ /dev/null @@ -1,164 +0,0 @@ -Product: Clover -License: Open Source License, 0.x, 1.x -Issued: Thu Oct 21 2004 21:27:21 CDT -Expiry: Never -Key: 7e1c2ed27ee858f42adedd953 -Name: Stefan Reuter -Org: asterisk-java -Certificate: AAABsm+Ow8B7/zEbxOMqqKwwrdpP+a1COmJGHco7sCNLjHkHnajPF+dQW -Ct12PMy0uml0s9xuus5wKngJ9OFk5XFeh01dzQF66bhXH1bvegLfvja3Kle6BYtDv4LZgE -gk3E0aJN4IbgTn+TgUckSevXDR4KzK77NWJfrVzkxV3/Jer0jWuM7QJbvwkyoXjNEVc/ye -OTlpI6MQPLOI4Og5zfT4dHD72UJcFEgGvSx6kEeWPn+RGX8xt3GVb8MJ1ywMWYUIcFWe2m -JfmT8OoDi6VDKGj/p0gCEpn+6zEmWuUoleg59zSy9cEHoJVDLjoVAqhUmFnDYl2Tk9LLP3 -3Gn0yLWqYQk2fzWw7d6BiJrcX/2seoMHkW4+l9l5JKzy0XyFHUIsTFzbjbeTmZpk24hkje -f9PFP3hFn89RVjsozstxYnbhGeHhQZNk/uG0ftnAR0bXdFv0ZYFU0t/597/Kxw9gpyss1w -r/rdMDm0c+7KgckZjxPrfvvFgAFuutYe//Ol8Be8lguE7Fkews81gIyc4d0NvU+gu7qUZo -WOOjTVMuDM7TJWIHlKT54UGPELrE8E/I7XICOJa8WipV+qmMXPXk/q2oiu1udzSy7Tmvyi -hZ85yCnuH9DBnpBZRbS88AtM6Lje56JhNykODYtRipYlvD8vlukR+/c4sBWNkJlYG7FU/o -SP8Hrnh8VSFASymIfLGF/6v+wzRsoiAyO3MlQPDajIsCnmFIFanUVG453AmktJwxbKU0= -License Agreement: CLOVER VERSION 1 (ONE) SOFTWARE LICENSE AGREEMENT - -1. Licenses and Software - -Cortex eBusiness Pty Ltd, an Australian Proprietary Limited Company -("CENQUA") hereby grants to the purchaser (the "LICENSEE") a limited, -revocable, worldwide, non-exclusive, non-transferable, -non-sublicensable license to use the Clover version 1 (one) software -(the "Software"), including any minor upgrades thereof during the Term -(hereinafter defined) up to, but not including the next major version -of the Software. The licensee shall not, or knowingly allow others to, -reverse engineer, decompile, disassemble, modify, adapt, create -derivative works from or otherwise attempt to derive source code from -the Software provided. And, in accordance with the terms and -conditions of this Software License Agreement (the "Agreement"), the -Software shall be used solely by the licensed users in accordance with -the following edition specific conditions: - -a) Server Edition - -A Server Edition license entitles the Licensee to execute one instance -of Clover Server Edition on one (1) machine for the purposes of -instrumenting source code and generating reports. There are no -limitations on the use of the instrumented source code or generated -reports produced by Server Edition. - -b) Workstation Edition - -A Workstation Edition license entitles the licensee to use Clover -Workstation Edition on one (1) machine by one (1) individual end -user. Workstation Edition does not permit the generation of reports -for distribution. - -c) Team Edition - -A Team Edition license entitles the licensee to use Clover Team -edition on any number of machines solely by the licensed number of -users. Reports generated by Clover Team Edition are strictly for use -only by the licensed number of individual end users. - -2. License Fee - -In exchange for the License(s), the Licensee shall pay to Cenqua a -one-time, up front, non-refundable license fee. At the sole discretion -of Cenqua this fee will be waived for non-commercial -projects. Notwithstanding the Licensee's payment of the License Fee, -Cenqua reserves the right to terminate the License if Cenqua discovers -that the Licensee and/or the Licensee's use of the Software is in -breach of this Agreement. - -3. Proprietary Rights - -Cenqua will retain all right, title and interest in and to the -Software, all copies thereof, and Cenqua website(s), software, and -other intellectual property, including, but not limited to, ownership -of all copyrights, look and feel, trademark rights, design rights, -trade secret rights and any and all other intellectual property and -other proprietary rights therein. The Licensee will not directly or -indirectly obtain or attempt to obtain at any time, any right, title -or interest by registration or otherwise in or to the trademarks, -service marks, copyrights, trade names, symbols, logos or designations -or other intellectual property rights owned or used by Cenqua. All -technical manuals or other information provided by Cenqua to the -Licensee shall be the sole property of Cenqua. - -4. Term and Termination - -Subject to the other provisions hereof, this Agreement shall commence -upon the Licensee's opting into this Agreement and continue until the -Licensee discontinues use of the Software or the Agreement terminates -automatically upon the Licensee's breach of any term or condition of -this Agreement (the "Term"). Upon any such termination, the Licensee -will delete the Software immediately. - -5. Copying & Transfer - -The Licensee may copy the Software for back-up purposes only. The -Licensee may not assign or otherwise transfer the Software to any -third party. - -6. Specific Disclaimer of Warranty and Limitation of Liability - -THE SOFTWARE IS PROVIDED WITHOUT WARRANTY OF ANY KIND. CENQUA -DISCLAIMS ALL WARRANTIES, EXPRESSED OR IMPLIED, INCLUDING BUT NOT -LIMITED TO THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE. CENQUA WILL NOT BE LIABLE FOR ANY DAMAGES -ASSOCIATED WITH THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ORDINARY, -INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING -BUT NOT LIMITED TO DAMAGES RELATING TO LOST DATA OR LOST PROFITS, EVEN -IF CENQUA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. Warranties and Representations - -Licensee Indemnification. CENQUA agrees to indemnify, defend and hold -the Licensee harmless from and against any and all liabilities, -damages, losses, claims, costs, and expenses (including reasonable -legal fees) arising out of or resulting from the Software or the use -thereof infringing upon, misappropriating or violating any patents, -copyrights, trademarks, or trade secret rights or other proprietary -rights of persons, firms or entities who are not parties to this -Agreement. - -CENQUA Indemnification. The Licensee warrants and represents that the -Licensee's actions with regard to the Software will be in compliance -with all applicable laws; and the Licensee agrees to indemnify, -defend, and hold CENQUA harmless from and against any and all -liabilities, damages, losses, claims, costs, and expenses (including -reasonable legal fees) arising out of or resulting from the -Licensee's failure to observe the use restrictions set forth herein. - -8. Publicity - -The Licensee grants permission for CENQUA to use Licensee's name -solely in customer lists. CENQUA shall not, without prior consent in -writing, use the Licensee's name, or that of its affiliates, in any -form with the specific exception of customer lists. CENQUA agrees to -remove Licensee's name from any and all materials within 7 days if -notified by the Licensee in writing. - -9. Governing Law - -This Agreement shall be governed by the laws of New South Wales, -Australia. - -10. Independent Contractors - -The parties are independent contractors with respect to each other, -and nothing in this Agreement shall be construed as creating an -employer-employee relationship, a partnership, agency relationship or -a joint venture between the parties. - -11. Assignment - -This Agreement is not assignable or transferable by the Licensee. -CENQUA in its sole discretion may transfer a license to a third party -at the written request of the Licensee. - -12. Entire Agreement - -This Agreement constitutes the entire agreement between the parties -concerning the Licensee's use of the Software. This Agreement -supersedes any prior verbal understanding between the parties and any -Licensee purchase order or other ordering document, regardless of -whether such document is received by CENQUA before or after execution -of this Agreement. This Agreement may be amended only in writing by -CENQUA. diff --git a/src/site/site.xml b/src/site/site.xml index a887ce0c0..9ec365caa 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -53,14 +53,6 @@ -

- - - ${reports} From 5bb6cffc7ef937c8e0b9d5cdffe409c00fdfe16f Mon Sep 17 00:00:00 2001 From: Stefan Reuter Date: Sun, 11 Jan 2015 17:17:31 +0100 Subject: [PATCH 0037/1055] Fix OSGi headers --- pom.xml | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index 17cf8d850..4efbd5d23 100644 --- a/pom.xml +++ b/pom.xml @@ -128,28 +128,28 @@ reucon ${project.url} -org.asteriskjava;version="${project.version}", -org.asteriskjava.config;version="${project.version}", -org.asteriskjava.config.dialplan;version="${project.version}", -org.asteriskjava.fastagi;version="${project.version}", -org.asteriskjava.fastagi.command;version="${project.version}", -org.asteriskjava.fastagi.internal;version="${project.version}", -org.asteriskjava.fastagi.reply;version="${project.version}", -org.asteriskjava.manager;version="${project.version}", -org.asteriskjava.manager.action;version="${project.version}", -org.asteriskjava.manager.event;version="${project.version}", -org.asteriskjava.manager.internal;version="${project.version}", -org.asteriskjava.manager.response;version="${project.version}", -org.asteriskjava.manager.util;version="${project.version}", -org.asteriskjava.live;version="${project.version}", -org.asteriskjava.live.internal;version="${project.version}", -org.asteriskjava.util;version="${project.version}", -org.asteriskjava.util.internal;version="${project.version}" + org.asteriskjava;version="${project.version}", + org.asteriskjava.config;version="${project.version}", + org.asteriskjava.config.dialplan;version="${project.version}", + org.asteriskjava.fastagi;version="${project.version}", + org.asteriskjava.fastagi.command;version="${project.version}", + org.asteriskjava.fastagi.internal;version="${project.version}", + org.asteriskjava.fastagi.reply;version="${project.version}", + org.asteriskjava.manager;version="${project.version}", + org.asteriskjava.manager.action;version="${project.version}", + org.asteriskjava.manager.event;version="${project.version}", + org.asteriskjava.manager.internal;version="${project.version}", + org.asteriskjava.manager.response;version="${project.version}", + org.asteriskjava.manager.util;version="${project.version}", + org.asteriskjava.live;version="${project.version}", + org.asteriskjava.live.internal;version="${project.version}", + org.asteriskjava.util;version="${project.version}", + org.asteriskjava.util.internal;version="${project.version}" -javax.net, -org.slf4j;resolution:=optional, -org.apache.log4j;resolution:=optional + javax.net, + org.slf4j;resolution:=optional, + org.apache.log4j;resolution:=optional From cbeb709ccf0ee7583469c0a27407cf07904807e4 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 12:34:39 +0300 Subject: [PATCH 0038/1055] Detect asterisk versions 12 & 13 --- .../java/org/asteriskjava/AsteriskVersion.java | 15 +++++++++++++++ .../manager/internal/ManagerConnectionImpl.java | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/main/java/org/asteriskjava/AsteriskVersion.java b/src/main/java/org/asteriskjava/AsteriskVersion.java index 208faf7c7..7e7b1636a 100644 --- a/src/main/java/org/asteriskjava/AsteriskVersion.java +++ b/src/main/java/org/asteriskjava/AsteriskVersion.java @@ -75,6 +75,21 @@ public class AsteriskVersion implements Comparable, Serializabl */ public static final AsteriskVersion ASTERISK_11 = new AsteriskVersion(1100, "Asterisk 11"); + /** + * Represents the Asterisk 12 series. + * + * @since 1.0.0 + */ + public static final AsteriskVersion ASTERISK_12 = new AsteriskVersion(1200, "Asterisk 12"); + + /** + * Represents the Asterisk 13 series. + * + * @since 1.0.0 + */ + public static final AsteriskVersion ASTERISK_13 = new AsteriskVersion(1300, "Asterisk 13"); + + /** * Serial version identifier. */ diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 0c1175020..24535f194 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -82,6 +82,8 @@ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.8[-. ].*"); private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); + private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?12[-. ].*"); + private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?13[-. ].*"); private static final AtomicLong idCounter = new AtomicLong(0); @@ -673,6 +675,14 @@ else if (VERSION_PATTERN_11.matcher(coreLine).matches()) { return AsteriskVersion.ASTERISK_11; } + else if (VERSION_PATTERN_12.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_12; + } + else if (VERSION_PATTERN_13.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_13; + } } } From 96cbde903053a7078555b67872f207b6f70b789d Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 12:58:24 +0300 Subject: [PATCH 0039/1055] New properties in VarSetEvent --- .../manager/event/VarSetEvent.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java index 25de29fbc..a3e99a688 100644 --- a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java @@ -33,6 +33,87 @@ public class VarSetEvent extends ManagerEvent private String uniqueId; private String variable; private String value; + private String callerIdName; + private String connectedLineNum; + private String connectedLineName; + private Integer priority; + private Integer channelState; + private String channelStateDesc; + private String exten; + private String callerIdNum; + private String context; + + public String getConnectedLineName() { + return connectedLineName; + } + + public void setConnectedLineName(String connectedLineName) { + this.connectedLineName = connectedLineName; + } + + public String getChannelStateDesc() { + return channelStateDesc; + } + + public void setChannelStateDesc(String channelStateDesc) { + this.channelStateDesc = channelStateDesc; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public String getExten() { + return exten; + } + + public void setExten(String exten) { + this.exten = exten; + } + + public String getCallerIdName() { + return callerIdName; + } + + public void setCallerIdName(String callerIdName) { + this.callerIdName = callerIdName; + } + + public String getConnectedLineNum() { + return connectedLineNum; + } + + public void setConnectedLineNum(String connectedLineName) { + this.connectedLineNum = connectedLineName; + } + + public Integer getChannelState() { + return channelState; + } + + public void setChannelState(Integer channelState) { + this.channelState = channelState; + } + + public String getCallerIdNum() { + return callerIdNum; + } + + public void setCallerIdNum(String callerIdNum) { + this.callerIdNum = callerIdNum; + } + + public String getContext() { + return context; + } + + public void setContext(String context) { + this.context = context; + } public VarSetEvent(Object source) { From cd732524d5267ad78f52734547ae8580dbfc3f0f Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 14:01:17 +0300 Subject: [PATCH 0040/1055] Move properties up to ManagerEvent --- .../manager/event/AgentCalledEvent.java | 51 +---------- .../manager/event/CoreShowChannelEvent.java | 19 ---- .../manager/event/ManagerEvent.java | 89 +++++++++++++++++++ .../manager/event/NewChannelEvent.java | 17 ++++ .../manager/event/VarSetEvent.java | 8 -- 5 files changed, 110 insertions(+), 74 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java index 591a7bff8..b7de5d303 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java @@ -40,14 +40,7 @@ public class AgentCalledEvent extends ManagerEvent private String agentName; private String channelCalling; private String destinationChannel; - private String callerIdNum; - private String callerIdName; - private String context; - private String extension; - private String priority; private String uniqueId; - private String connectedlinename; - private String connectedlinenum; private Map variables; @@ -190,16 +183,8 @@ public void setCallerId(String callerId) this.callerIdNum = callerId; } - /** - * Returns the Caller ID name of the caller's channel. - * - * @return the Caller ID name of the caller's channel or "unknown" if none has been set. - * @since 0.2 - */ - public String getCallerIdName() - { - return callerIdName; - } + + public String getCallerIdName() { return callerIdName; } /** * Sets the Caller ID name of the caller's channel. @@ -224,22 +209,12 @@ public void setContext(String context) public String getExtension() { - return extension; + return exten; } public void setExtension(String extension) { - this.extension = extension; - } - - public String getPriority() - { - return priority; - } - - public void setPriority(String priority) - { - this.priority = priority; + this.exten = extension; } /** @@ -291,15 +266,6 @@ public void setVariables(Map variables) * * @since 1.0.0 */ - public String getConnectedlinename() - { - return connectedlinename; - } - - public void setConnectedlinename(String connectedlinename) - { - this.connectedlinename = connectedlinename; - } /** * Returns the Caller*ID number of the channel connected if set. @@ -307,14 +273,5 @@ public void setConnectedlinename(String connectedlinename) * * @since 1.0.0 */ - public String getConnectedlinenum() - { - return connectedlinenum; - } - - public void setConnectedlinenum(String connectedlinenum) - { - this.connectedlinenum = connectedlinenum; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java index 531123167..8ff935cad 100644 --- a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java @@ -35,8 +35,6 @@ public class CoreShowChannelEvent extends ResponseEvent private String channel; private String context; private String extension; - private String priority; - private String ChannelState; private String channelstatedesc; private String application; private String applicationdata; @@ -57,15 +55,6 @@ public CoreShowChannelEvent(Object source) * @return channel state */ - public String getChannelState() - { - return ChannelState; - } - - public void setChannelState(String ChannelState) - { - this.ChannelState = ChannelState; - } /** * Returns the Account code @@ -238,15 +227,7 @@ public void setExtension(String extension) * * @return priority */ - public String getPriority() - { - return priority; - } - public void setPriority(String priority) - { - this.priority = priority; - } /** * Returns the Uniqueid diff --git a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java index c2e3565e9..9b1e2118b 100644 --- a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java @@ -40,6 +40,95 @@ public abstract class ManagerEvent extends EventObject * Serializable version identifier. */ static final long serialVersionUID = 2L; + protected String connectedLineNum; + protected String connectedLineName; + protected Integer priority; + protected Integer channelState; + protected String channelStateDesc; + protected String exten; + protected String callerIdNum; + protected String callerIdName; + + /** + * Returns the Caller ID name of the caller's channel. + * + * @return the Caller ID name of the caller's channel or "unknown" if none has been set. + * @since 0.2 + */ + + public String getCallerIdName() { + return callerIdName; + } + + public void setCallerIdName(String callerIdName) { + this.callerIdName = callerIdName; + } + + public String getConnectedLineNum() { + return connectedLineNum; + } + + public void setConnectedLineNum(String connectedLineNum) { + this.connectedLineNum = connectedLineNum; + } + + public String getConnectedLineName() { + return connectedLineName; + } + + public void setConnectedLineName(String connectedLineName) { + this.connectedLineName = connectedLineName; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public Integer getChannelState() { + return channelState; + } + + public void setChannelState(Integer channelState) { + this.channelState = channelState; + } + + public String getChannelStateDesc() { + return channelStateDesc; + } + + public void setChannelStateDesc(String channelStateDesc) { + this.channelStateDesc = channelStateDesc; + } + + public String getExten() { + return exten; + } + + public void setExten(String exten) { + this.exten = exten; + } + + public String getCallerIdNum() { + return callerIdNum; + } + + public void setCallerIdNum(String callerIdNum) { + this.callerIdNum = callerIdNum; + } + + public String getContext() { + return context; + } + + public void setContext(String context) { + this.context = context; + } + + protected String context; /** * AMI authorization class. diff --git a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java index 37892fe50..f974c2d04 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java @@ -33,6 +33,7 @@ public class NewChannelEvent extends AbstractChannelStateEvent private String accountCode; private String context; private String exten; + private Integer priority; public NewChannelEvent(Object source) { @@ -107,4 +108,20 @@ public void setExten(String exten) { this.exten = exten; } + + /** + * Returns the priority. + */ + public Integer getPriority() + { + return priority; + } + + /** + * Sets the priority. + */ + public void setPriority(Integer priority) + { + this.priority = priority; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java index a3e99a688..608a1c851 100644 --- a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java @@ -34,14 +34,6 @@ public class VarSetEvent extends ManagerEvent private String variable; private String value; private String callerIdName; - private String connectedLineNum; - private String connectedLineName; - private Integer priority; - private Integer channelState; - private String channelStateDesc; - private String exten; - private String callerIdNum; - private String context; public String getConnectedLineName() { return connectedLineName; From 757ede5da05ded13e84b3cba6ecf4ebe68340880 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 14:41:03 +0300 Subject: [PATCH 0041/1055] Add some new events used in Asterisk 12/13 --- .../manager/event/AsyncAgiEndEvent.java | 18 ++++++++++++++ .../manager/event/AsyncAgiStartEvent.java | 19 +++++++++++++++ .../manager/event/DeviceStateChangeEvent.java | 24 +++++++++++++++++++ .../manager/event/SuccessfulAuthEvent.java | 8 +++++++ .../manager/internal/EventBuilderImpl.java | 4 ++++ 5 files changed, 73 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java new file mode 100644 index 000000000..2865c667e --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java @@ -0,0 +1,18 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AsyncAgiEndEvent extends ManagerEvent { + private String channel; + + public AsyncAgiEndEvent(Object source) { super(source); } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java new file mode 100644 index 000000000..77a63b16f --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java @@ -0,0 +1,19 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AsyncAgiStartEvent extends ManagerEvent +{ + private String channel; + + public AsyncAgiStartEvent(Object source) { super(source); } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java b/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java new file mode 100644 index 000000000..639b8fd60 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java @@ -0,0 +1,24 @@ +package org.asteriskjava.manager.event; + +public class DeviceStateChangeEvent extends ManagerEvent { + private String state; + private String device; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getDevice() { + return device; + } + + public void setDevice(String device) { + this.device = device; + } + + public DeviceStateChangeEvent(Object source) { super(source); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java new file mode 100644 index 000000000..512258166 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class SuccessfulAuthEvent extends ManagerEvent { + public SuccessfulAuthEvent(Object source) { super(source); } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 62e425f30..1cbcdfa09 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -183,6 +183,10 @@ private void registerBuiltinEventClasses() registerEventClass(VoicemailUserEntryEvent.class); registerEventClass(ZapShowChannelsEvent.class); registerEventClass(ZapShowChannelsCompleteEvent.class); + registerEventClass(AsyncAgiStartEvent.class); + registerEventClass(AsyncAgiEndEvent.class); + registerEventClass(DeviceStateChangeEvent.class); + registerEventClass(SuccessfulAuthEvent.class); } From 8e38dc3d6a99523644bbb8b67ce9b0dd030989de Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 15:12:01 +0300 Subject: [PATCH 0042/1055] Add SuccessfulAuthEvent fields --- .../manager/event/SuccessfulAuthEvent.java | 93 +++++++++++++++++++ .../internal/ManagerConnectionImpl.java | 1 + 2 files changed, 94 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java index 512258166..86c46304f 100644 --- a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java @@ -1,8 +1,101 @@ package org.asteriskjava.manager.event; +import java.util.Date; + /** * Created by plhk on 1/15/15. */ public class SuccessfulAuthEvent extends ManagerEvent { + private String severity; + private Integer eventVersion; + private String accountId; + private Integer usingPassword; + private String sessiontv; + private String service; + private String eventtv; + private String remoteAddress; + private String localAddress; + private String sessionId; + public SuccessfulAuthEvent(Object source) { super(source); } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public Integer getEventVersion() { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) { + this.eventVersion = eventVersion; + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public Integer getUsingPassword() { + return usingPassword; + } + + public void setUsingPassword(Integer usingPassword) { + this.usingPassword = usingPassword; + } + + public String getSessiontv() { + return sessiontv; + } + + public void setSessiontv(String sessiontv) { + this.sessiontv = sessiontv; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public String getEventtv() { + return eventtv; + } + + public void setEventtv(String eventtv) { + this.eventtv = eventtv; + } + + public String getRemoteAddress() { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) { + this.remoteAddress = remoteAddress; + } + + public String getLocalAddress() { + return localAddress; + } + + public void setLocalAddress(String localAddress) { + this.localAddress = localAddress; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } } diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 24535f194..f02d3f3f2 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -1322,6 +1322,7 @@ private void setProtocolIdentifier(final String identifier) && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk 1.6 && !"Asterisk Call Manager/1.2".equals(identifier) // bri stuffed && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk 11 + && !"Asterisk Call Manager/2.6.0".equals(identifier) // Asterisk 13 && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) From 1300e0e94639568d1a39295604c5416393b9842c Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 15:55:49 +0300 Subject: [PATCH 0043/1055] Add ChallengeSentEvent --- .../manager/event/ChallengeSentEvent.java | 90 +++++++++++++++++++ .../manager/internal/EventBuilderImpl.java | 1 + 2 files changed, 91 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java b/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java new file mode 100644 index 000000000..df8a87f2e --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java @@ -0,0 +1,90 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class ChallengeSentEvent extends ManagerEvent { + private String severity; + private Integer eventVersion; + private String accountId; + private String service; + private String eventtv; + private String remoteAddress; + private String localAddress; + private String challenge; + private String sessionId; + + public ChallengeSentEvent(Object source) { super(source); } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public Integer getEventVersion() { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) { + this.eventVersion = eventVersion; + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public String getEventtv() { + return eventtv; + } + + public void setEventtv(String eventtv) { + this.eventtv = eventtv; + } + + public String getRemoteAddress() { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) { + this.remoteAddress = remoteAddress; + } + + public String getLocalAddress() { + return localAddress; + } + + public void setLocalAddress(String localAddress) { + this.localAddress = localAddress; + } + + public String getChallenge() { + return challenge; + } + + public void setChallenge(String challenge) { + this.challenge = challenge; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 1cbcdfa09..64dbdfe59 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -187,6 +187,7 @@ private void registerBuiltinEventClasses() registerEventClass(AsyncAgiEndEvent.class); registerEventClass(DeviceStateChangeEvent.class); registerEventClass(SuccessfulAuthEvent.class); + registerEventClass(ChallengeSentEvent.class); } From 4fe332cb1378d78992557a789b40b2502134cb2b Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 16:36:20 +0300 Subject: [PATCH 0044/1055] AsyncAgi events --- .../org/asteriskjava/manager/event/AgiExecEvent.java | 10 ++++++++++ .../asteriskjava/manager/event/AsyncAgiEndEvent.java | 12 +++--------- .../asteriskjava/manager/event/AsyncAgiEvent.java | 9 +++++++++ .../manager/event/AsyncAgiStartEvent.java | 12 +++--------- .../manager/internal/EventBuilderImpl.java | 4 +++- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecEvent.java index 543ee38b5..d40f851e1 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgiExecEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecEvent.java @@ -41,6 +41,16 @@ public class AgiExecEvent extends ManagerEvent private Integer resultCode; private String result; + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } + + private String uniqueId; + /** * Creates a new AgiExecEvent. * diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java index 2865c667e..703ba78f8 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java @@ -3,16 +3,10 @@ /** * Created by plhk on 1/15/15. */ -public class AsyncAgiEndEvent extends ManagerEvent { - private String channel; - +public class AsyncAgiEndEvent extends AsyncAgiEvent { public AsyncAgiEndEvent(Object source) { super(source); } - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; + public boolean isEnd() { + return true; } } diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java index d2b41cb88..87b2a7213 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java @@ -38,6 +38,15 @@ public class AsyncAgiEvent extends ResponseEvent private String commandId; private String result; private String env; + private String uniqueId; + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } /** * Creates a new AsyncAgiEvent. diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java index 77a63b16f..eea2e2f42 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java @@ -3,17 +3,11 @@ /** * Created by plhk on 1/15/15. */ -public class AsyncAgiStartEvent extends ManagerEvent +public class AsyncAgiStartEvent extends AsyncAgiEvent { - private String channel; - public AsyncAgiStartEvent(Object source) { super(source); } - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; + public boolean isStart() { + return true; } } diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 64dbdfe59..5ebc08e2a 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -184,11 +184,13 @@ private void registerBuiltinEventClasses() registerEventClass(ZapShowChannelsEvent.class); registerEventClass(ZapShowChannelsCompleteEvent.class); registerEventClass(AsyncAgiStartEvent.class); + registerEventClass(AsyncAgiExecEvent.class); registerEventClass(AsyncAgiEndEvent.class); registerEventClass(DeviceStateChangeEvent.class); registerEventClass(SuccessfulAuthEvent.class); registerEventClass(ChallengeSentEvent.class); - + registerEventClass(AgiExecEndEvent.class); + registerEventClass(AgiExecStartEvent.class); } public final void registerEventClass(Class clazz) throws IllegalArgumentException From 8e188ecbd671ab010ca07101aa8aa2c8304e5065 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 17:45:01 +0300 Subject: [PATCH 0045/1055] AgiExec{End,Start}Event --- .../asteriskjava/manager/event/AgiExecEndEvent.java | 12 ++++++++++++ .../manager/event/AgiExecStartEvent.java | 12 ++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java new file mode 100644 index 000000000..92468829e --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java @@ -0,0 +1,12 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AgiExecEndEvent extends AgiExecEvent { + public AgiExecEndEvent(Object source) { super(source); } + + public boolean isEnd() { + return true; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java new file mode 100644 index 000000000..17cb63ca3 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java @@ -0,0 +1,12 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AgiExecStartEvent extends AgiExecEvent { + public AgiExecStartEvent(Object source) { super(source); } + + public boolean isStart() { + return true; + } +} From 724201eb55000a2c9f929851a87eb787b2c23679 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 12:34:39 +0300 Subject: [PATCH 0046/1055] Detect asterisk versions 12 & 13 --- .../java/org/asteriskjava/AsteriskVersion.java | 15 +++++++++++++++ .../manager/internal/ManagerConnectionImpl.java | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/main/java/org/asteriskjava/AsteriskVersion.java b/src/main/java/org/asteriskjava/AsteriskVersion.java index 208faf7c7..7e7b1636a 100644 --- a/src/main/java/org/asteriskjava/AsteriskVersion.java +++ b/src/main/java/org/asteriskjava/AsteriskVersion.java @@ -75,6 +75,21 @@ public class AsteriskVersion implements Comparable, Serializabl */ public static final AsteriskVersion ASTERISK_11 = new AsteriskVersion(1100, "Asterisk 11"); + /** + * Represents the Asterisk 12 series. + * + * @since 1.0.0 + */ + public static final AsteriskVersion ASTERISK_12 = new AsteriskVersion(1200, "Asterisk 12"); + + /** + * Represents the Asterisk 13 series. + * + * @since 1.0.0 + */ + public static final AsteriskVersion ASTERISK_13 = new AsteriskVersion(1300, "Asterisk 13"); + + /** * Serial version identifier. */ diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 0c1175020..24535f194 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -82,6 +82,8 @@ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.8[-. ].*"); private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); + private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?12[-. ].*"); + private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?13[-. ].*"); private static final AtomicLong idCounter = new AtomicLong(0); @@ -673,6 +675,14 @@ else if (VERSION_PATTERN_11.matcher(coreLine).matches()) { return AsteriskVersion.ASTERISK_11; } + else if (VERSION_PATTERN_12.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_12; + } + else if (VERSION_PATTERN_13.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_13; + } } } From bc65e45ae9e5333fd4d1ff953b2e272f2ee18258 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Fri, 16 Jan 2015 11:58:42 +0300 Subject: [PATCH 0047/1055] Match asterisk 13 protocol --- .../org/asteriskjava/manager/internal/ManagerConnectionImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 24535f194..f02d3f3f2 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -1322,6 +1322,7 @@ private void setProtocolIdentifier(final String identifier) && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk 1.6 && !"Asterisk Call Manager/1.2".equals(identifier) // bri stuffed && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk 11 + && !"Asterisk Call Manager/2.6.0".equals(identifier) // Asterisk 13 && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) From 74c06c9cb1d04de6d4c4ca1f0fedd8ff6012e1c1 Mon Sep 17 00:00:00 2001 From: Danilo Rocha Valente Date: Mon, 2 Feb 2015 15:36:18 -0200 Subject: [PATCH 0048/1055] Ajuste para o Asterisk 1.8 --- src/main/java/org/asteriskjava/manager/event/HangupEvent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/manager/event/HangupEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupEvent.java index fb1248e86..cb060e88f 100644 --- a/src/main/java/org/asteriskjava/manager/event/HangupEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HangupEvent.java @@ -23,7 +23,7 @@ * @author srt * @version $Id$ */ -public class HangupEvent extends AbstractChannelEvent +public class HangupEvent extends AbstractChannelStateEvent { /** * Serializable version identifier. From 1c286da76684d91a391c50e4ee92053e2ca1c91d Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 17:45:37 +0300 Subject: [PATCH 0049/1055] Dial{Begin,End}Event --- .../manager/event/DialBeginEvent.java | 5 ++ .../manager/event/DialEndEvent.java | 5 ++ .../asteriskjava/manager/event/DialEvent.java | 85 ++++++++++++++++++- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/DialEndEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java new file mode 100644 index 000000000..53f1a4722 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -0,0 +1,5 @@ +package org.asteriskjava.manager.event; + +public class DialBeginEvent extends DialEvent { + public DialBeginEvent(Object source) { super(source); setSubEvent("Begin"); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java new file mode 100644 index 000000000..b0e2fd95a --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java @@ -0,0 +1,5 @@ +package org.asteriskjava.manager.event; + +public class DialEndEvent extends DialEvent { + public DialEndEvent(Object source) { super(source); setSubEvent("End"); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DialEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEvent.java index c4609f7cd..c5cc9a9b7 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEvent.java @@ -60,6 +60,24 @@ public class DialEvent extends ManagerEvent */ private String destination; + /** + * Destination channel state + */ + private Integer destChannelState; + private String destChannelStateDesc; + + private String destContext; + + private Integer destPriority; + + private String destExten; + + private String destConnectedLineName; + private String destConnectedLineNum; + + private String destCallerIdName; + + /** * The new Caller*ID. */ @@ -162,6 +180,7 @@ public String getDestination() { return destination; } + public String getDestChannel() { return getDestination(); } /** * Sets the name of the destination channel. @@ -172,7 +191,7 @@ public void setDestination(String destination) { this.destination = destination; } - + public void setDestChannel(String destination) { setDestination(destination); } /** * Returns the the Caller*ID Number. * @@ -378,4 +397,68 @@ public void setConnectedlinenum(String connectedlinenum) { this.connectedlinenum = connectedlinenum; } + + public Integer getDestChannelState() { + return destChannelState; + } + + public void setDestChannelState(Integer destChannelState) { + this.destChannelState = destChannelState; + } + + public String getDestContext() { + return destContext; + } + + public void setDestContext(String destContext) { + this.destContext = destContext; + } + + public Integer getDestPriority() { + return destPriority; + } + + public void setDestPriority(Integer destPriority) { + this.destPriority = destPriority; + } + + public String getDestChannelStateDesc() { + return destChannelStateDesc; + } + + public void setDestChannelStateDesc(String destChannelStateDesc) { + this.destChannelStateDesc = destChannelStateDesc; + } + + public String getDestExten() { + return destExten; + } + + public void setDestExten(String destExten) { + this.destExten = destExten; + } + + public String getDestConnectedLineName() { + return destConnectedLineName; + } + + public void setDestConnectedLineName(String destConnectedLineName) { + this.destConnectedLineName = destConnectedLineName; + } + + public String getDestConnectedLineNum() { + return destConnectedLineNum; + } + + public void setDestConnectedLineNum(String destConnectedLineNum) { + this.destConnectedLineNum = destConnectedLineNum; + } + + public String getDestCallerIdName() { + return destCallerIdName; + } + + public void setDestCallerIdName(String destCallerIdName) { + this.destCallerIdName = destCallerIdName; + } } From 7b898344a56ed84aea5036f33977d2b932d712da Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 17:46:37 +0300 Subject: [PATCH 0050/1055] Add NewConnectedLineEvent --- .../manager/event/NewConnectedLineEvent.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java b/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java new file mode 100644 index 000000000..6dd94a5b8 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java @@ -0,0 +1,27 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class NewConnectedLineEvent extends ManagerEvent { + private String channel; + private String uniqueId; + + public NewConnectedLineEvent(Object source) { super(source); } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } +} From 517b95044c8c4b9da1da5d1a575e5a27cd079e0d Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 17:46:57 +0300 Subject: [PATCH 0051/1055] Add AsyncAgiExecEvent --- .../manager/event/AsyncAgiExecEvent.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java new file mode 100644 index 000000000..57cf2a5f7 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java @@ -0,0 +1,12 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AsyncAgiExecEvent extends AsyncAgiEvent { + public AsyncAgiExecEvent (Object source) { super(source); } + + public boolean isExec() { + return true; + } +} From 93cd7200d25b7e5692ee8e20bd0f02ddebfb1178 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 15 Jan 2015 17:47:20 +0300 Subject: [PATCH 0052/1055] Add new events --- .../org/asteriskjava/manager/internal/EventBuilderImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 5ebc08e2a..bfad7dc53 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -191,6 +191,9 @@ private void registerBuiltinEventClasses() registerEventClass(ChallengeSentEvent.class); registerEventClass(AgiExecEndEvent.class); registerEventClass(AgiExecStartEvent.class); + registerEventClass(DialBeginEvent.class); + registerEventClass(DialEndEvent.class); + registerEventClass(NewConnectedLineEvent.class); } public final void registerEventClass(Class clazz) throws IllegalArgumentException From d6a01284a8a0d859ffe2197c4b68e517ed94f5c9 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Fri, 23 Jan 2015 20:43:12 +0300 Subject: [PATCH 0053/1055] DestCallerIdNum on dialbegin --- .../org/asteriskjava/manager/event/DialBeginEvent.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java index 53f1a4722..b707b9e65 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -1,5 +1,15 @@ package org.asteriskjava.manager.event; public class DialBeginEvent extends DialEvent { + private String destCallerIdNum; + public DialBeginEvent(Object source) { super(source); setSubEvent("Begin"); } + + public String getDestCallerIdNum() { + return destCallerIdNum; + } + + public void setDestCallerIdNum(String destCallerIdNum) { + this.destCallerIdNum = destCallerIdNum; + } } From 9ee26c0dd8ef78d337a035ed9dc8726d42249205 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 13:50:03 +0300 Subject: [PATCH 0054/1055] Add InvalidPasswordEvent --- .../manager/event/InvalidPasswordEvent.java | 108 ++++++++++++++++++ .../manager/internal/EventBuilderImpl.java | 1 + 2 files changed, 109 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java new file mode 100644 index 000000000..1ae5a58d1 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java @@ -0,0 +1,108 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/23/15. + */ +public class InvalidPasswordEvent extends ManagerEvent { + private String severity; + private Integer eventVersion; + private String eventtv; + private String sessionid; + private String receivedHash; + private String localaddress; + private Integer accountId; + private String receivedChallenge; + private String service; + private String remoteAddress; + private String challenge; + + public InvalidPasswordEvent(Object source) { super(source); } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public Integer getEventVersion() { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) { + this.eventVersion = eventVersion; + } + + public String getEventtv() { + return eventtv; + } + + public void setEventtv(String eventtv) { + this.eventtv = eventtv; + } + + public String getSessionid() { + return sessionid; + } + + public void setSessionid(String sessionid) { + this.sessionid = sessionid; + } + + public String getReceivedHash() { + return receivedHash; + } + + public void setReceivedHash(String receivedHash) { + this.receivedHash = receivedHash; + } + + public String getLocaladdress() { + return localaddress; + } + + public void setLocaladdress(String localaddress) { + this.localaddress = localaddress; + } + + public Integer getAccountId() { + return accountId; + } + + public void setAccountId(Integer accountId) { + this.accountId = accountId; + } + + public String getReceivedChallenge() { + return receivedChallenge; + } + + public void setReceivedChallenge(String receivedChallenge) { + this.receivedChallenge = receivedChallenge; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public String getRemoteAddress() { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) { + this.remoteAddress = remoteAddress; + } + + public String getChallenge() { + return challenge; + } + + public void setChallenge(String challenge) { + this.challenge = challenge; + } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index bfad7dc53..9f544c898 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -194,6 +194,7 @@ private void registerBuiltinEventClasses() registerEventClass(DialBeginEvent.class); registerEventClass(DialEndEvent.class); registerEventClass(NewConnectedLineEvent.class); + registerEventClass(InvalidPasswordEvent.class); } public final void registerEventClass(Class clazz) throws IllegalArgumentException From 1efa2fdeed6ed21e64c1738e62a8c265f5dccbf3 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 13:51:52 +0300 Subject: [PATCH 0055/1055] Refactor DialBeginEvent / DialEvent --- .../org/asteriskjava/manager/event/DialBeginEvent.java | 10 ---------- .../java/org/asteriskjava/manager/event/DialEvent.java | 9 +++++++++ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java index b707b9e65..53f1a4722 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -1,15 +1,5 @@ package org.asteriskjava.manager.event; public class DialBeginEvent extends DialEvent { - private String destCallerIdNum; - public DialBeginEvent(Object source) { super(source); setSubEvent("Begin"); } - - public String getDestCallerIdNum() { - return destCallerIdNum; - } - - public void setDestCallerIdNum(String destCallerIdNum) { - this.destCallerIdNum = destCallerIdNum; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/DialEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEvent.java index c5cc9a9b7..155bd7b28 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEvent.java @@ -76,6 +76,7 @@ public class DialEvent extends ManagerEvent private String destConnectedLineNum; private String destCallerIdName; + private String destCallerIdNum; /** @@ -461,4 +462,12 @@ public String getDestCallerIdName() { public void setDestCallerIdName(String destCallerIdName) { this.destCallerIdName = destCallerIdName; } + + public String getDestCallerIdNum() { + return destCallerIdNum; + } + + public void setDestCallerIdNum(String destCallerIdNum) { + this.destCallerIdNum = destCallerIdNum; + } } From cdbeadac2442d236a0273cb29057fa4f3d4a7f24 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 13:54:07 +0300 Subject: [PATCH 0056/1055] Bridge{Create/Destroy}Event --- .../manager/event/BridgeCreateEvent.java | 65 +++++++++++++++++++ .../manager/event/BridgeDestroyEvent.java | 65 +++++++++++++++++++ .../manager/event/BridgeEnterEvent.java | 10 +++ .../manager/internal/EventBuilderImpl.java | 2 + 4 files changed, 142 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java new file mode 100644 index 000000000..c6f5f2dad --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java @@ -0,0 +1,65 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BridgeCreateEvent extends ManagerEvent { + private String bridgeUniqueId; + private String privilege; + private String bridgeType; + private Integer bridgeNumChannels; + private String bridgeCreator; + private String bridgeName; + + public BridgeCreateEvent (Object source) { super(source); } + + public String getBridgeUniqueId() { + return bridgeUniqueId; + } + + public void setBridgeUniqueId(String bridgeUniqueId) { + this.bridgeUniqueId = bridgeUniqueId; + } + + @Override + public String getPrivilege() { + return privilege; + } + + @Override + public void setPrivilege(String privilege) { + this.privilege = privilege; + } + + public String getBridgeType() { + return bridgeType; + } + + public void setBridgeType(String bridgeType) { + this.bridgeType = bridgeType; + } + + public Integer getBridgeNumChannels() { + return bridgeNumChannels; + } + + public void setBridgeNumChannels(Integer bridgeNumChannels) { + this.bridgeNumChannels = bridgeNumChannels; + } + + public String getBridgeCreator() { + return bridgeCreator; + } + + public void setBridgeCreator(String bridgeCreator) { + this.bridgeCreator = bridgeCreator; + } + + public String getBridgeName() { + return bridgeName; + } + + public void setBridgeName(String bridgeName) { + this.bridgeName = bridgeName; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java new file mode 100644 index 000000000..37d1d155e --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java @@ -0,0 +1,65 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BridgeDestroyEvent extends ManagerEvent { + private String bridgeUniqueId; + private String privilege; + private String bridgeType; + private Integer bridgeNumChannels; + private String bridgeCreator; + private String bridgeName; + + public BridgeDestroyEvent(Object source) { super(source); } + + public String getBridgeUniqueId() { + return bridgeUniqueId; + } + + public void setBridgeUniqueId(String bridgeUniqueId) { + this.bridgeUniqueId = bridgeUniqueId; + } + + @Override + public String getPrivilege() { + return privilege; + } + + @Override + public void setPrivilege(String privilege) { + this.privilege = privilege; + } + + public String getBridgeType() { + return bridgeType; + } + + public void setBridgeType(String bridgeType) { + this.bridgeType = bridgeType; + } + + public Integer getBridgeNumChannels() { + return bridgeNumChannels; + } + + public void setBridgeNumChannels(Integer bridgeNumChannels) { + this.bridgeNumChannels = bridgeNumChannels; + } + + public String getBridgeCreator() { + return bridgeCreator; + } + + public void setBridgeCreator(String bridgeCreator) { + this.bridgeCreator = bridgeCreator; + } + + public String getBridgeName() { + return bridgeName; + } + + public void setBridgeName(String bridgeName) { + this.bridgeName = bridgeName; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java new file mode 100644 index 000000000..e4d5cdfc9 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java @@ -0,0 +1,10 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BridgeEnterEvent extends ManagerEvent { + private String bridgeUniqueId; + + public BridgeEnterEvent(Object source) { super(source); } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 9f544c898..05bb64d65 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -195,6 +195,8 @@ private void registerBuiltinEventClasses() registerEventClass(DialEndEvent.class); registerEventClass(NewConnectedLineEvent.class); registerEventClass(InvalidPasswordEvent.class); + registerEventClass(BridgeCreateEvent.class); + registerEventClass(BridgeDestroyEvent.class); } public final void registerEventClass(Class clazz) throws IllegalArgumentException From 55b12d21cd9e85f6e9d035dbf4f39ad7372fb72f Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 14:09:06 +0300 Subject: [PATCH 0057/1055] MusicOnHold{Start|Stop}Events --- .../asteriskjava/manager/event/MusicOnHoldStartEvent.java | 8 ++++++++ .../asteriskjava/manager/event/MusicOnHoldStopEvent.java | 8 ++++++++ .../asteriskjava/manager/internal/EventBuilderImpl.java | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java new file mode 100644 index 000000000..79c896e16 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class MusicOnHoldStartEvent extends MusicOnHoldEvent { + public MusicOnHoldStartEvent(Object source) { super(source); setState(STATE_START); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java new file mode 100644 index 000000000..4f7030114 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class MusicOnHoldStopEvent extends MusicOnHoldEvent { + public MusicOnHoldStopEvent(Object source) { super(source); setState(STATE_STOP); } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 05bb64d65..c42ba3950 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -197,6 +197,8 @@ private void registerBuiltinEventClasses() registerEventClass(InvalidPasswordEvent.class); registerEventClass(BridgeCreateEvent.class); registerEventClass(BridgeDestroyEvent.class); + registerEventClass(MusicOnHoldStartEvent.class); + registerEventClass(MusicOnHoldStopEvent.class); } public final void registerEventClass(Class clazz) throws IllegalArgumentException From 50003feba9e57570c8038974d4606844f38fb5a3 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 14:16:30 +0300 Subject: [PATCH 0058/1055] Dtmf{Begin|End}Event --- .../org/asteriskjava/manager/event/DtmfBeginEvent.java | 8 ++++++++ .../java/org/asteriskjava/manager/event/DtmfEndEvent.java | 8 ++++++++ .../asteriskjava/manager/internal/EventBuilderImpl.java | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java new file mode 100644 index 000000000..f826e16f0 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class DtmfBeginEvent extends DtmfEvent { + public DtmfBeginEvent(Object source) { super(source); setBegin(true); setEnd(false); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java new file mode 100644 index 000000000..8cdcd9aaa --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class DtmfEndEvent extends DtmfEvent { + public DtmfEndEvent(Object source) { super(source); setBegin(false); setEnd(true); } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index c42ba3950..d747001c6 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -199,6 +199,8 @@ private void registerBuiltinEventClasses() registerEventClass(BridgeDestroyEvent.class); registerEventClass(MusicOnHoldStartEvent.class); registerEventClass(MusicOnHoldStopEvent.class); + registerEventClass(DtmfBeginEvent.class); + registerEventClass(DtmfEndEvent.class); } public final void registerEventClass(Class clazz) throws IllegalArgumentException From 47e690135dcb96f6b170532e9a4517548a542683 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 14:21:43 +0300 Subject: [PATCH 0059/1055] forgot bridgeenterevent --- .../java/org/asteriskjava/manager/internal/EventBuilderImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index d747001c6..bba963004 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -197,6 +197,7 @@ private void registerBuiltinEventClasses() registerEventClass(InvalidPasswordEvent.class); registerEventClass(BridgeCreateEvent.class); registerEventClass(BridgeDestroyEvent.class); + registerEventClass(BridgeEnterEvent.class); registerEventClass(MusicOnHoldStartEvent.class); registerEventClass(MusicOnHoldStopEvent.class); registerEventClass(DtmfBeginEvent.class); From 3c5aa228b2f4310a84eef416e1155db23bdf1846 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 14:23:16 +0300 Subject: [PATCH 0060/1055] DurationMs property --- .../org/asteriskjava/manager/event/DtmfEndEvent.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java index 8cdcd9aaa..d07ab7017 100644 --- a/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java @@ -4,5 +4,14 @@ * Created by Alexander Polakov on 1/26/15. */ public class DtmfEndEvent extends DtmfEvent { + private Integer durationMs; public DtmfEndEvent(Object source) { super(source); setBegin(false); setEnd(true); } + + public Integer getDurationMs() { + return durationMs; + } + + public void setDurationMs(Integer durationMs) { + this.durationMs = durationMs; + } } From 8a67a66400c9135e4fbd0c5562d2a753e5e4407e Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 14:26:40 +0300 Subject: [PATCH 0061/1055] BridgeTechnology property --- .../asteriskjava/manager/event/BridgeCreateEvent.java | 9 +++++++++ .../asteriskjava/manager/event/BridgeDestroyEvent.java | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java index c6f5f2dad..b4a76428a 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java @@ -10,6 +10,7 @@ public class BridgeCreateEvent extends ManagerEvent { private Integer bridgeNumChannels; private String bridgeCreator; private String bridgeName; + private String bridgeTechnology; public BridgeCreateEvent (Object source) { super(source); } @@ -62,4 +63,12 @@ public String getBridgeName() { public void setBridgeName(String bridgeName) { this.bridgeName = bridgeName; } + + public String getBridgeTechnology() { + return bridgeTechnology; + } + + public void setBridgeTechnology(String bridgeTechnology) { + this.bridgeTechnology = bridgeTechnology; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java index 37d1d155e..27c60c65b 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java @@ -10,6 +10,7 @@ public class BridgeDestroyEvent extends ManagerEvent { private Integer bridgeNumChannels; private String bridgeCreator; private String bridgeName; + private String bridgeTechnology; public BridgeDestroyEvent(Object source) { super(source); } @@ -62,4 +63,12 @@ public String getBridgeName() { public void setBridgeName(String bridgeName) { this.bridgeName = bridgeName; } + + public String getBridgeTechnology() { + return bridgeTechnology; + } + + public void setBridgeTechnology(String bridgeTechnology) { + this.bridgeTechnology = bridgeTechnology; + } } From bb8abbbee7150ab475a7895b44b5c73e0e64d2cd Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 14:44:45 +0300 Subject: [PATCH 0062/1055] Refactor common properties into AbstractBridgeEvent, add BridgeLeave --- .../manager/event/AbstractBridgeEvent.java | 74 +++++++++++++++++++ .../manager/event/BlindTransferEvent.java | 11 +++ .../manager/event/BridgeCreateEvent.java | 70 +----------------- .../manager/event/BridgeDestroyEvent.java | 68 +---------------- .../manager/event/BridgeLeaveEvent.java | 10 +++ .../manager/internal/EventBuilderImpl.java | 2 + 6 files changed, 100 insertions(+), 135 deletions(-) create mode 100644 src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java new file mode 100644 index 000000000..980337c3c --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java @@ -0,0 +1,74 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public abstract class AbstractBridgeEvent extends ManagerEvent { + private String bridgeUniqueId; + private String privilege; + private String bridgeType; + private Integer bridgeNumChannels; + private String bridgeCreator; + private String bridgeName; + private String bridgeTechnology; + + AbstractBridgeEvent(Object source) { super(source); } + + public String getBridgeUniqueId() { + return bridgeUniqueId; + } + + public void setBridgeUniqueId(String bridgeUniqueId) { + this.bridgeUniqueId = bridgeUniqueId; + } + + @Override + public String getPrivilege() { + return privilege; + } + + @Override + public void setPrivilege(String privilege) { + this.privilege = privilege; + } + + public String getBridgeType() { + return bridgeType; + } + + public void setBridgeType(String bridgeType) { + this.bridgeType = bridgeType; + } + + public Integer getBridgeNumChannels() { + return bridgeNumChannels; + } + + public void setBridgeNumChannels(Integer bridgeNumChannels) { + this.bridgeNumChannels = bridgeNumChannels; + } + + public String getBridgeCreator() { + return bridgeCreator; + } + + public void setBridgeCreator(String bridgeCreator) { + this.bridgeCreator = bridgeCreator; + } + + public String getBridgeName() { + return bridgeName; + } + + public void setBridgeName(String bridgeName) { + this.bridgeName = bridgeName; + } + + public String getBridgeTechnology() { + return bridgeTechnology; + } + + public void setBridgeTechnology(String bridgeTechnology) { + this.bridgeTechnology = bridgeTechnology; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java new file mode 100644 index 000000000..228659e85 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java @@ -0,0 +1,11 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BlindTransferEvent extends AbstractBridgeEvent { + private String transfererConnectedLineNum; + private String transfereeChannel; + + public BlindTransferEvent(Object source) { super(source); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java index b4a76428a..8d892dac1 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java @@ -3,72 +3,6 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BridgeCreateEvent extends ManagerEvent { - private String bridgeUniqueId; - private String privilege; - private String bridgeType; - private Integer bridgeNumChannels; - private String bridgeCreator; - private String bridgeName; - private String bridgeTechnology; - - public BridgeCreateEvent (Object source) { super(source); } - - public String getBridgeUniqueId() { - return bridgeUniqueId; - } - - public void setBridgeUniqueId(String bridgeUniqueId) { - this.bridgeUniqueId = bridgeUniqueId; - } - - @Override - public String getPrivilege() { - return privilege; - } - - @Override - public void setPrivilege(String privilege) { - this.privilege = privilege; - } - - public String getBridgeType() { - return bridgeType; - } - - public void setBridgeType(String bridgeType) { - this.bridgeType = bridgeType; - } - - public Integer getBridgeNumChannels() { - return bridgeNumChannels; - } - - public void setBridgeNumChannels(Integer bridgeNumChannels) { - this.bridgeNumChannels = bridgeNumChannels; - } - - public String getBridgeCreator() { - return bridgeCreator; - } - - public void setBridgeCreator(String bridgeCreator) { - this.bridgeCreator = bridgeCreator; - } - - public String getBridgeName() { - return bridgeName; - } - - public void setBridgeName(String bridgeName) { - this.bridgeName = bridgeName; - } - - public String getBridgeTechnology() { - return bridgeTechnology; - } - - public void setBridgeTechnology(String bridgeTechnology) { - this.bridgeTechnology = bridgeTechnology; - } +public class BridgeCreateEvent extends AbstractBridgeEvent { + public BridgeCreateEvent(Object source) { super(source); } } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java index 27c60c65b..70801f09f 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java @@ -3,72 +3,6 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BridgeDestroyEvent extends ManagerEvent { - private String bridgeUniqueId; - private String privilege; - private String bridgeType; - private Integer bridgeNumChannels; - private String bridgeCreator; - private String bridgeName; - private String bridgeTechnology; - +public class BridgeDestroyEvent extends AbstractBridgeEvent { public BridgeDestroyEvent(Object source) { super(source); } - - public String getBridgeUniqueId() { - return bridgeUniqueId; - } - - public void setBridgeUniqueId(String bridgeUniqueId) { - this.bridgeUniqueId = bridgeUniqueId; - } - - @Override - public String getPrivilege() { - return privilege; - } - - @Override - public void setPrivilege(String privilege) { - this.privilege = privilege; - } - - public String getBridgeType() { - return bridgeType; - } - - public void setBridgeType(String bridgeType) { - this.bridgeType = bridgeType; - } - - public Integer getBridgeNumChannels() { - return bridgeNumChannels; - } - - public void setBridgeNumChannels(Integer bridgeNumChannels) { - this.bridgeNumChannels = bridgeNumChannels; - } - - public String getBridgeCreator() { - return bridgeCreator; - } - - public void setBridgeCreator(String bridgeCreator) { - this.bridgeCreator = bridgeCreator; - } - - public String getBridgeName() { - return bridgeName; - } - - public void setBridgeName(String bridgeName) { - this.bridgeName = bridgeName; - } - - public String getBridgeTechnology() { - return bridgeTechnology; - } - - public void setBridgeTechnology(String bridgeTechnology) { - this.bridgeTechnology = bridgeTechnology; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java new file mode 100644 index 000000000..0a8345778 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java @@ -0,0 +1,10 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BridgeLeaveEvent extends ManagerEvent { + private String bridgeUniqueId; + + public BridgeLeaveEvent(Object source) { super(source); } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index bba963004..0b1d87888 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -198,6 +198,8 @@ private void registerBuiltinEventClasses() registerEventClass(BridgeCreateEvent.class); registerEventClass(BridgeDestroyEvent.class); registerEventClass(BridgeEnterEvent.class); + registerEventClass(BridgeLeaveEvent.class); + registerEventClass(BlindTransferEvent.class); registerEventClass(MusicOnHoldStartEvent.class); registerEventClass(MusicOnHoldStopEvent.class); registerEventClass(DtmfBeginEvent.class); From b46f5ccf282b356fe9dc26cad03c9f8a58ebac43 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 14:52:35 +0300 Subject: [PATCH 0063/1055] Use AbstractBridgeEvent --- .../java/org/asteriskjava/manager/event/BridgeEnterEvent.java | 4 +--- .../java/org/asteriskjava/manager/event/BridgeLeaveEvent.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java index e4d5cdfc9..f56a12e0f 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java @@ -3,8 +3,6 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BridgeEnterEvent extends ManagerEvent { - private String bridgeUniqueId; - +public class BridgeEnterEvent extends AbstractBridgeEvent { public BridgeEnterEvent(Object source) { super(source); } } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java index 0a8345778..041718f6f 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java @@ -3,7 +3,7 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BridgeLeaveEvent extends ManagerEvent { +public class BridgeLeaveEvent extends AbstractBridgeEvent { private String bridgeUniqueId; public BridgeLeaveEvent(Object source) { super(source); } From eefa57aea2a7a40703e4b5be92594973ef9218e3 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 15:08:06 +0300 Subject: [PATCH 0064/1055] Add setters/getters to BlindTransferEvent --- .../manager/event/BlindTransferEvent.java | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java index 228659e85..6fe98df9d 100644 --- a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java @@ -4,8 +4,216 @@ * Created by Alexander Polakov on 1/26/15. */ public class BlindTransferEvent extends AbstractBridgeEvent { + private String transfererUniqueId; private String transfererConnectedLineNum; + private String transfererConnectedLineName; + private String transfererCallerIdName; + private String transfererCallerIdNum; + private String transfererChannel; + private String transfererChannelState; + private String transfererChannelStateDesc; + private Integer transfererPriority; + private Integer transfererContext; + + + private String transfereeUniqueId; + private String transfereeConnectedLineNum; + private String transfereeConnectedLineName; + private String transfereeCallerIdName; + private String transfereeCallerIdNum; private String transfereeChannel; + private String transfereeChannelState; + private String transfereeChannelStateDesc; + private Integer transfereePriority; + private Integer transfereeContext; + + private String extension; + private String isexternal; + private String result; public BlindTransferEvent(Object source) { super(source); } + + public String getTransfererUniqueId() { + return transfererUniqueId; + } + + public void setTransfererUniqueId(String transfererUniqueId) { + this.transfererUniqueId = transfererUniqueId; + } + + public String getTransfererConnectedLineNum() { + return transfererConnectedLineNum; + } + + public void setTransfererConnectedLineNum(String transfererConnectedLineNum) { + this.transfererConnectedLineNum = transfererConnectedLineNum; + } + + public String getTransfererConnectedLineName() { + return transfererConnectedLineName; + } + + public void setTransfererConnectedLineName(String transfererConnectedLineName) { + this.transfererConnectedLineName = transfererConnectedLineName; + } + + public String getTransfererCallerIdName() { + return transfererCallerIdName; + } + + public void setTransfererCallerIdName(String transfererCallerIdName) { + this.transfererCallerIdName = transfererCallerIdName; + } + + public String getTransfererCallerIdNum() { + return transfererCallerIdNum; + } + + public void setTransfererCallerIdNum(String transfererCallerIdNum) { + this.transfererCallerIdNum = transfererCallerIdNum; + } + + public String getTransfererChannel() { + return transfererChannel; + } + + public void setTransfererChannel(String transfererChannel) { + this.transfererChannel = transfererChannel; + } + + public String getTransfererChannelState() { + return transfererChannelState; + } + + public void setTransfererChannelState(String transfererChannelState) { + this.transfererChannelState = transfererChannelState; + } + + public String getTransfererChannelStateDesc() { + return transfererChannelStateDesc; + } + + public void setTransfererChannelStateDesc(String transfererChannelStateDesc) { + this.transfererChannelStateDesc = transfererChannelStateDesc; + } + + public Integer getTransfererPriority() { + return transfererPriority; + } + + public void setTransfererPriority(Integer transfererPriority) { + this.transfererPriority = transfererPriority; + } + + public Integer getTransfererContext() { + return transfererContext; + } + + public void setTransfererContext(Integer transfererContext) { + this.transfererContext = transfererContext; + } + + public String getTransfereeUniqueId() { + return transfereeUniqueId; + } + + public void setTransfereeUniqueId(String transfereeUniqueId) { + this.transfereeUniqueId = transfereeUniqueId; + } + + public String getTransfereeConnectedLineNum() { + return transfereeConnectedLineNum; + } + + public void setTransfereeConnectedLineNum(String transfereeConnectedLineNum) { + this.transfereeConnectedLineNum = transfereeConnectedLineNum; + } + + public String getTransfereeConnectedLineName() { + return transfereeConnectedLineName; + } + + public void setTransfereeConnectedLineName(String transfereeConnectedLineName) { + this.transfereeConnectedLineName = transfereeConnectedLineName; + } + + public String getTransfereeCallerIdName() { + return transfereeCallerIdName; + } + + public void setTransfereeCallerIdName(String transfereeCallerIdName) { + this.transfereeCallerIdName = transfereeCallerIdName; + } + + public String getTransfereeCallerIdNum() { + return transfereeCallerIdNum; + } + + public void setTransfereeCallerIdNum(String transfereeCallerIdNum) { + this.transfereeCallerIdNum = transfereeCallerIdNum; + } + + public String getTransfereeChannel() { + return transfereeChannel; + } + + public void setTransfereeChannel(String transfereeChannel) { + this.transfereeChannel = transfereeChannel; + } + + public String getTransfereeChannelState() { + return transfereeChannelState; + } + + public void setTransfereeChannelState(String transfereeChannelState) { + this.transfereeChannelState = transfereeChannelState; + } + + public String getTransfereeChannelStateDesc() { + return transfereeChannelStateDesc; + } + + public void setTransfereeChannelStateDesc(String transfereeChannelStateDesc) { + this.transfereeChannelStateDesc = transfereeChannelStateDesc; + } + + public Integer getTransfereePriority() { + return transfereePriority; + } + + public void setTransfereePriority(Integer transfereePriority) { + this.transfereePriority = transfereePriority; + } + + public Integer getTransfereeContext() { + return transfereeContext; + } + + public void setTransfereeContext(Integer transfereeContext) { + this.transfereeContext = transfereeContext; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + + public String getIsexternal() { + return isexternal; + } + + public void setIsexternal(String isexternal) { + this.isexternal = isexternal; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } } From 2ccdc09e5d7d890f3457c4a07515ea61ff82ee22 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 15:12:15 +0300 Subject: [PATCH 0065/1055] BridgeLeaveEvent: channel & uniqueId --- .../manager/event/BridgeLeaveEvent.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java index 041718f6f..ced2f6759 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java @@ -4,7 +4,24 @@ * Created by Alexander Polakov on 1/26/15. */ public class BridgeLeaveEvent extends AbstractBridgeEvent { - private String bridgeUniqueId; + private String uniqueId; + private String channel; public BridgeLeaveEvent(Object source) { super(source); } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } } From ea24ea543d3c72f94a28d963127afd5dd22309ed Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 15:17:56 +0300 Subject: [PATCH 0066/1055] BlindTransfer: fix context property --- .../manager/event/BlindTransferEvent.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java index 6fe98df9d..b59503d53 100644 --- a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java @@ -13,7 +13,7 @@ public class BlindTransferEvent extends AbstractBridgeEvent { private String transfererChannelState; private String transfererChannelStateDesc; private Integer transfererPriority; - private Integer transfererContext; + private String transfererContext; private String transfereeUniqueId; @@ -25,7 +25,7 @@ public class BlindTransferEvent extends AbstractBridgeEvent { private String transfereeChannelState; private String transfereeChannelStateDesc; private Integer transfereePriority; - private Integer transfereeContext; + private String transfereeContext; private String extension; private String isexternal; @@ -105,11 +105,11 @@ public void setTransfererPriority(Integer transfererPriority) { this.transfererPriority = transfererPriority; } - public Integer getTransfererContext() { + public String getTransfererContext() { return transfererContext; } - public void setTransfererContext(Integer transfererContext) { + public void setTransfererContext(String transfererContext) { this.transfererContext = transfererContext; } @@ -185,11 +185,11 @@ public void setTransfereePriority(Integer transfereePriority) { this.transfereePriority = transfereePriority; } - public Integer getTransfereeContext() { + public String getTransfereeContext() { return transfereeContext; } - public void setTransfereeContext(Integer transfereeContext) { + public void setTransfereeContext(String transfereeContext) { this.transfereeContext = transfereeContext; } From ada9f28ae46c2b42d49c66c444afab4e830f097a Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 15:18:13 +0300 Subject: [PATCH 0067/1055] BridgeEnter: uniqueId & channel --- .../asteriskjava/manager/event/BridgeEnterEvent.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java index f56a12e0f..d52b7f67b 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java @@ -4,5 +4,15 @@ * Created by Alexander Polakov on 1/26/15. */ public class BridgeEnterEvent extends AbstractBridgeEvent { + private String channel; + public BridgeEnterEvent(Object source) { super(source); } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } } From b5679c2bc56a6bc0d890616c8339471446beecbd Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 15:19:58 +0300 Subject: [PATCH 0068/1055] BridgeEnter: uniqueId --- .../org/asteriskjava/manager/event/BridgeEnterEvent.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java index d52b7f67b..3bee8445f 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java @@ -4,6 +4,7 @@ * Created by Alexander Polakov on 1/26/15. */ public class BridgeEnterEvent extends AbstractBridgeEvent { + private String uniqueId; private String channel; public BridgeEnterEvent(Object source) { super(source); } @@ -15,4 +16,12 @@ public String getChannel() { public void setChannel(String channel) { this.channel = channel; } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } } From fc53f3039908d7d701306aa177c98decb1ef65f1 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 26 Jan 2015 15:23:39 +0300 Subject: [PATCH 0069/1055] BlindTransferEvent: add transfereeExten property --- .../asteriskjava/manager/event/BlindTransferEvent.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java index b59503d53..3cbf0768c 100644 --- a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java @@ -26,6 +26,7 @@ public class BlindTransferEvent extends AbstractBridgeEvent { private String transfereeChannelStateDesc; private Integer transfereePriority; private String transfereeContext; + private String transfereeExten; private String extension; private String isexternal; @@ -216,4 +217,12 @@ public String getResult() { public void setResult(String result) { this.result = result; } + + public String getTransfereeExten() { + return transfereeExten; + } + + public void setTransfereeExten(String transfereeExten) { + this.transfereeExten = transfereeExten; + } } From 7514ac02feb1b43570ced7ff21820fd788601694 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Tue, 27 Jan 2015 13:56:50 +0300 Subject: [PATCH 0070/1055] InvalidPasswordEvent: fix parsing account id --- .../asteriskjava/manager/event/InvalidPasswordEvent.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java index 1ae5a58d1..deeed3271 100644 --- a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java @@ -1,5 +1,7 @@ package org.asteriskjava.manager.event; +import java.math.BigInteger; + /** * Created by Alexander Polakov on 1/23/15. */ @@ -10,7 +12,7 @@ public class InvalidPasswordEvent extends ManagerEvent { private String sessionid; private String receivedHash; private String localaddress; - private Integer accountId; + private BigInteger accountId; private String receivedChallenge; private String service; private String remoteAddress; @@ -66,11 +68,11 @@ public void setLocaladdress(String localaddress) { this.localaddress = localaddress; } - public Integer getAccountId() { + public BigInteger getAccountId() { return accountId; } - public void setAccountId(Integer accountId) { + public void setAccountId(BigInteger accountId) { this.accountId = accountId; } From cfcc0d7c4a0037c16b561c0bef8e3a84e929b2d7 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Tue, 27 Jan 2015 15:44:43 +0300 Subject: [PATCH 0071/1055] AgiSubEvents: {Start,End,Exec} - use setSubEvent --- .../org/asteriskjava/manager/event/AsyncAgiEndEvent.java | 6 +----- .../org/asteriskjava/manager/event/AsyncAgiExecEvent.java | 6 +----- .../org/asteriskjava/manager/event/AsyncAgiStartEvent.java | 6 +----- 3 files changed, 3 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java index 703ba78f8..929139e10 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java @@ -4,9 +4,5 @@ * Created by plhk on 1/15/15. */ public class AsyncAgiEndEvent extends AsyncAgiEvent { - public AsyncAgiEndEvent(Object source) { super(source); } - - public boolean isEnd() { - return true; - } + public AsyncAgiEndEvent(Object source) { super(source); setSubEvent(SUB_EVENT_END); } } diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java index 57cf2a5f7..fa587995a 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java @@ -4,9 +4,5 @@ * Created by plhk on 1/15/15. */ public class AsyncAgiExecEvent extends AsyncAgiEvent { - public AsyncAgiExecEvent (Object source) { super(source); } - - public boolean isExec() { - return true; - } + public AsyncAgiExecEvent (Object source) { super(source); setSubEvent(SUB_EVENT_EXEC); } } diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java index eea2e2f42..0bf2637ec 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java @@ -5,9 +5,5 @@ */ public class AsyncAgiStartEvent extends AsyncAgiEvent { - public AsyncAgiStartEvent(Object source) { super(source); } - - public boolean isStart() { - return true; - } + public AsyncAgiStartEvent(Object source) { super(source); setSubEvent(SUB_EVENT_START); } } From 53cf9392ebb06228fc63308ad2ea1921013c7e7b Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Tue, 27 Jan 2015 16:33:56 +0300 Subject: [PATCH 0072/1055] AgiExec{Start,End}: set subevent --- .../org/asteriskjava/manager/event/AgiExecEndEvent.java | 6 +----- .../org/asteriskjava/manager/event/AgiExecStartEvent.java | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java index 92468829e..3d9be7cf0 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java @@ -4,9 +4,5 @@ * Created by plhk on 1/15/15. */ public class AgiExecEndEvent extends AgiExecEvent { - public AgiExecEndEvent(Object source) { super(source); } - - public boolean isEnd() { - return true; - } + public AgiExecEndEvent(Object source) { super(source); setSubEvent(SUB_EVENT_END); } } diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java index 17cb63ca3..f7634f244 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java @@ -4,9 +4,5 @@ * Created by plhk on 1/15/15. */ public class AgiExecStartEvent extends AgiExecEvent { - public AgiExecStartEvent(Object source) { super(source); } - - public boolean isStart() { - return true; - } + public AgiExecStartEvent(Object source) { super(source); setSubEvent(SUB_EVENT_START); } } From cd4e4f44e5f3f2efd034c8e1e11583fa9dcd527a Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Tue, 27 Jan 2015 17:32:57 +0300 Subject: [PATCH 0073/1055] Dial{Begin,End}Event: use constants --- .../java/org/asteriskjava/manager/event/DialBeginEvent.java | 2 +- src/main/java/org/asteriskjava/manager/event/DialEndEvent.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java index 53f1a4722..e3b73b921 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -1,5 +1,5 @@ package org.asteriskjava.manager.event; public class DialBeginEvent extends DialEvent { - public DialBeginEvent(Object source) { super(source); setSubEvent("Begin"); } + public DialBeginEvent(Object source) { super(source); setSubEvent(SUBEVENT_BEGIN); } } diff --git a/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java index b0e2fd95a..eaed97380 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java @@ -1,5 +1,5 @@ package org.asteriskjava.manager.event; public class DialEndEvent extends DialEvent { - public DialEndEvent(Object source) { super(source); setSubEvent("End"); } + public DialEndEvent(Object source) { super(source); setSubEvent(SUBEVENT_END); } } From acb866f3b4b8f3b7374be32d3f14f5cfae22b47e Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Wed, 28 Jan 2015 14:47:04 +0300 Subject: [PATCH 0074/1055] AgiReplyImpl: handle empty reply result --- .../asteriskjava/fastagi/internal/AgiReplyImpl.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiReplyImpl.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiReplyImpl.java index 323383d7f..eadcfde75 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiReplyImpl.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiReplyImpl.java @@ -16,11 +16,12 @@ */ package org.asteriskjava.fastagi.internal; -import java.util.*; -import java.util.regex.*; - import org.asteriskjava.fastagi.reply.AgiReply; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * Default implementation of the AgiReply interface. @@ -163,6 +164,11 @@ public int getStatus() return status; } + if (firstLine == null) + { + return -1; + } + final Matcher matcher = STATUS_PATTERN.matcher(firstLine); if (matcher.find()) { From d494db8b1fc84896e8db6de1dc2a2a68c8897e1b Mon Sep 17 00:00:00 2001 From: kantv Date: Mon, 2 Mar 2015 19:47:18 +0300 Subject: [PATCH 0075/1055] Revert "Revert "auto added file list to gitignore"" This reverts commit 846cf48a3ae1d7a391461dc22992bbe7c293da10. Revert "auto added file list to gitignore" This reverts commit 87a2474b8d4afb53f8805a323beabc6346072ee6. auto added file list to gitignore Merge remote-tracking branch 'origin/asterisk_12_13' Merge remote-tracking branch 'origin/asterisk-12-13-all' --- src/main/java/org/asteriskjava/.gitignore | 2 + .../org/asteriskjava/AsteriskVersion.java | 15 ++ .../java/org/asteriskjava/config/.gitignore | 13 + .../asteriskjava/config/dialplan/.gitignore | 4 + .../java/org/asteriskjava/fastagi/.gitignore | 31 +++ .../asteriskjava/fastagi/command/.gitignore | 49 ++++ .../asteriskjava/fastagi/internal/.gitignore | 14 ++ .../fastagi/internal/AgiReplyImpl.java | 12 +- .../org/asteriskjava/fastagi/reply/.gitignore | 1 + .../java/org/asteriskjava/live/.gitignore | 36 +++ .../org/asteriskjava/live/internal/.gitignore | 20 ++ .../java/org/asteriskjava/manager/.gitignore | 16 ++ .../asteriskjava/manager/action/.gitignore | 98 ++++++++ .../org/asteriskjava/manager/event/.gitignore | 156 ++++++++++++ .../manager/event/AbstractBridgeEvent.java | 74 ++++++ .../manager/event/AgentCalledEvent.java | 51 +--- .../manager/event/AgiExecEndEvent.java | 8 + .../manager/event/AgiExecEvent.java | 10 + .../manager/event/AgiExecStartEvent.java | 8 + .../manager/event/AsyncAgiEndEvent.java | 8 + .../manager/event/AsyncAgiEvent.java | 9 + .../manager/event/AsyncAgiExecEvent.java | 8 + .../manager/event/AsyncAgiStartEvent.java | 9 + .../manager/event/BlindTransferEvent.java | 228 ++++++++++++++++++ .../manager/event/BridgeCreateEvent.java | 8 + .../manager/event/BridgeDestroyEvent.java | 8 + .../manager/event/BridgeEnterEvent.java | 27 +++ .../manager/event/BridgeLeaveEvent.java | 27 +++ .../manager/event/ChallengeSentEvent.java | 90 +++++++ .../manager/event/CoreShowChannelEvent.java | 19 -- .../manager/event/DeviceStateChangeEvent.java | 24 ++ .../manager/event/DialBeginEvent.java | 5 + .../manager/event/DialEndEvent.java | 5 + .../asteriskjava/manager/event/DialEvent.java | 94 +++++++- .../manager/event/DtmfBeginEvent.java | 8 + .../manager/event/DtmfEndEvent.java | 17 ++ .../manager/event/InvalidPasswordEvent.java | 110 +++++++++ .../manager/event/ManagerEvent.java | 89 +++++++ .../manager/event/MusicOnHoldStartEvent.java | 8 + .../manager/event/MusicOnHoldStopEvent.java | 8 + .../manager/event/NewChannelEvent.java | 17 ++ .../manager/event/NewConnectedLineEvent.java | 27 +++ .../manager/event/SuccessfulAuthEvent.java | 101 ++++++++ .../manager/event/VarSetEvent.java | 73 ++++++ .../asteriskjava/manager/internal/.gitignore | 20 ++ .../manager/internal/EventBuilderImpl.java | 22 +- .../internal/ManagerConnectionImpl.java | 11 + .../asteriskjava/manager/response/.gitignore | 16 ++ .../java/org/asteriskjava/tools/.gitignore | 2 + .../java/org/asteriskjava/util/.gitignore | 11 + .../org/asteriskjava/util/internal/.gitignore | 8 + 51 files changed, 1664 insertions(+), 71 deletions(-) create mode 100644 src/main/java/org/asteriskjava/.gitignore create mode 100644 src/main/java/org/asteriskjava/config/.gitignore create mode 100644 src/main/java/org/asteriskjava/config/dialplan/.gitignore create mode 100644 src/main/java/org/asteriskjava/fastagi/.gitignore create mode 100644 src/main/java/org/asteriskjava/fastagi/command/.gitignore create mode 100644 src/main/java/org/asteriskjava/fastagi/internal/.gitignore create mode 100644 src/main/java/org/asteriskjava/fastagi/reply/.gitignore create mode 100644 src/main/java/org/asteriskjava/live/.gitignore create mode 100644 src/main/java/org/asteriskjava/live/internal/.gitignore create mode 100644 src/main/java/org/asteriskjava/manager/.gitignore create mode 100644 src/main/java/org/asteriskjava/manager/action/.gitignore create mode 100644 src/main/java/org/asteriskjava/manager/event/.gitignore create mode 100644 src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/DialEndEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/internal/.gitignore create mode 100644 src/main/java/org/asteriskjava/manager/response/.gitignore create mode 100644 src/main/java/org/asteriskjava/tools/.gitignore create mode 100644 src/main/java/org/asteriskjava/util/.gitignore create mode 100644 src/main/java/org/asteriskjava/util/internal/.gitignore diff --git a/src/main/java/org/asteriskjava/.gitignore b/src/main/java/org/asteriskjava/.gitignore new file mode 100644 index 000000000..3595ce329 --- /dev/null +++ b/src/main/java/org/asteriskjava/.gitignore @@ -0,0 +1,2 @@ +/AsteriskVersion.class +/Cli.class diff --git a/src/main/java/org/asteriskjava/AsteriskVersion.java b/src/main/java/org/asteriskjava/AsteriskVersion.java index 208faf7c7..7e7b1636a 100644 --- a/src/main/java/org/asteriskjava/AsteriskVersion.java +++ b/src/main/java/org/asteriskjava/AsteriskVersion.java @@ -75,6 +75,21 @@ public class AsteriskVersion implements Comparable, Serializabl */ public static final AsteriskVersion ASTERISK_11 = new AsteriskVersion(1100, "Asterisk 11"); + /** + * Represents the Asterisk 12 series. + * + * @since 1.0.0 + */ + public static final AsteriskVersion ASTERISK_12 = new AsteriskVersion(1200, "Asterisk 12"); + + /** + * Represents the Asterisk 13 series. + * + * @since 1.0.0 + */ + public static final AsteriskVersion ASTERISK_13 = new AsteriskVersion(1300, "Asterisk 13"); + + /** * Serial version identifier. */ diff --git a/src/main/java/org/asteriskjava/config/.gitignore b/src/main/java/org/asteriskjava/config/.gitignore new file mode 100644 index 000000000..46cfb38ff --- /dev/null +++ b/src/main/java/org/asteriskjava/config/.gitignore @@ -0,0 +1,13 @@ +/Category.class +/ConfigDirective.class +/ConfigElement.class +/ConfigFile.class +/ConfigFileImpl.class +/ConfigFileReader.class +/ConfigParseException.class +/ConfigVariable.class +/ExecDirective.class +/IncludeDirective.class +/MissingDirectiveParameterException.class +/MissingEqualSignException.class +/UnknownDirectiveException.class diff --git a/src/main/java/org/asteriskjava/config/dialplan/.gitignore b/src/main/java/org/asteriskjava/config/dialplan/.gitignore new file mode 100644 index 000000000..6b973a36c --- /dev/null +++ b/src/main/java/org/asteriskjava/config/dialplan/.gitignore @@ -0,0 +1,4 @@ +/ConfigExtension.class +/ConfigInclude.class +/ExtensionsConfigFile.class +/ExtensionsConfigFileReader.class diff --git a/src/main/java/org/asteriskjava/fastagi/.gitignore b/src/main/java/org/asteriskjava/fastagi/.gitignore new file mode 100644 index 000000000..98a4ac9ad --- /dev/null +++ b/src/main/java/org/asteriskjava/fastagi/.gitignore @@ -0,0 +1,31 @@ +/AbstractAgiServer.class +/AbstractMappingStrategy.class +/AgiChannel.class +/AgiException.class +/AgiHangupException.class +/AgiNetworkException.class +/AgiOperations.class +/AgiRequest.class +/AgiScript.class +/AgiServer.class +/AgiServerThread$1.class +/AgiServerThread$AgiThreadUncaughtExceptionHanlder.class +/AgiServerThread.class +/AgiSpeechException.class +/AsyncAgiServer.class +/BaseAgiScript.class +/ClassNameMappingStrategy.class +/CompositeMappingStrategy.class +/DefaultAgiServer.class +/InvalidCommandSyntaxException.class +/InvalidOrUnknownCommandException.class +/MappingStrategy.class +/NamedAgiScript.class +/ResourceBundleMappingStrategy.class +/ScriptEngineMappingStrategy$1.class +/ScriptEngineMappingStrategy$ScriptEngineAgiScript.class +/ScriptEngineMappingStrategy.class +/SimpleMappingStrategy.class +/SpeechRecognitionResult$SpeechResult.class +/SpeechRecognitionResult.class +/StaticMappingStrategy.class diff --git a/src/main/java/org/asteriskjava/fastagi/command/.gitignore b/src/main/java/org/asteriskjava/fastagi/command/.gitignore new file mode 100644 index 000000000..c436b7ecf --- /dev/null +++ b/src/main/java/org/asteriskjava/fastagi/command/.gitignore @@ -0,0 +1,49 @@ +/AbstractAgiCommand.class +/AgiCommand.class +/AnswerCommand.class +/AsyncAgiBreakCommand.class +/ChannelStatusCommand.class +/ControlStreamFileCommand.class +/DatabaseDelCommand.class +/DatabaseDelTreeCommand.class +/DatabaseGetCommand.class +/DatabasePutCommand.class +/ExecCommand.class +/GetDataCommand.class +/GetFullVariableCommand.class +/GetOptionCommand.class +/GetVariableCommand.class +/GosubCommand.class +/HangupCommand.class +/NoopCommand.class +/ReceiveCharCommand.class +/ReceiveTextCommand.class +/RecordFileCommand.class +/SayAlphaCommand.class +/SayDateTimeCommand.class +/SayDigitsCommand.class +/SayNumberCommand.class +/SayPhoneticCommand.class +/SayTimeCommand.class +/SendImageCommand.class +/SendTextCommand.class +/SetAutoHangupCommand.class +/SetCallerIdCommand.class +/SetContextCommand.class +/SetExtensionCommand.class +/SetMusicOffCommand.class +/SetMusicOnCommand.class +/SetPriorityCommand.class +/SetVariableCommand.class +/SpeechActivateGrammarCommand.class +/SpeechCreateCommand.class +/SpeechDeactivateGrammarCommand.class +/SpeechDestroyCommand.class +/SpeechLoadGrammarCommand.class +/SpeechRecognizeCommand.class +/SpeechSetCommand.class +/SpeechUnloadGrammarCommand.class +/StreamFileCommand.class +/TddModeCommand.class +/VerboseCommand.class +/WaitForDigitCommand.class diff --git a/src/main/java/org/asteriskjava/fastagi/internal/.gitignore b/src/main/java/org/asteriskjava/fastagi/internal/.gitignore new file mode 100644 index 000000000..df400e5e4 --- /dev/null +++ b/src/main/java/org/asteriskjava/fastagi/internal/.gitignore @@ -0,0 +1,14 @@ +/AgiChannelFactory.class +/AgiChannelImpl.class +/AgiConnectionHandler.class +/AgiReader.class +/AgiReplyImpl.class +/AgiRequestImpl.class +/AgiWriter.class +/AsyncAgiConnectionHandler.class +/AsyncAgiReader.class +/AsyncAgiWriter.class +/DefaultAgiChannelFactory.class +/FastAgiConnectionHandler.class +/FastAgiReader.class +/FastAgiWriter.class diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiReplyImpl.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiReplyImpl.java index 323383d7f..eadcfde75 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiReplyImpl.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiReplyImpl.java @@ -16,11 +16,12 @@ */ package org.asteriskjava.fastagi.internal; -import java.util.*; -import java.util.regex.*; - import org.asteriskjava.fastagi.reply.AgiReply; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * Default implementation of the AgiReply interface. @@ -163,6 +164,11 @@ public int getStatus() return status; } + if (firstLine == null) + { + return -1; + } + final Matcher matcher = STATUS_PATTERN.matcher(firstLine); if (matcher.find()) { diff --git a/src/main/java/org/asteriskjava/fastagi/reply/.gitignore b/src/main/java/org/asteriskjava/fastagi/reply/.gitignore new file mode 100644 index 000000000..56de7ec63 --- /dev/null +++ b/src/main/java/org/asteriskjava/fastagi/reply/.gitignore @@ -0,0 +1 @@ +/AgiReply.class diff --git a/src/main/java/org/asteriskjava/live/.gitignore b/src/main/java/org/asteriskjava/live/.gitignore new file mode 100644 index 000000000..305344291 --- /dev/null +++ b/src/main/java/org/asteriskjava/live/.gitignore @@ -0,0 +1,36 @@ +/AbstractAsteriskServerListener.class +/AgentState.class +/AmaFlags.class +/AsteriskAgent.class +/AsteriskChannel.class +/AsteriskQueue.class +/AsteriskQueueEntry.class +/AsteriskQueueListener.class +/AsteriskQueueMember.class +/AsteriskServer.class +/AsteriskServerListener.class +/CallDetailRecord.class +/CallerId.class +/ChannelState.class +/ChannelStateHistoryEntry.class +/DefaultAsteriskServer.class +/DialedChannelHistoryEntry.class +/Disposition.class +/Extension.class +/ExtensionHistoryEntry.class +/HangupCause.class +/InvalidPenaltyException.class +/LinkedChannelHistoryEntry.class +/LiveException.class +/LiveObject.class +/ManagerCommunicationException.class +/MeetMeRoom.class +/MeetMeUser.class +/MeetMeUserState.class +/NoSuchChannelException.class +/NoSuchInterfaceException.class +/OriginateCallback.class +/QueueEntryState.class +/QueueMemberState.class +/SecureAsteriskServer.class +/Voicemailbox.class diff --git a/src/main/java/org/asteriskjava/live/internal/.gitignore b/src/main/java/org/asteriskjava/live/internal/.gitignore new file mode 100644 index 000000000..9f05d58f2 --- /dev/null +++ b/src/main/java/org/asteriskjava/live/internal/.gitignore @@ -0,0 +1,20 @@ +/ConfigFileImpl.class +/Constants.class +/ManagerCommunicationExceptionMapper.class +/ManagerConnectionPool.class +/MeetMeManager.class +/MeetMeRoomImpl.class +/MeetMeUserImpl.class +/OriginateCallbackData.class +/QueueManager.class +/AbstractLiveObject.class +/AgentManager.class +/AsteriskAgentImpl.class +/AsteriskChannelImpl.class +/AsteriskQueueEntryImpl.class +/AsteriskQueueImpl$ServiceLevelTimerTask.class +/AsteriskQueueImpl.class +/AsteriskQueueMemberImpl.class +/AsteriskServerImpl.class +/CallDetailRecordImpl.class +/ChannelManager.class diff --git a/src/main/java/org/asteriskjava/manager/.gitignore b/src/main/java/org/asteriskjava/manager/.gitignore new file mode 100644 index 000000000..c376693eb --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/.gitignore @@ -0,0 +1,16 @@ +/AbstractManagerEventListener.class +/AsteriskMapping.class +/AuthenticationFailedException.class +/DefaultManagerConnection.class +/EventTimeoutException.class +/ExpectedResponse.class +/ManagerConnection.class +/ManagerConnectionFactory.class +/ManagerConnectionState.class +/ManagerEventListener.class +/ManagerEventListenerProxy$1.class +/ManagerEventListenerProxy.class +/PingThread.class +/ResponseEvents.class +/SendActionCallback.class +/TimeoutException.class diff --git a/src/main/java/org/asteriskjava/manager/action/.gitignore b/src/main/java/org/asteriskjava/manager/action/.gitignore new file mode 100644 index 000000000..454bd64b1 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/action/.gitignore @@ -0,0 +1,98 @@ +/AbsoluteTimeoutAction.class +/AbstractManagerAction.class +/AbstractMeetMeMuteAction.class +/AgentCallbackLoginAction.class +/AgentLogoffAction.class +/AgentsAction.class +/AgiAction.class +/AtxferAction.class +/BridgeAction.class +/ChallengeAction.class +/ChangeMonitorAction.class +/CommandAction.class +/ConfbridgeKickAction.class +/ConfbridgeListAction.class +/ConfbridgeListRoomsAction.class +/ConfbridgeLockAction.class +/ConfbridgeMuteAction.class +/ConfbridgeSetSingleVideoSrcAction.class +/ConfbridgeStartRecordAction.class +/ConfbridgeStopRecordAction.class +/ConfbridgeUnlockAction.class +/ConfbridgeUnmuteAction.class +/CoreSettingsAction.class +/CoreShowChannelsAction.class +/CoreStatusAction.class +/DahdiShowChannelsAction.class +/DbDelAction.class +/DbDelTreeAction.class +/DbGetAction.class +/DbPutAction.class +/DongleSendSMSAction.class +/DongleShowDevicesAction.class +/EventGeneratingAction.class +/EventsAction.class +/ExtensionStateAction.class +/GetConfigAction.class +/GetVarAction.class +/HangupAction.class +/IaxPeerListAction.class +/JabberSendAction.class +/ListCommandsAction.class +/LocalOptimizeAwayAction.class +/LoginAction.class +/LogoffAction.class +/MailboxCountAction.class +/MailboxStatusAction.class +/ManagerAction.class +/MeetMeMuteAction.class +/MeetMeUnmuteAction.class +/MixMonitorMuteAction.class +/ModuleCheckAction.class +/ModuleLoadAction.class +/MonitorAction.class +/OriginateAction.class +/ParkAction.class +/ParkedCallsAction.class +/PauseMixMonitorAction.class +/PauseMonitorAction.class +/PingAction.class +/PlayDtmfAction.class +/QueueAddAction.class +/QueueLogAction.class +/QueuePauseAction.class +/QueuePenaltyAction.class +/QueueRemoveAction.class +/QueueResetAction.class +/QueueStatusAction.class +/QueueSummaryAction.class +/RedirectAction.class +/SendTextAction.class +/SetCdrUserFieldAction.class +/SetVarAction.class +/ShowDialplanAction.class +/SipNotifyAction.class +/SipPeersAction.class +/SipShowPeerAction.class +/SipShowRegistryAction.class +/SkypeAccountPropertyAction.class +/SkypeAddBuddyAction.class +/SkypeBuddiesAction.class +/SkypeBuddyAction.class +/SkypeChatSendAction.class +/SkypeLicenseListAction.class +/SkypeLicenseStatusAction.class +/SkypeRemoveBuddyAction.class +/StatusAction.class +/StopMonitorAction.class +/UnpauseMonitorAction.class +/UpdateConfigAction.class +/UserEventAction.class +/VoicemailUsersListAction.class +/ZapDialOffhookAction.class +/ZapDndOffAction.class +/ZapDndOnAction.class +/ZapHangupAction.class +/ZapRestartAction.class +/ZapShowChannelsAction.class +/ZapTransferAction.class diff --git a/src/main/java/org/asteriskjava/manager/event/.gitignore b/src/main/java/org/asteriskjava/manager/event/.gitignore new file mode 100644 index 000000000..3a9df767c --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/.gitignore @@ -0,0 +1,156 @@ +/AbstractAgentEvent.class +/AbstractChannelEvent.class +/AbstractChannelStateEvent.class +/AbstractFaxEvent.class +/AbstractMeetMeEvent.class +/AbstractMonitorEvent.class +/AbstractParkedCallEvent.class +/AbstractQueueMemberEvent.class +/AbstractRtcpEvent.class +/AbstractRtpStatEvent.class +/AgentCallbackLoginEvent.class +/AgentCallbackLogoffEvent.class +/AgentCalledEvent.class +/AgentCompleteEvent.class +/AgentConnectEvent.class +/AgentDumpEvent.class +/AgentLoginEvent.class +/AgentLogoffEvent.class +/AgentRingNoAnswerEvent.class +/AgentsCompleteEvent.class +/AgentsEvent.class +/AgiExecEvent.class +/AlarmClearEvent.class +/AlarmEvent.class +/AsyncAgiEvent.class +/BridgeEvent.class +/BridgeExecEvent.class +/CdrEvent.class +/ChanSpyStartEvent.class +/ChanSpyStopEvent.class +/ChannelReloadEvent.class +/ChannelUpdateEvent.class +/ConfbridgeEndEvent.class +/ConfbridgeJoinEvent.class +/ConfbridgeLeaveEvent.class +/ConfbridgeListCompleteEvent.class +/ConfbridgeListEvent.class +/ConfbridgeListRoomsCompleteEvent.class +/ConfbridgeListRoomsEvent.class +/ConfbridgeStartEvent.class +/ConfbridgeTalkingEvent.class +/ConnectEvent.class +/CoreShowChannelEvent.class +/CoreShowChannelsCompleteEvent.class +/DAHDIChannelEvent.class +/DahdiShowChannelsCompleteEvent.class +/DahdiShowChannelsEvent.class +/DbGetResponseEvent.class +/DialEvent.class +/DisconnectEvent.class +/DndStateEvent.class +/DongleCENDEvent.class +/DongleCallStateChangeEvent.class +/DongleDeviceEntryEvent.class +/DongleNewCMGREvent.class +/DongleNewSMSBase64Event.class +/DongleNewSMSEvent.class +/DongleShowDevicesCompleteEvent.class +/DongleStatusEvent.class +/DtmfEvent.class +/ExtensionStatusEvent.class +/FaxDocumentStatusEvent.class +/FaxReceivedEvent.class +/FaxStatusEvent.class +/FullyBootedEvent.class +/HangupEvent.class +/HangupRequestEvent.class +/HoldEvent.class +/HoldedCallEvent.class +/JabberEventEvent.class +/JitterBufStatsEvent.class +/JoinEvent.class +/LeaveEvent.class +/LinkEvent.class +/ListDialplanEvent.class +/LogChannelEvent.class +/ManagerEvent.class +/MasqueradeEvent.class +/MeetMeEndEvent.class +/MeetMeJoinEvent.class +/MeetMeLeaveEvent.class +/MeetMeMuteEvent.class +/MeetMeStopTalkingEvent.class +/MeetMeTalkingEvent.class +/MeetMeTalkingRequestEvent.class +/MessageWaitingEvent.class +/ModuleLoadReportEvent.class +/MonitorStartEvent.class +/MonitorStopEvent.class +/MusicOnHoldEvent.class +/NewAccountCodeEvent.class +/NewCallerIdEvent.class +/NewChannelEvent.class +/NewExtenEvent.class +/NewStateEvent.class +/OriginateFailureEvent.class +/OriginateResponseEvent.class +/OriginateSuccessEvent.class +/ParkedCallEvent.class +/ParkedCallGiveUpEvent.class +/ParkedCallTimeOutEvent.class +/ParkedCallsCompleteEvent.class +/PeerEntryEvent.class +/PeerStatusEvent.class +/PeerlistCompleteEvent.class +/PriEventEvent.class +/ProtocolIdentifierReceivedEvent.class +/QueueCallerAbandonEvent.class +/QueueEntryEvent.class +/QueueEvent.class +/QueueMemberAddedEvent.class +/QueueMemberEvent.class +/QueueMemberPausedEvent.class +/QueueMemberPenaltyEvent.class +/QueueMemberRemovedEvent.class +/QueueMemberStatusEvent.class +/QueueParamsEvent.class +/QueueStatusCompleteEvent.class +/QueueSummaryCompleteEvent.class +/QueueSummaryEvent.class +/ReceiveFaxEvent.class +/RegistrationsCompleteEvent.class +/RegistryEntryEvent.class +/RegistryEvent.class +/ReloadEvent.class +/RenameEvent.class +/ResponseEvent.class +/RtcpReceivedEvent.class +/RtcpSentEvent.class +/RtpReceiverStatEvent.class +/RtpSenderStatEvent.class +/SendFaxEvent.class +/SendFaxStatusEvent.class +/ShowDialplanCompleteEvent.class +/ShutdownEvent.class +/SkypeAccountStatusEvent.class +/SkypeBuddyEntryEvent.class +/SkypeBuddyListCompleteEvent.class +/SkypeBuddyStatusEvent.class +/SkypeChatMessageEvent.class +/SkypeLicenseEvent.class +/SkypeLicenseListCompleteEvent.class +/SoftHangupRequestEvent.class +/StatusCompleteEvent.class +/StatusEvent.class +/T38FaxStatusEvent.class +/TransferEvent.class +/UnholdEvent.class +/UnlinkEvent.class +/UnparkedCallEvent.class +/UserEvent.class +/VarSetEvent.class +/VoicemailUserEntryCompleteEvent.class +/VoicemailUserEntryEvent.class +/ZapShowChannelsCompleteEvent.class +/ZapShowChannelsEvent.class diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java new file mode 100644 index 000000000..980337c3c --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java @@ -0,0 +1,74 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public abstract class AbstractBridgeEvent extends ManagerEvent { + private String bridgeUniqueId; + private String privilege; + private String bridgeType; + private Integer bridgeNumChannels; + private String bridgeCreator; + private String bridgeName; + private String bridgeTechnology; + + AbstractBridgeEvent(Object source) { super(source); } + + public String getBridgeUniqueId() { + return bridgeUniqueId; + } + + public void setBridgeUniqueId(String bridgeUniqueId) { + this.bridgeUniqueId = bridgeUniqueId; + } + + @Override + public String getPrivilege() { + return privilege; + } + + @Override + public void setPrivilege(String privilege) { + this.privilege = privilege; + } + + public String getBridgeType() { + return bridgeType; + } + + public void setBridgeType(String bridgeType) { + this.bridgeType = bridgeType; + } + + public Integer getBridgeNumChannels() { + return bridgeNumChannels; + } + + public void setBridgeNumChannels(Integer bridgeNumChannels) { + this.bridgeNumChannels = bridgeNumChannels; + } + + public String getBridgeCreator() { + return bridgeCreator; + } + + public void setBridgeCreator(String bridgeCreator) { + this.bridgeCreator = bridgeCreator; + } + + public String getBridgeName() { + return bridgeName; + } + + public void setBridgeName(String bridgeName) { + this.bridgeName = bridgeName; + } + + public String getBridgeTechnology() { + return bridgeTechnology; + } + + public void setBridgeTechnology(String bridgeTechnology) { + this.bridgeTechnology = bridgeTechnology; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java index 591a7bff8..b7de5d303 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java @@ -40,14 +40,7 @@ public class AgentCalledEvent extends ManagerEvent private String agentName; private String channelCalling; private String destinationChannel; - private String callerIdNum; - private String callerIdName; - private String context; - private String extension; - private String priority; private String uniqueId; - private String connectedlinename; - private String connectedlinenum; private Map variables; @@ -190,16 +183,8 @@ public void setCallerId(String callerId) this.callerIdNum = callerId; } - /** - * Returns the Caller ID name of the caller's channel. - * - * @return the Caller ID name of the caller's channel or "unknown" if none has been set. - * @since 0.2 - */ - public String getCallerIdName() - { - return callerIdName; - } + + public String getCallerIdName() { return callerIdName; } /** * Sets the Caller ID name of the caller's channel. @@ -224,22 +209,12 @@ public void setContext(String context) public String getExtension() { - return extension; + return exten; } public void setExtension(String extension) { - this.extension = extension; - } - - public String getPriority() - { - return priority; - } - - public void setPriority(String priority) - { - this.priority = priority; + this.exten = extension; } /** @@ -291,15 +266,6 @@ public void setVariables(Map variables) * * @since 1.0.0 */ - public String getConnectedlinename() - { - return connectedlinename; - } - - public void setConnectedlinename(String connectedlinename) - { - this.connectedlinename = connectedlinename; - } /** * Returns the Caller*ID number of the channel connected if set. @@ -307,14 +273,5 @@ public void setConnectedlinename(String connectedlinename) * * @since 1.0.0 */ - public String getConnectedlinenum() - { - return connectedlinenum; - } - - public void setConnectedlinenum(String connectedlinenum) - { - this.connectedlinenum = connectedlinenum; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java new file mode 100644 index 000000000..3d9be7cf0 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AgiExecEndEvent extends AgiExecEvent { + public AgiExecEndEvent(Object source) { super(source); setSubEvent(SUB_EVENT_END); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecEvent.java index 543ee38b5..d40f851e1 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgiExecEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecEvent.java @@ -41,6 +41,16 @@ public class AgiExecEvent extends ManagerEvent private Integer resultCode; private String result; + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } + + private String uniqueId; + /** * Creates a new AgiExecEvent. * diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java new file mode 100644 index 000000000..f7634f244 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AgiExecStartEvent extends AgiExecEvent { + public AgiExecStartEvent(Object source) { super(source); setSubEvent(SUB_EVENT_START); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java new file mode 100644 index 000000000..929139e10 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AsyncAgiEndEvent extends AsyncAgiEvent { + public AsyncAgiEndEvent(Object source) { super(source); setSubEvent(SUB_EVENT_END); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java index d2b41cb88..87b2a7213 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java @@ -38,6 +38,15 @@ public class AsyncAgiEvent extends ResponseEvent private String commandId; private String result; private String env; + private String uniqueId; + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } /** * Creates a new AsyncAgiEvent. diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java new file mode 100644 index 000000000..fa587995a --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AsyncAgiExecEvent extends AsyncAgiEvent { + public AsyncAgiExecEvent (Object source) { super(source); setSubEvent(SUB_EVENT_EXEC); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java new file mode 100644 index 000000000..0bf2637ec --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java @@ -0,0 +1,9 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class AsyncAgiStartEvent extends AsyncAgiEvent +{ + public AsyncAgiStartEvent(Object source) { super(source); setSubEvent(SUB_EVENT_START); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java new file mode 100644 index 000000000..3cbf0768c --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java @@ -0,0 +1,228 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BlindTransferEvent extends AbstractBridgeEvent { + private String transfererUniqueId; + private String transfererConnectedLineNum; + private String transfererConnectedLineName; + private String transfererCallerIdName; + private String transfererCallerIdNum; + private String transfererChannel; + private String transfererChannelState; + private String transfererChannelStateDesc; + private Integer transfererPriority; + private String transfererContext; + + + private String transfereeUniqueId; + private String transfereeConnectedLineNum; + private String transfereeConnectedLineName; + private String transfereeCallerIdName; + private String transfereeCallerIdNum; + private String transfereeChannel; + private String transfereeChannelState; + private String transfereeChannelStateDesc; + private Integer transfereePriority; + private String transfereeContext; + private String transfereeExten; + + private String extension; + private String isexternal; + private String result; + + public BlindTransferEvent(Object source) { super(source); } + + public String getTransfererUniqueId() { + return transfererUniqueId; + } + + public void setTransfererUniqueId(String transfererUniqueId) { + this.transfererUniqueId = transfererUniqueId; + } + + public String getTransfererConnectedLineNum() { + return transfererConnectedLineNum; + } + + public void setTransfererConnectedLineNum(String transfererConnectedLineNum) { + this.transfererConnectedLineNum = transfererConnectedLineNum; + } + + public String getTransfererConnectedLineName() { + return transfererConnectedLineName; + } + + public void setTransfererConnectedLineName(String transfererConnectedLineName) { + this.transfererConnectedLineName = transfererConnectedLineName; + } + + public String getTransfererCallerIdName() { + return transfererCallerIdName; + } + + public void setTransfererCallerIdName(String transfererCallerIdName) { + this.transfererCallerIdName = transfererCallerIdName; + } + + public String getTransfererCallerIdNum() { + return transfererCallerIdNum; + } + + public void setTransfererCallerIdNum(String transfererCallerIdNum) { + this.transfererCallerIdNum = transfererCallerIdNum; + } + + public String getTransfererChannel() { + return transfererChannel; + } + + public void setTransfererChannel(String transfererChannel) { + this.transfererChannel = transfererChannel; + } + + public String getTransfererChannelState() { + return transfererChannelState; + } + + public void setTransfererChannelState(String transfererChannelState) { + this.transfererChannelState = transfererChannelState; + } + + public String getTransfererChannelStateDesc() { + return transfererChannelStateDesc; + } + + public void setTransfererChannelStateDesc(String transfererChannelStateDesc) { + this.transfererChannelStateDesc = transfererChannelStateDesc; + } + + public Integer getTransfererPriority() { + return transfererPriority; + } + + public void setTransfererPriority(Integer transfererPriority) { + this.transfererPriority = transfererPriority; + } + + public String getTransfererContext() { + return transfererContext; + } + + public void setTransfererContext(String transfererContext) { + this.transfererContext = transfererContext; + } + + public String getTransfereeUniqueId() { + return transfereeUniqueId; + } + + public void setTransfereeUniqueId(String transfereeUniqueId) { + this.transfereeUniqueId = transfereeUniqueId; + } + + public String getTransfereeConnectedLineNum() { + return transfereeConnectedLineNum; + } + + public void setTransfereeConnectedLineNum(String transfereeConnectedLineNum) { + this.transfereeConnectedLineNum = transfereeConnectedLineNum; + } + + public String getTransfereeConnectedLineName() { + return transfereeConnectedLineName; + } + + public void setTransfereeConnectedLineName(String transfereeConnectedLineName) { + this.transfereeConnectedLineName = transfereeConnectedLineName; + } + + public String getTransfereeCallerIdName() { + return transfereeCallerIdName; + } + + public void setTransfereeCallerIdName(String transfereeCallerIdName) { + this.transfereeCallerIdName = transfereeCallerIdName; + } + + public String getTransfereeCallerIdNum() { + return transfereeCallerIdNum; + } + + public void setTransfereeCallerIdNum(String transfereeCallerIdNum) { + this.transfereeCallerIdNum = transfereeCallerIdNum; + } + + public String getTransfereeChannel() { + return transfereeChannel; + } + + public void setTransfereeChannel(String transfereeChannel) { + this.transfereeChannel = transfereeChannel; + } + + public String getTransfereeChannelState() { + return transfereeChannelState; + } + + public void setTransfereeChannelState(String transfereeChannelState) { + this.transfereeChannelState = transfereeChannelState; + } + + public String getTransfereeChannelStateDesc() { + return transfereeChannelStateDesc; + } + + public void setTransfereeChannelStateDesc(String transfereeChannelStateDesc) { + this.transfereeChannelStateDesc = transfereeChannelStateDesc; + } + + public Integer getTransfereePriority() { + return transfereePriority; + } + + public void setTransfereePriority(Integer transfereePriority) { + this.transfereePriority = transfereePriority; + } + + public String getTransfereeContext() { + return transfereeContext; + } + + public void setTransfereeContext(String transfereeContext) { + this.transfereeContext = transfereeContext; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + + public String getIsexternal() { + return isexternal; + } + + public void setIsexternal(String isexternal) { + this.isexternal = isexternal; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } + + public String getTransfereeExten() { + return transfereeExten; + } + + public void setTransfereeExten(String transfereeExten) { + this.transfereeExten = transfereeExten; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java new file mode 100644 index 000000000..8d892dac1 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BridgeCreateEvent extends AbstractBridgeEvent { + public BridgeCreateEvent(Object source) { super(source); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java new file mode 100644 index 000000000..70801f09f --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BridgeDestroyEvent extends AbstractBridgeEvent { + public BridgeDestroyEvent(Object source) { super(source); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java new file mode 100644 index 000000000..3bee8445f --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java @@ -0,0 +1,27 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BridgeEnterEvent extends AbstractBridgeEvent { + private String uniqueId; + private String channel; + + public BridgeEnterEvent(Object source) { super(source); } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java new file mode 100644 index 000000000..ced2f6759 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java @@ -0,0 +1,27 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class BridgeLeaveEvent extends AbstractBridgeEvent { + private String uniqueId; + private String channel; + + public BridgeLeaveEvent(Object source) { super(source); } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java b/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java new file mode 100644 index 000000000..df8a87f2e --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java @@ -0,0 +1,90 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class ChallengeSentEvent extends ManagerEvent { + private String severity; + private Integer eventVersion; + private String accountId; + private String service; + private String eventtv; + private String remoteAddress; + private String localAddress; + private String challenge; + private String sessionId; + + public ChallengeSentEvent(Object source) { super(source); } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public Integer getEventVersion() { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) { + this.eventVersion = eventVersion; + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public String getEventtv() { + return eventtv; + } + + public void setEventtv(String eventtv) { + this.eventtv = eventtv; + } + + public String getRemoteAddress() { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) { + this.remoteAddress = remoteAddress; + } + + public String getLocalAddress() { + return localAddress; + } + + public void setLocalAddress(String localAddress) { + this.localAddress = localAddress; + } + + public String getChallenge() { + return challenge; + } + + public void setChallenge(String challenge) { + this.challenge = challenge; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java index 531123167..8ff935cad 100644 --- a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java @@ -35,8 +35,6 @@ public class CoreShowChannelEvent extends ResponseEvent private String channel; private String context; private String extension; - private String priority; - private String ChannelState; private String channelstatedesc; private String application; private String applicationdata; @@ -57,15 +55,6 @@ public CoreShowChannelEvent(Object source) * @return channel state */ - public String getChannelState() - { - return ChannelState; - } - - public void setChannelState(String ChannelState) - { - this.ChannelState = ChannelState; - } /** * Returns the Account code @@ -238,15 +227,7 @@ public void setExtension(String extension) * * @return priority */ - public String getPriority() - { - return priority; - } - public void setPriority(String priority) - { - this.priority = priority; - } /** * Returns the Uniqueid diff --git a/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java b/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java new file mode 100644 index 000000000..639b8fd60 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java @@ -0,0 +1,24 @@ +package org.asteriskjava.manager.event; + +public class DeviceStateChangeEvent extends ManagerEvent { + private String state; + private String device; + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + public String getDevice() { + return device; + } + + public void setDevice(String device) { + this.device = device; + } + + public DeviceStateChangeEvent(Object source) { super(source); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java new file mode 100644 index 000000000..e3b73b921 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -0,0 +1,5 @@ +package org.asteriskjava.manager.event; + +public class DialBeginEvent extends DialEvent { + public DialBeginEvent(Object source) { super(source); setSubEvent(SUBEVENT_BEGIN); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java new file mode 100644 index 000000000..eaed97380 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java @@ -0,0 +1,5 @@ +package org.asteriskjava.manager.event; + +public class DialEndEvent extends DialEvent { + public DialEndEvent(Object source) { super(source); setSubEvent(SUBEVENT_END); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DialEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEvent.java index c4609f7cd..155bd7b28 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEvent.java @@ -60,6 +60,25 @@ public class DialEvent extends ManagerEvent */ private String destination; + /** + * Destination channel state + */ + private Integer destChannelState; + private String destChannelStateDesc; + + private String destContext; + + private Integer destPriority; + + private String destExten; + + private String destConnectedLineName; + private String destConnectedLineNum; + + private String destCallerIdName; + private String destCallerIdNum; + + /** * The new Caller*ID. */ @@ -162,6 +181,7 @@ public String getDestination() { return destination; } + public String getDestChannel() { return getDestination(); } /** * Sets the name of the destination channel. @@ -172,7 +192,7 @@ public void setDestination(String destination) { this.destination = destination; } - + public void setDestChannel(String destination) { setDestination(destination); } /** * Returns the the Caller*ID Number. * @@ -378,4 +398,76 @@ public void setConnectedlinenum(String connectedlinenum) { this.connectedlinenum = connectedlinenum; } + + public Integer getDestChannelState() { + return destChannelState; + } + + public void setDestChannelState(Integer destChannelState) { + this.destChannelState = destChannelState; + } + + public String getDestContext() { + return destContext; + } + + public void setDestContext(String destContext) { + this.destContext = destContext; + } + + public Integer getDestPriority() { + return destPriority; + } + + public void setDestPriority(Integer destPriority) { + this.destPriority = destPriority; + } + + public String getDestChannelStateDesc() { + return destChannelStateDesc; + } + + public void setDestChannelStateDesc(String destChannelStateDesc) { + this.destChannelStateDesc = destChannelStateDesc; + } + + public String getDestExten() { + return destExten; + } + + public void setDestExten(String destExten) { + this.destExten = destExten; + } + + public String getDestConnectedLineName() { + return destConnectedLineName; + } + + public void setDestConnectedLineName(String destConnectedLineName) { + this.destConnectedLineName = destConnectedLineName; + } + + public String getDestConnectedLineNum() { + return destConnectedLineNum; + } + + public void setDestConnectedLineNum(String destConnectedLineNum) { + this.destConnectedLineNum = destConnectedLineNum; + } + + public String getDestCallerIdName() { + return destCallerIdName; + } + + public void setDestCallerIdName(String destCallerIdName) { + this.destCallerIdName = destCallerIdName; + } + + public String getDestCallerIdNum() { + return destCallerIdNum; + } + + public void setDestCallerIdNum(String destCallerIdNum) { + this.destCallerIdNum = destCallerIdNum; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java new file mode 100644 index 000000000..f826e16f0 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class DtmfBeginEvent extends DtmfEvent { + public DtmfBeginEvent(Object source) { super(source); setBegin(true); setEnd(false); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java new file mode 100644 index 000000000..d07ab7017 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java @@ -0,0 +1,17 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class DtmfEndEvent extends DtmfEvent { + private Integer durationMs; + public DtmfEndEvent(Object source) { super(source); setBegin(false); setEnd(true); } + + public Integer getDurationMs() { + return durationMs; + } + + public void setDurationMs(Integer durationMs) { + this.durationMs = durationMs; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java new file mode 100644 index 000000000..deeed3271 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java @@ -0,0 +1,110 @@ +package org.asteriskjava.manager.event; + +import java.math.BigInteger; + +/** + * Created by Alexander Polakov on 1/23/15. + */ +public class InvalidPasswordEvent extends ManagerEvent { + private String severity; + private Integer eventVersion; + private String eventtv; + private String sessionid; + private String receivedHash; + private String localaddress; + private BigInteger accountId; + private String receivedChallenge; + private String service; + private String remoteAddress; + private String challenge; + + public InvalidPasswordEvent(Object source) { super(source); } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public Integer getEventVersion() { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) { + this.eventVersion = eventVersion; + } + + public String getEventtv() { + return eventtv; + } + + public void setEventtv(String eventtv) { + this.eventtv = eventtv; + } + + public String getSessionid() { + return sessionid; + } + + public void setSessionid(String sessionid) { + this.sessionid = sessionid; + } + + public String getReceivedHash() { + return receivedHash; + } + + public void setReceivedHash(String receivedHash) { + this.receivedHash = receivedHash; + } + + public String getLocaladdress() { + return localaddress; + } + + public void setLocaladdress(String localaddress) { + this.localaddress = localaddress; + } + + public BigInteger getAccountId() { + return accountId; + } + + public void setAccountId(BigInteger accountId) { + this.accountId = accountId; + } + + public String getReceivedChallenge() { + return receivedChallenge; + } + + public void setReceivedChallenge(String receivedChallenge) { + this.receivedChallenge = receivedChallenge; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public String getRemoteAddress() { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) { + this.remoteAddress = remoteAddress; + } + + public String getChallenge() { + return challenge; + } + + public void setChallenge(String challenge) { + this.challenge = challenge; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java index c2e3565e9..9b1e2118b 100644 --- a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java @@ -40,6 +40,95 @@ public abstract class ManagerEvent extends EventObject * Serializable version identifier. */ static final long serialVersionUID = 2L; + protected String connectedLineNum; + protected String connectedLineName; + protected Integer priority; + protected Integer channelState; + protected String channelStateDesc; + protected String exten; + protected String callerIdNum; + protected String callerIdName; + + /** + * Returns the Caller ID name of the caller's channel. + * + * @return the Caller ID name of the caller's channel or "unknown" if none has been set. + * @since 0.2 + */ + + public String getCallerIdName() { + return callerIdName; + } + + public void setCallerIdName(String callerIdName) { + this.callerIdName = callerIdName; + } + + public String getConnectedLineNum() { + return connectedLineNum; + } + + public void setConnectedLineNum(String connectedLineNum) { + this.connectedLineNum = connectedLineNum; + } + + public String getConnectedLineName() { + return connectedLineName; + } + + public void setConnectedLineName(String connectedLineName) { + this.connectedLineName = connectedLineName; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public Integer getChannelState() { + return channelState; + } + + public void setChannelState(Integer channelState) { + this.channelState = channelState; + } + + public String getChannelStateDesc() { + return channelStateDesc; + } + + public void setChannelStateDesc(String channelStateDesc) { + this.channelStateDesc = channelStateDesc; + } + + public String getExten() { + return exten; + } + + public void setExten(String exten) { + this.exten = exten; + } + + public String getCallerIdNum() { + return callerIdNum; + } + + public void setCallerIdNum(String callerIdNum) { + this.callerIdNum = callerIdNum; + } + + public String getContext() { + return context; + } + + public void setContext(String context) { + this.context = context; + } + + protected String context; /** * AMI authorization class. diff --git a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java new file mode 100644 index 000000000..79c896e16 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class MusicOnHoldStartEvent extends MusicOnHoldEvent { + public MusicOnHoldStartEvent(Object source) { super(source); setState(STATE_START); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java new file mode 100644 index 000000000..4f7030114 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java @@ -0,0 +1,8 @@ +package org.asteriskjava.manager.event; + +/** + * Created by Alexander Polakov on 1/26/15. + */ +public class MusicOnHoldStopEvent extends MusicOnHoldEvent { + public MusicOnHoldStopEvent(Object source) { super(source); setState(STATE_STOP); } +} diff --git a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java index 37892fe50..f974c2d04 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java @@ -33,6 +33,7 @@ public class NewChannelEvent extends AbstractChannelStateEvent private String accountCode; private String context; private String exten; + private Integer priority; public NewChannelEvent(Object source) { @@ -107,4 +108,20 @@ public void setExten(String exten) { this.exten = exten; } + + /** + * Returns the priority. + */ + public Integer getPriority() + { + return priority; + } + + /** + * Sets the priority. + */ + public void setPriority(Integer priority) + { + this.priority = priority; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java b/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java new file mode 100644 index 000000000..6dd94a5b8 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java @@ -0,0 +1,27 @@ +package org.asteriskjava.manager.event; + +/** + * Created by plhk on 1/15/15. + */ +public class NewConnectedLineEvent extends ManagerEvent { + private String channel; + private String uniqueId; + + public NewConnectedLineEvent(Object source) { super(source); } + + public String getChannel() { + return channel; + } + + public void setChannel(String channel) { + this.channel = channel; + } + + public String getUniqueId() { + return uniqueId; + } + + public void setUniqueId(String uniqueId) { + this.uniqueId = uniqueId; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java new file mode 100644 index 000000000..86c46304f --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java @@ -0,0 +1,101 @@ +package org.asteriskjava.manager.event; + +import java.util.Date; + +/** + * Created by plhk on 1/15/15. + */ +public class SuccessfulAuthEvent extends ManagerEvent { + private String severity; + private Integer eventVersion; + private String accountId; + private Integer usingPassword; + private String sessiontv; + private String service; + private String eventtv; + private String remoteAddress; + private String localAddress; + private String sessionId; + + public SuccessfulAuthEvent(Object source) { super(source); } + + public String getSeverity() { + return severity; + } + + public void setSeverity(String severity) { + this.severity = severity; + } + + public Integer getEventVersion() { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) { + this.eventVersion = eventVersion; + } + + public String getAccountId() { + return accountId; + } + + public void setAccountId(String accountId) { + this.accountId = accountId; + } + + public Integer getUsingPassword() { + return usingPassword; + } + + public void setUsingPassword(Integer usingPassword) { + this.usingPassword = usingPassword; + } + + public String getSessiontv() { + return sessiontv; + } + + public void setSessiontv(String sessiontv) { + this.sessiontv = sessiontv; + } + + public String getService() { + return service; + } + + public void setService(String service) { + this.service = service; + } + + public String getEventtv() { + return eventtv; + } + + public void setEventtv(String eventtv) { + this.eventtv = eventtv; + } + + public String getRemoteAddress() { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) { + this.remoteAddress = remoteAddress; + } + + public String getLocalAddress() { + return localAddress; + } + + public void setLocalAddress(String localAddress) { + this.localAddress = localAddress; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java index 25de29fbc..608a1c851 100644 --- a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java @@ -33,6 +33,79 @@ public class VarSetEvent extends ManagerEvent private String uniqueId; private String variable; private String value; + private String callerIdName; + + public String getConnectedLineName() { + return connectedLineName; + } + + public void setConnectedLineName(String connectedLineName) { + this.connectedLineName = connectedLineName; + } + + public String getChannelStateDesc() { + return channelStateDesc; + } + + public void setChannelStateDesc(String channelStateDesc) { + this.channelStateDesc = channelStateDesc; + } + + public Integer getPriority() { + return priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + + public String getExten() { + return exten; + } + + public void setExten(String exten) { + this.exten = exten; + } + + public String getCallerIdName() { + return callerIdName; + } + + public void setCallerIdName(String callerIdName) { + this.callerIdName = callerIdName; + } + + public String getConnectedLineNum() { + return connectedLineNum; + } + + public void setConnectedLineNum(String connectedLineName) { + this.connectedLineNum = connectedLineName; + } + + public Integer getChannelState() { + return channelState; + } + + public void setChannelState(Integer channelState) { + this.channelState = channelState; + } + + public String getCallerIdNum() { + return callerIdNum; + } + + public void setCallerIdNum(String callerIdNum) { + this.callerIdNum = callerIdNum; + } + + public String getContext() { + return context; + } + + public void setContext(String context) { + this.context = context; + } public VarSetEvent(Object source) { diff --git a/src/main/java/org/asteriskjava/manager/internal/.gitignore b/src/main/java/org/asteriskjava/manager/internal/.gitignore new file mode 100644 index 000000000..f04e334d4 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/internal/.gitignore @@ -0,0 +1,20 @@ +/AbstractBuilder.class +/ActionBuilder.class +/ActionBuilderImpl.class +/Dispatcher.class +/EventBuilder.class +/EventBuilderImpl.class +/ManagerConnectionImpl$1.class +/ManagerConnectionImpl$DefaultSendActionCallback.class +/ManagerConnectionImpl$ProtocolIdentifierWrapper.class +/ManagerConnectionImpl$ResponseEventHandler.class +/ManagerConnectionImpl$ResponseHandlerResult.class +/ManagerConnectionImpl.class +/ManagerReader.class +/ManagerReaderImpl.class +/ManagerUtil.class +/ManagerWriter.class +/ManagerWriterImpl.class +/ResponseBuilder.class +/ResponseBuilderImpl.class +/ResponseEventsImpl.class diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 62e425f30..0b1d87888 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -183,7 +183,27 @@ private void registerBuiltinEventClasses() registerEventClass(VoicemailUserEntryEvent.class); registerEventClass(ZapShowChannelsEvent.class); registerEventClass(ZapShowChannelsCompleteEvent.class); - + registerEventClass(AsyncAgiStartEvent.class); + registerEventClass(AsyncAgiExecEvent.class); + registerEventClass(AsyncAgiEndEvent.class); + registerEventClass(DeviceStateChangeEvent.class); + registerEventClass(SuccessfulAuthEvent.class); + registerEventClass(ChallengeSentEvent.class); + registerEventClass(AgiExecEndEvent.class); + registerEventClass(AgiExecStartEvent.class); + registerEventClass(DialBeginEvent.class); + registerEventClass(DialEndEvent.class); + registerEventClass(NewConnectedLineEvent.class); + registerEventClass(InvalidPasswordEvent.class); + registerEventClass(BridgeCreateEvent.class); + registerEventClass(BridgeDestroyEvent.class); + registerEventClass(BridgeEnterEvent.class); + registerEventClass(BridgeLeaveEvent.class); + registerEventClass(BlindTransferEvent.class); + registerEventClass(MusicOnHoldStartEvent.class); + registerEventClass(MusicOnHoldStopEvent.class); + registerEventClass(DtmfBeginEvent.class); + registerEventClass(DtmfEndEvent.class); } public final void registerEventClass(Class clazz) throws IllegalArgumentException diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 0c1175020..f02d3f3f2 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -82,6 +82,8 @@ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.8[-. ].*"); private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); + private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?12[-. ].*"); + private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?13[-. ].*"); private static final AtomicLong idCounter = new AtomicLong(0); @@ -673,6 +675,14 @@ else if (VERSION_PATTERN_11.matcher(coreLine).matches()) { return AsteriskVersion.ASTERISK_11; } + else if (VERSION_PATTERN_12.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_12; + } + else if (VERSION_PATTERN_13.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_13; + } } } @@ -1312,6 +1322,7 @@ private void setProtocolIdentifier(final String identifier) && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk 1.6 && !"Asterisk Call Manager/1.2".equals(identifier) // bri stuffed && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk 11 + && !"Asterisk Call Manager/2.6.0".equals(identifier) // Asterisk 13 && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) diff --git a/src/main/java/org/asteriskjava/manager/response/.gitignore b/src/main/java/org/asteriskjava/manager/response/.gitignore new file mode 100644 index 000000000..4b0f455d7 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/response/.gitignore @@ -0,0 +1,16 @@ +/ChallengeResponse.class +/CommandResponse.class +/CoreSettingsResponse.class +/CoreStatusResponse.class +/ExtensionStateResponse.class +/GetConfigResponse.class +/GetVarResponse.class +/MailboxCountResponse.class +/MailboxStatusResponse.class +/ManagerError.class +/ManagerResponse.class +/ModuleCheckResponse.class +/PingResponse.class +/SipShowPeerResponse.class +/SkypeBuddyResponse.class +/SkypeLicenseStatusResponse.class diff --git a/src/main/java/org/asteriskjava/tools/.gitignore b/src/main/java/org/asteriskjava/tools/.gitignore new file mode 100644 index 000000000..03106de55 --- /dev/null +++ b/src/main/java/org/asteriskjava/tools/.gitignore @@ -0,0 +1,2 @@ +/HtmlEventTracer$1.class +/HtmlEventTracer.class diff --git a/src/main/java/org/asteriskjava/util/.gitignore b/src/main/java/org/asteriskjava/util/.gitignore new file mode 100644 index 000000000..844729c85 --- /dev/null +++ b/src/main/java/org/asteriskjava/util/.gitignore @@ -0,0 +1,11 @@ +/AstState.class +/AstUtil.class +/Base64.class +/DaemonThreadFactory.class +/DateUtil.class +/Log.class +/LogFactory.class +/MixMonitorDirection.class +/ReflectionUtil.class +/ServerSocketFacade.class +/SocketConnectionFacade.class diff --git a/src/main/java/org/asteriskjava/util/internal/.gitignore b/src/main/java/org/asteriskjava/util/internal/.gitignore new file mode 100644 index 000000000..7c5754050 --- /dev/null +++ b/src/main/java/org/asteriskjava/util/internal/.gitignore @@ -0,0 +1,8 @@ +/FileTrace.class +/JavaLoggingLog.class +/Log4JLogger.class +/NullLog.class +/ServerSocketFacadeImpl.class +/Slf4JLogger.class +/SocketConnectionFacadeImpl.class +/Trace.class From b5c3c763c2b95ede11a7178873268b70e49f5c68 Mon Sep 17 00:00:00 2001 From: kantv Date: Mon, 2 Mar 2015 20:15:35 +0300 Subject: [PATCH 0076/1055] add files to gitignore --- .../org/asteriskjava/manager/event/.gitignore | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/.gitignore b/src/main/java/org/asteriskjava/manager/event/.gitignore index 3a9df767c..6a5c01812 100644 --- a/src/main/java/org/asteriskjava/manager/event/.gitignore +++ b/src/main/java/org/asteriskjava/manager/event/.gitignore @@ -154,3 +154,25 @@ /VoicemailUserEntryEvent.class /ZapShowChannelsCompleteEvent.class /ZapShowChannelsEvent.class +/AbstractBridgeEvent.class +/AgiExecEndEvent.class +/AgiExecStartEvent.class +/AsyncAgiEndEvent.class +/AsyncAgiExecEvent.class +/AsyncAgiStartEvent.class +/BlindTransferEvent.class +/BridgeCreateEvent.class +/BridgeDestroyEvent.class +/BridgeEnterEvent.class +/BridgeLeaveEvent.class +/ChallengeSentEvent.class +/DeviceStateChangeEvent.class +/DialBeginEvent.class +/DialEndEvent.class +/DtmfBeginEvent.class +/DtmfEndEvent.class +/InvalidPasswordEvent.class +/MusicOnHoldStartEvent.class +/MusicOnHoldStopEvent.class +/NewConnectedLineEvent.class +/SuccessfulAuthEvent.class From 03518bb26a7034d875b64655e0a8ebb45a4e4f4a Mon Sep 17 00:00:00 2001 From: kantv Date: Tue, 3 Mar 2015 16:42:22 +0300 Subject: [PATCH 0077/1055] added field "language" to AMI events --- .../java/org/asteriskjava/manager/.gitignore | 1 + .../manager/event/BridgeEnterEvent.java | 9 ++ .../manager/event/BridgeLeaveEvent.java | 11 ++ .../event/ChallengeResponseFailedEvent.java | 102 ++++++++++++++++++ .../manager/event/DialBeginEvent.java | 24 +++++ .../manager/event/DialEndEvent.java | 23 ++++ .../manager/event/HangupEvent.java | 11 ++ .../manager/event/HangupRequestEvent.java | 10 ++ .../manager/event/NewCallerIdEvent.java | 11 ++ .../manager/event/NewChannelEvent.java | 11 ++ .../manager/event/NewConnectedLineEvent.java | 11 +- .../manager/event/NewExtenEvent.java | 11 ++ .../manager/event/NewStateEvent.java | 12 ++- .../manager/event/SoftHangupRequestEvent.java | 12 +++ .../manager/event/VarSetEvent.java | 11 +- .../internal/ManagerConnectionImpl.java | 1 + 16 files changed, 268 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java diff --git a/src/main/java/org/asteriskjava/manager/.gitignore b/src/main/java/org/asteriskjava/manager/.gitignore index c376693eb..3ffd5d977 100644 --- a/src/main/java/org/asteriskjava/manager/.gitignore +++ b/src/main/java/org/asteriskjava/manager/.gitignore @@ -14,3 +14,4 @@ /ResponseEvents.class /SendActionCallback.class /TimeoutException.class +/NetAddress.class diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java index 3bee8445f..4bf78e7e6 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java @@ -6,9 +6,18 @@ public class BridgeEnterEvent extends AbstractBridgeEvent { private String uniqueId; private String channel; + private String language; public BridgeEnterEvent(Object source) { super(source); } + public String getLanguage() { + return language; + } + + public void setLanguage(String language) { + this.language = language; + } + public String getChannel() { return channel; } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java index ced2f6759..e2cc653de 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java @@ -6,8 +6,19 @@ public class BridgeLeaveEvent extends AbstractBridgeEvent { private String uniqueId; private String channel; + private String language; public BridgeLeaveEvent(Object source) { super(source); } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } public String getUniqueId() { return uniqueId; diff --git a/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java b/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java new file mode 100644 index 000000000..2dc514dac --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java @@ -0,0 +1,102 @@ +package org.asteriskjava.manager.event; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +public class ChallengeResponseFailedEvent extends ManagerEvent +{ + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 1L; + + private String severity; + private String eventversion; + private String service; + private String remoteaddress; + private String localaddress; + private org.asteriskjava.NetAddress netRemoteAddress; + private org.asteriskjava.NetAddress netLocalAddress; + + /** + * @param source + */ + public ChallengeResponseFailedEvent(Object source) { + super(source); + } + + public org.asteriskjava.NetAddress getNetLocalAddress() + { + return this.netLocalAddress; + } + public org.asteriskjava.NetAddress getNetRemoteAddress() + { + return this.netRemoteAddress; + } + + public String getSeverity() + { + return severity; + } + public void setSeverity(String severity) + { + this.severity = severity; + } + + public String getEventversion() + { + return eventversion; + } + public void setEventversion(String eventversion) + { + this.eventversion = eventversion; + } + + + public String getService() + { + return service; + } + public void setService(String service) + { + this.service = service; + } + + public String getRemoteAddress() + { + return remoteaddress; + } + public void setRemoteAddress(String remoteaddress) + { + this.remoteaddress = remoteaddress; + this.netRemoteAddress = new org.asteriskjava.NetAddress(remoteaddress); + } + + public String getLocalAddress() + { + return localaddress; + } + public void setLocalAddress(String localaddress) + { + this.localaddress = localaddress; + this.netLocalAddress = new org.asteriskjava.NetAddress(localaddress); + } + + public void setEventtv(String eventv) + { + DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.ENGLISH); + Long t = 0L; + try + { + Date date = format.parse(eventv); + t = date.getTime(); + } + catch (ParseException ex){} + finally + { + this.setTimestamp(t.doubleValue()); + } + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java index e3b73b921..535d46872 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -1,5 +1,29 @@ package org.asteriskjava.manager.event; public class DialBeginEvent extends DialEvent { + + private String language; + private String destlanguage; + public DialBeginEvent(Object source) { super(source); setSubEvent(SUBEVENT_BEGIN); } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + public String getDestLanguage() + { + return destlanguage; + } + + public void setDestLanguage(String destlanguage) + { + this.destlanguage = destlanguage; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java index eaed97380..69fbd89f7 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java @@ -1,5 +1,28 @@ package org.asteriskjava.manager.event; public class DialEndEvent extends DialEvent { + private String language; + private String destlanguage; + public DialEndEvent(Object source) { super(source); setSubEvent(SUBEVENT_END); } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + public String getDestLanguage() + { + return destlanguage; + } + + public void setDestLanguage(String destlanguage) + { + this.destlanguage = destlanguage; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/HangupEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupEvent.java index fb1248e86..0a81a7b3f 100644 --- a/src/main/java/org/asteriskjava/manager/event/HangupEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HangupEvent.java @@ -34,12 +34,23 @@ public class HangupEvent extends AbstractChannelEvent private String causeTxt; private String connectedlinename; private String connectedlinenum; + private String language; public HangupEvent(Object source) { super(source); } + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + /** * Returns the cause of the hangup. * diff --git a/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java index 3cf3a3daf..9feb48f90 100644 --- a/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java @@ -29,7 +29,17 @@ public class HangupRequestEvent extends AbstractChannelEvent private String uniqueid; + private String language; + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } public HangupRequestEvent(Object source) { diff --git a/src/main/java/org/asteriskjava/manager/event/NewCallerIdEvent.java b/src/main/java/org/asteriskjava/manager/event/NewCallerIdEvent.java index 3fe85e7ad..211b348cb 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewCallerIdEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewCallerIdEvent.java @@ -36,12 +36,23 @@ public class NewCallerIdEvent extends AbstractChannelEvent */ private Integer cidCallingPres; private String cidCallingPresTxt; + private String language; public NewCallerIdEvent(Object source) { super(source); } + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + /** * Returns the CallerId presentation/screening. * diff --git a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java index f974c2d04..180997537 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java @@ -34,12 +34,23 @@ public class NewChannelEvent extends AbstractChannelStateEvent private String context; private String exten; private Integer priority; + private String language; public NewChannelEvent(Object source) { super(source); } + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + /** * Returns the account code of the new channel.

* This property is available since Asterisk 1.6. diff --git a/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java b/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java index 6dd94a5b8..104640b34 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java @@ -6,9 +6,18 @@ public class NewConnectedLineEvent extends ManagerEvent { private String channel; private String uniqueId; + private String language; public NewConnectedLineEvent(Object source) { super(source); } - + + public String getLanguage(){ + return language; + } + + public void setLanguage(String language){ + this.language = language; + } + public String getChannel() { return channel; } diff --git a/src/main/java/org/asteriskjava/manager/event/NewExtenEvent.java b/src/main/java/org/asteriskjava/manager/event/NewExtenEvent.java index f51996684..5bd9e9ca8 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewExtenEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewExtenEvent.java @@ -37,6 +37,7 @@ public class NewExtenEvent extends ManagerEvent private String appData; private Integer priority; private String channel; + private String language; /** * @param source @@ -46,6 +47,16 @@ public NewExtenEvent(Object source) super(source); } + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + /** * Returns the unique id of the channel. */ diff --git a/src/main/java/org/asteriskjava/manager/event/NewStateEvent.java b/src/main/java/org/asteriskjava/manager/event/NewStateEvent.java index ee73ad528..7a08bd88f 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewStateEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewStateEvent.java @@ -29,10 +29,20 @@ public class NewStateEvent extends AbstractChannelStateEvent * Serializable version identifier. */ static final long serialVersionUID = -0L; + private String language; public NewStateEvent(Object source) { super(source); } - + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/SoftHangupRequestEvent.java b/src/main/java/org/asteriskjava/manager/event/SoftHangupRequestEvent.java index 0af16ccbb..e7552a046 100644 --- a/src/main/java/org/asteriskjava/manager/event/SoftHangupRequestEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SoftHangupRequestEvent.java @@ -29,12 +29,24 @@ public class SoftHangupRequestEvent extends AbstractChannelEvent private Integer cause; private String uniqueid; + private String language; public SoftHangupRequestEvent(Object source) { super(source); } + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + /** * Returns the cause of the hangup. * diff --git a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java index 608a1c851..b553e55a5 100644 --- a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java @@ -34,7 +34,16 @@ public class VarSetEvent extends ManagerEvent private String variable; private String value; private String callerIdName; - + private String language; + + public String getLanguage(){ + return language; + } + + public void setLanguage(String language){ + this.language = language; + } + public String getConnectedLineName() { return connectedLineName; } diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index f02d3f3f2..588369f70 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -1323,6 +1323,7 @@ private void setProtocolIdentifier(final String identifier) && !"Asterisk Call Manager/1.2".equals(identifier) // bri stuffed && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk 11 && !"Asterisk Call Manager/2.6.0".equals(identifier) // Asterisk 13 + && !"Asterisk Call Manager/2.7.0".equals(identifier) // Asterisk 13.2 && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) From 222fc7264fb7115a56c8115844958ae74d031c07 Mon Sep 17 00:00:00 2001 From: kantv Date: Tue, 3 Mar 2015 16:51:08 +0300 Subject: [PATCH 0078/1055] removed my unneeded class NetAddress --- .../java/org/asteriskjava/manager/event/.gitignore | 1 + .../manager/event/ChallengeResponseFailedEvent.java | 13 ------------- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/.gitignore b/src/main/java/org/asteriskjava/manager/event/.gitignore index 6a5c01812..b1180ee41 100644 --- a/src/main/java/org/asteriskjava/manager/event/.gitignore +++ b/src/main/java/org/asteriskjava/manager/event/.gitignore @@ -176,3 +176,4 @@ /MusicOnHoldStopEvent.class /NewConnectedLineEvent.class /SuccessfulAuthEvent.class +/ChallengeResponseFailedEvent.class diff --git a/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java b/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java index 2dc514dac..96e13050a 100644 --- a/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ChallengeResponseFailedEvent.java @@ -17,8 +17,6 @@ public class ChallengeResponseFailedEvent extends ManagerEvent private String service; private String remoteaddress; private String localaddress; - private org.asteriskjava.NetAddress netRemoteAddress; - private org.asteriskjava.NetAddress netLocalAddress; /** * @param source @@ -27,15 +25,6 @@ public ChallengeResponseFailedEvent(Object source) { super(source); } - public org.asteriskjava.NetAddress getNetLocalAddress() - { - return this.netLocalAddress; - } - public org.asteriskjava.NetAddress getNetRemoteAddress() - { - return this.netRemoteAddress; - } - public String getSeverity() { return severity; @@ -71,7 +60,6 @@ public String getRemoteAddress() public void setRemoteAddress(String remoteaddress) { this.remoteaddress = remoteaddress; - this.netRemoteAddress = new org.asteriskjava.NetAddress(remoteaddress); } public String getLocalAddress() @@ -81,7 +69,6 @@ public String getLocalAddress() public void setLocalAddress(String localaddress) { this.localaddress = localaddress; - this.netLocalAddress = new org.asteriskjava.NetAddress(localaddress); } public void setEventtv(String eventv) From ee508dd24e860789c4978099f19d0f797135de93 Mon Sep 17 00:00:00 2001 From: Danilo Rocha Valente Date: Mon, 9 Mar 2015 18:20:11 -0300 Subject: [PATCH 0079/1055] New SMS event registered --- .../manager/event/AntennaLevelEvent.java | 24 +++++++++++++++++++ .../manager/internal/EventBuilderImpl.java | 1 + .../asteriskjava/tools/HtmlEventTracer.java | 5 ++++ 3 files changed, 30 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/AntennaLevelEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AntennaLevelEvent.java b/src/main/java/org/asteriskjava/manager/event/AntennaLevelEvent.java new file mode 100644 index 000000000..bdf91332c --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AntennaLevelEvent.java @@ -0,0 +1,24 @@ +package org.asteriskjava.manager.event; + +public class AntennaLevelEvent extends AbstractChannelEvent { + + /** + * + */ + private static final long serialVersionUID = 7687745700915865011L; + + private String signal; + + public AntennaLevelEvent(Object source) { + super(source); + } + + public String getSignal() { + return signal; + } + + public void setSignal(String signal) { + this.signal = signal; + } + +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 62e425f30..70eefd088 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -183,6 +183,7 @@ private void registerBuiltinEventClasses() registerEventClass(VoicemailUserEntryEvent.class); registerEventClass(ZapShowChannelsEvent.class); registerEventClass(ZapShowChannelsCompleteEvent.class); + registerEventClass(AntennaLevelEvent.class); } diff --git a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java index 875411246..093bae473 100644 --- a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java +++ b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java @@ -249,6 +249,11 @@ else if (event instanceof HangupEvent) format = "%s
%s (%s)"; properties = new String[]{"channel", "cause", "causeTxt"}; } + else if (event instanceof AntennaLevelEvent) + { + format = "%s"; + properties = new String[]{"signal"}; + } } if (event instanceof BridgeEvent) From ac45c12257aa0d6233f9bfd0617ed0d1fb2f7eec Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Wed, 8 Apr 2015 06:52:54 +1000 Subject: [PATCH 0080/1055] Set version no. to 1.0.0 --- pom.xml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 4efbd5d23..cfd6d3574 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.asteriskjava asterisk-java Asterisk-Java - 1.0.0.CI-SNAPSHOT + 1.0.0 The free Java library for Asterisk PBX integration. 2004 @@ -33,6 +33,13 @@ Bureau of Economic and Business Research, University of Florida -5 + + S. Brett Sutton + martins + bsutton at noojee.com.au + Noojee Telephony Solutions Pty Ltd + -5 + scm:git:git://github.com/srt/asterisk-java.git @@ -53,8 +60,8 @@ - JIRA - http://issues.reucon.com/browse/AJ + GitHub + https://github.com/srt/asterisk-java/issues From 1cf3ff4584804412b6dda6eb37e6e043fe22bab4 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:08:35 +0400 Subject: [PATCH 0081/1055] -https://secure.reucon.net/issues/browse/AJ-299 --- .../org/asteriskjava/tools/HtmlEventTracer.java | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java index 875411246..3f2a9aa16 100644 --- a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java +++ b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java @@ -133,7 +133,7 @@ public void write() StringBuilder line = new StringBuilder(); line.append(""); - line.append(getLocalName(event.getClass())); + line.append(event.getClass().getSimpleName()); line.append("
"); line.append(event.getDateReceived()); line.append(""); @@ -187,7 +187,8 @@ protected String getProperty(Object obj, String property) continue; } - return propertyDescriptor.getReadMethod().invoke(obj).toString(); + final Object o = propertyDescriptor.getReadMethod().invoke(obj); + return o != null ? o.toString() : null; } } catch (Exception e) @@ -199,14 +200,6 @@ protected String getProperty(Object obj, String property) return null; } - protected String getLocalName(Class c) - { - String s; - - s = c.getName(); - return s.substring(s.lastIndexOf(".") + 1, s.length()); - } - protected String getText(String uniqueId, ManagerEvent event) { String format = null; From 9c686dddb47a62d6c8c97a258cd8c1eb56a6353e Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:18:07 +0400 Subject: [PATCH 0082/1055] *Immutable, monitor friendly ManagerEventListenerProxy --- .../manager/ManagerEventListenerProxy.java | 79 ++++++++----------- 1 file changed, 33 insertions(+), 46 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/ManagerEventListenerProxy.java b/src/main/java/org/asteriskjava/manager/ManagerEventListenerProxy.java index b7d39b7a6..4779bace8 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerEventListenerProxy.java +++ b/src/main/java/org/asteriskjava/manager/ManagerEventListenerProxy.java @@ -1,11 +1,14 @@ package org.asteriskjava.manager; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.util.DaemonThreadFactory; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + /** * Proxies a ManagerEventListener and dispatches events asynchronously by using * a single threaded executor.

@@ -26,62 +29,46 @@ * * * @author srt + * @author fink * @since 0.3 - * @version $Id$ */ -public class ManagerEventListenerProxy implements ManagerEventListener -{ - private final ExecutorService executor; - private ManagerEventListener target; +public class ManagerEventListenerProxy implements ManagerEventListener { + private final ThreadPoolExecutor executor; + private final ManagerEventListener target; - /** - * Creates a new ManagerEventListenerProxy.

- * You must set the target by calling {@link #setTarget(ManagerEventListener)}. - */ - public ManagerEventListenerProxy() - { - this.executor = Executors.newSingleThreadExecutor(new DaemonThreadFactory()); - } /** * Creates a new ManagerEventListenerProxy that notifies the given target * asynchronously when new events are received. * * @param target the target listener to invoke. + * @see Executors#newSingleThreadExecutor(ThreadFactory) */ - public ManagerEventListenerProxy(ManagerEventListener target) - { - this(); - this.target = target; - } + public ManagerEventListenerProxy(ManagerEventListener target) { + executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), new DaemonThreadFactory()); + this.target = target; + if (target == null) { + throw new NullPointerException("ManagerEventListener target is null!"); + } + }//new + + + @Override public void onManagerEvent(final ManagerEvent event) { + executor.execute(new Runnable() { + @Override public void run() { + target.onManagerEvent(event); + } + }); + }//onManagerEvent - /** - * Sets the target listener that is notified asynchronously when new events - * are received. - * c - * @param target the target listener to invoke. - */ - public synchronized void setTarget(ManagerEventListener target) - { - this.target = target; - } - public synchronized void onManagerEvent(final ManagerEvent event) - { - if (target != null) - { - executor.execute(new Runnable() - { - public void run() - { - target.onManagerEvent(event); - } - }); - } - } - public void shutdown() { - executor.shutdown(); } + + public static class Access { + public static int getThreadQueueSize (ManagerEventListenerProxy proxy) { + return proxy.executor.getQueue().size(); + } + }//Access } From cfe4fc3e7c5c99e22a84d1535e30da7955f8839e Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:19:34 +0400 Subject: [PATCH 0083/1055] *fix for some Asterisk versions --- .../asteriskjava/manager/event/PeerEntryEvent.java | 12 ++++++++++++ .../asteriskjava/manager/response/PingResponse.java | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/manager/event/PeerEntryEvent.java b/src/main/java/org/asteriskjava/manager/event/PeerEntryEvent.java index 5a67336e0..8a673be55 100644 --- a/src/main/java/org/asteriskjava/manager/event/PeerEntryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/PeerEntryEvent.java @@ -44,6 +44,7 @@ public class PeerEntryEvent extends ResponseEvent private Integer port; private Boolean dynamic; private Boolean natSupport; + private Boolean forceRport; private Boolean videoSupport; private Boolean textSupport; private Boolean acl; @@ -190,6 +191,17 @@ public void setNatSupport(Boolean natSupport) this.natSupport = natSupport; } + /** + * Returns whether the nat option is set to force_rport.
+ * Available since Asterisk 1.8 + * + * @return true if the nat option is set to force_rport, + * false otherwise or null if not supported by Asterisk. + */ + public Boolean getForceRport() { return forceRport;} + + public void setForceRport(Boolean forceRport) { this.forceRport = forceRport;} + /** * Available since Asterisk 1.4. * diff --git a/src/main/java/org/asteriskjava/manager/response/PingResponse.java b/src/main/java/org/asteriskjava/manager/response/PingResponse.java index c4fabe796..2435c40bd 100644 --- a/src/main/java/org/asteriskjava/manager/response/PingResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/PingResponse.java @@ -58,4 +58,4 @@ public void setTimestamp(String timestamp) { this.timestamp = timestamp; } -} \ No newline at end of file +} From 3a23403371a47acc966103ce69fe8c7ae9f82e86 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:23:00 +0400 Subject: [PATCH 0084/1055] *shorter log --- .../asteriskjava/util/DaemonThreadFactory.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/asteriskjava/util/DaemonThreadFactory.java b/src/main/java/org/asteriskjava/util/DaemonThreadFactory.java index 490a7b563..c54139b6c 100644 --- a/src/main/java/org/asteriskjava/util/DaemonThreadFactory.java +++ b/src/main/java/org/asteriskjava/util/DaemonThreadFactory.java @@ -20,19 +20,16 @@ public class DaemonThreadFactory implements ThreadFactory /** * Creates a new instance. */ - public DaemonThreadFactory() - { - namePrefix = "Asterisk-Java DaemonPool-" + poolNumber.getAndIncrement() + "-thread-"; - } + public DaemonThreadFactory() { + namePrefix = "AJ DaemonPool-"+ poolNumber.getAndIncrement() +'.'; + }//new - public Thread newThread(Runnable r) - { - final Thread thread; - thread = new Thread(r); + @Override public Thread newThread (Runnable r) { + final Thread thread = new Thread(r); thread.setDaemon(true); thread.setName(namePrefix + threadNumber.getAndIncrement()); return thread; } -} +} \ No newline at end of file From 2495e4aa15b67653a1489f4c4474ceede05989d9 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:23:59 +0400 Subject: [PATCH 0085/1055] *monitoring api --- .../fastagi/AbstractAgiServer.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/fastagi/AbstractAgiServer.java b/src/main/java/org/asteriskjava/fastagi/AbstractAgiServer.java index e9e6962b8..a1de72463 100644 --- a/src/main/java/org/asteriskjava/fastagi/AbstractAgiServer.java +++ b/src/main/java/org/asteriskjava/fastagi/AbstractAgiServer.java @@ -1,15 +1,15 @@ package org.asteriskjava.fastagi; +import org.asteriskjava.fastagi.internal.AgiChannelFactory; +import org.asteriskjava.fastagi.internal.DefaultAgiChannelFactory; import org.asteriskjava.util.DaemonThreadFactory; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; -import org.asteriskjava.fastagi.internal.AgiChannelFactory; -import org.asteriskjava.fastagi.internal.DefaultAgiChannelFactory; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import java.util.concurrent.SynchronousQueue; /** * Abstract base class for FastAGI and AsyncAGI servers. @@ -241,6 +241,27 @@ private synchronized ThreadPoolExecutor getPool() return pool; } + + /** + * Returns the approximate number of AgiConnectionHandler threads that are actively executing tasks. + * @see ThreadPoolExecutor#getActiveCount() + * @see #getPoolActiveThreadCount() + * @see org.asteriskjava.fastagi.internal.AgiConnectionHandler#AGI_CONNECTION_HANDLERS + */ + public int getPoolActiveTaskCount () { + if (pool != null) { + return pool.getActiveCount(); + } + return -1; + }//getPoolActiveCount + + public int getPoolActiveThreadCount () { + if (pool != null) { + return pool.getPoolSize(); + } + return -1; + }//getPoolActiveThreadCount + /** * Creates a new ThreadPoolExecutor to serve the AGI requests. The nature of this pool * defines how many concurrent requests can be handled. The default implementation From 4c6a6f2fd86e576e68642676435a942a212de191 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:25:08 +0400 Subject: [PATCH 0086/1055] *monitoring api --- .../fastagi/internal/AgiChannelImpl.java | 3 +++ .../internal/AgiConnectionHandler.java | 20 ++++++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java index 184a91866..af14a6089 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java @@ -499,4 +499,7 @@ public void gosub(String context, String extension, String priority, String... a { sendCommand(new GosubCommand(context, extension, priority, arguments)); } + + + public AgiRequest getInternalAgiRequest () { return request;} } diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiConnectionHandler.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiConnectionHandler.java index 830a36a28..e211d9094 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiConnectionHandler.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiConnectionHandler.java @@ -21,6 +21,9 @@ import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + /** * An AgiConnectionHandler is created and run by the AgiServer whenever a new * AGI connection from an Asterisk Server is received. @@ -43,6 +46,10 @@ public abstract class AgiConnectionHandler implements Runnable private AgiScript script = null; private AgiChannelFactory agiChannelFactory; + + public static final ConcurrentMap AGI_CONNECTION_HANDLERS = + new ConcurrentHashMap(32); + /** * The strategy to use to determine which script to run. */ @@ -93,8 +100,7 @@ protected AgiScript getScript() */ public abstract void release(); - public void run() - { + @Override public void run() { AgiChannel channel = null; try @@ -126,8 +132,8 @@ public void run() setStatusVariable(channel, AJ_AGISTATUS_NOT_FOUND); logToAsterisk(channel, errorMessage); } - else if (script != null) - { + else if (script != null) { + AGI_CONNECTION_HANDLERS.put(this, channel); runScript(script, request, channel); } } @@ -141,12 +147,12 @@ else if (script != null) setStatusVariable(channel, AJ_AGISTATUS_FAILED); logger.error("Unexpected Exception while handling request", e); } - finally - { + finally { + AGI_CONNECTION_HANDLERS.remove(this); AgiConnectionHandler.channel.set(null); release(); } - } + }//run private void runScript(AgiScript script, AgiRequest request, AgiChannel channel) { From 8c09a217e4b018f2192dcdddf3c01d5a656b243e Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Wed, 8 Apr 2015 07:41:32 +1000 Subject: [PATCH 0087/1055] accepted increasing backlog to socket listener --- .../org/asteriskjava/fastagi/DefaultAgiServer.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java b/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java index 1034a7e03..4b9d3511f 100644 --- a/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java +++ b/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java @@ -20,7 +20,11 @@ import org.asteriskjava.fastagi.internal.AgiConnectionHandler; import org.asteriskjava.fastagi.internal.DefaultAgiChannelFactory; import org.asteriskjava.fastagi.internal.FastAgiConnectionHandler; -import org.asteriskjava.util.*; +import org.asteriskjava.util.Log; +import org.asteriskjava.util.LogFactory; +import org.asteriskjava.util.ReflectionUtil; +import org.asteriskjava.util.ServerSocketFacade; +import org.asteriskjava.util.SocketConnectionFacade; import org.asteriskjava.util.internal.ServerSocketFacadeImpl; import java.io.IOException; @@ -48,6 +52,9 @@ public class DefaultAgiServer extends AbstractAgiServer implements AgiServer * The default bind port. */ private static final int DEFAULT_BIND_PORT = 4573; + + /** Default 50? Windows server max 200? */ + private static final int BACKLOG = 200; private ServerSocketFacade serverSocket; @@ -274,9 +281,10 @@ private void loadConfig() } } + protected ServerSocketFacade createServerSocket() throws IOException { - return new ServerSocketFacadeImpl(port, 0, address); + return new ServerSocketFacadeImpl(port, BACKLOG, address); } public void startup() throws IOException, IllegalStateException @@ -319,7 +327,7 @@ public void startup() throws IOException, IllegalStateException } } - logger.info("Received connection from " + socket.getRemoteAddress()); + logger.debug("Received connection from " + socket.getRemoteAddress()); // execute connection handler final AgiConnectionHandler connectionHandler = new FastAgiConnectionHandler(getMappingStrategy(), socket, this.getAgiChannelFactory()); From b16dfa5dc9d3eb57939e3b76c60a1cb61cd36a44 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:30:29 +0400 Subject: [PATCH 0088/1055] *agi tcp connection hang-up protection --- .../internal/SocketConnectionFacadeImpl.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java index a90220938..44197eb63 100644 --- a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java +++ b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java @@ -16,25 +16,18 @@ */ package org.asteriskjava.util.internal; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; +import org.asteriskjava.util.SocketConnectionFacade; + +import javax.net.SocketFactory; +import javax.net.ssl.SSLSocketFactory; +import java.io.*; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; -import java.util.Scanner; import java.util.NoSuchElementException; +import java.util.Scanner; import java.util.regex.Pattern; -import javax.net.SocketFactory; -import javax.net.ssl.SSLSocketFactory; - -import org.asteriskjava.util.SocketConnectionFacade; - /** * Default implementation of the SocketConnectionFacade interface using java.io. @@ -105,11 +98,15 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou * @param socket the underlying socket. * @throws IOException if the connection cannot be initialized. */ - SocketConnectionFacadeImpl(Socket socket) throws IOException - { - initialize(socket, NL_PATTERN); + SocketConnectionFacadeImpl(Socket socket) throws IOException { + socket.setSoTimeout(MAX_SOCKET_READ_TIMEOUT_MILLIS); + initialize(socket, NL_PATTERN); } + /** 70 mi = 70 * 60 * 1000 */ + private static final int MAX_SOCKET_READ_TIMEOUT_MILLIS = 4200000; + + private void initialize(Socket socket, Pattern pattern) throws IOException { this.socket = socket; From 2d553de9e59961db6457daf0011bb6daae344721 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 13:38:38 +0400 Subject: [PATCH 0089/1055] -ManagerConnectionPool https://secure.reucon.net/issues/browse/AJ-300. Fewer AMI connections - better performance. +VAR_AJ_DIAL_STATUS = "AJ_DIAL_STATUS" +management api -better shutdown *better perfomance *better log --- .../asteriskjava/live/AsteriskChannel.java | 2 + .../live/internal/AsteriskServerImpl.java | 72 +++++---- .../live/internal/ChannelManager.java | 100 +++++++------ .../live/internal/ManagerConnectionPool.java | 140 ------------------ 4 files changed, 93 insertions(+), 221 deletions(-) delete mode 100644 src/main/java/org/asteriskjava/live/internal/ManagerConnectionPool.java diff --git a/src/main/java/org/asteriskjava/live/AsteriskChannel.java b/src/main/java/org/asteriskjava/live/AsteriskChannel.java index 37c52afb1..543b67beb 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskChannel.java +++ b/src/main/java/org/asteriskjava/live/AsteriskChannel.java @@ -68,6 +68,8 @@ public interface AsteriskChannel extends LiveObject String VARIABLE_MONITOR_EXEC = "MONITOR_EXEC"; String VARIABLE_MONITOR_EXEC_ARGS = "MONITOR_EXEC_ARGS"; + /** Pseudo-variable to store {@link org.asteriskjava.manager.event.DialEvent#getDialStatus()} */ + String VAR_AJ_DIAL_STATUS = "AJ_DIAL_STATUS"; /** * Returns the unique id of this channel, for example "1099015093.165". * diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index bca25a310..46cdd9f6d 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -16,17 +16,21 @@ */ package org.asteriskjava.live.internal; +import org.asteriskjava.AsteriskVersion; +import org.asteriskjava.config.ConfigFile; import org.asteriskjava.live.*; -import org.asteriskjava.manager.*; +import org.asteriskjava.manager.ManagerConnection; +import org.asteriskjava.manager.ManagerConnectionState; +import org.asteriskjava.manager.ManagerEventListener; +import org.asteriskjava.manager.ManagerEventListenerProxy; +import org.asteriskjava.manager.ResponseEvents; import org.asteriskjava.manager.action.*; import org.asteriskjava.manager.event.*; import org.asteriskjava.manager.response.*; +import org.asteriskjava.util.AstUtil; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; -import org.asteriskjava.util.AstUtil; -import org.asteriskjava.config.ConfigFile; -import org.asteriskjava.AsteriskVersion; import java.util.*; import java.util.concurrent.atomic.AtomicLong; @@ -58,21 +62,16 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener */ private ManagerConnection eventConnection; private ManagerEventListener eventListener = null; - private ManagerEventListenerProxy managerEventListenerProxy = null; - - private boolean initialized = false; + ManagerEventListenerProxy managerEventListenerProxy; - /** - * A pool of manager connections to use for sending actions to Asterisk. - */ - private final ManagerConnectionPool connectionPool; + boolean initialized = false; - private final List listeners; + final Set listeners; - private final ChannelManager channelManager; - private final MeetMeManager meetMeManager; - private final QueueManager queueManager; - private final AgentManager agentManager; + final ChannelManager channelManager; + final MeetMeManager meetMeManager; + final QueueManager queueManager; + final AgentManager agentManager; /** * The exact version string of the Asterisk server we are connected to. @@ -117,9 +116,8 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener */ public AsteriskServerImpl() { - connectionPool = new ManagerConnectionPool(1); idCounter = new AtomicLong(); - listeners = new ArrayList(); + listeners = new LinkedHashSet(); originateCallbacks = new HashMap(); channelManager = new ChannelManager(this); agentManager = new AgentManager(this); @@ -136,7 +134,7 @@ public AsteriskServerImpl() public AsteriskServerImpl(ManagerConnection eventConnection) { this(); - setManagerConnection(eventConnection); //todo: !!! Possible bug !!!: call to overridable method over object construction + setManagerConnection(eventConnection); //todo: !!! Possible bug !!!: call to overridable method over object construction } /** @@ -164,8 +162,6 @@ public void setManagerConnection(ManagerConnection eventConnection) } this.eventConnection = eventConnection; - this.connectionPool.clear(); - this.connectionPool.add(eventConnection); } public ManagerConnection getManagerConnection() @@ -1171,7 +1167,7 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) return; } } - + if (channel.wasInState(ChannelState.DOWN)) { cb.onNoAnswer(channel); @@ -1187,19 +1183,31 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) } } - public void shutdown() - { - if (eventConnection != null && (eventConnection.getState() == ManagerConnectionState.CONNECTED || eventConnection.getState() == ManagerConnectionState.RECONNECTING)) - { - eventConnection.logoff(); - } - if (managerEventListenerProxy != null) - { + @Override public void shutdown() { + if (eventConnection != null && (eventConnection.getState() == ManagerConnectionState.CONNECTED || eventConnection.getState() == ManagerConnectionState.RECONNECTING)) { + try { + eventConnection.logoff(); + } catch (Exception ignore) {} + } + + if (managerEventListenerProxy != null) { + if (eventConnection != null) { + eventConnection.removeEventListener(managerEventListenerProxy); + } managerEventListenerProxy.shutdown(); } - managerEventListenerProxy = null; + + if (eventConnection != null && eventListener != null) { + eventConnection.removeEventListener(eventListener); + } + + managerEventListenerProxy = null; eventListener = null; - } + + if (initialized) {//incredible, but it happened + handleDisconnectEvent(null); + }//i + }//shutdown public List getPeerEntries() throws ManagerCommunicationException { diff --git a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java index 176f7b824..5421cd6c0 100644 --- a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java +++ b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java @@ -20,11 +20,14 @@ import org.asteriskjava.manager.ResponseEvents; import org.asteriskjava.manager.action.StatusAction; import org.asteriskjava.manager.event.*; +import org.asteriskjava.util.DaemonThreadFactory; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; import java.util.*; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; /** * Manages channel events on behalf of an AsteriskServer. @@ -47,7 +50,10 @@ class ChannelManager /** * A map of all active channel by their unique id. */ - private final Set channels; + final Set channels; + + + ScheduledThreadPoolExecutor traceScheduledExecutorService; /** * Creates a new instance. @@ -70,6 +76,9 @@ void initialize(List variables) throws ManagerCommunicationException ResponseEvents re; disconnected(); + + traceScheduledExecutorService = new ScheduledThreadPoolExecutor(1, new DaemonThreadFactory());//Executors.newSingleThreadScheduledExecutor + StatusAction sa = new StatusAction(); sa.setVariables(variables); re = server.sendEventGeneratingAction(sa); @@ -84,6 +93,9 @@ void initialize(List variables) throws ManagerCommunicationException void disconnected() { + if (traceScheduledExecutorService != null) { + traceScheduledExecutorService.shutdown(); + } synchronized (channels) { channels.clear(); @@ -147,56 +159,42 @@ private void removeOldChannels() } } - private AsteriskChannelImpl addNewChannel(String uniqueId, String name, + private AsteriskChannelImpl addNewChannel(String uniqueId, final String name, Date dateOfCreation, String callerIdNumber, String callerIdName, ChannelState state, String account) { - final AsteriskChannelImpl channel; - final String traceId; - - channel = new AsteriskChannelImpl(server, name, uniqueId, dateOfCreation); + final AsteriskChannelImpl channel = new AsteriskChannelImpl(server, name, uniqueId, dateOfCreation); channel.setCallerId(new CallerId(callerIdName, callerIdNumber)); channel.setAccount(account); channel.stateChanged(dateOfCreation, state); logger.info("Adding channel " + channel.getName() + "(" + channel.getId() + ")"); + addChannel(channel); - if (SLEEP_TIME_BEFORE_GET_VAR > 0) - { - try - { - Thread.sleep(SLEEP_TIME_BEFORE_GET_VAR); - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - } - } + //todo getChannelImplById -> LinkedHashMap, callbacks order + traceScheduledExecutorService.schedule(new Runnable(){ + @Override public void run () { + final String traceId = getTraceId(channel); + channel.setTraceId(traceId); - traceId = getTraceId(channel); - channel.setTraceId(traceId); + if (traceId != null && (!name.toLowerCase(Locale.ENGLISH).startsWith("local/") || name.endsWith(",1") || name.endsWith(";1"))) { + final OriginateCallbackData callbackData = server.getOriginateCallbackDataByTraceId(traceId); + + if (callbackData != null && callbackData.getChannel() == null) { + callbackData.setChannel(channel); + try { + callbackData.getCallback().onDialing(channel); + } catch (Throwable t) { + logger.warn("Exception dispatching originate progress. "+ channel, t); + }//t + }//i + }//i + }}, SLEEP_TIME_BEFORE_GET_VAR, TimeUnit.MILLISECONDS); - addChannel(channel); - if (traceId != null && (!name.toLowerCase(Locale.ENGLISH).startsWith("local/") || (name.endsWith(",1") || name.endsWith(";1")))) - { - final OriginateCallbackData callbackData; - callbackData = server.getOriginateCallbackDataByTraceId(traceId); - if (callbackData != null && callbackData.getChannel() == null) - { - callbackData.setChannel(channel); - try - { - callbackData.getCallback().onDialing(channel); - } - catch (Throwable t) - { - logger.warn("Exception dispatching originate progress.", t); - } - } - } server.fireNewAsteriskChannel(channel); return channel; - } + }//addNewChannel + void handleStatusEvent(StatusEvent event) { @@ -447,7 +445,7 @@ void handleNewExtenEvent(NewExtenEvent event) channel = getChannelImplById(event.getUniqueId()); if (channel == null) { - logger.error("Ignored NewExtenEvent for unknown channel " + event.getChannel()); + logger.warn("handleNewExtenEvent: Ignored NewExtenEvent for unknown channel " + event.getChannel()); return; } @@ -573,7 +571,7 @@ void handleHangupEvent(HangupEvent event) if (channel == null) { - logger.error("Ignored HangupEvent for unknown channel " + event.getChannel()); + logger.warn("handleHangupEvent: Ignored HangupEvent for unknown channel " + event.getChannel()); return; } @@ -598,14 +596,18 @@ void handleDialEvent(DialEvent event) if (sourceChannel == null) { - logger.error("Ignored DialEvent for unknown source channel " + event.getChannel() + " with unique id " + event.getUniqueId()); - return; - } - if (destinationChannel == null) - { - logger.error("Ignored DialEvent for unknown destination channel " + event.getDestination() + " with unique id " + event.getDestUniqueId()); + logger.warn("handleDialEvent: Ignored DialEvent for unknown source channel " + event.getChannel() + " with unique id " + event.getUniqueId()); return; } + if (destinationChannel == null) { + if (DialEvent.SUBEVENT_END.equalsIgnoreCase(event.getSubEvent())) { + sourceChannel.updateVariable(AsteriskChannel.VAR_AJ_DIAL_STATUS, event.getDialStatus()); + logger.info("handleDialEvent: Ignored DialEvent for unknown dst channel "+ event.getDestination() +" with unique_id "+ event.getDestUniqueId()); + } else { + logger.warn("handleDialEvent: Ignored DialEvent for unknown dst channel "+ event.getDestination() +" with unique_id "+ event.getDestUniqueId()); + } + return; + }//i logger.info(sourceChannel.getName() + " dialed " + destinationChannel.getName()); getTraceId(sourceChannel); @@ -627,12 +629,12 @@ void handleBridgeEvent(BridgeEvent event) if (channel1 == null) { - logger.error("Ignored BridgeEvent for unknown channel " + event.getChannel1()); + logger.warn("handleBridgeEvent: Ignored BridgeEvent for unknown channel " + event.getChannel1()); return; } if (channel2 == null) { - logger.error("Ignored BridgeEvent for unknown channel " + event.getChannel2()); + logger.warn("handleBridgeEvent: Ignored BridgeEvent for unknown channel " + event.getChannel2()); return; } @@ -671,7 +673,7 @@ void handleRenameEvent(RenameEvent event) if (channel == null) { - logger.error("Ignored RenameEvent for unknown channel with uniqueId " + event.getUniqueId()); + logger.warn("handleRenameEvent: Ignored RenameEvent for unknown channel with uniqueId " + event.getUniqueId()); return; } diff --git a/src/main/java/org/asteriskjava/live/internal/ManagerConnectionPool.java b/src/main/java/org/asteriskjava/live/internal/ManagerConnectionPool.java deleted file mode 100644 index 21612197e..000000000 --- a/src/main/java/org/asteriskjava/live/internal/ManagerConnectionPool.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2005-2006 Stefan Reuter - * - * Licensed 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.asteriskjava.live.internal; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; - -import org.asteriskjava.live.ManagerCommunicationException; -import org.asteriskjava.manager.ManagerConnection; -import org.asteriskjava.manager.ResponseEvents; -import org.asteriskjava.manager.action.EventGeneratingAction; -import org.asteriskjava.manager.action.ManagerAction; -import org.asteriskjava.manager.response.ManagerResponse; -import org.asteriskjava.util.Log; -import org.asteriskjava.util.LogFactory; - -class ManagerConnectionPool -{ - private final Log logger = LogFactory.getLog(getClass()); - private final BlockingQueue connections; - - ManagerConnectionPool(int size) - { - this.connections = new ArrayBlockingQueue(size); - } - - void clear() - { - connections.clear(); - } - - void add(ManagerConnection connection) - { - put(connection); - } - - ManagerResponse sendAction(ManagerAction action) throws ManagerCommunicationException - { - ManagerConnection connection; - ManagerResponse response; - - connection = get(); - try - { - response = connection.sendAction(action); - } - catch (Exception e) - { - throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); - } - finally - { - put(connection); - } - - return response; - } - - ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws ManagerCommunicationException - { - return sendEventGeneratingAction(action, -1); - } - - ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) - throws ManagerCommunicationException - { - ManagerConnection connection; - ResponseEvents responseEvents; - - connection = get(); - try - { - if (timeout > 0) - { - responseEvents = connection.sendEventGeneratingAction(action, timeout); - } - else - { - responseEvents = connection.sendEventGeneratingAction(action); - } - } - catch (Exception e) - { - throw ManagerCommunicationExceptionMapper.mapSendActionException(action.getAction(), e); - } - finally - { - put(connection); - } - - return responseEvents; - } - - /** - * Retrieves a connection from the pool. - * - * @return the retrieved connection, or null if interrupted - * while waiting for a connection to become available. - */ - private ManagerConnection get() - { - try - { - return connections.take(); - } - catch (InterruptedException e) - { - logger.error("Interrupted while waiting for ManagerConnection to become available", e); - Thread.currentThread().interrupt(); - return null; - } - } - - private void put(ManagerConnection connection) - { - try - { - connections.put(connection); - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - throw new RuntimeException("Interrupted while trying to add connection to pool"); - } - } -} From 0b623906136990c2bd79d7b25ca781b7e98025d1 Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 14:04:37 +0400 Subject: [PATCH 0090/1055] *prepare for Set->LinkedHashMap --- .../live/internal/ChannelManager.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java index 5421cd6c0..8a307859b 100644 --- a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java +++ b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java @@ -459,6 +459,14 @@ void handleNewExtenEvent(NewExtenEvent event) } } + private void idChanged (AsteriskChannelImpl channel, AbstractChannelEvent event) { + if (channel != null) { + logger.info("Changing unique_id for '" + channel.getName() + "' from " + channel.getId() + " to " + event.getUniqueId() +" < "+ event); + channel.idChanged(event.getDateReceived(), event.getUniqueId()); + } + }//idChanged + + void handleNewStateEvent(NewStateEvent event) { AsteriskChannelImpl channel = getChannelImplById(event.getUniqueId()); @@ -467,11 +475,7 @@ void handleNewStateEvent(NewStateEvent event) { // NewStateEvent can occur for an existing channel that now has a different unique id (originate with Local/) channel = getChannelImplByNameAndActive(event.getChannel()); - if (channel != null) - { - logger.info("Changing unique id for '" + channel.getName() + "' from " + channel.getId() + " to " + event.getUniqueId()); - channel.idChanged(event.getDateReceived(), event.getUniqueId()); - } + idChanged(channel, event); if (channel == null) { @@ -542,11 +546,7 @@ void handleNewCallerIdEvent(NewCallerIdEvent event) { // NewCallerIdEvent can occur for an existing channel that now has a different unique id (originate with Local/) channel = getChannelImplByNameAndActive(event.getChannel()); - if (channel != null) - { - logger.info("Changing unique id for '" + channel.getName() + "' from " + channel.getId() + " to " + event.getUniqueId()); - channel.idChanged(event.getDateReceived(), event.getUniqueId()); - } + idChanged(channel, event); if (channel == null) { From 4ba43c5478e153f18fad11095e61f2aa6f975fee Mon Sep 17 00:00:00 2001 From: Andrew Fink Date: Tue, 10 Jan 2012 15:14:06 +0400 Subject: [PATCH 0091/1055] *Set->LinkedHashMap for high performance --- .../live/internal/ChannelManager.java | 54 +++++++++---------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java index 8a307859b..7271d7c33 100644 --- a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java +++ b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java @@ -50,7 +50,7 @@ class ChannelManager /** * A map of all active channel by their unique id. */ - final Set channels; + final LinkedHashMap channels = new LinkedHashMap(); ScheduledThreadPoolExecutor traceScheduledExecutorService; @@ -63,7 +63,6 @@ class ChannelManager ChannelManager(AsteriskServerImpl server) { this.server = server; - this.channels = new HashSet(); } void initialize() throws ManagerCommunicationException @@ -114,7 +113,7 @@ Collection getChannels() synchronized (channels) { copy = new ArrayList(channels.size() + 2); - for (AsteriskChannel channel : channels) + for (AsteriskChannel channel : channels.values()) { if (channel.getState() != ChannelState.HUNGUP) { @@ -129,7 +128,7 @@ private void addChannel(AsteriskChannelImpl channel) { synchronized (channels) { - channels.add(channel); + channels.put(channel.getId(), channel); } } @@ -142,7 +141,7 @@ private void removeOldChannels() synchronized (channels) { - i = channels.iterator(); + i = channels.values().iterator(); while (i.hasNext()) { final AsteriskChannel channel = i.next(); @@ -290,9 +289,9 @@ AsteriskChannelImpl getChannelImplByName(String name) synchronized (channels) { - for (AsteriskChannelImpl tmp : channels) + for (AsteriskChannelImpl tmp : channels.values()) { - if (tmp.getName() != null && tmp.getName().equals(name)) + if (name.equals(tmp.getName())) { // return the most recent channel or when dates are similar, the active one if (dateOfCreation == null || @@ -332,9 +331,9 @@ AsteriskChannelImpl getChannelImplByNameAndActive(String name) synchronized (channels) { - for (AsteriskChannelImpl tmp : channels) + for (AsteriskChannelImpl tmp : channels.values()) { - if (tmp.getName() != null && tmp.getName().equals(name) && tmp.getState() != ChannelState.HUNGUP) + if (name.equals(tmp.getName()) && tmp.getState() != ChannelState.HUNGUP) { channel = tmp; } @@ -343,25 +342,13 @@ AsteriskChannelImpl getChannelImplByNameAndActive(String name) return channel; } - AsteriskChannelImpl getChannelImplById(String id) - { - if (id == null) - { - return null; - } + AsteriskChannelImpl getChannelImplById(String uniqueId) { + if (uniqueId == null) { return null;} - synchronized (channels) - { - for (AsteriskChannelImpl channel : channels) - { - if (id.equals(channel.getId())) - { - return channel; - } - } - } - return null; - } + synchronized (channels) { + return channels.get(uniqueId); + } + }//getChannelImplById /** * Returns the other side of a local channel. @@ -461,8 +448,17 @@ void handleNewExtenEvent(NewExtenEvent event) private void idChanged (AsteriskChannelImpl channel, AbstractChannelEvent event) { if (channel != null) { - logger.info("Changing unique_id for '" + channel.getName() + "' from " + channel.getId() + " to " + event.getUniqueId() +" < "+ event); - channel.idChanged(event.getDateReceived(), event.getUniqueId()); + final String oldId = channel.getId(); + final String newId = event.getUniqueId(); + + if (oldId != null && oldId.equals(newId)) { return;} + + logger.info("Changing unique_id for '" + channel.getName() + "' from " + oldId + " to " + newId +" < "+ event); + synchronized(channels) { + channels.remove(oldId); + channels.put(newId, channel); + channel.idChanged(event.getDateReceived(), newId); + } } }//idChanged From 7e7a656806aa4e6e37e467a973f69128963b5f10 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:20:35 +1100 Subject: [PATCH 0092/1055] add support for MuteAudio action. --- .../manager/action/MuteAudioAction.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java new file mode 100644 index 000000000..15fe0f385 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -0,0 +1,119 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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.asteriskjava.manager.action; + +/** + * Action: MuteAudio Synopsis: Mute an audio stream Privilege: system,all + * Description: Mute an incoming or outbound audio stream in a channel. + * Variables: Channel: The channel you want to mute. Direction: in | out + * |all The stream you want to mute. State: on | off Whether to turn mute on or + * off. ActionID: Optional action ID for this AMI transaction. + * + * It is defined in res/res_mutestream.c. + *

+ * Available since Asterisk 1.8 + * + * @author sbs + * @version $Id: MuteAction.java 938 2007-12-31 03:23:38Z srt $ + * @since 1.0.0 + */ +public class MuteAudioAction extends AbstractManagerAction +{ + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 0L; + + private String channel; + + /** The audio direct (relative to the pbx) which is to be muted. */ + enum Direction + { + in, out, all + } + + private Direction direction; + + /** Controls whether to mute (on) or unmute (off) the call **/ + enum State + { + mute("on"), unmute("off"); //$NON-NLS-1$//$NON-NLS-2$ + + String value; + + State(String value) + { + this.value = value; + } + + } + + private State state; + + /** + * Creates a new empty MuteAction. + */ + public MuteAudioAction() + { + + } + + /** + * Creates a new MuteAction that Mutes or Unmutes the two given channel. + * + * @param channel + * the name of the channel to Mute. + * + * @param direction + * the audio direction which is to be muted/unmuted + * + * @param state controls whether we are muting or unmuting the channel. + */ + + public MuteAudioAction(String channel, Direction direction, State state) + { + this.channel = channel; + this.direction = direction; + this.state = state; + } + + /** + * Returns the name of this action, i.e. "MuteAudio". + */ + @Override + public String getAction() + { + return "MuteAudio"; //$NON-NLS-1$ + } + + String getChannel() + { + return this.channel; + } + + Direction getDirection() + { + return this.direction; + } + + State getState() + { + return this.state; + } + + +} \ No newline at end of file From 84c80e2bea10df36c86dc7bf07bca25f99e351e6 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:23:26 +1100 Subject: [PATCH 0093/1055] Added toString method to the State enum so that it will output the correct value. --- .../org/asteriskjava/manager/action/MuteAudioAction.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index 15fe0f385..ea5c2679e 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -60,6 +60,11 @@ enum State this.value = value; } + public String toString() + { + return this.value; + } + } private State state; From 719eee4741001f17e46ce0979c861ce7c63465b9 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:40:51 +1100 Subject: [PATCH 0094/1055] Change the enums to upper case to match convention. --- .../java/org/asteriskjava/manager/action/MuteAudioAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index ea5c2679e..b6c45d80f 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -43,7 +43,7 @@ public class MuteAudioAction extends AbstractManagerAction /** The audio direct (relative to the pbx) which is to be muted. */ enum Direction { - in, out, all + IN, OUT, ALL } private Direction direction; @@ -51,7 +51,7 @@ enum Direction /** Controls whether to mute (on) or unmute (off) the call **/ enum State { - mute("on"), unmute("off"); //$NON-NLS-1$//$NON-NLS-2$ + MUTE("on"), UNMUTE("off"); //$NON-NLS-1$//$NON-NLS-2$ String value; From 210ec943606cac6defd7f406b4d75a16aab6b092 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 23:17:21 +1100 Subject: [PATCH 0095/1055] Made the State and Direction enums public so that they can actually be used when creating a MuteAudioAction. --- .../java/org/asteriskjava/manager/action/MuteAudioAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index b6c45d80f..7c52b2dd4 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -41,7 +41,7 @@ public class MuteAudioAction extends AbstractManagerAction private String channel; /** The audio direct (relative to the pbx) which is to be muted. */ - enum Direction + public enum Direction { IN, OUT, ALL } @@ -49,7 +49,7 @@ enum Direction private Direction direction; /** Controls whether to mute (on) or unmute (off) the call **/ - enum State + public enum State { MUTE("on"), UNMUTE("off"); //$NON-NLS-1$//$NON-NLS-2$ From f2175aaf3618e4c824424ae5811365fe070b82e2 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Wed, 8 Apr 2015 07:47:56 +1000 Subject: [PATCH 0096/1055] Update contributor timezone --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cfd6d3574..2ee7332fa 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,7 @@ martins bsutton at noojee.com.au Noojee Telephony Solutions Pty Ltd - -5 + +10 From 1013a1c3ccbc8af67fdc867d6b907022a518e641 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Wed, 8 Apr 2015 08:16:07 +1000 Subject: [PATCH 0097/1055] merged in channel listener logic. --- .../live/internal/AsteriskServerImpl.java | 340 ++++++++++++------ 1 file changed, 234 insertions(+), 106 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 46cdd9f6d..5c62e3883 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -16,30 +16,108 @@ */ package org.asteriskjava.live.internal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import org.asteriskjava.AsteriskVersion; import org.asteriskjava.config.ConfigFile; -import org.asteriskjava.live.*; +import org.asteriskjava.live.AsteriskAgent; +import org.asteriskjava.live.AsteriskChannel; +import org.asteriskjava.live.AsteriskQueue; +import org.asteriskjava.live.AsteriskQueueEntry; +import org.asteriskjava.live.AsteriskServer; +import org.asteriskjava.live.AsteriskServerListener; +import org.asteriskjava.live.CallerId; +import org.asteriskjava.live.ChannelState; +import org.asteriskjava.live.LiveException; +import org.asteriskjava.live.ManagerCommunicationException; +import org.asteriskjava.live.MeetMeRoom; +import org.asteriskjava.live.MeetMeUser; +import org.asteriskjava.live.NoSuchChannelException; +import org.asteriskjava.live.OriginateCallback; +import org.asteriskjava.live.Voicemailbox; import org.asteriskjava.manager.ManagerConnection; import org.asteriskjava.manager.ManagerConnectionState; import org.asteriskjava.manager.ManagerEventListener; import org.asteriskjava.manager.ManagerEventListenerProxy; import org.asteriskjava.manager.ResponseEvents; -import org.asteriskjava.manager.action.*; -import org.asteriskjava.manager.event.*; -import org.asteriskjava.manager.response.*; +import org.asteriskjava.manager.action.CommandAction; +import org.asteriskjava.manager.action.DbGetAction; +import org.asteriskjava.manager.action.DbPutAction; +import org.asteriskjava.manager.action.EventGeneratingAction; +import org.asteriskjava.manager.action.GetConfigAction; +import org.asteriskjava.manager.action.GetVarAction; +import org.asteriskjava.manager.action.MailboxCountAction; +import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.manager.action.ModuleCheckAction; +import org.asteriskjava.manager.action.ModuleLoadAction; +import org.asteriskjava.manager.action.OriginateAction; +import org.asteriskjava.manager.action.SetVarAction; +import org.asteriskjava.manager.action.SipPeersAction; +import org.asteriskjava.manager.event.AbstractMeetMeEvent; +import org.asteriskjava.manager.event.AgentCallbackLoginEvent; +import org.asteriskjava.manager.event.AgentCallbackLogoffEvent; +import org.asteriskjava.manager.event.AgentCalledEvent; +import org.asteriskjava.manager.event.AgentCompleteEvent; +import org.asteriskjava.manager.event.AgentConnectEvent; +import org.asteriskjava.manager.event.AgentLoginEvent; +import org.asteriskjava.manager.event.AgentLogoffEvent; +import org.asteriskjava.manager.event.AgentsEvent; +import org.asteriskjava.manager.event.BridgeEvent; +import org.asteriskjava.manager.event.CdrEvent; +import org.asteriskjava.manager.event.ConnectEvent; +import org.asteriskjava.manager.event.DbGetResponseEvent; +import org.asteriskjava.manager.event.DialEvent; +import org.asteriskjava.manager.event.DisconnectEvent; +import org.asteriskjava.manager.event.DtmfEvent; +import org.asteriskjava.manager.event.HangupEvent; +import org.asteriskjava.manager.event.JoinEvent; +import org.asteriskjava.manager.event.LeaveEvent; +import org.asteriskjava.manager.event.ManagerEvent; +import org.asteriskjava.manager.event.MonitorStartEvent; +import org.asteriskjava.manager.event.MonitorStopEvent; +import org.asteriskjava.manager.event.NewCallerIdEvent; +import org.asteriskjava.manager.event.NewChannelEvent; +import org.asteriskjava.manager.event.NewExtenEvent; +import org.asteriskjava.manager.event.NewStateEvent; +import org.asteriskjava.manager.event.OriginateResponseEvent; +import org.asteriskjava.manager.event.ParkedCallEvent; +import org.asteriskjava.manager.event.ParkedCallGiveUpEvent; +import org.asteriskjava.manager.event.ParkedCallTimeOutEvent; +import org.asteriskjava.manager.event.PeerEntryEvent; +import org.asteriskjava.manager.event.QueueMemberAddedEvent; +import org.asteriskjava.manager.event.QueueMemberPausedEvent; +import org.asteriskjava.manager.event.QueueMemberPenaltyEvent; +import org.asteriskjava.manager.event.QueueMemberRemovedEvent; +import org.asteriskjava.manager.event.QueueMemberStatusEvent; +import org.asteriskjava.manager.event.RenameEvent; +import org.asteriskjava.manager.event.ResponseEvent; +import org.asteriskjava.manager.event.UnparkedCallEvent; +import org.asteriskjava.manager.event.VarSetEvent; +import org.asteriskjava.manager.response.CommandResponse; +import org.asteriskjava.manager.response.GetConfigResponse; +import org.asteriskjava.manager.response.MailboxCountResponse; +import org.asteriskjava.manager.response.ManagerError; +import org.asteriskjava.manager.response.ManagerResponse; +import org.asteriskjava.manager.response.ModuleCheckResponse; import org.asteriskjava.util.AstUtil; import org.asteriskjava.util.DateUtil; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; -import java.util.*; -import java.util.concurrent.atomic.AtomicLong; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * Default implementation of the {@link AsteriskServer} interface. - * + * * @author srt * @version $Id$ */ @@ -112,6 +190,21 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener private boolean asyncEventHandling = true; /** + * The chainListener allows a listener to receive manager events after they + * have been processed by the AsteriskServer. If the AsteriskServer is + * handling messages using the asyncEventHandling then these messages will + * also be async. You would use the chainListener if you are processing raw + * events and using the AJ live ChannelManager. If you don't use the chain + * listener then you can't be certain that a channel name passed in a raw + * event will match the channel name held by the Channel Manager. By + * chaining events you can be certain that events such as channel Rename + * events have been processed by the live ChannelManager before you receive + * an event and as such the names will always match. + * + */ + private List chainListeners = new ArrayList(); + + /** * Creates a new instance. */ public AsteriskServerImpl() @@ -790,6 +883,21 @@ public void removeAsteriskServerListener(AsteriskServerListener listener) } } + public void addChainListener(ManagerEventListener chainListener) + { + synchronized (this.chainListeners) + { + if (!this.chainListeners.contains(chainListener)) + this.chainListeners.add(chainListener); + } + + } + + public void removeChainListner(ManagerEventListener chainListener) + { + this.chainListeners.remove(chainListener); + } + void fireNewAsteriskChannel(AsteriskChannel channel) { synchronized (listeners) @@ -1049,8 +1157,25 @@ else if (event instanceof AgentLogoffEvent) agentManager.handleAgentLogoffEvent((AgentLogoffEvent) event); } // End of agent-related events + + // dispatch the events to the chainListener if they exist. + fireChainListeners(event); } + /** + * dispatch the event to the chainListener if they exist. + * + * @param event + */ + private void fireChainListeners(ManagerEvent event) + { + synchronized (this.chainListeners) + { + for (ManagerEventListener listener : this.chainListeners) + listener.onManagerEvent(event); + } + } + /* * Resets the internal state when the connection to the asterisk server is * lost. @@ -1197,100 +1322,103 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) managerEventListenerProxy.shutdown(); } - if (eventConnection != null && eventListener != null) { - eventConnection.removeEventListener(eventListener); - } - - managerEventListenerProxy = null; - eventListener = null; - - if (initialized) {//incredible, but it happened - handleDisconnectEvent(null); - }//i - }//shutdown - - public List getPeerEntries() throws ManagerCommunicationException - { - ResponseEvents responseEvents = sendEventGeneratingAction(new SipPeersAction(), 2000); - List peerEntries = new ArrayList(30); - for (ResponseEvent re : responseEvents.getEvents()) - { - if (re instanceof PeerEntryEvent) - { - peerEntries.add((PeerEntryEvent) re); - } - } - return peerEntries; - } - - public DbGetResponseEvent dbGet(String family, String key) throws ManagerCommunicationException - { - ResponseEvents responseEvents = sendEventGeneratingAction(new DbGetAction(family, key), 2000); - DbGetResponseEvent dbgre = null; - for (ResponseEvent re : responseEvents.getEvents()) - { - dbgre = (DbGetResponseEvent) re; - } - return dbgre; - } - - public void dbDel(String family, String key) throws ManagerCommunicationException - { - // The following only works with BRIStuffed asrterisk: sendAction(new DbDelAction(family,key)); - // Use cli command instead ... - sendAction(new CommandAction("database del " + family + " " + key)); - } - - public void dbPut(String family, String key, String value) throws ManagerCommunicationException - { - sendAction(new DbPutAction(family, key, value)); - } - - public AsteriskChannel getChannelByNameAndActive(String name) throws ManagerCommunicationException - { - initializeIfNeeded(); - return channelManager.getChannelImplByNameAndActive(name); - } - - public Collection getAgents() throws ManagerCommunicationException - { - initializeIfNeeded(); - return agentManager.getAgents(); - } - - void fireNewAgent(AsteriskAgentImpl agent) - { - synchronized (listeners) - { - for (AsteriskServerListener listener : listeners) - { - try - { - listener.onNewAgent(agent); - } - catch (Exception e) - { - logger.warn("Exception in onNewAgent()", e); - } - } - } - } - - void fireNewQueueEntry(AsteriskQueueEntry entry) - { - synchronized (listeners) - { - for (AsteriskServerListener listener : listeners) - { - try - { - listener.onNewQueueEntry(entry); - } - catch (Exception e) - { - logger.warn("Exception in onNewQueueEntry()", e); - } - } - } - } + if (eventConnection != null && eventListener != null) + { + eventConnection.removeEventListener(eventListener); + } + + managerEventListenerProxy = null; + eventListener = null; + + if (initialized) + {// incredible, but it happened + handleDisconnectEvent(null); + }// i + }// shutdown + + public List getPeerEntries() throws ManagerCommunicationException + { + ResponseEvents responseEvents = sendEventGeneratingAction(new SipPeersAction(), 2000); + List peerEntries = new ArrayList(30); + for (ResponseEvent re : responseEvents.getEvents()) + { + if (re instanceof PeerEntryEvent) + { + peerEntries.add((PeerEntryEvent) re); + } + } + return peerEntries; + } + + public DbGetResponseEvent dbGet(String family, String key) throws ManagerCommunicationException + { + ResponseEvents responseEvents = sendEventGeneratingAction(new DbGetAction(family, key), 2000); + DbGetResponseEvent dbgre = null; + for (ResponseEvent re : responseEvents.getEvents()) + { + dbgre = (DbGetResponseEvent) re; + } + return dbgre; + } + + public void dbDel(String family, String key) throws ManagerCommunicationException + { + // The following only works with BRIStuffed asrterisk: sendAction(new + // DbDelAction(family,key)); + // Use cli command instead ... + sendAction(new CommandAction("database del " + family + " " + key)); + } + + public void dbPut(String family, String key, String value) throws ManagerCommunicationException + { + sendAction(new DbPutAction(family, key, value)); + } + + public AsteriskChannel getChannelByNameAndActive(String name) throws ManagerCommunicationException + { + initializeIfNeeded(); + return channelManager.getChannelImplByNameAndActive(name); + } + + public Collection getAgents() throws ManagerCommunicationException + { + initializeIfNeeded(); + return agentManager.getAgents(); + } + + void fireNewAgent(AsteriskAgentImpl agent) + { + synchronized (listeners) + { + for (AsteriskServerListener listener : listeners) + { + try + { + listener.onNewAgent(agent); + } + catch (Exception e) + { + logger.warn("Exception in onNewAgent()", e); + } + } + } + } + + void fireNewQueueEntry(AsteriskQueueEntry entry) + { + synchronized (listeners) + { + for (AsteriskServerListener listener : listeners) + { + try + { + listener.onNewQueueEntry(entry); + } + catch (Exception e) + { + logger.warn("Exception in onNewQueueEntry()", e); + } + } + } + } } From fc4c0830646f0354df563592d686c3c48403b0e7 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Mon, 16 Jul 2012 09:31:55 +1000 Subject: [PATCH 0098/1055] Removed potential memory leak as listeners where not being removed if an exception was being thrown. --- .../internal/ManagerConnectionImpl.java | 2820 +++++++++-------- 1 file changed, 1417 insertions(+), 1403 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 0c1175020..8a387a28c 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -63,418 +63,418 @@ /** * Internal implemention of the ManagerConnection interface. - * + * * @author srt * @version $Id$ * @see org.asteriskjava.manager.ManagerConnectionFactory */ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher { - private static final int RECONNECTION_INTERVAL_1 = 50; - private static final int RECONNECTION_INTERVAL_2 = 5000; - private static final String DEFAULT_HOSTNAME = "localhost"; - private static final int DEFAULT_PORT = 5038; - private static final int RECONNECTION_VERSION_INTERVAL = 500; - private static final int MAX_VERSION_ATTEMPTS = 4; - private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); + private static final int RECONNECTION_INTERVAL_1 = 50; + private static final int RECONNECTION_INTERVAL_2 = 5000; + private static final String DEFAULT_HOSTNAME = "localhost"; + private static final int DEFAULT_PORT = 5038; + private static final int RECONNECTION_VERSION_INTERVAL = 500; + private static final int MAX_VERSION_ATTEMPTS = 4; + private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); private static final Pattern VERSION_PATTERN_1_6 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.6[-. ].*"); private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.8[-. ].*"); private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); - private static final AtomicLong idCounter = new AtomicLong(0); + private static final AtomicLong idCounter = new AtomicLong(0); - /** - * Instance logger. - */ - private final Log logger = LogFactory.getLog(getClass()); + /** + * Instance logger. + */ + private final Log logger = LogFactory.getLog(getClass()); - private final long id; + private final long id; - /** - * Used to construct the internalActionId. - */ - private AtomicLong actionIdCounter = new AtomicLong(0); + /** + * Used to construct the internalActionId. + */ + private AtomicLong actionIdCounter = new AtomicLong(0); - /* Config attributes */ - /** - * Hostname of the Asterisk server to connect to. - */ - private String hostname = DEFAULT_HOSTNAME; + /* Config attributes */ + /** + * Hostname of the Asterisk server to connect to. + */ + private String hostname = DEFAULT_HOSTNAME; - /** - * TCP port to connect to. - */ - private int port = DEFAULT_PORT; + /** + * TCP port to connect to. + */ + private int port = DEFAULT_PORT; - /** - * true to use SSL for the connection, false + /** + * true to use SSL for the connection, false * for a plain text connection. - */ - private boolean ssl = false; - - /** - * The username to use for login as defined in Asterisk's - * manager.conf. - */ - protected String username; - - /** - * The password to use for login as defined in Asterisk's - * manager.conf. - */ - protected String password; - - /** - * The default timeout to wait for a ManagerResponse after sending a - * ManagerAction. - */ - private long defaultResponseTimeout = 2000; - - /** - * The default timeout to wait for the last ResponseEvent after sending an - * EventGeneratingAction. - */ - private long defaultEventTimeout = 5000; - - /** - * The timeout to use when connecting the the Asterisk server. - */ - private int socketTimeout = 0; - - /** + */ + private boolean ssl = false; + + /** + * The username to use for login as defined in Asterisk's + * manager.conf. + */ + protected String username; + + /** + * The password to use for login as defined in Asterisk's + * manager.conf. + */ + protected String password; + + /** + * The default timeout to wait for a ManagerResponse after sending a + * ManagerAction. + */ + private long defaultResponseTimeout = 2000; + + /** + * The default timeout to wait for the last ResponseEvent after sending an + * EventGeneratingAction. + */ + private long defaultEventTimeout = 5000; + + /** + * The timeout to use when connecting the the Asterisk server. + */ + private int socketTimeout = 0; + + /** * Closes the connection (and reconnects) if no input has been read for the given amount * of milliseconds. A timeout of zero is interpreted as an infinite timeout. - * - * @see Socket#setSoTimeout(int) - */ - private int socketReadTimeout = 0; - - /** - * true to continue to reconnect after an authentication failure. - */ - private boolean keepAliveAfterAuthenticationFailure = true; - - /** - * The socket to use for TCP/IP communication with Asterisk. - */ - private SocketConnectionFacade socket; - - /** - * The thread that runs the reader. - */ - private Thread readerThread; - private final AtomicLong readerThreadCounter = new AtomicLong(0); - - private final AtomicLong reconnectThreadCounter = new AtomicLong(0); - - /** - * The reader to use to receive events and responses from asterisk. - */ - private ManagerReader reader; - - /** - * The writer to use to send actions to asterisk. - */ - private ManagerWriter writer; - - /** - * The protocol identifer Asterisk sends on connect wrapped into an object - * to be used as mutex. - */ - private final ProtocolIdentifierWrapper protocolIdentifier; - - /** - * The version of the Asterisk server we are connected to. - */ - private AsteriskVersion version; - - /** - * Contains the registered handlers that process the ManagerResponses. + * + * @see Socket#setSoTimeout(int) + */ + private int socketReadTimeout = 0; + + /** + * true to continue to reconnect after an authentication failure. + */ + private boolean keepAliveAfterAuthenticationFailure = true; + + /** + * The socket to use for TCP/IP communication with Asterisk. + */ + private SocketConnectionFacade socket; + + /** + * The thread that runs the reader. + */ + private Thread readerThread; + private final AtomicLong readerThreadCounter = new AtomicLong(0); + + private final AtomicLong reconnectThreadCounter = new AtomicLong(0); + + /** + * The reader to use to receive events and responses from asterisk. + */ + private ManagerReader reader; + + /** + * The writer to use to send actions to asterisk. + */ + private ManagerWriter writer; + + /** + * The protocol identifer Asterisk sends on connect wrapped into an object + * to be used as mutex. + */ + private final ProtocolIdentifierWrapper protocolIdentifier; + + /** + * The version of the Asterisk server we are connected to. + */ + private AsteriskVersion version; + + /** + * Contains the registered handlers that process the ManagerResponses. *
- * Key is the internalActionId of the Action sent and value the - * corresponding ResponseListener. - */ - private final Map responseListeners; - - /** - * Contains the event handlers that handle ResponseEvents for the - * sendEventGeneratingAction methods. + * Key is the internalActionId of the Action sent and value the + * corresponding ResponseListener. + */ + private final Map responseListeners; + + /** + * Contains the event handlers that handle ResponseEvents for the + * sendEventGeneratingAction methods. *
- * Key is the internalActionId of the Action sent and value the - * corresponding EventHandler. - */ - private final Map responseEventListeners; - - /** - * Contains the event handlers that users registered. - */ - private final List eventListeners; - - protected ManagerConnectionState state = INITIAL; - - private String eventMask; - - /** - * Creates a new instance. - */ - public ManagerConnectionImpl() - { - this.id = idCounter.getAndIncrement(); - this.responseListeners = new HashMap(); - this.responseEventListeners = new HashMap(); - this.eventListeners = new ArrayList(); - this.protocolIdentifier = new ProtocolIdentifierWrapper(); - } - - // the following two methods can be overriden when running test cases to - // return a mock object - protected ManagerReader createReader(Dispatcher dispatcher, Object source) - { - return new ManagerReaderImpl(dispatcher, source); - } - - protected ManagerWriter createWriter() - { - return new ManagerWriterImpl(); - } - - /** - * Sets the hostname of the asterisk server to connect to. + * Key is the internalActionId of the Action sent and value the + * corresponding EventHandler. + */ + private final Map responseEventListeners; + + /** + * Contains the event handlers that users registered. + */ + private final List eventListeners; + + protected ManagerConnectionState state = INITIAL; + + private String eventMask; + + /** + * Creates a new instance. + */ + public ManagerConnectionImpl() + { + this.id = idCounter.getAndIncrement(); + this.responseListeners = new HashMap(); + this.responseEventListeners = new HashMap(); + this.eventListeners = new ArrayList(); + this.protocolIdentifier = new ProtocolIdentifierWrapper(); + } + + // the following two methods can be overriden when running test cases to + // return a mock object + protected ManagerReader createReader(Dispatcher dispatcher, Object source) + { + return new ManagerReaderImpl(dispatcher, source); + } + + protected ManagerWriter createWriter() + { + return new ManagerWriterImpl(); + } + + /** + * Sets the hostname of the asterisk server to connect to. *
- * Default is localhost. - * + * Default is localhost. + * * @param hostname the hostname to connect to - */ - public void setHostname(String hostname) - { - this.hostname = hostname; - } - - /** - * Sets the port to use to connect to the asterisk server. This is the port - * specified in asterisk's manager.conf file. + */ + public void setHostname(String hostname) + { + this.hostname = hostname; + } + + /** + * Sets the port to use to connect to the asterisk server. This is the port + * specified in asterisk's manager.conf file. *
- * Default is 5038. - * + * Default is 5038. + * * @param port the port to connect to - */ - public void setPort(int port) - { - if (port <= 0) - { - this.port = DEFAULT_PORT; - } - else - { - this.port = port; - } - } - - /** - * Sets whether to use SSL. + */ + public void setPort(int port) + { + if (port <= 0) + { + this.port = DEFAULT_PORT; + } + else + { + this.port = port; + } + } + + /** + * Sets whether to use SSL. *
- * Default is false. - * + * Default is false. + * * @param ssl true to use SSL for the connection, - * false for a plain text connection. - * @since 0.3 - */ - public void setSsl(boolean ssl) - { - this.ssl = ssl; - } - - /** - * Sets the username to use to connect to the asterisk server. This is the - * username specified in asterisk's manager.conf file. - * + * false for a plain text connection. + * @since 0.3 + */ + public void setSsl(boolean ssl) + { + this.ssl = ssl; + } + + /** + * Sets the username to use to connect to the asterisk server. This is the + * username specified in asterisk's manager.conf file. + * * @param username the username to use for login - */ - public void setUsername(String username) - { - this.username = username; - } - - /** - * Sets the password to use to connect to the asterisk server. This is the - * password specified in Asterisk's manager.conf file. - * + */ + public void setUsername(String username) + { + this.username = username; + } + + /** + * Sets the password to use to connect to the asterisk server. This is the + * password specified in Asterisk's manager.conf file. + * * @param password the password to use for login - */ - public void setPassword(String password) - { - this.password = password; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendAction(ManagerAction)} will wait for a response before - * throwing a TimeoutException. + */ + public void setPassword(String password) + { + this.password = password; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendAction(ManagerAction)} will wait for a response before + * throwing a TimeoutException. *
- * Default is 2000. - * + * Default is 2000. + * * @param defaultResponseTimeout default response timeout in milliseconds - * @since 0.2 - */ - public void setDefaultResponseTimeout(long defaultResponseTimeout) - { - this.defaultResponseTimeout = defaultResponseTimeout; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a - * response and the last response event before throwing a TimeoutException. + * @since 0.2 + */ + public void setDefaultResponseTimeout(long defaultResponseTimeout) + { + this.defaultResponseTimeout = defaultResponseTimeout; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a + * response and the last response event before throwing a TimeoutException. *
- * Default is 5000. - * + * Default is 5000. + * * @param defaultEventTimeout default event timeout in milliseconds - * @since 0.2 - */ - public void setDefaultEventTimeout(long defaultEventTimeout) - { - this.defaultEventTimeout = defaultEventTimeout; - } - - /** + * @since 0.2 + */ + public void setDefaultEventTimeout(long defaultEventTimeout) + { + this.defaultEventTimeout = defaultEventTimeout; + } + + /** * Set to true to try reconnecting to ther asterisk serve * even if the reconnection attempt threw an AuthenticationFailedException. *
- * Default is true. - * - * @param keepAliveAfterAuthenticationFailure - * true to try reconnecting to ther asterisk serve + * Default is true. + * + * @param keepAliveAfterAuthenticationFailure + * true to try reconnecting to ther asterisk serve * even if the reconnection attempt threw an AuthenticationFailedException, * false otherwise. - */ - public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) - { - this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; - } - - /* Implementation of ManagerConnection interface */ - - public String getUsername() - { - return username; - } - - public String getPassword() - { - return password; - } - - public AsteriskVersion getVersion() - { - return version; - } - - public String getHostname() - { - return hostname; - } - - public int getPort() - { - return port; - } - - public boolean isSsl() - { - return ssl; - } - - public InetAddress getLocalAddress() - { - return socket.getLocalAddress(); - } - - public int getLocalPort() - { - return socket.getLocalPort(); - } - - public InetAddress getRemoteAddress() - { - return socket.getRemoteAddress(); - } - - public int getRemotePort() - { - return socket.getRemotePort(); - } - - public void registerUserEventClass(Class userEventClass) - { - if (reader == null) - { - reader = createReader(this, this); - } - - reader.registerEventClass(userEventClass); - } - - public void setSocketTimeout(int socketTimeout) - { - this.socketTimeout = socketTimeout; - } - - public void setSocketReadTimeout(int socketReadTimeout) - { - this.socketReadTimeout = socketReadTimeout; - } - - public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException - { - login(null); - } + */ + public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) + { + this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; + } + + /* Implementation of ManagerConnection interface */ + + public String getUsername() + { + return username; + } + + public String getPassword() + { + return password; + } + + public AsteriskVersion getVersion() + { + return version; + } + + public String getHostname() + { + return hostname; + } + + public int getPort() + { + return port; + } + + public boolean isSsl() + { + return ssl; + } + + public InetAddress getLocalAddress() + { + return socket.getLocalAddress(); + } + + public int getLocalPort() + { + return socket.getLocalPort(); + } + + public InetAddress getRemoteAddress() + { + return socket.getRemoteAddress(); + } + + public int getRemotePort() + { + return socket.getRemotePort(); + } + + public void registerUserEventClass(Class userEventClass) + { + if (reader == null) + { + reader = createReader(this, this); + } + + reader.registerEventClass(userEventClass); + } + + public void setSocketTimeout(int socketTimeout) + { + this.socketTimeout = socketTimeout; + } + + public void setSocketReadTimeout(int socketReadTimeout) + { + this.socketReadTimeout = socketReadTimeout; + } + + public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException + { + login(null); + } public synchronized void login(String eventMask) throws IOException, AuthenticationFailedException, TimeoutException - { - if (state != INITIAL && state != DISCONNECTED) - { - throw new IllegalStateException("Login may only be perfomed when in state " - + "INITIAL or DISCONNECTED, but connection is in state " + state); - } - - state = CONNECTING; - this.eventMask = eventMask; - try - { - doLogin(defaultResponseTimeout, eventMask); - } - finally - { - if (state != CONNECTED) - { - state = DISCONNECTED; - } - } - } - - /** - * Does the real login, following the steps outlined below. + { + if (state != INITIAL && state != DISCONNECTED) + { + throw new IllegalStateException("Login may only be perfomed when in state " + + "INITIAL or DISCONNECTED, but connection is in state " + state); + } + + state = CONNECTING; + this.eventMask = eventMask; + try + { + doLogin(defaultResponseTimeout, eventMask); + } + finally + { + if (state != CONNECTED) + { + state = DISCONNECTED; + } + } + } + + /** + * Does the real login, following the steps outlined below. *
- *

    - *
  1. Connects to the asterisk server by calling {@link #connect()} if not - * already connected - *
  2. Waits until the protocol identifier is received but not longer than - * timeout ms. - *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType - * MD5. - *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} - * is sent using the calculated key (MD5 hash of the password appended to - * the received challenge). - *
- * + *
    + *
  1. Connects to the asterisk server by calling {@link #connect()} if not + * already connected + *
  2. Waits until the protocol identifier is received but not longer than + * timeout ms. + *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType + * MD5. + *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} + * is sent using the calculated key (MD5 hash of the password appended to + * the received challenge). + *
+ * * @param timeout the maximum time to wait for the protocol identifier (in * ms) * @param eventMask the event mask. Set to "on" if all events should be * send, "off" if not events should be sent or a combination of - * "system", "call" and "log" (separated by ',') to specify what - * kind of events should be sent. + * "system", "call" and "log" (separated by ',') to specify what + * kind of events should be sent. * @throws IOException if there is an i/o problem. * @throws AuthenticationFailedException if username or password are * incorrect and the login action returns an error or if the MD5 @@ -482,1084 +482,1098 @@ public synchronized void login(String eventMask) throws IOException, Authenticat * case. * @throws TimeoutException if a timeout occurs while waiting for the * protocol identifier. The connection is closed in this case. - */ + */ protected synchronized void doLogin(long timeout, String eventMask) throws IOException, AuthenticationFailedException, TimeoutException - { - ChallengeAction challengeAction; - ManagerResponse challengeResponse; - String challenge; - String key; - LoginAction loginAction; - ManagerResponse loginResponse; - - if (socket == null) - { - connect(); - } - - synchronized (protocolIdentifier) - { - if (protocolIdentifier.value == null) - { - try - { - protocolIdentifier.wait(timeout); - } - catch (InterruptedException e) // NOPMD - { - Thread.currentThread().interrupt(); - } - } - - if (protocolIdentifier.value == null) - { - disconnect(); - if (reader != null && reader.getTerminationException() != null) - { - throw reader.getTerminationException(); - } - else - { - throw new TimeoutException("Timeout waiting for protocol identifier"); - } - } - } - - challengeAction = new ChallengeAction("MD5"); - try - { - challengeResponse = sendAction(challengeAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send challenge action", e); - } - - if (challengeResponse instanceof ChallengeResponse) - { - challenge = ((ChallengeResponse) challengeResponse).getChallenge(); - } - else - { - disconnect(); - throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " - + challengeResponse.getMessage()); - } - - try - { - MessageDigest md; - - md = MessageDigest.getInstance("MD5"); - if (challenge != null) - { - md.update(challenge.getBytes()); - } - if (password != null) - { - md.update(password.getBytes()); - } - key = ManagerUtil.toHexString(md.digest()); - } - catch (NoSuchAlgorithmException ex) - { - disconnect(); - throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); - } - - loginAction = new LoginAction(username, "MD5", key, eventMask); - try - { - loginResponse = sendAction(loginAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send login action", e); - } - - if (loginResponse instanceof ManagerError) - { - disconnect(); - throw new AuthenticationFailedException(loginResponse.getMessage()); - } - - logger.info("Successfully logged in"); - - version = determineVersion(); - - state = CONNECTED; - - writer.setTargetVersion(version); - - logger.info("Determined Asterisk version: " + version); - - // generate pseudo event indicating a successful login - ConnectEvent connectEvent = new ConnectEvent(this); - connectEvent.setProtocolIdentifier(getProtocolIdentifier()); - connectEvent.setDateReceived(DateUtil.getDate()); - // TODO could this cause a deadlock? - fireEvent(connectEvent); - } - - protected AsteriskVersion determineVersion() throws IOException, TimeoutException - { - int attempts = 0; - -// if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) -// { -// return AsteriskVersion.ASTERISK_1_6; -// } - - while (attempts++ < MAX_VERSION_ATTEMPTS) - { - final ManagerResponse showVersionFilesResponse; - final List showVersionFilesResult; - - // increase timeout as output is quite large + { + ChallengeAction challengeAction; + ManagerResponse challengeResponse; + String challenge; + String key; + LoginAction loginAction; + ManagerResponse loginResponse; + + if (socket == null) + { + connect(); + } + + synchronized (protocolIdentifier) + { + if (protocolIdentifier.value == null) + { + try + { + protocolIdentifier.wait(timeout); + } + catch (InterruptedException e) // NOPMD + { + Thread.currentThread().interrupt(); + } + } + + if (protocolIdentifier.value == null) + { + disconnect(); + if (reader != null && reader.getTerminationException() != null) + { + throw reader.getTerminationException(); + } + else + { + throw new TimeoutException("Timeout waiting for protocol identifier"); + } + } + } + + challengeAction = new ChallengeAction("MD5"); + try + { + challengeResponse = sendAction(challengeAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send challenge action", e); + } + + if (challengeResponse instanceof ChallengeResponse) + { + challenge = ((ChallengeResponse) challengeResponse).getChallenge(); + } + else + { + disconnect(); + throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " + + challengeResponse.getMessage()); + } + + try + { + MessageDigest md; + + md = MessageDigest.getInstance("MD5"); + if (challenge != null) + { + md.update(challenge.getBytes()); + } + if (password != null) + { + md.update(password.getBytes()); + } + key = ManagerUtil.toHexString(md.digest()); + } + catch (NoSuchAlgorithmException ex) + { + disconnect(); + throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); + } + + loginAction = new LoginAction(username, "MD5", key, eventMask); + try + { + loginResponse = sendAction(loginAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send login action", e); + } + + if (loginResponse instanceof ManagerError) + { + disconnect(); + throw new AuthenticationFailedException(loginResponse.getMessage()); + } + + logger.info("Successfully logged in"); + + version = determineVersion(); + + state = CONNECTED; + + writer.setTargetVersion(version); + + logger.info("Determined Asterisk version: " + version); + + // generate pseudo event indicating a successful login + ConnectEvent connectEvent = new ConnectEvent(this); + connectEvent.setProtocolIdentifier(getProtocolIdentifier()); + connectEvent.setDateReceived(DateUtil.getDate()); + // TODO could this cause a deadlock? + fireEvent(connectEvent); + } + + protected AsteriskVersion determineVersion() throws IOException, TimeoutException + { + int attempts = 0; + + // if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) + // { + // return AsteriskVersion.ASTERISK_1_6; + // } + + while (attempts++ < MAX_VERSION_ATTEMPTS) + { + final ManagerResponse showVersionFilesResponse; + final List showVersionFilesResult; + + // increase timeout as output is quite large showVersionFilesResponse = sendAction(new CommandAction("show version files pbx.c"), defaultResponseTimeout * 2); - if (!(showVersionFilesResponse instanceof CommandResponse)) - { - // return early in case of permission problems - // org.asteriskjava.manager.response.ManagerError: + if (!(showVersionFilesResponse instanceof CommandResponse)) + { + // return early in case of permission problems + // org.asteriskjava.manager.response.ManagerError: // actionId='null'; message='Permission denied'; response='Error'; - // uniqueId='null'; systemHashcode=15231583 - break; - } + // uniqueId='null'; systemHashcode=15231583 + break; + } - showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); - if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) - { + showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); + if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) + { final String line1 = showVersionFilesResult.get(0); if (line1.startsWith("File")) - { - final String rawVersion; - - rawVersion = getRawVersion(); - if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) - { - return AsteriskVersion.ASTERISK_1_4; - } - return AsteriskVersion.ASTERISK_1_2; - } - else if (line1.contains("No such command")) - { + { + final String rawVersion; + + rawVersion = getRawVersion(); + if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) + { + return AsteriskVersion.ASTERISK_1_4; + } + return AsteriskVersion.ASTERISK_1_2; + } + else if (line1 != null && line1.contains("No such command")) + { final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction("core show version"), defaultResponseTimeout * 2); - if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) - { + if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) + { final List coreShowVersionResult = ((CommandResponse) coreShowVersionResponse).getResult(); - if (coreShowVersionResult != null && coreShowVersionResult.size() > 0) - { - final String coreLine = coreShowVersionResult.get(0); - - if (VERSION_PATTERN_1_6.matcher(coreLine).matches()) - { - return AsteriskVersion.ASTERISK_1_6; - } - else if (VERSION_PATTERN_1_8.matcher(coreLine).matches()) - { - return AsteriskVersion.ASTERISK_1_8; - } - else if (VERSION_PATTERN_10.matcher(coreLine).matches()) - { - return AsteriskVersion.ASTERISK_10; - } - else if (VERSION_PATTERN_11.matcher(coreLine).matches()) - { - return AsteriskVersion.ASTERISK_11; - } - } - } - - try - { - Thread.sleep(RECONNECTION_VERSION_INTERVAL); - } - catch (Exception ex) - { - // ingnore - } // NOPMD - } - else - { + if (coreShowVersionResult != null && coreShowVersionResult.size() > 0) + { + final String coreLine = coreShowVersionResult.get(0); + + if (coreLine != null) + { + if (VERSION_PATTERN_1_6.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_1_6; + } + else if (VERSION_PATTERN_1_8.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_1_8; + } + else if (VERSION_PATTERN_10.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_10; + } + else if (VERSION_PATTERN_11.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_11; + } + } + } + } + + try + { + Thread.sleep(RECONNECTION_VERSION_INTERVAL); + } + catch (Exception ex) + { + // ingnore + } // NOPMD + } + else + { // if it isn't the "no such command", break and return the lowest version immediately - break; - } - } - } - - // as a fallback assume 1.6 - return AsteriskVersion.ASTERISK_1_6; - } - - protected String getRawVersion() - { - final ManagerResponse showVersionResponse; - - try - { - showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); - } - catch (Exception e) - { - return null; - } - - if (showVersionResponse instanceof CommandResponse) - { - final List showVersionResult; - - showVersionResult = ((CommandResponse) showVersionResponse).getResult(); - if (showVersionResult != null && showVersionResult.size() > 0) - { - return showVersionResult.get(0); - } - } - - return null; - } - - protected synchronized void connect() throws IOException - { - logger.info("Connecting to " + hostname + ":" + port); - - if (reader == null) - { - logger.debug("Creating reader for " + hostname + ":" + port); - reader = createReader(this, this); - } - - if (writer == null) - { - logger.debug("Creating writer"); - writer = createWriter(); - } - - logger.debug("Creating socket"); - socket = createSocket(); - - logger.debug("Passing socket to reader"); - reader.setSocket(socket); - - if (readerThread == null || !readerThread.isAlive() || reader.isDead()) - { - logger.debug("Creating and starting reader thread"); - readerThread = new Thread(reader); - readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" - + readerThreadCounter.getAndIncrement()); - readerThread.setDaemon(true); - readerThread.start(); - } - - logger.debug("Passing socket to writer"); - writer.setSocket(socket); - } - - protected SocketConnectionFacade createSocket() throws IOException - { - return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); - } - - public synchronized void logoff() throws IllegalStateException - { - if (state != CONNECTED && state != RECONNECTING) - { - throw new IllegalStateException("Logoff may only be perfomed when in state " - + "CONNECTED or RECONNECTING, but connection is in state " + state); - } - - state = DISCONNECTING; - - if (socket != null) - { - try - { - sendAction(new LogoffAction()); - } - catch (Exception e) - { - logger.warn("Unable to send LogOff action", e); - } - } - cleanup(); - state = DISCONNECTED; - } - - /** - * Closes the socket connection. - */ - protected synchronized void disconnect() - { - if (socket != null) - { - logger.info("Closing socket."); - try - { - socket.close(); - } - catch (IOException ex) - { - logger.warn("Unable to close socket: " + ex.getMessage()); - } - socket = null; - } - protocolIdentifier.value = null; - } + break; + } + } + } + + // as a fallback assume 1.6 + return AsteriskVersion.ASTERISK_1_6; + } + + protected String getRawVersion() + { + final ManagerResponse showVersionResponse; + + try + { + showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); + } + catch (Exception e) + { + return null; + } + + if (showVersionResponse instanceof CommandResponse) + { + final List showVersionResult; + + showVersionResult = ((CommandResponse) showVersionResponse).getResult(); + if (showVersionResult != null && showVersionResult.size() > 0) + { + return showVersionResult.get(0); + } + } + + return null; + } + + protected synchronized void connect() throws IOException + { + logger.info("Connecting to " + hostname + ":" + port); + + if (reader == null) + { + logger.debug("Creating reader for " + hostname + ":" + port); + reader = createReader(this, this); + } + + if (writer == null) + { + logger.debug("Creating writer"); + writer = createWriter(); + } + + logger.debug("Creating socket"); + socket = createSocket(); + + logger.debug("Passing socket to reader"); + reader.setSocket(socket); + + if (readerThread == null || !readerThread.isAlive() || reader.isDead()) + { + logger.debug("Creating and starting reader thread"); + readerThread = new Thread(reader); + readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" + + readerThreadCounter.getAndIncrement()); + readerThread.setDaemon(true); + readerThread.start(); + } + + logger.debug("Passing socket to writer"); + writer.setSocket(socket); + } + + protected SocketConnectionFacade createSocket() throws IOException + { + return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); + } + + public synchronized void logoff() throws IllegalStateException + { + if (state != CONNECTED && state != RECONNECTING) + { + throw new IllegalStateException("Logoff may only be perfomed when in state " + + "CONNECTED or RECONNECTING, but connection is in state " + state); + } + + state = DISCONNECTING; + + if (socket != null) + { + try + { + sendAction(new LogoffAction()); + } + catch (Exception e) + { + logger.warn("Unable to send LogOff action", e); + } + } + cleanup(); + state = DISCONNECTED; + } + + /** + * Closes the socket connection. + */ + protected synchronized void disconnect() + { + if (socket != null) + { + logger.info("Closing socket."); + try + { + socket.close(); + } + catch (IOException ex) + { + logger.warn("Unable to close socket: " + ex.getMessage()); + } + socket = null; + } + protocolIdentifier.value = null; + } public ManagerResponse sendAction(ManagerAction action) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException - { - return sendAction(action, defaultResponseTimeout); - } - - /* - * Implements synchronous sending of "simple" actions. - */ - public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, - IllegalArgumentException, IllegalStateException - { - ResponseHandlerResult result; - SendActionCallback callbackHandler; - - result = new ResponseHandlerResult(); - callbackHandler = new DefaultSendActionCallback(result); - - synchronized (result) - { - sendAction(action, callbackHandler); - - // definitely return null for the response of user events - if (action instanceof UserEventAction) - { - return null; - } - - // only wait if we did not yet receive the response. - // Responses may be returned really fast. - if (result.getResponse() == null) - { - try - { - result.wait(timeout); - } - catch (InterruptedException ex) - { - logger.warn("Interrupted while waiting for result"); - Thread.currentThread().interrupt(); - } - } - } - - // still no response? - if (result.getResponse() == null) - { - throw new TimeoutException("Timeout waiting for response to " + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); - } - - return result.getResponse(); - } + { + return sendAction(action, defaultResponseTimeout); + } + + /* + * Implements synchronous sending of "simple" actions. + */ + public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, + IllegalArgumentException, IllegalStateException + { + ResponseHandlerResult result; + SendActionCallback callbackHandler; + + result = new ResponseHandlerResult(); + callbackHandler = new DefaultSendActionCallback(result); + + synchronized (result) + { + sendAction(action, callbackHandler); + + // definitely return null for the response of user events + if (action instanceof UserEventAction) + { + return null; + } + + // only wait if we did not yet receive the response. + // Responses may be returned really fast. + if (result.getResponse() == null) + { + try + { + result.wait(timeout); + } + catch (InterruptedException ex) + { + logger.warn("Interrupted while waiting for result"); + Thread.currentThread().interrupt(); + } + } + } + + // still no response? + if (result.getResponse() == null) + { + throw new TimeoutException("Timeout waiting for response to " + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); + } + + return result.getResponse(); + } public void sendAction(ManagerAction action, SendActionCallback callback) throws IOException, IllegalArgumentException, IllegalStateException - { - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - - // In general sending actions is only allowed while connected, though - // there are a few exceptions, these are handled here: - if ((state == CONNECTING || state == RECONNECTING) - && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) - { - // when (re-)connecting challenge and login actions are ok. - } // NOPMD - else if (state == DISCONNECTING && action instanceof LogoffAction) - { - // when disconnecting logoff action is ok. - } // NOPMD - else if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED, but connection is in state " + state); - } - - if (socket == null) - { - throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); - } - - internalActionId = createInternalActionId(); - - // if the callbackHandler is null the user is obviously not interested - // in the response, thats fine. - if (callback != null) - { - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, callback); - } - } - - Class responseClass = getExpectedResponseClass(action.getClass()); - if (responseClass != null) - { - reader.expectResponseClass(internalActionId, responseClass); - } - - writer.sendAction(action, internalActionId); - } - - boolean isShowVersionCommandAction(ManagerAction action) - { + { + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + + // In general sending actions is only allowed while connected, though + // there are a few exceptions, these are handled here: + if ((state == CONNECTING || state == RECONNECTING) + && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) + { + // when (re-)connecting challenge and login actions are ok. + } // NOPMD + else if (state == DISCONNECTING && action instanceof LogoffAction) + { + // when disconnecting logoff action is ok. + } // NOPMD + else if (state != CONNECTED) + { + throw new IllegalStateException("Actions may only be sent when in state " + + "CONNECTED, but connection is in state " + state); + } + + if (socket == null) + { + throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); + } + + internalActionId = createInternalActionId(); + + // if the callbackHandler is null the user is obviously not interested + // in the response, thats fine. + if (callback != null) + { + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, callback); + } + } + + Class responseClass = getExpectedResponseClass(action.getClass()); + if (responseClass != null) + { + reader.expectResponseClass(internalActionId, responseClass); + } + + writer.sendAction(action, internalActionId); + } + + boolean isShowVersionCommandAction(ManagerAction action) + { if (! (action instanceof CommandAction)) { - return false; - } - final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction)action).getCommand()); - return showVersionMatcher.matches(); - } - - private Class getExpectedResponseClass(Class actionClass) - { - final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); - if (annotation == null) - { - return null; - } - - return annotation.value(); - } + return false; + } + final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction) action).getCommand()); + return showVersionMatcher.matches(); + } + + private Class getExpectedResponseClass(Class actionClass) + { + final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); + if (annotation == null) + { + return null; + } + + return annotation.value(); + } public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws IOException, EventTimeoutException, IllegalArgumentException, IllegalStateException - { - return sendEventGeneratingAction(action, defaultEventTimeout); - } - - /* - * Implements synchronous sending of event generating actions. - */ - public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, - EventTimeoutException, IllegalArgumentException, IllegalStateException - { - final ResponseEventsImpl responseEvents; - final ResponseEventHandler responseEventHandler; - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - else if (action.getActionCompleteEventClass() == null) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " - + action.getClass().getName() + " is null."); - } - else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" - + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() - + " is not a ResponseEvent."); - } - - if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED but connection is in state " + state); - } - - responseEvents = new ResponseEventsImpl(); - responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); - - internalActionId = createInternalActionId(); - - // register response handler... - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, responseEventHandler); - } - - // ...and event handler. - synchronized (this.responseEventListeners) - { - this.responseEventListeners.put(internalActionId, responseEventHandler); - } - - synchronized (responseEvents) - { - writer.sendAction(action, internalActionId); - // only wait if response has not yet arrived. - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - try - { - responseEvents.wait(timeout); - } - catch (InterruptedException e) - { - logger.warn("Interrupted while waiting for response events."); - Thread.currentThread().interrupt(); - } - } - } - - // still no response or not all events received and timed out? - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - // clean up - synchronized (this.responseEventListeners) - { - this.responseEventListeners.remove(internalActionId); - } - - throw new EventTimeoutException("Timeout waiting for response or response events to " + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), responseEvents); - } - - // remove the event handler - // Note: The response handler has already been removed - // when the response was received - synchronized (this.responseEventListeners) - { - this.responseEventListeners.remove(internalActionId); - } - - return responseEvents; - } - - /** - * Creates a new unique internal action id based on the hash code of this - * connection and a sequence. - * - * @return a new internal action id - * @see ManagerUtil#addInternalActionId(String,String) - * @see ManagerUtil#getInternalActionId(String) - * @see ManagerUtil#stripInternalActionId(String) - */ - private String createInternalActionId() - { - final StringBuffer sb; - - sb = new StringBuffer(); - sb.append(this.hashCode()); - sb.append("_"); - sb.append(actionIdCounter.getAndIncrement()); - - return sb.toString(); - } - - public void addEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - // only add it if its not already there - if (!this.eventListeners.contains(listener)) - { - this.eventListeners.add(listener); - } - } - } - - public void removeEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - if (this.eventListeners.contains(listener)) - { - this.eventListeners.remove(listener); - } - } - } - - public String getProtocolIdentifier() - { - return protocolIdentifier.value; - } - - public ManagerConnectionState getState() - { - return state; - } - - /* Implementation of Dispatcher: callbacks for ManagerReader */ - - /** - * This method is called by the reader whenever a {@link ManagerResponse} is - * received. The response is dispatched to the associated - * {@link SendActionCallback}. - * + { + return sendEventGeneratingAction(action, defaultEventTimeout); + } + + /* + * Implements synchronous sending of event generating actions. + */ + public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, + EventTimeoutException, IllegalArgumentException, IllegalStateException + { + final ResponseEventsImpl responseEvents; + final ResponseEventHandler responseEventHandler; + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + else if (action.getActionCompleteEventClass() == null) + { + throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " + + action.getClass().getName() + " is null."); + } + else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) + { + throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" + + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() + + " is not a ResponseEvent."); + } + + if (state != CONNECTED) + { + throw new IllegalStateException("Actions may only be sent when in state " + + "CONNECTED but connection is in state " + state); + } + + responseEvents = new ResponseEventsImpl(); + responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); + + internalActionId = createInternalActionId(); + + try + { + // register response handler... + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, responseEventHandler); + } + + // ...and event handler. + synchronized (this.responseEventListeners) + { + this.responseEventListeners.put(internalActionId, responseEventHandler); + } + + synchronized (responseEvents) + { + writer.sendAction(action, internalActionId); + // only wait if response has not yet arrived. + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + try + { + responseEvents.wait(timeout); + } + catch (InterruptedException e) + { + logger.warn("Interrupted while waiting for response events."); + Thread.currentThread().interrupt(); + } + } + } + + // still no response or not all events received and timed out? + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + throw new EventTimeoutException("Timeout waiting for response or response events to " + + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), + responseEvents); + } + + } + finally + { + // remove the event handler + synchronized (this.responseEventListeners) + { + this.responseEventListeners.remove(internalActionId); + } + + + // Note: The response handler should have already been removed + // when the response was received, however we remove it here + // just in case it was never received. + synchronized (this.responseListeners) + { + this.responseListeners.remove(internalActionId); + } + + } + + return responseEvents; + } + + /** + * Creates a new unique internal action id based on the hash code of this + * connection and a sequence. + * + * @return a new internal action id + * @see ManagerUtil#addInternalActionId(String,String) + * @see ManagerUtil#getInternalActionId(String) + * @see ManagerUtil#stripInternalActionId(String) + */ + private String createInternalActionId() + { + final StringBuffer sb; + + sb = new StringBuffer(); + sb.append(this.hashCode()); + sb.append("_"); + sb.append(actionIdCounter.getAndIncrement()); + + return sb.toString(); + } + + public void addEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + // only add it if its not already there + if (!this.eventListeners.contains(listener)) + { + this.eventListeners.add(listener); + } + } + } + + public void removeEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + if (this.eventListeners.contains(listener)) + { + this.eventListeners.remove(listener); + } + } + } + + public String getProtocolIdentifier() + { + return protocolIdentifier.value; + } + + public ManagerConnectionState getState() + { + return state; + } + + /* Implementation of Dispatcher: callbacks for ManagerReader */ + + /** + * This method is called by the reader whenever a {@link ManagerResponse} is + * received. The response is dispatched to the associated + * {@link SendActionCallback}. + * * @param response the response received by the reader - * @see ManagerReader - */ - public void dispatchResponse(ManagerResponse response) - { - final String actionId; - String internalActionId; - SendActionCallback listener; - - // shouldn't happen - if (response == null) - { - logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); - return; - } - - actionId = response.getActionId(); - internalActionId = null; - listener = null; - - if (actionId != null) - { - internalActionId = ManagerUtil.getInternalActionId(actionId); - response.setActionId(ManagerUtil.stripInternalActionId(actionId)); - } - - logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); - - if (internalActionId != null) - { - synchronized (this.responseListeners) - { - listener = responseListeners.get(internalActionId); - if (listener != null) - { - this.responseListeners.remove(internalActionId); - } - else - { - // when using the async sendAction it's ok not to register a - // callback so if we don't find a response handler thats ok - logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); - } - } - } - else - { + * @see ManagerReader + */ + public void dispatchResponse(ManagerResponse response) + { + final String actionId; + String internalActionId; + SendActionCallback listener; + + // shouldn't happen + if (response == null) + { + logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); + return; + } + + actionId = response.getActionId(); + internalActionId = null; + listener = null; + + if (actionId != null) + { + internalActionId = ManagerUtil.getInternalActionId(actionId); + response.setActionId(ManagerUtil.stripInternalActionId(actionId)); + } + + logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); + + if (internalActionId != null) + { + synchronized (this.responseListeners) + { + listener = responseListeners.get(internalActionId); + if (listener != null) + { + this.responseListeners.remove(internalActionId); + } + else + { + // when using the async sendAction it's ok not to register a + // callback so if we don't find a response handler thats ok + logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); + } + } + } + else + { logger.error("Unable to retrieve internalActionId from response: " + "actionId '" + actionId + "':\n" + response); - } - - if (listener != null) - { - try - { - listener.onResponse(response); - } - catch (Exception e) - { - logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); - } - } - } - - /** - * This method is called by the reader whenever a ManagerEvent is received. - * The event is dispatched to all registered ManagerEventHandlers. - * + } + + if (listener != null) + { + try + { + listener.onResponse(response); + } + catch (Exception e) + { + logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); + } + } + } + + /** + * This method is called by the reader whenever a ManagerEvent is received. + * The event is dispatched to all registered ManagerEventHandlers. + * * @param event the event received by the reader - * @see #addEventListener(ManagerEventListener) - * @see #removeEventListener(ManagerEventListener) - * @see ManagerReader - */ - public void dispatchEvent(ManagerEvent event) - { - // shouldn't happen - if (event == null) - { - logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); - return; - } - - logger.debug("Dispatching event:\n" + event.toString()); - - // Some events need special treatment besides forwarding them to the - // registered eventListeners (clients) - // These events are handled here at first: - - // Dispatch ResponseEvents to the appropriate responseEventListener - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - String internalActionId; - - responseEvent = (ResponseEvent) event; - internalActionId = responseEvent.getInternalActionId(); - if (internalActionId != null) - { - synchronized (responseEventListeners) - { - ManagerEventListener listener; - - listener = responseEventListeners.get(internalActionId); - if (listener != null) - { - try - { - listener.onManagerEvent(event); - } - catch (Exception e) - { + * @see #addEventListener(ManagerEventListener) + * @see #removeEventListener(ManagerEventListener) + * @see ManagerReader + */ + public void dispatchEvent(ManagerEvent event) + { + // shouldn't happen + if (event == null) + { + logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); + return; + } + + logger.debug("Dispatching event:\n" + event.toString()); + + // Some events need special treatment besides forwarding them to the + // registered eventListeners (clients) + // These events are handled here at first: + + // Dispatch ResponseEvents to the appropriate responseEventListener + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + String internalActionId; + + responseEvent = (ResponseEvent) event; + internalActionId = responseEvent.getInternalActionId(); + if (internalActionId != null) + { + synchronized (responseEventListeners) + { + ManagerEventListener listener; + + listener = responseEventListeners.get(internalActionId); + if (listener != null) + { + try + { + listener.onManagerEvent(event); + } + catch (Exception e) + { logger.warn("Unexpected exception in response event listener " + listener.getClass().getName(), e); - } - } - } - } - else - { - // ResponseEvent without internalActionId: - // this happens if the same event class is used as response - // event - // and as an event that is not triggered by a Manager command - // Example: QueueMemberStatusEvent. - // logger.debug("ResponseEvent without " - // + "internalActionId:\n" + responseEvent); - } // NOPMD - } - if (event instanceof DisconnectEvent) - { - // When we receive get disconnected while we are connected start - // a new reconnect thread and set the state to RECONNECTING. - if (state == CONNECTED) - { - state = RECONNECTING; - // close socket if still open and remove reference to - // readerThread - // After sending the DisconnectThread that thread will die - // anyway. - cleanup(); - Thread reconnectThread = new Thread(new Runnable() - { - public void run() - { - reconnect(); - } - }); - reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" - + reconnectThreadCounter.getAndIncrement()); - reconnectThread.setDaemon(true); - reconnectThread.start(); - // now the DisconnectEvent is dispatched to registered - // eventListeners - // (clients) and after that the ManagerReaderThread is gone. - // So effectively we replaced the reader thread by a - // ReconnectThread. - } - else - { - // when we receive a DisconnectEvent while not connected we - // ignore it and do not send it to clients - return; - } - } - if (event instanceof ProtocolIdentifierReceivedEvent) - { - ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; - String protocolIdentifier; - - protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; - protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); - setProtocolIdentifier(protocolIdentifier); - // no need to send this event to clients - return; - } - - fireEvent(event); - } - - /** - * Notifies all {@link ManagerEventListener}s registered by users. - * + } + } + } + } + else + { + // ResponseEvent without internalActionId: + // this happens if the same event class is used as response + // event + // and as an event that is not triggered by a Manager command + // Example: QueueMemberStatusEvent. + // logger.debug("ResponseEvent without " + // + "internalActionId:\n" + responseEvent); + } // NOPMD + } + if (event instanceof DisconnectEvent) + { + // When we receive get disconnected while we are connected start + // a new reconnect thread and set the state to RECONNECTING. + if (state == CONNECTED) + { + state = RECONNECTING; + // close socket if still open and remove reference to + // readerThread + // After sending the DisconnectThread that thread will die + // anyway. + cleanup(); + Thread reconnectThread = new Thread(new Runnable() + { + public void run() + { + reconnect(); + } + }); + reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" + + reconnectThreadCounter.getAndIncrement()); + reconnectThread.setDaemon(true); + reconnectThread.start(); + // now the DisconnectEvent is dispatched to registered + // eventListeners + // (clients) and after that the ManagerReaderThread is gone. + // So effectively we replaced the reader thread by a + // ReconnectThread. + } + else + { + // when we receive a DisconnectEvent while not connected we + // ignore it and do not send it to clients + return; + } + } + if (event instanceof ProtocolIdentifierReceivedEvent) + { + ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; + String protocolIdentifier; + + protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; + protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); + setProtocolIdentifier(protocolIdentifier); + // no need to send this event to clients + return; + } + + fireEvent(event); + } + + /** + * Notifies all {@link ManagerEventListener}s registered by users. + * * @param event the event to propagate - */ - private void fireEvent(ManagerEvent event) - { - synchronized (eventListeners) - { - for (ManagerEventListener listener : eventListeners) - { - try - { - listener.onManagerEvent(event); - } - catch (RuntimeException e) - { - logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); - } - } - } - } - - /** - * This method is called when a {@link ProtocolIdentifierReceivedEvent} is - * received from the reader. Having received a correct protocol identifier - * is the precodition for logging in. - * + */ + private void fireEvent(ManagerEvent event) + { + synchronized (eventListeners) + { + for (ManagerEventListener listener : eventListeners) + { + try + { + listener.onManagerEvent(event); + } + catch (RuntimeException e) + { + logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); + } + } + } + } + + /** + * This method is called when a {@link ProtocolIdentifierReceivedEvent} is + * received from the reader. Having received a correct protocol identifier + * is the precodition for logging in. + * * @param identifier the protocol version used by the Asterisk server. - */ - private void setProtocolIdentifier(final String identifier) - { - logger.info("Connected via " + identifier); + */ + private void setProtocolIdentifier(final String identifier) + { + logger.info("Connected via " + identifier); - if (!"Asterisk Call Manager/1.0".equals(identifier) + if (!"Asterisk Call Manager/1.0".equals(identifier) && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk 1.6 && !"Asterisk Call Manager/1.2".equals(identifier) // bri stuffed && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk 11 && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) - && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) - { - logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); - } - - synchronized (protocolIdentifier) - { - protocolIdentifier.value = identifier; - protocolIdentifier.notifyAll(); - } - } - - /** - * Reconnects to the asterisk server when the connection is lost. + && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) + { + logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); + } + + synchronized (protocolIdentifier) + { + protocolIdentifier.value = identifier; + protocolIdentifier.notifyAll(); + } + } + + /** + * Reconnects to the asterisk server when the connection is lost. *
- * While keepAlive is true we will try to reconnect. - * Reconnection attempts will be stopped when the {@link #logoff()} method - * is called or when the login after a successful reconnect results in an - * {@link AuthenticationFailedException} suggesting that the manager - * credentials have changed and keepAliveAfterAuthenticationFailure is not - * set. + * While keepAlive is true we will try to reconnect. + * Reconnection attempts will be stopped when the {@link #logoff()} method + * is called or when the login after a successful reconnect results in an + * {@link AuthenticationFailedException} suggesting that the manager + * credentials have changed and keepAliveAfterAuthenticationFailure is not + * set. *
- * This method is called when a {@link DisconnectEvent} is received from the - * reader. - */ - private void reconnect() - { - int numTries; - - // try to reconnect - numTries = 0; - while (state == RECONNECTING) - { - try - { - if (numTries < 10) - { - // try to reconnect quite fast for the firt 10 times - // this succeeds if the server has just been restarted - Thread.sleep(RECONNECTION_INTERVAL_1); - } - else - { - // slow down after 10 unsuccessful attempts asuming a - // shutdown of the server - Thread.sleep(RECONNECTION_INTERVAL_2); - } - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - } - - try - { - connect(); - - try - { - doLogin(defaultResponseTimeout, eventMask); - logger.info("Successfully reconnected."); - // everything is ok again, so we leave - // when successful doLogin set the state to CONNECTED so no - // need to adjust it - break; - } - catch (AuthenticationFailedException e1) - { - if (keepAliveAfterAuthenticationFailure) - { - logger.error("Unable to log in after reconnect: " + e1.getMessage()); - } - else - { - logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); - state = DISCONNECTED; - } - } - catch (TimeoutException e1) - { - // shouldn't happen - but happens! - logger.error("TimeoutException while trying to log in " + "after reconnect."); - } - } - catch (IOException e) - { - // server seems to be still down, just continue to attempt - // reconnection - logger.warn("Exception while trying to reconnect: " + e.getMessage()); - } - numTries++; - } - } - - private void cleanup() - { - disconnect(); - this.readerThread = null; - } - - @Override - public String toString() - { - StringBuffer sb; - - sb = new StringBuffer("ManagerConnection["); - sb.append("id='").append(id).append("',"); - sb.append("hostname='").append(hostname).append("',"); - sb.append("port=").append(port).append(","); - sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); - - return sb.toString(); - } - - /* Helper classes */ - - /** - * A simple data object to store a ManagerResult. - */ - private static class ResponseHandlerResult implements Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 7831097958568769220L; - private ManagerResponse response; - - public ResponseHandlerResult() - { - } - - public ManagerResponse getResponse() - { - return this.response; - } - - public void setResponse(ManagerResponse response) - { - this.response = response; - } - } - - /** - * A simple response handler that stores the received response in a - * ResponseHandlerResult for further processing. - */ - private static class DefaultSendActionCallback implements SendActionCallback, Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 2926598671855316803L; - private final ResponseHandlerResult result; - - /** - * Creates a new instance. - * + * This method is called when a {@link DisconnectEvent} is received from the + * reader. + */ + private void reconnect() + { + int numTries; + + // try to reconnect + numTries = 0; + while (state == RECONNECTING) + { + try + { + if (numTries < 10) + { + // try to reconnect quite fast for the firt 10 times + // this succeeds if the server has just been restarted + Thread.sleep(RECONNECTION_INTERVAL_1); + } + else + { + // slow down after 10 unsuccessful attempts asuming a + // shutdown of the server + Thread.sleep(RECONNECTION_INTERVAL_2); + } + } + catch (InterruptedException e) + { + Thread.currentThread().interrupt(); + } + + try + { + connect(); + + try + { + doLogin(defaultResponseTimeout, eventMask); + logger.info("Successfully reconnected."); + // everything is ok again, so we leave + // when successful doLogin set the state to CONNECTED so no + // need to adjust it + break; + } + catch (AuthenticationFailedException e1) + { + if (keepAliveAfterAuthenticationFailure) + { + logger.error("Unable to log in after reconnect: " + e1.getMessage()); + } + else + { + logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); + state = DISCONNECTED; + } + } + catch (TimeoutException e1) + { + // shouldn't happen - but happens! + logger.error("TimeoutException while trying to log in " + "after reconnect."); + } + } + catch (IOException e) + { + // server seems to be still down, just continue to attempt + // reconnection + logger.warn("Exception while trying to reconnect: " + e.getMessage()); + } + numTries++; + } + } + + private void cleanup() + { + disconnect(); + this.readerThread = null; + } + + @Override + public String toString() + { + StringBuffer sb; + + sb = new StringBuffer("ManagerConnection["); + sb.append("id='").append(id).append("',"); + sb.append("hostname='").append(hostname).append("',"); + sb.append("port=").append(port).append(","); + sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); + + return sb.toString(); + } + + /* Helper classes */ + + /** + * A simple data object to store a ManagerResult. + */ + private static class ResponseHandlerResult implements Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 7831097958568769220L; + private ManagerResponse response; + + public ResponseHandlerResult() + { + } + + public ManagerResponse getResponse() + { + return this.response; + } + + public void setResponse(ManagerResponse response) + { + this.response = response; + } + } + + /** + * A simple response handler that stores the received response in a + * ResponseHandlerResult for further processing. + */ + private static class DefaultSendActionCallback implements SendActionCallback, Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 2926598671855316803L; + private final ResponseHandlerResult result; + + /** + * Creates a new instance. + * * @param result the result to store the response in - */ - public DefaultSendActionCallback(ResponseHandlerResult result) - { - this.result = result; - } - - public void onResponse(ManagerResponse response) - { - synchronized (result) - { - result.setResponse(response); - result.notifyAll(); - } - } - } - - /** - * A combinded event and response handler that adds received events and the - * response to a ResponseEvents object. - */ - private static class ResponseEventHandler implements ManagerEventListener, SendActionCallback - { - private final ResponseEventsImpl events; - private final Class actionCompleteEventClass; - - /** - * Creates a new instance. - * + */ + public DefaultSendActionCallback(ResponseHandlerResult result) + { + this.result = result; + } + + public void onResponse(ManagerResponse response) + { + synchronized (result) + { + result.setResponse(response); + result.notifyAll(); + } + } + } + + /** + * A combinded event and response handler that adds received events and the + * response to a ResponseEvents object. + */ + private static class ResponseEventHandler implements ManagerEventListener, SendActionCallback + { + private final ResponseEventsImpl events; + private final Class actionCompleteEventClass; + + /** + * Creates a new instance. + * * @param events the ResponseEventsImpl to store the events in * @param actionCompleteEventClass the type of event that indicates that * all events have been received - */ - public ResponseEventHandler(ResponseEventsImpl events, Class actionCompleteEventClass) - { - this.events = events; - this.actionCompleteEventClass = actionCompleteEventClass; - } - - public void onManagerEvent(ManagerEvent event) - { - synchronized (events) - { - // should always be a ResponseEvent, anyway... - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - - responseEvent = (ResponseEvent) event; - events.addEvent(responseEvent); - } - - // finished? - if (actionCompleteEventClass.isAssignableFrom(event.getClass())) - { - events.setComplete(true); - // notify if action complete event and response have been - // received - if (events.getResponse() != null) - { - events.notifyAll(); - } - } - } - } - - public void onResponse(ManagerResponse response) - { - synchronized (events) - { - events.setRepsonse(response); - if (response instanceof ManagerError) - { - events.setComplete(true); - } - - // finished? - // notify if action complete event and response have been - // received - if (events.isComplete()) - { - events.notifyAll(); - } - } - } - } - - private static class ProtocolIdentifierWrapper - { - String value; - } + */ + public ResponseEventHandler(ResponseEventsImpl events, Class actionCompleteEventClass) + { + this.events = events; + this.actionCompleteEventClass = actionCompleteEventClass; + } + + public void onManagerEvent(ManagerEvent event) + { + synchronized (events) + { + // should always be a ResponseEvent, anyway... + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + + responseEvent = (ResponseEvent) event; + events.addEvent(responseEvent); + } + + // finished? + if (actionCompleteEventClass.isAssignableFrom(event.getClass())) + { + events.setComplete(true); + // notify if action complete event and response have been + // received + if (events.getResponse() != null) + { + events.notifyAll(); + } + } + } + } + + public void onResponse(ManagerResponse response) + { + synchronized (events) + { + events.setRepsonse(response); + if (response instanceof ManagerError) + { + events.setComplete(true); + } + + // finished? + // notify if action complete event and response have been + // received + if (events.isComplete()) + { + events.notifyAll(); + } + } + } + } + + private static class ProtocolIdentifierWrapper + { + String value; + } + } From 0ab2997edc8bddbd2ba0b1c5a82bb70daadc8e26 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Thu, 19 Jul 2012 12:44:10 +1000 Subject: [PATCH 0099/1055] Added chainlistener so that we can coherently deal with channel renames and masq events. --- .../org/asteriskjava/live/AsteriskServer.java | 27 +++++ .../live/DefaultAsteriskServer.java | 98 +++++++++++-------- .../live/internal/AsteriskServerImpl.java | 2 +- .../manager/action/SipPeersAction.java | 2 + 4 files changed, 86 insertions(+), 43 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/AsteriskServer.java b/src/main/java/org/asteriskjava/live/AsteriskServer.java index 360de0872..4dd268f4a 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/AsteriskServer.java @@ -21,6 +21,7 @@ import java.util.List; import org.asteriskjava.manager.ManagerConnection; +import org.asteriskjava.manager.ManagerEventListener; import org.asteriskjava.manager.action.OriginateAction; import org.asteriskjava.config.ConfigFile; @@ -477,6 +478,32 @@ void setGlobalVariable(String variable, String value) */ void removeAsteriskServerListener(AsteriskServerListener listener); + /** + * The chainListener allows a listener to receive manager events after they + * have been processed by the AsteriskServer. If the AsteriskServer is + * handling messages using the asyncEventHandling then these messages will + * also be async. You would use the chainListener if you are processing raw + * events and using the AJ live ChannelManager. If you don't use the chain + * listener then you can't be certain that a channel name passed in a raw + * event will match the channel name held by the live Channel Manager. By + * chaining events you can be certain that events such as channel Rename + * events have been processed by the live ChannelManager before you receive + * an event and as such the names will always match. + * + * Whilst name matching is not always critical (as you should be matching by the + * channels unique id) the channel name does also contain state information (Zombie, Masq) + * in these cases it can be critical that you have the same name otherwise your + * state information will be out of date. + * + */ + public void addChainListener(ManagerEventListener chainListener); + + /** + * remove the chain listener. + * @param chainListener + */ + public void removeChainListener(ManagerEventListener chainListener); + /** * Closes the connection to this server. */ diff --git a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java index a969be8ec..4f2213006 100644 --- a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java @@ -17,14 +17,15 @@ package org.asteriskjava.live; import java.util.Collection; -import java.util.Map; import java.util.List; +import java.util.Map; +import org.asteriskjava.config.ConfigFile; import org.asteriskjava.live.internal.AsteriskServerImpl; import org.asteriskjava.manager.DefaultManagerConnection; import org.asteriskjava.manager.ManagerConnection; +import org.asteriskjava.manager.ManagerEventListener; import org.asteriskjava.manager.action.OriginateAction; -import org.asteriskjava.config.ConfigFile; /** * Default implementation of the AsteriskServer interface. @@ -45,7 +46,7 @@ public class DefaultAsteriskServer implements AsteriskServer */ public DefaultAsteriskServer() { - impl = new AsteriskServerImpl(); + this.impl = new AsteriskServerImpl(); } /** @@ -60,7 +61,7 @@ public DefaultAsteriskServer(String hostname, String username, String password) { final ManagerConnection connection; connection = createManagerConnection(hostname, 0, username, password); - impl = new AsteriskServerImpl(connection); + this.impl = new AsteriskServerImpl(connection); } /** @@ -77,7 +78,7 @@ public DefaultAsteriskServer(String hostname, int port, String username, String { final ManagerConnection connection; connection = createManagerConnection(hostname, port, username, password); - impl = new AsteriskServerImpl(connection); + this.impl = new AsteriskServerImpl(connection); } protected DefaultManagerConnection createManagerConnection(String hostname, int port, String username, String password) @@ -95,7 +96,7 @@ protected DefaultManagerConnection createManagerConnection(String hostname, int */ public DefaultAsteriskServer(ManagerConnection eventConnection) { - impl = new AsteriskServerImpl(eventConnection); + this.impl = new AsteriskServerImpl(eventConnection); } /** @@ -112,29 +113,29 @@ public DefaultAsteriskServer(ManagerConnection eventConnection) */ public void setSkipQueues(boolean skipQueues) { - impl.setSkipQueues(skipQueues); + this.impl.setSkipQueues(skipQueues); } public void setManagerConnection(ManagerConnection eventConnection) { - impl.setManagerConnection(eventConnection); + this.impl.setManagerConnection(eventConnection); } public void initialize() throws ManagerCommunicationException { - impl.initialize(); + this.impl.initialize(); } /* Implementation of the AsteriskServer interface */ public ManagerConnection getManagerConnection() { - return impl.getManagerConnection(); + return this.impl.getManagerConnection(); } public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originate(originateAction); + return this.impl.originate(originateAction); } @@ -142,7 +143,7 @@ public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originateToExtension(channel, context, exten, priority, timeout); + return this.impl.originateToExtension(channel, context, exten, priority, timeout); } public AsteriskChannel originateToExtension(String channel, String context, @@ -150,14 +151,14 @@ public AsteriskChannel originateToExtension(String channel, String context, Map variables) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originateToExtension(channel, context, exten, priority, timeout, callerId, variables); + return this.impl.originateToExtension(channel, context, exten, priority, timeout, callerId, variables); } public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originateToApplication(channel, application, data, timeout); + return this.impl.originateToApplication(channel, application, data, timeout); } public AsteriskChannel originateToApplication(String channel, @@ -165,13 +166,13 @@ public AsteriskChannel originateToApplication(String channel, Map variables) throws ManagerCommunicationException, NoSuchChannelException { - return impl.originateToApplication(channel, application, data, timeout, callerId, variables); + return this.impl.originateToApplication(channel, application, data, timeout, callerId, variables); } public void originateAsync(OriginateAction originateAction, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateAsync(originateAction, cb); + this.impl.originateAsync(originateAction, cb); } public void originateToApplicationAsync(String channel, String application, @@ -179,14 +180,14 @@ public void originateToApplicationAsync(String channel, String application, Map variables, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateToApplicationAsync(channel, application, data, timeout, callerId, variables, cb); + this.impl.originateToApplicationAsync(channel, application, data, timeout, callerId, variables, cb); } public void originateToApplicationAsync(String channel, String application, String data, long timeout, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateToApplicationAsync(channel, application, data, timeout, cb); + this.impl.originateToApplicationAsync(channel, application, data, timeout, cb); } public void originateToExtensionAsync(String channel, String context, @@ -194,123 +195,136 @@ public void originateToExtensionAsync(String channel, String context, Map variables, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateToExtensionAsync(channel, context, exten, priority, timeout, callerId, variables, cb); + this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, callerId, variables, cb); } public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, OriginateCallback cb) throws ManagerCommunicationException { - impl.originateToExtensionAsync(channel, context, exten, priority, timeout, cb); + this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, cb); } public Collection getChannels() throws ManagerCommunicationException { - return impl.getChannels(); + return this.impl.getChannels(); } public AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException { - return impl.getChannelByName(name); + return this.impl.getChannelByName(name); } public AsteriskChannel getChannelById(String id) throws ManagerCommunicationException { - return impl.getChannelById(id); + return this.impl.getChannelById(id); } public Collection getMeetMeRooms() throws ManagerCommunicationException { - return impl.getMeetMeRooms(); + return this.impl.getMeetMeRooms(); } public MeetMeRoom getMeetMeRoom(String name) throws ManagerCommunicationException { - return impl.getMeetMeRoom(name); + return this.impl.getMeetMeRoom(name); } public Collection getQueues() throws ManagerCommunicationException { - return impl.getQueues(); + return this.impl.getQueues(); } public String getVersion() throws ManagerCommunicationException { - return impl.getVersion(); + return this.impl.getVersion(); } public int[] getVersion(String file) throws ManagerCommunicationException { - return impl.getVersion(file); + return this.impl.getVersion(file); } public String getGlobalVariable(String variable) throws ManagerCommunicationException { - return impl.getGlobalVariable(variable); + return this.impl.getGlobalVariable(variable); } public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException { - impl.setGlobalVariable(variable, value); + this.impl.setGlobalVariable(variable, value); } public Collection getVoicemailboxes() throws ManagerCommunicationException { - return impl.getVoicemailboxes(); + return this.impl.getVoicemailboxes(); } public List executeCliCommand(String command) throws ManagerCommunicationException { - return impl.executeCliCommand(command); + return this.impl.executeCliCommand(command); } public boolean isModuleLoaded(String module) throws ManagerCommunicationException { - return impl.isModuleLoaded(module); + return this.impl.isModuleLoaded(module); } public ConfigFile getConfig(String filename) throws ManagerCommunicationException { - return impl.getConfig(filename); + return this.impl.getConfig(filename); } public void reloadAllModules() throws ManagerCommunicationException { - impl.reloadAllModules(); + this.impl.reloadAllModules(); } public void reloadModule(String module) throws ManagerCommunicationException { - impl.reloadModule(module); + this.impl.reloadModule(module); } public void unloadModule(String module) throws ManagerCommunicationException { - impl.unloadModule(module); + this.impl.unloadModule(module); } public void loadModule(String module) throws ManagerCommunicationException { - impl.loadModule(module); + this.impl.loadModule(module); } public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException { - impl.addAsteriskServerListener(listener); + this.impl.addAsteriskServerListener(listener); } public void removeAsteriskServerListener(AsteriskServerListener listener) { - impl.removeAsteriskServerListener(listener); + this.impl.removeAsteriskServerListener(listener); } public void shutdown() { - impl.shutdown(); + this.impl.shutdown(); } public Collection getAgents() throws ManagerCommunicationException { - return impl.getAgents(); + return this.impl.getAgents(); } + + @Override + public void addChainListener(ManagerEventListener chainListener) + { + this.impl.addChainListener(chainListener); + } + + @Override + public void removeChainListener(ManagerEventListener chainListener) + { + this.impl.removeChainListener(chainListener); + + } } diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 5c62e3883..576c5263a 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -893,7 +893,7 @@ public void addChainListener(ManagerEventListener chainListener) } - public void removeChainListner(ManagerEventListener chainListener) + public void removeChainListener(ManagerEventListener chainListener) { this.chainListeners.remove(chainListener); } diff --git a/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java b/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java index 11de4f2af..47cfb2094 100644 --- a/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java +++ b/src/main/java/org/asteriskjava/manager/action/SipPeersAction.java @@ -25,6 +25,8 @@ * the details. When all peers have been reported a PeerlistCompleteEvent is * sent.

* Available since Asterisk 1.2 + * + * Permission required: write=system * * @author srt * @version $Id$ From c920123fe05b094d8658b64b92e3b911e921184d Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Wed, 8 Apr 2015 08:57:12 +1000 Subject: [PATCH 0100/1055] managed to delete a char, added back in :< --- .../java/org/asteriskjava/live/internal/AsteriskServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 2a43c5544..b9909dc9c 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -896,7 +896,7 @@ public void addChainListener(ManagerEventListener chainListener) } - public void removeChainListner(ManagerEventListener chainListener) + public void removeChainListener(ManagerEventListener chainListener) { this.chainListeners.remove(chainListener); } From 18000e7564df45c01dbd9e5d8de95a88ff4cb195 Mon Sep 17 00:00:00 2001 From: Danilo Rocha Valente Date: Wed, 22 Apr 2015 16:41:31 -0300 Subject: [PATCH 0101/1055] Paused and Unpaused events --- .../manager/event/PausedEvent.java | 35 +++++++++++++++++++ .../manager/event/UnpausedEvent.java | 34 ++++++++++++++++++ .../manager/internal/EventBuilderImpl.java | 2 ++ .../asteriskjava/tools/HtmlEventTracer.java | 10 ++++++ 4 files changed, 81 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/PausedEvent.java create mode 100644 src/main/java/org/asteriskjava/manager/event/UnpausedEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/PausedEvent.java b/src/main/java/org/asteriskjava/manager/event/PausedEvent.java new file mode 100644 index 000000000..efa0dbe83 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/PausedEvent.java @@ -0,0 +1,35 @@ +package org.asteriskjava.manager.event; + +public class PausedEvent extends UserEvent { + + public PausedEvent(Object source) { + super(source); + } + + /** + * + */ + private static final long serialVersionUID = 7181269530090027203L; + + private String header; + + private String extension; + + public String getHeader() { + return header; + } + + public void setHeader(String header) { + this.header = header; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + + +} diff --git a/src/main/java/org/asteriskjava/manager/event/UnpausedEvent.java b/src/main/java/org/asteriskjava/manager/event/UnpausedEvent.java new file mode 100644 index 000000000..76ea9fe00 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/UnpausedEvent.java @@ -0,0 +1,34 @@ +package org.asteriskjava.manager.event; + +public class UnpausedEvent extends UserEvent { + + public UnpausedEvent(Object source) { + super(source); + } + + /** + * + */ + private static final long serialVersionUID = 4175034098824101733L; + + private String header; + + private String extension; + + public String getHeader() { + return header; + } + + public void setHeader(String header) { + this.header = header; + } + + public String getExtension() { + return extension; + } + + public void setExtension(String extension) { + this.extension = extension; + } + +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 70eefd088..7c04fc978 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -184,6 +184,8 @@ private void registerBuiltinEventClasses() registerEventClass(ZapShowChannelsEvent.class); registerEventClass(ZapShowChannelsCompleteEvent.class); registerEventClass(AntennaLevelEvent.class); + registerEventClass(PausedEvent.class); + registerEventClass(UnpausedEvent.class); } diff --git a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java index 093bae473..9ea3209b6 100644 --- a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java +++ b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java @@ -254,6 +254,16 @@ else if (event instanceof AntennaLevelEvent) format = "%s"; properties = new String[]{"signal"}; } + else if (event instanceof PausedEvent) + { + format = "(%s) %s"; + properties = new String[]{"header", "extension"}; + } + else if (event instanceof UnpausedEvent) + { + format = "(%s) %s"; + properties = new String[]{"header", "extension"}; + } } if (event instanceof BridgeEvent) From 8350918601ee4891c07a4b3a433e8d339a453775 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Thu, 30 Apr 2015 16:06:44 +1000 Subject: [PATCH 0102/1055] update version to 1.0.0-rc1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2ee7332fa..47bd2ec59 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.asteriskjava asterisk-java Asterisk-Java - 1.0.0 + 1.0.0-rc1 The free Java library for Asterisk PBX integration. 2004 From dcb041390e3cf69af3d46ecf0252f1c21fe541d5 Mon Sep 17 00:00:00 2001 From: enro Date: Thu, 30 Apr 2015 11:21:07 +0200 Subject: [PATCH 0103/1055] Minimize required sleep time upon channel addition --- .gitignore | 1 + .../live/internal/ChannelManager.java | 33 ++++++++++++------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 65f9df09a..ef67b4b41 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ target .settings/* .idea classes +/bin/ diff --git a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java index 176f7b824..d4ff1884d 100644 --- a/src/main/java/org/asteriskjava/live/internal/ChannelManager.java +++ b/src/main/java/org/asteriskjava/live/internal/ChannelManager.java @@ -160,17 +160,28 @@ private AsteriskChannelImpl addNewChannel(String uniqueId, String name, channel.stateChanged(dateOfCreation, state); logger.info("Adding channel " + channel.getName() + "(" + channel.getId() + ")"); - if (SLEEP_TIME_BEFORE_GET_VAR > 0) - { - try - { - Thread.sleep(SLEEP_TIME_BEFORE_GET_VAR); - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - } - } + if (SLEEP_TIME_BEFORE_GET_VAR > 0){ + long start = System.currentTimeMillis(); + long end = start + SLEEP_TIME_BEFORE_GET_VAR; + while(System.currentTimeMillis() < end) + { + try + { + channel.getVariable(Constants.VARIABLE_TRACE_ID); + } + catch(NoSuchChannelException e) + { + try + { + Thread.sleep(1l); + } + catch (InterruptedException intEx) + { + Thread.currentThread().interrupt(); + } + } + } + } traceId = getTraceId(channel); channel.setTraceId(traceId); From 5b0e632da8b64e2e774372ff1fc2e331cc60771e Mon Sep 17 00:00:00 2001 From: enro Date: Thu, 30 Apr 2015 11:22:41 +0200 Subject: [PATCH 0104/1055] Prevent multiple registrations of asterisk server listeners --- .../org/asteriskjava/live/AsteriskServer.java | 8 +++++ .../live/DefaultAsteriskServer.java | 5 +++ .../live/internal/AbstractLiveObject.java | 13 ++++++- .../live/internal/AsteriskServerImpl.java | 36 ++++++++++++------- 4 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/AsteriskServer.java b/src/main/java/org/asteriskjava/live/AsteriskServer.java index 360de0872..d1994d897 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/AsteriskServer.java @@ -477,6 +477,14 @@ void setGlobalVariable(String variable, String value) */ void removeAsteriskServerListener(AsteriskServerListener listener); + /** + * Checks whether the listener is already registered with this Asterisk server + * + * @param listener the listener to check + * @return true, if the listener is already registered. + */ + boolean isAsteriskServerListening(AsteriskServerListener listener); + /** * Closes the connection to this server. */ diff --git a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java index a969be8ec..67b7ce7ee 100644 --- a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java @@ -303,6 +303,11 @@ public void removeAsteriskServerListener(AsteriskServerListener listener) { impl.removeAsteriskServerListener(listener); } + + public boolean isAsteriskServerListening(AsteriskServerListener listener) + { + return impl.isAsteriskServerListening(listener); + } public void shutdown() { diff --git a/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java b/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java index f607d99f8..92db7eb38 100644 --- a/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java +++ b/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java @@ -54,7 +54,18 @@ public void addPropertyChangeListener(PropertyChangeListener listener) public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - changes.addPropertyChangeListener(propertyName, listener); + boolean haveToAdd = true; + for(PropertyChangeListener l : changes.getPropertyChangeListeners()) + { + if(l == listener) + { + haveToAdd = false; + break; + } + } + if(haveToAdd){ + changes.addPropertyChangeListener(propertyName, listener); + } } public void removePropertyChangeListener(PropertyChangeListener listener) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index bca25a310..de6b5f65d 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -61,6 +61,7 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener private ManagerEventListenerProxy managerEventListenerProxy = null; private boolean initialized = false; + private boolean initializing = false; /** * A pool of manager connections to use for sending actions to Asterisk. @@ -180,17 +181,19 @@ public void initialize() throws ManagerCommunicationException private synchronized void initializeIfNeeded() throws ManagerCommunicationException { - if (initialized) + if (initialized || initializing) { return; } - + + initializing = true; + if (eventConnection.getState() == ManagerConnectionState.INITIAL || eventConnection.getState() == ManagerConnectionState.DISCONNECTED) { try { - eventConnection.login(); + eventConnection.login(); } catch (Exception e) { @@ -217,6 +220,7 @@ else if (!asyncEventHandling && eventListener == null) eventConnection.addEventListener(eventListener); } logger.info("Initializing done"); + initializing = false; initialized = true; } @@ -782,7 +786,10 @@ public void addAsteriskServerListener(AsteriskServerListener listener) throws Ma initializeIfNeeded(); synchronized (listeners) { - listeners.add(listener); + if(!listeners.contains(listener)) + { + listeners.add(listener); + } } } @@ -793,6 +800,11 @@ public void removeAsteriskServerListener(AsteriskServerListener listener) listeners.remove(listener); } } + + public boolean isAsteriskServerListening(AsteriskServerListener listener) + { + return listeners.contains(listener); + } void fireNewAsteriskChannel(AsteriskChannel channel) { @@ -1136,6 +1148,12 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) return; } + if (channel.wasInState(ChannelState.UP)) + { + cb.onSuccess(channel); + return; + } + if (channel.wasBusy()) { cb.onBusy(channel); @@ -1171,15 +1189,9 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) return; } } - - if (channel.wasInState(ChannelState.DOWN)) - { - cb.onNoAnswer(channel); - return; - } - // if nothing else matched we asume success - cb.onSuccess(channel); + // if nothing else matched we asume no answer + cb.onNoAnswer(channel); } catch (Throwable t) { From a5e1d1ba4a96c207359aa120e10e0ae2afd3742d Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Thu, 30 Apr 2015 20:25:58 +1000 Subject: [PATCH 0105/1055] Updated version 1.0.0-rc1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2ee7332fa..47bd2ec59 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.asteriskjava asterisk-java Asterisk-Java - 1.0.0 + 1.0.0-rc1 The free Java library for Asterisk PBX integration. 2004 From 902561c48e4b065a394860f18301fcd643e45842 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Thu, 30 Apr 2015 22:25:31 +1000 Subject: [PATCH 0106/1055] reformatted code. --- .../manager/internal/EventBuilderImpl.java | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index f46156d98..db4419e2d 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -264,29 +264,39 @@ public ManagerEvent buildEvent(Object source, Map attributes) return null; } - if (attributes.get("event") instanceof List ) { + if (attributes.get("event") instanceof List ) + { List eventNames = (List) attributes.get( "event" ); - if (eventNames.size() > 0 && "PeerEntry".equals(eventNames.get(0))) { + if (eventNames.size() > 0 && "PeerEntry".equals(eventNames.get(0))) + { // List of PeerEntry events was received (AJ-329) // Convert map of lists to list of maps - one map for each PeerEntry event int peersAmount = attributes.get("listitems") != null ? Integer.valueOf((String) attributes.get("listitems")) : eventNames.size() - 1; // Last event is PeerlistComplete List> peersAttributes = new ArrayList>(); - for (Map.Entry attribute : attributes.entrySet()) { + for (Map.Entry attribute : attributes.entrySet()) + { String key = attribute.getKey(); Object value = attribute.getValue(); - for (int i = 0; i < peersAmount; i++) { + for (int i = 0; i < peersAmount; i++) + { Map peerAttrs; - if (peersAttributes.size() > i) { + if (peersAttributes.size() > i) + { peerAttrs = peersAttributes.get(i); - } else { + } + else + { peerAttrs = new HashMap(); peersAttributes.add(i, peerAttrs); } - if (value instanceof List) { + if (value instanceof List) + { peerAttrs.put(key, ((List) value).get(i)); - } else if (value instanceof String && !"listitems".equals(key)) { + } + else if (value instanceof String && !"listitems".equals(key)) + { peerAttrs.put(key, value); } } @@ -294,8 +304,11 @@ public ManagerEvent buildEvent(Object source, Map attributes) attributes.put("peersAttributes", peersAttributes); eventType = "peers"; } - } else { - if (!(attributes.get("event") instanceof String)) { + } + else + { + if (!(attributes.get("event") instanceof String)) + { logger.error("Event type is not a String or List"); return null; } @@ -359,14 +372,17 @@ public ManagerEvent buildEvent(Object source, Map attributes) PeerEntryEvent peerEntryEvent = new PeerEntryEvent( source ); setAttributes(peerEntryEvent, peerAttrs, ignoredAttributes); List peerEntryEvents = peersEvent.getChildEvents(); - if (peerEntryEvents == null) { + if (peerEntryEvents == null) + { peerEntryEvents = new ArrayList(); peersEvent.setChildEvents(peerEntryEvents); } peerEntryEvents.add(peerEntryEvent); } peersEvent.setActionId((peersEvent.getChildEvents().get(0).getActionId())); - } else { + } + else + { setAttributes(event, attributes, ignoredAttributes); } From 46237c3c9642c1687ff44c042876d68c0484d467 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Thu, 30 Apr 2015 22:42:20 +1000 Subject: [PATCH 0107/1055] updated release version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cfd6d3574..a791b8d31 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.asteriskjava asterisk-java Asterisk-Java - 1.0.0 + 1.1.0-m1 The free Java library for Asterisk PBX integration. 2004 From feee8d7d966f807095ce4792ad476271b129ce1e Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:20:35 +1100 Subject: [PATCH 0108/1055] add support for MuteAudio action. --- .../manager/action/MuteAudioAction.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java new file mode 100644 index 000000000..15fe0f385 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -0,0 +1,119 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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.asteriskjava.manager.action; + +/** + * Action: MuteAudio Synopsis: Mute an audio stream Privilege: system,all + * Description: Mute an incoming or outbound audio stream in a channel. + * Variables: Channel: The channel you want to mute. Direction: in | out + * |all The stream you want to mute. State: on | off Whether to turn mute on or + * off. ActionID: Optional action ID for this AMI transaction. + * + * It is defined in res/res_mutestream.c. + *

+ * Available since Asterisk 1.8 + * + * @author sbs + * @version $Id: MuteAction.java 938 2007-12-31 03:23:38Z srt $ + * @since 1.0.0 + */ +public class MuteAudioAction extends AbstractManagerAction +{ + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 0L; + + private String channel; + + /** The audio direct (relative to the pbx) which is to be muted. */ + enum Direction + { + in, out, all + } + + private Direction direction; + + /** Controls whether to mute (on) or unmute (off) the call **/ + enum State + { + mute("on"), unmute("off"); //$NON-NLS-1$//$NON-NLS-2$ + + String value; + + State(String value) + { + this.value = value; + } + + } + + private State state; + + /** + * Creates a new empty MuteAction. + */ + public MuteAudioAction() + { + + } + + /** + * Creates a new MuteAction that Mutes or Unmutes the two given channel. + * + * @param channel + * the name of the channel to Mute. + * + * @param direction + * the audio direction which is to be muted/unmuted + * + * @param state controls whether we are muting or unmuting the channel. + */ + + public MuteAudioAction(String channel, Direction direction, State state) + { + this.channel = channel; + this.direction = direction; + this.state = state; + } + + /** + * Returns the name of this action, i.e. "MuteAudio". + */ + @Override + public String getAction() + { + return "MuteAudio"; //$NON-NLS-1$ + } + + String getChannel() + { + return this.channel; + } + + Direction getDirection() + { + return this.direction; + } + + State getState() + { + return this.state; + } + + +} \ No newline at end of file From e8b891af4e3c1600fafaecd886a2af732904f8a0 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:23:26 +1100 Subject: [PATCH 0109/1055] Added toString method to the State enum so that it will output the correct value. --- .../org/asteriskjava/manager/action/MuteAudioAction.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index 15fe0f385..ea5c2679e 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -60,6 +60,11 @@ enum State this.value = value; } + public String toString() + { + return this.value; + } + } private State state; From 540f3aa2e343ce48fac4f9efca16cdf6d38c1e64 Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 22:40:51 +1100 Subject: [PATCH 0110/1055] Change the enums to upper case to match convention. --- .../java/org/asteriskjava/manager/action/MuteAudioAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index ea5c2679e..b6c45d80f 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -43,7 +43,7 @@ public class MuteAudioAction extends AbstractManagerAction /** The audio direct (relative to the pbx) which is to be muted. */ enum Direction { - in, out, all + IN, OUT, ALL } private Direction direction; @@ -51,7 +51,7 @@ enum Direction /** Controls whether to mute (on) or unmute (off) the call **/ enum State { - mute("on"), unmute("off"); //$NON-NLS-1$//$NON-NLS-2$ + MUTE("on"), UNMUTE("off"); //$NON-NLS-1$//$NON-NLS-2$ String value; From 5273f26cd083822e05ed63cc91e26ad6acee85be Mon Sep 17 00:00:00 2001 From: Brett Sutton Date: Wed, 18 Jan 2012 23:17:21 +1100 Subject: [PATCH 0111/1055] Made the State and Direction enums public so that they can actually be used when creating a MuteAudioAction. --- .../java/org/asteriskjava/manager/action/MuteAudioAction.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index b6c45d80f..7c52b2dd4 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -41,7 +41,7 @@ public class MuteAudioAction extends AbstractManagerAction private String channel; /** The audio direct (relative to the pbx) which is to be muted. */ - enum Direction + public enum Direction { IN, OUT, ALL } @@ -49,7 +49,7 @@ enum Direction private Direction direction; /** Controls whether to mute (on) or unmute (off) the call **/ - enum State + public enum State { MUTE("on"), UNMUTE("off"); //$NON-NLS-1$//$NON-NLS-2$ From b1fc7af84b3826db9b55be134640c36aec64451c Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 00:07:24 +1000 Subject: [PATCH 0112/1055] fixed merge conflicst. --- .../live/DefaultAsteriskServer.java | 581 +++++++++--------- 1 file changed, 291 insertions(+), 290 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java index 33a259110..f77a42843 100644 --- a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java @@ -17,11 +17,8 @@ package org.asteriskjava.live; import java.util.Collection; -<<<<<<< HEAD import java.util.Date; import java.util.Map; -======= ->>>>>>> 8350918601ee4891c07a4b3a433e8d339a453775 import java.util.List; import java.util.Map; @@ -41,304 +38,309 @@ */ public class DefaultAsteriskServer implements AsteriskServer { - private final AsteriskServerImpl impl; - - /** - * Creates a new instance without a {@link ManagerConnection}. The - * ManagerConnection must be set using - * {@link #setManagerConnection(ManagerConnection)} before you can use this - * AsteriskServer. - */ - public DefaultAsteriskServer() - { - this.impl = new AsteriskServerImpl(); - } - - /** - * Creates a new instance and a new {@link ManagerConnection} with the given - * connection data. - * - * @param hostname the hostname of the Asterisk server to connect to. - * @param username the username to use for login - * @param password the password to use for login - */ - public DefaultAsteriskServer(String hostname, String username, String password) - { - final ManagerConnection connection; - connection = createManagerConnection(hostname, 0, username, password); - this.impl = new AsteriskServerImpl(connection); - } - - /** - * Creates a new instance and a new {@link ManagerConnection} with the given - * connection data. - * - * @param hostname the hostname of the Asterisk server to connect to. - * @param port the port where Asterisk listens for incoming Manager API - * connections, usually 5038. - * @param username the username to use for login - * @param password the password to use for login - */ - public DefaultAsteriskServer(String hostname, int port, String username, String password) - { - final ManagerConnection connection; - connection = createManagerConnection(hostname, port, username, password); - this.impl = new AsteriskServerImpl(connection); - } - - protected DefaultManagerConnection createManagerConnection(String hostname, int port, String username, String password) - { - DefaultManagerConnection dmc; - dmc = new DefaultManagerConnection(hostname, port, username, password); - return dmc; - } - - /** - * Creates a new instance that uses the given {@link ManagerConnection}. - * - * @param eventConnection the ManagerConnection to use for receiving events - * from Asterisk. - */ - public DefaultAsteriskServer(ManagerConnection eventConnection) - { - this.impl = new AsteriskServerImpl(eventConnection); - } - - /** - * Determines if queue status is retrieved at startup. If you don't need - * queue information and still run Asterisk 1.0.x you can set this to - * true to circumvent the startup delay caused by the missing - * QueueStatusComplete event. - *
- * Default is false. - * - * @param skipQueues true to skip queue initialization, - * false to not skip. - * @since 0.2 - */ - public void setSkipQueues(boolean skipQueues) - { - this.impl.setSkipQueues(skipQueues); - } - - public void setManagerConnection(ManagerConnection eventConnection) - { - this.impl.setManagerConnection(eventConnection); - } - - public void initialize() throws ManagerCommunicationException - { - this.impl.initialize(); - } - - /* Implementation of the AsteriskServer interface */ - - public ManagerConnection getManagerConnection() - { - return this.impl.getManagerConnection(); - } - - public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, NoSuchChannelException - { - return this.impl.originate(originateAction); - } - - - public AsteriskChannel originateToExtension(String channel, String context, - String exten, int priority, long timeout) - throws ManagerCommunicationException, NoSuchChannelException - { - return this.impl.originateToExtension(channel, context, exten, priority, timeout); - } - - public AsteriskChannel originateToExtension(String channel, String context, - String exten, int priority, long timeout, CallerId callerId, - Map variables) - throws ManagerCommunicationException, NoSuchChannelException - { - return this.impl.originateToExtension(channel, context, exten, priority, timeout, callerId, variables); - } - - public AsteriskChannel originateToApplication(String channel, - String application, String data, long timeout) - throws ManagerCommunicationException, NoSuchChannelException - { - return this.impl.originateToApplication(channel, application, data, timeout); - } - - public AsteriskChannel originateToApplication(String channel, - String application, String data, long timeout, CallerId callerId, - Map variables) - throws ManagerCommunicationException, NoSuchChannelException - { - return this.impl.originateToApplication(channel, application, data, timeout, callerId, variables); - } - - public void originateAsync(OriginateAction originateAction, - OriginateCallback cb) throws ManagerCommunicationException - { - this.impl.originateAsync(originateAction, cb); - } - - public void originateToApplicationAsync(String channel, String application, - String data, long timeout, CallerId callerId, - Map variables, OriginateCallback cb) - throws ManagerCommunicationException - { - this.impl.originateToApplicationAsync(channel, application, data, timeout, callerId, variables, cb); - } - - public void originateToApplicationAsync(String channel, String application, - String data, long timeout, OriginateCallback cb) - throws ManagerCommunicationException - { - this.impl.originateToApplicationAsync(channel, application, data, timeout, cb); - } - - public void originateToExtensionAsync(String channel, String context, - String exten, int priority, long timeout, CallerId callerId, - Map variables, OriginateCallback cb) - throws ManagerCommunicationException - { - this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, callerId, variables, cb); - } - - public void originateToExtensionAsync(String channel, String context, - String exten, int priority, long timeout, OriginateCallback cb) - throws ManagerCommunicationException - { - this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, cb); - } - - public Collection getChannels() throws ManagerCommunicationException - { - return this.impl.getChannels(); - } - - public AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException - { - return this.impl.getChannelByName(name); - } - - public AsteriskChannel getChannelById(String id) throws ManagerCommunicationException - { - return this.impl.getChannelById(id); - } - - public Collection getMeetMeRooms() throws ManagerCommunicationException - { - return this.impl.getMeetMeRooms(); - } - - public MeetMeRoom getMeetMeRoom(String name) throws ManagerCommunicationException - { - return this.impl.getMeetMeRoom(name); - } - - public Collection getQueues() throws ManagerCommunicationException - { - return this.impl.getQueues(); - } - - public String getVersion() throws ManagerCommunicationException - { - return this.impl.getVersion(); - } - - public int[] getVersion(String file) throws ManagerCommunicationException - { - return this.impl.getVersion(file); - } - - public String getGlobalVariable(String variable) throws ManagerCommunicationException - { - return this.impl.getGlobalVariable(variable); - } - - public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException - { - this.impl.setGlobalVariable(variable, value); - } - - public Collection getVoicemailboxes() throws ManagerCommunicationException - { - return this.impl.getVoicemailboxes(); - } - - public List executeCliCommand(String command) throws ManagerCommunicationException - { - return this.impl.executeCliCommand(command); - } - - public boolean isModuleLoaded(String module) throws ManagerCommunicationException - { - return this.impl.isModuleLoaded(module); - } - - public ConfigFile getConfig(String filename) throws ManagerCommunicationException - { - return this.impl.getConfig(filename); - } - - public void reloadAllModules() throws ManagerCommunicationException - { - this.impl.reloadAllModules(); - } - - public void reloadModule(String module) throws ManagerCommunicationException - { - this.impl.reloadModule(module); - } - - public void unloadModule(String module) throws ManagerCommunicationException - { - this.impl.unloadModule(module); - } - - public void loadModule(String module) throws ManagerCommunicationException - { - this.impl.loadModule(module); - } - - public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException - { - this.impl.addAsteriskServerListener(listener); - } - - public void removeAsteriskServerListener(AsteriskServerListener listener) - { - this.impl.removeAsteriskServerListener(listener); - } - - public void shutdown() - { - this.impl.shutdown(); - } - - public Collection getAgents() throws ManagerCommunicationException - { - return this.impl.getAgents(); - } - -<<<<<<< HEAD - public AsteriskQueue getQueueByName(String queueName) { + private final AsteriskServerImpl impl; + + /** + * Creates a new instance without a {@link ManagerConnection}. The + * ManagerConnection must be set using + * {@link #setManagerConnection(ManagerConnection)} before you can use this + * AsteriskServer. + */ + public DefaultAsteriskServer() + { + this.impl = new AsteriskServerImpl(); + } + + /** + * Creates a new instance and a new {@link ManagerConnection} with the given + * connection data. + * + * @param hostname + * the hostname of the Asterisk server to connect to. + * @param username + * the username to use for login + * @param password + * the password to use for login + */ + public DefaultAsteriskServer(String hostname, String username, String password) + { + final ManagerConnection connection; + connection = createManagerConnection(hostname, 0, username, password); + this.impl = new AsteriskServerImpl(connection); + } + + /** + * Creates a new instance and a new {@link ManagerConnection} with the given + * connection data. + * + * @param hostname + * the hostname of the Asterisk server to connect to. + * @param port + * the port where Asterisk listens for incoming Manager API + * connections, usually 5038. + * @param username + * the username to use for login + * @param password + * the password to use for login + */ + public DefaultAsteriskServer(String hostname, int port, String username, String password) + { + final ManagerConnection connection; + connection = createManagerConnection(hostname, port, username, password); + this.impl = new AsteriskServerImpl(connection); + } + + protected DefaultManagerConnection createManagerConnection(String hostname, int port, String username, + String password) + { + DefaultManagerConnection dmc; + dmc = new DefaultManagerConnection(hostname, port, username, password); + return dmc; + } + + /** + * Creates a new instance that uses the given {@link ManagerConnection}. + * + * @param eventConnection + * the ManagerConnection to use for receiving events from + * Asterisk. + */ + public DefaultAsteriskServer(ManagerConnection eventConnection) + { + this.impl = new AsteriskServerImpl(eventConnection); + } + + /** + * Determines if queue status is retrieved at startup. If you don't need + * queue information and still run Asterisk 1.0.x you can set this to + * true to circumvent the startup delay caused by the missing + * QueueStatusComplete event.
+ * Default is false. + * + * @param skipQueues + * true to skip queue initialization, + * false to not skip. + * @since 0.2 + */ + public void setSkipQueues(boolean skipQueues) + { + this.impl.setSkipQueues(skipQueues); + } + + public void setManagerConnection(ManagerConnection eventConnection) + { + this.impl.setManagerConnection(eventConnection); + } + + public void initialize() throws ManagerCommunicationException + { + this.impl.initialize(); + } + + /* Implementation of the AsteriskServer interface */ + + public ManagerConnection getManagerConnection() + { + return this.impl.getManagerConnection(); + } + + public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, + NoSuchChannelException + { + return this.impl.originate(originateAction); + } + + public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout) + throws ManagerCommunicationException, NoSuchChannelException + { + return this.impl.originateToExtension(channel, context, exten, priority, timeout); + } + + public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, + long timeout, CallerId callerId, Map variables) throws ManagerCommunicationException, + NoSuchChannelException + { + return this.impl.originateToExtension(channel, context, exten, priority, timeout, callerId, variables); + } + + public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout) + throws ManagerCommunicationException, NoSuchChannelException + { + return this.impl.originateToApplication(channel, application, data, timeout); + } + + public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout, + CallerId callerId, Map variables) throws ManagerCommunicationException, + NoSuchChannelException + { + return this.impl.originateToApplication(channel, application, data, timeout, callerId, variables); + } + + public void originateAsync(OriginateAction originateAction, OriginateCallback cb) + throws ManagerCommunicationException + { + this.impl.originateAsync(originateAction, cb); + } + + public void originateToApplicationAsync(String channel, String application, String data, long timeout, + CallerId callerId, Map variables, OriginateCallback cb) + throws ManagerCommunicationException + { + this.impl.originateToApplicationAsync(channel, application, data, timeout, callerId, variables, cb); + } + + public void originateToApplicationAsync(String channel, String application, String data, long timeout, + OriginateCallback cb) throws ManagerCommunicationException + { + this.impl.originateToApplicationAsync(channel, application, data, timeout, cb); + } + + public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + CallerId callerId, Map variables, OriginateCallback cb) + throws ManagerCommunicationException + { + this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, callerId, variables, cb); + } + + public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + OriginateCallback cb) throws ManagerCommunicationException + { + this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, cb); + } + + public Collection getChannels() throws ManagerCommunicationException + { + return this.impl.getChannels(); + } + + public AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException + { + return this.impl.getChannelByName(name); + } + + public AsteriskChannel getChannelById(String id) throws ManagerCommunicationException + { + return this.impl.getChannelById(id); + } + + public Collection getMeetMeRooms() throws ManagerCommunicationException + { + return this.impl.getMeetMeRooms(); + } + + public MeetMeRoom getMeetMeRoom(String name) throws ManagerCommunicationException + { + return this.impl.getMeetMeRoom(name); + } + + public Collection getQueues() throws ManagerCommunicationException + { + return this.impl.getQueues(); + } + + public String getVersion() throws ManagerCommunicationException + { + return this.impl.getVersion(); + } + + public int[] getVersion(String file) throws ManagerCommunicationException + { + return this.impl.getVersion(file); + } + + public String getGlobalVariable(String variable) throws ManagerCommunicationException + { + return this.impl.getGlobalVariable(variable); + } + + public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException + { + this.impl.setGlobalVariable(variable, value); + } + + public Collection getVoicemailboxes() throws ManagerCommunicationException + { + return this.impl.getVoicemailboxes(); + } + + public List executeCliCommand(String command) throws ManagerCommunicationException + { + return this.impl.executeCliCommand(command); + } + + public boolean isModuleLoaded(String module) throws ManagerCommunicationException + { + return this.impl.isModuleLoaded(module); + } + + public ConfigFile getConfig(String filename) throws ManagerCommunicationException + { + return this.impl.getConfig(filename); + } + + public void reloadAllModules() throws ManagerCommunicationException + { + this.impl.reloadAllModules(); + } + + public void reloadModule(String module) throws ManagerCommunicationException + { + this.impl.reloadModule(module); + } + + public void unloadModule(String module) throws ManagerCommunicationException + { + this.impl.unloadModule(module); + } + + public void loadModule(String module) throws ManagerCommunicationException + { + this.impl.loadModule(module); + } + + public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException + { + this.impl.addAsteriskServerListener(listener); + } + + public void removeAsteriskServerListener(AsteriskServerListener listener) + { + this.impl.removeAsteriskServerListener(listener); + } + + public void shutdown() + { + this.impl.shutdown(); + } + + public Collection getAgents() throws ManagerCommunicationException + { + return this.impl.getAgents(); + } + + public AsteriskQueue getQueueByName(String queueName) + { return impl.getQueueByName(queueName); } @Override - public List getQueuesUpdatedAfter(Date date) { + public List getQueuesUpdatedAfter(Date date) + { return impl.getQueuesUpdatedAfter(date); } @Override - public void forceQueuesMonitor(boolean force) { + public void forceQueuesMonitor(boolean force) + { impl.forceQueuesMonitor(force); } @Override - public boolean isQueuesMonitorForced() { + public boolean isQueuesMonitorForced() + { return impl.isQueuesMonitorForced(); -======= + } + @Override public void addChainListener(ManagerEventListener chainListener) { @@ -349,7 +351,6 @@ public void addChainListener(ManagerEventListener chainListener) public void removeChainListener(ManagerEventListener chainListener) { this.impl.removeChainListener(chainListener); - ->>>>>>> 8350918601ee4891c07a4b3a433e8d339a453775 + } } From f984e240c0160d689c2a19a93b48236515073704 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 00:07:44 +1000 Subject: [PATCH 0113/1055] fixed missing import. --- .../java/org/asteriskjava/live/internal/AsteriskServerImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 88692bab6..cfb63c431 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -22,6 +22,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; From b96c9dfd0a465a2c82c1a0c46ac508dffbaf5e35 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 00:08:03 +1000 Subject: [PATCH 0114/1055] fixed merge error. --- .../java/org/asteriskjava/manager/response/PingResponse.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/response/PingResponse.java b/src/main/java/org/asteriskjava/manager/response/PingResponse.java index 44ef08515..38a8a3f96 100644 --- a/src/main/java/org/asteriskjava/manager/response/PingResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/PingResponse.java @@ -28,8 +28,6 @@ public class PingResponse extends ManagerResponse private String ping; private String timestamp; - - private String timestamp; /** * Returns always "Pong". From 080281cba0f18c9ffbfc96789b5a19d7a4814868 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 00:09:25 +1000 Subject: [PATCH 0115/1055] removed unused import. --- src/main/java/org/asteriskjava/live/AsteriskQueue.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/live/AsteriskQueue.java b/src/main/java/org/asteriskjava/live/AsteriskQueue.java index e080c8718..fe95a560b 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskQueue.java +++ b/src/main/java/org/asteriskjava/live/AsteriskQueue.java @@ -17,7 +17,6 @@ package org.asteriskjava.live; import java.util.Collection; -import java.util.Date; import java.util.List; /** From f118568e5ee0b5b31f7dbc7c4885a63b4292f4f3 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 00:10:16 +1000 Subject: [PATCH 0116/1055] removed unused imports. --- .../live/DefaultAsteriskServer.java | 1 - .../manager/event/SuccessfulAuthEvent.java | 1 - .../internal/EventBuilderImplTest.java | 20 +++++++++++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java index f77a42843..9e04a016d 100644 --- a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java @@ -18,7 +18,6 @@ import java.util.Collection; import java.util.Date; -import java.util.Map; import java.util.List; import java.util.Map; diff --git a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java index 86c46304f..87b5e6f36 100644 --- a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java @@ -1,6 +1,5 @@ package org.asteriskjava.manager.event; -import java.util.Date; /** * Created by plhk on 1/15/15. diff --git a/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java b/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java index 4e56c4f0c..b88a58116 100644 --- a/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java +++ b/src/test/java/org/asteriskjava/manager/internal/EventBuilderImplTest.java @@ -26,9 +26,25 @@ import java.util.HashMap; import java.util.Map; -import org.asteriskjava.manager.event.*; +import org.asteriskjava.manager.event.AbstractChannelEvent; +import org.asteriskjava.manager.event.AgentCalledEvent; +import org.asteriskjava.manager.event.CdrEvent; +import org.asteriskjava.manager.event.HangupEvent; +import org.asteriskjava.manager.event.LogChannelEvent; +import org.asteriskjava.manager.event.ManagerEvent; +import org.asteriskjava.manager.event.MeetMeLeaveEvent; +import org.asteriskjava.manager.event.MusicOnHoldEvent; +import org.asteriskjava.manager.event.NewCallerIdEvent; +import org.asteriskjava.manager.event.NewChannelEvent; +import org.asteriskjava.manager.event.NewExtenEvent; +import org.asteriskjava.manager.event.PeersEvent; +import org.asteriskjava.manager.event.ResponseEvent; +import org.asteriskjava.manager.event.RtpReceiverStatEvent; +import org.asteriskjava.manager.event.ShutdownEvent; +import org.asteriskjava.manager.event.StatusCompleteEvent; +import org.asteriskjava.manager.event.T38FaxStatusEvent; +import org.asteriskjava.manager.event.TransferEvent; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; public class EventBuilderImplTest From fa295cfaec50617b66a92ba06c002fe9f00f8410 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 00:14:17 +1000 Subject: [PATCH 0117/1055] removed missing serial ids. --- .../manager/event/AbstractBridgeEvent.java | 158 ++- .../manager/event/AgiExecEndEvent.java | 14 +- .../manager/event/AgiExecStartEvent.java | 14 +- .../manager/event/AsyncAgiEndEvent.java | 14 +- .../manager/event/AsyncAgiExecEvent.java | 14 +- .../manager/event/AsyncAgiStartEvent.java | 11 +- .../manager/event/BlindTransferEvent.java | 499 +++---- .../manager/event/BridgeCreateEvent.java | 13 +- .../manager/event/BridgeDestroyEvent.java | 13 +- .../manager/event/BridgeEnterEvent.java | 74 +- .../manager/event/BridgeLeaveEvent.java | 76 +- .../manager/event/ChallengeSentEvent.java | 194 +-- .../manager/event/DAHDIChannelEvent.java | 109 +- .../manager/event/DeviceStateChangeEvent.java | 44 +- .../manager/event/DialBeginEvent.java | 57 +- .../manager/event/DialEndEvent.java | 55 +- .../manager/event/DongleDeviceEntryEvent.java | 1181 +++++++++-------- .../manager/event/DtmfBeginEvent.java | 15 +- .../manager/event/DtmfEndEvent.java | 31 +- .../manager/event/InvalidPasswordEvent.java | 234 ++-- .../manager/event/MusicOnHoldStartEvent.java | 14 +- .../manager/event/MusicOnHoldStopEvent.java | 14 +- .../manager/event/NewConnectedLineEvent.java | 74 +- .../manager/event/SuccessfulAuthEvent.java | 215 +-- 24 files changed, 1800 insertions(+), 1337 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java index 980337c3c..437bb235e 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java @@ -3,72 +3,94 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public abstract class AbstractBridgeEvent extends ManagerEvent { - private String bridgeUniqueId; - private String privilege; - private String bridgeType; - private Integer bridgeNumChannels; - private String bridgeCreator; - private String bridgeName; - private String bridgeTechnology; - - AbstractBridgeEvent(Object source) { super(source); } - - public String getBridgeUniqueId() { - return bridgeUniqueId; - } - - public void setBridgeUniqueId(String bridgeUniqueId) { - this.bridgeUniqueId = bridgeUniqueId; - } - - @Override - public String getPrivilege() { - return privilege; - } - - @Override - public void setPrivilege(String privilege) { - this.privilege = privilege; - } - - public String getBridgeType() { - return bridgeType; - } - - public void setBridgeType(String bridgeType) { - this.bridgeType = bridgeType; - } - - public Integer getBridgeNumChannels() { - return bridgeNumChannels; - } - - public void setBridgeNumChannels(Integer bridgeNumChannels) { - this.bridgeNumChannels = bridgeNumChannels; - } - - public String getBridgeCreator() { - return bridgeCreator; - } - - public void setBridgeCreator(String bridgeCreator) { - this.bridgeCreator = bridgeCreator; - } - - public String getBridgeName() { - return bridgeName; - } - - public void setBridgeName(String bridgeName) { - this.bridgeName = bridgeName; - } - - public String getBridgeTechnology() { - return bridgeTechnology; - } - - public void setBridgeTechnology(String bridgeTechnology) { - this.bridgeTechnology = bridgeTechnology; - } +public abstract class AbstractBridgeEvent extends ManagerEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String bridgeUniqueId; + private String privilege; + private String bridgeType; + private Integer bridgeNumChannels; + private String bridgeCreator; + private String bridgeName; + private String bridgeTechnology; + + AbstractBridgeEvent(Object source) + { + super(source); + } + + public String getBridgeUniqueId() + { + return bridgeUniqueId; + } + + public void setBridgeUniqueId(String bridgeUniqueId) + { + this.bridgeUniqueId = bridgeUniqueId; + } + + @Override + public String getPrivilege() + { + return privilege; + } + + @Override + public void setPrivilege(String privilege) + { + this.privilege = privilege; + } + + public String getBridgeType() + { + return bridgeType; + } + + public void setBridgeType(String bridgeType) + { + this.bridgeType = bridgeType; + } + + public Integer getBridgeNumChannels() + { + return bridgeNumChannels; + } + + public void setBridgeNumChannels(Integer bridgeNumChannels) + { + this.bridgeNumChannels = bridgeNumChannels; + } + + public String getBridgeCreator() + { + return bridgeCreator; + } + + public void setBridgeCreator(String bridgeCreator) + { + this.bridgeCreator = bridgeCreator; + } + + public String getBridgeName() + { + return bridgeName; + } + + public void setBridgeName(String bridgeName) + { + this.bridgeName = bridgeName; + } + + public String getBridgeTechnology() + { + return bridgeTechnology; + } + + public void setBridgeTechnology(String bridgeTechnology) + { + this.bridgeTechnology = bridgeTechnology; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java index 3d9be7cf0..7d757b7b5 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecEndEvent.java @@ -3,6 +3,16 @@ /** * Created by plhk on 1/15/15. */ -public class AgiExecEndEvent extends AgiExecEvent { - public AgiExecEndEvent(Object source) { super(source); setSubEvent(SUB_EVENT_END); } +public class AgiExecEndEvent extends AgiExecEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public AgiExecEndEvent(Object source) + { + super(source); + setSubEvent(SUB_EVENT_END); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java index f7634f244..a2d483cc3 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgiExecStartEvent.java @@ -3,6 +3,16 @@ /** * Created by plhk on 1/15/15. */ -public class AgiExecStartEvent extends AgiExecEvent { - public AgiExecStartEvent(Object source) { super(source); setSubEvent(SUB_EVENT_START); } +public class AgiExecStartEvent extends AgiExecEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public AgiExecStartEvent(Object source) + { + super(source); + setSubEvent(SUB_EVENT_START); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java index 929139e10..944f79340 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEndEvent.java @@ -3,6 +3,16 @@ /** * Created by plhk on 1/15/15. */ -public class AsyncAgiEndEvent extends AsyncAgiEvent { - public AsyncAgiEndEvent(Object source) { super(source); setSubEvent(SUB_EVENT_END); } +public class AsyncAgiEndEvent extends AsyncAgiEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public AsyncAgiEndEvent(Object source) + { + super(source); + setSubEvent(SUB_EVENT_END); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java index fa587995a..adde1cca7 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiExecEvent.java @@ -3,6 +3,16 @@ /** * Created by plhk on 1/15/15. */ -public class AsyncAgiExecEvent extends AsyncAgiEvent { - public AsyncAgiExecEvent (Object source) { super(source); setSubEvent(SUB_EVENT_EXEC); } +public class AsyncAgiExecEvent extends AsyncAgiEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public AsyncAgiExecEvent(Object source) + { + super(source); + setSubEvent(SUB_EVENT_EXEC); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java index 0bf2637ec..1e924079a 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiStartEvent.java @@ -5,5 +5,14 @@ */ public class AsyncAgiStartEvent extends AsyncAgiEvent { - public AsyncAgiStartEvent(Object source) { super(source); setSubEvent(SUB_EVENT_START); } + /** + * + */ + private static final long serialVersionUID = 1L; + + public AsyncAgiStartEvent(Object source) + { + super(source); + setSubEvent(SUB_EVENT_START); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java index 3cbf0768c..819288e8f 100644 --- a/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BlindTransferEvent.java @@ -3,226 +3,281 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BlindTransferEvent extends AbstractBridgeEvent { - private String transfererUniqueId; - private String transfererConnectedLineNum; - private String transfererConnectedLineName; - private String transfererCallerIdName; - private String transfererCallerIdNum; - private String transfererChannel; - private String transfererChannelState; - private String transfererChannelStateDesc; - private Integer transfererPriority; - private String transfererContext; - - - private String transfereeUniqueId; - private String transfereeConnectedLineNum; - private String transfereeConnectedLineName; - private String transfereeCallerIdName; - private String transfereeCallerIdNum; - private String transfereeChannel; - private String transfereeChannelState; - private String transfereeChannelStateDesc; - private Integer transfereePriority; - private String transfereeContext; - private String transfereeExten; - - private String extension; - private String isexternal; - private String result; - - public BlindTransferEvent(Object source) { super(source); } - - public String getTransfererUniqueId() { - return transfererUniqueId; - } - - public void setTransfererUniqueId(String transfererUniqueId) { - this.transfererUniqueId = transfererUniqueId; - } - - public String getTransfererConnectedLineNum() { - return transfererConnectedLineNum; - } - - public void setTransfererConnectedLineNum(String transfererConnectedLineNum) { - this.transfererConnectedLineNum = transfererConnectedLineNum; - } - - public String getTransfererConnectedLineName() { - return transfererConnectedLineName; - } - - public void setTransfererConnectedLineName(String transfererConnectedLineName) { - this.transfererConnectedLineName = transfererConnectedLineName; - } - - public String getTransfererCallerIdName() { - return transfererCallerIdName; - } - - public void setTransfererCallerIdName(String transfererCallerIdName) { - this.transfererCallerIdName = transfererCallerIdName; - } - - public String getTransfererCallerIdNum() { - return transfererCallerIdNum; - } - - public void setTransfererCallerIdNum(String transfererCallerIdNum) { - this.transfererCallerIdNum = transfererCallerIdNum; - } - - public String getTransfererChannel() { - return transfererChannel; - } - - public void setTransfererChannel(String transfererChannel) { - this.transfererChannel = transfererChannel; - } - - public String getTransfererChannelState() { - return transfererChannelState; - } - - public void setTransfererChannelState(String transfererChannelState) { - this.transfererChannelState = transfererChannelState; - } - - public String getTransfererChannelStateDesc() { - return transfererChannelStateDesc; - } - - public void setTransfererChannelStateDesc(String transfererChannelStateDesc) { - this.transfererChannelStateDesc = transfererChannelStateDesc; - } - - public Integer getTransfererPriority() { - return transfererPriority; - } - - public void setTransfererPriority(Integer transfererPriority) { - this.transfererPriority = transfererPriority; - } - - public String getTransfererContext() { - return transfererContext; - } - - public void setTransfererContext(String transfererContext) { - this.transfererContext = transfererContext; - } - - public String getTransfereeUniqueId() { - return transfereeUniqueId; - } - - public void setTransfereeUniqueId(String transfereeUniqueId) { - this.transfereeUniqueId = transfereeUniqueId; - } - - public String getTransfereeConnectedLineNum() { - return transfereeConnectedLineNum; - } - - public void setTransfereeConnectedLineNum(String transfereeConnectedLineNum) { - this.transfereeConnectedLineNum = transfereeConnectedLineNum; - } - - public String getTransfereeConnectedLineName() { - return transfereeConnectedLineName; - } - - public void setTransfereeConnectedLineName(String transfereeConnectedLineName) { - this.transfereeConnectedLineName = transfereeConnectedLineName; - } - - public String getTransfereeCallerIdName() { - return transfereeCallerIdName; - } - - public void setTransfereeCallerIdName(String transfereeCallerIdName) { - this.transfereeCallerIdName = transfereeCallerIdName; - } - - public String getTransfereeCallerIdNum() { - return transfereeCallerIdNum; - } - - public void setTransfereeCallerIdNum(String transfereeCallerIdNum) { - this.transfereeCallerIdNum = transfereeCallerIdNum; - } - - public String getTransfereeChannel() { - return transfereeChannel; - } - - public void setTransfereeChannel(String transfereeChannel) { - this.transfereeChannel = transfereeChannel; - } - - public String getTransfereeChannelState() { - return transfereeChannelState; - } - - public void setTransfereeChannelState(String transfereeChannelState) { - this.transfereeChannelState = transfereeChannelState; - } - - public String getTransfereeChannelStateDesc() { - return transfereeChannelStateDesc; - } - - public void setTransfereeChannelStateDesc(String transfereeChannelStateDesc) { - this.transfereeChannelStateDesc = transfereeChannelStateDesc; - } - - public Integer getTransfereePriority() { - return transfereePriority; - } - - public void setTransfereePriority(Integer transfereePriority) { - this.transfereePriority = transfereePriority; - } - - public String getTransfereeContext() { - return transfereeContext; - } - - public void setTransfereeContext(String transfereeContext) { - this.transfereeContext = transfereeContext; - } - - public String getExtension() { - return extension; - } - - public void setExtension(String extension) { - this.extension = extension; - } - - public String getIsexternal() { - return isexternal; - } - - public void setIsexternal(String isexternal) { - this.isexternal = isexternal; - } - - public String getResult() { - return result; - } - - public void setResult(String result) { - this.result = result; - } - - public String getTransfereeExten() { - return transfereeExten; - } - - public void setTransfereeExten(String transfereeExten) { - this.transfereeExten = transfereeExten; - } +public class BlindTransferEvent extends AbstractBridgeEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String transfererUniqueId; + private String transfererConnectedLineNum; + private String transfererConnectedLineName; + private String transfererCallerIdName; + private String transfererCallerIdNum; + private String transfererChannel; + private String transfererChannelState; + private String transfererChannelStateDesc; + private Integer transfererPriority; + private String transfererContext; + + private String transfereeUniqueId; + private String transfereeConnectedLineNum; + private String transfereeConnectedLineName; + private String transfereeCallerIdName; + private String transfereeCallerIdNum; + private String transfereeChannel; + private String transfereeChannelState; + private String transfereeChannelStateDesc; + private Integer transfereePriority; + private String transfereeContext; + private String transfereeExten; + + private String extension; + private String isexternal; + private String result; + + public BlindTransferEvent(Object source) + { + super(source); + } + + public String getTransfererUniqueId() + { + return transfererUniqueId; + } + + public void setTransfererUniqueId(String transfererUniqueId) + { + this.transfererUniqueId = transfererUniqueId; + } + + public String getTransfererConnectedLineNum() + { + return transfererConnectedLineNum; + } + + public void setTransfererConnectedLineNum(String transfererConnectedLineNum) + { + this.transfererConnectedLineNum = transfererConnectedLineNum; + } + + public String getTransfererConnectedLineName() + { + return transfererConnectedLineName; + } + + public void setTransfererConnectedLineName(String transfererConnectedLineName) + { + this.transfererConnectedLineName = transfererConnectedLineName; + } + + public String getTransfererCallerIdName() + { + return transfererCallerIdName; + } + + public void setTransfererCallerIdName(String transfererCallerIdName) + { + this.transfererCallerIdName = transfererCallerIdName; + } + + public String getTransfererCallerIdNum() + { + return transfererCallerIdNum; + } + + public void setTransfererCallerIdNum(String transfererCallerIdNum) + { + this.transfererCallerIdNum = transfererCallerIdNum; + } + + public String getTransfererChannel() + { + return transfererChannel; + } + + public void setTransfererChannel(String transfererChannel) + { + this.transfererChannel = transfererChannel; + } + + public String getTransfererChannelState() + { + return transfererChannelState; + } + + public void setTransfererChannelState(String transfererChannelState) + { + this.transfererChannelState = transfererChannelState; + } + + public String getTransfererChannelStateDesc() + { + return transfererChannelStateDesc; + } + + public void setTransfererChannelStateDesc(String transfererChannelStateDesc) + { + this.transfererChannelStateDesc = transfererChannelStateDesc; + } + + public Integer getTransfererPriority() + { + return transfererPriority; + } + + public void setTransfererPriority(Integer transfererPriority) + { + this.transfererPriority = transfererPriority; + } + + public String getTransfererContext() + { + return transfererContext; + } + + public void setTransfererContext(String transfererContext) + { + this.transfererContext = transfererContext; + } + + public String getTransfereeUniqueId() + { + return transfereeUniqueId; + } + + public void setTransfereeUniqueId(String transfereeUniqueId) + { + this.transfereeUniqueId = transfereeUniqueId; + } + + public String getTransfereeConnectedLineNum() + { + return transfereeConnectedLineNum; + } + + public void setTransfereeConnectedLineNum(String transfereeConnectedLineNum) + { + this.transfereeConnectedLineNum = transfereeConnectedLineNum; + } + + public String getTransfereeConnectedLineName() + { + return transfereeConnectedLineName; + } + + public void setTransfereeConnectedLineName(String transfereeConnectedLineName) + { + this.transfereeConnectedLineName = transfereeConnectedLineName; + } + + public String getTransfereeCallerIdName() + { + return transfereeCallerIdName; + } + + public void setTransfereeCallerIdName(String transfereeCallerIdName) + { + this.transfereeCallerIdName = transfereeCallerIdName; + } + + public String getTransfereeCallerIdNum() + { + return transfereeCallerIdNum; + } + + public void setTransfereeCallerIdNum(String transfereeCallerIdNum) + { + this.transfereeCallerIdNum = transfereeCallerIdNum; + } + + public String getTransfereeChannel() + { + return transfereeChannel; + } + + public void setTransfereeChannel(String transfereeChannel) + { + this.transfereeChannel = transfereeChannel; + } + + public String getTransfereeChannelState() + { + return transfereeChannelState; + } + + public void setTransfereeChannelState(String transfereeChannelState) + { + this.transfereeChannelState = transfereeChannelState; + } + + public String getTransfereeChannelStateDesc() + { + return transfereeChannelStateDesc; + } + + public void setTransfereeChannelStateDesc(String transfereeChannelStateDesc) + { + this.transfereeChannelStateDesc = transfereeChannelStateDesc; + } + + public Integer getTransfereePriority() + { + return transfereePriority; + } + + public void setTransfereePriority(Integer transfereePriority) + { + this.transfereePriority = transfereePriority; + } + + public String getTransfereeContext() + { + return transfereeContext; + } + + public void setTransfereeContext(String transfereeContext) + { + this.transfereeContext = transfereeContext; + } + + public String getExtension() + { + return extension; + } + + public void setExtension(String extension) + { + this.extension = extension; + } + + public String getIsexternal() + { + return isexternal; + } + + public void setIsexternal(String isexternal) + { + this.isexternal = isexternal; + } + + public String getResult() + { + return result; + } + + public void setResult(String result) + { + this.result = result; + } + + public String getTransfereeExten() + { + return transfereeExten; + } + + public void setTransfereeExten(String transfereeExten) + { + this.transfereeExten = transfereeExten; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java index 8d892dac1..876c785b9 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeCreateEvent.java @@ -3,6 +3,15 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BridgeCreateEvent extends AbstractBridgeEvent { - public BridgeCreateEvent(Object source) { super(source); } +public class BridgeCreateEvent extends AbstractBridgeEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public BridgeCreateEvent(Object source) + { + super(source); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java index 70801f09f..c7de172e2 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeDestroyEvent.java @@ -3,6 +3,15 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BridgeDestroyEvent extends AbstractBridgeEvent { - public BridgeDestroyEvent(Object source) { super(source); } +public class BridgeDestroyEvent extends AbstractBridgeEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public BridgeDestroyEvent(Object source) + { + super(source); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java index 4bf78e7e6..4b444e9ef 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeEnterEvent.java @@ -3,34 +3,48 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BridgeEnterEvent extends AbstractBridgeEvent { - private String uniqueId; - private String channel; - private String language; - - public BridgeEnterEvent(Object source) { super(source); } - - public String getLanguage() { - return language; - } - - public void setLanguage(String language) { - this.language = language; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - - public String getUniqueId() { - return uniqueId; - } - - public void setUniqueId(String uniqueId) { - this.uniqueId = uniqueId; - } +public class BridgeEnterEvent extends AbstractBridgeEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String uniqueId; + private String channel; + private String language; + + public BridgeEnterEvent(Object source) + { + super(source); + } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + public String getChannel() + { + return channel; + } + + public void setChannel(String channel) + { + this.channel = channel; + } + + public String getUniqueId() + { + return uniqueId; + } + + public void setUniqueId(String uniqueId) + { + this.uniqueId = uniqueId; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java index e2cc653de..673a125e2 100644 --- a/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/BridgeLeaveEvent.java @@ -3,36 +3,48 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class BridgeLeaveEvent extends AbstractBridgeEvent { - private String uniqueId; - private String channel; - private String language; - - public BridgeLeaveEvent(Object source) { super(source); } - - public String getLanguage() - { - return language; - } - - public void setLanguage(String language) - { - this.language = language; - } - - public String getUniqueId() { - return uniqueId; - } - - public void setUniqueId(String uniqueId) { - this.uniqueId = uniqueId; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } +public class BridgeLeaveEvent extends AbstractBridgeEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String uniqueId; + private String channel; + private String language; + + public BridgeLeaveEvent(Object source) + { + super(source); + } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + public String getUniqueId() + { + return uniqueId; + } + + public void setUniqueId(String uniqueId) + { + this.uniqueId = uniqueId; + } + + public String getChannel() + { + return channel; + } + + public void setChannel(String channel) + { + this.channel = channel; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java b/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java index df8a87f2e..348e35923 100644 --- a/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ChallengeSentEvent.java @@ -3,88 +3,114 @@ /** * Created by plhk on 1/15/15. */ -public class ChallengeSentEvent extends ManagerEvent { - private String severity; - private Integer eventVersion; - private String accountId; - private String service; - private String eventtv; - private String remoteAddress; - private String localAddress; - private String challenge; - private String sessionId; - - public ChallengeSentEvent(Object source) { super(source); } - - public String getSeverity() { - return severity; - } - - public void setSeverity(String severity) { - this.severity = severity; - } - - public Integer getEventVersion() { - return eventVersion; - } - - public void setEventVersion(Integer eventVersion) { - this.eventVersion = eventVersion; - } - - public String getAccountId() { - return accountId; - } - - public void setAccountId(String accountId) { - this.accountId = accountId; - } - - public String getService() { - return service; - } - - public void setService(String service) { - this.service = service; - } - - public String getEventtv() { - return eventtv; - } - - public void setEventtv(String eventtv) { - this.eventtv = eventtv; - } - - public String getRemoteAddress() { - return remoteAddress; - } - - public void setRemoteAddress(String remoteAddress) { - this.remoteAddress = remoteAddress; - } - - public String getLocalAddress() { - return localAddress; - } - - public void setLocalAddress(String localAddress) { - this.localAddress = localAddress; - } - - public String getChallenge() { - return challenge; - } - - public void setChallenge(String challenge) { - this.challenge = challenge; - } - - public String getSessionId() { - return sessionId; - } - - public void setSessionId(String sessionId) { - this.sessionId = sessionId; - } +public class ChallengeSentEvent extends ManagerEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String severity; + private Integer eventVersion; + private String accountId; + private String service; + private String eventtv; + private String remoteAddress; + private String localAddress; + private String challenge; + private String sessionId; + + public ChallengeSentEvent(Object source) + { + super(source); + } + + public String getSeverity() + { + return severity; + } + + public void setSeverity(String severity) + { + this.severity = severity; + } + + public Integer getEventVersion() + { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) + { + this.eventVersion = eventVersion; + } + + public String getAccountId() + { + return accountId; + } + + public void setAccountId(String accountId) + { + this.accountId = accountId; + } + + public String getService() + { + return service; + } + + public void setService(String service) + { + this.service = service; + } + + public String getEventtv() + { + return eventtv; + } + + public void setEventtv(String eventtv) + { + this.eventtv = eventtv; + } + + public String getRemoteAddress() + { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) + { + this.remoteAddress = remoteAddress; + } + + public String getLocalAddress() + { + return localAddress; + } + + public void setLocalAddress(String localAddress) + { + this.localAddress = localAddress; + } + + public String getChallenge() + { + return challenge; + } + + public void setChallenge(String challenge) + { + this.challenge = challenge; + } + + public String getSessionId() + { + return sessionId; + } + + public void setSessionId(String sessionId) + { + this.sessionId = sessionId; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java index dc1afd0f4..3ece357ee 100644 --- a/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java @@ -1,57 +1,64 @@ - -package org.asteriskjava.manager.event; +package org.asteriskjava.manager.event; /** * * @author Sebastian */ -public class DAHDIChannelEvent extends ManagerEvent { - - private String dahdichannel; - private String dahdispan; - private String uniqueid; - private String channel; - - - public String getDahdichannel() { - return dahdichannel; - } - - public void setDahdichannel(String dahdichannel) { - this.dahdichannel = dahdichannel; - } - - public String getDahdispan() { - return dahdispan; - } - - public void setDahdispan(String dahdispan) { - this.dahdispan = dahdispan; - } - - public String getUniqueid() { - return uniqueid; - } - - public void setUniqueid(String uniqueid) { - this.uniqueid = uniqueid; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - - - - - public DAHDIChannelEvent(Object source) - { - super(source); - } - - +public class DAHDIChannelEvent extends ManagerEvent +{ + + /** + * + */ + private static final long serialVersionUID = 1L; + private String dahdichannel; + private String dahdispan; + private String uniqueid; + private String channel; + + public String getDahdichannel() + { + return dahdichannel; + } + + public void setDahdichannel(String dahdichannel) + { + this.dahdichannel = dahdichannel; + } + + public String getDahdispan() + { + return dahdispan; + } + + public void setDahdispan(String dahdispan) + { + this.dahdispan = dahdispan; + } + + public String getUniqueid() + { + return uniqueid; + } + + public void setUniqueid(String uniqueid) + { + this.uniqueid = uniqueid; + } + + public String getChannel() + { + return channel; + } + + public void setChannel(String channel) + { + this.channel = channel; + } + + public DAHDIChannelEvent(Object source) + { + super(source); + } + } diff --git a/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java b/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java index 639b8fd60..b4d31d8f9 100644 --- a/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DeviceStateChangeEvent.java @@ -1,24 +1,36 @@ package org.asteriskjava.manager.event; -public class DeviceStateChangeEvent extends ManagerEvent { - private String state; - private String device; +public class DeviceStateChangeEvent extends ManagerEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String state; + private String device; - public String getState() { - return state; - } + public String getState() + { + return state; + } - public void setState(String state) { - this.state = state; - } + public void setState(String state) + { + this.state = state; + } - public String getDevice() { - return device; - } + public String getDevice() + { + return device; + } - public void setDevice(String device) { - this.device = device; - } + public void setDevice(String device) + { + this.device = device; + } - public DeviceStateChangeEvent(Object source) { super(source); } + public DeviceStateChangeEvent(Object source) + { + super(source); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java index 535d46872..8625ccc60 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -1,29 +1,38 @@ package org.asteriskjava.manager.event; -public class DialBeginEvent extends DialEvent { - +public class DialBeginEvent extends DialEvent +{ + + /** + * + */ + private static final long serialVersionUID = 1L; private String language; private String destlanguage; - - public DialBeginEvent(Object source) { super(source); setSubEvent(SUBEVENT_BEGIN); } - - public String getLanguage() - { - return language; - } - - public void setLanguage(String language) - { - this.language = language; - } - - public String getDestLanguage() - { - return destlanguage; - } - - public void setDestLanguage(String destlanguage) - { - this.destlanguage = destlanguage; - } + + public DialBeginEvent(Object source) + { + super(source); + setSubEvent(SUBEVENT_BEGIN); + } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + public String getDestLanguage() + { + return destlanguage; + } + + public void setDestLanguage(String destlanguage) + { + this.destlanguage = destlanguage; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java index 69fbd89f7..fd8b865ad 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEndEvent.java @@ -1,28 +1,37 @@ package org.asteriskjava.manager.event; -public class DialEndEvent extends DialEvent { +public class DialEndEvent extends DialEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; private String language; private String destlanguage; - - public DialEndEvent(Object source) { super(source); setSubEvent(SUBEVENT_END); } - - public String getLanguage() - { - return language; - } - - public void setLanguage(String language) - { - this.language = language; - } - - public String getDestLanguage() - { - return destlanguage; - } - - public void setDestLanguage(String destlanguage) - { - this.destlanguage = destlanguage; - } + + public DialEndEvent(Object source) + { + super(source); + setSubEvent(SUBEVENT_END); + } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + public String getDestLanguage() + { + return destlanguage; + } + + public void setDestLanguage(String destlanguage) + { + this.destlanguage = destlanguage; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java b/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java index c1ee863fe..d8677dc18 100644 --- a/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java @@ -1,540 +1,655 @@ - package org.asteriskjava.manager.event; - public class DongleDeviceEntryEvent extends ResponseEvent { - - private String Device; - private String AudioSetting; - private String DataSetting; - private String IMEISetting; - private String IMSISetting; - private String ChannelLanguage; - private String Context; - private String Exten; - private String Group; - private String RXGain; - private String TXGain; - private String U2DIAG; - private String UseCallingPres; - private String DefaultCallingPres; - private String AutoDeleteSMS; - private String DisableSMS; - private String ResetDongle; - private String SMSPDU; - private String CallWaitingSetting; - private String DTMF; - private String MinimalDTMFGap; - private String MinimalDTMFDuration; - private String MinimalDTMFInterval; - - private String State; - private String AudioState; - private String DataState; - private String Voice; - private String SMS; - private String Manufacturer; - private String Model; - private String Firmware; - private String IMEIState; - private String GSMRegistrationStatus; - private String RSSI; - private String Mode; - private String Submode; - private String ProviderName; - private String LocationAreaCode; - private String CellID; - private String SubscriberNumber; - private String SMSServiceCenter; - private String UseUCS2Encoding; - private String USSDUse7BitEncoding; - private String USSDUseUCS2Decoding; - private String TasksInQueue; - private String CommandsInQueue; - private String CallWaitingState; - private String CurrentDeviceState; - private String DesiredDeviceState; - private String CallsChannels; - private String Active; - private String Held; - private String Dialing; - private String Alerting; - private String Incoming; - private String Waiting; - private String Releasing; - private String Initializing; - - - public DongleDeviceEntryEvent(Object source) - { - super(source); - } - - public String getDevice() { - return Device; - } - - public void setDevice(String Device) { - this.Device = Device; - } - - public String getAudioSetting() { - return AudioSetting; - } - - public void setAudioSetting(String AudioSetting) { - this.AudioSetting = AudioSetting; - } - - public String getDataSetting() { - return DataSetting; - } - - public void setDataSetting(String DataSetting) { - this.DataSetting = DataSetting; - } - - public String getIMEISetting() { - return IMEISetting; - } - - public void setIMEISetting(String IMEISetting) { - this.IMEISetting = IMEISetting; - } - - public String getIMSISetting() { - return IMSISetting; - } - - public void setIMSISetting(String IMSISetting) { - this.IMSISetting = IMSISetting; - } - - public String getChannelLanguage() { - return ChannelLanguage; - } - - public void setChannelLanguage(String ChannelLanguage) { - this.ChannelLanguage = ChannelLanguage; - } - - public String getContext() { - return Context; - } - - public void setContext(String Context) { - this.Context = Context; - } - - public String getExten() { - return Exten; - } - - public void setExten(String Exten) { - this.Exten = Exten; - } - - public String getGroup() { - return Group; - } - - public void setGroup(String Group) { - this.Group = Group; - } - - public String getRXGain() { - return RXGain; - } - - public void setRXGain(String RXGain) { - this.RXGain = RXGain; - } - - public String getTXGain() { - return TXGain; - } - - public void setTXGain(String TXGain) { - this.TXGain = TXGain; - } - - public String getU2DIAG() { - return U2DIAG; - } - - public void setU2DIAG(String U2DIAG) { - this.U2DIAG = U2DIAG; - } - - public String getUseCallingPres() { - return UseCallingPres; - } - - public void setUseCallingPres(String UseCallingPres) { - this.UseCallingPres = UseCallingPres; - } - - public String getDefaultCallingPres() { - return DefaultCallingPres; - } - - public void setDefaultCallingPres(String DefaultCallingPres) { - this.DefaultCallingPres = DefaultCallingPres; - } - - public String getAutoDeleteSMS() { - return AutoDeleteSMS; - } - - public void setAutoDeleteSMS(String AutoDeleteSMS) { - this.AutoDeleteSMS = AutoDeleteSMS; - } - - public String getDisableSMS() { - return DisableSMS; - } - - public void setDisableSMS(String DisableSMS) { - this.DisableSMS = DisableSMS; - } - - public String getResetDongle() { - return ResetDongle; - } - - public void setResetDongle(String ResetDongle) { - this.ResetDongle = ResetDongle; - } - - public String getSMSPDU() { - return SMSPDU; - } - - public void setSMSPDU(String SMSPDU) { - this.SMSPDU = SMSPDU; - } - - public String getCallWaitingSetting() { - return CallWaitingSetting; - } - - public void setCallWaitingSetting(String CallWaitingSetting) { - this.CallWaitingSetting = CallWaitingSetting; - } - - public String getDTMF() { - return DTMF; - } - - public void setDTMF(String DTMF) { - this.DTMF = DTMF; - } - - public String getMinimalDTMFGap() { - return MinimalDTMFGap; - } - - public void setMinimalDTMFGap(String MinimalDTMFGap) { - this.MinimalDTMFGap = MinimalDTMFGap; - } - - public String getMinimalDTMFDuration() { - return MinimalDTMFDuration; - } - - public void setMinimalDTMFDuration(String MinimalDTMFDuration) { - this.MinimalDTMFDuration = MinimalDTMFDuration; - } - - public String getMinimalDTMFInterval() { - return MinimalDTMFInterval; - } - - public void setMinimalDTMFInterval(String MinimalDTMFInterval) { - this.MinimalDTMFInterval = MinimalDTMFInterval; - } - - public String getState() { - return State; - } - - public void setState(String State) { - this.State = State; - } - - public String getAudioState() { - return AudioState; - } - - public void setAudioState(String AudioState) { - this.AudioState = AudioState; - } - - public String getDataState() { - return DataState; - } - - public void setDataState(String DataState) { - this.DataState = DataState; - } - - public String getVoice() { - return Voice; - } - - public void setVoice(String Voice) { - this.Voice = Voice; - } - - public String getSMS() { - return SMS; - } - - public void setSMS(String SMS) { - this.SMS = SMS; - } - - public String getManufacturer() { - return Manufacturer; - } - - public void setManufacturer(String Manufacturer) { - this.Manufacturer = Manufacturer; - } - - public String getModel() { - return Model; - } - - public void setModel(String Model) { - this.Model = Model; - } - - public String getFirmware() { - return Firmware; - } - - public void setFirmware(String Firmware) { - this.Firmware = Firmware; - } - - public String getIMEIState() { - return IMEIState; - } - - public void setIMEIState(String IMEIState) { - this.IMEIState = IMEIState; - } - - public String getGSMRegistrationStatus() { - return GSMRegistrationStatus; - } - - public void setGSMRegistrationStatus(String GSMRegistrationStatus) { - this.GSMRegistrationStatus = GSMRegistrationStatus; - } - - public String getRSSI() { - return RSSI; - } - - public void setRSSI(String RSSI) { - this.RSSI = RSSI; - } - - public String getMode() { - return Mode; - } - - public void setMode(String Mode) { - this.Mode = Mode; - } - - public String getSubmode() { - return Submode; - } - - public void setSubmode(String Submode) { - this.Submode = Submode; - } - - public String getProviderName() { - return ProviderName; - } - - public void setProviderName(String ProviderName) { - this.ProviderName = ProviderName; - } - - public String getLocationAreaCode() { - return LocationAreaCode; - } - - public void setLocationAreaCode(String LocationAreaCode) { - this.LocationAreaCode = LocationAreaCode; - } - - public String getCellID() { - return CellID; - } - - public void setCellID(String CellID) { - this.CellID = CellID; - } - - public String getSubscriberNumber() { - return SubscriberNumber; - } - - public void setSubscriberNumber(String SubscriberNumber) { - this.SubscriberNumber = SubscriberNumber; - } - - public String getSMSServiceCenter() { - return SMSServiceCenter; - } - - public void setSMSServiceCenter(String SMSServiceCenter) { - this.SMSServiceCenter = SMSServiceCenter; - } - - public String getUseUCS2Encoding() { - return UseUCS2Encoding; - } - - public void setUseUCS2Encoding(String UseUCS2Encoding) { - this.UseUCS2Encoding = UseUCS2Encoding; - } - - public String getUSSDUse7BitEncoding() { - return USSDUse7BitEncoding; - } - - public void setUSSDUse7BitEncoding(String USSDUse7BitEncoding) { - this.USSDUse7BitEncoding = USSDUse7BitEncoding; - } - - public String getUSSDUseUCS2Decoding() { - return USSDUseUCS2Decoding; - } - - public void setUSSDUseUCS2Decoding(String USSDUseUCS2Decoding) { - this.USSDUseUCS2Decoding = USSDUseUCS2Decoding; - } - - public String getTasksInQueue() { - return TasksInQueue; - } - - public void setTasksInQueue(String TasksInQueue) { - this.TasksInQueue = TasksInQueue; - } - - public String getCommandsInQueue() { - return CommandsInQueue; - } - - public void setCommandsInQueue(String CommandsInQueue) { - this.CommandsInQueue = CommandsInQueue; - } - - public String getCallWaitingState() { - return CallWaitingState; - } - - public void setCallWaitingState(String CallWaitingState) { - this.CallWaitingState = CallWaitingState; - } - - public String getCurrentDeviceState() { - return CurrentDeviceState; - } - - public void setCurrentDeviceState(String CurrentDeviceState) { - this.CurrentDeviceState = CurrentDeviceState; - } - - public String getDesiredDeviceState() { - return DesiredDeviceState; - } - - public void setDesiredDeviceState(String DesiredDeviceState) { - this.DesiredDeviceState = DesiredDeviceState; - } - - public String getCallsChannels() { - return CallsChannels; - } - - public void setCallsChannels(String CallsChannels) { - this.CallsChannels = CallsChannels; - } - - public String getActive() { - return Active; - } - - public void setActive(String Active) { - this.Active = Active; - } - - public String getHeld() { - return Held; - } - - public void setHeld(String Held) { - this.Held = Held; - } - - public String getDialing() { - return Dialing; - } - - public void setDialing(String Dialing) { - this.Dialing = Dialing; - } - - public String getAlerting() { - return Alerting; - } - - public void setAlerting(String Alerting) { - this.Alerting = Alerting; - } - - public String getIncoming() { - return Incoming; - } - - public void setIncoming(String Incoming) { - this.Incoming = Incoming; - } - - public String getWaiting() { - return Waiting; - } - - public void setWaiting(String Waiting) { - this.Waiting = Waiting; - } - - public String getReleasing() { - return Releasing; - } - - public void setReleasing(String Releasing) { - this.Releasing = Releasing; - } - public String getInitializing() { - return Initializing; - } + /** + * + */ + private static final long serialVersionUID = 1L; + private String Device; + private String AudioSetting; + private String DataSetting; + private String IMEISetting; + private String IMSISetting; + private String ChannelLanguage; + private String Context; + private String Exten; + private String Group; + private String RXGain; + private String TXGain; + private String U2DIAG; + private String UseCallingPres; + private String DefaultCallingPres; + private String AutoDeleteSMS; + private String DisableSMS; + private String ResetDongle; + private String SMSPDU; + private String CallWaitingSetting; + private String DTMF; + private String MinimalDTMFGap; + private String MinimalDTMFDuration; + private String MinimalDTMFInterval; + + private String State; + private String AudioState; + private String DataState; + private String Voice; + private String SMS; + private String Manufacturer; + private String Model; + private String Firmware; + private String IMEIState; + private String GSMRegistrationStatus; + private String RSSI; + private String Mode; + private String Submode; + private String ProviderName; + private String LocationAreaCode; + private String CellID; + private String SubscriberNumber; + private String SMSServiceCenter; + private String UseUCS2Encoding; + private String USSDUse7BitEncoding; + private String USSDUseUCS2Decoding; + private String TasksInQueue; + private String CommandsInQueue; + private String CallWaitingState; + private String CurrentDeviceState; + private String DesiredDeviceState; + private String CallsChannels; + private String Active; + private String Held; + private String Dialing; + private String Alerting; + private String Incoming; + private String Waiting; + private String Releasing; + private String Initializing; + + public DongleDeviceEntryEvent(Object source) + { + super(source); + } + + public String getDevice() + { + return Device; + } + + public void setDevice(String Device) + { + this.Device = Device; + } + + public String getAudioSetting() + { + return AudioSetting; + } + + public void setAudioSetting(String AudioSetting) + { + this.AudioSetting = AudioSetting; + } + + public String getDataSetting() + { + return DataSetting; + } + + public void setDataSetting(String DataSetting) + { + this.DataSetting = DataSetting; + } + + public String getIMEISetting() + { + return IMEISetting; + } + + public void setIMEISetting(String IMEISetting) + { + this.IMEISetting = IMEISetting; + } + + public String getIMSISetting() + { + return IMSISetting; + } + + public void setIMSISetting(String IMSISetting) + { + this.IMSISetting = IMSISetting; + } + + public String getChannelLanguage() + { + return ChannelLanguage; + } + + public void setChannelLanguage(String ChannelLanguage) + { + this.ChannelLanguage = ChannelLanguage; + } + + public String getContext() + { + return Context; + } + + public void setContext(String Context) + { + this.Context = Context; + } + + public String getExten() + { + return Exten; + } + + public void setExten(String Exten) + { + this.Exten = Exten; + } + + public String getGroup() + { + return Group; + } + + public void setGroup(String Group) + { + this.Group = Group; + } + + public String getRXGain() + { + return RXGain; + } + + public void setRXGain(String RXGain) + { + this.RXGain = RXGain; + } + + public String getTXGain() + { + return TXGain; + } + + public void setTXGain(String TXGain) + { + this.TXGain = TXGain; + } + + public String getU2DIAG() + { + return U2DIAG; + } + + public void setU2DIAG(String U2DIAG) + { + this.U2DIAG = U2DIAG; + } + + public String getUseCallingPres() + { + return UseCallingPres; + } + + public void setUseCallingPres(String UseCallingPres) + { + this.UseCallingPres = UseCallingPres; + } + + public String getDefaultCallingPres() + { + return DefaultCallingPres; + } + + public void setDefaultCallingPres(String DefaultCallingPres) + { + this.DefaultCallingPres = DefaultCallingPres; + } + + public String getAutoDeleteSMS() + { + return AutoDeleteSMS; + } + + public void setAutoDeleteSMS(String AutoDeleteSMS) + { + this.AutoDeleteSMS = AutoDeleteSMS; + } + + public String getDisableSMS() + { + return DisableSMS; + } + + public void setDisableSMS(String DisableSMS) + { + this.DisableSMS = DisableSMS; + } + + public String getResetDongle() + { + return ResetDongle; + } + + public void setResetDongle(String ResetDongle) + { + this.ResetDongle = ResetDongle; + } + + public String getSMSPDU() + { + return SMSPDU; + } + + public void setSMSPDU(String SMSPDU) + { + this.SMSPDU = SMSPDU; + } + + public String getCallWaitingSetting() + { + return CallWaitingSetting; + } + + public void setCallWaitingSetting(String CallWaitingSetting) + { + this.CallWaitingSetting = CallWaitingSetting; + } + + public String getDTMF() + { + return DTMF; + } + + public void setDTMF(String DTMF) + { + this.DTMF = DTMF; + } + + public String getMinimalDTMFGap() + { + return MinimalDTMFGap; + } + + public void setMinimalDTMFGap(String MinimalDTMFGap) + { + this.MinimalDTMFGap = MinimalDTMFGap; + } + + public String getMinimalDTMFDuration() + { + return MinimalDTMFDuration; + } + + public void setMinimalDTMFDuration(String MinimalDTMFDuration) + { + this.MinimalDTMFDuration = MinimalDTMFDuration; + } + + public String getMinimalDTMFInterval() + { + return MinimalDTMFInterval; + } + + public void setMinimalDTMFInterval(String MinimalDTMFInterval) + { + this.MinimalDTMFInterval = MinimalDTMFInterval; + } + + public String getState() + { + return State; + } + + public void setState(String State) + { + this.State = State; + } + + public String getAudioState() + { + return AudioState; + } + + public void setAudioState(String AudioState) + { + this.AudioState = AudioState; + } + + public String getDataState() + { + return DataState; + } + + public void setDataState(String DataState) + { + this.DataState = DataState; + } + + public String getVoice() + { + return Voice; + } + + public void setVoice(String Voice) + { + this.Voice = Voice; + } + + public String getSMS() + { + return SMS; + } + + public void setSMS(String SMS) + { + this.SMS = SMS; + } + + public String getManufacturer() + { + return Manufacturer; + } + + public void setManufacturer(String Manufacturer) + { + this.Manufacturer = Manufacturer; + } + + public String getModel() + { + return Model; + } + + public void setModel(String Model) + { + this.Model = Model; + } + + public String getFirmware() + { + return Firmware; + } + + public void setFirmware(String Firmware) + { + this.Firmware = Firmware; + } + + public String getIMEIState() + { + return IMEIState; + } + + public void setIMEIState(String IMEIState) + { + this.IMEIState = IMEIState; + } + + public String getGSMRegistrationStatus() + { + return GSMRegistrationStatus; + } + + public void setGSMRegistrationStatus(String GSMRegistrationStatus) + { + this.GSMRegistrationStatus = GSMRegistrationStatus; + } + + public String getRSSI() + { + return RSSI; + } + + public void setRSSI(String RSSI) + { + this.RSSI = RSSI; + } + + public String getMode() + { + return Mode; + } + + public void setMode(String Mode) + { + this.Mode = Mode; + } + + public String getSubmode() + { + return Submode; + } + + public void setSubmode(String Submode) + { + this.Submode = Submode; + } + + public String getProviderName() + { + return ProviderName; + } + + public void setProviderName(String ProviderName) + { + this.ProviderName = ProviderName; + } + + public String getLocationAreaCode() + { + return LocationAreaCode; + } + + public void setLocationAreaCode(String LocationAreaCode) + { + this.LocationAreaCode = LocationAreaCode; + } + + public String getCellID() + { + return CellID; + } + + public void setCellID(String CellID) + { + this.CellID = CellID; + } + + public String getSubscriberNumber() + { + return SubscriberNumber; + } + + public void setSubscriberNumber(String SubscriberNumber) + { + this.SubscriberNumber = SubscriberNumber; + } + + public String getSMSServiceCenter() + { + return SMSServiceCenter; + } + + public void setSMSServiceCenter(String SMSServiceCenter) + { + this.SMSServiceCenter = SMSServiceCenter; + } + + public String getUseUCS2Encoding() + { + return UseUCS2Encoding; + } + + public void setUseUCS2Encoding(String UseUCS2Encoding) + { + this.UseUCS2Encoding = UseUCS2Encoding; + } + + public String getUSSDUse7BitEncoding() + { + return USSDUse7BitEncoding; + } + + public void setUSSDUse7BitEncoding(String USSDUse7BitEncoding) + { + this.USSDUse7BitEncoding = USSDUse7BitEncoding; + } + + public String getUSSDUseUCS2Decoding() + { + return USSDUseUCS2Decoding; + } + + public void setUSSDUseUCS2Decoding(String USSDUseUCS2Decoding) + { + this.USSDUseUCS2Decoding = USSDUseUCS2Decoding; + } + + public String getTasksInQueue() + { + return TasksInQueue; + } + + public void setTasksInQueue(String TasksInQueue) + { + this.TasksInQueue = TasksInQueue; + } + + public String getCommandsInQueue() + { + return CommandsInQueue; + } + + public void setCommandsInQueue(String CommandsInQueue) + { + this.CommandsInQueue = CommandsInQueue; + } + + public String getCallWaitingState() + { + return CallWaitingState; + } + + public void setCallWaitingState(String CallWaitingState) + { + this.CallWaitingState = CallWaitingState; + } + + public String getCurrentDeviceState() + { + return CurrentDeviceState; + } + + public void setCurrentDeviceState(String CurrentDeviceState) + { + this.CurrentDeviceState = CurrentDeviceState; + } + + public String getDesiredDeviceState() + { + return DesiredDeviceState; + } + + public void setDesiredDeviceState(String DesiredDeviceState) + { + this.DesiredDeviceState = DesiredDeviceState; + } + + public String getCallsChannels() + { + return CallsChannels; + } + + public void setCallsChannels(String CallsChannels) + { + this.CallsChannels = CallsChannels; + } + + public String getActive() + { + return Active; + } + + public void setActive(String Active) + { + this.Active = Active; + } + + public String getHeld() + { + return Held; + } + + public void setHeld(String Held) + { + this.Held = Held; + } + + public String getDialing() + { + return Dialing; + } + + public void setDialing(String Dialing) + { + this.Dialing = Dialing; + } + + public String getAlerting() + { + return Alerting; + } + + public void setAlerting(String Alerting) + { + this.Alerting = Alerting; + } + + public String getIncoming() + { + return Incoming; + } + + public void setIncoming(String Incoming) + { + this.Incoming = Incoming; + } + + public String getWaiting() + { + return Waiting; + } + + public void setWaiting(String Waiting) + { + this.Waiting = Waiting; + } + + public String getReleasing() + { + return Releasing; + } + + public void setReleasing(String Releasing) + { + this.Releasing = Releasing; + } + + public String getInitializing() + { + return Initializing; + } + + public void setInitializing(String Initializing) + { + this.Initializing = Initializing; + } - public void setInitializing(String Initializing) { - this.Initializing = Initializing; - } - - - } diff --git a/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java index f826e16f0..31808823b 100644 --- a/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DtmfBeginEvent.java @@ -3,6 +3,17 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class DtmfBeginEvent extends DtmfEvent { - public DtmfBeginEvent(Object source) { super(source); setBegin(true); setEnd(false); } +public class DtmfBeginEvent extends DtmfEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public DtmfBeginEvent(Object source) + { + super(source); + setBegin(true); + setEnd(false); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java b/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java index d07ab7017..a92633dfc 100644 --- a/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DtmfEndEvent.java @@ -3,15 +3,28 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class DtmfEndEvent extends DtmfEvent { - private Integer durationMs; - public DtmfEndEvent(Object source) { super(source); setBegin(false); setEnd(true); } +public class DtmfEndEvent extends DtmfEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private Integer durationMs; - public Integer getDurationMs() { - return durationMs; - } + public DtmfEndEvent(Object source) + { + super(source); + setBegin(false); + setEnd(true); + } - public void setDurationMs(Integer durationMs) { - this.durationMs = durationMs; - } + public Integer getDurationMs() + { + return durationMs; + } + + public void setDurationMs(Integer durationMs) + { + this.durationMs = durationMs; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java index deeed3271..4637e83d7 100644 --- a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java @@ -5,106 +5,136 @@ /** * Created by Alexander Polakov on 1/23/15. */ -public class InvalidPasswordEvent extends ManagerEvent { - private String severity; - private Integer eventVersion; - private String eventtv; - private String sessionid; - private String receivedHash; - private String localaddress; - private BigInteger accountId; - private String receivedChallenge; - private String service; - private String remoteAddress; - private String challenge; - - public InvalidPasswordEvent(Object source) { super(source); } - - public String getSeverity() { - return severity; - } - - public void setSeverity(String severity) { - this.severity = severity; - } - - public Integer getEventVersion() { - return eventVersion; - } - - public void setEventVersion(Integer eventVersion) { - this.eventVersion = eventVersion; - } - - public String getEventtv() { - return eventtv; - } - - public void setEventtv(String eventtv) { - this.eventtv = eventtv; - } - - public String getSessionid() { - return sessionid; - } - - public void setSessionid(String sessionid) { - this.sessionid = sessionid; - } - - public String getReceivedHash() { - return receivedHash; - } - - public void setReceivedHash(String receivedHash) { - this.receivedHash = receivedHash; - } - - public String getLocaladdress() { - return localaddress; - } - - public void setLocaladdress(String localaddress) { - this.localaddress = localaddress; - } - - public BigInteger getAccountId() { - return accountId; - } - - public void setAccountId(BigInteger accountId) { - this.accountId = accountId; - } - - public String getReceivedChallenge() { - return receivedChallenge; - } - - public void setReceivedChallenge(String receivedChallenge) { - this.receivedChallenge = receivedChallenge; - } - - public String getService() { - return service; - } - - public void setService(String service) { - this.service = service; - } - - public String getRemoteAddress() { - return remoteAddress; - } - - public void setRemoteAddress(String remoteAddress) { - this.remoteAddress = remoteAddress; - } - - public String getChallenge() { - return challenge; - } - - public void setChallenge(String challenge) { - this.challenge = challenge; - } +public class InvalidPasswordEvent extends ManagerEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String severity; + private Integer eventVersion; + private String eventtv; + private String sessionid; + private String receivedHash; + private String localaddress; + private BigInteger accountId; + private String receivedChallenge; + private String service; + private String remoteAddress; + private String challenge; + + public InvalidPasswordEvent(Object source) + { + super(source); + } + + public String getSeverity() + { + return severity; + } + + public void setSeverity(String severity) + { + this.severity = severity; + } + + public Integer getEventVersion() + { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) + { + this.eventVersion = eventVersion; + } + + public String getEventtv() + { + return eventtv; + } + + public void setEventtv(String eventtv) + { + this.eventtv = eventtv; + } + + public String getSessionid() + { + return sessionid; + } + + public void setSessionid(String sessionid) + { + this.sessionid = sessionid; + } + + public String getReceivedHash() + { + return receivedHash; + } + + public void setReceivedHash(String receivedHash) + { + this.receivedHash = receivedHash; + } + + public String getLocaladdress() + { + return localaddress; + } + + public void setLocaladdress(String localaddress) + { + this.localaddress = localaddress; + } + + public BigInteger getAccountId() + { + return accountId; + } + + public void setAccountId(BigInteger accountId) + { + this.accountId = accountId; + } + + public String getReceivedChallenge() + { + return receivedChallenge; + } + + public void setReceivedChallenge(String receivedChallenge) + { + this.receivedChallenge = receivedChallenge; + } + + public String getService() + { + return service; + } + + public void setService(String service) + { + this.service = service; + } + + public String getRemoteAddress() + { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) + { + this.remoteAddress = remoteAddress; + } + + public String getChallenge() + { + return challenge; + } + + public void setChallenge(String challenge) + { + this.challenge = challenge; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java index 79c896e16..68e0e002a 100644 --- a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStartEvent.java @@ -3,6 +3,16 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class MusicOnHoldStartEvent extends MusicOnHoldEvent { - public MusicOnHoldStartEvent(Object source) { super(source); setState(STATE_START); } +public class MusicOnHoldStartEvent extends MusicOnHoldEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public MusicOnHoldStartEvent(Object source) + { + super(source); + setState(STATE_START); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java index 4f7030114..f25f9d4a5 100644 --- a/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MusicOnHoldStopEvent.java @@ -3,6 +3,16 @@ /** * Created by Alexander Polakov on 1/26/15. */ -public class MusicOnHoldStopEvent extends MusicOnHoldEvent { - public MusicOnHoldStopEvent(Object source) { super(source); setState(STATE_STOP); } +public class MusicOnHoldStopEvent extends MusicOnHoldEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + + public MusicOnHoldStopEvent(Object source) + { + super(source); + setState(STATE_STOP); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java b/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java index 104640b34..867a9a7a1 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewConnectedLineEvent.java @@ -3,34 +3,48 @@ /** * Created by plhk on 1/15/15. */ -public class NewConnectedLineEvent extends ManagerEvent { - private String channel; - private String uniqueId; - private String language; - - public NewConnectedLineEvent(Object source) { super(source); } - - public String getLanguage(){ - return language; - } - - public void setLanguage(String language){ - this.language = language; - } - - public String getChannel() { - return channel; - } - - public void setChannel(String channel) { - this.channel = channel; - } - - public String getUniqueId() { - return uniqueId; - } - - public void setUniqueId(String uniqueId) { - this.uniqueId = uniqueId; - } +public class NewConnectedLineEvent extends ManagerEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String channel; + private String uniqueId; + private String language; + + public NewConnectedLineEvent(Object source) + { + super(source); + } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + public String getChannel() + { + return channel; + } + + public void setChannel(String channel) + { + this.channel = channel; + } + + public String getUniqueId() + { + return uniqueId; + } + + public void setUniqueId(String uniqueId) + { + this.uniqueId = uniqueId; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java index 87b5e6f36..9e8b7e4df 100644 --- a/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SuccessfulAuthEvent.java @@ -1,100 +1,127 @@ package org.asteriskjava.manager.event; - /** * Created by plhk on 1/15/15. */ -public class SuccessfulAuthEvent extends ManagerEvent { - private String severity; - private Integer eventVersion; - private String accountId; - private Integer usingPassword; - private String sessiontv; - private String service; - private String eventtv; - private String remoteAddress; - private String localAddress; - private String sessionId; - - public SuccessfulAuthEvent(Object source) { super(source); } - - public String getSeverity() { - return severity; - } - - public void setSeverity(String severity) { - this.severity = severity; - } - - public Integer getEventVersion() { - return eventVersion; - } - - public void setEventVersion(Integer eventVersion) { - this.eventVersion = eventVersion; - } - - public String getAccountId() { - return accountId; - } - - public void setAccountId(String accountId) { - this.accountId = accountId; - } - - public Integer getUsingPassword() { - return usingPassword; - } - - public void setUsingPassword(Integer usingPassword) { - this.usingPassword = usingPassword; - } - - public String getSessiontv() { - return sessiontv; - } - - public void setSessiontv(String sessiontv) { - this.sessiontv = sessiontv; - } - - public String getService() { - return service; - } - - public void setService(String service) { - this.service = service; - } - - public String getEventtv() { - return eventtv; - } - - public void setEventtv(String eventtv) { - this.eventtv = eventtv; - } - - public String getRemoteAddress() { - return remoteAddress; - } - - public void setRemoteAddress(String remoteAddress) { - this.remoteAddress = remoteAddress; - } - - public String getLocalAddress() { - return localAddress; - } - - public void setLocalAddress(String localAddress) { - this.localAddress = localAddress; - } - - public String getSessionId() { - return sessionId; - } - - public void setSessionId(String sessionId) { - this.sessionId = sessionId; - } +public class SuccessfulAuthEvent extends ManagerEvent +{ + /** + * + */ + private static final long serialVersionUID = 1L; + private String severity; + private Integer eventVersion; + private String accountId; + private Integer usingPassword; + private String sessiontv; + private String service; + private String eventtv; + private String remoteAddress; + private String localAddress; + private String sessionId; + + public SuccessfulAuthEvent(Object source) + { + super(source); + } + + public String getSeverity() + { + return severity; + } + + public void setSeverity(String severity) + { + this.severity = severity; + } + + public Integer getEventVersion() + { + return eventVersion; + } + + public void setEventVersion(Integer eventVersion) + { + this.eventVersion = eventVersion; + } + + public String getAccountId() + { + return accountId; + } + + public void setAccountId(String accountId) + { + this.accountId = accountId; + } + + public Integer getUsingPassword() + { + return usingPassword; + } + + public void setUsingPassword(Integer usingPassword) + { + this.usingPassword = usingPassword; + } + + public String getSessiontv() + { + return sessiontv; + } + + public void setSessiontv(String sessiontv) + { + this.sessiontv = sessiontv; + } + + public String getService() + { + return service; + } + + public void setService(String service) + { + this.service = service; + } + + public String getEventtv() + { + return eventtv; + } + + public void setEventtv(String eventtv) + { + this.eventtv = eventtv; + } + + public String getRemoteAddress() + { + return remoteAddress; + } + + public void setRemoteAddress(String remoteAddress) + { + this.remoteAddress = remoteAddress; + } + + public String getLocalAddress() + { + return localAddress; + } + + public void setLocalAddress(String localAddress) + { + this.localAddress = localAddress; + } + + public String getSessionId() + { + return sessionId; + } + + public void setSessionId(String sessionId) + { + this.sessionId = sessionId; + } } From 93cdc9400b591aa3696bb2c07da548985123feb3 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 00:16:34 +1000 Subject: [PATCH 0118/1055] removed unused fields. --- .../event/AbstractChannelStateEvent.java | 222 +++++++++--------- .../asteriskjava/manager/event/DialEvent.java | 3 - .../manager/event/DongleNewCMGREvent.java | 1 - .../manager/event/HangupEvent.java | 38 --- 4 files changed, 116 insertions(+), 148 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java index 2f8c25f66..1fda5c546 100755 --- a/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java @@ -19,128 +19,138 @@ import org.asteriskjava.util.AstState; /** - * Abstract base class providing common properties for HangupEvent, NewChannelEvent and - * NewStateEvent. + * Abstract base class providing common properties for HangupEvent, + * NewChannelEvent and NewStateEvent. * * @author srt * @version $Id$ */ public abstract class AbstractChannelStateEvent extends AbstractChannelEvent { - /** - * Serializable version identifier. - */ - static final long serialVersionUID = 0L; + /** + * Serializable version identifier. + */ + static final long serialVersionUID = 0L; - private Integer channelState; - private String channelStateDesc; - private String connectedlinename; - private String connectedlinenum; + private Integer channelState; + private String channelStateDesc; + private String connectedlinename; + private String connectedlinenum; - protected AbstractChannelStateEvent(Object source) - { - super(source); - } + protected AbstractChannelStateEvent(Object source) + { + super(source); + } - public String getConnectedlinename() { - return connectedlinename; - } + public String getConnectedlinename() + { + return connectedlinename; + } - public void setConnectedlinename(String connectedlinename) { - this.connectedlinename = connectedlinename; - } + public void setConnectedlinename(String connectedlinename) + { + this.connectedlinename = connectedlinename; + } - public String getConnectedlinenum() { - return connectedlinenum; - } + public String getConnectedlinenum() + { + return connectedlinenum; + } - public void setConnectedlinenum(String connectedlinenum) { - this.connectedlinenum = connectedlinenum; - } - - + public void setConnectedlinenum(String connectedlinenum) + { + this.connectedlinenum = connectedlinenum; + } - /** - * Returns the new state of the channel.

- * For Asterisk versions prior to 1.6 (that do not send the numeric value) it is derived - * from the descriptive text. - * - * @return the new state of the channel. - * @since 1.0.0 - */ - public Integer getChannelState() - { - return channelState == null ? AstState.str2state(channelStateDesc) : channelState; - } + /** + * Returns the new state of the channel. + *

+ * For Asterisk versions prior to 1.6 (that do not send the numeric value) + * it is derived from the descriptive text. + * + * @return the new state of the channel. + * @since 1.0.0 + */ + public Integer getChannelState() + { + return channelState == null ? AstState.str2state(channelStateDesc) : channelState; + } - /** - * Sets the new state of the channel. - * - * @param channelState the new state of the channel. - * @since 1.0.0 - */ - public void setChannelState(Integer channelState) - { - this.channelState = channelState; - } + /** + * Sets the new state of the channel. + * + * @param channelState + * the new state of the channel. + * @since 1.0.0 + */ + public void setChannelState(Integer channelState) + { + this.channelState = channelState; + } - /** - * Returns the new state of the channel as a descriptive text.

- * The following states are used:

- *

    - *
  • Down
  • - *
  • Rsrvd
  • - *
  • OffHook
  • - *
  • Dialing
  • - *
  • Ring
  • - *
  • Ringing
  • - *
  • Up
  • - *
  • Busy
  • - *
  • Dialing Offhook (since Asterik 1.6)
  • - *
  • Pre-ring (since Asterik 1.6)
  • - *
- * - * @return the new state of the channel as a descriptive text. - * @since 1.0.0 - */ - public String getChannelStateDesc() - { - return channelStateDesc; - } + /** + * Returns the new state of the channel as a descriptive text. + *

+ * The following states are used: + *

+ *

    + *
  • Down
  • + *
  • Rsrvd
  • + *
  • OffHook
  • + *
  • Dialing
  • + *
  • Ring
  • + *
  • Ringing
  • + *
  • Up
  • + *
  • Busy
  • + *
  • Dialing Offhook (since Asterik 1.6)
  • + *
  • Pre-ring (since Asterik 1.6)
  • + *
+ * + * @return the new state of the channel as a descriptive text. + * @since 1.0.0 + */ + public String getChannelStateDesc() + { + return channelStateDesc; + } - /** - * Sets the new state of the channel as a descriptive text. - * - * @param channelStateDesc the new state of the channel as a descriptive text. - * @since 1.0.0 - */ - public void setChannelStateDesc(String channelStateDesc) - { - this.channelStateDesc = channelStateDesc; - } + /** + * Sets the new state of the channel as a descriptive text. + * + * @param channelStateDesc + * the new state of the channel as a descriptive text. + * @since 1.0.0 + */ + public void setChannelStateDesc(String channelStateDesc) + { + this.channelStateDesc = channelStateDesc; + } - /** - * Returns the new state of the channel as a descriptive text. - *
- * This is an alias for {@link #getChannelStateDesc()}. - * - * @return the new state of the channel as a descriptive text. - * @deprecated as of 1.0.0, use {@link #getChannelStateDesc()} instead or even better switch to numeric - * values as returned by {@link #getChannelState()}. - */ - @Deprecated public String getState() - { - return channelStateDesc; - } + /** + * Returns the new state of the channel as a descriptive text.
+ * This is an alias for {@link #getChannelStateDesc()}. + * + * @return the new state of the channel as a descriptive text. + * @deprecated as of 1.0.0, use {@link #getChannelStateDesc()} instead or + * even better switch to numeric values as returned by + * {@link #getChannelState()}. + */ + @Deprecated + public String getState() + { + return channelStateDesc; + } - /** - * Sets the new state of the channel as a descriptive text.

- * The state property is used by Asterisk versions prior to 1.6. - * - * @param state the new state of the channel as a descriptive text. - */ - public void setState(String state) - { - this.channelStateDesc = state; - } + /** + * Sets the new state of the channel as a descriptive text. + *

+ * The state property is used by Asterisk versions prior to 1.6. + * + * @param state + * the new state of the channel as a descriptive text. + */ + public void setState(String state) + { + this.channelStateDesc = state; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DialEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEvent.java index ff1de03d6..7f3ef5cd8 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEvent.java @@ -47,9 +47,6 @@ public class DialEvent extends ManagerEvent private String subEvent = SUBEVENT_BEGIN; - private String connectedlinename; - private String connectedlinenum; - /** * The name of the source channel. */ diff --git a/src/main/java/org/asteriskjava/manager/event/DongleNewCMGREvent.java b/src/main/java/org/asteriskjava/manager/event/DongleNewCMGREvent.java index 4db959e6a..5eaf48ec1 100644 --- a/src/main/java/org/asteriskjava/manager/event/DongleNewCMGREvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DongleNewCMGREvent.java @@ -4,7 +4,6 @@ public class DongleNewCMGREvent extends ManagerEvent { private static final long serialVersionUID = 3257845467831284784L; private String device; - private String message; diff --git a/src/main/java/org/asteriskjava/manager/event/HangupEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupEvent.java index 2392c430a..31d9fcc0f 100644 --- a/src/main/java/org/asteriskjava/manager/event/HangupEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HangupEvent.java @@ -32,17 +32,10 @@ public class HangupEvent extends AbstractChannelStateEvent private Integer cause; private String causeTxt; - private String connectedlinename; - private String connectedlinenum; private String language; private String accountCode; - private String connectedLineNum; - - private String connectedLineName; - - public HangupEvent(Object source) { super(source); @@ -111,37 +104,6 @@ public void setAccountCode(String accountCode) this.accountCode = accountCode; } - /** - * Returns the Caller*ID number of the channel connected if set. - * If the channel has no caller id set "unknown" is returned. - * - * @since 1.0.0 - */ - public String getConnectedLineNum() - { - return connectedLineNum; - } - - public void setConnectedLineNum(String connectedLineNum) - { - this.connectedLineNum = connectedLineNum; - } - - /** - * Returns the Caller*ID name of the channel connected if set. - * If the channel has no caller id set "unknown" is returned. - * - * @since 1.0.0 - */ - public String getConnectedLineName() - { - return connectedLineName; - } - - public void setConnectedLineName(String connectedLineName) - { - this.connectedLineName = connectedLineName; - } @Override public String toString() From c593448aa250aecfce5a92724ba1eedffcccbf50 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 09:20:40 +1000 Subject: [PATCH 0119/1055] removed references to deprecated class. --- .../java/org/asteriskjava/config/ConfigFileParserTest.java | 6 +++--- .../org/asteriskjava/fastagi/internal/AgiReplyImplTest.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/asteriskjava/config/ConfigFileParserTest.java b/src/test/java/org/asteriskjava/config/ConfigFileParserTest.java index c555d194b..1fad99120 100644 --- a/src/test/java/org/asteriskjava/config/ConfigFileParserTest.java +++ b/src/test/java/org/asteriskjava/config/ConfigFileParserTest.java @@ -1,8 +1,8 @@ package org.asteriskjava.config; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertTrue; -import static junit.framework.Assert.fail; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import java.nio.CharBuffer; diff --git a/src/test/java/org/asteriskjava/fastagi/internal/AgiReplyImplTest.java b/src/test/java/org/asteriskjava/fastagi/internal/AgiReplyImplTest.java index 06fff01f0..7690bb8e7 100644 --- a/src/test/java/org/asteriskjava/fastagi/internal/AgiReplyImplTest.java +++ b/src/test/java/org/asteriskjava/fastagi/internal/AgiReplyImplTest.java @@ -16,8 +16,8 @@ */ package org.asteriskjava.fastagi.internal; -import static junit.framework.Assert.assertEquals; -import static junit.framework.Assert.assertFalse; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import java.util.ArrayList; import java.util.List; From 6b7501a07387e771301982acfd2ba787f836a563 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Fri, 1 May 2015 09:28:03 +1000 Subject: [PATCH 0120/1055] removed cast warning. --- .../asteriskjava/manager/internal/EventBuilderImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index baba75d39..13ce0a7b2 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -274,7 +274,8 @@ public final void registerEventClass(String eventType, Class attributes) + @SuppressWarnings("unchecked") + public ManagerEvent buildEvent(Object source, Map attributes) { ManagerEvent event; String eventType = null; @@ -289,7 +290,7 @@ public ManagerEvent buildEvent(Object source, Map attributes) if (attributes.get("event") instanceof List ) { - List eventNames = (List) attributes.get( "event" ); + List eventNames = (List) attributes.get( "event" ); if (eventNames.size() > 0 && "PeerEntry".equals(eventNames.get(0))) { // List of PeerEntry events was received (AJ-329) @@ -316,7 +317,7 @@ public ManagerEvent buildEvent(Object source, Map attributes) } if (value instanceof List) { - peerAttrs.put(key, ((List) value).get(i)); + peerAttrs.put(key, ((List) value).get(i)); } else if (value instanceof String && !"listitems".equals(key)) { @@ -391,6 +392,7 @@ else if (value instanceof String && !"listitems".equals(key)) if (attributes.get("peersAttributes") != null && attributes.get( "peersAttributes" ) instanceof List) { // Fill Peers event with list of PeerEntry events (AJ-329) PeersEvent peersEvent = (PeersEvent) event; + // TODO: This cast is very ugly, we should review how attributes are being passed around. for( Map peerAttrs : (List>) attributes.get("peersAttributes")) { PeerEntryEvent peerEntryEvent = new PeerEntryEvent( source ); setAttributes(peerEntryEvent, peerAttrs, ignoredAttributes); From 7f96d182bdcb7281e0ce3e4fabdc0421fa614a71 Mon Sep 17 00:00:00 2001 From: Zoumana TRAORE Date: Fri, 1 May 2015 13:27:59 +0200 Subject: [PATCH 0121/1055] aligning on the project versionning convention 1.0.0.RC1 (instead of 1.0.0-rc1) --- pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 47bd2ec59..89c89815c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.asteriskjava asterisk-java Asterisk-Java - 1.0.0-rc1 + 1.0.0.RC1 The free Java library for Asterisk PBX integration. 2004 @@ -40,6 +40,12 @@ Noojee Telephony Solutions Pty Ltd +10 + + Zoumana TRAORE + zoumhussein + github at zoumanatraore dot fr + +1 + scm:git:git://github.com/srt/asterisk-java.git From 5e00baca326400eda3b9687889d6daab156cacef Mon Sep 17 00:00:00 2001 From: Zoumana TRAORE Date: Fri, 1 May 2015 13:20:00 +0200 Subject: [PATCH 0122/1055] added myselft to dev list in pom.xml --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index eee78db0d..4e989b95e 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,12 @@ N4Utilus Take your Business to the Cloud -6 + + Zoumana TRAORE + zoumhussein + github at zoumanatraore dot fr + +1 + scm:git:git://github.com/srt/asterisk-java.git From d734ea6b020d8ff79dbdb36018370c6fc4432f06 Mon Sep 17 00:00:00 2001 From: "bsutton@noojee.com.au" Date: Tue, 5 May 2015 17:04:01 +1000 Subject: [PATCH 0123/1055] Change RTT to a double as the value is in seconds and comes up from asterisk as decimal no. Must RTT's will be well less than 1 second. Did consider changing this to milliseconds but was afraid it would break existing code so added in second method getRttAsMillseconds --- .../asteriskjava/manager/event/RtcpReceivedEvent.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/RtcpReceivedEvent.java b/src/main/java/org/asteriskjava/manager/event/RtcpReceivedEvent.java index 5acc954fa..b7ec7dd90 100644 --- a/src/main/java/org/asteriskjava/manager/event/RtcpReceivedEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/RtcpReceivedEvent.java @@ -51,7 +51,7 @@ public class RtcpReceivedEvent extends AbstractRtcpEvent private Long highestSequence; private Long sequenceNumberCycles; private Double lastSr; - private Long rtt; + private Double rtt; public RtcpReceivedEvent(Object source) { @@ -192,13 +192,18 @@ public void setLastSr(Double lastSr) * * @return the round trip time in seconds, may be null. */ - public Long getRtt() + public Double getRtt() { return rtt; } public void setRtt(String rttString) { - this.rtt = secStringToLong(rttString); + this.rtt = secStringToDouble(rttString); + } + + public Long getRttAsMillseconds() + { + return (long) (rtt * 1000); } } From dca766024d6371f7d55d6c219922a167bd4b8541 Mon Sep 17 00:00:00 2001 From: Colin Williams Date: Tue, 5 May 2015 07:56:28 -0600 Subject: [PATCH 0124/1055] Fixed broken RtcpReceivedEvent unit test. Updates the RtcpReceivedEventTest.testRtt unit test to expect the Rtt field as a Double, rather than a Long, as changed in d734ea6 to resolve #45. --- .../org/asteriskjava/manager/event/RtcpReceivedEventTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/asteriskjava/manager/event/RtcpReceivedEventTest.java b/src/test/java/org/asteriskjava/manager/event/RtcpReceivedEventTest.java index 244846d42..f9b81e27b 100644 --- a/src/test/java/org/asteriskjava/manager/event/RtcpReceivedEventTest.java +++ b/src/test/java/org/asteriskjava/manager/event/RtcpReceivedEventTest.java @@ -49,6 +49,6 @@ public void testDlSrWithSpace() public void testRtt() { rtcpReceivedEvent.setRtt("12345(sec)"); - assertEquals(new Long(12345), rtcpReceivedEvent.getRtt()); + assertEquals(new Double(12345), rtcpReceivedEvent.getRtt()); } } From 562fb24b3c7b832c177c13bee21bfa2416445f0a Mon Sep 17 00:00:00 2001 From: Jean-Yves LEBLEU Date: Tue, 12 May 2015 15:33:46 +0200 Subject: [PATCH 0125/1055] Add LocalBridgeEvent AJ-328 --- .../manager/event/LocalBridgeEvent.java | 122 ++++++++++++++++++ .../manager/internal/EventBuilderImpl.java | 1 + 2 files changed, 123 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/LocalBridgeEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/LocalBridgeEvent.java b/src/main/java/org/asteriskjava/manager/event/LocalBridgeEvent.java new file mode 100644 index 000000000..6bc6ad37b --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/LocalBridgeEvent.java @@ -0,0 +1,122 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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.asteriskjava.manager.event; + +/** + * https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+ManagerEvent_LocalBridge + * Triggered when 2 halves of a local channels are bridged + * + * It is implemented in channels/chan_local.c + * + * @author jylebleu + * @version $Id$ + */ +public class LocalBridgeEvent extends ManagerEvent +{ + /** + * Serializable version identifier. + */ + static final long serialVersionUID = 0L; + + private String uniqueId1; + private String uniqueId2; + private String channel1; + private String channel2; + private String callerId1; + private String callerId2; + private String localOptimization; + + public LocalBridgeEvent(Object source) + { + super(source); + } + + public String getUniqueId1() { + return uniqueId1; + } + + public void setUniqueId1(String uniqueId1) { + this.uniqueId1 = uniqueId1; + } + + public String getUniqueId2() { + return uniqueId2; + } + + public void setUniqueId2(String uniqueId2) { + this.uniqueId2 = uniqueId2; + } + + /** + * The name of the Local Channel half that bridges to another channel. + * + * @return The name of the Local Channel half that bridges to another channel. + */ + public String getChannel1() { + return channel1; + } + + public void setChannel1(String channel1) { + this.channel1 = channel1; + } + + /** + * The name of the Local Channel half that executes the dialplan. + * + * @return The name of the Local Channel half that executes the dialplan. + */ + public String getChannel2() { + return channel2; + } + + public void setChannel2(String channel2) { + this.channel2 = channel2; + } + + public String getCallerId1() { + return callerId1; + } + + public void setCallerId1(String callerId1) { + this.callerId1 = callerId1; + } + + public String getCallerId2() { + return callerId2; + } + + public void setCallerId2(String callerId2) { + this.callerId2 = callerId2; + } + + /** + * Local optimization values + * + * Yes + * No + * + * @return Local optimization + */ + + public String getLocalOptimization() { + return localOptimization; + } + + public void setLocalOptimization(String localOptimization) { + this.localOptimization = localOptimization; + } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 13ce0a7b2..d0d6ae887 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -125,6 +125,7 @@ private void registerBuiltinEventClasses() registerEventClass(LeaveEvent.class); registerEventClass(LinkEvent.class); registerEventClass(ListDialplanEvent.class); + registerEventClass(LocalBridgeEvent.class); registerEventClass(LogChannelEvent.class); registerEventClass(NewConnectedLineEvent.class); registerEventClass(MasqueradeEvent.class); From f6f2aec5e80ae5fe7353e42e81fc9c58a0ed4c28 Mon Sep 17 00:00:00 2001 From: Jean-Yves LEBLEU Date: Wed, 13 May 2015 10:23:21 +0200 Subject: [PATCH 0126/1055] Add asteriskserverimpl as a manager event listener AJ-358 --- .../live/internal/AsteriskServerImpl.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index cfb63c431..4be5ed155 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -277,7 +277,16 @@ private synchronized void initializeIfNeeded() throws ManagerCommunicationExcept { return; } - + if (asyncEventHandling && managerEventListenerProxy == null) + { + managerEventListenerProxy = new ManagerEventListenerProxy(this); + eventConnection.addEventListener(managerEventListenerProxy); + } + else if (!asyncEventHandling && eventListener == null) + { + eventListener = this; + eventConnection.addEventListener(eventListener); + } if (eventConnection.getState() == ManagerConnectionState.INITIAL || eventConnection.getState() == ManagerConnectionState.DISCONNECTED) { @@ -1210,16 +1219,6 @@ private void handleConnectEvent(ConnectEvent connectEvent) queueManager.initialize(); } - if (asyncEventHandling && managerEventListenerProxy == null) - { - managerEventListenerProxy = new ManagerEventListenerProxy(this); - eventConnection.addEventListener(managerEventListenerProxy); - } - else if (!asyncEventHandling && eventListener == null) - { - eventListener = this; - eventConnection.addEventListener(eventListener); - } logger.info("Initializing done"); initialized = true; } From 2dd09c18783f683ea725561a75064d3dfc72a716 Mon Sep 17 00:00:00 2001 From: pet Date: Wed, 13 May 2015 10:54:30 +0200 Subject: [PATCH 0127/1055] Missing Parameters in AMI Events --- .../manager/event/FaxStatusEvent.java | 102 ++++++++++++++++++ .../manager/event/HangupRequestEvent.java | 22 +++- 2 files changed, 123 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java b/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java index 4015ea26e..0c5924e8a 100644 --- a/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java @@ -52,6 +52,12 @@ public class FaxStatusEvent extends AbstractFaxEvent private Integer rtnCount; private Integer dcnCount; private String remoteStationId; + private String context; + private String localStationId; + private String callerId; + private String status; + private String operation; + private String exten; public FaxStatusEvent(Object source) { @@ -491,5 +497,101 @@ public void setRemoteStationId(String remoteStationId) this.remoteStationId = remoteStationId; } + /** + * @return the localStationId + */ + public String getLocalStationId() + { + return localStationId; + } + + /** + * @param localStationId the localStationId to set + */ + public void setLocalStationId(String localStationId) + { + this.localStationId = localStationId; + } + + /** + * @return the context + */ + public String getContext() + { + return context; + } + + /** + * @param context the context to set + */ + public void setContext(String context) + { + this.context = context; + } + + /** + * @return the callerId + */ + public String getCallerId() + { + return callerId; + } + + /** + * @param callerId the callerId to set + */ + public void setCallerId(String callerid) + { + this.callerId = callerid; + } + + /** + * @return the status + */ + public String getStatus() + { + return status; + } + + /** + * @param status the status to set + */ + public void setStatus(String status) + { + this.status = status; + } + + /** + * @return the operation + */ + public String getOperation() + { + return operation; + } + + /** + * @param context the context to set + */ + public void setOperation(String operation) + { + this.operation = operation; + } + + /** + * @return the exten + */ + public String getExten() + { + return exten; + } + + /** + * @param exten the exten to set + */ + public void setExten(String exten) + { + this.exten = exten; + } + } diff --git a/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java index 9feb48f90..eff53ef4c 100644 --- a/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java @@ -27,7 +27,7 @@ public class HangupRequestEvent extends AbstractChannelEvent */ static final long serialVersionUID = 0L; - + private Integer cause; private String uniqueid; private String language; @@ -46,6 +46,26 @@ public HangupRequestEvent(Object source) super(source); } + /** + * Returns the cause of the hangup. + * + * @return the hangup cause. + * @see org.asteriskjava.live.HangupCause + */ + public Integer getCause() + { + return cause; + } + + /** + * Sets the cause of the hangup. + * + * @param cause the hangup cause. + */ + public void setCause(Integer cause) + { + this.cause = cause; + } public String getUniqueid() { return uniqueid; From 848467ec0b0b4706e0b99ffcfdebddc07d44aca2 Mon Sep 17 00:00:00 2001 From: pet Date: Wed, 13 May 2015 11:02:04 +0200 Subject: [PATCH 0128/1055] since Asterisk 11 ManagerAction_MessageSend --- .../manager/action/MessageSendAction.java | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/action/MessageSendAction.java diff --git a/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java b/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java new file mode 100644 index 000000000..cf7e93ac6 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java @@ -0,0 +1,100 @@ +package org.asteriskjava.manager.action; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Send a custom SIP message to the specified peer. + * Available since Asterisk 11 + * + * @author Michael Will + * @version $Id$ + * @since 1.0.0 + */ +public class MessageSendAction extends AbstractManagerAction +{ + + private static final long serialVersionUID = -6554282385166411723L; + private String to; + private String from; + private String body; + private String base64body; + private Map variables; + + + @Override + public String getAction () + { + return "MessageSend"; + } + + /** + * Returns the variables to set on the originated call. + * + * @return a Map containing the variable names as key and their + * values as value. + * @since 1.0.0 + */ + public Map getVariables() + { + return variables; + } + + /** + * Sets an variable on the originated call. + * + * @param name the name of the variable to set. + * @param value the value of the variable to set. + * @since 1.0.0 + */ + public void setVariable(String name, String value) + { + if (variables == null) + { + variables = new LinkedHashMap(); + } + + variables.put(name, value); + } + + public String getTo () + { + return to; + } + + public void setTo (String to) + { + this.to = to; + } + + public String getFrom () + { + return from; + } + + public void setFrom (String from) + { + this.from = from; + } + + public String getBody () + { + return body; + } + + public void setBody (String body) + { + this.body = body; + } + + public String getBase64body () + { + return base64body; + } + + public void setBase64body (String base64body) + { + this.base64body = base64body; + } + +} From 7b1eebdcf48e70a20c9f00b038da137859c39b5b Mon Sep 17 00:00:00 2001 From: pet Date: Wed, 13 May 2015 12:43:14 +0200 Subject: [PATCH 0129/1055] It is possible that one User or Channel can have sevaeral dialing channels --- .../asteriskjava/live/AsteriskChannel.java | 9 ++ .../live/internal/AsteriskChannelImpl.java | 139 +++++++++++++----- 2 files changed, 109 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/AsteriskChannel.java b/src/main/java/org/asteriskjava/live/AsteriskChannel.java index 543b67beb..a7fee808a 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskChannel.java +++ b/src/main/java/org/asteriskjava/live/AsteriskChannel.java @@ -229,6 +229,15 @@ public interface AsteriskChannel extends LiveObject */ AsteriskChannel getDialingChannel(); + /** + * Returns the channel set that are dialing this channel, this is the source + * channel that created this channel by dialing it. + * + * @return the channel set that is dialing this channel or null + * if none was dialing. + */ + List getDialedChannels(); + /** * Returns the channel this channel is currently bridged with, if any. * diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index c373ef89a..2aea2ca75 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -101,15 +101,15 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel private final List linkedChannelHistory; private final List dialedChannelHistory; - private AsteriskChannel dialedChannel; + private final List dialedChannels; - private AsteriskChannel dialingChannel; + private final List dialingChannels; /** - * If this channel is bridged to another channel, the linkedChannel contains - * the channel this channel is bridged with. + * If this channel is bridged to another channel, the linkedChannels contains + the channel this channel is bridged with. */ - private AsteriskChannel linkedChannel; + private final List linkedChannels; /** * Indicates if this channel was linked to another channel at least once. @@ -196,6 +196,9 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel this.linkedChannelHistory = new ArrayList(); this.dialedChannelHistory = new ArrayList(); this.variables = new HashMap(); + this.dialedChannels = new ArrayList(); + this.dialingChannels = new ArrayList(); + this.linkedChannels = new ArrayList(); } public String getId() @@ -471,11 +474,29 @@ synchronized void hungup(Date dateOfRemoval, HangupCause hangupCause, String han /* dialed channels */ - public AsteriskChannel getDialedChannel() + public List getDialedChannels() { - return dialedChannel; + final List copy; + + synchronized (dialedChannels) + { + copy = new ArrayList(dialedChannels); + } + + return copy; } +/* dialed channels */ + public AsteriskChannel getDialedChannel() + { + synchronized(dialedChannels) { + for (AsteriskChannel channel:dialedChannels) { + if (channel != null) return channel; + } + } + return null; + } + public List getDialedChannelHistory() { final List copy; @@ -490,7 +511,12 @@ public List getDialedChannelHistory() synchronized void channelDialed(Date date, AsteriskChannel dialedChannel) { - final AsteriskChannel oldDialedChannel = this.dialedChannel; + final AsteriskChannel oldDialedChannel; + synchronized(dialedChannels) { + if (dialedChannels.isEmpty()) oldDialedChannel = null; + else oldDialedChannel = dialedChannels.get(dialedChannels.size()-1); + dialedChannels.add(dialedChannel); + } final DialedChannelHistoryEntry historyEntry; historyEntry = new DialedChannelHistoryEntry(date, dialedChannel); @@ -498,22 +524,33 @@ synchronized void channelDialed(Date date, AsteriskChannel dialedChannel) { dialedChannelHistory.add(historyEntry); } - this.dialedChannel = dialedChannel; + firePropertyChange(PROPERTY_DIALED_CHANNEL, oldDialedChannel, dialedChannel); } /* dialed channels */ - + public AsteriskChannel getDialingChannel() { - return dialingChannel; + synchronized(dialingChannels) { + if (dialingChannels.isEmpty()) return null; + return dialingChannels.get(0); + } } synchronized void channelDialing(Date date, AsteriskChannel dialingChannel) { - final AsteriskChannel oldDialingChannel = this.dialingChannel; + final AsteriskChannel oldDialingChannel; + synchronized(this.dialingChannels) { + if (this.dialingChannels.isEmpty()) { + oldDialingChannel = null; + this.dialingChannels.add(dialingChannel); + } else { + oldDialingChannel = this.dialingChannels.get(0); + this.dialingChannels.set(0, dialingChannel); + } + } - this.dialingChannel = dialingChannel; firePropertyChange(PROPERTY_DIALING_CHANNEL, oldDialingChannel, dialingChannel); } @@ -521,7 +558,10 @@ synchronized void channelDialing(Date date, AsteriskChannel dialingChannel) public AsteriskChannel getLinkedChannel() { - return linkedChannel; + synchronized(linkedChannels) { + if (linkedChannels.isEmpty()) return null; + return linkedChannels.get(0); + } } public List getLinkedChannelHistory() @@ -549,7 +589,18 @@ public boolean wasLinked() */ synchronized void channelLinked(Date date, AsteriskChannel linkedChannel) { - final AsteriskChannel oldLinkedChannel = this.linkedChannel; + final AsteriskChannel oldLinkedChannel; + synchronized(this.linkedChannels) { + if (this.linkedChannels.isEmpty()) { + oldLinkedChannel = null; + this.linkedChannels.add(linkedChannel); + } + else { + oldLinkedChannel = this.linkedChannels.get(0); + this.linkedChannels.set(0, linkedChannel); + } + } + final LinkedChannelHistoryEntry historyEntry; historyEntry = new LinkedChannelHistoryEntry(date, linkedChannel); @@ -557,14 +608,24 @@ synchronized void channelLinked(Date date, AsteriskChannel linkedChannel) { linkedChannelHistory.add(historyEntry); } - this.linkedChannel = linkedChannel; this.wasLinked = true; firePropertyChange(PROPERTY_LINKED_CHANNEL, oldLinkedChannel, linkedChannel); } synchronized void channelUnlinked(Date date) { - final AsteriskChannel oldLinkedChannel = this.linkedChannel; + final AsteriskChannel oldLinkedChannel; + + synchronized(this.linkedChannels) { + if (this.linkedChannels.isEmpty()) { + oldLinkedChannel = null; + } + else { + oldLinkedChannel = this.linkedChannels.get(0); + } + linkedChannels.clear(); + } + final LinkedChannelHistoryEntry historyEntry; synchronized (linkedChannelHistory) @@ -583,7 +644,7 @@ synchronized void channelUnlinked(Date date) { historyEntry.setDateUnlinked(date); } - this.linkedChannel = null; + firePropertyChange(PROPERTY_LINKED_CHANNEL, oldLinkedChannel, null); } @@ -658,13 +719,13 @@ public void redirectBothLegs(String context, String exten, int priority) throws { ManagerResponse response; - if (linkedChannel == null) + if (linkedChannels.isEmpty()) { response = server.sendAction(new RedirectAction(name, context, exten, priority)); } else { - response = server.sendAction(new RedirectAction(name, linkedChannel.getName(), context, exten, priority, + response = server.sendAction(new RedirectAction(name, linkedChannels.get(0).getName(), context, exten, priority, context, exten, priority)); } @@ -915,9 +976,9 @@ void setMonitored(boolean monitored) { public String toString() { final StringBuffer sb; - final AsteriskChannel dialedChannel; - final AsteriskChannel dialingChannel; - final AsteriskChannel linkedChannel; + final List dialedChannels; + final List dialingChannel; + final List linkedChannel; sb = new StringBuffer("AsteriskChannel["); @@ -929,37 +990,37 @@ public String toString() sb.append("state='").append(getState()).append("',"); sb.append("account='").append(getAccount()).append("',"); sb.append("dateOfCreation=").append(getDateOfCreation()).append(","); - dialedChannel = this.dialedChannel; - dialingChannel = this.dialingChannel; - linkedChannel = this.linkedChannel; + dialedChannels = getDialedChannels(); + dialingChannel = this.dialingChannels; + linkedChannel = this.linkedChannels; } - if (dialedChannel == null) + if (dialedChannels.isEmpty()) { sb.append("dialedChannel=null,"); } else { sb.append("dialedChannel=AsteriskChannel["); - synchronized (dialedChannel) + synchronized (dialedChannels) { - sb.append("id='").append(dialedChannel.getId()).append("',"); - sb.append("name='").append(dialedChannel.getName()).append("'],"); + for (AsteriskChannel dialedChannel:dialedChannels) { + sb.append("[id='").append(dialedChannel.getId()).append("',"); + sb.append("name='").append(dialedChannel.getName()).append("'],"); + } + sb.append("],"); } } - if (dialingChannel == null) + if (dialingChannel.isEmpty()) { sb.append("dialingChannel=null,"); } else { sb.append("dialingChannel=AsteriskChannel["); - synchronized (dialingChannel) - { - sb.append("id='").append(dialingChannel.getId()).append("',"); - sb.append("name='").append(dialingChannel.getName()).append("'],"); - } + sb.append("id='").append(dialingChannel.get(0).getId()).append("',"); + sb.append("name='").append(dialingChannel.get(0).getName()).append("'],"); } - if (linkedChannel == null) + if (linkedChannel.isEmpty()) { sb.append("linkedChannel=null"); } @@ -968,8 +1029,8 @@ public String toString() sb.append("linkedChannel=AsteriskChannel["); synchronized (linkedChannel) { - sb.append("id='").append(linkedChannel.getId()).append("',"); - sb.append("name='").append(linkedChannel.getName()).append("']"); + sb.append("id='").append(linkedChannel.get(0).getId()).append("',"); + sb.append("name='").append(linkedChannel.get(0).getName()).append("']"); } } sb.append("]"); From 67cb25903ad49fa4403ba6fbefa8836198596397 Mon Sep 17 00:00:00 2001 From: pet Date: Fri, 15 May 2015 15:05:13 +0200 Subject: [PATCH 0130/1055] formatting more in asteriskjava style --- .../manager/action/MessageSendAction.java | 216 +++++++++++------- 1 file changed, 132 insertions(+), 84 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java b/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java index cf7e93ac6..e1d7197ac 100644 --- a/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MessageSendAction.java @@ -4,8 +4,7 @@ import java.util.Map; /** - * Send a custom SIP message to the specified peer. - * Available since Asterisk 11 + * Send a custom SIP message to the specified peer. Available since Asterisk 11 * * @author Michael Will * @version $Id$ @@ -14,87 +13,136 @@ public class MessageSendAction extends AbstractManagerAction { - private static final long serialVersionUID = -6554282385166411723L; - private String to; - private String from; - private String body; - private String base64body; - private Map variables; - - - @Override - public String getAction () - { - return "MessageSend"; - } - - /** - * Returns the variables to set on the originated call. - * - * @return a Map containing the variable names as key and their - * values as value. - * @since 1.0.0 - */ - public Map getVariables() - { - return variables; - } - - /** - * Sets an variable on the originated call. - * - * @param name the name of the variable to set. - * @param value the value of the variable to set. - * @since 1.0.0 - */ - public void setVariable(String name, String value) - { - if (variables == null) - { - variables = new LinkedHashMap(); - } - - variables.put(name, value); - } - - public String getTo () - { - return to; - } - - public void setTo (String to) - { - this.to = to; - } - - public String getFrom () - { - return from; - } - - public void setFrom (String from) - { - this.from = from; - } - - public String getBody () - { - return body; - } - - public void setBody (String body) - { - this.body = body; - } - - public String getBase64body () - { - return base64body; - } - - public void setBase64body (String base64body) - { - this.base64body = base64body; - } + private static final long serialVersionUID = -6554282385166411723L; + private String to; + private String from; + private String body; + private String base64body; + private Map variables; + + @Override + public String getAction() + { + return "MessageSend"; + } + + /** + * Returns the variables to set on the originated call. + * + * @return a Map containing the variable names as key and their values as + * value. + * @since 1.0.0 + */ + public Map getVariables() + { + return variables; + } + + /** + * Sets an variable on the originated call. + * + * @param name the name of the variable to set. + * @param value the value of the variable to set. + * @since 1.0.0 + */ + public void setVariable(String name, String value) + { + if (variables == null) + { + variables = new LinkedHashMap(); + } + + variables.put(name, value); + } + + /** + * Retrives destination of message + * + * @return String in format like sip:userid + */ + public String getTo() + { + return to; + } + + /** + * Set destination of message + * + * @param to String in format like sip:userid + */ + public void setTo(String to) + { + this.to = to; + } + + /** + * get From String + * + * @return String in form like sip:asterisk@server-ip + */ + public String getFrom() + { + return from; + } + + /** + * set From String + * @param String from in form like sip:asterisk@server-ip + */ + public void setFrom(String from) + { + this.from = from; + } + + /** + * Content of the message in plain text ascii + * Please consider to use getBase64Body instead to avoid encoding problems + * + * @return String with Message content + */ + public String getBody() + { + return body; + } + + /** + * Sets the content of the message + * Please consider to use setBase64Body instead to avoid encoding problems + * + * @param body String with plain ascii content + */ + public void setBody(String body) + { + this.body = body; + } + + /** + * Retrieves content encoded in base64 + * + * @code new String(Base64.decode(getBase64body(), Formatting (for ex "UTF-8")) + * @return Base64 encoded String + */ + public String getBase64body() + { + return base64body; + } + + /** + * Sets the content of the message body encode in base64 + * + * {@code MessageSendAction sipSendMessage = new MessageSendAction(); + * sipSendMessage.setTo("sip:phoneuserid"); + * sipSendMessage.setVariable("Content-Type", "text/plain"); + * sipSendMessage.setVariable("P-hint", "usrloc applied"); + * + * sipSendMessage.setActionId(UUID.randomUUID().toString()); + * sipSendMessage.setBase64body(new String(Base64.encodeBase64(message.getBytes("UTF-8")), "UTF-8")); + * } + * @param base64body + */ + public void setBase64body(String base64body) + { + this.base64body = base64body; + } } From ffc7b6760f73b0b07be44a7c11a91fdf5b419e16 Mon Sep 17 00:00:00 2001 From: pet Date: Fri, 15 May 2015 15:10:13 +0200 Subject: [PATCH 0131/1055] formatting more in asteriskjava style --- .../asteriskjava/live/internal/AsteriskChannelImpl.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index 2aea2ca75..ab4011cef 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -472,8 +472,13 @@ synchronized void hungup(Date dateOfRemoval, HangupCause hangupCause, String han stateChanged(dateOfRemoval, ChannelState.HUNGUP); } - /* dialed channels */ - + + + /** + * Retrives the conplete List of all dialed channels associated to ths calls + * + * @return List of all dialed channels + */ public List getDialedChannels() { final List copy; From 3ac10bc0dae47fea6ba1c66cf94d63ac1e44d612 Mon Sep 17 00:00:00 2001 From: Zoumana TRAORE Date: Mon, 18 May 2015 01:46:11 +0200 Subject: [PATCH 0132/1055] Moving to 1.0.0 Release --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 89c89815c..246d4a244 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.asteriskjava asterisk-java Asterisk-Java - 1.0.0.RC1 + 1.0.0 The free Java library for Asterisk PBX integration. 2004 From f7502a390a8ee5090f18a62666837285c1dc46ad Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 13:43:02 +0200 Subject: [PATCH 0133/1055] Add /bin to .gitignore modified: .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 642253e4d..a91655ccc 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ target .idea .gradle classes +/bin From ead970d69b990226e65d22c456bf1b5feb5f94f7 Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 15:25:34 +0200 Subject: [PATCH 0134/1055] Prevent multiple registrations of asterisk server listeners --- .../org/asteriskjava/live/AsteriskServer.java | 8 ++++++++ .../live/DefaultAsteriskServer.java | 4 ++++ .../live/internal/AbstractLiveObject.java | 11 ++++++++++- .../live/internal/AsteriskServerImpl.java | 17 ++++++++++++++--- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/AsteriskServer.java b/src/main/java/org/asteriskjava/live/AsteriskServer.java index 2c3be9339..2700168cb 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/AsteriskServer.java @@ -479,6 +479,14 @@ void setGlobalVariable(String variable, String value) */ void removeAsteriskServerListener(AsteriskServerListener listener); + /** + * Checks whether the listener is already registered with this Asterisk server + * + * @param listener the listener to check + * @return true, if the listener is already registered. + */ + boolean isAsteriskServerListening(AsteriskServerListener listener); + /** * The chainListener allows a listener to receive manager events after they * have been processed by the AsteriskServer. If the AsteriskServer is diff --git a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java index 9e04a016d..0da60e62d 100644 --- a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java @@ -305,6 +305,10 @@ public void addAsteriskServerListener(AsteriskServerListener listener) throws Ma public void removeAsteriskServerListener(AsteriskServerListener listener) { this.impl.removeAsteriskServerListener(listener); + } + + public boolean isAsteriskServerListening(AsteriskServerListener listener){ + return this.impl.isAsteriskServerListening(listener); } public void shutdown() diff --git a/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java b/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java index 48a49c602..d3fae5d78 100644 --- a/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java +++ b/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java @@ -58,7 +58,16 @@ public void addPropertyChangeListener(PropertyChangeListener listener) public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - changes.addPropertyChangeListener(propertyName, listener); + boolean haveToAdd = true; + for(PropertyChangeListener l : changes.getPropertyChangeListeners()){ + if(l == listener){ + haveToAdd = false; + break; + } + } + if(haveToAdd){ + changes.addPropertyChangeListener(propertyName, listener); + } } public void removePropertyChangeListener(PropertyChangeListener listener) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 4be5ed155..b9cf7b6b8 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -871,16 +871,21 @@ public ConfigFile getConfig(String filename) throws ManagerCommunicationExceptio return new ConfigFileImpl(filename, categories); } - public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException + @Override + public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException { initializeIfNeeded(); synchronized (listeners) { - listeners.add(listener); + if(!listeners.contains(listener)) + { + listeners.add(listener); + } } } - public void removeAsteriskServerListener(AsteriskServerListener listener) + @Override + public void removeAsteriskServerListener(AsteriskServerListener listener) { synchronized (listeners) { @@ -888,6 +893,12 @@ public void removeAsteriskServerListener(AsteriskServerListener listener) } } + @Override + public boolean isAsteriskServerListening(AsteriskServerListener listener) + { + return listeners.contains(listener); + } + public void addChainListener(ManagerEventListener chainListener) { synchronized (this.chainListeners) From 49bcfdd26603f5adb865ecf51fe2a6c4e6e1b9fc Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 15:32:34 +0200 Subject: [PATCH 0135/1055] Add System Name property to ManagerEvent --- .../org/asteriskjava/manager/event/ManagerEvent.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java index 9b1e2118b..06f200e85 100644 --- a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java @@ -147,6 +147,8 @@ public void setContext(String context) { */ private String server; + private String systemName; + // AJ-213 only used when debugging is turned on private String file; private Integer line; @@ -260,6 +262,14 @@ public final void setServer(String server) this.server = server; } + public String getSystemName() { + return systemName; + } + + public void setSystemName(String systemName) { + this.systemName = systemName; + } + /** * Returns the name of the file in Asterisk's source code that triggered this event. For example * pbx.c.

From 1b886cc8039b2ac094d85529b8e8905ff76dc181 Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 15:37:43 +0200 Subject: [PATCH 0136/1055] Remove properties from some user events that unnecessarily override ManagerEvent properties --- .../manager/event/AbstractChannelEvent.java | 68 +---------------- .../event/AbstractChannelStateEvent.java | 24 +----- .../manager/event/AgentCalledEvent.java | 53 -------------- .../manager/event/CoreShowChannelEvent.java | 29 -------- .../manager/event/MeetMeLeaveEvent.java | 67 ----------------- .../manager/event/NewChannelEvent.java | 65 ----------------- .../manager/event/QueueEntryEvent.java | 68 ----------------- .../manager/event/StatusEvent.java | 56 +------------- .../manager/event/VarSetEvent.java | 73 ------------------- 9 files changed, 8 insertions(+), 495 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java index 5ca467dc3..439d3f7c5 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java @@ -34,24 +34,11 @@ public abstract class AbstractChannelEvent extends ManagerEvent */ private String channel; - /** - * This Caller*ID Number of the channel. - */ - private String callerIdNum; - - /** - * The Caller*ID Name of the channel. - */ - private String callerIdName; - /** * The unique id of the channel. */ private String uniqueId; - private String connectedlinenum; - private String connectedlinename; - protected AbstractChannelEvent(Object source) { super(source); @@ -96,7 +83,7 @@ public final void setUniqueId(String uniqueId) */ @Deprecated public final String getCallerId() { - return callerIdNum; + return getCallerIdNum(); } /** @@ -107,58 +94,7 @@ public final void setUniqueId(String uniqueId) */ @Deprecated public final void setCallerId(String callerId) { - this.callerIdNum = callerId; + setCallerIdNum(callerId); } - - /** - * Returns the Caller*ID number of the channel if set or null if none has been set. - * - * @return the Caller*ID number - * @since 0.3 - */ - public final String getCallerIdNum() - { - return callerIdNum; - } - - public final void setCallerIdNum(String callerIdNum) - { - this.callerIdNum = callerIdNum; - } - - /** - * Returns the Caller*ID Name of the channel if set or null if none has been set. - * - * @return the Caller*ID Name of the channel. - */ - public final String getCallerIdName() - { - return callerIdName; - } - - public final void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } - - public String getConnectedlinenum() - { - return connectedlinenum; - } - - public void setConnectedlinenum(String connectedlinenum) - { - this.connectedlinenum = connectedlinenum; - } - - public String getConnectedlinename() - { - return connectedlinename; - } - - public void setConnectedlinename(String connectedlinename) - { - this.connectedlinename = connectedlinename; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java index 1fda5c546..d190aaf7c 100755 --- a/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java @@ -34,34 +34,12 @@ public abstract class AbstractChannelStateEvent extends AbstractChannelEvent private Integer channelState; private String channelStateDesc; - private String connectedlinename; - private String connectedlinenum; protected AbstractChannelStateEvent(Object source) { super(source); } - public String getConnectedlinename() - { - return connectedlinename; - } - - public void setConnectedlinename(String connectedlinename) - { - this.connectedlinename = connectedlinename; - } - - public String getConnectedlinenum() - { - return connectedlinenum; - } - - public void setConnectedlinenum(String connectedlinenum) - { - this.connectedlinenum = connectedlinenum; - } - /** * Returns the new state of the channel. *

@@ -71,6 +49,7 @@ public void setConnectedlinenum(String connectedlinenum) * @return the new state of the channel. * @since 1.0.0 */ + @Override public Integer getChannelState() { return channelState == null ? AstState.str2state(channelStateDesc) : channelState; @@ -83,6 +62,7 @@ public Integer getChannelState() * the new state of the channel. * @since 1.0.0 */ + @Override public void setChannelState(Integer channelState) { this.channelState = channelState; diff --git a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java index b7de5d303..81be571a3 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java @@ -146,22 +146,6 @@ public void setDestinationChannel(String destinationChannel) this.destinationChannel = destinationChannel; } - /** - * Returns the Caller ID number of the caller's channel. - * - * @return the Caller ID number of the caller's channel or "unknown" of none has been set. - * @since 1.0.0 - */ - public String getCallerIdNum() - { - return callerIdNum; - } - - public void setCallerIdNum(String callerIdNum) - { - this.callerIdNum = callerIdNum; - } - /** * Returns the Caller ID number of the caller's channel. * @@ -184,29 +168,6 @@ public void setCallerId(String callerId) } - public String getCallerIdName() { return callerIdName; } - - /** - * Sets the Caller ID name of the caller's channel. - * - * @param callerIdName the Caller ID name of the caller's channel. - * @since 0.2 - */ - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } - - public String getContext() - { - return context; - } - - public void setContext(String context) - { - this.context = context; - } - public String getExtension() { return exten; @@ -260,18 +221,4 @@ public void setVariables(Map variables) this.variables = variables; } - /** - * Returns the Caller*ID name of the channel connected if set. - * If the channel has no caller id set "unknown" is returned. - * - * @since 1.0.0 - */ - - /** - * Returns the Caller*ID number of the channel connected if set. - * If the channel has no caller id set "unknown" is returned. - * - * @since 1.0.0 - */ - } diff --git a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java index 30e34b980..fd91c9f6c 100644 --- a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java @@ -43,8 +43,6 @@ public class CoreShowChannelEvent extends ResponseEvent private String accountcode; private String bridgedChannel; private String bridgeduniqueid; - private String connectedlinenum; - private String connectedlinename; public CoreShowChannelEvent(Object source) { @@ -224,13 +222,6 @@ public void setExtension(String extension) this.extension = extension; } - /** - * Returns the Priority the channel actualy is - * - * @return priority - */ - - /** * Returns the Uniqueid * @@ -246,24 +237,4 @@ public void setUniqueid(String uniqueid) this.uniqueid = uniqueid; } - public String getConnectedlinenum() - { - return connectedlinenum; - } - - public void setConnectedlinenum(String connectedlinenum) - { - this.connectedlinenum = connectedlinenum; - } - - public String getConnectedlinename() - { - return connectedlinename; - } - - public void setConnectedlinename(String connectedlinename) - { - this.connectedlinename = connectedlinename; - } - } diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java index e70b5738c..dbf12490c 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java @@ -31,10 +31,6 @@ public class MeetMeLeaveEvent extends AbstractMeetMeEvent */ private static final long serialVersionUID = 7692361610793036224L; - private String callerIdNum; - private String callerIdName; - private String connectedlinename; - private String connectedlinenum; private Long duration; /** @@ -45,48 +41,6 @@ public MeetMeLeaveEvent(Object source) super(source); } - /** - * Returns the Caller*ID Name of the channel that left the conference.

- * This property is available since Asterisk 1.4. - * - * @return the Caller*ID Name of the channel that left the conference. - */ - public String getCallerIdName() - { - return callerIdName; - } - - /** - * Sets the Caller*ID Name of the channel that left the conference. - * - * @param callerIdName the Caller*ID Name of the channel that left the conference. - */ - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } - - /** - * Returns the Caller*ID Number of the channel that left the conference.

- * This property is available since Asterisk 1.4. - * - * @return the Caller*ID Number of the channel that left the conference. - */ - public String getCallerIdNum() - { - return callerIdNum; - } - - /** - * Sets the Caller*ID Number of the channel that left the conference. - * - * @param callerIdNum the Caller*ID Number of the channel that left the conference. - */ - public void setCallerIdNum(String callerIdNum) - { - this.callerIdNum = callerIdNum; - } - /** * Returns how long the user spent in the conference.

* This property is available since Asterisk 1.4. @@ -107,25 +61,4 @@ public void setDuration(Long duration) { this.duration = duration; } - - public String getConnectedlinename() - { - return connectedlinename; - } - - public void setConnectedlinename(String connectedlinename) - { - this.connectedlinename = connectedlinename; - } - - public String getConnectedlinenum() - { - return connectedlinenum; - } - - public void setConnectedlinenum(String connectedlinenum) - { - this.connectedlinenum = connectedlinenum; - } - } diff --git a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java index 180997537..b31f10b08 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java @@ -31,9 +31,6 @@ public class NewChannelEvent extends AbstractChannelStateEvent static final long serialVersionUID = 1L; private String accountCode; - private String context; - private String exten; - private Integer priority; private String language; public NewChannelEvent(Object source) @@ -73,66 +70,4 @@ public void setAccountCode(String accountCode) { this.accountCode = accountCode; } - - /** - * Returns the context of the dialplan entry the channel started at.

- * This property is available since Asterisk 1.6. - * - * @return the context of the dialplan entry the channel started at. - * @since 1.0.0 - */ - public String getContext() - { - return context; - } - - /** - * Sets the context of the dialplan entry the channel started at. - * - * @param context the context of the dialplan entry the channel started at. - * @since 1.0.0 - */ - public void setContext(String context) - { - this.context = context; - } - - /** - * Returns the extension of the dialplan entry the channel started at.

- * This property is available since Asterisk 1.6. - * - * @return the extension of the dialplan entry the channel started at. - * @since 1.0.0 - */ - public String getExten() - { - return exten; - } - - /** - * Sets the extension of the dialplan entry the channel started at. - * - * @param exten the extension of the dialplan entry the channel started at. - * @since 1.0.0 - */ - public void setExten(String exten) - { - this.exten = exten; - } - - /** - * Returns the priority. - */ - public Integer getPriority() - { - return priority; - } - - /** - * Sets the priority. - */ - public void setPriority(Integer priority) - { - this.priority = priority; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java index c9b7327f6..2a6e53809 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java @@ -36,10 +36,6 @@ public class QueueEntryEvent extends ResponseEvent private String uniqueId; private String channel; private String callerId; - private String callerIdName; - private String callerIdNum; - private String connectedlinename; - private String connectedlinenum; private Long wait; /** @@ -137,50 +133,6 @@ public void setCallerId(String callerId) this.callerId = callerId; } - /** - * Returns the Caller*ID name of this entry. - * - * @return the Caller*ID name of this entry. - * @since 0.2 - */ - public String getCallerIdName() - { - return callerIdName; - } - - /** - * Sets the Caller*ID name of this entry. - * - * @param callerIdName the Caller*ID name of this entry. - * @since 0.2 - */ - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } - - /** - * Gets the Caller*ID num of this entry. - * - * @return the Caller*ID num of this entry. - * @since 1.0.0 - */ - public String getCallerIdNum() - { - return callerIdNum; - } - - /** - * Sets the Caller*ID num of this entry. - * - * @param callerIdNum the Caller*ID num of this entry. - * @since 1.0.0 - */ - public void setCallerIdNum(String callerIdNum) - { - this.callerIdNum = callerIdNum; - } - /** * Returns the number of seconds this entry has spent in the queue. */ @@ -196,25 +148,5 @@ public void setWait(Long wait) { this.wait = wait; } - - public String getConnectedlinename() - { - return connectedlinename; - } - - public void setConnectedlinename(String connectedlinename) - { - this.connectedlinename = connectedlinename; - } - - public String getConnectedlinenum() - { - return connectedlinenum; - } - - public void setConnectedlinenum(String connectedlinenum) - { - this.connectedlinenum = connectedlinenum; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java index 5a8c53207..eebbe4f1a 100644 --- a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java @@ -34,20 +34,12 @@ public class StatusEvent extends ResponseEvent */ private static final long serialVersionUID = -3619197512835308812L; private String channel; - private String callerIdNum; - private String callerIdName; private String accountCode; private Integer channelState; - private String channelStateDesc; - private String context; - private String extension; - private Integer priority; private Integer seconds; private String bridgedChannel; private String bridgedUniqueId; private String uniqueId; - private String connectedlinenum; - private String connectedlinename; private Map variables; public StatusEvent(Object source) @@ -232,42 +224,22 @@ public void setChannelStateDesc(String channelStateDesc) */ @Deprecated public String getState() { - return channelStateDesc; + return getChannelStateDesc(); } public void setState(String state) { - this.channelStateDesc = state; - } - - public String getContext() - { - return context; - } - - public void setContext(String context) - { - this.context = context; + setChannelStateDesc(state); } public String getExtension() { - return extension; + return getExten(); } public void setExtension(String extension) { - this.extension = extension; - } - - public Integer getPriority() - { - return priority; - } - - public void setPriority(Integer priority) - { - this.priority = priority; + setExten(extension); } /** @@ -402,25 +374,5 @@ public void setVariables(Map variables) { this.variables = variables; } - - public String getConnectedlinenum() - { - return connectedlinenum; - } - - public void setConnectedlinenum(String connectedlinenum) - { - this.connectedlinenum = connectedlinenum; - } - - public String getConnectedlinename() - { - return connectedlinename; - } - - public void setConnectedlinename(String connectedlinename) - { - this.connectedlinename = connectedlinename; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java index b553e55a5..201c24a24 100644 --- a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java @@ -33,7 +33,6 @@ public class VarSetEvent extends ManagerEvent private String uniqueId; private String variable; private String value; - private String callerIdName; private String language; public String getLanguage(){ @@ -43,78 +42,6 @@ public String getLanguage(){ public void setLanguage(String language){ this.language = language; } - - public String getConnectedLineName() { - return connectedLineName; - } - - public void setConnectedLineName(String connectedLineName) { - this.connectedLineName = connectedLineName; - } - - public String getChannelStateDesc() { - return channelStateDesc; - } - - public void setChannelStateDesc(String channelStateDesc) { - this.channelStateDesc = channelStateDesc; - } - - public Integer getPriority() { - return priority; - } - - public void setPriority(Integer priority) { - this.priority = priority; - } - - public String getExten() { - return exten; - } - - public void setExten(String exten) { - this.exten = exten; - } - - public String getCallerIdName() { - return callerIdName; - } - - public void setCallerIdName(String callerIdName) { - this.callerIdName = callerIdName; - } - - public String getConnectedLineNum() { - return connectedLineNum; - } - - public void setConnectedLineNum(String connectedLineName) { - this.connectedLineNum = connectedLineName; - } - - public Integer getChannelState() { - return channelState; - } - - public void setChannelState(Integer channelState) { - this.channelState = channelState; - } - - public String getCallerIdNum() { - return callerIdNum; - } - - public void setCallerIdNum(String callerIdNum) { - this.callerIdNum = callerIdNum; - } - - public String getContext() { - return context; - } - - public void setContext(String context) { - this.context = context; - } public VarSetEvent(Object source) { From df20146150935e10aebc4bb0a3bad5d2c77143a5 Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 16:31:33 +0200 Subject: [PATCH 0137/1055] Build legacy DialEvent from DialBeginEvent for backward compatibility --- .../manager/event/DialBeginEvent.java | 9 ++ .../asteriskjava/manager/event/DialEvent.java | 99 +++++-------------- .../internal/ManagerConnectionImpl.java | 15 ++- 3 files changed, 50 insertions(+), 73 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java index 8625ccc60..aad5f96ad 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -9,6 +9,7 @@ public class DialBeginEvent extends DialEvent private static final long serialVersionUID = 1L; private String language; private String destlanguage; + private String destAccountCode; public DialBeginEvent(Object source) { @@ -35,4 +36,12 @@ public void setDestLanguage(String destlanguage) { this.destlanguage = destlanguage; } + + public String getDestAccountCode() { + return destAccountCode; + } + + public void setDestAccountCode(String destAccountCode) { + this.destAccountCode = destAccountCode; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DialEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEvent.java index 7f3ef5cd8..94592fb49 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEvent.java @@ -99,15 +99,29 @@ public class DialEvent extends ManagerEvent private String dialString; private String dialStatus; - private String connectedLineNum; - - private String connectedLineName; - public DialEvent(Object source) { super(source); } + /** + * Enro 2015-03 + * Workaround to build legacy DialEvent (unsupported in Asterisk 13) from new DialBeginEvent Asterisk 13. + */ + public DialEvent(DialBeginEvent dialBeginEvent){ + this(dialBeginEvent.getSource()); + setDateReceived(dialBeginEvent.getDateReceived()); + setTimestamp(dialBeginEvent.getTimestamp()); + setPrivilege(dialBeginEvent.getPrivilege()); + setCallerId(dialBeginEvent.getCallerIdNum()); + setCallerIdName(dialBeginEvent.getCallerIdName()); + setSrc(dialBeginEvent.getChannel()); + setUniqueId(dialBeginEvent.getSrcUniqueId()); + setDestUniqueId(dialBeginEvent.getDestUniqueId()); + setDestination(dialBeginEvent.getDestChannel()); + setDialStatus(dialBeginEvent.getDialStatus()); + } + /** * Since Asterisk 1.6 the begin and the end of a dial command generate a Dial event. The * subEvent property returns whether the dial started execution ("Begin") or completed ("End"). @@ -182,7 +196,11 @@ public String getDestination() { return destination; } - public String getDestChannel() { return getDestination(); } + + public String getDestChannel() + { + return getDestination(); + } /** * Sets the name of the destination channel. @@ -193,21 +211,10 @@ public void setDestination(String destination) { this.destination = destination; } - public void setDestChannel(String destination) { setDestination(destination); } - /** - * Returns the the Caller*ID Number. - * - * @return the the Caller*ID Number or "<unknown>" if none has been set. - * @since 1.0.0 - */ - public String getCallerIdNum() - { - return callerIdNum; - } - - public void setCallerIdNum(String callerIdNum) - { - this.callerIdNum = callerIdNum; + + public void setDestChannel(String destination) + { + setDestination(destination); } /** @@ -231,26 +238,6 @@ public void setCallerId(String callerId) this.callerIdNum = callerId; } - /** - * Returns the Caller*ID Name. - * - * @return the Caller*ID Name or "<unknown>" if none has been set. - */ - public String getCallerIdName() - { - return callerIdName; - } - - /** - * Sets the Caller*Id Name. - * - * @param callerIdName the Caller*Id Name to set. - */ - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } - /** * Returns the unique ID of the source channel. * @@ -368,38 +355,6 @@ public void setDialStatus(String dialStatus) this.dialStatus = dialStatus; } - /** - * Returns the Caller*ID number of the channel connected if set. - * If the channel has no caller id set "unknown" is returned. - * - * @since 1.0.0 - */ - public String getConnectedLineNum() - { - return connectedLineNum; - } - - public void setConnectedLineNum(String connectedLineNum) - { - this.connectedLineNum = connectedLineNum; - } - - /** - * Returns the Caller*ID name of the channel connected if set. - * If the channel has no caller id set "unknown" is returned. - * - * @since 1.0.0 - */ - public String getConnectedLineName() - { - return connectedLineName; - } - - public void setConnectedLineName(String connectedLineName) - { - this.connectedLineName = connectedLineName; - } - @Override public String toString() { diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 205bf6f03..eac6c05e4 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -46,6 +46,8 @@ import org.asteriskjava.manager.action.LogoffAction; import org.asteriskjava.manager.action.ManagerAction; import org.asteriskjava.manager.event.ConnectEvent; +import org.asteriskjava.manager.event.DialBeginEvent; +import org.asteriskjava.manager.event.DialEvent; import org.asteriskjava.manager.event.DisconnectEvent; import org.asteriskjava.manager.event.ManagerEvent; import org.asteriskjava.manager.event.ProtocolIdentifierReceivedEvent; @@ -1199,7 +1201,7 @@ public void dispatchEvent(ManagerEvent event) logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); return; } - + dispatchLegacyEventIfNeeded(event); logger.debug("Dispatching event:\n" + event.toString()); // Some events need special treatment besides forwarding them to the @@ -1297,6 +1299,17 @@ public void run() fireEvent(event); } + /** + * Enro 2015-03 + * Workaround to continue having Legacy Events from Asterisk 13. + */ + private void dispatchLegacyEventIfNeeded(ManagerEvent event) { + if (event instanceof DialBeginEvent){ + DialEvent legacyEvent = (new DialEvent((DialBeginEvent) event)); + dispatchEvent(legacyEvent); + } + } + /** * Notifies all {@link ManagerEventListener}s registered by users. * From de4efaba8845269279d72ede5033fcb7ec949c5d Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 16:39:20 +0200 Subject: [PATCH 0138/1055] Restructure Park / Unpark events according to Asterisk 12 AMI Spec --- .../event/AbstractParkedCallEvent.java | 283 ++++++++++++++---- .../manager/event/AbstractUnParkedEvent.java | 170 +++++++++++ .../manager/event/ParkedCallEvent.java | 17 -- .../manager/event/ParkedCallGiveUpEvent.java | 2 +- .../manager/event/ParkedCallTimeOutEvent.java | 2 +- .../manager/event/UnparkedCallEvent.java | 103 +++++-- 6 files changed, 478 insertions(+), 99 deletions(-) create mode 100644 src/main/java/org/asteriskjava/manager/event/AbstractUnParkedEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java index f7d42d9ee..f4db8afbd 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java @@ -26,46 +26,53 @@ public abstract class AbstractParkedCallEvent extends ManagerEvent { private static final long serialVersionUID = 0L; - private String exten; - private String channel; - private String parkingLot; - private String callerIdNum; - private String callerIdName; private String uniqueId; + // Previously: Channel + private String parkeeChannel; + private Integer parkeeChannelState; + private String parkeeChannelStateDesc; + // previously CallerID + private String parkeeCallerIDNum; + // Previously CallerIDName + private String parkeeCallerIDName; + private Integer parkeeConnectedLineNum; + private String parkeeConnectedLineName; + private String parkeeLanguage; + private String parkeeAccountCode; + private String parkeeContext; + private String parkeeExten; + private Integer parkeePriority; + private String parkeeUniqueid; + // Previously: From + private String parkerDialString; + private String parkingLot; + // previously Exten + private String parkingSpace; + private Long parkingTimeout; + private Long parkingDuration; protected AbstractParkedCallEvent(Object source) { super(source); } + /** - * Returns the extension the channel is or was parked at. - * - * @return the extension the channel is or was parked at. + * Returns the name of the channel that parked the call. */ - public String getExten() - { - return exten; - } - - public void setExten(String exten) + @Deprecated + public String getFrom() { - this.exten = exten; + return getParkerDialString(); } /** - * Returns the name of the channel that is or was parked. - * - * @return the name of the channel that is or was parked. + * Sets the name of the channel that parked the call. */ - public String getChannel() + @Deprecated + public void setFrom(String from) { - return channel; - } - - public void setChannel(String channel) - { - this.channel = channel; + this.setParkerDialString(from); } /** @@ -96,50 +103,16 @@ public void setParkingLot(String parkingLot) * @return the Caller*ID number of the parked channel. * @since 1.0.0 */ + @Override public String getCallerIdNum() { - return callerIdNum; + return getParkeeCallerIDNum(); } + @Override public void setCallerIdNum(String callerIdNum) { - this.callerIdNum = callerIdNum; - } - - /** - * Returns the Caller*ID number of the parked channel. - * - * @return the Caller*ID number of the parked channel. - * @deprecated since 1.0.0. Use {@link #getCallerIdNum()} instead. - */ - @Deprecated public String getCallerId() - { - return callerIdNum; - } - - public void setCallerId(String callerId) - { - this.callerIdNum = callerId; - } - - /** - * Returns the Caller*ID name of the parked channel. - * - * @return the Caller*ID name of the parked channel. - */ - public String getCallerIdName() - { - return callerIdName; - } - - /** - * Sets the Caller*ID name of the parked channel. - * - * @param callerIdName the Caller*ID name of the parked channel. - */ - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; + this.setParkeeCallerIDNum(callerIdNum); } /** @@ -161,4 +134,188 @@ public void setUniqueId(String uniqueId) { this.uniqueId = uniqueId; } + + @Deprecated + public void setChannel(String channel) { + this.setParkeeChannel(channel); + } + + @Deprecated + public String getChannel() { + return this.getParkeeChannel(); + } + + public String getParkeeChannel() { + return parkeeChannel; + } + + public void setParkeeChannel(String parkeeChannel) { + this.parkeeChannel = parkeeChannel; + } + + public Integer getParkeeChannelState() { + return parkeeChannelState; + } + + public void setParkeeChannelState(Integer parkeeChannelState) { + this.parkeeChannelState = parkeeChannelState; + } + + public String getParkeeChannelStateDesc() { + return parkeeChannelStateDesc; + } + + public void setParkeeChannelStateDesc(String parkeeChannelStateDesc) { + this.parkeeChannelStateDesc = parkeeChannelStateDesc; + } + + public String getParkeeCallerIDNum() { + return parkeeCallerIDNum; + } + + public void setParkeeCallerIDNum(String parkeeCallerIDNum) { + this.parkeeCallerIDNum = parkeeCallerIDNum; + } + + public String getParkeeCallerIDName() { + return parkeeCallerIDName; + } + + public void setParkeeCallerIDName(String parkeeCallerIDName) { + this.parkeeCallerIDName = parkeeCallerIDName; + } + + public Integer getParkeeConnectedLineNum() { + return parkeeConnectedLineNum; + } + + public void setParkeeConnectedLineNum(Integer parkeeConnectedLineNum) { + this.parkeeConnectedLineNum = parkeeConnectedLineNum; + } + + public String getParkeeConnectedLineName() { + return parkeeConnectedLineName; + } + + public void setParkeeConnectedLineName(String parkeeConnectedLineName) { + this.parkeeConnectedLineName = parkeeConnectedLineName; + } + + public String getParkeeLanguage() { + return parkeeLanguage; + } + + public void setParkeeLanguage(String parkeeLanguage) { + this.parkeeLanguage = parkeeLanguage; + } + + public String getParkeeAccountCode() { + return parkeeAccountCode; + } + + public void setParkeeAccountCode(String parkeeAccountCode) { + this.parkeeAccountCode = parkeeAccountCode; + } + + public String getParkeeContext() { + return parkeeContext; + } + + public void setParkeeContext(String parkeeContext) { + this.parkeeContext = parkeeContext; + } + + public String getParkeeExten() { + return parkeeExten; + } + + public void setParkeeExten(String parkeeExten) { + this.parkeeExten = parkeeExten; + } + + public Integer getParkeePriority() { + return parkeePriority; + } + + public void setParkeePriority(Integer parkeePriority) { + this.parkeePriority = parkeePriority; + } + + public String getParkeeUniqueid() { + return parkeeUniqueid; + } + + public void setParkeeUniqueid(String parkeeUniqueid) { + this.parkeeUniqueid = parkeeUniqueid; + } + + public String getParkerDialString() { + return parkerDialString; + } + + public void setParkerDialString(String parkerDialString) { + this.parkerDialString = parkerDialString; + } + + public String getParkinglot() { + return parkingLot; + } + + public void setParkinglot(String parkinglot) { + this.parkingLot = parkinglot; + } + + public String getParkingSpace() { + return parkingSpace; + } + + public void setParkingSpace(String parkingSpace) { + this.parkingSpace = parkingSpace; + } + + public Long getParkingTimeout() { + return parkingTimeout; + } + + public void setParkingTimeout(Long parkingTimeout) { + this.parkingTimeout = parkingTimeout; + } + + public Long getParkingDuration() { + return parkingDuration; + } + + public void setParkingDuration(Long parkingDuration) { + this.parkingDuration = parkingDuration; + } + + @Deprecated + public String getCallerId() { + return getParkeeCallerIDNum(); + } + + @Deprecated + public void setCallerId(String callerId) { + setParkeeCallerIDNum(callerId); + } + + @Deprecated + public String getCallerIdName() { + return getParkeeCallerIDName(); + } + + @Deprecated + public void setCallerIdName(String callerIdName) { + setParkeeCallerIDName(callerIdName); + } + + @Deprecated + public String getExten() { + return getParkingSpace(); + } + + @Deprecated + public void setExten(String exten) { + setParkingSpace(exten); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractUnParkedEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractUnParkedEvent.java new file mode 100644 index 000000000..0ea18be65 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AbstractUnParkedEvent.java @@ -0,0 +1,170 @@ +/* + * Copyright 2004-2006 Stefan Reuter + * + * Licensed 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.asteriskjava.manager.event; + +/** + * Enro 2015-03: Asterisk 13 Support + */ +public class AbstractUnParkedEvent extends AbstractParkedCallEvent +{ + /** + * Serializable version identifier + */ + private static final long serialVersionUID = -7437833328723536814L; + + private String parkerChannel; + private Integer parkerChannelState; + private String parkerChannelStateDesc; + private String parkerCallerIDNum; + private String parkerCallerIDName; + private String parkerConnectedLineNum; + private String parkerConnectedLineName; + private String parkerAccountCode; + private String parkerContext; + private String parkerExten; + private String parkerPriority; + private String parkerUniqueid; + + + /** + * @param source + */ + public AbstractUnParkedEvent(Object source) + { + super(source); + } + + + public String getParkerChannel() { + return parkerChannel; + } + + + public void setParkerChannel(String parkerChannel) { + this.parkerChannel = parkerChannel; + } + + + public Integer getParkerChannelState() { + return parkerChannelState; + } + + + public void setParkerChannelState(Integer parkerChannelState) { + this.parkerChannelState = parkerChannelState; + } + + + public String getParkerChannelStateDesc() { + return parkerChannelStateDesc; + } + + + public void setParkerChannelStateDesc(String parkerChannelStateDesc) { + this.parkerChannelStateDesc = parkerChannelStateDesc; + } + + + public String getParkerCallerIDNum() { + return parkerCallerIDNum; + } + + + public void setParkerCallerIDNum(String parkerCallerIDNum) { + this.parkerCallerIDNum = parkerCallerIDNum; + } + + + public String getParkerCallerIDName() { + return parkerCallerIDName; + } + + + public void setParkerCallerIDName(String parkerCallerIDName) { + this.parkerCallerIDName = parkerCallerIDName; + } + + + public String getParkerConnectedLineNum() { + return parkerConnectedLineNum; + } + + + public void setParkerConnectedLineNum(String parkerConnectedLineNum) { + this.parkerConnectedLineNum = parkerConnectedLineNum; + } + + + public String getParkerConnectedLineName() { + return parkerConnectedLineName; + } + + + public void setParkerConnectedLineName(String parkerConnectedLineName) { + this.parkerConnectedLineName = parkerConnectedLineName; + } + + + public String getParkerAccountCode() { + return parkerAccountCode; + } + + + public void setParkerAccountCode(String parkerAccountCode) { + this.parkerAccountCode = parkerAccountCode; + } + + + public String getParkerContext() { + return parkerContext; + } + + + public void setParkerContext(String parkerContext) { + this.parkerContext = parkerContext; + } + + + public String getParkerExten() { + return parkerExten; + } + + + public void setParkerExten(String parkerExten) { + this.parkerExten = parkerExten; + } + + + public String getParkerPriority() { + return parkerPriority; + } + + + public void setParkerPriority(String parkerPriority) { + this.parkerPriority = parkerPriority; + } + + + public String getParkerUniqueid() { + return parkerUniqueid; + } + + + public void setParkerUniqueid(String parkerUniqueid) { + this.parkerUniqueid = parkerUniqueid; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/ParkedCallEvent.java b/src/main/java/org/asteriskjava/manager/event/ParkedCallEvent.java index 310e75fd8..f46370dc2 100644 --- a/src/main/java/org/asteriskjava/manager/event/ParkedCallEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ParkedCallEvent.java @@ -32,7 +32,6 @@ public class ParkedCallEvent extends AbstractParkedCallEvent */ private static final long serialVersionUID = 0L; - private String from; private Integer timeout; @@ -44,22 +43,6 @@ public ParkedCallEvent(Object source) super(source); } - /** - * Returns the name of the channel that parked the call. - */ - public String getFrom() - { - return from; - } - - /** - * Sets the name of the channel that parked the call. - */ - public void setFrom(String from) - { - this.from = from; - } - /** * Returns the number of seconds this call will be parked.

* This corresponds to the parkingtime option in diff --git a/src/main/java/org/asteriskjava/manager/event/ParkedCallGiveUpEvent.java b/src/main/java/org/asteriskjava/manager/event/ParkedCallGiveUpEvent.java index 944f8dd52..7cc358b15 100644 --- a/src/main/java/org/asteriskjava/manager/event/ParkedCallGiveUpEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ParkedCallGiveUpEvent.java @@ -26,7 +26,7 @@ * @version $Id$ * @since 0.2 */ -public class ParkedCallGiveUpEvent extends AbstractParkedCallEvent +public class ParkedCallGiveUpEvent extends AbstractUnParkedEvent { /** * Serializable version identifier diff --git a/src/main/java/org/asteriskjava/manager/event/ParkedCallTimeOutEvent.java b/src/main/java/org/asteriskjava/manager/event/ParkedCallTimeOutEvent.java index 4b241547f..aef3fc5f4 100644 --- a/src/main/java/org/asteriskjava/manager/event/ParkedCallTimeOutEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ParkedCallTimeOutEvent.java @@ -26,7 +26,7 @@ * @version $Id$ * @since 0.2 */ -public class ParkedCallTimeOutEvent extends AbstractParkedCallEvent +public class ParkedCallTimeOutEvent extends AbstractUnParkedEvent { /** * Serializable version identifier diff --git a/src/main/java/org/asteriskjava/manager/event/UnparkedCallEvent.java b/src/main/java/org/asteriskjava/manager/event/UnparkedCallEvent.java index 3b63fb0fd..9d34c13ca 100644 --- a/src/main/java/org/asteriskjava/manager/event/UnparkedCallEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/UnparkedCallEvent.java @@ -26,15 +26,28 @@ * @version $Id$ * @since 0.2 */ -public class UnparkedCallEvent extends AbstractParkedCallEvent +public class UnparkedCallEvent extends AbstractUnParkedEvent { /** * Serializable version identifier */ private static final long serialVersionUID = -7437833328723536814L; - private String from; - + /** + * Enro 2015-03: Asterisk 13 Support + */ + private String RetrieverChannel; + private Integer RetrieverChannelState; + private String RetrieverChannelStateDesc; + private String RetrieverCallerIDNum; + private String RetrieverCallerIDName; + private String RetrieverConnectedLineNum; + private String RetrieverConnectedLineName; + private String RetrieverAccountCode; + private String RetrieverContext; + private String RetrieverExten; + private String RetrieverPriority; + private String RetrieverUniqueid; /** * @param source */ @@ -42,20 +55,76 @@ public UnparkedCallEvent(Object source) { super(source); } - - /** - * Returns the name of the channel that parked the call. - */ - public String getFrom() - { - return from; + public String getRetrieverChannel() { + return RetrieverChannel; + } + public void setRetrieverChannel(String retrieverChannel) { + RetrieverChannel = retrieverChannel; + } + public Integer getRetrieverChannelState() { + return RetrieverChannelState; + } + public void setRetrieverChannelState(Integer retrieverChannelState) { + RetrieverChannelState = retrieverChannelState; + } + public String getRetrieverChannelStateDesc() { + return RetrieverChannelStateDesc; + } + public void setRetrieverChannelStateDesc(String retrieverChannelStateDesc) { + RetrieverChannelStateDesc = retrieverChannelStateDesc; + } + public String getRetrieverCallerIDNum() { + return RetrieverCallerIDNum; + } + public void setRetrieverCallerIDNum(String retrieverCallerIDNum) { + RetrieverCallerIDNum = retrieverCallerIDNum; + } + public String getRetrieverCallerIDName() { + return RetrieverCallerIDName; + } + public void setRetrieverCallerIDName(String retrieverCallerIDName) { + RetrieverCallerIDName = retrieverCallerIDName; + } + public String getRetrieverConnectedLineNum() { + return RetrieverConnectedLineNum; + } + public void setRetrieverConnectedLineNum(String retrieverConnectedLineNum) { + RetrieverConnectedLineNum = retrieverConnectedLineNum; + } + public String getRetrieverConnectedLineName() { + return RetrieverConnectedLineName; + } + public void setRetrieverConnectedLineName(String retrieverConnectedLineName) { + RetrieverConnectedLineName = retrieverConnectedLineName; + } + public String getRetrieverAccountCode() { + return RetrieverAccountCode; + } + public void setRetrieverAccountCode(String retrieverAccountCode) { + RetrieverAccountCode = retrieverAccountCode; + } + public String getRetrieverContext() { + return RetrieverContext; + } + public void setRetrieverContext(String retrieverContext) { + RetrieverContext = retrieverContext; + } + public String getRetrieverExten() { + return RetrieverExten; + } + public void setRetrieverExten(String retrieverExten) { + RetrieverExten = retrieverExten; + } + public String getRetrieverPriority() { + return RetrieverPriority; + } + public void setRetrieverPriority(String retrieverPriority) { + RetrieverPriority = retrieverPriority; + } + public String getRetrieverUniqueid() { + return RetrieverUniqueid; } - - /** - * Sets the name of the channel that parked the call. - */ - public void setFrom(String from) - { - this.from = from; + public void setRetrieverUniqueid(String retrieverUniqueid) { + RetrieverUniqueid = retrieverUniqueid; } } From 18f51ff8db37dc978d145e4417e07b50349b94ce Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 16:40:17 +0200 Subject: [PATCH 0139/1055] Prevent null pointer in MeetMeManager --- .../java/org/asteriskjava/live/internal/MeetMeManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java index 872f7e98a..86537cf70 100644 --- a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java +++ b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java @@ -226,6 +226,10 @@ private void populateRoom(MeetMeRoomImpl room) userNumber = Integer.valueOf(matcher.group(1)); channel = channelManager.getChannelImplByName(matcher.group(2)); + if(channel == null) // User has left the room already in the meanwhile + { + continue; + } userNumbers.add(userNumber); From 63d10daef8328f11e68c669f1ec6dd416ca8a101 Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 16:44:34 +0200 Subject: [PATCH 0140/1055] Keep track of initializing status of AsteriskServerImpl --- .../live/internal/AsteriskServerImpl.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index b9cf7b6b8..415ef5b25 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -141,9 +141,10 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener */ private ManagerConnection eventConnection; private ManagerEventListener eventListener = null; - ManagerEventListenerProxy managerEventListenerProxy; + private ManagerEventListenerProxy managerEventListenerProxy; - boolean initialized = false; + private boolean initialized = false; + private boolean initializing = false; final Set listeners; @@ -273,7 +274,7 @@ public void initialize() throws ManagerCommunicationException private synchronized void initializeIfNeeded() throws ManagerCommunicationException { - if (initialized) + if (initialized || initializing) { return; } @@ -287,6 +288,9 @@ else if (!asyncEventHandling && eventListener == null) eventListener = this; eventConnection.addEventListener(eventListener); } + + initializing = true; + if (eventConnection.getState() == ManagerConnectionState.INITIAL || eventConnection.getState() == ManagerConnectionState.DISCONNECTED) { @@ -1209,6 +1213,7 @@ private void handleDisconnectEvent(DisconnectEvent disconnectEvent) meetMeManager.disconnected(); queueManager.disconnected(); initialized = false; + initializing = false; } /* @@ -1232,6 +1237,7 @@ private void handleConnectEvent(ConnectEvent connectEvent) logger.info("Initializing done"); initialized = true; + initializing = false; } catch (Exception e) { @@ -1355,16 +1361,16 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) managerEventListenerProxy.shutdown(); } - if (eventConnection != null && eventListener != null) { - eventConnection.removeEventListener(eventListener); - } + if (eventConnection != null && eventListener != null) { + eventConnection.removeEventListener(eventListener); + } - managerEventListenerProxy = null; + managerEventListenerProxy = null; eventListener = null; - if (initialized) {//incredible, but it happened - handleDisconnectEvent(null); - }//i + if (initialized) {//incredible, but it happened + handleDisconnectEvent(null); + }//i }//shutdown public List getPeerEntries() throws ManagerCommunicationException From 76f914ea2ab6daaaeb5084e07f58802f9624879c Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 16:51:04 +0200 Subject: [PATCH 0141/1055] Determine ChannelState in handleOriginate Event in the same way as in 1.1 branch --- .../asteriskjava/live/internal/AsteriskServerImpl.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index 415ef5b25..e2e4c4e0e 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -1332,14 +1332,8 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) } } - if (channel.wasInState(ChannelState.DOWN)) - { - cb.onNoAnswer(channel); - return; - } - - // if nothing else matched we asume success - cb.onSuccess(channel); + // if nothing else matched we asume no answer + cb.onNoAnswer(channel); } catch (Throwable t) { From 9fbc6889b7033ee7beaaa4b514f532a87e618c66 Mon Sep 17 00:00:00 2001 From: enro Date: Mon, 18 May 2015 16:54:45 +0200 Subject: [PATCH 0142/1055] Restructure Hold / Unhold Events to be consistent with Asterisk 12 AMI Spec --- .../manager/event/AbstractHoldEvent.java | 155 ++++++++++++++++++ .../asteriskjava/manager/event/HoldEvent.java | 104 +----------- .../manager/event/UnholdEvent.java | 5 +- 3 files changed, 165 insertions(+), 99 deletions(-) create mode 100644 src/main/java/org/asteriskjava/manager/event/AbstractHoldEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractHoldEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractHoldEvent.java new file mode 100644 index 000000000..29b92e07e --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AbstractHoldEvent.java @@ -0,0 +1,155 @@ +package org.asteriskjava.manager.event; + +/** + * A HoldEvent is triggered when a channel is put on hold (or no longer on hold).

+ * It is implemented in channels/chan_sip.c.

+ * Available since Asterisk 1.2 for SIP channels, as of Asterisk 1.6 this event + * is also supported for IAX2 channels.

+ * To receive HoldEvents for SIP channels you must set callevents = yes + * in sip.conf. + * + * @author enro + * @version $Id$ + * @since 1.0.0.10 + */ +public class AbstractHoldEvent extends ManagerEvent +{ + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 0L; + + /** + * The name of the channel. + */ + private String channel; + + private String callerIDNum; + private String callerIDName; + private String accountCode; + + /** + * The unique id of the channel. + */ + private String uniqueId; + + private Boolean status; + + /** + * Creates a new HoldEvent. + * + * @param source + */ + public AbstractHoldEvent(Object source) + { + super(source); + } + + /** + * Returns the name of the channel. + * + * @return channel the name of the channel. + */ + public String getChannel() + { + return channel; + } + + /** + * Sets the name of the channel. + * + * @param channel the name of the channel. + */ + public void setChannel(String channel) + { + this.channel = channel; + } + + /** + * Returns the unique id of the channel. + * + * @return the unique id of the channel. + */ + public String getUniqueId() + { + return uniqueId; + } + + /** + * Sets the unique id of the channel. + * + * @param uniqueId the unique id of the channel. + */ + public void setUniqueId(String uniqueId) + { + this.uniqueId = uniqueId; + } + + /** + * Returns whether this is a hold or unhold event. + * + * @return true if this a hold event, false if it's an unhold event. + * @since 1.0.0 + */ + public Boolean getStatus() + { + return status; + } + + /** + * Returns whether this is a hold or unhold event. + * + * @param status true if this a hold event, false if it's an unhold event. + * @since 1.0.0 + */ + public void setStatus(Boolean status) + { + this.status = status; + } + + /** + * Returns whether this is a hold event. + * + * @return true if this a hold event, false if it's an unhold event. + * @since 1.0.0 + */ + public boolean isHold() + { + return status != null && status; + } + + /** + * Returns whether this is an unhold event. + * + * @return true if this an unhold event, false if it's a hold event. + * @since 1.0.0 + */ + public boolean isUnhold() + { + return status != null && !status; + } + + public String getCallerIDNum() { + return callerIDNum; + } + + public void setCallerIDNum(String callerIDNum) { + this.callerIDNum = callerIDNum; + } + + public String getCallerIDName() { + return callerIDName; + } + + public void setCallerIDName(String callerIDName) { + this.callerIDName = callerIDName; + } + + public String getAccountCode() { + return accountCode; + } + + public void setAccountCode(String accountCode) { + this.accountCode = accountCode; + } +} diff --git a/src/main/java/org/asteriskjava/manager/event/HoldEvent.java b/src/main/java/org/asteriskjava/manager/event/HoldEvent.java index a51fbc9da..d258625b2 100644 --- a/src/main/java/org/asteriskjava/manager/event/HoldEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HoldEvent.java @@ -28,25 +28,14 @@ * @version $Id$ * @since 0.2 */ -public class HoldEvent extends ManagerEvent +public class HoldEvent extends AbstractHoldEvent { /** * Serializable version identifier. */ private static final long serialVersionUID = 0L; - /** - * The name of the channel. - */ - private String channel; - - /** - * The unique id of the channel. - */ - private String uniqueId; - - private Boolean status; - + private String musicClass; /** * Creates a new HoldEvent. * @@ -55,96 +44,19 @@ public class HoldEvent extends ManagerEvent public HoldEvent(Object source) { super(source); - - /* Asterisk prior to 1.6 uses Hold and Unhold events instead of the status + /* Asterisk prior to 1.6 and after 11 uses Hold and Unhold events instead of the status * So we set the status to true in the Hold event and to false in Unhold. - * For Asterisk 1.6 this is overridden by the status property received with + * For Asterisk 1.6-11 this is overridden by the status property received with * the hold event. */ setStatus(true); } - /** - * Returns the name of the channel. - * - * @return channel the name of the channel. - */ - public String getChannel() - { - return channel; - } - - /** - * Sets the name of the channel. - * - * @param channel the name of the channel. - */ - public void setChannel(String channel) - { - this.channel = channel; - } - - /** - * Returns the unique id of the channel. - * - * @return the unique id of the channel. - */ - public String getUniqueId() - { - return uniqueId; - } - - /** - * Sets the unique id of the channel. - * - * @param uniqueId the unique id of the channel. - */ - public void setUniqueId(String uniqueId) - { - this.uniqueId = uniqueId; - } - - /** - * Returns whether this is a hold or unhold event. - * - * @return true if this a hold event, false if it's an unhold event. - * @since 1.0.0 - */ - public Boolean getStatus() - { - return status; - } - - /** - * Returns whether this is a hold or unhold event. - * - * @param status true if this a hold event, false if it's an unhold event. - * @since 1.0.0 - */ - public void setStatus(Boolean status) - { - this.status = status; + public String getMusicClass() { + return musicClass; } - /** - * Returns whether this is a hold event. - * - * @return true if this a hold event, false if it's an unhold event. - * @since 1.0.0 - */ - public boolean isHold() - { - return status != null && status; - } - - /** - * Returns whether this is an unhold event. - * - * @return true if this an unhold event, false if it's a hold event. - * @since 1.0.0 - */ - public boolean isUnhold() - { - return status != null && !status; + public void setMusicClass(String musicClass) { + this.musicClass = musicClass; } } diff --git a/src/main/java/org/asteriskjava/manager/event/UnholdEvent.java b/src/main/java/org/asteriskjava/manager/event/UnholdEvent.java index 175bb6455..b86333b83 100644 --- a/src/main/java/org/asteriskjava/manager/event/UnholdEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/UnholdEvent.java @@ -27,10 +27,9 @@ * @version $Id$ * @see org.asteriskjava.manager.event.HoldEvent * @since 0.2 - * @deprecated as of 1.0.0, use {@link org.asteriskjava.manager.event.HoldEvent} and its - * {@link #isUnhold()} method instead. + * Enro 2015-03: No longer deprecated since Asterisk 13 uses this again. */ -@Deprecated public class UnholdEvent extends HoldEvent +public class UnholdEvent extends AbstractHoldEvent { /** * Serializable version identifier. From 81b0c389b45c86543ea07c5c720db917d221e700 Mon Sep 17 00:00:00 2001 From: enro Date: Tue, 19 May 2015 12:54:23 +0200 Subject: [PATCH 0143/1055] Rename userNum property in AbstractMeetMeEvent to user. This change was detected with wireshark during an Asterisk 13 session and does not seem to be documented in the asterisk project wiki. --- .../manager/event/AbstractMeetMeEvent.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java index 5f85b2d37..b8e25646c 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java @@ -30,7 +30,7 @@ public abstract class AbstractMeetMeEvent extends ManagerEvent private String channel; private String uniqueId; private String meetMe; - private Integer userNum; + private Integer user; /** * @param source @@ -110,9 +110,10 @@ public void setMeetMe(String meetMe) * * @return the index of the user in the conference. */ + @Deprecated public Integer getUserNum() { - return userNum; + return getUser(); } /** @@ -120,8 +121,30 @@ public Integer getUserNum() * * @param userNum the index of the user in the conference. */ + @Deprecated public void setUserNum(Integer userNum) { - this.userNum = userNum; + this.setUser(userNum); + } + + /** + * Returns the index of the user in the conference.

+ * This can be used for the "meetme (mute|unmute|kick)" commands. + * + * @return the index of the user in the conference. + */ + public Integer getUser() + { + return user; + } + + /** + * Sets the index of the user in the conference. + * + * @param userNum the index of the user in the conference. + */ + public void setUser(Integer userNum) + { + this.user = userNum; } } From e100de453ba1651c375818f6afe5798411c9cd79 Mon Sep 17 00:00:00 2001 From: enro Date: Tue, 19 May 2015 12:56:05 +0200 Subject: [PATCH 0144/1055] Remove unnecessary overrides from MeetMeJoinEvent --- .../manager/event/MeetMeJoinEvent.java | 35 ------------------- 1 file changed, 35 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java index 78dba490f..1cf77bb43 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java @@ -31,9 +31,6 @@ public class MeetMeJoinEvent extends AbstractMeetMeEvent */ private static final long serialVersionUID = 0L; - private String callerIdNum; - private String callerIdName; - /** * @param source */ @@ -41,36 +38,4 @@ public MeetMeJoinEvent(Object source) { super(source); } - - /** - * Returns the Caller Id number. - * - * @return the Caller Id number or "<unknown>" if not set. - * @since 1.0.0 - */ - public String getCallerIdNum() - { - return callerIdNum; - } - - public void setCallerIdNum(String callerIdNum) - { - this.callerIdNum = callerIdNum; - } - - /** - * Returns the Caller Id name. - * - * @return the Caller Id name or "<unknown>" if not set. - * @since 1.0.0 - */ - public String getCallerIdName() - { - return callerIdName; - } - - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } } From 005ff85cb4310d35cdc631502c4efec1b60a2e33 Mon Sep 17 00:00:00 2001 From: enro Date: Tue, 19 May 2015 15:42:43 +0200 Subject: [PATCH 0145/1055] Apply Project Code Template --- .../org/asteriskjava/live/AsteriskServer.java | 358 +- .../live/DefaultAsteriskServer.java | 624 ++-- .../live/internal/AbstractLiveObject.java | 39 +- .../live/internal/AsteriskServerImpl.java | 290 +- .../live/internal/MeetMeManager.java | 27 +- .../manager/event/AbstractChannelEvent.java | 15 +- .../event/AbstractChannelStateEvent.java | 194 +- .../manager/event/AbstractHoldEvent.java | 70 +- .../manager/event/AbstractMeetMeEvent.java | 35 +- .../event/AbstractParkedCallEvent.java | 397 ++- .../manager/event/AbstractUnParkedEvent.java | 195 +- .../manager/event/AgentCalledEvent.java | 34 +- .../manager/event/CoreShowChannelEvent.java | 8 +- .../manager/event/DialBeginEvent.java | 80 +- .../asteriskjava/manager/event/DialEvent.java | 237 +- .../asteriskjava/manager/event/HoldEvent.java | 34 +- .../manager/event/ManagerEvent.java | 182 +- .../manager/event/MeetMeJoinEvent.java | 7 +- .../manager/event/MeetMeLeaveEvent.java | 10 +- .../manager/event/NewChannelEvent.java | 14 +- .../manager/event/ParkedCallEvent.java | 15 +- .../manager/event/ParkedCallGiveUpEvent.java | 6 +- .../manager/event/ParkedCallTimeOutEvent.java | 6 +- .../event/ParkedCallsCompleteEvent.java | 5 +- .../manager/event/QueueEntryEvent.java | 24 +- .../manager/event/StatusEvent.java | 72 +- .../manager/event/UnholdEvent.java | 15 +- .../manager/event/UnparkedCallEvent.java | 197 +- .../manager/event/VarSetEvent.java | 35 +- .../internal/ManagerConnectionImpl.java | 2891 ++++++++--------- 30 files changed, 3179 insertions(+), 2937 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/AsteriskServer.java b/src/main/java/org/asteriskjava/live/AsteriskServer.java index 2700168cb..28dabdfcd 100644 --- a/src/main/java/org/asteriskjava/live/AsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/AsteriskServer.java @@ -29,11 +29,12 @@ /** * The AsteriskServer is built on top of the * {@link org.asteriskjava.manager.ManagerConnection} and is an attempt to - * simplify interaction with Asterisk by abstracting the interface.
You - * will certainly have less freedom using AsteriskServer but it will make life - * easier for easy things (like originating a call or getting a list of open - * channels).
AsteriskServer is still in an early state of development. So, - * when using AsteriskServer be aware that it might change in the future. + * simplify interaction with Asterisk by abstracting the interface.
+ * You will certainly have less freedom using AsteriskServer but it will make + * life easier for easy things (like originating a call or getting a list of + * open channels).
+ * AsteriskServer is still in an early state of development. So, when using + * AsteriskServer be aware that it might change in the future. * * @author srt * @version $Id$ @@ -41,12 +42,14 @@ public interface AsteriskServer { /** - * Returns the underlying ManagerConnection.

- * Unlike the methods operating on the manager connection this method does not implicitly initialize the - * connection. Thus you can use this method to add custom - * {@linkplain org.asteriskjava.manager.ManagerEventListener ManagerEventListeners} before the connection - * to the Asterisk server is established. If you want to ensure that the connection is established call - * {@link #initialize()}. + * Returns the underlying ManagerConnection. + *

+ * Unlike the methods operating on the manager connection this method does + * not implicitly initialize the connection. Thus you can use this method to + * add custom {@linkplain org.asteriskjava.manager.ManagerEventListener + * ManagerEventListeners} before the connection to the Asterisk server is + * established. If you want to ensure that the connection is established + * call {@link #initialize()}. * * @return the underlying ManagerConnection. */ @@ -54,26 +57,32 @@ public interface AsteriskServer /** * Generates an outgoing channel. - * @param originateAction the action that contains parameters for the originate + * + * @param originateAction the action that contains parameters for the + * originate * @return the generated channel * @throws NoSuchChannelException if the channel is not available on the - * Asterisk server, for example because you used "SIP/1310" and 1310 - * is not a valid SIP user, the SIP channel module hasn't been - * loaded or the SIP or IAX peer is not registered currently. + * Asterisk server, for example because you used "SIP/1310" and + * 1310 is not a valid SIP user, the SIP channel module hasn't + * been loaded or the SIP or IAX peer is not registered + * currently. * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, NoSuchChannelException; - + public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, + NoSuchChannelException; + /** * Asynchronously generates an outgoing channel. - * @param originateAction the action that contains parameters for the originate + * + * @param originateAction the action that contains parameters for the + * originate * @param cb callback to inform about the result * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ public void originateAsync(OriginateAction originateAction, OriginateCallback cb) throws ManagerCommunicationException; - + /** * Generates an outgoing channel to a dialplan entry (extension, context, * priority). @@ -83,18 +92,18 @@ public interface AsteriskServer * @param exten extension to connect to * @param priority priority to connect to * @param timeout how long to wait for the channel to be answered before its - * considered to have failed (in ms) + * considered to have failed (in ms) * @return the generated channel * @throws NoSuchChannelException if the channel is not available on the - * Asterisk server, for example because you used "SIP/1310" and 1310 - * is not a valid SIP user, the SIP channel module hasn't been - * loaded or the SIP or IAX peer is not registered currently. + * Asterisk server, for example because you used "SIP/1310" and + * 1310 is not a valid SIP user, the SIP channel module hasn't + * been loaded or the SIP or IAX peer is not registered + * currently. * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - AsteriskChannel originateToExtension(String channel, String context, - String exten, int priority, long timeout) - throws ManagerCommunicationException, NoSuchChannelException; + AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout) + throws ManagerCommunicationException, NoSuchChannelException; /** * Generates an outgoing channel to a dialplan entry (extension, context, @@ -105,22 +114,21 @@ AsteriskChannel originateToExtension(String channel, String context, * @param exten extension to connect to * @param priority priority to connect to * @param timeout how long to wait for the channel to be answered before its - * considered to have failed (in ms) + * considered to have failed (in ms) * @param callerId callerId to use for the outgoing channel, may be - * null. + * null. * @param variables channel variables to set, may be null. * @return the generated channel * @throws NoSuchChannelException if the channel is not available on the - * Asterisk server, for example because you used "SIP/1310" and 1310 - * is not a valid SIP user, the SIP channel module hasn't been - * loaded or the SIP or IAX peer is not registered currently. + * Asterisk server, for example because you used "SIP/1310" and + * 1310 is not a valid SIP user, the SIP channel module hasn't + * been loaded or the SIP or IAX peer is not registered + * currently. * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - AsteriskChannel originateToExtension(String channel, String context, - String exten, int priority, long timeout, CallerId callerId, - Map variables) - throws ManagerCommunicationException, NoSuchChannelException; + AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout, + CallerId callerId, Map variables) throws ManagerCommunicationException, NoSuchChannelException; /** * Generates an outgoing channel to an application. @@ -128,20 +136,20 @@ AsteriskChannel originateToExtension(String channel, String context, * @param channel channel name to call, for example "SIP/1310". * @param application application to connect to, for example "MeetMe" * @param data data to pass to the application, for example "1000|d", may be - * null. + * null. * @param timeout how long to wait for the channel to be answered before its - * considered to have failed (in ms) + * considered to have failed (in ms) * @return the generated channel * @throws NoSuchChannelException if the channel is not available on the - * Asterisk server, for example because you used "SIP/1310" and 1310 - * is not a valid SIP user, the SIP channel module hasn't been - * loaded or the SIP or IAX peer is not registered currently. + * Asterisk server, for example because you used "SIP/1310" and + * 1310 is not a valid SIP user, the SIP channel module hasn't + * been loaded or the SIP or IAX peer is not registered + * currently. * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - AsteriskChannel originateToApplication(String channel, String application, - String data, long timeout) throws ManagerCommunicationException, - NoSuchChannelException; + AsteriskChannel originateToApplication(String channel, String application, String data, long timeout) + throws ManagerCommunicationException, NoSuchChannelException; /** * Generates an outgoing channel to an application and sets an optional map @@ -150,24 +158,23 @@ AsteriskChannel originateToApplication(String channel, String application, * @param channel channel name to call, for example "SIP/1310". * @param application application to connect to, for example "MeetMe" * @param data data to pass to the application, for example "1000|d", may be - * null. + * null. * @param timeout how long to wait for the channel to be answered before its - * considered to have failed (in ms) + * considered to have failed (in ms) * @param callerId callerId to use for the outgoing channel, may be - * null. + * null. * @param variables channel variables to set, may be null. * @return the generated channel * @throws NoSuchChannelException if the channel is not available on the - * Asterisk server, for example because you used "SIP/1310" and 1310 - * is not a valid SIP user, the SIP channel module hasn't been - * loaded or the SIP or IAX peer is not registered currently. + * Asterisk server, for example because you used "SIP/1310" and + * 1310 is not a valid SIP user, the SIP channel module hasn't + * been loaded or the SIP or IAX peer is not registered + * currently. * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - AsteriskChannel originateToApplication(String channel, String application, - String data, long timeout, CallerId callerId, - Map variables) - throws ManagerCommunicationException, NoSuchChannelException; + AsteriskChannel originateToApplication(String channel, String application, String data, long timeout, CallerId callerId, + Map variables) throws ManagerCommunicationException, NoSuchChannelException; /** * Asynchronously generates an outgoing channel to a dialplan entry @@ -178,14 +185,13 @@ AsteriskChannel originateToApplication(String channel, String application, * @param exten extension to connect to * @param priority priority to connect to * @param timeout how long to wait for the channel to be answered before its - * considered to have failed (in ms) + * considered to have failed (in ms) * @param callback callback to inform about the result * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - void originateToExtensionAsync(String channel, String context, - String exten, int priority, long timeout, OriginateCallback callback) - throws ManagerCommunicationException; + void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + OriginateCallback callback) throws ManagerCommunicationException; /** * Asynchronously generates an outgoing channel to a dialplan entry @@ -197,18 +203,17 @@ void originateToExtensionAsync(String channel, String context, * @param exten extension to connect to * @param priority priority to connect to * @param timeout how long to wait for the channel to be answered before its - * considered to have failed (in ms) + * considered to have failed (in ms) * @param callerId callerId to use for the outgoing channel, may be - * null. + * null. * @param variables channel variables to set, may be null. * @param callback callback to inform about the result * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - void originateToExtensionAsync(String channel, String context, - String exten, int priority, long timeout, CallerId callerId, - Map variables, OriginateCallback callback) - throws ManagerCommunicationException; + void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + CallerId callerId, Map variables, OriginateCallback callback) + throws ManagerCommunicationException; /** * Asynchronously generates an outgoing channel to an application. @@ -216,16 +221,15 @@ void originateToExtensionAsync(String channel, String context, * @param channel channel name to call, for example "SIP/1310". * @param application application to connect to, for example "MeetMe" * @param data data to pass to the application, for example "1000|d", may be - * null. + * null. * @param timeout how long to wait for the channel to be answered before its - * considered to have failed (in ms) + * considered to have failed (in ms) * @param callback callback to inform about the result * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - void originateToApplicationAsync(String channel, String application, - String data, long timeout, OriginateCallback callback) - throws ManagerCommunicationException; + void originateToApplicationAsync(String channel, String application, String data, long timeout, + OriginateCallback callback) throws ManagerCommunicationException; /** * Asynchronously generates an outgoing channel to an application and sets @@ -234,42 +238,38 @@ void originateToApplicationAsync(String channel, String application, * @param channel channel name to call, for example "SIP/1310". * @param application application to connect to, for example "MeetMe" * @param data data to pass to the application, for example "1000|d", may be - * null. + * null. * @param timeout how long to wait for the channel to be answered before its - * considered to have failed (in ms) + * considered to have failed (in ms) * @param callerId callerId to use for the outgoing channel, may be - * null. + * null. * @param variables channel variables to set, may be null. * @param callback callback to inform about the result * @throws ManagerCommunicationException if the originate action cannot be - * sent to Asterisk + * sent to Asterisk */ - void originateToApplicationAsync(String channel, String application, - String data, long timeout, CallerId callerId, - Map variables, OriginateCallback callback) - throws ManagerCommunicationException; + void originateToApplicationAsync(String channel, String application, String data, long timeout, CallerId callerId, + Map variables, OriginateCallback callback) throws ManagerCommunicationException; /** * Returns the active channels of the Asterisk server. * * @return a Collection of active channels. * @throws ManagerCommunicationException if there is a problem communication - * with Asterisk + * with Asterisk */ - Collection getChannels() - throws ManagerCommunicationException; + Collection getChannels() throws ManagerCommunicationException; /** * Returns a channel by its name. * * @param name name of the channel to return - * @return the channel with the given name or null if there - * is no such channel. + * @return the channel with the given name or null if there is + * no such channel. * @throws ManagerCommunicationException if there is a problem communication - * with Asterisk + * with Asterisk */ - AsteriskChannel getChannelByName(String name) - throws ManagerCommunicationException; + AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException; /** * Returns a channel by its unique id. @@ -278,20 +278,18 @@ AsteriskChannel getChannelByName(String name) * @return the channel with the given unique id or null if * there is no such channel. * @throws ManagerCommunicationException if there is a problem communication - * with Asterisk + * with Asterisk */ - AsteriskChannel getChannelById(String id) - throws ManagerCommunicationException; + AsteriskChannel getChannelById(String id) throws ManagerCommunicationException; /** * Returns the acitve MeetMe rooms on the Asterisk server. * * @return a Collection of MeetMeRooms * @throws ManagerCommunicationException if there is a problem communication - * with Asterisk + * with Asterisk */ - Collection getMeetMeRooms() - throws ManagerCommunicationException; + Collection getMeetMeRooms() throws ManagerCommunicationException; /** * Returns the MeetMe room with the given number, if the room does not yet @@ -300,17 +298,16 @@ Collection getMeetMeRooms() * @param roomNumber the number of the room to return * @return the MeetMe room with the given number. * @throws ManagerCommunicationException if there is a problem communication - * with Asterisk + * with Asterisk */ - MeetMeRoom getMeetMeRoom(String roomNumber) - throws ManagerCommunicationException; + MeetMeRoom getMeetMeRoom(String roomNumber) throws ManagerCommunicationException; /** * Returns the queues served by the Asterisk server. * * @return a Collection of queues. * @throws ManagerCommunicationException if there is a problem communication - * with Asterisk + * with Asterisk */ Collection getQueues() throws ManagerCommunicationException; @@ -320,29 +317,30 @@ MeetMeRoom getMeetMeRoom(String roomNumber) * * @return a Collection of agents * @throws ManagerCommunicationException if there is a problem communication - * with Asterisk + * with Asterisk */ Collection getAgents() throws ManagerCommunicationException; /** - * Returns the exact version string of this Asterisk server.
This - * typically looks like "Asterisk 1.2.9.1-BRIstuffed-0.3.0-PRE-1q built by - * root @ pbx0 on a i686 running Linux on 2006-06-20 20:21:30 UTC". + * Returns the exact version string of this Asterisk server.
+ * This typically looks like "Asterisk 1.2.9.1-BRIstuffed-0.3.0-PRE-1q built + * by root @ pbx0 on a i686 running Linux on 2006-06-20 20:21:30 UTC". * * @return the version of this Asterisk server * @throws ManagerCommunicationException if the version cannot be retrieved - * from Asterisk + * from Asterisk * @since 0.2 */ String getVersion() throws ManagerCommunicationException; /** - * Returns the CVS revision of a given source file of this Asterisk server. - *
For example getVersion("app_meetme.c") may return {1, 102} for CVS - * revision "1.102".
Note that this feature is not available with - * Asterisk 1.0.x.
You can use this feature if you need to write - * applications that behave different depending on specific modules being - * available in a specific version or not. + * Returns the CVS revision of a given source file of this Asterisk server.
+ * For example getVersion("app_meetme.c") may return {1, 102} for CVS + * revision "1.102".
+ * Note that this feature is not available with Asterisk 1.0.x.
+ * You can use this feature if you need to write applications that behave + * different depending on specific modules being available in a specific + * version or not. * * @param file the file for which to get the version like "app_meetme.c" * @return the CVS revision of the file, or null if that file @@ -350,7 +348,7 @@ MeetMeRoom getMeetMeRoom(String roomNumber) * due to a module that provides it has not been loaded) or if you * are connected to an Astersion 1.0.x * @throws ManagerCommunicationException if the version cannot be retrieved - * from Asterisk + * from Asterisk * @since 0.2 */ int[] getVersion(String file) throws ManagerCommunicationException; @@ -362,11 +360,10 @@ MeetMeRoom getMeetMeRoom(String roomNumber) * @return the value of the global variable or null if it is * not set. * @throws ManagerCommunicationException if the get variable action cannot - * be sent to Asterisk. + * be sent to Asterisk. * @since 0.3 */ - String getGlobalVariable(String variable) - throws ManagerCommunicationException; + String getGlobalVariable(String variable) throws ManagerCommunicationException; /** * Sets the value of the given global variable. @@ -374,11 +371,10 @@ String getGlobalVariable(String variable) * @param variable the name of the global variable to set. * @param value the value of the global variable to set. * @throws ManagerCommunicationException if the set variable action cannot - * be sent to Asterisk. + * be sent to Asterisk. * @since 0.3 */ - void setGlobalVariable(String variable, String value) - throws ManagerCommunicationException; + void setGlobalVariable(String variable, String value) throws ManagerCommunicationException; /** * Returns a collection of all voicemailboxes configured for this Asterisk @@ -387,7 +383,7 @@ void setGlobalVariable(String variable, String value) * @return a collection of all voicemailboxes configured for this Asterisk * server * @throws ManagerCommunicationException if the voicemailboxes can't be - * retrieved. + * retrieved. * @since 0.3 */ Collection getVoicemailboxes() throws ManagerCommunicationException; @@ -405,47 +401,57 @@ void setGlobalVariable(String variable, String value) List executeCliCommand(String command) throws ManagerCommunicationException; /** - * Checks whether a module is currently loaded.

+ * Checks whether a module is currently loaded. + *

* Available since Asterisk 1.6 * - * @param module name of the module to load (with out without the ".so" extension). - * @return true if the module is currently loaded, false otherwise. + * @param module name of the module to load (with out without the ".so" + * extension). + * @return true if the module is currently loaded, + * false otherwise. * @throws ManagerCommunicationException if the module can't be checked. */ boolean isModuleLoaded(String module) throws ManagerCommunicationException; /** - * Loads a module or subsystem

+ * Loads a module or subsystem + *

* Available since Asterisk 1.6 * - * @param module name of the module to load (including ".so" extension) or subsystem name. + * @param module name of the module to load (including ".so" extension) or + * subsystem name. * @throws ManagerCommunicationException if the module cannot be loaded. * @since 1.0.0 */ void loadModule(String module) throws ManagerCommunicationException; /** - * Unloads a module or subsystem.

+ * Unloads a module or subsystem. + *

* Available since Asterisk 1.6 * - * @param module name of the module to unload (including ".so" extension) or subsystem name. + * @param module name of the module to unload (including ".so" extension) or + * subsystem name. * @throws ManagerCommunicationException if the module cannot be unloaded. * @since 1.0.0 */ void unloadModule(String module) throws ManagerCommunicationException; /** - * Reloads a module or subsystem.

+ * Reloads a module or subsystem. + *

* Available since Asterisk 1.6 * - * @param module name of the module to reload (including ".so" extension) or subsystem name. + * @param module name of the module to reload (including ".so" extension) or + * subsystem name. * @throws ManagerCommunicationException if the module cannot be reloaded. * @since 1.0.0 */ void reloadModule(String module) throws ManagerCommunicationException; /** - * Reloads all currently loaded modules.

+ * Reloads all currently loaded modules. + *

* Available since Asterisk 1.6 * * @throws ManagerCommunicationException if the modules cannot be reloaded. @@ -468,7 +474,7 @@ void setGlobalVariable(String variable, String value) * * @param listener the listener to add. * @throws ManagerCommunicationException if the server is not yet connected - * and the connection or initialization fails. + * and the connection or initialization fails. */ void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException; @@ -479,79 +485,83 @@ void setGlobalVariable(String variable, String value) */ void removeAsteriskServerListener(AsteriskServerListener listener); - /** - * Checks whether the listener is already registered with this Asterisk server - * - * @param listener the listener to check - * @return true, if the listener is already registered. - */ - boolean isAsteriskServerListening(AsteriskServerListener listener); - - /** - * The chainListener allows a listener to receive manager events after they - * have been processed by the AsteriskServer. If the AsteriskServer is - * handling messages using the asyncEventHandling then these messages will - * also be async. You would use the chainListener if you are processing raw - * events and using the AJ live ChannelManager. If you don't use the chain - * listener then you can't be certain that a channel name passed in a raw - * event will match the channel name held by the live Channel Manager. By - * chaining events you can be certain that events such as channel Rename - * events have been processed by the live ChannelManager before you receive - * an event and as such the names will always match. - * - * Whilst name matching is not always critical (as you should be matching by the - * channels unique id) the channel name does also contain state information (Zombie, Masq) - * in these cases it can be critical that you have the same name otherwise your - * state information will be out of date. - * - */ + /** + * Checks whether the listener is already registered with this Asterisk + * server + * + * @param listener the listener to check + * @return true, if the listener is already registered. + */ + boolean isAsteriskServerListening(AsteriskServerListener listener); + + /** + * The chainListener allows a listener to receive manager events after they + * have been processed by the AsteriskServer. If the AsteriskServer is + * handling messages using the asyncEventHandling then these messages will + * also be async. You would use the chainListener if you are processing raw + * events and using the AJ live ChannelManager. If you don't use the chain + * listener then you can't be certain that a channel name passed in a raw + * event will match the channel name held by the live Channel Manager. By + * chaining events you can be certain that events such as channel Rename + * events have been processed by the live ChannelManager before you receive + * an event and as such the names will always match. Whilst name matching is + * not always critical (as you should be matching by the channels unique id) + * the channel name does also contain state information (Zombie, Masq) in + * these cases it can be critical that you have the same name otherwise your + * state information will be out of date. + */ public void addChainListener(ManagerEventListener chainListener); - /** + /** * remove the chain listener. + * * @param chainListener */ - public void removeChainListener(ManagerEventListener chainListener); + public void removeChainListener(ManagerEventListener chainListener); /** * Closes the connection to this server. */ void shutdown(); - /** - * Opens the connection to this server. + /** + * Opens the connection to this server. * - * @throws ManagerCommunicationException if login fails - */ - void initialize() throws ManagerCommunicationException; + * @throws ManagerCommunicationException if login fails + */ + void initialize() throws ManagerCommunicationException; /** * get Asterisk Queue by name + * * @author itaqua * @param queueName Name of the queue to retrieve * @return */ - public AsteriskQueue getQueueByName(String queueName); + public AsteriskQueue getQueueByName(String queueName); /** * List of Queues Objects updated after certain date + * * @author itaqua * @param date * @return */ - public List getQueuesUpdatedAfter(Date date); + public List getQueuesUpdatedAfter(Date date); - /** - * every time we get an event of a queue we reload the information about it from - * the Asterisk Server + /** + * every time we get an event of a queue we reload the information about it + * from the Asterisk Server + * * @author itaqua - */ - public void forceQueuesMonitor(boolean force); + */ + public void forceQueuesMonitor(boolean force); /** * Check if the Queue Information is forced + * * @author itaqua * @return */ - public boolean isQueuesMonitorForced(); + public boolean isQueuesMonitorForced(); } diff --git a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java index 0da60e62d..31482eda5 100644 --- a/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java +++ b/src/main/java/org/asteriskjava/live/DefaultAsteriskServer.java @@ -37,323 +37,309 @@ */ public class DefaultAsteriskServer implements AsteriskServer { - private final AsteriskServerImpl impl; - - /** - * Creates a new instance without a {@link ManagerConnection}. The - * ManagerConnection must be set using - * {@link #setManagerConnection(ManagerConnection)} before you can use this - * AsteriskServer. - */ - public DefaultAsteriskServer() - { - this.impl = new AsteriskServerImpl(); - } - - /** - * Creates a new instance and a new {@link ManagerConnection} with the given - * connection data. - * - * @param hostname - * the hostname of the Asterisk server to connect to. - * @param username - * the username to use for login - * @param password - * the password to use for login - */ - public DefaultAsteriskServer(String hostname, String username, String password) - { - final ManagerConnection connection; - connection = createManagerConnection(hostname, 0, username, password); - this.impl = new AsteriskServerImpl(connection); - } - - /** - * Creates a new instance and a new {@link ManagerConnection} with the given - * connection data. - * - * @param hostname - * the hostname of the Asterisk server to connect to. - * @param port - * the port where Asterisk listens for incoming Manager API - * connections, usually 5038. - * @param username - * the username to use for login - * @param password - * the password to use for login - */ - public DefaultAsteriskServer(String hostname, int port, String username, String password) - { - final ManagerConnection connection; - connection = createManagerConnection(hostname, port, username, password); - this.impl = new AsteriskServerImpl(connection); - } - - protected DefaultManagerConnection createManagerConnection(String hostname, int port, String username, - String password) - { - DefaultManagerConnection dmc; - dmc = new DefaultManagerConnection(hostname, port, username, password); - return dmc; - } - - /** - * Creates a new instance that uses the given {@link ManagerConnection}. - * - * @param eventConnection - * the ManagerConnection to use for receiving events from - * Asterisk. - */ - public DefaultAsteriskServer(ManagerConnection eventConnection) - { - this.impl = new AsteriskServerImpl(eventConnection); - } - - /** - * Determines if queue status is retrieved at startup. If you don't need - * queue information and still run Asterisk 1.0.x you can set this to - * true to circumvent the startup delay caused by the missing - * QueueStatusComplete event.
- * Default is false. - * - * @param skipQueues - * true to skip queue initialization, - * false to not skip. - * @since 0.2 - */ - public void setSkipQueues(boolean skipQueues) - { - this.impl.setSkipQueues(skipQueues); - } - - public void setManagerConnection(ManagerConnection eventConnection) - { - this.impl.setManagerConnection(eventConnection); - } - - public void initialize() throws ManagerCommunicationException - { - this.impl.initialize(); - } - - /* Implementation of the AsteriskServer interface */ - - public ManagerConnection getManagerConnection() - { - return this.impl.getManagerConnection(); - } - - public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, - NoSuchChannelException - { - return this.impl.originate(originateAction); - } - - public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout) - throws ManagerCommunicationException, NoSuchChannelException - { - return this.impl.originateToExtension(channel, context, exten, priority, timeout); - } - - public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, - long timeout, CallerId callerId, Map variables) throws ManagerCommunicationException, - NoSuchChannelException - { - return this.impl.originateToExtension(channel, context, exten, priority, timeout, callerId, variables); - } - - public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout) - throws ManagerCommunicationException, NoSuchChannelException - { - return this.impl.originateToApplication(channel, application, data, timeout); - } - - public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout, - CallerId callerId, Map variables) throws ManagerCommunicationException, - NoSuchChannelException - { - return this.impl.originateToApplication(channel, application, data, timeout, callerId, variables); - } - - public void originateAsync(OriginateAction originateAction, OriginateCallback cb) - throws ManagerCommunicationException - { - this.impl.originateAsync(originateAction, cb); - } - - public void originateToApplicationAsync(String channel, String application, String data, long timeout, - CallerId callerId, Map variables, OriginateCallback cb) - throws ManagerCommunicationException - { - this.impl.originateToApplicationAsync(channel, application, data, timeout, callerId, variables, cb); - } - - public void originateToApplicationAsync(String channel, String application, String data, long timeout, - OriginateCallback cb) throws ManagerCommunicationException - { - this.impl.originateToApplicationAsync(channel, application, data, timeout, cb); - } - - public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, - CallerId callerId, Map variables, OriginateCallback cb) - throws ManagerCommunicationException - { - this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, callerId, variables, cb); - } - - public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, - OriginateCallback cb) throws ManagerCommunicationException - { - this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, cb); - } - - public Collection getChannels() throws ManagerCommunicationException - { - return this.impl.getChannels(); - } - - public AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException - { - return this.impl.getChannelByName(name); - } - - public AsteriskChannel getChannelById(String id) throws ManagerCommunicationException - { - return this.impl.getChannelById(id); - } - - public Collection getMeetMeRooms() throws ManagerCommunicationException - { - return this.impl.getMeetMeRooms(); - } - - public MeetMeRoom getMeetMeRoom(String name) throws ManagerCommunicationException - { - return this.impl.getMeetMeRoom(name); - } - - public Collection getQueues() throws ManagerCommunicationException - { - return this.impl.getQueues(); - } - - public String getVersion() throws ManagerCommunicationException - { - return this.impl.getVersion(); - } - - public int[] getVersion(String file) throws ManagerCommunicationException - { - return this.impl.getVersion(file); - } - - public String getGlobalVariable(String variable) throws ManagerCommunicationException - { - return this.impl.getGlobalVariable(variable); - } - - public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException - { - this.impl.setGlobalVariable(variable, value); - } - - public Collection getVoicemailboxes() throws ManagerCommunicationException - { - return this.impl.getVoicemailboxes(); - } - - public List executeCliCommand(String command) throws ManagerCommunicationException - { - return this.impl.executeCliCommand(command); - } - - public boolean isModuleLoaded(String module) throws ManagerCommunicationException - { - return this.impl.isModuleLoaded(module); - } - - public ConfigFile getConfig(String filename) throws ManagerCommunicationException - { - return this.impl.getConfig(filename); - } - - public void reloadAllModules() throws ManagerCommunicationException - { - this.impl.reloadAllModules(); - } - - public void reloadModule(String module) throws ManagerCommunicationException - { - this.impl.reloadModule(module); - } - - public void unloadModule(String module) throws ManagerCommunicationException - { - this.impl.unloadModule(module); - } - - public void loadModule(String module) throws ManagerCommunicationException - { - this.impl.loadModule(module); - } - - public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException - { - this.impl.addAsteriskServerListener(listener); - } - - public void removeAsteriskServerListener(AsteriskServerListener listener) - { - this.impl.removeAsteriskServerListener(listener); - } - - public boolean isAsteriskServerListening(AsteriskServerListener listener){ - return this.impl.isAsteriskServerListening(listener); - } - - public void shutdown() - { - this.impl.shutdown(); - } - - public Collection getAgents() throws ManagerCommunicationException - { - return this.impl.getAgents(); - } - - public AsteriskQueue getQueueByName(String queueName) - { - return impl.getQueueByName(queueName); - } - - @Override - public List getQueuesUpdatedAfter(Date date) - { - return impl.getQueuesUpdatedAfter(date); - } - - @Override - public void forceQueuesMonitor(boolean force) - { - impl.forceQueuesMonitor(force); - } - - @Override - public boolean isQueuesMonitorForced() - { - return impl.isQueuesMonitorForced(); - } - - @Override - public void addChainListener(ManagerEventListener chainListener) - { - this.impl.addChainListener(chainListener); - } - - @Override - public void removeChainListener(ManagerEventListener chainListener) - { - this.impl.removeChainListener(chainListener); - - } + private final AsteriskServerImpl impl; + + /** + * Creates a new instance without a {@link ManagerConnection}. The + * ManagerConnection must be set using + * {@link #setManagerConnection(ManagerConnection)} before you can use this + * AsteriskServer. + */ + public DefaultAsteriskServer() + { + this.impl = new AsteriskServerImpl(); + } + + /** + * Creates a new instance and a new {@link ManagerConnection} with the given + * connection data. + * + * @param hostname the hostname of the Asterisk server to connect to. + * @param username the username to use for login + * @param password the password to use for login + */ + public DefaultAsteriskServer(String hostname, String username, String password) + { + final ManagerConnection connection; + connection = createManagerConnection(hostname, 0, username, password); + this.impl = new AsteriskServerImpl(connection); + } + + /** + * Creates a new instance and a new {@link ManagerConnection} with the given + * connection data. + * + * @param hostname the hostname of the Asterisk server to connect to. + * @param port the port where Asterisk listens for incoming Manager API + * connections, usually 5038. + * @param username the username to use for login + * @param password the password to use for login + */ + public DefaultAsteriskServer(String hostname, int port, String username, String password) + { + final ManagerConnection connection; + connection = createManagerConnection(hostname, port, username, password); + this.impl = new AsteriskServerImpl(connection); + } + + protected DefaultManagerConnection createManagerConnection(String hostname, int port, String username, String password) + { + DefaultManagerConnection dmc; + dmc = new DefaultManagerConnection(hostname, port, username, password); + return dmc; + } + + /** + * Creates a new instance that uses the given {@link ManagerConnection}. + * + * @param eventConnection the ManagerConnection to use for receiving events + * from Asterisk. + */ + public DefaultAsteriskServer(ManagerConnection eventConnection) + { + this.impl = new AsteriskServerImpl(eventConnection); + } + + /** + * Determines if queue status is retrieved at startup. If you don't need + * queue information and still run Asterisk 1.0.x you can set this to + * true to circumvent the startup delay caused by the missing + * QueueStatusComplete event.
+ * Default is false. + * + * @param skipQueues true to skip queue initialization, + * false to not skip. + * @since 0.2 + */ + public void setSkipQueues(boolean skipQueues) + { + this.impl.setSkipQueues(skipQueues); + } + + public void setManagerConnection(ManagerConnection eventConnection) + { + this.impl.setManagerConnection(eventConnection); + } + + public void initialize() throws ManagerCommunicationException + { + this.impl.initialize(); + } + + /* Implementation of the AsteriskServer interface */ + + public ManagerConnection getManagerConnection() + { + return this.impl.getManagerConnection(); + } + + public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, + NoSuchChannelException + { + return this.impl.originate(originateAction); + } + + public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout) + throws ManagerCommunicationException, NoSuchChannelException + { + return this.impl.originateToExtension(channel, context, exten, priority, timeout); + } + + public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout, + CallerId callerId, Map variables) throws ManagerCommunicationException, NoSuchChannelException + { + return this.impl.originateToExtension(channel, context, exten, priority, timeout, callerId, variables); + } + + public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout) + throws ManagerCommunicationException, NoSuchChannelException + { + return this.impl.originateToApplication(channel, application, data, timeout); + } + + public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout, + CallerId callerId, Map variables) throws ManagerCommunicationException, NoSuchChannelException + { + return this.impl.originateToApplication(channel, application, data, timeout, callerId, variables); + } + + public void originateAsync(OriginateAction originateAction, OriginateCallback cb) throws ManagerCommunicationException + { + this.impl.originateAsync(originateAction, cb); + } + + public void originateToApplicationAsync(String channel, String application, String data, long timeout, + CallerId callerId, Map variables, OriginateCallback cb) throws ManagerCommunicationException + { + this.impl.originateToApplicationAsync(channel, application, data, timeout, callerId, variables, cb); + } + + public void originateToApplicationAsync(String channel, String application, String data, long timeout, + OriginateCallback cb) throws ManagerCommunicationException + { + this.impl.originateToApplicationAsync(channel, application, data, timeout, cb); + } + + public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + CallerId callerId, Map variables, OriginateCallback cb) throws ManagerCommunicationException + { + this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, callerId, variables, cb); + } + + public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + OriginateCallback cb) throws ManagerCommunicationException + { + this.impl.originateToExtensionAsync(channel, context, exten, priority, timeout, cb); + } + + public Collection getChannels() throws ManagerCommunicationException + { + return this.impl.getChannels(); + } + + public AsteriskChannel getChannelByName(String name) throws ManagerCommunicationException + { + return this.impl.getChannelByName(name); + } + + public AsteriskChannel getChannelById(String id) throws ManagerCommunicationException + { + return this.impl.getChannelById(id); + } + + public Collection getMeetMeRooms() throws ManagerCommunicationException + { + return this.impl.getMeetMeRooms(); + } + + public MeetMeRoom getMeetMeRoom(String name) throws ManagerCommunicationException + { + return this.impl.getMeetMeRoom(name); + } + + public Collection getQueues() throws ManagerCommunicationException + { + return this.impl.getQueues(); + } + + public String getVersion() throws ManagerCommunicationException + { + return this.impl.getVersion(); + } + + public int[] getVersion(String file) throws ManagerCommunicationException + { + return this.impl.getVersion(file); + } + + public String getGlobalVariable(String variable) throws ManagerCommunicationException + { + return this.impl.getGlobalVariable(variable); + } + + public void setGlobalVariable(String variable, String value) throws ManagerCommunicationException + { + this.impl.setGlobalVariable(variable, value); + } + + public Collection getVoicemailboxes() throws ManagerCommunicationException + { + return this.impl.getVoicemailboxes(); + } + + public List executeCliCommand(String command) throws ManagerCommunicationException + { + return this.impl.executeCliCommand(command); + } + + public boolean isModuleLoaded(String module) throws ManagerCommunicationException + { + return this.impl.isModuleLoaded(module); + } + + public ConfigFile getConfig(String filename) throws ManagerCommunicationException + { + return this.impl.getConfig(filename); + } + + public void reloadAllModules() throws ManagerCommunicationException + { + this.impl.reloadAllModules(); + } + + public void reloadModule(String module) throws ManagerCommunicationException + { + this.impl.reloadModule(module); + } + + public void unloadModule(String module) throws ManagerCommunicationException + { + this.impl.unloadModule(module); + } + + public void loadModule(String module) throws ManagerCommunicationException + { + this.impl.loadModule(module); + } + + public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException + { + this.impl.addAsteriskServerListener(listener); + } + + public void removeAsteriskServerListener(AsteriskServerListener listener) + { + this.impl.removeAsteriskServerListener(listener); + } + + public boolean isAsteriskServerListening(AsteriskServerListener listener) + { + return this.impl.isAsteriskServerListening(listener); + } + + public void shutdown() + { + this.impl.shutdown(); + } + + public Collection getAgents() throws ManagerCommunicationException + { + return this.impl.getAgents(); + } + + public AsteriskQueue getQueueByName(String queueName) + { + return impl.getQueueByName(queueName); + } + + @Override + public List getQueuesUpdatedAfter(Date date) + { + return impl.getQueuesUpdatedAfter(date); + } + + @Override + public void forceQueuesMonitor(boolean force) + { + impl.forceQueuesMonitor(force); + } + + @Override + public boolean isQueuesMonitorForced() + { + return impl.isQueuesMonitorForced(); + } + + @Override + public void addChainListener(ManagerEventListener chainListener) + { + this.impl.addChainListener(chainListener); + } + + @Override + public void removeChainListener(ManagerEventListener chainListener) + { + this.impl.removeChainListener(chainListener); + + } } diff --git a/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java b/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java index d3fae5d78..e61041d44 100644 --- a/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java +++ b/src/main/java/org/asteriskjava/live/internal/AbstractLiveObject.java @@ -36,7 +36,7 @@ abstract class AbstractLiveObject implements LiveObject private final PropertyChangeSupport changes; protected final AsteriskServerImpl server; - //last time this object was updated + // last time this object was updated private long lastUpdate; AbstractLiveObject(AsteriskServerImpl server) @@ -58,16 +58,19 @@ public void addPropertyChangeListener(PropertyChangeListener listener) public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - boolean haveToAdd = true; - for(PropertyChangeListener l : changes.getPropertyChangeListeners()){ - if(l == listener){ - haveToAdd = false; - break; - } - } - if(haveToAdd){ - changes.addPropertyChangeListener(propertyName, listener); - } + boolean haveToAdd = true; + for (PropertyChangeListener l : changes.getPropertyChangeListeners()) + { + if (l == listener) + { + haveToAdd = false; + break; + } + } + if (haveToAdd) + { + changes.addPropertyChangeListener(propertyName, listener); + } } public void removePropertyChangeListener(PropertyChangeListener listener) @@ -79,12 +82,12 @@ public void removePropertyChangeListener(String propertyName, PropertyChangeList { changes.removePropertyChangeListener(propertyName, listener); } - + protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { if (oldValue != null || newValue != null) { - stampLastUpdate(); + stampLastUpdate(); try { changes.firePropertyChange(propertyName, oldValue, newValue); @@ -97,11 +100,13 @@ protected void firePropertyChange(String propertyName, Object oldValue, Object n } @Override - public long getLastUpdateMillis() { - return lastUpdate; + public long getLastUpdateMillis() + { + return lastUpdate; } - public void stampLastUpdate(){ - lastUpdate = System.currentTimeMillis(); + public void stampLastUpdate() + { + lastUpdate = System.currentTimeMillis(); } } diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java index e2e4c4e0e..2b0be8176 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskServerImpl.java @@ -155,17 +155,17 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener /** * The exact version string of the Asterisk server we are connected to. - *

+ *

* Contains null until lazily initialized. */ private String version; /** * Holds the version of Asterisk's source files. - *

+ *

* That corresponds to the output of the CLI command * show version files. - *

+ *

* Contains null until lazily initialized. */ private Map versions; @@ -186,27 +186,26 @@ public class AsteriskServerImpl implements AsteriskServer, ManagerEventListener private boolean skipQueues; /** - * Set to true to not handle ManagerEvents in the reader tread - * but process them asynchronously. This is a good idea :) + * Set to true to not handle ManagerEvents in the reader tread + * but process them asynchronously. This is a good idea :) */ private boolean asyncEventHandling = true; /** - * The chainListener allows a listener to receive manager events after they - * have been processed by the AsteriskServer. If the AsteriskServer is - * handling messages using the asyncEventHandling then these messages will - * also be async. You would use the chainListener if you are processing raw - * events and using the AJ live ChannelManager. If you don't use the chain - * listener then you can't be certain that a channel name passed in a raw - * event will match the channel name held by the Channel Manager. By - * chaining events you can be certain that events such as channel Rename - * events have been processed by the live ChannelManager before you receive - * an event and as such the names will always match. - * - */ - private List chainListeners = new ArrayList(); - - /** + * The chainListener allows a listener to receive manager events after they + * have been processed by the AsteriskServer. If the AsteriskServer is + * handling messages using the asyncEventHandling then these messages will + * also be async. You would use the chainListener if you are processing raw + * events and using the AJ live ChannelManager. If you don't use the chain + * listener then you can't be certain that a channel name passed in a raw + * event will match the channel name held by the Channel Manager. By + * chaining events you can be certain that events such as channel Rename + * events have been processed by the live ChannelManager before you receive + * an event and as such the names will always match. + */ + private List chainListeners = new ArrayList(); + + /** * Creates a new instance. */ public AsteriskServerImpl() @@ -223,28 +222,26 @@ public AsteriskServerImpl() /** * Creates a new instance. * - * @param eventConnection - * the ManagerConnection to use for receiving events from - * Asterisk. + * @param eventConnection the ManagerConnection to use for receiving events + * from Asterisk. */ public AsteriskServerImpl(ManagerConnection eventConnection) { this(); - setManagerConnection(eventConnection); // todo: !!! Possible bug !!!: - // call to overridable method - // over object construction + setManagerConnection(eventConnection); // todo: !!! Possible bug !!!: + // call to overridable method + // over object construction } /** * Determines if queue status is retrieved at startup. If you don't need * queue information and still run Asterisk 1.0.x you can set this to * true to circumvent the startup delay caused by the missing - * QueueStatusComplete event. - *
+ * QueueStatusComplete event.
* Default is false. * * @param skipQueues true to skip queue initialization, - * false to not skip. + * false to not skip. * @since 0.2 */ public void setSkipQueues(boolean skipQueues) @@ -290,7 +287,7 @@ else if (!asyncEventHandling && eventListener == null) } initializing = true; - + if (eventConnection.getState() == ManagerConnectionState.INITIAL || eventConnection.getState() == ManagerConnectionState.DISCONNECTED) { @@ -308,17 +305,14 @@ else if (!asyncEventHandling && eventListener == null) /* Implementation of the AsteriskServer interface */ - public AsteriskChannel originateToExtension(String channel, String context, - String exten, int priority, long timeout) + public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout) throws ManagerCommunicationException, NoSuchChannelException { return originateToExtension(channel, context, exten, priority, timeout, null, null); } - public AsteriskChannel originateToExtension(String channel, String context, - String exten, int priority, long timeout, CallerId callerId, - Map variables) - throws ManagerCommunicationException, NoSuchChannelException + public AsteriskChannel originateToExtension(String channel, String context, String exten, int priority, long timeout, + CallerId callerId, Map variables) throws ManagerCommunicationException, NoSuchChannelException { final OriginateAction originateAction; @@ -337,17 +331,14 @@ public AsteriskChannel originateToExtension(String channel, String context, return originate(originateAction); } - public AsteriskChannel originateToApplication(String channel, - String application, String data, long timeout) + public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout) throws ManagerCommunicationException, NoSuchChannelException { return originateToApplication(channel, application, data, timeout, null, null); } - public AsteriskChannel originateToApplication(String channel, - String application, String data, long timeout, CallerId callerId, - Map variables) - throws ManagerCommunicationException, NoSuchChannelException + public AsteriskChannel originateToApplication(String channel, String application, String data, long timeout, + CallerId callerId, Map variables) throws ManagerCommunicationException, NoSuchChannelException { final OriginateAction originateAction; @@ -365,7 +356,8 @@ public AsteriskChannel originateToApplication(String channel, return originate(originateAction); } - public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, NoSuchChannelException + public AsteriskChannel originate(OriginateAction originateAction) throws ManagerCommunicationException, + NoSuchChannelException { final ResponseEvents responseEvents; final Iterator responseEventIterator; @@ -402,17 +394,14 @@ public AsteriskChannel originate(OriginateAction originateAction) throws Manager return channel; } - public void originateToExtensionAsync(String channel, String context, - String exten, int priority, long timeout, OriginateCallback cb) - throws ManagerCommunicationException + public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + OriginateCallback cb) throws ManagerCommunicationException { originateToExtensionAsync(channel, context, exten, priority, timeout, null, null, cb); } - public void originateToExtensionAsync(String channel, String context, - String exten, int priority, long timeout, CallerId callerId, - Map variables, OriginateCallback cb) - throws ManagerCommunicationException + public void originateToExtensionAsync(String channel, String context, String exten, int priority, long timeout, + CallerId callerId, Map variables, OriginateCallback cb) throws ManagerCommunicationException { final OriginateAction originateAction; @@ -431,17 +420,14 @@ public void originateToExtensionAsync(String channel, String context, originateAsync(originateAction, cb); } - public void originateToApplicationAsync(String channel, String application, - String data, long timeout, OriginateCallback cb) - throws ManagerCommunicationException + public void originateToApplicationAsync(String channel, String application, String data, long timeout, + OriginateCallback cb) throws ManagerCommunicationException { originateToApplicationAsync(channel, application, data, timeout, null, null, cb); } - public void originateToApplicationAsync(String channel, String application, - String data, long timeout, CallerId callerId, - Map variables, OriginateCallback cb) - throws ManagerCommunicationException + public void originateToApplicationAsync(String channel, String application, String data, long timeout, + CallerId callerId, Map variables, OriginateCallback cb) throws ManagerCommunicationException { final OriginateAction originateAction; @@ -459,8 +445,7 @@ public void originateToApplicationAsync(String channel, String application, originateAsync(originateAction, cb); } - public void originateAsync(OriginateAction originateAction, - OriginateCallback cb) throws ManagerCommunicationException + public void originateAsync(OriginateAction originateAction, OriginateCallback cb) throws ManagerCommunicationException { final Map variables; final String traceId; @@ -475,7 +460,8 @@ public void originateAsync(OriginateAction originateAction, variables = new HashMap(originateAction.getVariables()); } - // prefix variable name by "__" to enable variable inheritence across channels + // prefix variable name by "__" to enable variable inheritence across + // channels variables.put("__" + Constants.VARIABLE_TRACE_ID, traceId); originateAction.setVariables(variables); @@ -536,15 +522,17 @@ public Collection getQueues() throws ManagerCommunicationExceptio } @Override - public AsteriskQueue getQueueByName(String queueName){ - initializeIfNeeded(); - return queueManager.getQueueByName(queueName); + public AsteriskQueue getQueueByName(String queueName) + { + initializeIfNeeded(); + return queueManager.getQueueByName(queueName); } @Override - public List getQueuesUpdatedAfter(Date date){ - initializeIfNeeded(); - return queueManager.getQueuesUpdatedAfter(date); + public List getQueuesUpdatedAfter(Date date) + { + initializeIfNeeded(); + return queueManager.getQueuesUpdatedAfter(date); } public synchronized String getVersion() throws ManagerCommunicationException @@ -636,8 +624,7 @@ public int[] getVersion(String file) throws ManagerCommunicationException } else { - logger.error("Response to CommandAction(\"" - + command + "\") was not a CommandResponse but " + response); + logger.error("Response to CommandAction(\"" + command + "\") was not a CommandResponse but " + response); } } catch (Exception e) @@ -703,8 +690,7 @@ public void setGlobalVariable(String variable, String value) throws ManagerCommu response = sendAction(new SetVarAction(variable, value)); if (response instanceof ManagerError) { - logger.error("Unable to set global variable '" + variable - + "' to '" + value + "':" + response.getMessage()); + logger.error("Unable to set global variable '" + variable + "' to '" + value + "':" + response.getMessage()); } } @@ -726,7 +712,8 @@ public Collection getVoicemailboxes() throws ManagerCommunicationE } if (!(response instanceof CommandResponse)) { - logger.error("Response to CommandAction(\"" + SHOW_VOICEMAIL_USERS_COMMAND + "\") was not a CommandResponse but " + response); + logger.error("Response to CommandAction(\"" + SHOW_VOICEMAIL_USERS_COMMAND + + "\") was not a CommandResponse but " + response); return voicemailboxes; } @@ -766,8 +753,7 @@ public Collection getVoicemailboxes() throws ManagerCommunicationE { final String fullname; - fullname = voicemailbox.getMailbox() + "@" - + voicemailbox.getContext(); + fullname = voicemailbox.getMailbox() + "@" + voicemailbox.getContext(); response = sendAction(new MailboxCountAction(fullname)); if (response instanceof MailboxCountResponse) { @@ -876,20 +862,20 @@ public ConfigFile getConfig(String filename) throws ManagerCommunicationExceptio } @Override - public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException + public void addAsteriskServerListener(AsteriskServerListener listener) throws ManagerCommunicationException { initializeIfNeeded(); synchronized (listeners) { - if(!listeners.contains(listener)) - { - listeners.add(listener); - } + if (!listeners.contains(listener)) + { + listeners.add(listener); + } } } @Override - public void removeAsteriskServerListener(AsteriskServerListener listener) + public void removeAsteriskServerListener(AsteriskServerListener listener) { synchronized (listeners) { @@ -898,25 +884,25 @@ public void removeAsteriskServerListener(AsteriskServerListener listener) } @Override - public boolean isAsteriskServerListening(AsteriskServerListener listener) + public boolean isAsteriskServerListening(AsteriskServerListener listener) { - return listeners.contains(listener); + return listeners.contains(listener); } - - public void addChainListener(ManagerEventListener chainListener) - { - synchronized (this.chainListeners) - { - if (!this.chainListeners.contains(chainListener)) - this.chainListeners.add(chainListener); - } - } + public void addChainListener(ManagerEventListener chainListener) + { + synchronized (this.chainListeners) + { + if (!this.chainListeners.contains(chainListener)) + this.chainListeners.add(chainListener); + } + + } - public void removeChainListener(ManagerEventListener chainListener) - { - this.chainListeners.remove(chainListener); - } + public void removeChainListener(ManagerEventListener chainListener) + { + this.chainListeners.remove(chainListener); + } void fireNewAsteriskChannel(AsteriskChannel channel) { @@ -992,8 +978,8 @@ ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws Ma } } - ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, - long timeout) throws ManagerCommunicationException + ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) + throws ManagerCommunicationException { // return connectionPool.sendEventGeneratingAction(action, timeout); try @@ -1017,8 +1003,7 @@ OriginateCallbackData getOriginateCallbackDataByTraceId(String traceId) /* Implementation of the ManagerEventListener interface */ /** - * Handles all events received from the Asterisk server. - *
+ * Handles all events received from the Asterisk server.
* Events are queued until channels and queues are initialized and then * delegated to the dispatchEvent method. */ @@ -1178,23 +1163,23 @@ else if (event instanceof AgentLogoffEvent) } // End of agent-related events - // dispatch the events to the chainListener if they exist. - fireChainListeners(event); + // dispatch the events to the chainListener if they exist. + fireChainListeners(event); } - /** - * dispatch the event to the chainListener if they exist. - * - * @param event - */ - private void fireChainListeners(ManagerEvent event) - { - synchronized (this.chainListeners) - { - for (ManagerEventListener listener : this.chainListeners) - listener.onManagerEvent(event); - } - } + /** + * dispatch the event to the chainListener if they exist. + * + * @param event + */ + private void fireChainListeners(ManagerEvent event) + { + synchronized (this.chainListeners) + { + for (ManagerEventListener listener : this.chainListeners) + listener.onManagerEvent(event); + } + } /* * Resets the internal state when the connection to the asterisk server is @@ -1203,11 +1188,13 @@ private void fireChainListeners(ManagerEvent event) private void handleDisconnectEvent(DisconnectEvent disconnectEvent) { - // reset version information as it might have changed while Asterisk restarted + // reset version information as it might have changed while Asterisk + // restarted version = null; versions = null; - // same for channels, agents and queues rooms, they are reinitialized when reconnected + // same for channels, agents and queues rooms, they are reinitialized + // when reconnected channelManager.disconnected(); agentManager.disconnected(); meetMeManager.disconnected(); @@ -1251,7 +1238,8 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) final OriginateCallbackData callbackData; final OriginateCallback cb; final AsteriskChannelImpl channel; - final AsteriskChannelImpl otherChannel; // the other side if local channel + final AsteriskChannelImpl otherChannel; // the other side if local + // channel traceId = originateEvent.getActionId(); if (traceId == null) @@ -1285,7 +1273,8 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) { final LiveException cause; - cause = new NoSuchChannelException("Channel '" + callbackData.getOriginateAction().getChannel() + "' is not available"); + cause = new NoSuchChannelException("Channel '" + callbackData.getOriginateAction().getChannel() + + "' is not available"); cb.onFailure(cause); return; } @@ -1304,14 +1293,16 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) otherChannel = channelManager.getOtherSideOfLocalChannel(channel); // special treatment of local channels: - // the interesting things happen to the other side so we have a look at that + // the interesting things happen to the other side so we have a look + // at that if (otherChannel != null) { final AsteriskChannel dialedChannel; dialedChannel = otherChannel.getDialedChannel(); - // on busy the other channel is in state busy when we receive the originate event + // on busy the other channel is in state busy when we receive + // the originate event if (otherChannel.wasBusy()) { cb.onBusy(channel); @@ -1341,31 +1332,43 @@ private void handleOriginateEvent(OriginateResponseEvent originateEvent) } } - @Override public void shutdown() { - if (eventConnection != null && (eventConnection.getState() == ManagerConnectionState.CONNECTED || eventConnection.getState() == ManagerConnectionState.RECONNECTING)) { - try { - eventConnection.logoff(); - } catch (Exception ignore) {} + @Override + public void shutdown() + { + if (eventConnection != null + && (eventConnection.getState() == ManagerConnectionState.CONNECTED || eventConnection.getState() == ManagerConnectionState.RECONNECTING)) + { + try + { + eventConnection.logoff(); + } + catch (Exception ignore) + { + } } - - if (managerEventListenerProxy != null) { - if (eventConnection != null) { - eventConnection.removeEventListener(managerEventListenerProxy); - } + + if (managerEventListenerProxy != null) + { + if (eventConnection != null) + { + eventConnection.removeEventListener(managerEventListenerProxy); + } managerEventListenerProxy.shutdown(); } - if (eventConnection != null && eventListener != null) { - eventConnection.removeEventListener(eventListener); - } + if (eventConnection != null && eventListener != null) + { + eventConnection.removeEventListener(eventListener); + } - managerEventListenerProxy = null; + managerEventListenerProxy = null; eventListener = null; - if (initialized) {//incredible, but it happened - handleDisconnectEvent(null); - }//i - }//shutdown + if (initialized) + {// incredible, but it happened + handleDisconnectEvent(null); + }// i + }// shutdown public List getPeerEntries() throws ManagerCommunicationException { @@ -1394,7 +1397,8 @@ public DbGetResponseEvent dbGet(String family, String key) throws ManagerCommuni public void dbDel(String family, String key) throws ManagerCommunicationException { - // The following only works with BRIStuffed asrterisk: sendAction(new DbDelAction(family,key)); + // The following only works with BRIStuffed asrterisk: sendAction(new + // DbDelAction(family,key)); // Use cli command instead ... sendAction(new CommandAction("database del " + family + " " + key)); } @@ -1454,12 +1458,14 @@ void fireNewQueueEntry(AsteriskQueueEntry entry) /* OCTAVIO LUNA */ @Override - public void forceQueuesMonitor(boolean force) { - queueManager.forceQueuesMonitor(force); + public void forceQueuesMonitor(boolean force) + { + queueManager.forceQueuesMonitor(force); } @Override - public boolean isQueuesMonitorForced() { - return queueManager.isQueuesMonitorForced(); + public boolean isQueuesMonitorForced() + { + return queueManager.isQueuesMonitorForced(); } } diff --git a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java index 86537cf70..38ace7b5d 100644 --- a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java +++ b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java @@ -74,11 +74,8 @@ void initialize() void disconnected() { /* - synchronized (rooms) - { - rooms.clear(); - } - */ + * synchronized (rooms) { rooms.clear(); } + */ } Collection getMeetMeRooms() @@ -147,7 +144,8 @@ void handleMeetMeEvent(AbstractMeetMeEvent event) + " but is user of no room"); } } - // Mmmm should remove from the room before firing PropertyChangeEvents ? + // Mmmm should remove from the room before firing + // PropertyChangeEvents ? user.left(event.getDateReceived()); room.removeUser(user); channel.setMeetMeUserImpl(null); @@ -183,7 +181,13 @@ private void populateRoom(MeetMeRoomImpl room) final CommandAction meetMeListAction; final ManagerResponse response; final List lines; - final Collection userNumbers = new ArrayList(); // list of user numbers in the room + final Collection userNumbers = new ArrayList(); // list + // of + // user + // numbers + // in + // the + // room meetMeListAction = new CommandAction(MEETME_LIST_COMMAND + " " + room.getRoomNumber()); try @@ -226,10 +230,11 @@ private void populateRoom(MeetMeRoomImpl room) userNumber = Integer.valueOf(matcher.group(1)); channel = channelManager.getChannelImplByName(matcher.group(2)); - if(channel == null) // User has left the room already in the meanwhile - { - continue; - } + if (channel == null) // User has left the room already in the + // meanwhile + { + continue; + } userNumbers.add(userNumber); diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java index 439d3f7c5..becd53f1a 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java @@ -38,7 +38,7 @@ public abstract class AbstractChannelEvent extends ManagerEvent * The unique id of the channel. */ private String uniqueId; - + protected AbstractChannelEvent(Object source) { super(source); @@ -75,13 +75,15 @@ public final void setUniqueId(String uniqueId) } /** - * Returns the Caller*ID of the channel if set or null if none has been set. + * Returns the Caller*ID of the channel if set or null if none + * has been set. * * @return the Caller*ID * @deprecated * @see #getCallerIdNum() */ - @Deprecated public final String getCallerId() + @Deprecated + public final String getCallerId() { return getCallerIdNum(); } @@ -92,9 +94,10 @@ public final void setUniqueId(String uniqueId) * @param callerId the Caller*ID of the channel. * @deprecated */ - @Deprecated public final void setCallerId(String callerId) + @Deprecated + public final void setCallerId(String callerId) { - setCallerIdNum(callerId); + setCallerIdNum(callerId); } - + } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java index d190aaf7c..367464052 100755 --- a/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java @@ -27,110 +27,108 @@ */ public abstract class AbstractChannelStateEvent extends AbstractChannelEvent { - /** - * Serializable version identifier. - */ - static final long serialVersionUID = 0L; + /** + * Serializable version identifier. + */ + static final long serialVersionUID = 0L; - private Integer channelState; - private String channelStateDesc; + private Integer channelState; + private String channelStateDesc; - protected AbstractChannelStateEvent(Object source) - { - super(source); - } + protected AbstractChannelStateEvent(Object source) + { + super(source); + } - /** - * Returns the new state of the channel. - *

- * For Asterisk versions prior to 1.6 (that do not send the numeric value) - * it is derived from the descriptive text. - * - * @return the new state of the channel. - * @since 1.0.0 - */ - @Override - public Integer getChannelState() - { - return channelState == null ? AstState.str2state(channelStateDesc) : channelState; - } + /** + * Returns the new state of the channel. + *

+ * For Asterisk versions prior to 1.6 (that do not send the numeric value) + * it is derived from the descriptive text. + * + * @return the new state of the channel. + * @since 1.0.0 + */ + @Override + public Integer getChannelState() + { + return channelState == null ? AstState.str2state(channelStateDesc) : channelState; + } - /** - * Sets the new state of the channel. - * - * @param channelState - * the new state of the channel. - * @since 1.0.0 - */ - @Override - public void setChannelState(Integer channelState) - { - this.channelState = channelState; - } + /** + * Sets the new state of the channel. + * + * @param channelState the new state of the channel. + * @since 1.0.0 + */ + @Override + public void setChannelState(Integer channelState) + { + this.channelState = channelState; + } - /** - * Returns the new state of the channel as a descriptive text. - *

- * The following states are used: - *

- *

    - *
  • Down
  • - *
  • Rsrvd
  • - *
  • OffHook
  • - *
  • Dialing
  • - *
  • Ring
  • - *
  • Ringing
  • - *
  • Up
  • - *
  • Busy
  • - *
  • Dialing Offhook (since Asterik 1.6)
  • - *
  • Pre-ring (since Asterik 1.6)
  • - *
- * - * @return the new state of the channel as a descriptive text. - * @since 1.0.0 - */ - public String getChannelStateDesc() - { - return channelStateDesc; - } + /** + * Returns the new state of the channel as a descriptive text. + *

+ * The following states are used: + *

+ *

    + *
  • Down
  • + *
  • Rsrvd
  • + *
  • OffHook
  • + *
  • Dialing
  • + *
  • Ring
  • + *
  • Ringing
  • + *
  • Up
  • + *
  • Busy
  • + *
  • Dialing Offhook (since Asterik 1.6)
  • + *
  • Pre-ring (since Asterik 1.6)
  • + *
+ * + * @return the new state of the channel as a descriptive text. + * @since 1.0.0 + */ + public String getChannelStateDesc() + { + return channelStateDesc; + } - /** - * Sets the new state of the channel as a descriptive text. - * - * @param channelStateDesc - * the new state of the channel as a descriptive text. - * @since 1.0.0 - */ - public void setChannelStateDesc(String channelStateDesc) - { - this.channelStateDesc = channelStateDesc; - } + /** + * Sets the new state of the channel as a descriptive text. + * + * @param channelStateDesc the new state of the channel as a descriptive + * text. + * @since 1.0.0 + */ + public void setChannelStateDesc(String channelStateDesc) + { + this.channelStateDesc = channelStateDesc; + } - /** - * Returns the new state of the channel as a descriptive text.
- * This is an alias for {@link #getChannelStateDesc()}. - * - * @return the new state of the channel as a descriptive text. - * @deprecated as of 1.0.0, use {@link #getChannelStateDesc()} instead or - * even better switch to numeric values as returned by - * {@link #getChannelState()}. - */ - @Deprecated - public String getState() - { - return channelStateDesc; - } + /** + * Returns the new state of the channel as a descriptive text.
+ * This is an alias for {@link #getChannelStateDesc()}. + * + * @return the new state of the channel as a descriptive text. + * @deprecated as of 1.0.0, use {@link #getChannelStateDesc()} instead or + * even better switch to numeric values as returned by + * {@link #getChannelState()}. + */ + @Deprecated + public String getState() + { + return channelStateDesc; + } - /** - * Sets the new state of the channel as a descriptive text. - *

- * The state property is used by Asterisk versions prior to 1.6. - * - * @param state - * the new state of the channel as a descriptive text. - */ - public void setState(String state) - { - this.channelStateDesc = state; - } + /** + * Sets the new state of the channel as a descriptive text. + *

+ * The state property is used by Asterisk versions prior to 1.6. + * + * @param state the new state of the channel as a descriptive text. + */ + public void setState(String state) + { + this.channelStateDesc = state; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractHoldEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractHoldEvent.java index 29b92e07e..b6cd04fb3 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractHoldEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractHoldEvent.java @@ -1,12 +1,16 @@ package org.asteriskjava.manager.event; /** - * A HoldEvent is triggered when a channel is put on hold (or no longer on hold).

- * It is implemented in channels/chan_sip.c.

+ * A HoldEvent is triggered when a channel is put on hold (or no longer on + * hold). + *

+ * It is implemented in channels/chan_sip.c. + *

* Available since Asterisk 1.2 for SIP channels, as of Asterisk 1.6 this event - * is also supported for IAX2 channels.

- * To receive HoldEvents for SIP channels you must set callevents = yes - * in sip.conf. + * is also supported for IAX2 channels. + *

+ * To receive HoldEvents for SIP channels you must set + * callevents = yes in sip.conf. * * @author enro * @version $Id$ @@ -23,7 +27,7 @@ public class AbstractHoldEvent extends ManagerEvent * The name of the channel. */ private String channel; - + private String callerIDNum; private String callerIDName; private String accountCode; @@ -88,7 +92,8 @@ public void setUniqueId(String uniqueId) /** * Returns whether this is a hold or unhold event. * - * @return true if this a hold event, false if it's an unhold event. + * @return true if this a hold event, false if + * it's an unhold event. * @since 1.0.0 */ public Boolean getStatus() @@ -99,7 +104,8 @@ public Boolean getStatus() /** * Returns whether this is a hold or unhold event. * - * @param status true if this a hold event, false if it's an unhold event. + * @param status true if this a hold event, false + * if it's an unhold event. * @since 1.0.0 */ public void setStatus(Boolean status) @@ -110,7 +116,8 @@ public void setStatus(Boolean status) /** * Returns whether this is a hold event. * - * @return true if this a hold event, false if it's an unhold event. + * @return true if this a hold event, false if + * it's an unhold event. * @since 1.0.0 */ public boolean isHold() @@ -121,7 +128,8 @@ public boolean isHold() /** * Returns whether this is an unhold event. * - * @return true if this an unhold event, false if it's a hold event. + * @return true if this an unhold event, false if + * it's a hold event. * @since 1.0.0 */ public boolean isUnhold() @@ -129,27 +137,33 @@ public boolean isUnhold() return status != null && !status; } - public String getCallerIDNum() { - return callerIDNum; - } + public String getCallerIDNum() + { + return callerIDNum; + } - public void setCallerIDNum(String callerIDNum) { - this.callerIDNum = callerIDNum; - } + public void setCallerIDNum(String callerIDNum) + { + this.callerIDNum = callerIDNum; + } - public String getCallerIDName() { - return callerIDName; - } + public String getCallerIDName() + { + return callerIDName; + } - public void setCallerIDName(String callerIDName) { - this.callerIDName = callerIDName; - } + public void setCallerIDName(String callerIDName) + { + this.callerIDName = callerIDName; + } - public String getAccountCode() { - return accountCode; - } + public String getAccountCode() + { + return accountCode; + } - public void setAccountCode(String accountCode) { - this.accountCode = accountCode; - } + public void setAccountCode(String accountCode) + { + this.accountCode = accountCode; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java index b8e25646c..e25947347 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractMeetMeEvent.java @@ -17,8 +17,9 @@ package org.asteriskjava.manager.event; /** - * Abstract base class providing common properties for MeetMe - * (Asterisk's conference system) events.

+ * Abstract base class providing common properties for MeetMe (Asterisk's + * conference system) events. + *

* MeetMe events are implemented in apps/app_meetme.c * * @author srt @@ -26,8 +27,8 @@ */ public abstract class AbstractMeetMeEvent extends ManagerEvent { - private static final long serialVersionUID = 1L; - private String channel; + private static final long serialVersionUID = 1L; + private String channel; private String uniqueId; private String meetMe; private Integer user; @@ -41,7 +42,8 @@ protected AbstractMeetMeEvent(Object source) } /** - * Returns the name of the channel.

+ * Returns the name of the channel. + *

* This property is available since Asterisk 1.4. * * @return the name of the channel. @@ -52,7 +54,8 @@ public String getChannel() } /** - * Sets the name of the channel.

+ * Sets the name of the channel. + *

* This property is available since Asterisk 1.4. * * @param channel the name of the channel. @@ -63,7 +66,8 @@ public void setChannel(String channel) } /** - * Returns the unique id of the channel.

+ * Returns the unique id of the channel. + *

* This property is available since Asterisk 1.4. * * @return the unique id of the channel. @@ -74,7 +78,8 @@ public String getUniqueId() } /** - * Sets the unique id of the channel.

+ * Sets the unique id of the channel. + *

* This property is available since Asterisk 1.4. * * @param uniqueId the unique id of the channel. @@ -105,7 +110,8 @@ public void setMeetMe(String meetMe) } /** - * Returns the index of the user in the conference.

+ * Returns the index of the user in the conference. + *

* This can be used for the "meetme (mute|unmute|kick)" commands. * * @return the index of the user in the conference. @@ -126,18 +132,19 @@ public void setUserNum(Integer userNum) { this.setUser(userNum); } - + /** - * Returns the index of the user in the conference.

+ * Returns the index of the user in the conference. + *

* This can be used for the "meetme (mute|unmute|kick)" commands. * * @return the index of the user in the conference. */ public Integer getUser() { - return user; + return user; } - + /** * Sets the index of the user in the conference. * @@ -145,6 +152,6 @@ public Integer getUser() */ public void setUser(Integer userNum) { - this.user = userNum; + this.user = userNum; } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java index f4db8afbd..a81d09a55 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java @@ -38,7 +38,7 @@ public abstract class AbstractParkedCallEvent extends ManagerEvent private Integer parkeeConnectedLineNum; private String parkeeConnectedLineName; private String parkeeLanguage; - private String parkeeAccountCode; + private String parkeeAccountCode; private String parkeeContext; private String parkeeExten; private Integer parkeePriority; @@ -56,7 +56,6 @@ protected AbstractParkedCallEvent(Object source) super(source); } - /** * Returns the name of the channel that parked the call. */ @@ -76,7 +75,8 @@ public void setFrom(String from) } /** - * Returns the parking lot.

+ * Returns the parking lot. + *

* Available since Asterisk 1.6. * * @return the parking lot. @@ -116,12 +116,15 @@ public void setCallerIdNum(String callerIdNum) } /** - * Returns the unique id of the parked channel.

+ * Returns the unique id of the parked channel. + *

* Note: This property is not set properly by all versions of Asterisk, see - * http://bugs.digium.com/view.php?id=13323 - * and - * http://bugs.digium.com/view.php?id=13358 - * for more information. Use {@link #getChannel()} instead. + * http://bugs.digium.com/ + * view.php?id=13323 and http://bugs.digium.com/view.php?id=13358 for more information. Use + * {@link #getChannel()} instead. * * @return the unique id of the parked channel. */ @@ -134,188 +137,232 @@ public void setUniqueId(String uniqueId) { this.uniqueId = uniqueId; } - + @Deprecated - public void setChannel(String channel) { - this.setParkeeChannel(channel); + public void setChannel(String channel) + { + this.setParkeeChannel(channel); } - + @Deprecated - public String getChannel() { - return this.getParkeeChannel(); + public String getChannel() + { + return this.getParkeeChannel(); + } + + public String getParkeeChannel() + { + return parkeeChannel; + } + + public void setParkeeChannel(String parkeeChannel) + { + this.parkeeChannel = parkeeChannel; + } + + public Integer getParkeeChannelState() + { + return parkeeChannelState; + } + + public void setParkeeChannelState(Integer parkeeChannelState) + { + this.parkeeChannelState = parkeeChannelState; + } + + public String getParkeeChannelStateDesc() + { + return parkeeChannelStateDesc; + } + + public void setParkeeChannelStateDesc(String parkeeChannelStateDesc) + { + this.parkeeChannelStateDesc = parkeeChannelStateDesc; + } + + public String getParkeeCallerIDNum() + { + return parkeeCallerIDNum; + } + + public void setParkeeCallerIDNum(String parkeeCallerIDNum) + { + this.parkeeCallerIDNum = parkeeCallerIDNum; + } + + public String getParkeeCallerIDName() + { + return parkeeCallerIDName; + } + + public void setParkeeCallerIDName(String parkeeCallerIDName) + { + this.parkeeCallerIDName = parkeeCallerIDName; + } + + public Integer getParkeeConnectedLineNum() + { + return parkeeConnectedLineNum; + } + + public void setParkeeConnectedLineNum(Integer parkeeConnectedLineNum) + { + this.parkeeConnectedLineNum = parkeeConnectedLineNum; + } + + public String getParkeeConnectedLineName() + { + return parkeeConnectedLineName; + } + + public void setParkeeConnectedLineName(String parkeeConnectedLineName) + { + this.parkeeConnectedLineName = parkeeConnectedLineName; + } + + public String getParkeeLanguage() + { + return parkeeLanguage; + } + + public void setParkeeLanguage(String parkeeLanguage) + { + this.parkeeLanguage = parkeeLanguage; + } + + public String getParkeeAccountCode() + { + return parkeeAccountCode; + } + + public void setParkeeAccountCode(String parkeeAccountCode) + { + this.parkeeAccountCode = parkeeAccountCode; + } + + public String getParkeeContext() + { + return parkeeContext; + } + + public void setParkeeContext(String parkeeContext) + { + this.parkeeContext = parkeeContext; + } + + public String getParkeeExten() + { + return parkeeExten; } - public String getParkeeChannel() { - return parkeeChannel; - } + public void setParkeeExten(String parkeeExten) + { + this.parkeeExten = parkeeExten; + } - public void setParkeeChannel(String parkeeChannel) { - this.parkeeChannel = parkeeChannel; - } + public Integer getParkeePriority() + { + return parkeePriority; + } - public Integer getParkeeChannelState() { - return parkeeChannelState; - } + public void setParkeePriority(Integer parkeePriority) + { + this.parkeePriority = parkeePriority; + } - public void setParkeeChannelState(Integer parkeeChannelState) { - this.parkeeChannelState = parkeeChannelState; - } + public String getParkeeUniqueid() + { + return parkeeUniqueid; + } - public String getParkeeChannelStateDesc() { - return parkeeChannelStateDesc; - } + public void setParkeeUniqueid(String parkeeUniqueid) + { + this.parkeeUniqueid = parkeeUniqueid; + } - public void setParkeeChannelStateDesc(String parkeeChannelStateDesc) { - this.parkeeChannelStateDesc = parkeeChannelStateDesc; - } + public String getParkerDialString() + { + return parkerDialString; + } - public String getParkeeCallerIDNum() { - return parkeeCallerIDNum; - } + public void setParkerDialString(String parkerDialString) + { + this.parkerDialString = parkerDialString; + } - public void setParkeeCallerIDNum(String parkeeCallerIDNum) { - this.parkeeCallerIDNum = parkeeCallerIDNum; - } + public String getParkinglot() + { + return parkingLot; + } - public String getParkeeCallerIDName() { - return parkeeCallerIDName; - } + public void setParkinglot(String parkinglot) + { + this.parkingLot = parkinglot; + } - public void setParkeeCallerIDName(String parkeeCallerIDName) { - this.parkeeCallerIDName = parkeeCallerIDName; - } + public String getParkingSpace() + { + return parkingSpace; + } - public Integer getParkeeConnectedLineNum() { - return parkeeConnectedLineNum; - } + public void setParkingSpace(String parkingSpace) + { + this.parkingSpace = parkingSpace; + } - public void setParkeeConnectedLineNum(Integer parkeeConnectedLineNum) { - this.parkeeConnectedLineNum = parkeeConnectedLineNum; - } + public Long getParkingTimeout() + { + return parkingTimeout; + } - public String getParkeeConnectedLineName() { - return parkeeConnectedLineName; - } - - public void setParkeeConnectedLineName(String parkeeConnectedLineName) { - this.parkeeConnectedLineName = parkeeConnectedLineName; - } - - public String getParkeeLanguage() { - return parkeeLanguage; - } - - public void setParkeeLanguage(String parkeeLanguage) { - this.parkeeLanguage = parkeeLanguage; - } - - public String getParkeeAccountCode() { - return parkeeAccountCode; - } - - public void setParkeeAccountCode(String parkeeAccountCode) { - this.parkeeAccountCode = parkeeAccountCode; - } - - public String getParkeeContext() { - return parkeeContext; - } - - public void setParkeeContext(String parkeeContext) { - this.parkeeContext = parkeeContext; - } - - public String getParkeeExten() { - return parkeeExten; - } - - public void setParkeeExten(String parkeeExten) { - this.parkeeExten = parkeeExten; - } - - public Integer getParkeePriority() { - return parkeePriority; - } - - public void setParkeePriority(Integer parkeePriority) { - this.parkeePriority = parkeePriority; - } - - public String getParkeeUniqueid() { - return parkeeUniqueid; - } - - public void setParkeeUniqueid(String parkeeUniqueid) { - this.parkeeUniqueid = parkeeUniqueid; - } - - public String getParkerDialString() { - return parkerDialString; - } - - public void setParkerDialString(String parkerDialString) { - this.parkerDialString = parkerDialString; - } - - public String getParkinglot() { - return parkingLot; - } - - public void setParkinglot(String parkinglot) { - this.parkingLot = parkinglot; - } - - public String getParkingSpace() { - return parkingSpace; - } - - public void setParkingSpace(String parkingSpace) { - this.parkingSpace = parkingSpace; - } - - public Long getParkingTimeout() { - return parkingTimeout; - } - - public void setParkingTimeout(Long parkingTimeout) { - this.parkingTimeout = parkingTimeout; - } - - public Long getParkingDuration() { - return parkingDuration; - } - - public void setParkingDuration(Long parkingDuration) { - this.parkingDuration = parkingDuration; - } - - @Deprecated - public String getCallerId() { - return getParkeeCallerIDNum(); - } - - @Deprecated - public void setCallerId(String callerId) { - setParkeeCallerIDNum(callerId); - } - - @Deprecated - public String getCallerIdName() { - return getParkeeCallerIDName(); - } - - @Deprecated - public void setCallerIdName(String callerIdName) { - setParkeeCallerIDName(callerIdName); - } - - @Deprecated - public String getExten() { - return getParkingSpace(); - } - - @Deprecated - public void setExten(String exten) { - setParkingSpace(exten); - } + public void setParkingTimeout(Long parkingTimeout) + { + this.parkingTimeout = parkingTimeout; + } + + public Long getParkingDuration() + { + return parkingDuration; + } + + public void setParkingDuration(Long parkingDuration) + { + this.parkingDuration = parkingDuration; + } + + @Deprecated + public String getCallerId() + { + return getParkeeCallerIDNum(); + } + + @Deprecated + public void setCallerId(String callerId) + { + setParkeeCallerIDNum(callerId); + } + + @Deprecated + public String getCallerIdName() + { + return getParkeeCallerIDName(); + } + + @Deprecated + public void setCallerIdName(String callerIdName) + { + setParkeeCallerIDName(callerIdName); + } + + @Deprecated + public String getExten() + { + return getParkingSpace(); + } + + @Deprecated + public void setExten(String exten) + { + setParkingSpace(exten); + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractUnParkedEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractUnParkedEvent.java index 0ea18be65..d62a092b2 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractUnParkedEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractUnParkedEvent.java @@ -38,8 +38,7 @@ public class AbstractUnParkedEvent extends AbstractParkedCallEvent private String parkerExten; private String parkerPriority; private String parkerUniqueid; - - + /** * @param source */ @@ -48,123 +47,123 @@ public AbstractUnParkedEvent(Object source) super(source); } + public String getParkerChannel() + { + return parkerChannel; + } - public String getParkerChannel() { - return parkerChannel; - } - - - public void setParkerChannel(String parkerChannel) { - this.parkerChannel = parkerChannel; - } - - - public Integer getParkerChannelState() { - return parkerChannelState; - } - - - public void setParkerChannelState(Integer parkerChannelState) { - this.parkerChannelState = parkerChannelState; - } - - - public String getParkerChannelStateDesc() { - return parkerChannelStateDesc; - } - - - public void setParkerChannelStateDesc(String parkerChannelStateDesc) { - this.parkerChannelStateDesc = parkerChannelStateDesc; - } - - - public String getParkerCallerIDNum() { - return parkerCallerIDNum; - } - - - public void setParkerCallerIDNum(String parkerCallerIDNum) { - this.parkerCallerIDNum = parkerCallerIDNum; - } - - - public String getParkerCallerIDName() { - return parkerCallerIDName; - } - - - public void setParkerCallerIDName(String parkerCallerIDName) { - this.parkerCallerIDName = parkerCallerIDName; - } - - - public String getParkerConnectedLineNum() { - return parkerConnectedLineNum; - } - - - public void setParkerConnectedLineNum(String parkerConnectedLineNum) { - this.parkerConnectedLineNum = parkerConnectedLineNum; - } - - - public String getParkerConnectedLineName() { - return parkerConnectedLineName; - } + public void setParkerChannel(String parkerChannel) + { + this.parkerChannel = parkerChannel; + } + public Integer getParkerChannelState() + { + return parkerChannelState; + } - public void setParkerConnectedLineName(String parkerConnectedLineName) { - this.parkerConnectedLineName = parkerConnectedLineName; - } + public void setParkerChannelState(Integer parkerChannelState) + { + this.parkerChannelState = parkerChannelState; + } + public String getParkerChannelStateDesc() + { + return parkerChannelStateDesc; + } - public String getParkerAccountCode() { - return parkerAccountCode; - } + public void setParkerChannelStateDesc(String parkerChannelStateDesc) + { + this.parkerChannelStateDesc = parkerChannelStateDesc; + } + public String getParkerCallerIDNum() + { + return parkerCallerIDNum; + } - public void setParkerAccountCode(String parkerAccountCode) { - this.parkerAccountCode = parkerAccountCode; - } + public void setParkerCallerIDNum(String parkerCallerIDNum) + { + this.parkerCallerIDNum = parkerCallerIDNum; + } + public String getParkerCallerIDName() + { + return parkerCallerIDName; + } - public String getParkerContext() { - return parkerContext; - } + public void setParkerCallerIDName(String parkerCallerIDName) + { + this.parkerCallerIDName = parkerCallerIDName; + } + public String getParkerConnectedLineNum() + { + return parkerConnectedLineNum; + } - public void setParkerContext(String parkerContext) { - this.parkerContext = parkerContext; - } + public void setParkerConnectedLineNum(String parkerConnectedLineNum) + { + this.parkerConnectedLineNum = parkerConnectedLineNum; + } + public String getParkerConnectedLineName() + { + return parkerConnectedLineName; + } - public String getParkerExten() { - return parkerExten; - } + public void setParkerConnectedLineName(String parkerConnectedLineName) + { + this.parkerConnectedLineName = parkerConnectedLineName; + } + public String getParkerAccountCode() + { + return parkerAccountCode; + } - public void setParkerExten(String parkerExten) { - this.parkerExten = parkerExten; - } + public void setParkerAccountCode(String parkerAccountCode) + { + this.parkerAccountCode = parkerAccountCode; + } + public String getParkerContext() + { + return parkerContext; + } - public String getParkerPriority() { - return parkerPriority; - } + public void setParkerContext(String parkerContext) + { + this.parkerContext = parkerContext; + } + public String getParkerExten() + { + return parkerExten; + } - public void setParkerPriority(String parkerPriority) { - this.parkerPriority = parkerPriority; - } + public void setParkerExten(String parkerExten) + { + this.parkerExten = parkerExten; + } + public String getParkerPriority() + { + return parkerPriority; + } - public String getParkerUniqueid() { - return parkerUniqueid; - } + public void setParkerPriority(String parkerPriority) + { + this.parkerPriority = parkerPriority; + } + public String getParkerUniqueid() + { + return parkerUniqueid; + } - public void setParkerUniqueid(String parkerUniqueid) { - this.parkerUniqueid = parkerUniqueid; - } + public void setParkerUniqueid(String parkerUniqueid) + { + this.parkerUniqueid = parkerUniqueid; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java index 81be571a3..0a8dab942 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java @@ -19,11 +19,9 @@ import java.util.Map; /** - * An AgentCalledEvent is triggered when an agent is rung. - *
+ * An AgentCalledEvent is triggered when an agent is rung.
* To enable AgentCalledEvents you have to set - * eventwhencalled = yes in queues.conf. - *
+ * eventwhencalled = yes in queues.conf.
* This event is implemented in apps/app_queue.c * * @author srt @@ -53,7 +51,8 @@ public AgentCalledEvent(Object source) } /** - * Returns the name of the queue.

+ * Returns the name of the queue. + *

* Available since Asterisk 1.6. * * @return the name of the queue. @@ -84,7 +83,7 @@ public String getAgentCalled() * Sets the member interface of the agent that has been called. * * @param agentCalled the member interface of the agent that has been - * called. + * called. */ public void setAgentCalled(String agentCalled) { @@ -92,7 +91,8 @@ public void setAgentCalled(String agentCalled) } /** - * Returns the name of the agent that has been called.

+ * Returns the name of the agent that has been called. + *

* Available since Asterisk 1.6. * * @return the name of the agent that has been called. @@ -130,7 +130,8 @@ public void setChannelCalling(String channelCalling) } /** - * Returns the name of the channel calling the agent.

+ * Returns the name of the channel calling the agent. + *

* Available since Asterisk 1.6 * * @return the name of the channel calling the agent. @@ -152,7 +153,8 @@ public void setDestinationChannel(String destinationChannel) * @return the Caller ID number of the caller's channel. * @deprecated as of 1.0.0, use {@link #getCallerIdNum()} instead. */ - @Deprecated public String getCallerId() + @Deprecated + public String getCallerId() { return callerIdNum; } @@ -167,7 +169,6 @@ public void setCallerId(String callerId) this.callerIdNum = callerId; } - public String getExtension() { return exten; @@ -179,8 +180,9 @@ public void setExtension(String extension) } /** - * Returns the unique id of the caller's channel that is about to be handled by - * the agent. This corresponds to {@link #getChannelCalling()}.

+ * Returns the unique id of the caller's channel that is about to be handled + * by the agent. This corresponds to {@link #getChannelCalling()}. + *

* Available since Asterisk 1.6 * * @return the unique id of the caller's channel. @@ -197,8 +199,9 @@ public void setUniqueId(String uniqueId) } /** - * Returns the channel variables if eventwhencalled is set to vars - * in queues.conf.

+ * Returns the channel variables if eventwhencalled is set to + * vars in queues.conf. + *

* Available since Asterisk 1.6 * * @return the channel variables. @@ -210,7 +213,8 @@ public Map getVariables() } /** - * Sets the channel variables.

+ * Sets the channel variables. + *

* Available since Asterisk 1.6 * * @param variables the channel variables. diff --git a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java index fd91c9f6c..e431286ca 100644 --- a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java @@ -17,7 +17,8 @@ package org.asteriskjava.manager.event; /** - * A CoreShowChannelEvent is triggered for each active channel in response to a CoreShowChannelsAction. + * A CoreShowChannelEvent is triggered for each active channel in response to a + * CoreShowChannelsAction. * * @author sebastian gutierrez * @version $Id$ @@ -55,7 +56,6 @@ public CoreShowChannelEvent(Object source) * @return channel state */ - /** * Returns the Account code * @@ -87,8 +87,8 @@ public void setApplication(String application) } /** - * Returns the Aplication Data is runnning that channel at that time - * this is the parameters passed to that dialplan application + * Returns the Aplication Data is runnning that channel at that time this is + * the parameters passed to that dialplan application * * @return aplication data */ diff --git a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java index aad5f96ad..061c604c9 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialBeginEvent.java @@ -3,45 +3,47 @@ public class DialBeginEvent extends DialEvent { - /** + /** * */ - private static final long serialVersionUID = 1L; - private String language; - private String destlanguage; - private String destAccountCode; - - public DialBeginEvent(Object source) - { - super(source); - setSubEvent(SUBEVENT_BEGIN); - } - - public String getLanguage() - { - return language; - } - - public void setLanguage(String language) - { - this.language = language; - } - - public String getDestLanguage() - { - return destlanguage; - } - - public void setDestLanguage(String destlanguage) - { - this.destlanguage = destlanguage; - } - - public String getDestAccountCode() { - return destAccountCode; - } - - public void setDestAccountCode(String destAccountCode) { - this.destAccountCode = destAccountCode; - } + private static final long serialVersionUID = 1L; + private String language; + private String destlanguage; + private String destAccountCode; + + public DialBeginEvent(Object source) + { + super(source); + setSubEvent(SUBEVENT_BEGIN); + } + + public String getLanguage() + { + return language; + } + + public void setLanguage(String language) + { + this.language = language; + } + + public String getDestLanguage() + { + return destlanguage; + } + + public void setDestLanguage(String destlanguage) + { + this.destlanguage = destlanguage; + } + + public String getDestAccountCode() + { + return destAccountCode; + } + + public void setDestAccountCode(String destAccountCode) + { + this.destAccountCode = destAccountCode; + } } diff --git a/src/main/java/org/asteriskjava/manager/event/DialEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEvent.java index 94592fb49..348129141 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEvent.java @@ -17,8 +17,10 @@ package org.asteriskjava.manager.event; /** - * A dial event is triggered whenever a phone attempts to dial someone.

- * This event is implemented in apps/app_dial.c.

+ * A dial event is triggered whenever a phone attempts to dial someone. + *

+ * This event is implemented in apps/app_dial.c. + *

* Available since Asterisk 1.2. * * @author Asteria Solutions Group, Inc. http://www.asteriasgi.com/ @@ -75,7 +77,6 @@ public class DialEvent extends ManagerEvent private String destCallerIdName; private String destCallerIdNum; - /** * The new Caller*ID. */ @@ -98,39 +99,43 @@ public class DialEvent extends ManagerEvent private String dialString; private String dialStatus; - + public DialEvent(Object source) { super(source); } /** - * Enro 2015-03 - * Workaround to build legacy DialEvent (unsupported in Asterisk 13) from new DialBeginEvent Asterisk 13. + * Enro 2015-03 Workaround to build legacy DialEvent (unsupported in + * Asterisk 13) from new DialBeginEvent Asterisk 13. */ - public DialEvent(DialBeginEvent dialBeginEvent){ - this(dialBeginEvent.getSource()); - setDateReceived(dialBeginEvent.getDateReceived()); - setTimestamp(dialBeginEvent.getTimestamp()); - setPrivilege(dialBeginEvent.getPrivilege()); - setCallerId(dialBeginEvent.getCallerIdNum()); - setCallerIdName(dialBeginEvent.getCallerIdName()); - setSrc(dialBeginEvent.getChannel()); - setUniqueId(dialBeginEvent.getSrcUniqueId()); - setDestUniqueId(dialBeginEvent.getDestUniqueId()); - setDestination(dialBeginEvent.getDestChannel()); - setDialStatus(dialBeginEvent.getDialStatus()); - } - + public DialEvent(DialBeginEvent dialBeginEvent) + { + this(dialBeginEvent.getSource()); + setDateReceived(dialBeginEvent.getDateReceived()); + setTimestamp(dialBeginEvent.getTimestamp()); + setPrivilege(dialBeginEvent.getPrivilege()); + setCallerId(dialBeginEvent.getCallerIdNum()); + setCallerIdName(dialBeginEvent.getCallerIdName()); + setSrc(dialBeginEvent.getChannel()); + setUniqueId(dialBeginEvent.getSrcUniqueId()); + setDestUniqueId(dialBeginEvent.getDestUniqueId()); + setDestination(dialBeginEvent.getDestChannel()); + setDialStatus(dialBeginEvent.getDialStatus()); + } + /** - * Since Asterisk 1.6 the begin and the end of a dial command generate a Dial event. The - * subEvent property returns whether the dial started execution ("Begin") or completed ("End"). - * As Asterisk prior to 1.6 only sends one event per Dial command this always returns "Begin" - * for Asterisk prior to 1.6.
- * For an "End" sub event only the properies channel, unqiue id and dial status are available, - * for a "Begin" sub event all properties are available except for the dial status. + * Since Asterisk 1.6 the begin and the end of a dial command generate a + * Dial event. The subEvent property returns whether the dial started + * execution ("Begin") or completed ("End"). As Asterisk prior to 1.6 only + * sends one event per Dial command this always returns "Begin" for Asterisk + * prior to 1.6.
+ * For an "End" sub event only the properies channel, unqiue id and dial + * status are available, for a "Begin" sub event all properties are + * available except for the dial status. * - * @return "Begin" or "End" for Asterisk since 1.6, "Begin" for Asterisk prior to 1.6. + * @return "Begin" or "End" for Asterisk since 1.6, "Begin" for Asterisk + * prior to 1.6. * @since 1.0.0 */ public String getSubEvent() @@ -171,14 +176,17 @@ public void setChannel(String channel) * @return the name of the source channel. * @deprecated as of 1.0.0, use {@link #getChannel()} instead. */ - @Deprecated public String getSrc() + @Deprecated + public String getSrc() { return channel; } /** - * Sets the name of the source channel.

- * Asterisk versions up to 1.4 use the "Source" property instead of "Channel". + * Sets the name of the source channel. + *

+ * Asterisk versions up to 1.4 use the "Source" property instead of + * "Channel". * * @param src the name of the source channel. */ @@ -196,10 +204,10 @@ public String getDestination() { return destination; } - - public String getDestChannel() - { - return getDestination(); + + public String getDestChannel() + { + return getDestination(); } /** @@ -211,10 +219,10 @@ public void setDestination(String destination) { this.destination = destination; } - - public void setDestChannel(String destination) - { - setDestination(destination); + + public void setDestChannel(String destination) + { + setDestination(destination); } /** @@ -223,7 +231,8 @@ public void setDestChannel(String destination) * @return the Caller*ID or "<unknown>" if none has been set. * @deprecated as of 1.0.0, use {@link #getCallerIdNum()} instead. */ - @Deprecated public String getCallerId() + @Deprecated + public String getCallerId() { return callerIdNum; } @@ -266,14 +275,17 @@ public void setUniqueId(String srcUniqueId) * @return the unique ID of the source channel. * @deprecated as of 1.0.0, use {@link #getUniqueId()} instead. */ - @Deprecated public String getSrcUniqueId() + @Deprecated + public String getSrcUniqueId() { return uniqueId; } /** - * Sets the unique ID of the source channel.

- * Asterisk versions up to 1.4 use the "SrcUniqueId" property instead of "UniqueId". + * Sets the unique ID of the source channel. + *

+ * Asterisk versions up to 1.4 use the "SrcUniqueId" property instead of + * "UniqueId". * * @param srcUniqueId the unique ID of the source channel. */ @@ -303,7 +315,8 @@ public void setDestUniqueId(String destUniqueId) } /** - * Returns the dial string passed to the Dial application.

+ * Returns the dial string passed to the Dial application. + *

* Available since Asterisk 1.6. * * @return the dial string passed to the Dial application. @@ -326,7 +339,8 @@ public void setDialString(String dialString) } /** - * For end subevents this returns whether the completion status of the dial application.
+ * For end subevents this returns whether the completion status of the dial + * application.
* Possible values are: *

    *
  • CHANUNAVAIL
  • @@ -339,7 +353,8 @@ public void setDialString(String dialString) *
  • TORTURE
  • *
  • INVALIDARGS
  • *
- * It corresponds the the DIALSTATUS variable used in the dialplan.

+ * It corresponds the the DIALSTATUS variable used in the dialplan. + *

* Available since Asterisk 1.6. * * @return the completion status of the dial application. @@ -355,123 +370,123 @@ public void setDialStatus(String dialStatus) this.dialStatus = dialStatus; } - @Override - public String toString() - { - StringBuilder builder = new StringBuilder(); - builder.append("DialEvent [subEvent="); - builder.append(subEvent); - builder.append(", channel="); - builder.append(channel); - builder.append(", destination="); - builder.append(destination); - builder.append(", callerIdNum="); - builder.append(callerIdNum); - builder.append(", callerIdName="); - builder.append(callerIdName); - builder.append(", uniqueId="); - builder.append(uniqueId); - builder.append(", destUniqueId="); - builder.append(destUniqueId); - builder.append(", dialString="); - builder.append(dialString); - builder.append(", dialStatus="); - builder.append(dialStatus); - builder.append(", connectedLineNum="); - builder.append(connectedLineNum); - builder.append(", connectedLineName="); - builder.append(connectedLineName); - builder.append("]"); - return builder.toString(); - } - - public Integer getDestChannelState() - { + @Override + public String toString() + { + StringBuilder builder = new StringBuilder(); + builder.append("DialEvent [subEvent="); + builder.append(subEvent); + builder.append(", channel="); + builder.append(channel); + builder.append(", destination="); + builder.append(destination); + builder.append(", callerIdNum="); + builder.append(callerIdNum); + builder.append(", callerIdName="); + builder.append(callerIdName); + builder.append(", uniqueId="); + builder.append(uniqueId); + builder.append(", destUniqueId="); + builder.append(destUniqueId); + builder.append(", dialString="); + builder.append(dialString); + builder.append(", dialStatus="); + builder.append(dialStatus); + builder.append(", connectedLineNum="); + builder.append(connectedLineNum); + builder.append(", connectedLineName="); + builder.append(connectedLineName); + builder.append("]"); + return builder.toString(); + } + + public Integer getDestChannelState() + { return destChannelState; } - public void setDestChannelState(Integer destChannelState) - { + public void setDestChannelState(Integer destChannelState) + { this.destChannelState = destChannelState; } - public String getDestContext() - { + public String getDestContext() + { return destContext; } - public void setDestContext(String destContext) - { + public void setDestContext(String destContext) + { this.destContext = destContext; } - public Integer getDestPriority() - { + public Integer getDestPriority() + { return destPriority; } - public void setDestPriority(Integer destPriority) - { + public void setDestPriority(Integer destPriority) + { this.destPriority = destPriority; } - public String getDestChannelStateDesc() - { + public String getDestChannelStateDesc() + { return destChannelStateDesc; } - public void setDestChannelStateDesc(String destChannelStateDesc) - { + public void setDestChannelStateDesc(String destChannelStateDesc) + { this.destChannelStateDesc = destChannelStateDesc; } - public String getDestExten() - { + public String getDestExten() + { return destExten; } - public void setDestExten(String destExten) - { + public void setDestExten(String destExten) + { this.destExten = destExten; } - public String getDestConnectedLineName() - { + public String getDestConnectedLineName() + { return destConnectedLineName; } - public void setDestConnectedLineName(String destConnectedLineName) - { + public void setDestConnectedLineName(String destConnectedLineName) + { this.destConnectedLineName = destConnectedLineName; } - public String getDestConnectedLineNum() - { + public String getDestConnectedLineNum() + { return destConnectedLineNum; } - public void setDestConnectedLineNum(String destConnectedLineNum) - { + public void setDestConnectedLineNum(String destConnectedLineNum) + { this.destConnectedLineNum = destConnectedLineNum; } - public String getDestCallerIdName() - { + public String getDestCallerIdName() + { return destCallerIdName; } - public void setDestCallerIdName(String destCallerIdName) - { + public void setDestCallerIdName(String destCallerIdName) + { this.destCallerIdName = destCallerIdName; } - public String getDestCallerIdNum() - { + public String getDestCallerIdNum() + { return destCallerIdNum; } - public void setDestCallerIdNum(String destCallerIdNum) - { + public void setDestCallerIdNum(String destCallerIdNum) + { this.destCallerIdNum = destCallerIdNum; } } diff --git a/src/main/java/org/asteriskjava/manager/event/HoldEvent.java b/src/main/java/org/asteriskjava/manager/event/HoldEvent.java index d258625b2..49fc9643b 100644 --- a/src/main/java/org/asteriskjava/manager/event/HoldEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HoldEvent.java @@ -17,12 +17,16 @@ package org.asteriskjava.manager.event; /** - * A HoldEvent is triggered when a channel is put on hold (or no longer on hold).

- * It is implemented in channels/chan_sip.c.

+ * A HoldEvent is triggered when a channel is put on hold (or no longer on + * hold). + *

+ * It is implemented in channels/chan_sip.c. + *

* Available since Asterisk 1.2 for SIP channels, as of Asterisk 1.6 this event - * is also supported for IAX2 channels.

- * To receive HoldEvents for SIP channels you must set callevents = yes - * in sip.conf. + * is also supported for IAX2 channels. + *

+ * To receive HoldEvents for SIP channels you must set + * callevents = yes in sip.conf. * * @author srt * @version $Id$ @@ -36,6 +40,7 @@ public class HoldEvent extends AbstractHoldEvent private static final long serialVersionUID = 0L; private String musicClass; + /** * Creates a new HoldEvent. * @@ -44,19 +49,22 @@ public class HoldEvent extends AbstractHoldEvent public HoldEvent(Object source) { super(source); - /* Asterisk prior to 1.6 and after 11 uses Hold and Unhold events instead of the status - * So we set the status to true in the Hold event and to false in Unhold. - * For Asterisk 1.6-11 this is overridden by the status property received with - * the hold event. + /* + * Asterisk prior to 1.6 and after 11 uses Hold and Unhold events + * instead of the status So we set the status to true in the Hold event + * and to false in Unhold. For Asterisk 1.6-11 this is overridden by the + * status property received with the hold event. */ setStatus(true); } - public String getMusicClass() { - return musicClass; + public String getMusicClass() + { + return musicClass; } - public void setMusicClass(String musicClass) { - this.musicClass = musicClass; + public void setMusicClass(String musicClass) + { + this.musicClass = musicClass; } } diff --git a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java index 06f200e85..998621a97 100644 --- a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java @@ -23,11 +23,9 @@ /** * Abstract base class for all Events that can be received from the Asterisk - * server. - *
+ * server.
* Events contain data pertaining to an event generated from within the Asterisk - * core or an extension module. - *
+ * core or an extension module.
* There is one conrete subclass of ManagerEvent per each supported Asterisk * Event. * @@ -52,79 +50,98 @@ public abstract class ManagerEvent extends EventObject /** * Returns the Caller ID name of the caller's channel. * - * @return the Caller ID name of the caller's channel or "unknown" if none has been set. + * @return the Caller ID name of the caller's channel or "unknown" if none + * has been set. * @since 0.2 */ - public String getCallerIdName() { + public String getCallerIdName() + { return callerIdName; } - public void setCallerIdName(String callerIdName) { + public void setCallerIdName(String callerIdName) + { this.callerIdName = callerIdName; } - public String getConnectedLineNum() { + public String getConnectedLineNum() + { return connectedLineNum; } - public void setConnectedLineNum(String connectedLineNum) { + public void setConnectedLineNum(String connectedLineNum) + { this.connectedLineNum = connectedLineNum; } - public String getConnectedLineName() { + public String getConnectedLineName() + { return connectedLineName; } - public void setConnectedLineName(String connectedLineName) { + public void setConnectedLineName(String connectedLineName) + { this.connectedLineName = connectedLineName; } - public Integer getPriority() { + public Integer getPriority() + { return priority; } - public void setPriority(Integer priority) { + public void setPriority(Integer priority) + { this.priority = priority; } - public Integer getChannelState() { + public Integer getChannelState() + { return channelState; } - public void setChannelState(Integer channelState) { + public void setChannelState(Integer channelState) + { this.channelState = channelState; } - public String getChannelStateDesc() { + public String getChannelStateDesc() + { return channelStateDesc; } - public void setChannelStateDesc(String channelStateDesc) { + public void setChannelStateDesc(String channelStateDesc) + { this.channelStateDesc = channelStateDesc; } - public String getExten() { + public String getExten() + { return exten; } - public void setExten(String exten) { + public void setExten(String exten) + { this.exten = exten; } - public String getCallerIdNum() { + public String getCallerIdNum() + { return callerIdNum; } - public void setCallerIdNum(String callerIdNum) { + public void setCallerIdNum(String callerIdNum) + { this.callerIdNum = callerIdNum; } - public String getContext() { + public String getContext() + { return context; } - public void setContext(String context) { + public void setContext(String context) + { this.context = context; } @@ -143,12 +160,13 @@ public void setContext(String context) { private Double timestamp; /** - * The server from which this event has been received (only used with AstManProxy). + * The server from which this event has been received (only used with + * AstManProxy). */ private String server; private String systemName; - + // AJ-213 only used when debugging is turned on private String file; private Integer line; @@ -163,8 +181,7 @@ public ManagerEvent(Object source) /** * Returns the point in time this event was received from the Asterisk - * server. - *
+ * server.
* Pseudo events that are not directly received from the asterisk server * (for example ConnectEvent and DisconnectEvent) may return * null. @@ -183,11 +200,9 @@ public void setDateReceived(Date dateReceived) } /** - * Returns the AMI authorization class of this event. - *
+ * Returns the AMI authorization class of this event.
* This is one or more of system, call, log, verbose, command, agent or - * user. Multiple privileges are separated by comma. - *
+ * user. Multiple privileges are separated by comma.
* Note: This property is not available from Asterisk 1.0 servers. * * @since 0.2 @@ -208,13 +223,10 @@ public void setPrivilege(String privilege) } /** - * Returns the timestamp for this event. - *
+ * Returns the timestamp for this event.
* The timestamp property is available in Asterisk since 1.4 if enabled in - * manager.conf by setting timestampevents = yes. - *
- * In contains the time the event was generated in seconds since the epoch. - *
+ * manager.conf by setting timestampevents = yes.
+ * In contains the time the event was generated in seconds since the epoch.
* Example: 1159310429.569108 * * @return the timestamp for this event. @@ -237,13 +249,13 @@ public final void setTimestamp(Double timestamp) } /** - * Returns the name of the Asterisk server from which this event has been received. - *
+ * Returns the name of the Asterisk server from which this event has been + * received.
* This property is only available when using to AstManProxy. * - * @return the name of the Asterisk server from which this event has been received - * or null when directly connected to an Asterisk server - * instead of AstManProxy. + * @return the name of the Asterisk server from which this event has been + * received or null when directly connected to an + * Asterisk server instead of AstManProxy. * @since 1.0.0 */ public final String getServer() @@ -252,9 +264,11 @@ public final String getServer() } /** - * Sets the name of the Asterisk server from which this event has been received. + * Sets the name of the Asterisk server from which this event has been + * received. * - * @param server the name of the Asterisk server from which this event has been received. + * @param server the name of the Asterisk server from which this event has + * been received. * @since 1.0.0 */ public final void setServer(String server) @@ -262,22 +276,28 @@ public final void setServer(String server) this.server = server; } - public String getSystemName() { - return systemName; - } + public String getSystemName() + { + return systemName; + } - public void setSystemName(String systemName) { - this.systemName = systemName; - } + public void setSystemName(String systemName) + { + this.systemName = systemName; + } /** - * Returns the name of the file in Asterisk's source code that triggered this event. For example - * pbx.c.

- * This property is only available if debugging for the Manager API has been turned on in Asterisk. This can be - * done by calling manager debug on on Asterisk's command line interface or by adding - * debug=on to Asterisk's manager.conf. This feature is availble in Asterisk since 1.6.0. + * Returns the name of the file in Asterisk's source code that triggered + * this event. For example pbx.c. + *

+ * This property is only available if debugging for the Manager API has been + * turned on in Asterisk. This can be done by calling + * manager debug on on Asterisk's command line interface or by + * adding debug=on to Asterisk's manager.conf. + * This feature is availble in Asterisk since 1.6.0. * - * @return the name of the file in that triggered this event or null if debgging is turned off. + * @return the name of the file in that triggered this event or + * null if debgging is turned off. * @see #getFunc() * @see #getLine() * @since 1.0.0 @@ -293,12 +313,17 @@ public void setFile(String file) } /** - * Returns the line number in Asterisk's source code where this event was triggered.

- * This property is only available if debugging for the Manager API has been turned on in Asterisk. This can be - * done by calling manager debug on on Asterisk's command line interface or by adding - * debug=on to Asterisk's manager.conf. This feature is availble in Asterisk since 1.6.0. + * Returns the line number in Asterisk's source code where this event was + * triggered. + *

+ * This property is only available if debugging for the Manager API has been + * turned on in Asterisk. This can be done by calling + * manager debug on on Asterisk's command line interface or by + * adding debug=on to Asterisk's manager.conf. + * This feature is availble in Asterisk since 1.6.0. * - * @return the line number where this event was triggered or null if debgging is turned off. + * @return the line number where this event was triggered or + * null if debgging is turned off. * @see #getFile() * @see #getFunc() * @since 1.0.0 @@ -314,13 +339,17 @@ public void setLine(Integer line) } /** - * Returns the name of the C function in Asterisk's source code that triggered this event. For example - * pbx_builtin_setvar_helper

- * This property is only available if debugging for the Manager API has been turned on in Asterisk. This can be - * done by calling manager debug on on Asterisk's command line interface or by adding - * debug=on to Asterisk's manager.conf. This feature is availble in Asterisk since 1.6.0. + * Returns the name of the C function in Asterisk's source code that + * triggered this event. For example pbx_builtin_setvar_helper + *

+ * This property is only available if debugging for the Manager API has been + * turned on in Asterisk. This can be done by calling + * manager debug on on Asterisk's command line interface or by + * adding debug=on to Asterisk's manager.conf. + * This feature is availble in Asterisk since 1.6.0. * - * @return the name of the C function that triggered this event or null if debgging is turned off. + * @return the name of the C function that triggered this event or + * null if debgging is turned off. * @see #getFile() * @see #getLine() * @since 1.0.0 @@ -336,12 +365,17 @@ public void setFunc(String func) } /** - * Returns the sequence numbers of this event. Sequence numbers are only incremented while debugging is enabled.

- * This property is only available if debugging for the Manager API has been turned on in Asterisk. This can be - * done by calling manager debug on on Asterisk's command line interface or by adding - * debug=on to Asterisk's manager.conf. This feature is availble in Asterisk since 1.6.0. + * Returns the sequence numbers of this event. Sequence numbers are only + * incremented while debugging is enabled. + *

+ * This property is only available if debugging for the Manager API has been + * turned on in Asterisk. This can be done by calling + * manager debug on on Asterisk's command line interface or by + * adding debug=on to Asterisk's manager.conf. + * This feature is availble in Asterisk since 1.6.0. * - * @return the sequence number of this event or null if debgging is turned off. + * @return the sequence number of this event or null if + * debgging is turned off. * @see #getFile() * @see #getLine() * @since 1.0.0 @@ -359,8 +393,8 @@ public void setSequenceNumber(Integer sequenceNumber) @Override public String toString() { - final List ignoredProperties = Arrays.asList( - "file", "func", "line", "sequenceNumber", "datereceived", "privilege", "source", "class"); + final List ignoredProperties = Arrays.asList("file", "func", "line", "sequenceNumber", "datereceived", + "privilege", "source", "class"); final StringBuilder sb = new StringBuilder(getClass().getName() + "["); appendPropertyIfNotNull(sb, "file", getFile()); appendPropertyIfNotNull(sb, "func", getFunc()); diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java index 1cf77bb43..5b7f16815 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeJoinEvent.java @@ -17,8 +17,11 @@ package org.asteriskjava.manager.event; /** - * A MeetMeJoinEvent is triggered if a channel joins a MeetMe conference.

- * Channel and unqiueId properties for this event are available since Asterisk 1.0.

+ * A MeetMeJoinEvent is triggered if a channel joins a MeetMe conference. + *

+ * Channel and unqiueId properties for this event are available since Asterisk + * 1.0. + *

* It is implemented in apps/app_meetme.c * * @author srt diff --git a/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java b/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java index dbf12490c..517a21cb1 100644 --- a/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/MeetMeLeaveEvent.java @@ -17,8 +17,11 @@ package org.asteriskjava.manager.event; /** - * A MeetMeLeaveEvent is triggered if a channel leaves a MeetMe conference.

- * Channel and unqiueId properties for this event are available since Asterisk 1.0.

+ * A MeetMeLeaveEvent is triggered if a channel leaves a MeetMe conference. + *

+ * Channel and unqiueId properties for this event are available since Asterisk + * 1.0. + *

* It is implemented in apps/app_meetme.c * * @author srt @@ -42,7 +45,8 @@ public MeetMeLeaveEvent(Object source) } /** - * Returns how long the user spent in the conference.

+ * Returns how long the user spent in the conference. + *

* This property is available since Asterisk 1.4. * * @return the duration in seconds the user spent in the conference. diff --git a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java index b31f10b08..c37e63c89 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewChannelEvent.java @@ -17,7 +17,8 @@ package org.asteriskjava.manager.event; /** - * A NewChannelEvent is triggered when a new channel is created.

+ * A NewChannelEvent is triggered when a new channel is created. + *

* It is implemented in channel.c * * @author srt @@ -40,16 +41,17 @@ public NewChannelEvent(Object source) public String getLanguage() { - return language; + return language; } - + public void setLanguage(String language) { - this.language = language; + this.language = language; } - + /** - * Returns the account code of the new channel.

+ * Returns the account code of the new channel. + *

* This property is available since Asterisk 1.6. * * @return the account code of the new channel. diff --git a/src/main/java/org/asteriskjava/manager/event/ParkedCallEvent.java b/src/main/java/org/asteriskjava/manager/event/ParkedCallEvent.java index f46370dc2..d2584f461 100644 --- a/src/main/java/org/asteriskjava/manager/event/ParkedCallEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ParkedCallEvent.java @@ -18,7 +18,8 @@ /** * A ParkedCallEvent is triggered when a channel is parked (in this case no - * action id is set) and in response to a ParkedCallsAction.

+ * action id is set) and in response to a ParkedCallsAction. + *

* It is implemented in res/res_features.c * * @see org.asteriskjava.manager.action.ParkedCallsAction @@ -31,9 +32,8 @@ public class ParkedCallEvent extends AbstractParkedCallEvent * Serializable version identifier */ private static final long serialVersionUID = 0L; - + private Integer timeout; - /** * @param source @@ -44,7 +44,8 @@ public ParkedCallEvent(Object source) } /** - * Returns the number of seconds this call will be parked.

+ * Returns the number of seconds this call will be parked. + *

* This corresponds to the parkingtime option in * features.conf. */ @@ -60,10 +61,10 @@ public void setTimeout(Integer timeout) { this.timeout = timeout; } - + /** - * Sets the unique id of the parked channel as a - * workaround for a typo in asterisk manager event. + * Sets the unique id of the parked channel as a workaround for a typo in + * asterisk manager event. */ public void setUnqiueId(String unqiueId) { diff --git a/src/main/java/org/asteriskjava/manager/event/ParkedCallGiveUpEvent.java b/src/main/java/org/asteriskjava/manager/event/ParkedCallGiveUpEvent.java index 7cc358b15..1c4a456e5 100644 --- a/src/main/java/org/asteriskjava/manager/event/ParkedCallGiveUpEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ParkedCallGiveUpEvent.java @@ -18,8 +18,10 @@ /** * A ParkedCallGiveUpEvent is triggered when a channel that has been parked is - * hung up.

- * It is implemented in res/res_features.c

+ * hung up. + *

+ * It is implemented in res/res_features.c + *

* Available since Asterisk 1.2 * * @author srt diff --git a/src/main/java/org/asteriskjava/manager/event/ParkedCallTimeOutEvent.java b/src/main/java/org/asteriskjava/manager/event/ParkedCallTimeOutEvent.java index aef3fc5f4..c258ba4af 100644 --- a/src/main/java/org/asteriskjava/manager/event/ParkedCallTimeOutEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ParkedCallTimeOutEvent.java @@ -18,8 +18,10 @@ /** * A ParkedCallTimeOutEvent is triggered when call parking times out for a given - * channel.

- * It is implemented in res/res_features.c

+ * channel. + *

+ * It is implemented in res/res_features.c + *

* Available since Asterisk 1.2 * * @author srt diff --git a/src/main/java/org/asteriskjava/manager/event/ParkedCallsCompleteEvent.java b/src/main/java/org/asteriskjava/manager/event/ParkedCallsCompleteEvent.java index 254cbab6a..263df0c59 100644 --- a/src/main/java/org/asteriskjava/manager/event/ParkedCallsCompleteEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ParkedCallsCompleteEvent.java @@ -17,12 +17,11 @@ package org.asteriskjava.manager.event; /** - * A ParkedCallsCompleteEvent is triggered after all parked calls have been reported in response to - * a ParkedCallsAction. + * A ParkedCallsCompleteEvent is triggered after all parked calls have been + * reported in response to a ParkedCallsAction. * * @see org.asteriskjava.manager.action.ParkedCallsAction * @see org.asteriskjava.manager.event.ParkedCallEvent - * * @author srt * @version $Id$ */ diff --git a/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java b/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java index 2a6e53809..840e105ed 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/QueueEntryEvent.java @@ -18,7 +18,8 @@ /** * A QueueEntryEvent is triggered in response to a QueueStatusAction and - * contains information about an entry in a queue.

+ * contains information about an entry in a queue. + *

* It is implemented in apps/app_queue.c * * @author srt @@ -87,7 +88,8 @@ public String getChannel() } /** - * Returns the unique id of the channel of this entry.

+ * Returns the unique id of the channel of this entry. + *

* Available since Asterisk 1.6. * * @return the unique id of the channel of this entry. @@ -113,25 +115,25 @@ public void setChannel(String channel) this.channel = channel; } - /** + /** * Returns the the Caller*ID number of this entry. * * @return the the Caller*ID number of this entry. */ - public String getCallerId() + public String getCallerId() { - return callerId; - } + return callerId; + } /** * Sets the the Caller*ID number of this entry. * * @param callerId the the Caller*ID number of this entry. */ - public void setCallerId(String callerId) - { - this.callerId = callerId; - } + public void setCallerId(String callerId) + { + this.callerId = callerId; + } /** * Returns the number of seconds this entry has spent in the queue. @@ -148,5 +150,5 @@ public void setWait(Long wait) { this.wait = wait; } - + } diff --git a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java index eebbe4f1a..ad34f4daf 100644 --- a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java @@ -21,7 +21,8 @@ import java.util.Map; /** - * A StatusEvent is triggered for each active channel in response to a StatusAction. + * A StatusEvent is triggered for each active channel in response to a + * StatusAction. * * @author srt * @version $Id$ @@ -68,19 +69,24 @@ public void setChannel(String channel) } /** - * Returns the Caller*ID Number of this channel.

- * This property is deprecated as of Asterisk 1.4, use {@link #getCallerIdNum()} instead. + * Returns the Caller*ID Number of this channel. + *

+ * This property is deprecated as of Asterisk 1.4, use + * {@link #getCallerIdNum()} instead. * - * @return the Caller*ID Number of this channel or null if none is available. + * @return the Caller*ID Number of this channel or null if none + * is available. * @deprecated */ - @Deprecated public String getCallerId() + @Deprecated + public String getCallerId() { return callerIdNum; } /** - * Sets the Caller*ID Number of this channel.

+ * Sets the Caller*ID Number of this channel. + *

* This property is deprecated as of Asterisk 1.4. * * @param callerIdNum the Caller*ID Number to set. @@ -93,7 +99,8 @@ public void setCallerId(String callerIdNum) /** * Returns the Caller*ID Number of this channel. * - * @return the Caller*ID Number of this channel or null if none is available. + * @return the Caller*ID Number of this channel or null if none + * is available. * @since 0.3 */ public String getCallerIdNum() @@ -115,7 +122,8 @@ public void setCallerIdNum(String callerIdNum) /** * Returns the Caller*ID Name of this channel. * - * @return the Caller*ID Name of this channel or null if none is available. + * @return the Caller*ID Name of this channel or null if none + * is available. */ public String getCallerIdName() { @@ -160,14 +168,17 @@ public void setAccountCode(String accountCode) * @return the account code of this channel. * @deprecated since 1.0.0, use {@link #getAccountCode()} instead. */ - @Deprecated public String getAccount() + @Deprecated + public String getAccount() { return accountCode; } /** - * Sets the account code of this channel.

- * Asterisk versions up to 1.4 use the "Account" property instead of "AccountCode". + * Sets the account code of this channel. + *

+ * Asterisk versions up to 1.4 use the "Account" property instead of + * "AccountCode". * * @param account the account code of this channel. */ @@ -177,9 +188,10 @@ public void setAccount(String account) } /** - * Returns the state of the channel.

- * For Asterisk versions prior to 1.6 (that do not send the numeric value) it is derived - * from the descriptive text. + * Returns the state of the channel. + *

+ * For Asterisk versions prior to 1.6 (that do not send the numeric value) + * it is derived from the descriptive text. * * @return the state of the channel. * @since 1.0.0 @@ -222,7 +234,8 @@ public void setChannelStateDesc(String channelStateDesc) * @return the state of the channel as a descriptive text. * @deprecated use {@link #getChannelStateDesc()} instead. */ - @Deprecated public String getState() + @Deprecated + public String getState() { return getChannelStateDesc(); } @@ -276,7 +289,8 @@ public String getBridgedChannel() /** * Sets the name of the linked channel. * - * @param bridgedChannel the name of the linked channel if this channel is bridged. + * @param bridgedChannel the name of the linked channel if this channel is + * bridged. * @since 1.0.0 */ public void setBridgedChannel(String bridgedChannel) @@ -290,13 +304,15 @@ public void setBridgedChannel(String bridgedChannel) * @return the name of the linked channel if this channel is bridged. * @deprecated as of 1.0.0, use {@link #getBridgedChannel()} instead. */ - @Deprecated public String getLink() + @Deprecated + public String getLink() { return bridgedChannel; } /** - * Sets the name of the linked channel.

+ * Sets the name of the linked channel. + *

* Asterisk versions up to 1.4 use "Link" instead of "BridgedChannel". * * @param link the name of the linked channel if this channel is bridged. @@ -307,7 +323,8 @@ public void setLink(String link) } /** - * Returns the unique id of the linked channel if this channel is bridged.

+ * Returns the unique id of the linked channel if this channel is bridged. + *

* Available since Asterisk 1.6. * * @return the unique id of the linked channel if this channel is bridged. @@ -319,10 +336,12 @@ public String getBridgedUniqueId() } /** - * Sets the unique id of the linked channel if this channel is bridged.

+ * Sets the unique id of the linked channel if this channel is bridged. + *

* Available since Asterisk 1.6. * - * @param bridgedUniqueId the unique id of the linked channel if this channel is bridged. + * @param bridgedUniqueId the unique id of the linked channel if this + * channel is bridged. * @since 1.0.0 */ public void setBridgedUniqueId(String bridgedUniqueId) @@ -351,8 +370,10 @@ public void setUniqueId(String uniqueId) } /** - * Returns the channel variables if the {@link org.asteriskjava.manager.action.StatusAction#setVariables(String)} - * property has been set.

+ * Returns the channel variables if the + * {@link org.asteriskjava.manager.action.StatusAction#setVariables(String)} + * property has been set. + *

* Available since Asterisk 1.6 * * @return the channel variables. @@ -364,7 +385,8 @@ public Map getVariables() } /** - * Sets the channel variables.

+ * Sets the channel variables. + *

* Available since Asterisk 1.6 * * @param variables the channel variables. @@ -374,5 +396,5 @@ public void setVariables(Map variables) { this.variables = variables; } - + } diff --git a/src/main/java/org/asteriskjava/manager/event/UnholdEvent.java b/src/main/java/org/asteriskjava/manager/event/UnholdEvent.java index b86333b83..62df5492e 100644 --- a/src/main/java/org/asteriskjava/manager/event/UnholdEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/UnholdEvent.java @@ -18,16 +18,19 @@ /** * An UnholdEvent is triggered by the SIP channel driver when a channel is no - * longer put on hold.

- * It is implemented in channels/chan_sip.c.

- * Available since Asterisk 1.2, as of Asterisk 1.6 only {@link org.asteriskjava.manager.event.HoldEvent} is sent - * with the status set to false to indicate unhold. + * longer put on hold. + *

+ * It is implemented in channels/chan_sip.c. + *

+ * Available since Asterisk 1.2, as of Asterisk 1.6 only + * {@link org.asteriskjava.manager.event.HoldEvent} is sent with the status set + * to false to indicate unhold. * * @author srt * @version $Id$ * @see org.asteriskjava.manager.event.HoldEvent - * @since 0.2 - * Enro 2015-03: No longer deprecated since Asterisk 13 uses this again. + * @since 0.2 Enro 2015-03: No longer deprecated since Asterisk 13 uses this + * again. */ public class UnholdEvent extends AbstractHoldEvent { diff --git a/src/main/java/org/asteriskjava/manager/event/UnparkedCallEvent.java b/src/main/java/org/asteriskjava/manager/event/UnparkedCallEvent.java index 9d34c13ca..f8fa999a9 100644 --- a/src/main/java/org/asteriskjava/manager/event/UnparkedCallEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/UnparkedCallEvent.java @@ -18,8 +18,10 @@ /** * A UnparkedCallEvent is triggered when a channel that has been parked is - * resumed.

- * It is implemented in res/res_features.c

+ * resumed. + *

+ * It is implemented in res/res_features.c + *

* Available since Asterisk 1.2 * * @author srt @@ -48,6 +50,7 @@ public class UnparkedCallEvent extends AbstractUnParkedEvent private String RetrieverExten; private String RetrieverPriority; private String RetrieverUniqueid; + /** * @param source */ @@ -55,76 +58,124 @@ public UnparkedCallEvent(Object source) { super(source); } - public String getRetrieverChannel() { - return RetrieverChannel; - } - public void setRetrieverChannel(String retrieverChannel) { - RetrieverChannel = retrieverChannel; - } - public Integer getRetrieverChannelState() { - return RetrieverChannelState; - } - public void setRetrieverChannelState(Integer retrieverChannelState) { - RetrieverChannelState = retrieverChannelState; - } - public String getRetrieverChannelStateDesc() { - return RetrieverChannelStateDesc; - } - public void setRetrieverChannelStateDesc(String retrieverChannelStateDesc) { - RetrieverChannelStateDesc = retrieverChannelStateDesc; - } - public String getRetrieverCallerIDNum() { - return RetrieverCallerIDNum; - } - public void setRetrieverCallerIDNum(String retrieverCallerIDNum) { - RetrieverCallerIDNum = retrieverCallerIDNum; - } - public String getRetrieverCallerIDName() { - return RetrieverCallerIDName; - } - public void setRetrieverCallerIDName(String retrieverCallerIDName) { - RetrieverCallerIDName = retrieverCallerIDName; - } - public String getRetrieverConnectedLineNum() { - return RetrieverConnectedLineNum; - } - public void setRetrieverConnectedLineNum(String retrieverConnectedLineNum) { - RetrieverConnectedLineNum = retrieverConnectedLineNum; - } - public String getRetrieverConnectedLineName() { - return RetrieverConnectedLineName; - } - public void setRetrieverConnectedLineName(String retrieverConnectedLineName) { - RetrieverConnectedLineName = retrieverConnectedLineName; - } - public String getRetrieverAccountCode() { - return RetrieverAccountCode; - } - public void setRetrieverAccountCode(String retrieverAccountCode) { - RetrieverAccountCode = retrieverAccountCode; - } - public String getRetrieverContext() { - return RetrieverContext; - } - public void setRetrieverContext(String retrieverContext) { - RetrieverContext = retrieverContext; - } - public String getRetrieverExten() { - return RetrieverExten; - } - public void setRetrieverExten(String retrieverExten) { - RetrieverExten = retrieverExten; - } - public String getRetrieverPriority() { - return RetrieverPriority; - } - public void setRetrieverPriority(String retrieverPriority) { - RetrieverPriority = retrieverPriority; - } - public String getRetrieverUniqueid() { - return RetrieverUniqueid; - } - public void setRetrieverUniqueid(String retrieverUniqueid) { - RetrieverUniqueid = retrieverUniqueid; + + public String getRetrieverChannel() + { + return RetrieverChannel; + } + + public void setRetrieverChannel(String retrieverChannel) + { + RetrieverChannel = retrieverChannel; + } + + public Integer getRetrieverChannelState() + { + return RetrieverChannelState; + } + + public void setRetrieverChannelState(Integer retrieverChannelState) + { + RetrieverChannelState = retrieverChannelState; + } + + public String getRetrieverChannelStateDesc() + { + return RetrieverChannelStateDesc; + } + + public void setRetrieverChannelStateDesc(String retrieverChannelStateDesc) + { + RetrieverChannelStateDesc = retrieverChannelStateDesc; + } + + public String getRetrieverCallerIDNum() + { + return RetrieverCallerIDNum; + } + + public void setRetrieverCallerIDNum(String retrieverCallerIDNum) + { + RetrieverCallerIDNum = retrieverCallerIDNum; + } + + public String getRetrieverCallerIDName() + { + return RetrieverCallerIDName; + } + + public void setRetrieverCallerIDName(String retrieverCallerIDName) + { + RetrieverCallerIDName = retrieverCallerIDName; + } + + public String getRetrieverConnectedLineNum() + { + return RetrieverConnectedLineNum; + } + + public void setRetrieverConnectedLineNum(String retrieverConnectedLineNum) + { + RetrieverConnectedLineNum = retrieverConnectedLineNum; + } + + public String getRetrieverConnectedLineName() + { + return RetrieverConnectedLineName; + } + + public void setRetrieverConnectedLineName(String retrieverConnectedLineName) + { + RetrieverConnectedLineName = retrieverConnectedLineName; + } + + public String getRetrieverAccountCode() + { + return RetrieverAccountCode; + } + + public void setRetrieverAccountCode(String retrieverAccountCode) + { + RetrieverAccountCode = retrieverAccountCode; + } + + public String getRetrieverContext() + { + return RetrieverContext; + } + + public void setRetrieverContext(String retrieverContext) + { + RetrieverContext = retrieverContext; + } + + public String getRetrieverExten() + { + return RetrieverExten; + } + + public void setRetrieverExten(String retrieverExten) + { + RetrieverExten = retrieverExten; + } + + public String getRetrieverPriority() + { + return RetrieverPriority; + } + + public void setRetrieverPriority(String retrieverPriority) + { + RetrieverPriority = retrieverPriority; + } + + public String getRetrieverUniqueid() + { + return RetrieverUniqueid; + } + + public void setRetrieverUniqueid(String retrieverUniqueid) + { + RetrieverUniqueid = retrieverUniqueid; } } diff --git a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java index 201c24a24..ac09dab78 100644 --- a/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/VarSetEvent.java @@ -17,8 +17,11 @@ package org.asteriskjava.manager.event; /** - * A VarSetEvent is triggered when a channel or global variable is set in Asterisk.

- * Available since Asterisk 1.6

+ * A VarSetEvent is triggered when a channel or global variable is set in + * Asterisk. + *

+ * Available since Asterisk 1.6 + *

* It is implemented in main/pbx.c * * @author srt @@ -34,13 +37,15 @@ public class VarSetEvent extends ManagerEvent private String variable; private String value; private String language; - - public String getLanguage(){ - return language; + + public String getLanguage() + { + return language; } - - public void setLanguage(String language){ - this.language = language; + + public void setLanguage(String language) + { + this.language = language; } public VarSetEvent(Object source) @@ -49,9 +54,11 @@ public VarSetEvent(Object source) } /** - * Returns the name of the channel or null for global variables. + * Returns the name of the channel or null for global + * variables. * - * @return the name of the channel or null for global variables. + * @return the name of the channel or null for global + * variables. */ public String getChannel() { @@ -64,9 +71,11 @@ public void setChannel(String channel) } /** - * Returns the unique id of the channel or null for global variables. + * Returns the unique id of the channel or null for global + * variables. * - * @return the unique id of the channel or null for global variables. + * @return the unique id of the channel or null for global + * variables. */ public String getUniqueId() { @@ -107,4 +116,4 @@ public void setValue(String value) { this.value = value; } -} \ No newline at end of file +} diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index eac6c05e4..f816750fc 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -72,592 +72,588 @@ */ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher { - private static final int RECONNECTION_INTERVAL_1 = 50; - private static final int RECONNECTION_INTERVAL_2 = 5000; - private static final String DEFAULT_HOSTNAME = "localhost"; - private static final int DEFAULT_PORT = 5038; - private static final int RECONNECTION_VERSION_INTERVAL = 500; - private static final int MAX_VERSION_ATTEMPTS = 4; - private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); + private static final int RECONNECTION_INTERVAL_1 = 50; + private static final int RECONNECTION_INTERVAL_2 = 5000; + private static final String DEFAULT_HOSTNAME = "localhost"; + private static final int DEFAULT_PORT = 5038; + private static final int RECONNECTION_VERSION_INTERVAL = 500; + private static final int MAX_VERSION_ATTEMPTS = 4; + private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); private static final Pattern VERSION_PATTERN_1_6 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.6[-. ].*"); private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.8[-. ].*"); - private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); - private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); - private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?12[-. ].*"); - private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?13[-. ].*"); - - private static final AtomicLong idCounter = new AtomicLong(0); - - /** - * Instance logger. - */ - private final Log logger = LogFactory.getLog(getClass()); - - private final long id; - - /** - * Used to construct the internalActionId. - */ - private AtomicLong actionIdCounter = new AtomicLong(0); - - /* Config attributes */ - /** - * Hostname of the Asterisk server to connect to. - */ - private String hostname = DEFAULT_HOSTNAME; - - /** - * TCP port to connect to. - */ - private int port = DEFAULT_PORT; - - /** - * true to use SSL for the connection, false for a - * plain text connection. - */ - private boolean ssl = false; - - /** - * The username to use for login as defined in Asterisk's - * manager.conf. - */ - protected String username; - - /** - * The password to use for login as defined in Asterisk's - * manager.conf. - */ - protected String password; - - /** - * The default timeout to wait for a ManagerResponse after sending a - * ManagerAction. - */ - private long defaultResponseTimeout = 2000; - - /** - * The default timeout to wait for the last ResponseEvent after sending an - * EventGeneratingAction. - */ - private long defaultEventTimeout = 5000; - - /** - * The timeout to use when connecting the the Asterisk server. - */ - private int socketTimeout = 0; - - /** - * Closes the connection (and reconnects) if no input has been read for the given amount - * of milliseconds. A timeout of zero is interpreted as an infinite timeout. - * - * @see Socket#setSoTimeout(int) - */ - private int socketReadTimeout = 0; - - /** - * true to continue to reconnect after an authentication - * failure. - */ - private boolean keepAliveAfterAuthenticationFailure = true; - - /** - * The socket to use for TCP/IP communication with Asterisk. - */ - private SocketConnectionFacade socket; - - /** - * The thread that runs the reader. - */ - private Thread readerThread; - private final AtomicLong readerThreadCounter = new AtomicLong(0); - - private final AtomicLong reconnectThreadCounter = new AtomicLong(0); - - /** - * The reader to use to receive events and responses from asterisk. - */ - private ManagerReader reader; - - /** - * The writer to use to send actions to asterisk. - */ - private ManagerWriter writer; - - /** - * The protocol identifer Asterisk sends on connect wrapped into an object - * to be used as mutex. - */ - private final ProtocolIdentifierWrapper protocolIdentifier; - - /** - * The version of the Asterisk server we are connected to. - */ - private AsteriskVersion version; - - /** - * Contains the registered handlers that process the ManagerResponses. - *

- * Key is the internalActionId of the Action sent and value the - * corresponding ResponseListener. - */ - private final Map responseListeners; - - /** - * Contains the event handlers that handle ResponseEvents for the - * sendEventGeneratingAction methods. - *

- * Key is the internalActionId of the Action sent and value the - * corresponding EventHandler. - */ - private final Map responseEventListeners; - - /** - * Contains the event handlers that users registered. - */ - private final List eventListeners; - - protected ManagerConnectionState state = INITIAL; - - private String eventMask; - - /** - * Creates a new instance. - */ - public ManagerConnectionImpl() - { - this.id = idCounter.getAndIncrement(); - this.responseListeners = new HashMap(); - this.responseEventListeners = new HashMap(); - this.eventListeners = new ArrayList(); - this.protocolIdentifier = new ProtocolIdentifierWrapper(); - } - - // the following two methods can be overriden when running test cases to - // return a mock object - protected ManagerReader createReader(Dispatcher dispatcher, Object source) - { - return new ManagerReaderImpl(dispatcher, source); - } - - protected ManagerWriter createWriter() - { - return new ManagerWriterImpl(); - } - - /** - * Sets the hostname of the asterisk server to connect to. - *

- * Default is localhost. - * - * @param hostname the hostname to connect to - */ - public void setHostname(String hostname) - { - this.hostname = hostname; - } - - /** - * Sets the port to use to connect to the asterisk server. This is the port - * specified in asterisk's manager.conf file. - *

- * Default is 5038. - * - * @param port the port to connect to - */ - public void setPort(int port) - { - if (port <= 0) - { - this.port = DEFAULT_PORT; - } - else - { - this.port = port; - } - } - - /** - * Sets whether to use SSL. - *
- * Default is false. - * + private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); + private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); + private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?12[-. ].*"); + private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?13[-. ].*"); + + private static final AtomicLong idCounter = new AtomicLong(0); + + /** + * Instance logger. + */ + private final Log logger = LogFactory.getLog(getClass()); + + private final long id; + + /** + * Used to construct the internalActionId. + */ + private AtomicLong actionIdCounter = new AtomicLong(0); + + /* Config attributes */ + /** + * Hostname of the Asterisk server to connect to. + */ + private String hostname = DEFAULT_HOSTNAME; + + /** + * TCP port to connect to. + */ + private int port = DEFAULT_PORT; + + /** + * true to use SSL for the connection, false for a + * plain text connection. + */ + private boolean ssl = false; + + /** + * The username to use for login as defined in Asterisk's + * manager.conf. + */ + protected String username; + + /** + * The password to use for login as defined in Asterisk's + * manager.conf. + */ + protected String password; + + /** + * The default timeout to wait for a ManagerResponse after sending a + * ManagerAction. + */ + private long defaultResponseTimeout = 2000; + + /** + * The default timeout to wait for the last ResponseEvent after sending an + * EventGeneratingAction. + */ + private long defaultEventTimeout = 5000; + + /** + * The timeout to use when connecting the the Asterisk server. + */ + private int socketTimeout = 0; + + /** + * Closes the connection (and reconnects) if no input has been read for the + * given amount of milliseconds. A timeout of zero is interpreted as an + * infinite timeout. + * + * @see Socket#setSoTimeout(int) + */ + private int socketReadTimeout = 0; + + /** + * true to continue to reconnect after an authentication + * failure. + */ + private boolean keepAliveAfterAuthenticationFailure = true; + + /** + * The socket to use for TCP/IP communication with Asterisk. + */ + private SocketConnectionFacade socket; + + /** + * The thread that runs the reader. + */ + private Thread readerThread; + private final AtomicLong readerThreadCounter = new AtomicLong(0); + + private final AtomicLong reconnectThreadCounter = new AtomicLong(0); + + /** + * The reader to use to receive events and responses from asterisk. + */ + private ManagerReader reader; + + /** + * The writer to use to send actions to asterisk. + */ + private ManagerWriter writer; + + /** + * The protocol identifer Asterisk sends on connect wrapped into an object + * to be used as mutex. + */ + private final ProtocolIdentifierWrapper protocolIdentifier; + + /** + * The version of the Asterisk server we are connected to. + */ + private AsteriskVersion version; + + /** + * Contains the registered handlers that process the ManagerResponses. + *

+ * Key is the internalActionId of the Action sent and value the + * corresponding ResponseListener. + */ + private final Map responseListeners; + + /** + * Contains the event handlers that handle ResponseEvents for the + * sendEventGeneratingAction methods. + *

+ * Key is the internalActionId of the Action sent and value the + * corresponding EventHandler. + */ + private final Map responseEventListeners; + + /** + * Contains the event handlers that users registered. + */ + private final List eventListeners; + + protected ManagerConnectionState state = INITIAL; + + private String eventMask; + + /** + * Creates a new instance. + */ + public ManagerConnectionImpl() + { + this.id = idCounter.getAndIncrement(); + this.responseListeners = new HashMap(); + this.responseEventListeners = new HashMap(); + this.eventListeners = new ArrayList(); + this.protocolIdentifier = new ProtocolIdentifierWrapper(); + } + + // the following two methods can be overriden when running test cases to + // return a mock object + protected ManagerReader createReader(Dispatcher dispatcher, Object source) + { + return new ManagerReaderImpl(dispatcher, source); + } + + protected ManagerWriter createWriter() + { + return new ManagerWriterImpl(); + } + + /** + * Sets the hostname of the asterisk server to connect to. + *

+ * Default is localhost. + * + * @param hostname the hostname to connect to + */ + public void setHostname(String hostname) + { + this.hostname = hostname; + } + + /** + * Sets the port to use to connect to the asterisk server. This is the port + * specified in asterisk's manager.conf file. + *

+ * Default is 5038. + * + * @param port the port to connect to + */ + public void setPort(int port) + { + if (port <= 0) + { + this.port = DEFAULT_PORT; + } + else + { + this.port = port; + } + } + + /** + * Sets whether to use SSL.
+ * Default is false. + * * @param ssl true to use SSL for the connection, - * false for a plain text connection. - * @since 0.3 - */ - public void setSsl(boolean ssl) - { - this.ssl = ssl; - } - - /** - * Sets the username to use to connect to the asterisk server. This is the - * username specified in asterisk's manager.conf file. - * + * false for a plain text connection. + * @since 0.3 + */ + public void setSsl(boolean ssl) + { + this.ssl = ssl; + } + + /** + * Sets the username to use to connect to the asterisk server. This is the + * username specified in asterisk's manager.conf file. + * * @param username the username to use for login - */ - public void setUsername(String username) - { - this.username = username; - } - - /** - * Sets the password to use to connect to the asterisk server. This is the - * password specified in Asterisk's manager.conf file. - * + */ + public void setUsername(String username) + { + this.username = username; + } + + /** + * Sets the password to use to connect to the asterisk server. This is the + * password specified in Asterisk's manager.conf file. + * * @param password the password to use for login - */ - public void setPassword(String password) - { - this.password = password; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendAction(ManagerAction)} will wait for a response before - * throwing a TimeoutException. - *
- * Default is 2000. - * + */ + public void setPassword(String password) + { + this.password = password; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendAction(ManagerAction)} will wait for a response before + * throwing a TimeoutException.
+ * Default is 2000. + * * @param defaultResponseTimeout default response timeout in milliseconds - * @since 0.2 - */ - public void setDefaultResponseTimeout(long defaultResponseTimeout) - { - this.defaultResponseTimeout = defaultResponseTimeout; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a - * response and the last response event before throwing a TimeoutException. - *
- * Default is 5000. - * + * @since 0.2 + */ + public void setDefaultResponseTimeout(long defaultResponseTimeout) + { + this.defaultResponseTimeout = defaultResponseTimeout; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a + * response and the last response event before throwing a TimeoutException.
+ * Default is 5000. + * * @param defaultEventTimeout default event timeout in milliseconds - * @since 0.2 - */ - public void setDefaultEventTimeout(long defaultEventTimeout) - { - this.defaultEventTimeout = defaultEventTimeout; - } - - /** - * Set to true to try reconnecting to ther asterisk serve - * even if the reconnection attempt threw an AuthenticationFailedException. - *
- * Default is true. - * - * @param keepAliveAfterAuthenticationFailure - * true to try reconnecting to ther asterisk serve - * even if the reconnection attempt threw an AuthenticationFailedException, - * false otherwise. - */ - public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) - { - this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; - } - - /* Implementation of ManagerConnection interface */ - - public String getUsername() - { - return username; - } - - public String getPassword() - { - return password; - } - - public AsteriskVersion getVersion() - { - return version; - } - - public String getHostname() - { - return hostname; - } - - public int getPort() - { - return port; - } - - public boolean isSsl() - { - return ssl; - } - - public InetAddress getLocalAddress() - { - return socket.getLocalAddress(); - } - - public int getLocalPort() - { - return socket.getLocalPort(); - } - - public InetAddress getRemoteAddress() - { - return socket.getRemoteAddress(); - } - - public int getRemotePort() - { - return socket.getRemotePort(); - } - - public void registerUserEventClass(Class userEventClass) - { - if (reader == null) - { - reader = createReader(this, this); - } - - reader.registerEventClass(userEventClass); - } - - public void setSocketTimeout(int socketTimeout) - { - this.socketTimeout = socketTimeout; - } - - public void setSocketReadTimeout(int socketReadTimeout) - { - this.socketReadTimeout = socketReadTimeout; - } - - public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException - { - login(null); - } + * @since 0.2 + */ + public void setDefaultEventTimeout(long defaultEventTimeout) + { + this.defaultEventTimeout = defaultEventTimeout; + } + + /** + * Set to true to try reconnecting to ther asterisk serve even + * if the reconnection attempt threw an AuthenticationFailedException.
+ * Default is true. + * + * @param keepAliveAfterAuthenticationFailure true to try + * reconnecting to ther asterisk serve even if the reconnection + * attempt threw an AuthenticationFailedException, + * false otherwise. + */ + public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) + { + this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; + } + + /* Implementation of ManagerConnection interface */ + + public String getUsername() + { + return username; + } + + public String getPassword() + { + return password; + } + + public AsteriskVersion getVersion() + { + return version; + } + + public String getHostname() + { + return hostname; + } + + public int getPort() + { + return port; + } + + public boolean isSsl() + { + return ssl; + } + + public InetAddress getLocalAddress() + { + return socket.getLocalAddress(); + } + + public int getLocalPort() + { + return socket.getLocalPort(); + } + + public InetAddress getRemoteAddress() + { + return socket.getRemoteAddress(); + } + + public int getRemotePort() + { + return socket.getRemotePort(); + } + + public void registerUserEventClass(Class< ? extends ManagerEvent> userEventClass) + { + if (reader == null) + { + reader = createReader(this, this); + } + + reader.registerEventClass(userEventClass); + } + + public void setSocketTimeout(int socketTimeout) + { + this.socketTimeout = socketTimeout; + } + + public void setSocketReadTimeout(int socketReadTimeout) + { + this.socketReadTimeout = socketReadTimeout; + } + + public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException + { + login(null); + } public synchronized void login(String eventMask) throws IOException, AuthenticationFailedException, TimeoutException - { - if (state != INITIAL && state != DISCONNECTED) - { - throw new IllegalStateException("Login may only be perfomed when in state " - + "INITIAL or DISCONNECTED, but connection is in state " + state); - } - - state = CONNECTING; - this.eventMask = eventMask; - try - { - doLogin(defaultResponseTimeout, eventMask); - } - finally - { - if (state != CONNECTED) - { - state = DISCONNECTED; - } - } - } - - /** - * Does the real login, following the steps outlined below. - *
- *

    - *
  1. Connects to the asterisk server by calling {@link #connect()} if not - * already connected - *
  2. Waits until the protocol identifier is received but not longer than - * timeout ms. - *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType - * MD5. - *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} - * is sent using the calculated key (MD5 hash of the password appended to - * the received challenge). - *
- * - - * @param timeout the maximum time to wait for the protocol identifier (in - * ms) + { + if (state != INITIAL && state != DISCONNECTED) + { + throw new IllegalStateException("Login may only be perfomed when in state " + + "INITIAL or DISCONNECTED, but connection is in state " + state); + } + + state = CONNECTING; + this.eventMask = eventMask; + try + { + doLogin(defaultResponseTimeout, eventMask); + } + finally + { + if (state != CONNECTED) + { + state = DISCONNECTED; + } + } + } + + /** + * Does the real login, following the steps outlined below.
+ *
    + *
  1. Connects to the asterisk server by calling {@link #connect()} if not + * already connected + *
  2. Waits until the protocol identifier is received but not longer than + * timeout ms. + *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType + * MD5. + *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} + * is sent using the calculated key (MD5 hash of the password appended to + * the received challenge). + *
+ * @param timeout the maximum time to wait for the protocol identifier (in + * ms) * @param eventMask the event mask. Set to "on" if all events should be - * send, "off" if not events should be sent or a combination of - * "system", "call" and "log" (separated by ',') to specify what - * kind of events should be sent. - * @throws IOException if there is an i/o problem. + * send, "off" if not events should be sent or a combination of + * "system", "call" and "log" (separated by ',') to specify what + * kind of events should be sent. + * @throws IOException if there is an i/o problem. * @throws AuthenticationFailedException if username or password are - * incorrect and the login action returns an error or if the MD5 - * hash cannot be computed. The connection is closed in this - * case. - * @throws TimeoutException if a timeout occurs while waiting for the - * protocol identifier. The connection is closed in this case. - */ + * incorrect and the login action returns an error or if the MD5 + * hash cannot be computed. The connection is closed in this + * case. + * @throws TimeoutException if a timeout occurs while waiting for the + * protocol identifier. The connection is closed in this case. + */ protected synchronized void doLogin(long timeout, String eventMask) throws IOException, AuthenticationFailedException, TimeoutException - { - ChallengeAction challengeAction; - ManagerResponse challengeResponse; - String challenge; - String key; - LoginAction loginAction; - ManagerResponse loginResponse; - - if (socket == null) - { - connect(); - } - - synchronized (protocolIdentifier) - { - if (protocolIdentifier.value == null) - { - try - { - protocolIdentifier.wait(timeout); - } - catch (InterruptedException e) // NOPMD - { - Thread.currentThread().interrupt(); - } - } - - if (protocolIdentifier.value == null) - { - disconnect(); - if (reader != null && reader.getTerminationException() != null) - { - throw reader.getTerminationException(); - } - else - { - throw new TimeoutException("Timeout waiting for protocol identifier"); - } - } - } - - challengeAction = new ChallengeAction("MD5"); - try - { - challengeResponse = sendAction(challengeAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send challenge action", e); - } - - if (challengeResponse instanceof ChallengeResponse) - { - challenge = ((ChallengeResponse) challengeResponse).getChallenge(); - } - else - { - disconnect(); - throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " - + challengeResponse.getMessage()); - } - - try - { - MessageDigest md; - - md = MessageDigest.getInstance("MD5"); - if (challenge != null) - { - md.update(challenge.getBytes()); - } - if (password != null) - { - md.update(password.getBytes()); - } - key = ManagerUtil.toHexString(md.digest()); - } - catch (NoSuchAlgorithmException ex) - { - disconnect(); - throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); - } - - loginAction = new LoginAction(username, "MD5", key, eventMask); - try - { - loginResponse = sendAction(loginAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send login action", e); - } - - if (loginResponse instanceof ManagerError) - { - disconnect(); - throw new AuthenticationFailedException(loginResponse.getMessage()); - } - - logger.info("Successfully logged in"); - - version = determineVersion(); - - state = CONNECTED; - - writer.setTargetVersion(version); - - logger.info("Determined Asterisk version: " + version); - - // generate pseudo event indicating a successful login - ConnectEvent connectEvent = new ConnectEvent(this); - connectEvent.setProtocolIdentifier(getProtocolIdentifier()); - connectEvent.setDateReceived(DateUtil.getDate()); - // TODO could this cause a deadlock? - fireEvent(connectEvent); - } - - protected AsteriskVersion determineVersion() throws IOException, TimeoutException - { - int attempts = 0; - - // if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) - // { - // return AsteriskVersion.ASTERISK_1_6; - // } - - while (attempts++ < MAX_VERSION_ATTEMPTS) - { - final ManagerResponse showVersionFilesResponse; - final List showVersionFilesResult; - - // increase timeout as output is quite large + { + ChallengeAction challengeAction; + ManagerResponse challengeResponse; + String challenge; + String key; + LoginAction loginAction; + ManagerResponse loginResponse; + + if (socket == null) + { + connect(); + } + + synchronized (protocolIdentifier) + { + if (protocolIdentifier.value == null) + { + try + { + protocolIdentifier.wait(timeout); + } + catch (InterruptedException e) // NOPMD + { + Thread.currentThread().interrupt(); + } + } + + if (protocolIdentifier.value == null) + { + disconnect(); + if (reader != null && reader.getTerminationException() != null) + { + throw reader.getTerminationException(); + } + else + { + throw new TimeoutException("Timeout waiting for protocol identifier"); + } + } + } + + challengeAction = new ChallengeAction("MD5"); + try + { + challengeResponse = sendAction(challengeAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send challenge action", e); + } + + if (challengeResponse instanceof ChallengeResponse) + { + challenge = ((ChallengeResponse) challengeResponse).getChallenge(); + } + else + { + disconnect(); + throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " + + challengeResponse.getMessage()); + } + + try + { + MessageDigest md; + + md = MessageDigest.getInstance("MD5"); + if (challenge != null) + { + md.update(challenge.getBytes()); + } + if (password != null) + { + md.update(password.getBytes()); + } + key = ManagerUtil.toHexString(md.digest()); + } + catch (NoSuchAlgorithmException ex) + { + disconnect(); + throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); + } + + loginAction = new LoginAction(username, "MD5", key, eventMask); + try + { + loginResponse = sendAction(loginAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send login action", e); + } + + if (loginResponse instanceof ManagerError) + { + disconnect(); + throw new AuthenticationFailedException(loginResponse.getMessage()); + } + + logger.info("Successfully logged in"); + + version = determineVersion(); + + state = CONNECTED; + + writer.setTargetVersion(version); + + logger.info("Determined Asterisk version: " + version); + + // generate pseudo event indicating a successful login + ConnectEvent connectEvent = new ConnectEvent(this); + connectEvent.setProtocolIdentifier(getProtocolIdentifier()); + connectEvent.setDateReceived(DateUtil.getDate()); + // TODO could this cause a deadlock? + fireEvent(connectEvent); + } + + protected AsteriskVersion determineVersion() throws IOException, TimeoutException + { + int attempts = 0; + + // if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) + // { + // return AsteriskVersion.ASTERISK_1_6; + // } + + while (attempts++ < MAX_VERSION_ATTEMPTS) + { + final ManagerResponse showVersionFilesResponse; + final List showVersionFilesResult; + + // increase timeout as output is quite large showVersionFilesResponse = sendAction(new CommandAction("show version files pbx.c"), defaultResponseTimeout * 2); - if (!(showVersionFilesResponse instanceof CommandResponse)) - { - // return early in case of permission problems - // org.asteriskjava.manager.response.ManagerError: - // actionId='null'; message='Permission denied'; response='Error'; - // uniqueId='null'; systemHashcode=15231583 - break; - } - - showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); - if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) - { + if (!(showVersionFilesResponse instanceof CommandResponse)) + { + // return early in case of permission problems + // org.asteriskjava.manager.response.ManagerError: + // actionId='null'; message='Permission denied'; + // response='Error'; + // uniqueId='null'; systemHashcode=15231583 + break; + } + + showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); + if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) + { final String line1 = showVersionFilesResult.get(0); if (line1 != null && line1.startsWith("File")) - { - final String rawVersion; - - rawVersion = getRawVersion(); - if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) - { - return AsteriskVersion.ASTERISK_1_4; - } - return AsteriskVersion.ASTERISK_1_2; - } - else if (line1 != null && line1.contains("No such command")) - { - - final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction("core show version"), defaultResponseTimeout * 2); - - if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) - { + { + final String rawVersion; + + rawVersion = getRawVersion(); + if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) + { + return AsteriskVersion.ASTERISK_1_4; + } + return AsteriskVersion.ASTERISK_1_2; + } + else if (line1 != null && line1.contains("No such command")) + { + + final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction("core show version"), + defaultResponseTimeout * 2); + + if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) + { final List coreShowVersionResult = ((CommandResponse) coreShowVersionResponse).getResult(); if (coreShowVersionResult != null && coreShowVersionResult.size() > 0) @@ -702,902 +698,905 @@ else if (VERSION_PATTERN_13.matcher(coreLine).matches()) } else { - // if it isn't the "no such command", break and return the lowest version immediately - break; - } - } - } - - // as a fallback assume 1.6 - return AsteriskVersion.ASTERISK_1_6; - } - - protected String getRawVersion() - { - final ManagerResponse showVersionResponse; - - try - { - showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); - } - catch (Exception e) - { - return null; - } - - if (showVersionResponse instanceof CommandResponse) - { - final List showVersionResult; - - showVersionResult = ((CommandResponse) showVersionResponse).getResult(); - if (showVersionResult != null && showVersionResult.size() > 0) - { - return showVersionResult.get(0); - } - } - - return null; - } - - protected synchronized void connect() throws IOException - { - logger.info("Connecting to " + hostname + ":" + port); - - if (reader == null) - { - logger.debug("Creating reader for " + hostname + ":" + port); - reader = createReader(this, this); - } - - if (writer == null) - { - logger.debug("Creating writer"); - writer = createWriter(); - } - - logger.debug("Creating socket"); - socket = createSocket(); - - logger.debug("Passing socket to reader"); - reader.setSocket(socket); - - if (readerThread == null || !readerThread.isAlive() || reader.isDead()) - { - logger.debug("Creating and starting reader thread"); - readerThread = new Thread(reader); - readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" - + readerThreadCounter.getAndIncrement()); - readerThread.setDaemon(true); - readerThread.start(); - } - - logger.debug("Passing socket to writer"); - writer.setSocket(socket); - } - - protected SocketConnectionFacade createSocket() throws IOException - { - return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); - } - - public synchronized void logoff() throws IllegalStateException - { - if (state != CONNECTED && state != RECONNECTING) - { - throw new IllegalStateException("Logoff may only be perfomed when in state " - + "CONNECTED or RECONNECTING, but connection is in state " + state); - } - - state = DISCONNECTING; - - if (socket != null) - { - try - { - sendAction(new LogoffAction()); - } - catch (Exception e) - { - logger.warn("Unable to send LogOff action", e); - } - } - cleanup(); - state = DISCONNECTED; - } - - /** - * Closes the socket connection. - */ - protected synchronized void disconnect() - { - if (socket != null) - { - logger.info("Closing socket."); - try - { - socket.close(); - } - catch (IOException ex) - { - logger.warn("Unable to close socket: " + ex.getMessage()); - } - socket = null; - } - protocolIdentifier.value = null; - } + // if it isn't the "no such command", break and return the + // lowest version immediately + break; + } + } + } + + // as a fallback assume 1.6 + return AsteriskVersion.ASTERISK_1_6; + } + + protected String getRawVersion() + { + final ManagerResponse showVersionResponse; + + try + { + showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); + } + catch (Exception e) + { + return null; + } + + if (showVersionResponse instanceof CommandResponse) + { + final List showVersionResult; + + showVersionResult = ((CommandResponse) showVersionResponse).getResult(); + if (showVersionResult != null && showVersionResult.size() > 0) + { + return showVersionResult.get(0); + } + } + + return null; + } + + protected synchronized void connect() throws IOException + { + logger.info("Connecting to " + hostname + ":" + port); + + if (reader == null) + { + logger.debug("Creating reader for " + hostname + ":" + port); + reader = createReader(this, this); + } + + if (writer == null) + { + logger.debug("Creating writer"); + writer = createWriter(); + } + + logger.debug("Creating socket"); + socket = createSocket(); + + logger.debug("Passing socket to reader"); + reader.setSocket(socket); + + if (readerThread == null || !readerThread.isAlive() || reader.isDead()) + { + logger.debug("Creating and starting reader thread"); + readerThread = new Thread(reader); + readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" + + readerThreadCounter.getAndIncrement()); + readerThread.setDaemon(true); + readerThread.start(); + } + + logger.debug("Passing socket to writer"); + writer.setSocket(socket); + } + + protected SocketConnectionFacade createSocket() throws IOException + { + return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); + } + + public synchronized void logoff() throws IllegalStateException + { + if (state != CONNECTED && state != RECONNECTING) + { + throw new IllegalStateException("Logoff may only be perfomed when in state " + + "CONNECTED or RECONNECTING, but connection is in state " + state); + } + + state = DISCONNECTING; + + if (socket != null) + { + try + { + sendAction(new LogoffAction()); + } + catch (Exception e) + { + logger.warn("Unable to send LogOff action", e); + } + } + cleanup(); + state = DISCONNECTED; + } + + /** + * Closes the socket connection. + */ + protected synchronized void disconnect() + { + if (socket != null) + { + logger.info("Closing socket."); + try + { + socket.close(); + } + catch (IOException ex) + { + logger.warn("Unable to close socket: " + ex.getMessage()); + } + socket = null; + } + protocolIdentifier.value = null; + } public ManagerResponse sendAction(ManagerAction action) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException - { - return sendAction(action, defaultResponseTimeout); - } - - /* - * Implements synchronous sending of "simple" actions. - */ - public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, - IllegalArgumentException, IllegalStateException - { - ResponseHandlerResult result; - SendActionCallback callbackHandler; - - result = new ResponseHandlerResult(); - callbackHandler = new DefaultSendActionCallback(result); - - synchronized (result) - { - sendAction(action, callbackHandler); - - // definitely return null for the response of user events - if (action instanceof UserEventAction) - { - return null; - } - - // only wait if we did not yet receive the response. - // Responses may be returned really fast. - if (result.getResponse() == null) - { - try - { - result.wait(timeout); - } - catch (InterruptedException ex) - { - logger.warn("Interrupted while waiting for result"); - Thread.currentThread().interrupt(); - } - } - } - - // still no response? - if (result.getResponse() == null) - { - throw new TimeoutException("Timeout waiting for response to " + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); - } - - return result.getResponse(); - } + { + return sendAction(action, defaultResponseTimeout); + } + + /* + * Implements synchronous sending of "simple" actions. + */ + public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, + IllegalArgumentException, IllegalStateException + { + ResponseHandlerResult result; + SendActionCallback callbackHandler; + + result = new ResponseHandlerResult(); + callbackHandler = new DefaultSendActionCallback(result); + + synchronized (result) + { + sendAction(action, callbackHandler); + + // definitely return null for the response of user events + if (action instanceof UserEventAction) + { + return null; + } + + // only wait if we did not yet receive the response. + // Responses may be returned really fast. + if (result.getResponse() == null) + { + try + { + result.wait(timeout); + } + catch (InterruptedException ex) + { + logger.warn("Interrupted while waiting for result"); + Thread.currentThread().interrupt(); + } + } + } + + // still no response? + if (result.getResponse() == null) + { + throw new TimeoutException("Timeout waiting for response to " + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); + } + + return result.getResponse(); + } public void sendAction(ManagerAction action, SendActionCallback callback) throws IOException, IllegalArgumentException, IllegalStateException - { - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - - // In general sending actions is only allowed while connected, though - // there are a few exceptions, these are handled here: - if ((state == CONNECTING || state == RECONNECTING) - && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) - { - // when (re-)connecting challenge and login actions are ok. - } // NOPMD - else if (state == DISCONNECTING && action instanceof LogoffAction) - { - // when disconnecting logoff action is ok. - } // NOPMD - else if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED, but connection is in state " + state); - } - - if (socket == null) - { - throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); - } - - internalActionId = createInternalActionId(); - - // if the callbackHandler is null the user is obviously not interested - // in the response, thats fine. - if (callback != null) - { - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, callback); - } - } - - Class responseClass = getExpectedResponseClass(action.getClass()); - if (responseClass != null) - { - reader.expectResponseClass(internalActionId, responseClass); - } - - writer.sendAction(action, internalActionId); - } - - boolean isShowVersionCommandAction(ManagerAction action) - { - if (! (action instanceof CommandAction)) { - return false; - } - final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction) action).getCommand()); - return showVersionMatcher.matches(); - } - - private Class getExpectedResponseClass(Class actionClass) - { - final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); - if (annotation == null) - { - return null; - } - - return annotation.value(); - } + { + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + + // In general sending actions is only allowed while connected, though + // there are a few exceptions, these are handled here: + if ((state == CONNECTING || state == RECONNECTING) + && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) + { + // when (re-)connecting challenge and login actions are ok. + } // NOPMD + else if (state == DISCONNECTING && action instanceof LogoffAction) + { + // when disconnecting logoff action is ok. + } // NOPMD + else if (state != CONNECTED) + { + throw new IllegalStateException("Actions may only be sent when in state " + + "CONNECTED, but connection is in state " + state); + } + + if (socket == null) + { + throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); + } + + internalActionId = createInternalActionId(); + + // if the callbackHandler is null the user is obviously not interested + // in the response, thats fine. + if (callback != null) + { + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, callback); + } + } + + Class< ? extends ManagerResponse> responseClass = getExpectedResponseClass(action.getClass()); + if (responseClass != null) + { + reader.expectResponseClass(internalActionId, responseClass); + } + + writer.sendAction(action, internalActionId); + } + + boolean isShowVersionCommandAction(ManagerAction action) + { + if (!(action instanceof CommandAction)) + { + return false; + } + final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction) action).getCommand()); + return showVersionMatcher.matches(); + } + + private Class< ? extends ManagerResponse> getExpectedResponseClass(Class< ? extends ManagerAction> actionClass) + { + final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); + if (annotation == null) + { + return null; + } + + return annotation.value(); + } public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws IOException, EventTimeoutException, IllegalArgumentException, IllegalStateException - { - return sendEventGeneratingAction(action, defaultEventTimeout); - } - - /* - * Implements synchronous sending of event generating actions. - */ - public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, - EventTimeoutException, IllegalArgumentException, IllegalStateException - { - final ResponseEventsImpl responseEvents; - final ResponseEventHandler responseEventHandler; - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - else if (action.getActionCompleteEventClass() == null) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " - + action.getClass().getName() + " is null."); - } - else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" - + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() - + " is not a ResponseEvent."); - } - - if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED but connection is in state " + state); - } - - responseEvents = new ResponseEventsImpl(); - responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); - - internalActionId = createInternalActionId(); - - try - { - // register response handler... - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, responseEventHandler); - } - - // ...and event handler. - synchronized (this.responseEventListeners) - { - this.responseEventListeners.put(internalActionId, responseEventHandler); - } - - synchronized (responseEvents) - { - writer.sendAction(action, internalActionId); - // only wait if response has not yet arrived. - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - try - { - responseEvents.wait(timeout); - } - catch (InterruptedException e) - { - logger.warn("Interrupted while waiting for response events."); - Thread.currentThread().interrupt(); - } - } - } - - // still no response or not all events received and timed out? - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - throw new EventTimeoutException("Timeout waiting for response or response events to " - + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), - responseEvents); - } - - } - finally - { - // remove the event handler - synchronized (this.responseEventListeners) - { - this.responseEventListeners.remove(internalActionId); - } - - - // Note: The response handler should have already been removed - // when the response was received, however we remove it here - // just in case it was never received. - synchronized (this.responseListeners) - { - this.responseListeners.remove(internalActionId); - } - - } - - return responseEvents; - } - - /** - * Creates a new unique internal action id based on the hash code of this - * connection and a sequence. - * - * @return a new internal action id - * @see ManagerUtil#addInternalActionId(String,String) - * @see ManagerUtil#getInternalActionId(String) - * @see ManagerUtil#stripInternalActionId(String) - */ - private String createInternalActionId() - { - final StringBuffer sb; - - sb = new StringBuffer(); - sb.append(this.hashCode()); - sb.append("_"); - sb.append(actionIdCounter.getAndIncrement()); - - return sb.toString(); - } - - public void addEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - // only add it if its not already there - if (!this.eventListeners.contains(listener)) - { - this.eventListeners.add(listener); - } - } - } - - public void removeEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - if (this.eventListeners.contains(listener)) - { - this.eventListeners.remove(listener); - } - } - } - - public String getProtocolIdentifier() - { - return protocolIdentifier.value; - } - - public ManagerConnectionState getState() - { - return state; - } - - /* Implementation of Dispatcher: callbacks for ManagerReader */ - - /** - * This method is called by the reader whenever a {@link ManagerResponse} is - * received. The response is dispatched to the associated - * {@link SendActionCallback}. - * + { + return sendEventGeneratingAction(action, defaultEventTimeout); + } + + /* + * Implements synchronous sending of event generating actions. + */ + public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, + EventTimeoutException, IllegalArgumentException, IllegalStateException + { + final ResponseEventsImpl responseEvents; + final ResponseEventHandler responseEventHandler; + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + else if (action.getActionCompleteEventClass() == null) + { + throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " + + action.getClass().getName() + " is null."); + } + else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) + { + throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" + + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() + + " is not a ResponseEvent."); + } + + if (state != CONNECTED) + { + throw new IllegalStateException("Actions may only be sent when in state " + + "CONNECTED but connection is in state " + state); + } + + responseEvents = new ResponseEventsImpl(); + responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); + + internalActionId = createInternalActionId(); + + try + { + // register response handler... + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, responseEventHandler); + } + + // ...and event handler. + synchronized (this.responseEventListeners) + { + this.responseEventListeners.put(internalActionId, responseEventHandler); + } + + synchronized (responseEvents) + { + writer.sendAction(action, internalActionId); + // only wait if response has not yet arrived. + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + try + { + responseEvents.wait(timeout); + } + catch (InterruptedException e) + { + logger.warn("Interrupted while waiting for response events."); + Thread.currentThread().interrupt(); + } + } + } + + // still no response or not all events received and timed out? + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + throw new EventTimeoutException("Timeout waiting for response or response events to " + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), responseEvents); + } + + } + finally + { + // remove the event handler + synchronized (this.responseEventListeners) + { + this.responseEventListeners.remove(internalActionId); + } + + // Note: The response handler should have already been removed + // when the response was received, however we remove it here + // just in case it was never received. + synchronized (this.responseListeners) + { + this.responseListeners.remove(internalActionId); + } + + } + + return responseEvents; + } + + /** + * Creates a new unique internal action id based on the hash code of this + * connection and a sequence. + * + * @return a new internal action id + * @see ManagerUtil#addInternalActionId(String,String) + * @see ManagerUtil#getInternalActionId(String) + * @see ManagerUtil#stripInternalActionId(String) + */ + private String createInternalActionId() + { + final StringBuffer sb; + + sb = new StringBuffer(); + sb.append(this.hashCode()); + sb.append("_"); + sb.append(actionIdCounter.getAndIncrement()); + + return sb.toString(); + } + + public void addEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + // only add it if its not already there + if (!this.eventListeners.contains(listener)) + { + this.eventListeners.add(listener); + } + } + } + + public void removeEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + if (this.eventListeners.contains(listener)) + { + this.eventListeners.remove(listener); + } + } + } + + public String getProtocolIdentifier() + { + return protocolIdentifier.value; + } + + public ManagerConnectionState getState() + { + return state; + } + + /* Implementation of Dispatcher: callbacks for ManagerReader */ + + /** + * This method is called by the reader whenever a {@link ManagerResponse} is + * received. The response is dispatched to the associated + * {@link SendActionCallback}. + * * @param response the response received by the reader - * @see ManagerReader - */ - public void dispatchResponse(ManagerResponse response) - { - final String actionId; - String internalActionId; - SendActionCallback listener; - - // shouldn't happen - if (response == null) - { - logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); - return; - } - - actionId = response.getActionId(); - internalActionId = null; - listener = null; - - if (actionId != null) - { - internalActionId = ManagerUtil.getInternalActionId(actionId); - response.setActionId(ManagerUtil.stripInternalActionId(actionId)); - } - - logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); - - if (internalActionId != null) - { - synchronized (this.responseListeners) - { - listener = responseListeners.get(internalActionId); - if (listener != null) - { - this.responseListeners.remove(internalActionId); - } - else - { - // when using the async sendAction it's ok not to register a - // callback so if we don't find a response handler thats ok - logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); - } - } - } - else - { + * @see ManagerReader + */ + public void dispatchResponse(ManagerResponse response) + { + final String actionId; + String internalActionId; + SendActionCallback listener; + + // shouldn't happen + if (response == null) + { + logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); + return; + } + + actionId = response.getActionId(); + internalActionId = null; + listener = null; + + if (actionId != null) + { + internalActionId = ManagerUtil.getInternalActionId(actionId); + response.setActionId(ManagerUtil.stripInternalActionId(actionId)); + } + + logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); + + if (internalActionId != null) + { + synchronized (this.responseListeners) + { + listener = responseListeners.get(internalActionId); + if (listener != null) + { + this.responseListeners.remove(internalActionId); + } + else + { + // when using the async sendAction it's ok not to register a + // callback so if we don't find a response handler thats ok + logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); + } + } + } + else + { logger.error("Unable to retrieve internalActionId from response: " + "actionId '" + actionId + "':\n" + response); - } - - if (listener != null) - { - try - { - listener.onResponse(response); - } - catch (Exception e) - { - logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); - } - } - } - - /** - * This method is called by the reader whenever a ManagerEvent is received. - * The event is dispatched to all registered ManagerEventHandlers. - * + } + + if (listener != null) + { + try + { + listener.onResponse(response); + } + catch (Exception e) + { + logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); + } + } + } + + /** + * This method is called by the reader whenever a ManagerEvent is received. + * The event is dispatched to all registered ManagerEventHandlers. + * * @param event the event received by the reader - * @see #addEventListener(ManagerEventListener) - * @see #removeEventListener(ManagerEventListener) - * @see ManagerReader - */ - public void dispatchEvent(ManagerEvent event) - { - // shouldn't happen - if (event == null) - { - logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); - return; - } + * @see #addEventListener(ManagerEventListener) + * @see #removeEventListener(ManagerEventListener) + * @see ManagerReader + */ + public void dispatchEvent(ManagerEvent event) + { + // shouldn't happen + if (event == null) + { + logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); + return; + } dispatchLegacyEventIfNeeded(event); - logger.debug("Dispatching event:\n" + event.toString()); - - // Some events need special treatment besides forwarding them to the - // registered eventListeners (clients) - // These events are handled here at first: - - // Dispatch ResponseEvents to the appropriate responseEventListener - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - String internalActionId; - - responseEvent = (ResponseEvent) event; - internalActionId = responseEvent.getInternalActionId(); - if (internalActionId != null) - { - synchronized (responseEventListeners) - { - ManagerEventListener listener; - - listener = responseEventListeners.get(internalActionId); - if (listener != null) - { - try - { - listener.onManagerEvent(event); - } - catch (Exception e) - { + logger.debug("Dispatching event:\n" + event.toString()); + + // Some events need special treatment besides forwarding them to the + // registered eventListeners (clients) + // These events are handled here at first: + + // Dispatch ResponseEvents to the appropriate responseEventListener + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + String internalActionId; + + responseEvent = (ResponseEvent) event; + internalActionId = responseEvent.getInternalActionId(); + if (internalActionId != null) + { + synchronized (responseEventListeners) + { + ManagerEventListener listener; + + listener = responseEventListeners.get(internalActionId); + if (listener != null) + { + try + { + listener.onManagerEvent(event); + } + catch (Exception e) + { logger.warn("Unexpected exception in response event listener " + listener.getClass().getName(), e); - } - } - } - } - else - { - // ResponseEvent without internalActionId: - // this happens if the same event class is used as response - // event - // and as an event that is not triggered by a Manager command - // Example: QueueMemberStatusEvent. - // logger.debug("ResponseEvent without " - // + "internalActionId:\n" + responseEvent); - } // NOPMD - } - if (event instanceof DisconnectEvent) - { - // When we receive get disconnected while we are connected start - // a new reconnect thread and set the state to RECONNECTING. - if (state == CONNECTED) - { - state = RECONNECTING; - // close socket if still open and remove reference to - // readerThread - // After sending the DisconnectThread that thread will die - // anyway. - cleanup(); - Thread reconnectThread = new Thread(new Runnable() - { - public void run() - { - reconnect(); - } - }); - reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" - + reconnectThreadCounter.getAndIncrement()); - reconnectThread.setDaemon(true); - reconnectThread.start(); - // now the DisconnectEvent is dispatched to registered - // eventListeners - // (clients) and after that the ManagerReaderThread is gone. - // So effectively we replaced the reader thread by a - // ReconnectThread. - } - else - { - // when we receive a DisconnectEvent while not connected we - // ignore it and do not send it to clients - return; - } - } - if (event instanceof ProtocolIdentifierReceivedEvent) - { - ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; - String protocolIdentifier; - - protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; - protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); - setProtocolIdentifier(protocolIdentifier); - // no need to send this event to clients - return; - } - - fireEvent(event); - } - - /** - * Enro 2015-03 - * Workaround to continue having Legacy Events from Asterisk 13. + } + } + } + } + else + { + // ResponseEvent without internalActionId: + // this happens if the same event class is used as response + // event + // and as an event that is not triggered by a Manager command + // Example: QueueMemberStatusEvent. + // logger.debug("ResponseEvent without " + // + "internalActionId:\n" + responseEvent); + } // NOPMD + } + if (event instanceof DisconnectEvent) + { + // When we receive get disconnected while we are connected start + // a new reconnect thread and set the state to RECONNECTING. + if (state == CONNECTED) + { + state = RECONNECTING; + // close socket if still open and remove reference to + // readerThread + // After sending the DisconnectThread that thread will die + // anyway. + cleanup(); + Thread reconnectThread = new Thread(new Runnable() + { + public void run() + { + reconnect(); + } + }); + reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" + + reconnectThreadCounter.getAndIncrement()); + reconnectThread.setDaemon(true); + reconnectThread.start(); + // now the DisconnectEvent is dispatched to registered + // eventListeners + // (clients) and after that the ManagerReaderThread is gone. + // So effectively we replaced the reader thread by a + // ReconnectThread. + } + else + { + // when we receive a DisconnectEvent while not connected we + // ignore it and do not send it to clients + return; + } + } + if (event instanceof ProtocolIdentifierReceivedEvent) + { + ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; + String protocolIdentifier; + + protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; + protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); + setProtocolIdentifier(protocolIdentifier); + // no need to send this event to clients + return; + } + + fireEvent(event); + } + + /** + * Enro 2015-03 Workaround to continue having Legacy Events from Asterisk + * 13. */ - private void dispatchLegacyEventIfNeeded(ManagerEvent event) { - if (event instanceof DialBeginEvent){ - DialEvent legacyEvent = (new DialEvent((DialBeginEvent) event)); - dispatchEvent(legacyEvent); - } - } - - /** - * Notifies all {@link ManagerEventListener}s registered by users. - * + private void dispatchLegacyEventIfNeeded(ManagerEvent event) + { + if (event instanceof DialBeginEvent) + { + DialEvent legacyEvent = (new DialEvent((DialBeginEvent) event)); + dispatchEvent(legacyEvent); + } + } + + /** + * Notifies all {@link ManagerEventListener}s registered by users. + * * @param event the event to propagate - */ - private void fireEvent(ManagerEvent event) - { - synchronized (eventListeners) - { - for (ManagerEventListener listener : eventListeners) - { - try - { - listener.onManagerEvent(event); - } - catch (RuntimeException e) - { - logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); - } - } - } - } - - /** - * This method is called when a {@link ProtocolIdentifierReceivedEvent} is - * received from the reader. Having received a correct protocol identifier - * is the precodition for logging in. - * + */ + private void fireEvent(ManagerEvent event) + { + synchronized (eventListeners) + { + for (ManagerEventListener listener : eventListeners) + { + try + { + listener.onManagerEvent(event); + } + catch (RuntimeException e) + { + logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); + } + } + } + } + + /** + * This method is called when a {@link ProtocolIdentifierReceivedEvent} is + * received from the reader. Having received a correct protocol identifier + * is the precodition for logging in. + * * @param identifier the protocol version used by the Asterisk server. - */ - private void setProtocolIdentifier(final String identifier) - { - logger.info("Connected via " + identifier); - - if (!"Asterisk Call Manager/1.0".equals(identifier) - && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk 1.6 - && !"Asterisk Call Manager/1.2".equals(identifier) // bri stuffed - && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk 11 - && !"Asterisk Call Manager/2.6.0".equals(identifier) // Asterisk 13 - && !"Asterisk Call Manager/2.7.0".equals(identifier) // Asterisk 13.2 - && !"OpenPBX Call Manager/1.0".equals(identifier) - && !"CallWeaver Call Manager/1.0".equals(identifier) - && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) - { - logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); - } - - synchronized (protocolIdentifier) - { - protocolIdentifier.value = identifier; - protocolIdentifier.notifyAll(); - } - } - - /** - * Reconnects to the asterisk server when the connection is lost. - *
- * While keepAlive is true we will try to reconnect. - * Reconnection attempts will be stopped when the {@link #logoff()} method - * is called or when the login after a successful reconnect results in an - * {@link AuthenticationFailedException} suggesting that the manager - * credentials have changed and keepAliveAfterAuthenticationFailure is not - * set. - *
- * This method is called when a {@link DisconnectEvent} is received from the - * reader. - */ - private void reconnect() - { - int numTries; - - // try to reconnect - numTries = 0; - while (state == RECONNECTING) - { - try - { - if (numTries < 10) - { - // try to reconnect quite fast for the firt 10 times - // this succeeds if the server has just been restarted - Thread.sleep(RECONNECTION_INTERVAL_1); - } - else - { - // slow down after 10 unsuccessful attempts asuming a - // shutdown of the server - Thread.sleep(RECONNECTION_INTERVAL_2); - } - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - } - - try - { - connect(); - - try - { - doLogin(defaultResponseTimeout, eventMask); - logger.info("Successfully reconnected."); - // everything is ok again, so we leave - // when successful doLogin set the state to CONNECTED so no - // need to adjust it - break; - } - catch (AuthenticationFailedException e1) - { - if (keepAliveAfterAuthenticationFailure) - { - logger.error("Unable to log in after reconnect: " + e1.getMessage()); - } - else - { - logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); - state = DISCONNECTED; - } - } - catch (TimeoutException e1) - { - // shouldn't happen - but happens! - logger.error("TimeoutException while trying to log in " + "after reconnect."); - } - } - catch (IOException e) - { - // server seems to be still down, just continue to attempt - // reconnection - logger.warn("Exception while trying to reconnect: " + e.getMessage()); - } - numTries++; - } - } - - private void cleanup() - { - disconnect(); - this.readerThread = null; - } - - @Override - public String toString() - { - StringBuffer sb; - - sb = new StringBuffer("ManagerConnection["); - sb.append("id='").append(id).append("',"); - sb.append("hostname='").append(hostname).append("',"); - sb.append("port=").append(port).append(","); - sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); - - return sb.toString(); - } - - /* Helper classes */ - - /** - * A simple data object to store a ManagerResult. - */ - private static class ResponseHandlerResult implements Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 7831097958568769220L; - private ManagerResponse response; - - public ResponseHandlerResult() - { - } - - public ManagerResponse getResponse() - { - return this.response; - } - - public void setResponse(ManagerResponse response) - { - this.response = response; - } - } - - /** - * A simple response handler that stores the received response in a - * ResponseHandlerResult for further processing. - */ - private static class DefaultSendActionCallback implements SendActionCallback, Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 2926598671855316803L; - private final ResponseHandlerResult result; - - /** - * Creates a new instance. - * + */ + private void setProtocolIdentifier(final String identifier) + { + logger.info("Connected via " + identifier); + + if (!"Asterisk Call Manager/1.0".equals(identifier) + && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk + // 1.6 + && !"Asterisk Call Manager/1.2".equals(identifier) // bri + // stuffed + && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk + // 11 + && !"Asterisk Call Manager/2.6.0".equals(identifier) // Asterisk + // 13 + && !"Asterisk Call Manager/2.7.0".equals(identifier) // Asterisk + // 13.2 + && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) + && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) + { + logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); + } + + synchronized (protocolIdentifier) + { + protocolIdentifier.value = identifier; + protocolIdentifier.notifyAll(); + } + } + + /** + * Reconnects to the asterisk server when the connection is lost.
+ * While keepAlive is true we will try to reconnect. + * Reconnection attempts will be stopped when the {@link #logoff()} method + * is called or when the login after a successful reconnect results in an + * {@link AuthenticationFailedException} suggesting that the manager + * credentials have changed and keepAliveAfterAuthenticationFailure is not + * set.
+ * This method is called when a {@link DisconnectEvent} is received from the + * reader. + */ + private void reconnect() + { + int numTries; + + // try to reconnect + numTries = 0; + while (state == RECONNECTING) + { + try + { + if (numTries < 10) + { + // try to reconnect quite fast for the firt 10 times + // this succeeds if the server has just been restarted + Thread.sleep(RECONNECTION_INTERVAL_1); + } + else + { + // slow down after 10 unsuccessful attempts asuming a + // shutdown of the server + Thread.sleep(RECONNECTION_INTERVAL_2); + } + } + catch (InterruptedException e) + { + Thread.currentThread().interrupt(); + } + + try + { + connect(); + + try + { + doLogin(defaultResponseTimeout, eventMask); + logger.info("Successfully reconnected."); + // everything is ok again, so we leave + // when successful doLogin set the state to CONNECTED so no + // need to adjust it + break; + } + catch (AuthenticationFailedException e1) + { + if (keepAliveAfterAuthenticationFailure) + { + logger.error("Unable to log in after reconnect: " + e1.getMessage()); + } + else + { + logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); + state = DISCONNECTED; + } + } + catch (TimeoutException e1) + { + // shouldn't happen - but happens! + logger.error("TimeoutException while trying to log in " + "after reconnect."); + } + } + catch (IOException e) + { + // server seems to be still down, just continue to attempt + // reconnection + logger.warn("Exception while trying to reconnect: " + e.getMessage()); + } + numTries++; + } + } + + private void cleanup() + { + disconnect(); + this.readerThread = null; + } + + @Override + public String toString() + { + StringBuffer sb; + + sb = new StringBuffer("ManagerConnection["); + sb.append("id='").append(id).append("',"); + sb.append("hostname='").append(hostname).append("',"); + sb.append("port=").append(port).append(","); + sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); + + return sb.toString(); + } + + /* Helper classes */ + + /** + * A simple data object to store a ManagerResult. + */ + private static class ResponseHandlerResult implements Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 7831097958568769220L; + private ManagerResponse response; + + public ResponseHandlerResult() + { + } + + public ManagerResponse getResponse() + { + return this.response; + } + + public void setResponse(ManagerResponse response) + { + this.response = response; + } + } + + /** + * A simple response handler that stores the received response in a + * ResponseHandlerResult for further processing. + */ + private static class DefaultSendActionCallback implements SendActionCallback, Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 2926598671855316803L; + private final ResponseHandlerResult result; + + /** + * Creates a new instance. + * * @param result the result to store the response in - */ - public DefaultSendActionCallback(ResponseHandlerResult result) - { - this.result = result; - } - - public void onResponse(ManagerResponse response) - { - synchronized (result) - { - result.setResponse(response); - result.notifyAll(); - } - } - } - - /** - * A combinded event and response handler that adds received events and the - * response to a ResponseEvents object. - */ - private static class ResponseEventHandler implements ManagerEventListener, SendActionCallback - { - private final ResponseEventsImpl events; - private final Class actionCompleteEventClass; - - /** - * Creates a new instance. - * - * @param events the ResponseEventsImpl to store the events in + */ + public DefaultSendActionCallback(ResponseHandlerResult result) + { + this.result = result; + } + + public void onResponse(ManagerResponse response) + { + synchronized (result) + { + result.setResponse(response); + result.notifyAll(); + } + } + } + + /** + * A combinded event and response handler that adds received events and the + * response to a ResponseEvents object. + */ + private static class ResponseEventHandler implements ManagerEventListener, SendActionCallback + { + private final ResponseEventsImpl events; + private final Class< ? > actionCompleteEventClass; + + /** + * Creates a new instance. + * + * @param events the ResponseEventsImpl to store the events in * @param actionCompleteEventClass the type of event that indicates that - * all events have been received - */ - public ResponseEventHandler(ResponseEventsImpl events, Class actionCompleteEventClass) - { - this.events = events; - this.actionCompleteEventClass = actionCompleteEventClass; - } - - public void onManagerEvent(ManagerEvent event) - { - synchronized (events) - { - // should always be a ResponseEvent, anyway... - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - - responseEvent = (ResponseEvent) event; - events.addEvent(responseEvent); - } - - // finished? - if (actionCompleteEventClass.isAssignableFrom(event.getClass())) - { - events.setComplete(true); - // notify if action complete event and response have been - // received - if (events.getResponse() != null) - { - events.notifyAll(); - } - } - } - } - - public void onResponse(ManagerResponse response) - { - synchronized (events) - { - events.setRepsonse(response); - if (response instanceof ManagerError) - { - events.setComplete(true); - } - - // finished? - // notify if action complete event and response have been - // received - if (events.isComplete()) - { - events.notifyAll(); - } - } - } - } - - private static class ProtocolIdentifierWrapper - { - String value; - } + * all events have been received + */ + public ResponseEventHandler(ResponseEventsImpl events, Class< ? > actionCompleteEventClass) + { + this.events = events; + this.actionCompleteEventClass = actionCompleteEventClass; + } + + public void onManagerEvent(ManagerEvent event) + { + synchronized (events) + { + // should always be a ResponseEvent, anyway... + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + + responseEvent = (ResponseEvent) event; + events.addEvent(responseEvent); + } + + // finished? + if (actionCompleteEventClass.isAssignableFrom(event.getClass())) + { + events.setComplete(true); + // notify if action complete event and response have been + // received + if (events.getResponse() != null) + { + events.notifyAll(); + } + } + } + } + + public void onResponse(ManagerResponse response) + { + synchronized (events) + { + events.setRepsonse(response); + if (response instanceof ManagerError) + { + events.setComplete(true); + } + + // finished? + // notify if action complete event and response have been + // received + if (events.isComplete()) + { + events.notifyAll(); + } + } + } + } + + private static class ProtocolIdentifierWrapper + { + String value; + } } From 733cc2a27d275babf0ed3a3dd8647dfe0f830a00 Mon Sep 17 00:00:00 2001 From: Jirka Hlavacek Date: Wed, 20 May 2015 09:53:55 +0200 Subject: [PATCH 0146/1055] Fix race condition causing an IndexOutOfBoundsException --- .../live/internal/AsteriskChannelImpl.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index ab4011cef..7c50555af 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -1025,17 +1025,16 @@ public String toString() sb.append("id='").append(dialingChannel.get(0).getId()).append("',"); sb.append("name='").append(dialingChannel.get(0).getName()).append("'],"); } - if (linkedChannel.isEmpty()) + synchronized (linkedChannel) { - sb.append("linkedChannel=null"); - } - else - { - sb.append("linkedChannel=AsteriskChannel["); - synchronized (linkedChannel) - { - sb.append("id='").append(linkedChannel.get(0).getId()).append("',"); - sb.append("name='").append(linkedChannel.get(0).getName()).append("']"); + if (linkedChannel.isEmpty()) { + sb.append("linkedChannel=null"); + } else { + sb.append("linkedChannel=AsteriskChannel["); + { + sb.append("id='").append(linkedChannel.get(0).getId()).append("',"); + sb.append("name='").append(linkedChannel.get(0).getName()).append("']"); + } } } sb.append("]"); From 6c2aafa486e7a000e7a9833b5b4dfab640c362d6 Mon Sep 17 00:00:00 2001 From: Jirka Hlavacek Date: Thu, 21 May 2015 15:26:17 +0200 Subject: [PATCH 0147/1055] Apply project's codestyle --- .../live/internal/AsteriskChannelImpl.java | 233 +++++++++--------- 1 file changed, 118 insertions(+), 115 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index 7c50555af..dace0dabd 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -56,107 +56,85 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel { private static final String CAUSE_VARIABLE_NAME = "PRI_CAUSE"; - + /** + * Date this channel has been created. + */ + private final Date dateOfCreation; + private final List extensionHistory; + private final List stateHistory; + private final List linkedChannelHistory; + private final List dialedChannelHistory; + private final List dialedChannels; + private final List dialingChannels; + /** + * If this channel is bridged to another channel, the linkedChannels contains + * the channel this channel is bridged with. + */ + private final List linkedChannels; + private final Map variables; /** * Unique id of this channel. */ private String id; - /** * The traceId is used to trace originated channels. */ private String traceId; - - /** - * Date this channel has been created. - */ - private final Date dateOfCreation; - /** * Date this channel has left the Asterisk server. */ private Date dateOfRemoval; - /** * Name of this channel. */ private String name; - /** * Caller*ID of this channel. */ private CallerId callerId; - /** * State of this channel. */ private ChannelState state; - /** * Account code used to bill this channel. */ private String account; - private final List extensionHistory; - private final List stateHistory; - private final List linkedChannelHistory; - private final List dialedChannelHistory; - - private final List dialedChannels; - - private final List dialingChannels; - - /** - * If this channel is bridged to another channel, the linkedChannels contains - the channel this channel is bridged with. - */ - private final List linkedChannels; - /** * Indicates if this channel was linked to another channel at least once. */ private boolean wasLinked; - private HangupCause hangupCause; - private String hangupCauseText; - private CallDetailRecordImpl callDetailRecord; - /** * MeetMe room user associated with this channel if any, null * otherwise. */ private MeetMeUserImpl meetMeUserImpl; - /** * Queue entry associated with this channel if any, null * otherwise. */ private AsteriskQueueEntryImpl queueEntryImpl; - /** * Extension where the call is parked if it is parked, null * otherwise. */ private Extension parkedAt; - /** * Last dtmf digit recieved on this channel if any, null otherwise. */ private Character dtmfReceived; - /** * Last dtmf digit sent on this channel if any, null otherwise. */ private Character dtmfSent; - /** * Actual monitor state */ private boolean isMonitored; - private final Map variables; - /** * Creates a new Channel. * @@ -185,7 +163,8 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel } if (dateOfCreation == null) { - throw new IllegalArgumentException("Parameter 'dateOfCreation' passed to AsteriskChannelImpl() must not be null."); + throw new IllegalArgumentException( + "Parameter 'dateOfCreation' passed to AsteriskChannelImpl() must not be null."); } this.name = name; @@ -472,14 +451,12 @@ synchronized void hungup(Date dateOfRemoval, HangupCause hangupCause, String han stateChanged(dateOfRemoval, ChannelState.HUNGUP); } - - /** * Retrives the conplete List of all dialed channels associated to ths calls - * + * * @return List of all dialed channels */ - public List getDialedChannels() + public List getDialedChannels() { final List copy; @@ -494,14 +471,17 @@ public List getDialedChannels() public AsteriskChannel getDialedChannel() { - synchronized(dialedChannels) { - for (AsteriskChannel channel:dialedChannels) { - if (channel != null) return channel; + synchronized (dialedChannels) + { + for (AsteriskChannel channel : dialedChannels) + { + if (channel != null) + return channel; } } return null; } - + public List getDialedChannelHistory() { final List copy; @@ -517,10 +497,13 @@ public List getDialedChannelHistory() synchronized void channelDialed(Date date, AsteriskChannel dialedChannel) { final AsteriskChannel oldDialedChannel; - synchronized(dialedChannels) { - if (dialedChannels.isEmpty()) oldDialedChannel = null; - else oldDialedChannel = dialedChannels.get(dialedChannels.size()-1); - dialedChannels.add(dialedChannel); + synchronized (dialedChannels) + { + if (dialedChannels.isEmpty()) + oldDialedChannel = null; + else + oldDialedChannel = dialedChannels.get(dialedChannels.size() - 1); + dialedChannels.add(dialedChannel); } final DialedChannelHistoryEntry historyEntry; @@ -534,26 +517,32 @@ synchronized void channelDialed(Date date, AsteriskChannel dialedChannel) } /* dialed channels */ - + public AsteriskChannel getDialingChannel() { - synchronized(dialingChannels) { - if (dialingChannels.isEmpty()) return null; - return dialingChannels.get(0); + synchronized (dialingChannels) + { + if (dialingChannels.isEmpty()) + return null; + return dialingChannels.get(0); } } synchronized void channelDialing(Date date, AsteriskChannel dialingChannel) { final AsteriskChannel oldDialingChannel; - synchronized(this.dialingChannels) { - if (this.dialingChannels.isEmpty()) { - oldDialingChannel = null; - this.dialingChannels.add(dialingChannel); - } else { - oldDialingChannel = this.dialingChannels.get(0); - this.dialingChannels.set(0, dialingChannel); - } + synchronized (this.dialingChannels) + { + if (this.dialingChannels.isEmpty()) + { + oldDialingChannel = null; + this.dialingChannels.add(dialingChannel); + } + else + { + oldDialingChannel = this.dialingChannels.get(0); + this.dialingChannels.set(0, dialingChannel); + } } firePropertyChange(PROPERTY_DIALING_CHANNEL, oldDialingChannel, dialingChannel); @@ -563,9 +552,11 @@ synchronized void channelDialing(Date date, AsteriskChannel dialingChannel) public AsteriskChannel getLinkedChannel() { - synchronized(linkedChannels) { - if (linkedChannels.isEmpty()) return null; - return linkedChannels.get(0); + synchronized (linkedChannels) + { + if (linkedChannels.isEmpty()) + return null; + return linkedChannels.get(0); } } @@ -595,15 +586,18 @@ public boolean wasLinked() synchronized void channelLinked(Date date, AsteriskChannel linkedChannel) { final AsteriskChannel oldLinkedChannel; - synchronized(this.linkedChannels) { - if (this.linkedChannels.isEmpty()) { - oldLinkedChannel = null; - this.linkedChannels.add(linkedChannel); - } - else { - oldLinkedChannel = this.linkedChannels.get(0); - this.linkedChannels.set(0, linkedChannel); - } + synchronized (this.linkedChannels) + { + if (this.linkedChannels.isEmpty()) + { + oldLinkedChannel = null; + this.linkedChannels.add(linkedChannel); + } + else + { + oldLinkedChannel = this.linkedChannels.get(0); + this.linkedChannels.set(0, linkedChannel); + } } final LinkedChannelHistoryEntry historyEntry; @@ -621,14 +615,17 @@ synchronized void channelUnlinked(Date date) { final AsteriskChannel oldLinkedChannel; - synchronized(this.linkedChannels) { - if (this.linkedChannels.isEmpty()) { - oldLinkedChannel = null; - } - else { - oldLinkedChannel = this.linkedChannels.get(0); - } - linkedChannels.clear(); + synchronized (this.linkedChannels) + { + if (this.linkedChannels.isEmpty()) + { + oldLinkedChannel = null; + } + else + { + oldLinkedChannel = this.linkedChannels.get(0); + } + linkedChannels.clear(); } final LinkedChannelHistoryEntry historyEntry; @@ -730,8 +727,9 @@ public void redirectBothLegs(String context, String exten, int priority) throws } else { - response = server.sendAction(new RedirectAction(name, linkedChannels.get(0).getName(), context, exten, priority, - context, exten, priority)); + response = server + .sendAction(new RedirectAction(name, linkedChannels.get(0).getName(), context, exten, priority, + context, exten, priority)); } if (response instanceof ManagerError) @@ -823,7 +821,8 @@ public void startMonitoring(String filename, String format, boolean mix) throws } } - public void changeMonitoring(String filename) throws ManagerCommunicationException, NoSuchChannelException, IllegalArgumentException + public void changeMonitoring(String filename) + throws ManagerCommunicationException, NoSuchChannelException, IllegalArgumentException { ManagerResponse response; @@ -872,30 +871,26 @@ public void unpauseMonitoring() throws ManagerCommunicationException, NoSuchChan } } - public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException { ManagerResponse response; - response = server.sendAction(new PauseMixMonitorAction(this.name,1,direction.getStateName())); - if (response instanceof ManagerError) { + response = server.sendAction(new PauseMixMonitorAction(this.name, 1, direction.getStateName())); + if (response instanceof ManagerError) + { throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); } } - public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException { ManagerResponse response; - response = server.sendAction(new PauseMixMonitorAction(this.name,0,direction.getStateName())); - if (response instanceof ManagerError) { + response = server.sendAction(new PauseMixMonitorAction(this.name, 0, direction.getStateName())); + if (response instanceof ManagerError) + { throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); } } - - - - - + public Extension getParkedAt() { // warning: the context of this extension will be null until we get the context property from @@ -903,6 +898,14 @@ public Extension getParkedAt() return parkedAt; } + void setParkedAt(Extension parkedAt) + { + final Extension oldParkedAt = this.parkedAt; + + this.parkedAt = parkedAt; + firePropertyChange(PROPERTY_PARKED_AT, oldParkedAt, parkedAt); + } + void updateVariable(String name, String value) { synchronized (variables) @@ -947,14 +950,6 @@ void dtmfSent(Character digit) firePropertyChange(PROPERTY_DTMF_SENT, oldDtmfSent, digit); } - void setParkedAt(Extension parkedAt) - { - final Extension oldParkedAt = this.parkedAt; - - this.parkedAt = parkedAt; - firePropertyChange(PROPERTY_PARKED_AT, oldParkedAt, parkedAt); - } - public AsteriskQueueEntryImpl getQueueEntry() { return queueEntryImpl; @@ -968,9 +963,13 @@ void setQueueEntry(AsteriskQueueEntryImpl queueEntry) firePropertyChange(PROPERTY_QUEUE_ENTRY, oldQueueEntry, queueEntry); } - public boolean isMonitored() {return this.isMonitored; } + public boolean isMonitored() + { + return this.isMonitored; + } - void setMonitored(boolean monitored) { + void setMonitored(boolean monitored) + { final boolean oldMonitored = this.isMonitored; this.isMonitored = monitored; @@ -981,9 +980,9 @@ void setMonitored(boolean monitored) { public String toString() { final StringBuffer sb; - final List dialedChannels; - final List dialingChannel; - final List linkedChannel; + final List dialedChannels; + final List dialingChannel; + final List linkedChannel; sb = new StringBuffer("AsteriskChannel["); @@ -1008,9 +1007,10 @@ public String toString() sb.append("dialedChannel=AsteriskChannel["); synchronized (dialedChannels) { - for (AsteriskChannel dialedChannel:dialedChannels) { - sb.append("[id='").append(dialedChannel.getId()).append("',"); - sb.append("name='").append(dialedChannel.getName()).append("'],"); + for (AsteriskChannel dialedChannel : dialedChannels) + { + sb.append("[id='").append(dialedChannel.getId()).append("',"); + sb.append("name='").append(dialedChannel.getName()).append("'],"); } sb.append("],"); } @@ -1027,9 +1027,12 @@ public String toString() } synchronized (linkedChannel) { - if (linkedChannel.isEmpty()) { + if (linkedChannel.isEmpty()) + { sb.append("linkedChannel=null"); - } else { + } + else + { sb.append("linkedChannel=AsteriskChannel["); { sb.append("id='").append(linkedChannel.get(0).getId()).append("',"); From 1cdae5b79c5adc9a7a486e74aeaffb35f1670d1b Mon Sep 17 00:00:00 2001 From: Jirka Hlavacek Date: Thu, 21 May 2015 15:29:11 +0200 Subject: [PATCH 0148/1055] Fix another race condition --- .../live/internal/AsteriskChannelImpl.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index dace0dabd..643ac706c 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -721,15 +721,18 @@ public void redirectBothLegs(String context, String exten, int priority) throws { ManagerResponse response; - if (linkedChannels.isEmpty()) - { - response = server.sendAction(new RedirectAction(name, context, exten, priority)); - } - else + synchronized (linkedChannels) { - response = server - .sendAction(new RedirectAction(name, linkedChannels.get(0).getName(), context, exten, priority, - context, exten, priority)); + if (linkedChannels.isEmpty()) + { + response = server.sendAction(new RedirectAction(name, context, exten, priority)); + } + else + { + response = server + .sendAction(new RedirectAction(name, linkedChannels.get(0).getName(), context, exten, priority, + context, exten, priority)); + } } if (response instanceof ManagerError) From a7480a1e7e439424a62ddaabbcf2dca9e2ba4062 Mon Sep 17 00:00:00 2001 From: Jirka Hlavacek Date: Thu, 21 May 2015 15:36:38 +0200 Subject: [PATCH 0149/1055] Fix version format --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4e989b95e..e1ef82638 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ org.asteriskjava asterisk-java Asterisk-Java - 2.0.0-CI.SNAPSHOT + 2.0.0.CI-SNAPSHOT The free Java library for Asterisk PBX integration. 2004 From 5b0c8ff22478468e731d110141d922954ee8ca81 Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Thu, 4 Jun 2015 12:19:12 +0300 Subject: [PATCH 0150/1055] -- fixed https://github.com/asterisk-java/asterisk-java/issues/53 --- .../manager/response/SipShowPeerResponse.java | 14 +++++++++++++- .../manager/response/SipShowPeerResponseTest.java | 9 +++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java b/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java index 38c1efb05..e3d0fa384 100644 --- a/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java +++ b/src/main/java/org/asteriskjava/manager/response/SipShowPeerResponse.java @@ -77,6 +77,7 @@ public class SipShowPeerResponse extends ManagerResponse private String sipForcerport; private String sipRtpEngine; private String sipComedia; + private String mohsuggest; private Map chanVariable; @@ -711,6 +712,15 @@ public String getSipComedia() { public void setSipComedia(String sipComedia) { this.sipComedia = sipComedia; } + + + public String getMohsuggest() { + return mohsuggest; + } + + public void setMohsuggest(String mohsuggest) { + this.mohsuggest = mohsuggest; + } @Override public String toString() { @@ -841,9 +851,11 @@ public String toString() { builder.append(sipComedia); builder.append(", chanVariable="); builder.append(chanVariable); + builder.append(", mohSuggest="); + builder.append(mohsuggest); builder.append("]"); return builder.toString(); } -} +} \ No newline at end of file diff --git a/src/test/java/org/asteriskjava/manager/response/SipShowPeerResponseTest.java b/src/test/java/org/asteriskjava/manager/response/SipShowPeerResponseTest.java index 4f9e4512c..9002a77b0 100644 --- a/src/test/java/org/asteriskjava/manager/response/SipShowPeerResponseTest.java +++ b/src/test/java/org/asteriskjava/manager/response/SipShowPeerResponseTest.java @@ -35,4 +35,13 @@ public void testSetQualifyFreqWithWorkaroundAndChanVariable() response.setQualifyFreq(": 60000 ms\nChanVariable:\n PHBX_ID,191"); assertEquals("Incorrect qualifyFreq", 60000, (int) response.getQualifyFreq()); } + + @Test + public void testSetMohsuggest() + { + response.setMohsuggest("default"); + assertEquals("Incorrect mohsuggest", "default",response.getMohsuggest()); + } + + } From 9ce89f264796df3d4f1df5dc78f912d3e8d02d1d Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Thu, 4 Jun 2015 16:38:07 +0300 Subject: [PATCH 0151/1055] -- fixed https://github.com/asterisk-java/asterisk-java/issues/56 --- .../java/org/asteriskjava/manager/internal/AbstractBuilder.java | 2 +- .../org/asteriskjava/manager/internal/EventBuilderImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java b/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java index cbdc844c3..efa242097 100644 --- a/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java +++ b/src/main/java/org/asteriskjava/manager/internal/AbstractBuilder.java @@ -78,7 +78,7 @@ else if ("class".equals(setterName)) if (setter == null && !(target instanceof UserEvent)) { logger.warn("Unable to set property '" + entry.getKey() + "' to '" + entry.getValue() + "' on " - + target.getClass().getName() + ": no setter. Please report at http://jira.reucon.org/browse/AJ"); + + target.getClass().getName() + ": no setter. Please report at https://github.com/asterisk-java/asterisk-java/issues"); } if (setter == null) diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index d0d6ae887..76a8a5c63 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -366,7 +366,7 @@ else if (value instanceof String && !"listitems".equals(key)) if (eventClass == null) { logger.info("No event class registered for event type '" + eventType + "', attributes: " + attributes - + ". Please report at http://jira.reucon.org/browse/AJ"); + + ". Please report at https://github.com/asterisk-java/asterisk-java/issues"); return null; } From 411ae28c7b791bd5219196d321c11286d99a1767 Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Thu, 4 Jun 2015 16:40:13 +0300 Subject: [PATCH 0152/1055] -- missed reference for https://github.com/asterisk-java/asterisk-java/issues/56 --- src/site/site.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/site/site.xml b/src/site/site.xml index 9ec365caa..c4d42660a 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -44,8 +44,7 @@ - + From cfb1ddd86785bc7630f93d664854bbee7938ad4a Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Mon, 8 Jun 2015 12:45:49 +0300 Subject: [PATCH 0153/1055] -- added a new LiveException that is raised when you try to pause a record for a call that has not been monitored (recorded). Previously the pauseMixMonitor() threw NoSuchChannelException which was not suitable in this case, more than that it was misleading. --- .../asteriskjava/live/MuteFlagException.java | 42 +++++++++++++++++++ .../live/internal/AsteriskChannelImpl.java | 15 +++---- 2 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/asteriskjava/live/MuteFlagException.java diff --git a/src/main/java/org/asteriskjava/live/MuteFlagException.java b/src/main/java/org/asteriskjava/live/MuteFlagException.java new file mode 100644 index 000000000..b280b405b --- /dev/null +++ b/src/main/java/org/asteriskjava/live/MuteFlagException.java @@ -0,0 +1,42 @@ +/* + * Copyright 2005-2006 Stefan Reuter + * + * Licensed 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.asteriskjava.live; + +/** + * Indicates that the mute flag cannot be applied for this channel. Most probably because channel is not monitored (recorded) + * + * @author videanuadrian + * @version $Id$ + */ +public class MuteFlagException extends LiveException +{ + /** + * Serial version identifier. + */ + + private static final long serialVersionUID = 7804327171239361017L; + + /** + * Creates a new instance with the given message. + * + * @param message the message + */ + public MuteFlagException(String message) + { + super(message); + } +} diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index ab4011cef..dd53b98f0 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -29,7 +29,9 @@ import org.asteriskjava.live.ExtensionHistoryEntry; import org.asteriskjava.live.HangupCause; import org.asteriskjava.live.LinkedChannelHistoryEntry; +import org.asteriskjava.live.LiveException; import org.asteriskjava.live.ManagerCommunicationException; +import org.asteriskjava.live.MuteFlagException; import org.asteriskjava.live.NoSuchChannelException; import org.asteriskjava.manager.action.AbsoluteTimeoutAction; import org.asteriskjava.manager.action.ChangeMonitorAction; @@ -873,29 +875,28 @@ public void unpauseMonitoring() throws ManagerCommunicationException, NoSuchChan } - public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException + public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, MuteFlagException { ManagerResponse response; response = server.sendAction(new PauseMixMonitorAction(this.name,1,direction.getStateName())); if (response instanceof ManagerError) { - throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); + if (response.getMessage().equals("Cannot set mute flag")) + throw new MuteFlagException(response.getMessage()+" on channel: '" + name); } } - public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException + public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, MuteFlagException { ManagerResponse response; response = server.sendAction(new PauseMixMonitorAction(this.name,0,direction.getStateName())); if (response instanceof ManagerError) { - throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); + if (response.getMessage().equals("Cannot set mute flag")) + throw new MuteFlagException(response.getMessage()+" on channel: '" + name); } } - - - public Extension getParkedAt() { // warning: the context of this extension will be null until we get the context property from From 6e1a02ab2498703c176c284d6696f8b4df446261 Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Tue, 9 Jun 2015 09:05:49 +0300 Subject: [PATCH 0154/1055] -- updated as per Brett comment: "Adrian, generally like the patch but I'm concerned about the terminology. The term 'mute' whilst somewhat applicable here, is also used to 'mute' a channel (i.e. set the channel so that one party can't hear) which has nothing to recording. I'm wondering of we should be more direct and create a 'recording' exception that is thrown for any circumstance when there is a problem starting/stopping/pausing/resuming recordings? " --- ...{MuteFlagException.java => RecordingException.java} | 6 +++--- .../live/internal/AsteriskChannelImpl.java | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) rename src/main/java/org/asteriskjava/live/{MuteFlagException.java => RecordingException.java} (81%) diff --git a/src/main/java/org/asteriskjava/live/MuteFlagException.java b/src/main/java/org/asteriskjava/live/RecordingException.java similarity index 81% rename from src/main/java/org/asteriskjava/live/MuteFlagException.java rename to src/main/java/org/asteriskjava/live/RecordingException.java index b280b405b..48bd265b8 100644 --- a/src/main/java/org/asteriskjava/live/MuteFlagException.java +++ b/src/main/java/org/asteriskjava/live/RecordingException.java @@ -17,12 +17,12 @@ package org.asteriskjava.live; /** - * Indicates that the mute flag cannot be applied for this channel. Most probably because channel is not monitored (recorded) + * Indicates that a record related issue has occured, * * @author videanuadrian * @version $Id$ */ -public class MuteFlagException extends LiveException +public class RecordingException extends LiveException { /** * Serial version identifier. @@ -35,7 +35,7 @@ public class MuteFlagException extends LiveException * * @param message the message */ - public MuteFlagException(String message) + public RecordingException(String message) { super(message); } diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index dd53b98f0..171ab2187 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -31,7 +31,7 @@ import org.asteriskjava.live.LinkedChannelHistoryEntry; import org.asteriskjava.live.LiveException; import org.asteriskjava.live.ManagerCommunicationException; -import org.asteriskjava.live.MuteFlagException; +import org.asteriskjava.live.RecordingException; import org.asteriskjava.live.NoSuchChannelException; import org.asteriskjava.manager.action.AbsoluteTimeoutAction; import org.asteriskjava.manager.action.ChangeMonitorAction; @@ -875,24 +875,24 @@ public void unpauseMonitoring() throws ManagerCommunicationException, NoSuchChan } - public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, MuteFlagException + public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, RecordingException { ManagerResponse response; response = server.sendAction(new PauseMixMonitorAction(this.name,1,direction.getStateName())); if (response instanceof ManagerError) { if (response.getMessage().equals("Cannot set mute flag")) - throw new MuteFlagException(response.getMessage()+" on channel: '" + name); + throw new RecordingException(response.getMessage()+" on channel: '" + name); } } - public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, MuteFlagException + public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, RecordingException { ManagerResponse response; response = server.sendAction(new PauseMixMonitorAction(this.name,0,direction.getStateName())); if (response instanceof ManagerError) { if (response.getMessage().equals("Cannot set mute flag")) - throw new MuteFlagException(response.getMessage()+" on channel: '" + name); + throw new RecordingException(response.getMessage()+" on channel: '" + name); } } From a8dec9246507a7ae79c5ba5913642ca005400fcc Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Tue, 9 Jun 2015 09:08:35 +0300 Subject: [PATCH 0155/1055] -- fix comment at RecordingException --- src/main/java/org/asteriskjava/live/RecordingException.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/live/RecordingException.java b/src/main/java/org/asteriskjava/live/RecordingException.java index 48bd265b8..d12dfdcbf 100644 --- a/src/main/java/org/asteriskjava/live/RecordingException.java +++ b/src/main/java/org/asteriskjava/live/RecordingException.java @@ -17,7 +17,7 @@ package org.asteriskjava.live; /** - * Indicates that a record related issue has occured, + * Indicates that a record operation related issue has occured, * * @author videanuadrian * @version $Id$ From 5b49dbf35bc64435289c22412a958867040b7459 Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Wed, 10 Jun 2015 08:13:32 +0300 Subject: [PATCH 0156/1055] -- added NoSuchChannelException at pause/unpause Monitor. --- .../live/internal/AsteriskChannelImpl.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index 171ab2187..f00d51619 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -880,8 +880,12 @@ public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommuni ManagerResponse response; response = server.sendAction(new PauseMixMonitorAction(this.name,1,direction.getStateName())); if (response instanceof ManagerError) { - if (response.getMessage().equals("Cannot set mute flag")) - throw new RecordingException(response.getMessage()+" on channel: '" + name); + if (response.getMessage().equals("Cannot set mute flag")){ + throw new RecordingException(response.getMessage()+" on channel: '" + name); + } + else{ + throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); + } } } @@ -891,8 +895,12 @@ public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommu ManagerResponse response; response = server.sendAction(new PauseMixMonitorAction(this.name,0,direction.getStateName())); if (response instanceof ManagerError) { - if (response.getMessage().equals("Cannot set mute flag")) - throw new RecordingException(response.getMessage()+" on channel: '" + name); + if (response.getMessage().equals("Cannot set mute flag")){ + throw new RecordingException(response.getMessage()+" on channel: '" + name); + } + else{ + throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); + } } } From db34578aa316877a647fabcabfde123918286251 Mon Sep 17 00:00:00 2001 From: Michael Rice Date: Tue, 16 Jun 2015 02:12:53 -0500 Subject: [PATCH 0157/1055] added support to project to build with gradle --- .gitignore | 1 + build.gradle | 155 +++++++++++++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 51010 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++++++++++++++++++++++ gradlew.bat | 90 +++++++++++++ settings.gradle | 1 + 7 files changed, 417 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index a91655ccc..93a2471ec 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ target .gradle classes /bin +build/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 000000000..5243989b6 --- /dev/null +++ b/build.gradle @@ -0,0 +1,155 @@ +apply plugin: 'java' +apply plugin: 'maven' +apply plugin: 'idea' +apply plugin: 'eclipse' +apply plugin: 'signing' + +group = 'org.asteriskjava' +version = '2.0.0.CI-SNAPSHOT' + +description = """Asterisk-Java""" + +sourceCompatibility = 1.6 +targetCompatibility = 1.6 + +repositories { + + maven { url "http://repo.maven.apache.org/maven2" } +} + +dependencies { + compile group: 'log4j', name: 'log4j', version:'1.2.17' + compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.1' + compile group: 'org.slf4j', name: 'slf4j-api', version:'1.7.9' + testCompile group: 'org.easymock', name: 'easymock', version:'3.3' + testCompile group: 'junit', name: 'junit', version:'4.12' + testCompile group: 'ch.qos.logback', name: 'logback-classic', version:'1.1.2' +} + +test { + testLogging { + events 'started', 'passed' + } +} + +task javadocJar(type: Jar) { + classifier = 'javadoc' + from javadoc +} + +task sourcesJar(type: Jar) { + classifier = 'sources' + from sourceSets.main.allSource +} + +artifacts { + archives javadocJar, sourcesJar +} + +signing { + sign configurations.archives +} + +def ossrhUsername = hasProperty('ossrhUsername') ? ossrhUsername : '' +def ossrhPassword = hasProperty('ossrhPassword') ? ossrhPassword : '' + +uploadArchives { + repositories { + mavenDeployer { + beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } + + repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { + authentication(userName: ossrhUsername, password: ossrhPassword) + } + + snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { + authentication(userName: ossrhUsername, password: ossrhPassword) + } + + pom.project { + name 'Asterisk-Java' + packaging 'jar' + // optionally artifactId can be defined here + description 'The free Java library for Asterisk PBX integration.' + url 'https://github.com/asterisk-java/asterisk-java' + + scm { + connection 'scm:git:https://github.com/asterisk-java/asterisk-java.git' + developerConnection 'scm:git:https://github.com/asterisk-java/asterisk-java.git' + url 'https://github.com/asterisk-java/asterisk-java' + } + + licenses { + license { + name 'Apache 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.html' + } + } + + mailingLists { + mailingList { + name 'Asterisk-Java User List' + subscribe "http://lists.sourceforge.net/mailman/listinfo/asterisk-java-users" + unsubscribe "http://lists.sourceforge.net/mailman/listinfo/asterisk-java-users" + archive "http://sourceforge.net/mailarchive/forum.php?forum=asterisk-java-users" + } + mailingList { + name "Asterisk-Java Developer List" + subscribe "http://lists.sourceforge.net/mailman/listinfo/asterisk-java-devel" + unsubscribe "http://lists.sourceforge.net/mailman/listinfo/asterisk-java-devel" + archive "http://sourceforge.net/mailarchive/forum.php?forum=asterisk-java-devel" + } + } + + developers { + developer { + id 'srt' + name 'Stefan Reuter' + email 'stefan.reuter at reucon.com' + timezone '+1' + } + developer { + name 'Pierre-Yves Roger' + id 'partoutatis' + email 'partoutatis at users.sourceforge.net' + timezone '+1' + } + developer { + name 'John Hood' + id 'squinky86' + email 'john at asteriasgi.com' + organization 'Asteria Solutions Group, Inc.' + timezone '-6' + } + developer { + name 'Martin B. Smith' + id 'martins' + email 'martins at bebr.ufl.edu' + organization 'Bureau of Economic and Business Research, University of Florida' + timezone '-5' + } + developer { + name 'S. Brett Sutton' + id 'bsutton' + email 'bsutton at noojee.com.au' + organization 'Noojee Telephony Solutions Pty Ltd' + timezone '+10' + } + developer { + name 'Octavio Luna' + id 'itaqua' + email 'octavio.luna at gmail.com' + organization 'N4Utilus Take your Business to the Cloud' + timezone '-6' + } + developer { + name 'Zoumana TRAORE' + id 'zoumhussein' + email 'github at zoumanatraore dot fr' + timezone '+1' + } + } + } + } + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2322723c7ed5f591adfa4c87b6c51932f591249a GIT binary patch literal 51010 zcmagFbChSz(k5C}UABH@+qP}H%eL+6vTawFZQHiHY}>BeGv~~A=l$l)y}5Som4C!u znHei0^2sM+D@gwUg$4qGgal%8wiE^W+d%%u>u-bl+hs*n1ZgGZ#OQwjDf~llek;Y6 z|F3|`-;Vmf3(5-0Ns5UotI)}c-OEl+$Vk)D&B002QcX|JG$=7FGVdJTP124^PRUMD zOVR*CpM@Bw929C&wxW|39~2sn_BUajV%|F5Is*T<3IERVUn>LsJGOH)`#%=-zstb< zTgJ@Mz}VX4|5Fs@pQ3J#2KM$Qj{nCe<^jg01%E}C{&wR3{E3L2o2|8-fiVdqosqSH zlao)BEOb8uV(_*(t0uK8eE`f#NKPNVJs};BptZ0yl%!;NS0)U?&hJ4~hjX4IUc5=~ zn&*8e0^$B%3_~IBX7YI0~= zk8=?n=@CD_iYOoXtXV9c?oW;m3|7}b`>T&$b0@cXG}z1?-Kl=St3{=F${40 z(C7g;7g}7O|EA?wt%n%2zXo9cSH&X#KYLX6aB?=WQE;^Tt1M>=6Q{o;cMm}qXLA!< zXA2_(XFJD#DWOQ&#tvB!(HD&(bYyO?Ous65ZP`=hFv4z59}8-DFer^|i7W)c6b75a zsf*YvGRdz<&$=L-zZc&m3#=SelJS=BVse^!X0oBdi{IDx6Fx6$glwK7tyY1dHl<${ z<$P7bfH~OYa*L@hc%5v|9@ZMWbs*0B2rOsKB#e9LM~DcmHB?AZJ9^kkSAj6$_Kk2Z zkt?sY8LB_w`4(TOVrL|IOOj4wulFbtK6_XZ= z)n}9X7zf4bA@%319uA{V#Y0$%`Ef!KdT{V1${=4Nig3#E0mEvqsAiQSh_yChrU3ja zW1Ey>^kEO-*R))gVV~UEFr|{7{VwQHNtxp{`S_vuA>`!FTI+^#eO(_(H>}{I9*O|LsKo+3qC&mvjBgszjsv z{<;=y$oJ&w5h_wAwClwdC0_5vSan>B#J)<=)rp9ELvttK@G%&8k>fSN$F~42)q+sK8$sx z&q0EXA3vwgh5I!!lZryfm1@Ut@)1K=vHEX}=-Z_JJS9c8l0&dSC9Uz?6r z){@5(MEw$r*I9m4s-$RYw$uXE`lETNx-d9V91cBDnxEenM5DhvKyh-+J%5KXM>32OQeRh0`z0Jvtd?N6 zEg%l43(-?iOvzlfUm8jpHc{*C=}nMIZ*8pFuIOQ2P;Ms0bs^U|#QtoRgOz2XwnB5- zNw%YXoMAJX+NAz8DrX8^+RHQEz>l#uRoa8oCdM$p95bHRXpZ!wzmbT!_fHLxtuND;3%bUx!%Nw2n>5 zAs$O>$N8fBxPx4Vi=|KN8j=}CH2DW@MohDfW){Pp<{wM9qJykrts_H!!nH_d$^=yr z20?8;k9x_l10+F`PNlji0QjRR9I&74%~f5gdmsStjA)v6lJhRM&`7mm0;#i5;U4L> zSd;PqQ{f(q0DJF-1L1PhBk^{Vmf97ga8LV3mK2^;?vlU*?3*;b>vmc6aHR826Otbl>=!yFo7GaS97{ajVPuvvuL)~Zp zARtWV5Kc%$os(dm{{e%pucsA9F{V$=5d%S@ivNp}hXl8u1+OVlUeox2Wxyx(g#PL? zz%y7Nz7)JWC@?jSOSu09{Ab!qFp&r>ky@B5Y^>xoK}g$qKQbBx*%Rr)SxoA<3gf*dF(0g;!N^R8l-fb%t%^HEk?I&rIitH z6|a!Y5FJp3;hLL|t_lTcW-HGS?WiCSl#(i)&TP+Nv0lPbb{2eSvJ5fBPf@^=CBuFr zaYr#tiD0FiQs{^*2rN%l19wq!r)66m%`S!Bo!D_USmP@GRnmL6Li$B-Qls#%F2BWxiLne@)TEP(k*@ zRFL=QqKZ~7!Hd^2PKcItb7m}ujKARk52TZXMHLY+03LoRO#0r0T8CR>TuMt%wI*X!{Rs-gsLML_nW#|=^dJhl(X`%3 z-%gT!lTIRo1u4 z!=a<^xA9T2@n$)xl)*v8?->s81A93M3TOb!w3#;WGi1dzY3aaz- zXgrkoCDFtRlk$+Ab#Rzs-Nq%92;NCd9l8~thEjD;?2}l8)b7?Kr<&)ZqYtuzh!JKOFA7jM-OpZr zrvi^L|G4hGqD-3UWoLlnkM*Zi2@23IR^Wtd>j>YVRLM@+)1}n)gyN9jL!)kqqK$&_8`ljYS3@q*l@yiLEZxx>=_t&8dUv72s~?{n*~4@agEriW(1W}{n6%H3e8BliPVr4bsjGAruJ*8r)J)q0S%k(rvAN%P;#O+e`S(E4 z4qcVTE_q4X6`RGf-n0!>n8LKQv5r}~UMP-9#Yk}4%JYQ(&r`vu z#=l+vFL*%&|G$D4^?%)-gzaoiEzDdT4V*3PZ2t{j64q@O1Q0{a5;^2>*{6Tg(jE)^ zj?p>;Zv|3RO=80-6i^h>3eOyuj5?=UjlcXgsO&EiGzf;!D@n9S$=yIX%sP z?{Ts1=lccni;G7=z+V$SiZdP^JK9^{G~lQS-yt{d8mM9 z4KC8?#Vc>;N=CI=52o+MY9DvSf*JEi^%8$QNNP@^F&USOFi2A|K1VT%Mpw6uFMMTR zFZ|^G>hRvR9(Sm89U7x>lbcQ96ijlqVkCvLKWN@wY} z7PTerb;LE28KBaKU$+uj4sS2BkS2?#@zY?oDYwHpk~&}2Mu`qEuFwb9Wqx_Zj!hnV zDRzEv*moWReXl^kz`w=%x%e9z3sr?eNjaYkfy%$>`-6q!&=3V8o4Es95b!Mx_N@=4 z)QBlY$(80odpk6knl|&}_ozAgjdPSoz*olYk1$2KXabugX5u)FER(vA=rQy;x?KVR z18`z6I)ihQD7714oM|irS4`e3SUPfHnTH2Crf%V@bB_iZY29o@>Ek`>wAdkTjqLoT z;WtP}bPDK+EfLvd7mbLD1bCM5hHB9GY8Ziep3!o|1MnEcUxglsxU5Z>1P_6;eX4|E zgMrqNg0|s;BzVR!tdE!knjnr^kO_x^c+i4sLj*tZ4v;MIW`HQk2;71Qm=Nk|LEEUo z<2~X^O8;a7D@h3~r-^;T{L@qweQ+%f|6**+zW|2eKLeQmeu0%Ru>DIF{2RSQtDQTc zsG@$`WEu~+P829eNd-fKSiFV(0$4*+%}Ny^kSNduw9DEh1{U^Am0~o#2qi)|6k8bS0ry|!(J+HcsU1nahon|h!zdv5le|^6E9H5ITbr%*!5o5_3 zERA4ieIdP10tXn~G0?f8P?4!-sokc8s6~M~h*d*LPD?q;1;&&SOk25QFU(&E!EE&n zp=tMbBy^I~bCVZcTQM*YODYY}1gYd$2|`-{iX$eVL4=D<+Qk7Z;_W4I0~OUdLae0MAKMO{O%{z+%qsJW zD(gmrOpq**W*q^)Y^o4zfGC;AFzM`?uuL4=Ng|~0%LC|+a?o7z-qwD5)}C>SpW5s6 z%lr({vOh6$e>ANAQ<72(Bd3(KbLJ@~{V1)B+aY+uUbW#gKU(6E8bQs)q`zQo5tJGb zW7e4PV18N~zu=(ywzZL0g6doi>RYVeW~!zF$!*!drN+SAP(S91z#VfLbiB|HZDwth zQhy`mGT;<-7zPjFA*qcErkw~pMZKD)7qV;USIECsWhgj8#5e1Ji(mdCF*4Hndk+OS zH{hpt$czh4FFIBCqJy$ycmE1i_uMUQ_rfi&uY!a0NbHNGpz|d{y8q%+4@eiXG(394 z#wiXRx<=Mob=(hevKsyMh|)V&X*fS7qvIlG%ox$lZV8_T=asr~i4m)Z33?aS&pfMC z4eNA?E+W=^IHJ;>ELrZSPH!3A58N5|K<`pX?#%m}pQJ@0vFyE^DTviUjY`op&{`E3 zj+NB&;-93xt3%ctd-;&0JW7KHo2#lkwu^nf&SoH|Om| zE_8sVUx<_skdv>mhudS{!ZV8(dI1P?^zUi!JufSEO8M0!!)VNVW_K9r#>YCj^{>Ny zL;N#jPCK4Q03d*XY~g``$o_N4R4{Nh7j$wmu`&FwK$)!eYJ{zh^tHSU@JQr{a9V8& zG$fCv`GY2@Od*MKvm{bg^F}4N)@o%%Y)5t7-cd0a;)p`=>;npt^bU@$NjcaE?0XOk z()~wAtC?!y38IVr+G1;xoq0R6<@;;qlN~r~xMzkrIyLM$)AgQ>9oP+K8YxNlfgxpV_SvEPmwPzJoVNZq%-_ zgEv-g{E(SwJMPf2@s~Hw$W1-0Uf5owqBms-{m5K!&ESoy;#UT&9(v|B;%O$MxAc+S z$W1mzH}=T$jZdEgc?kaCjWDMNc|->^e3V9{ro*Vc_PPc|TZjpjf>UwXdZ6f(gR^*F zymaEHF!8`Wv+_XVed>sK=y6Fgxsy>UDv6k_IeU|}A~Vb%N-PGLW55M&qs+*XjGG#D ziZj?d8QDlK4qnz4S5u9?)oVWA{>hVx)lU|0=8$Bceu^^|B##XSxaa(UVU_2~fZ4p{ zlC>|SfyEK237B@?Dq2*RTlyU{*7Z1-T1>}O*!(M;x(lIYx8yDpD{AWY?CjZ%B44p4 z8QIJj_(IoqG`n}0_6}zJ`!dhwoLe(7uT6?1Ygy+Rx1OpM6g$b*18av40GP|vqDv`3 za~|hg8d-SMp~W(KruBp&MsrWZIKDR6Jith_&;6`w$qU_Kxy-xK7@gi~8kzKHHWjaW zzvybWYodMM9L#5w;v}XbZ$RDgVJN|-)#}gOrJpi?XYCO*H+D5Vg#yO@ZyU8xb@az% z0)C_sr@sERw|W<4d|elph1+=?rmhQ$$&du2>45Qf&U4tf%=XOe^vO%)`a-8+I@@@6 z<;-Dq4OcJ+EL{EI&I`AzoM@_dVI>8;ta_=Ze7a2IH+cBRF(?4Kz2cAu58hC$3he#} zRn7n_z{y>6NEu^abj$YVko-+V1Q^Yo)Ji@E1?EtvZN*F3$pDJ4_pJYS051Ql9rcO)z1BsNyq5t_LJFr zo+{N*V(}qas>DX2L3Pqbp?o%9osNMR#m2z4%Em}YM31!CRbIuk~q%Ab_G^u1);Vy~v5lpd5q<(^3sv%g()~+mRyNVkvE5dSP zD{!nmZCN{NjcU$~IWCgAsjlEPcl!=-PoYlRvWh)nhh@7Ru5iN_nBl-3BRCAcu-|5P zXT!+KeQnoz#kz7sU_vGZ@d|Bbkn)W`SG+E6*`fU>-|g(Tg{klUm`Cgpkr7XqmzdjS z2;(V}uQ2Ria+_34irQnUsLlTD?3W1E7{nG)Syqn|MRElUo6faK>6HxqpJiGPt1eKs zTW0^A`?s?f7sj6u-1qGxl(g1Qy8~s~K0SAqpcnIcG!~*I!&{~SH5Zi&8T)4wzR2X( zk*M}7uE0!@`yX3e<8~cljeDQ&u$5HmaHIAmXM(}&24AW2njm0UN3Ojy*A(Zya=kg-Kx%m9(;U^c|;#2!Py#UBCh>HxCp zMW!dRCkJyl2MQxUu&Lwz%ytOZ6EfEmPbK+B1>+wO$MaRY%MxI;=UTgsg#C;|3hj0H z7B~he5Oaa5rs_f+7lB*Qmuz$nvD$soqjhL-JT55mN|pyd6Xn;8WTprn#nS>9E-!{C ziXd5EH^9bP`}~BmVvE9S>!O4KIC#=HP(A(yPSNRQZ3@?myp7c>Nmne=uEWB~Px5xZ zxsC`GcqDIF6`1`U5L5#@&HT4Jc*x1$k!_xDW+@Vv`IZ;7#74klrh>x`c>yGu@<|Tf zKF&XMoWfBm=f)s%4)x2}-6Z2^HrBeGD|T6ElwBa>O=yKzN9aDm5bZTzXm_`dQcbijQi5e=utee3se#GBiH)Y{e7J}$3M$Y z^&k)YW)}QKDiQrqBd96+O?Ll{m-ij_#SeI^A*d>04^)x;rk(nhxc~9)Npc^dzTaPo?l7<4MDVPT{YPc~F`&LqTZ}reGlCkmTBTL0 zSslWHeFfA4y+*B-O~OkwKt~&W2a(S`nuQwBO)0_KskZAPc(&gJtc$+`2MiCdX2Zfb!Au!WwdV3%G{8m`(PlkMoo6~rpR&)b#z(<-`K1#Jg2ulNUh z_tH@x;^8P;aBHaJ(8(>%?vU_;0J(Sv z0b(|C`V_c3ni7$9hRm=S%|w&mTyp_; zAq6e^6xWQ_##F3@3;b>V+|gUCLEeQt(bJo#SW5;w5*K4?J5bo_;m?=`l||OvGd5$F zm!pzAS!iPr8!akVgyKoh5pdl7H7jyRS8Q3!?d4Ecx3z3&dS{oZikT*-ImyGWinmY; zyoCnpdwQbgMXf33U3SjHT1gbi!diaTP<xs2>}8Y)XfK$nS3;eppi1Y>f?0ZRKOqpv-X7L{SXq23l> zu)%6XU(tfhnE(+m9wXdvAaJwZO6%i9*stG2OplmqYAIRe<-`+;Mq=FtLiz%^@kWxt zc4p-n%a`7U5V9!Em)0~S4LElbGMbroDSW(~7MRS{5nH7Of=#MdP?aNG;C1L`YUn}+ zwq!p-ZxXt^VA?JR{s>H}VkQkp7usk}k8vNGUoX*A;Qb}RRXpuvj@hH%F z;>ITyHr(IVcbLrM+gRD<4S zgPcFc?IL{GZuC7%1(VQ>t%~_ z^Kw;AVIDfAdPHW*9~9rxq`yD@BGiGtmX#Q38QE#o^fa-Vl5rjHDmS|?6c29Q)E#<^x^l)c z(bbx+leELG8dsEV#Lsw-rC1ejR}txhE*aqtW8u~cI{qjd6owhc&kecMJ8UE#%BlCV znZ`zLw&KpfQ|yq~yJZ{+6Zg=F>N7xtmcxK#J_KFyTJWwz4USS_4$ic2a!lC)#bc|% zY6Lzx_8#iDqtc<*Pi1$ZLrFYkj`I1`!qG)K-rOP_yagNcWXjClbnQ)8`E)gPjYG;D zwO3ROg2!Bim&WnuTbNdxHzjUwpU!5j2i}7)!WZlTBw2Ha01d_4~-S>(&&eSQQ6JpX7a?na!|||4^j; zK26(IoU=JgL%9ydR5re08ivCnYXP@)M|Ib~%=lbD5$W@-5@tckV=1h7TKc!eAMT<_ zi6@f;-Z0C#6XY*UL5I!O!?#!ti8knfM@uMX10V@oXfkJ z!yGig1Q{ueMMyM{mWKRMLNne>Pex3DGr!?1Zr9J*G!l_OE1-OaY@7g_Bnm1Hfco^xZiUymnw_wMUn!id^W zph+5&-G8eafR%}Xzz#FF;+vj~wRgoL3c);-Vq#7F?#8tcDb|kiJkT&9M5#uI{p1z# zpvzmmc}%4D6HMayEsI#G$Ti^D9i^hli}s1D^~9g4Kavhkjs9;oX^3Nag> z_o?Oh?((*0I|ZcfiNJ`GivSOYV9?zHCR4QZaW!p^U`jO{BD9Sa4!vE`%GA z3bZIrC%Fnoi&5j5k&#w0!x2d_a(_3R1V5Tl2>3p%YaLk(Dcs)|8Y=K@u*p+*begNX zyfXYmyQ5VSE#y3a@z6pqb<8Q(EjgQ^k2gbE6Qe328(oyKDqV^<%a!J*o^j16;vC&6 zfaemw{t@h$<^78fsI7wV6XMk1qzT*)zkgKx7`0kn!;ujvrA&1L6R6AgQ-J)M{2k41K3Cst_@ZI1A?G5P- zbb4jZv|WN9`q4IEK6g+;dp%pVk-N$qXi=mqq0;ke5+&`G5dwoh=G*~K$`Ms z8)W#LKK^-}NL5^u3LDLQ0TF?I{wVAlU>W63l{rkbHGWhVR^yVRIgD1?G=Y6Lt*n(w ze~?-7L~gO~v{)yRUAvSrUUlCH_ugEPS%Q1tc+YgHSEv&&x`rEn*+QqV0&;nJM?bHN z(^@5sbbcA>47QcG7N_LV0TZmCZ=G|+;rM#yCOppLf}mHtM7N>~JF#K#ZNHA)$Qk?m zRn%Fh=0W~Otfs(EJVY;8Mj8Gu>X02dRP;`k_)x)fj|a~wc%EGFg3zLZIJPJ~u(YS=0{|_IFfSFuVIe@yKmx0J z*@6Zo&u%;%=oIRa=>e&mK*G)ywsyBSMe)h0<{-Kr&#*$*eyAnBL)TXzpMABpPk?M~ zl_)?muIkX%#!Wh4B^#UQ-9aQqi0;tf_YSudO;mg30MR)*wbg$(k3sFo>MT@@0 z{F}K;{#$_jf2oiYva@q`a{ilXmNl@jRdzOTbpC(Sc0aY&)ew36>%q#Ad#xEk?Lkm8 zhvbx{u=7};f@?7n^i#MBBWvl!L{ds=P)<_lEZ(u-)>6CK=tF9}Ww+ny-xmGmT&s-( z+3%JR+|tvzou((dj6Ppy?C60z{qap+9Mr|=O-VZG4b;S_kBm14I-~xwh6a)$5R8}; z8oL9Zo;*7Vp^qBLh^Y)D1xQxN%O=+P%KZ?J687w|FSSFVBabf%!{RR*{p61duZ~(` z=n2S5Al}LuzyBfS&V=|_?W>`w)!#+fTn+SM{vuVd`;Wa*LHRG@BG0ZGGDTwf^%S*>7r5}#MEpuD+d~@7S^gXTmD63qu3{kjsIwSYp-BFV;vdxRGh z0-`<;32f$;H}om+SKs$*<4JVZ4{E`Krm06&DraR1ZO=_~vI*)Yh1w|9pTnc|RYWU8 znk~iYxcuX5G|FGK5qMPc95o4l5L6;DRj%#pAW(^Q>?7C%656XTHD!v-+$hrbsv2yagjPP|YutOU?eBKy2PcwUg%N24H zfaY>iFn0{eJu6?Zhouixvmg_TLRh~S`c1|iel+zv-e|EZt3MIZFEs5Y>S%Xr0G;1I zN&J%$i);{O6qqq~1tec@Y=1t8edke+?0h(=1WfjpCxhG@I9CAKub)}wJ!J|VUK74# z1PUe3KD+U{pP||icJpCsRu~_s3x3iAT?&{?FPQN_V4LI}Dd1v2IBGuP9Y;8*HIn6d z7u+Y=eM}w2c2Bk*i#pEL#V+19i-bsWi;Vt3USV{TQS@Q1(>Y>!u(szCMu= zO5r92Qm5d#!#HmVm#je`s9V6OyF>cfUrLl~Mdo0ev?`SESM@%xW;o8)PpOnFk(+>R z*S(Ebgnx#^K2d^k;lD);O=v(s6#tn#{CCZbsJn@g%YT*KCu_LrV=rNTXA_IpJ353} zo9+IB1m>ltDqE>uTf069 zu%5G5{*2z@r;)9ZId4{`|h=z}TP|H=RhqJ@#;z_GIBgtr)?6mz8qN`9l z*i>VV{bzc2p3kO|UfG7No~3@Ph-FglXC%583$=J?NQ7&*d8!C!we9%vqqZ2f8{~1x z)P|gqP+x}cLdHo}ZKI6Z^@foJNj+Cfn^TLhawE$+gOjo4s)Z(td1_9x7i?sK#ig>n zs8tc5k4nC<#H}WWP6WbsnmTPzVH-SilAHC;qCdRDB}4ILzDCv zz&T#F)Ivs;S+fPKHZE}HytP(~lpLpobyet8tfEMD6M|H$f+rbZI=NWoMf9^Te#U7pJgZT7@)!ClWC)h zvqan?o9oKWxkS1HRKI&VOILDJp*1T`HcjTWT$9$zBUrkHmjuIU%(jyW3--KT_#!JV zZX_7Zu$4W_umFu-Y(o?M``i{Xorje|(mY0v>CBg{-KnozeIoP|SXikkXu}99ABgYtF@?|vp)b(^#c@;01cM^4 z`PBi28V%&CA3_wql%Z!$Vtk@$E~$^|jyLBKKT`ME9dEQa%^^?Hf=btEOqto54b`dMjNi^(D`L~JOU=>Gn#?e*DEmr5p zPf7d^j#P6Eaw*!Qf1&R1F#{mm@={289&B%wYk`dvkbZ4mRSrLFS%mESv`W#{38 z5Hl%Jy%~kN4{m9iVxk{pE<(dwaZ(X2N1HiGd2*L-s$25PDWY|tO)cZ0)LNfM!p~lW z@$`<3pBf%{Y%P*c?%reT@iEM3gU5+@o4!vFyvO&j2j zQBrDEuL_9#;aT=QZ6C?sn$8CHXjiVMQrgXi-lE2b8dU!K%rSY-q{IqNWk~^&s2YvX z#FwV31Do{HmH3)T4CX7?YcC$)9XS|IpD`ynv7zi4v7{(N#akvVN|)pn6I+&b`Sd=I zUH-vjOBG+TF)5ko4_wwHOEd^+F)b}GcvomES!1GLKgf2R-??i6_MFzDW;ENN+{fu# zwwaibJYPe3*4C(Npf+^w>!5naMUQ$~=S|uI-rbW03&lYoa9T-epylw93Nw&KR(Hu` znvKK%2V#xU0J{A+K$okrLZ2I08~3HU!V%x>req)FtG9Z<5mrC0g0R{$?!a@kMR)iy zx%=@{JN9LHO1s4STs3UWWa2t)qh)%MdL`Wh#YtBpd#2B6?3Sk*oH19sH{vISQ9~)F z^x)AH0ZZgs9pjALljdzT+Hl2A4{3|kTB}i1NF*YQ(%Ge+ak(>S> znzLcUx!FJs1~&Tmc7!unG(H+n6#ug`##kfl;Kqe1_}sO^;|%XMOTrlf^{V<5oTiO7 zZpJ{*2wjo65}dw0k$0p)WE=6>I0-yKBkbsQ-1qghYhmR*UA!6nF_sjr+&U8`S)*52 zHJN=Cx0*kjTBjG;M_1WbS3}ud%o|;*S6k`RTW7-Ny6BEP{OgaMvOIct8G;i7&$D|C z2gw6-k8Lm|qkcMw{gyQS9_E9uus2{FaOep~L?pE-dguiR=aBcF+JSHfJxR!PeN(Gp z9kpY9ryxZ3%qc=6a^pm3X}yJktDEqy5%;9wO8eeW5%(`s?3m(Ex*^_<%^9tYPbihF zv4(Al1kd>fSWs6C+P^It@olL`XpYR!e?RG#wnm+<9!IWQ&O~Sy-!6^LM^IJ^WjXP% zOSjiJKLH7{qe;sZ>{Fo463>VvIvo^~YoclVj=&uvfVAyY*{vpe03RiBd0Y{4{a^}c<1O=}Q0X{QX zf@e6v)U>S|k0@N7dhGa5pe$pN8nLr@qqHs#!)DkW@n-l3L8*VB?4FZ6osHl$6l$&`QMcJbq zo0g;e*oR-FmTu~pALF;cjAn5|D4I-fO7-*h_OLnNnMNKD(^B_Yf-BpBaT|0}?Q3%P zAK5;=U4iyvy>H?>T0_2v2``V7Oc9f24sYsMtIb=<*<=!W2F3_6& zrOr^;l5!WFF9j|Ch&sL^`;ovBUIzuowY;r#XS&(}$jB~U)jMY$s*6*m-KtVJ+_T|B z&y>c>nh zq3h8FPK<3WSPNj-`9UKgglsKjXboW9+y&GG^7^S7}K~XkyxzmS>m>EWS+rh zvCu(cW5RALG*c*h{oZ~3(0$$beIZp(Lp!p9khV10`MUkN1slu%I!g@H9Pvoyx`PJL zy7A`h6o98!xgi1^I=11^tKA^e>z)l&IX*D~=trngJC#J6Hfn||4(=*cJHcyI?K7cs z8$P%IUG7~X9XjxCDhWGs0JmK@=qt4wG5V|cb33IvEIT#(nh3Iu5<|dN{!SIuvQ$!s zeNRA($E_>i{1zT?J=k$j<2JF&>*!vCUef6<5R8s6&gs8ZviJG&D+1P3b#gb53a`I2 z0D;n7W2neoWXQsMH8OUT8UJz52%3-1&sWHnkBS{XQ6SdyRubxgk{(a}#-eP3*6}3@ zoqg=utm`E!VrCx(y8C1(^0eEmZZYw^f@h(O+fyWO_`)t7>v z9bSo{I15sfD|Av*V+@qL=OiQo9gHZ-us#=`1qs4QBBSsf^MI$djJ(((Psd4JaRH@2 z93e9&AWP~jJ`IT{XVJ_w%Gkbz7uU`7{lPro&SUQby3(3cg{o^xM_vx8X4ynbV2TLg zMAE+qUUU&w7dIMnLx(GorOiS#I!PNzA)(mfQA|>cv4C6|+^>>0i5Vvn+-uTZTVABF zet-?mpK8E#55xb!-)0CxOum?gm@msr6=*h*TMTw6t1jO;7)Cl%zHkR;%t}eLmL;aX&MbnIt^IML8J6iX8g z+x=epL)uxbgNOwUksYn;{9PqWFps6C)F^1(GDjrT05l%XDL!v{?E{L3zvO;2Bi`Y) zH;u7mQFOiaaFp?Qap}Y@g;c5$yg$kbDyc=`q%)JXbBTn}iGx4DEBSjk~ z+-Om;s9L1#x;tYw@83!2OVv(N4}z8A+KXr%G_!L(iz*dIJbI!v2xpvDULU#2*?1@;Az0{0lcu z9{~oni0fVtiw}H0VgvNIK_Pm(D_DE(F(K!Di9LOGfDgHW>sttaRXV{<`U)Kyvf4G1 zh83QiuyoI$(~}FFl^fU%3fkw9q2lpujOD7+E0yuEhE`J2&D?_a<@-Ml@v?C0)PrvRyM1<+cDB;+2Thr%Qs&`iY?R zB>vh`%0bRVLUb;+!Kx^a`GP3Eby7P@hQ=_$1P1CM0+z#&;;|yp5(F6>KYT-p)U5VE zq8d`#7ePF$M`Z3d3}Ftf6Ao7hlXVKh#AI2*fg0qsOT(HnG(xcfb2Q5PX*5f9X&xW? zd*%Vad`Z+hQ#208bDLC?l^m&UPdg0)u!ojwKO-g;&^j$O|5kvM%sUVpWJ@>lR9kn7 z=PRF*D4Y67ZqlfVHRn2ZH09Q?Rd==Qr0Gnrq7}nd)C#j6w2ND?tJSB1`Rg1jp28?- z+_!5+9^DluG`E}Z-Z!BxDE(n#wgI>n8d$c?#xLh|oGJsz_S_v1T+0`KS=F?_Ey%u! zi0Hnetv^hj@{ZW>B=|RA`DmW6q=XS^YPsyvj zY#+Cd8m=ZosAn6d!0KE5t_<=94@3)7kle4<15J1U1H>^@16dD!dWS#uCUNr zOb$AG^hp%AI=sHVj$eW_SsPS|FMEnRj$7AxGFN!X9{2aKr3zAdl3+H;fk#?EF1x!z zi*vv7I8=*+peN zD5K87allYZfFhHY0Bt4KS8W6bIGK(r1(^~P}W>D9PpWfx7tLy@^CxkwP)g1Xtr(pbqN89 zc5FMxAw8~49k|OK3(L5svi?l)yCp=zt--l?a-z>lde>fody3E0B5r{OJ>;dC#kZ53 z{1CpKmdxZ1vDF8#1_Ho%Qzq87ZtdH>dh)XtdW59w_Sna?q1RB>tspfHv)s};i3?B( zs8hN^_U^=z0i|VMYmLN2SY&xam^YPvWue5WQR+Uc717eXboIZ0*33 z&pYuJa@{mJXL!QLq~nJUx-KvrH-Ce*9-rNEMc^PAS>-#l=%fCWF$rw7M^(wJb6c2Z zU8{>@j{8AB-1wo1!;ce$K~4mnD0gmXd{ChxB7!pnkyXt{COzwwgY>dKKKcrxr8;?q zZuH<}Qe$DWW>C^}aAFs5Y?SjDxJogyaM87aalX<_Au>Zp!3twm2 z#H84cUH}X|)d?+IYJkPjpfHzS(p*8g;YwIwUX#&soFjPzKJeh!5&ZAu1J4x446z883`C7!pPMt$SWIy$om^B{m6mT%>_Y08=IU& zv-BKOLgOJqHeA}5S38%z8l8ox5FRqJvi6$2Zw$V|KB26xCWwFW7YxPqX8plmXn+i_?G$`aH3znNUlt-h)m)uyew!m2Pk(<)x`ovF-J(C?@ zD^uX;N?Z}>N*zBJ%Txp1QDD{sYSjlgJ0!ss*ktW6(?LduRLS@zcC+YsWL!c?xy z!j`T%jY@kst9GHMmUduJY<4Tcnp@n`jjpz}0Br>L>v2%7b}Hbm%AW!7W`kN45v*bS zBcE-h2fk1G2FRZ0gQpZdqv#YpL#q`%BW*mNl?U8BkNQASw(ekg@%hQhr7∓LFg$ z3XI^8)}x<8`5U&l3ds;F@+FtpQ7OC!>3AZ_T0$f!y^Rt`ot;J`StJq_Qs{o4Vju~3 zkS0qahjj01TnTvQH_cqh5 z-pq6;V8sNIoE|3GpbWB}oX`I#E-$VgRtBcI|CvOEsESMNJh2am(8$QWk~F3qM2oX1 z&wX;6A;G2b8kZDnzmGd{QrvAiQzAJ#(2`a)IBcckCbXUsp=1_uCUSVt;=z703`l5P zNRE_Er|RvCB;O>MV@XfvoZd z)rrT=?9~9NejgZ%Rd`zZL=%8T=F-0ZDY0@O>arLW6tH$+}g_}%=-{Wk>#P{-2 zSL@~|SHCTxccYr*=Yg1??6_oderuH3;uh=#1y9w{K;+jO&7o$K zoHR#2;r#TGLZgtO~a25*U(e`9JIp_Rxe4 z=FlX$uMDpIN~7or(+05frN>^F2YJ#PC&*DGwv__2;$J zykU6`xR9p~Nr>1vi9X*U-X~v~QSY_+jTTGv2}+0M#S9SC3haJdu|-iPE$9sB!<}m7 z{Pb{;9IP#fS6l!}PoO-YOoEKiC5ldhc#oQu+N5}93D7wp*`*CU2UFU#TVL?_%*Iln zzH&}YXlX(j+bAuzrATj~HZKkcdfpPqT`4e}PPAK>*wL8LD2y`(-7`$iAGi< z0G&sq0HAdb=$#g~B`I{6t3*{3D6IV+T6u5ryO$(}COT(1+^PVDow{r$jiN36zPH)n zCszO$+)vT+?H)_L);8E)uMlELG3TUa*-)W%L?Ro(qW6wmX1{!<`C>K+U7(;L^BFS7H;-um1OQM51^{6H?>UTrX>lW#v@y`L6g2x5 z8<^=k{l8xJM0pJftZyTpN#l(L$8x*Ird5pww-Af7)m;q)dZoD)x`u?LwVWS>k^S5mFh=t znOQ6DvUhHH6@Hm=*&<^K{3K_q*RC4KK6z<+NH@)U6f zi%K1wDmOlFG!I8jz!yqoWNbi<`r;oMkz_!WZ{2{aXHPfcT3Bl6}e7+sZt+GP%e9@nY_Kw*0Z;`MT7)-|T-R$TN0{}qq-$%l~8cqc& zn`vNuD^W#6(`LSP6ZEy;Fm6}qoW$BdL^=aA0%-t50a?_j+3Cj#P+cL0k@0?EdV8VS zoTFH}W1-kmi&filDUGH;9M8u#+y~tUl-1Txa4}tO+TB)%D~>1XyRM_G*00y84LE>^ z9X!rg0z&luJnSS#*fGpoPTK9fFh5unAskdo9Fh*=A0n4_POjwTEd{%EQLLIX2m?wu z*?mWauTYp>C3_Mrq``D&-`o(U-xu2kR_hV|@(m15^>#X@@cyob{Z_gBZCQ|w zg{xGb3$v$6-xKpUd2mMQowFD0Dlm{v>0Pip1ewzo9c{yJ?vT}Dazaka}+el@~BvI&hpU_-sR!@%HUqqXdJU-)RMiW`YO=d%blV78^ z)?uspeK3+euHkmo;wKRLW_6i-KSc#Dz05Ianm($b-=?VvKM8fn-xFYOB;jLoD1pP!6VM3^xX|7cXMo6bSnOlF}G{!&;+)YP|Eyb>1^+o-wl ztEbDnE$LeL$XH=P@$T`s)RXVotjw792t2tqU!xhZFT=L8L+Jr$!@T@gc1IivNvWgK zyCC12@p8fe#1JFYc=0)M6Gv8_QNuapQGZ;Cys#_UXn43E$dAcLCX#Z^3>3zXrZ@w- zk#o}XI!E!|?0l8>bBg1t1BasX#8KQ_G~?J!|NfAd%T>fg7X8o)$)uk^Zl^Ab=L*XC zZV~&2W1w?L4(V!?$Kv;FY^eB56oqT zzFT8EaFm~>+gk4<-D(*`Ah+B>UODT6wFNAqVw&4oyOquO0W;wjyvXouR;& z3}1i#=#3J|R>v|yp{d$XZn9ki@)Yams9V`iwWWrr z9(_~-{gKXGU*xoz>?*6X%6sS%ce(1ew%F*T;z~Adb8XaC z)W?l=_Bdgndd0u9JD|B~_p#~XJjd4ngbtep8 z>8>JIe7hTmd&FH|M?J{3TovzPjW;&K3Oh&i$mWPi zNE>mKoo5_XyoamSucL0tgx@`D;Ly+;!cZzb>0SQC?9Kw4p^x;-+Je{gbh2;9RcJ#L z7aR0LbI&b4R;TxU6rYk{(APuWS}-nQ?S)lTsBQk&+=5Fv#tBNMF7Ty8;jcV+fk7Yl z_S4Y@mdi?e(7 zvEW8H4J<%95Bj4xk_q4huP!wfpmO953D{No1v5sA0NL!-T6>x78{LI$R=Vh^Fx(Dm z9DBmG8*rnX-w5r7@L(^gI}1}Tdwl$PD!AN%d>jyX${7$qxrf~n__76!))dj1H7!#v zT~xq3Bj?i}5 zNSgn!O||`Y8KAZOzs8~plM^x&6JkoDVp3z{W7H$#Q+x7{6H^M;V{{7i%(C>%wT!Gy zjI0W_&MFW~}0<)+v?MHJqyB z*gA(mtNK>*cxRHfUc4=>u#A6p2#*aEWT2l%K10S@+27du&qh(G+G+>0toZq0<$={ z{j-IAaTrvy@l#rHg*-Rw8DTl~Z))4WUjO@z|F5qu-1q;#e0BfXn`&Tb_Ae&5f88E4 ze4oVi?Et0l?G4EAUvKBr|4Wu@;3!~YW%cc*BWY%B^z8)Y{B02Xp90-PMXhf)SY&Qs zsBo&L5Ua|qX}E)Y$2Fc*eo^olQ~ol9+5RCTj3q1GWN3kWpWdxJI_8;vyzOYlO|=-= zq=tLFqfHKvt5%1@%?(~3pHDE`5F%iR^W$X}_?{?0oTItDSa~B9PHqW)wEcITcH;9svsY~D7`RhOf&fZhURx=l^ z`bAt(y_LGlC-mOo;}4Br*;mJ;f{DuInk1|nxJ1xHt%Ipf)~Q-! z4&%+pd8%Vf%k7UC%|;w}L89R#*t2y_A%0b2vlg@q+|v~{sf*ACg1pKxZ81p8H;>zc9Vjs9@NqpaMk2{T7; zFx;ueQr&m7)(8Z)`ARPi!6$(4wkPuCy&Y!H5 z%gTEbRwinHfr^br3&}zjCo&C`w+mR_1i!hOgQPO#bAzau^Cl`$L_d?Vb+x!Li|5(DmLXlC& zD7xr71dqRe|0az5D{}u9g0gz{-)5@+$rT1h@cm`VEc9jCs1D_P&=z7LFeQr&BGiM_ z?_5G-1|;@iOUvaOjHsa5X3KNOi)Xxf_TdUN3?B?GAQ*6LY2CDKRhd#VEVU-Cb!jm{ zW`?uoM06GRU8(V7sGOa4Z!9Db7zY&ACYDrCqlEJ>>>jx#BK!(*QLmp!bd16wIEm#K z(+b@y+{q&<_!1R6eD|2&OP)RLLgMIQQ^Vr{EDGt9y7Vnj>m#5V}> z^(FPAV~}R<(e+b-t4L+pP?$yCqU*RB#QMP37R@8N>4n=4X3Q$4aln!oOd`GDkomT> zT59n5{CtJU2|z(%*jMV83yEhYStzGOOi3~kqL>h5z#3oy8(4LMkq~4UqQ75`&$eBg zxqwM-=k$O41-_xp)Vg;J+o!owS3XcSK~i~#xx zwU56E@0WEvL7lM@c{ZO}OP9*p;zhCNT0#6yU1Q&blr@$-94yf#l>aP_n<0A?K^f0& zlNL;w`gxX+hzuo((wp``KcdHjtg4(W25CIEeRT|t{0#rrhE z#}g49iRh$Jd%ZcW>0_`0}@`)qDdGFi_}oH6d7-lRF(jBoQKf z6)&HUA$n!Ws7&LJo4aShnL^9_O=S_I12uC)}B^^EJd=^{=W^{b1Zk_k2@ zFw9c+3dgNpH^qay@s*dfy6yhOrHCNvB-Ub+2;k;Mm1X z^1C>sV?ku%RE3w!B0#4L0m}BFoCLdATp{=6eJpp$VWRw)*w5@tC4eRc!elV;Q@?)O z;s6Jhawc3^waDPoUSP4>jsTF6Bo@GrpwZ*{+JHd}lBC#2Gzsvs9iZF%+Ka@VYeCLI z<>LM&7d7?SER%S74yAuy9z5qMfR_v;rAO$yPB2!pRRdh}(PXI2rnJ0XGp4;)=m;9G zEu=QZB*FrWA!y1@Vv6vBM5PCEi>BNwG|O}^Ncs3T-0)YncT`9*#(rmj|M$kj{lCe8 ze}ulmH*sTa@|_>Hdf#4z|7l5{sW>Hr^iAIww;AbK<=*D&Hu|aO${JGOi;9O7ghJFJ zAVG(27F`rUt2vKcCOubokEH+bxB&_!9jy0BxS4RSW>T|nq}kGx|t{r?M|~UH`nTUAesR=hbrA?NhGlm z`=Z6U7qk!-=7p9MuT6mPF0cdzKD7C+pp zZ$luN+A0J89XFjQqaBU*C>xG0=>5_KZrnL9__Dox5YiZ9QLUqi8oNHTHu(w~)IL|b zMs(cAKM-l?YxbBude1?on8vS}J&fG^{=&Pc+-fkI5EAWrtEq-&>hL-(AYYQOL*SLb zl*0<5vDv1;wpe?z4nntr!Mp^*cDlv3zf&Fo+a3|rEj@0oHrkT7{TXsIi6%8x91gMw zsv5iaJ;rDe=-}OR7R)@eKLxr)7{-TU4)#(GkcRKXkYA9M-AIWW7OgQ6@K7Dy$veGS9izAl~o`_3G zSEgrSk=v1~hNBYS@&4a{tiP@H-z&S5)wkdNw->X~e=PO?SmG07C&YmnkOO62 znerQ()UBvadoLT5ek>*Wh4|68)D*rsViv`w3NkXCTC`HOTmyQNGl)r`(DWZxPK_xAvi||fdoo$7=tKf zLpi4p5EX$rBAXQ+j`<1;l(mc;=@VpL2W>5|>u4=tmdmURY z1x%0&FyIf&xriwU}%(PZNo!>zOZV)6#LHM@p;qrpb+M|~aWcxK;tX&8)! z-JJ6h&%fafUNqCMp>M`8_Kwg@sDNb9|+`coA8FJg)8y_iuWJGcr{Ys zpg@4%%Ef6hh7NFm;nNKSc?Chgup}cIR`pyY!PuDAQddCE2gEflHngW%l|5>~SKWV$ zBl365YuDsGEau64J-WSedA)9BS8|&eJJ+Xg)P(ZB9i`u8UafaIyiHyXd}a9n{`$F@ zSPSY>l|w?1k7R%-i9w(mA$EJ~rfsQ>t*u!kBZdxVz~762v9w(R4eG*hA4uP&`kQWN zOwzGga`#W~ng_9`(xAI1cZ7$LWuF&g*KeEKk!C|rtS!CXtDqb1!F8SAS9?D?-er5E zpP$+Bc=7kpaTBf$Fq~?7pCNq6+}y|`vTvXCFrv3jB;W2J-+`Vao=M8x6nm?`iDcP| z0t?kcUkj|mkbwArmE^!&t7@}TXBmD6>x2)}y37EKpG{uWtdyQ4L^Em-=>>B|GyC zTAznqppu<)^f1j5+x%X3w?@LbEl1%$-Q6ZF(UHL)RPAmTQ6y)xF@F}U{b&$?=oNge zNJ&DUxAcDkWbEHWRCS3rlS=7Q;+R?2Uia;-*w4UTke9fD@p43D4v>J2Sg$q*}YoP zaqi@#;XpH40Xc@VaN)&=K`BPpaAKuhcOb+w3=a_v^=o_U3+_ZMqisWCCyvOfqv3A0 zXAD)F(`{wcOBX_)To?HJob-eZJ>&4~)>NI{6!I}gr3a=ZHkS-!aXh$gt*J48-Q@Xr z3DP-Nq(|9O#TLhzd^t3l;+VhLj}IDxnbul?Gu|05^n~xZ8DwYzf>Y%~xpHxV)5&~& z7H6SBb7A3fUTH#c4r7b|!;WX~35T;{Xt-``Ta5LJ0#s%X<9FspQCT#}Mm`3s6TicJ zfmI}y9e35H-io;;!U7GVG!?u57G(=481v{)!Vm624L5`0i zN`L*t9C72;D}E4VN)HD_J>;Z;bdQ6paPJ+Yc6T_W_fXIAYPxs}*n+umTfX#hQ)atWsNt%KvhC)$QkRyGH`xd**432VDb_u zYrz6W6y{QV6E0D9|AH~0J8-qAt3rli`P>ResEKP!W@Gr_rqH$nqgV%?&TYm=Z&*w9{#kox`@_7^iD%9Wt8e$A>;CM?F1~K$HAN?=#9LJ9ZZiP<$V1_f!E>&3tXEU$Mz+_CbAiB}9mZf=Ri@-Hv>m9L zy!rB-+|)?*$4Aw`s~=>lt?tYanJr}lPxOv+o|W0O7j!MaC+}4Vd@AheeVeu1@iM#2 zdAV};lc;I0iwj1Ht`9Il<9s2$z!jv>^DQ#nLl)1|2P>T62naHfWevPFokK1#y+iJu zIh{sU7A%LL%Dy4q6g*3eG41C9RO1Sxyg_FTi*FIn;IDMWj@*T~N01^LRpoiq$J^$! zbP4@Ydr*km-xSOhQb|X2_PD2jfkhJC#mgBP7F=TnJ8ElabnI4vNgJ6J$ZQL%GM;lg zFlbgGjVE#&4MA&@F_4A`9h=iw%+$O*j0-QrhbR;OP+Y5)!I$ic+PPcd;_uY;I1clA zV+I{#1@yz#L3a;cO=gePTuj0hQz^d0*sETZj6O8cL6vuWa>JHW<$#I83!;2+e-i#9_-lOkSpmc$aw-G0h3QANr^#+nhy73KyvW8Iif}e4<#Vb~N zv7E!{htG??IbDu_PMpIsS1_me(5q-4a~`!7W@IcWo-w~)5nl(*XO|PIl^P^#0ZPNu zom5EG-u&Aav1}GxuM;v@2$U+3c2PyAXsr)QbNCWHf%cHy4H)S_x~pnOVEnF?CSvk+ zmg|o%ge!UK&r6Pu@O7UId*_t8Jme=`BJ6ug^;%bOEMwbE_)h34xVRargAUA{nyX@5us z+h7$v=t$l9vmZglJM=uKBx)Q@JLpw`5z%u`NCcl)=jcXW5Z1+Xlzpl)Th+h6%zg$9 z@!$U4=j|`thHZgbJMoR#*1oHBw*P&N^6%A2qLP)&oGh}p_0o(SC%TQoHK-somW`1w zJ~TpxJ}Mf0D#48b#su|=`mA$*_72=mxK6jI{_}Y>Vb&U}Lyh>3fX5W~5yw>PQ%8eO zmG=jjYfW^zgb)N4qBfJG6?)Q+ z6(h0zix*g}A>Jvp7fRo(OL`>m#!CfGN&!a6GRwsJ61M-9K;f|$i)PUHX06Gx@`yFI zMbzO6tiOB{^#(<1+SzG+qOuqVtCY%{Vnb8}^_O7|$eh49~z_zJD8dz(G6 z+IL}@nBI^(YrRfo(}Ogi5Q?zRj$c*Xb-`7|K`6h z{0x=@LDXhd+D)1p_ApcIGd~TY2k?<2wz>OUH5b{f6LM{@T3eiJbL^o7_KT0J$e6rDEXn%7Bm_0X-OZPFZzd};ao`OK!2^3G>qRK`Uj2O4J}kE#^n z=?s2%*>o~_dZvb2Bae-w2qLe#+ z&m4|xs2a~8umik-`YCct)<#QkG3i{gH~>}f+~r{{$mQ?38nze?g2q5Toe9zt-G)sc zEZ2Gu9{mwtu?-=%e#eoeAK_VitiMMbnrg+lQGe}-H^Sc`Dl?^-XOfh~L|z=Lf(_?e zscR+)&v92M78d~hj2_r;(EzD8sp>dc2bd$2LfnhJf;9a0Y&QOUMvXho$>%1iKv9>l zg4RG7PZ%lATPOF*SE@R2tn;s&-M;<;+0J){SbyW_zsAS?8{7Q1%I2S(oszZ1|A3-9 zmB!@1>v(SN5n?^YU*PaJfg$80@ZdYSgdv25g-Xckfpxk|#0q=IhCykP2|Cw0nxZJt zlxW_*U)zIAy^&aKZ8aU-sgMZ#Bz8N8o0n@(8C_nN6Z;=m%~t^Xb{c%pdyt&;GkoP4 z^zps>13d|TX5)f(EMXSV_A7f?xC7V%?+7kqZSAB$(5Jv_iyKDa$z$%Rdin!)kr_L; zd4)%iNvRsn;w08+Dv}!2yTYg2chCfvn9w7MChwqAYU`}_7FianU^oL%!Ky(!`Qtn? zwNcslv7mFTokC#TUKzC#WPix|CQ(y?J@s1)UivqhIYhv`YQ+WW{Yjgwjm=l;6O z9_DePz%u7YO?R{2EeEMlAITXs3ATtSSzAWOn_k-5_L1UZ&D`>AnJYOp1`0uEm8WZ) zaWNi@nP$y0VFq}!n`SxIYY`0Edqno%hx(2T`fTXk*QdP9HEzzEHgyf$6q4F06naG% z!s>u?V~ZJK8q-&)c^{<)97wy7lpj%(Wj4R5P@aT{;FoVj60>0~*e8dsm-v_i;F5VhGdy zB$+-D7~enwy@c7`{CFNwijO7B5p@Af0DMSj4L`*-DPE}LBt!B{>}Xp!CA1C2c9t4F z2nl<;zK7~OFmD^NNB01vLdDcIMGvPFZC^R*wt{v28ddCZ*e{Il=Jm8KOOy48jR^k? zPeH%(HIB9KM}e?Po?jI*#gntYCCDdKU6$!zscwryR8l?_rKA0!iB*7q5}v}Egu@H4 z#v#A(1CLi>qErc`FY(tAx-f92f#@4&xYFQNL;yoJO}O-JA9APxs=4aB!Q?Kpl3OSj zqQ0fE9e2h1zg3`w?j!1P-~3nVw`PU(f6ShLRGt6idzCdD=9J+-6VS(Mg%F|pcX082 z4UpDRff5R2!JB`H`WA=@->dHYn-bWA5A3_C`-=}|WgmmX2kpbZ7JY4N5cmB5h- z^YnS~kTc`1x?h>gqHN%8rW%Q}6_?cF?CapGb>Xdfm8j4($!z!QC5;UQX@Pbd^Q0TY z)`&9*-=f)gMEMhd2nLb*1yBJj+>}^&j7G>bats-1#UxZ_5A_bD?#d4H@scLm$1Fy3 zH?zi*4{tzC*(!yhIt-Rw>eKVyEHs0P>fC4vei<*@rf%SA>S$D)@v0T&c>?YEj1eUu zD^a)r@`h@;B|=MmIhyRp79u@z9Ky+N^;3H;N9h;~DUr813q}PX_EdYaJ6V-0?rDMiQp90)MSS(nWE{F9n$mRw21MYFz|OVHY;;vej|8Xqbu;G%RG z>fOX$oO; zuFJOZEoU20ck8T+|7!3gT&R9?0I|s#qVMuW9V73 zP2@QayQmp`X4Ld^A#V-xQSXnR%yp?BF#jubcK8L_J%f$~|CTNuU84r%EV}N_k%bG6 zla9V(kIJ)p4;!KLRyd_nu&4b_RFaFP{CLH#v(C6Grw3kYR=ax?H>3_IqJEo;S?#n_ zC!D77NKH~U=B)>R`&0?SoYrY@A!KOq(vqAn`hs7M0jDJuIF6D8$wWbq?wpw!x3!!A zQ@CGGMNdk=#mUT9T@;715(yzHBsKx8Lri6Uk{*0~P65=|Vp2srrt{rhyZ_cJd7Ph- zZhnhJewP&d#MaYYc82W%@aAZhgA^p~tFxN-APJ&d%q@Yrx5!UIO**42{!uQ0wRMFC zUOwVGrbTYPhN9Sdst~ajds|Q(L|lEWz?S~I(9m(Z5a_C3W_{=RKA*3lo2#*V4siOO zmjz$QZPVenhjrp4nfXB_}aWJL3wLGfAf7Mh^o9PucL zuIEQ6E(^e18FpF^iW8m{bxWz3%DE>`wORIk9h1f24iT7obFnKS{pLAMzj6e)vY>P? zuYttaH|9rPjiq7RpVK%v{N<)bvbB3xnH=j*wDu~rpB%{5YH1DnsF(H~3hKv}pK*3q zF1w5@(W4i^2zD2_brbEuRuT?)49(pe~)HeoQBVVj4k*?}Sq{E9}s0C6Ie_58_9MHfr$sKv!^Guv& zQEB_6`&UeqVW~M){LS_j{Z~!ue}9ho|DhBU<+c9Oq;l7*)jLZ`HKgsjL{JD*SR?BY z6Po@)_JfS&dS(?1x)?TAHYOwa%KuX!6Ug%n{F)!;!U~80W#)`Knc04nHOB4o`Tp?% zy$!G9X;^d8H&7HD7i<-DUaB~o!C+YCVFlKV@B|{zMUnX3z3`KN>rPrQb-;N2KrY?F z>}s#TqH82TZ|8AjSariL6MTbleY$$RQJ$ZTFpJoad}u;7n6Jc*4v~*7j*sZ_sr7V) zC%c#^L6DsnQdv#2=Ig10i+)F4>@+yj9QrEjM^O6fm0n zLdY`(s>$G9&6|Ct#BoniEV%;(;)v^-K7gQ&Q^SkCwv7O$3I@f`V5vy;n_n&ig$)uE zU3=Ke5DqEdlj#C?Okb7gk+rqjF1W&IVP2dtlhH@xMfAv}2wO?qduh*;0}V_FRk+(g z0}L6AAANdW#D4p)Bp7;q{f0w65(asG25)I#r7ma*k)fc~;~2=BK%;grqW0!Lju=?^ zGZ0SHE6NqAT$_|sS^N%T4mWCaY^gW-5KBf4?@cPG_xNvAKM`|~Eaf*CZh`-AxAgx& z!G?c>#sB2@RsN|(T?_dJT!VE&`W5WD0o3{IQtCet)W0WHF>DhT3@%&E0!9wV<`U#1 zFqp+xi6s|E#92!}CDK}_-o{(WjRcR z_`DxQ`+(U(|5=FXuM3Md2iI!_R!dN-Fb#1}4};VYSYNAf-gRToEa^pwP77l}p))-m ztP7&mJn84eMxk@wHF$Q#rYm(-%U>a5KJOt@@)Q?<9JBLOugDJFtJn7uGVP$G=3NS% z>O)wg1OK6;c%zP8ZGqmM%z0zvDRk_q#I-4VQ{-puvCw!f{?Pwgai*GxC{vUa$wH*# zP-*YIs!BtCoYE+c(pSk*ldk#I{gM4mM9uD>$MYsRir?>eik z#y~mny^&?bBS7uluQ#5iDAn(}i!3Z|*B417zG=t+0f~zoqAW3xX2@FwULKpe#IGbM zp=5zIVO#A{vKlK5P*&-V=k(kDPqG-tAD^XW2f zKNKu{4zPmA^AE=}#3+BwQj#fwytKG9pHPZ1XJVJD9~DwaP;M+MrYRPuImj!qgzxBv z#aXMh*6qTP5N_O*@nE{Z>>C#@o)k3dtV$YXb~+Mk*JMQ_Y2|Nhw@fY?XQ^Lr=^xQG z0$u4wTg&0X#AZT28lb6|&pm%{yHAjOnolB#D`^(LL+4m`Zh`UD60RlZ&SD#7aloot zNuOc4^7`>`7Ql;@Mi`zyO<*CzOg) zN2Cpv=oXC;s)b3w@iS~!`L4&iwPm5!z?0KE0I#C$G@eKPNsl@0#%m9P3C-XUYSKzI z=cK;)Q1rEdw{%k~NXA!dLsa&5F*b+*=j1j7&iA}vr*~*9O7E&YfA;DNK9i58R^rXsbAC zK+tKRs?vkF_W-5`2lDU-BmJEWf)nf?;iv1|D9yI&Kp)y4J`if3>M)9hlVFGEV@&!2 z%pMWYvW8E2$&bF1rP5Z*JIH-yXYd8jTm`q+nXvVP{Nq07cK_g9ihN}ad}2%RnUfGX zAK73jS3W}Fyao1Rn8uMZWpcx>YMXLWez|bF`Z%pM()#oqHxj$^cb0}IIeKJKUYEAI zsJz{jDfOF&pnR?3KB{|P%390aROHV;9x8+!lSkm3FOmd)o$qQ{f_RU5F;h=_xRSft zs_edK)6r;l@N@)`A|>2nAgDfnqVs&wjTr(MxJG>dNJBj{k`O*oTx-eDiGqvw*J8RO zkk}zaPZ%-?MT#lTG&|#muqveFcOAFmGwdS8G9C48?qx(LgX{YXHv79)UP9nm2tEPd zwql!r5{r59>mS~WKb8p?iaXS|w=@kjv%4aZN6youB0K`3g+a99MuP+P6)?E3SsOHW zv#?rRXp`CTlNB4x&~Ud}?w;0R?*G&WZb5$$VFo>`kPx+#4Z&g%__*2M1I*wO4gO%5 zP>8)@uOHope*&#b+g6}QM@VHw_rzq1>tUyv+7Tn1IX0;XC@P>0WNa?%hD5$d}OR*0p= zvMy?Ze%G=*tF*f>5BwEOe&evWS3N7CdK?1PYj_36(0X~YzE$(Z3U-L(kFa7PB51PF zzw>9Gb&ZMuVe$r2Gly%6m~Mo4E~~F7fXlnhHMM^LT+SPH>P7N^#Nn4>!}a2(S5>J? zewP5;cOx8g&33-)cy%6a2K<05xWkn-#WtZw&9dUJ&e)tu7f_6R@VO_|8>r>2-m!?| z=!^^&j3D;5RGVZFt=%@_BcV?9`{|H5I+H*`5(YH>`Ar%Mgr;P(ivjO-kvW=nIbkeV zfCm0Maip9};T-D|?dvvTtBSw3|NKSJhV!vldVWJKsBfsn`Ckj@?+NziMh1@Gmw%45 z|J%m2FU&w(|pdf;tys~|H=iMNfNKSi1auHN{#OO}~Ka&`&f}w#SzQk2X zY2N`q$@h@U7?uV1s4q`4IJWMci)^mwssSErHGZLDxmh08CW=r5Utl|fuOJ~ndI^iF zShxg8Dzs(PtRoWq!3EQ*vQ}GSn^c$J9RFh=E_k;*ew>94AEhqu)>NEw=CF1XxS@Re z`{$}?HWkft4u!vOpml?VLJ*OGy_2Ns!?TI0=iCy1P(Y-4nK_~CSVhATWVKCS4)c}1T@rB4o2sE6k%H=S} zTjMirN{OeI1suq&#v&M1rOj(hAJ|A+cK=M5AL_MR?27az zm%Nx5viEvLlj*5e2@#VQ-2PeP0+65z^+*mlP(`T4fcfD_o)BXUn$bJ=>Zf*KG+qL8 zI>+KbX<0&Jp~vPxX{ka~5G5}zWTg-PCJbVICtn2wGf^kKSB?$$FB#`29G}(GI$?fuZRBf{b$b8KO3@pPadP4G> zyE6es(Xqum$9lW;w^xv%1P3L%en=t}8T3ul&je^Jt%G5gIWZmgp*$M};w`5iy*vn6 zvv1_+a6FXRJA4|?b$idVH%d8^Ms(K+OxEr3Ogo|758ocGd!p4=P+Q3f*KKF+1{UX` zxipo(E2(>>1DNKOc)_QVwas9R;(O2oezpy2w|Y=c1{y(`SWd)F9EcVQa9pb8Xcp(b zsR2<(!IjqMVn(8?9znjneU@T_OdNz5A7#VRB8iy17U*^B{}OF(dJ$Hb%Dbog733%r ziGv{7h*lr6?40oPiubiGTOF}8;V>4#|wI|xN;ySR}) zk_K27L&y6TgN}YSTYpVs8Bx&2gE@nxaP;BwMFh@Ld>c>SW7v;^A8Fb-7-46}Vu=1c zY@>N_^srSM8LLQhq$>Go|6&7@B8Wp+7V4zYb<_H(l##L!8i!Ewmas~70t zf3Chn^iN8@-K_XgR3mT&63YJMg^{>SqIfRyyA|e1l>9>Q@|4iZiBU=AS z;i*A*DlW8sb&cDbSkuB20)nX#h8vRjBH~*Hg@nZcfc1cfB=3`Aq>KloLcj-7idU*9 zm!W{3X%{wCkwY+qH9A!1mL zSaAS*Ti$GJUxAj2a$kW0+8APs@?{*AW1)@Xg)4a~M&|dR$!SBtk(p-Y9Aj4X4NxT7 zX+wsEW7&Zae}n2C31=pevTE6!8)JPyvYBU+G#YrHIuB9z*Z`#yql2@r^C&IVzC+aH z(XHF8M(NGVOG6eN_%&tZS>YPKMiuNeW~_&mFI~b`Bxd#838S7T0-C5zXG@-@`vIm6 z`1L@ZO1yNXXXrgEm}|VMN&RHS;5@5r?@RdPsaw{~W$ zHP+m7c-~rmt(KgJeI$mA>djz5Y6J6T6b>Exh-QFU!@ z#R8P(|I^u5KvlJMZA-UwH%fPxDBazSbT`u7-QC^Y-Hmj&fOH8WCGj8MtFK=4z26=G z9^;IC7=!gZYpuP{in-=|rVuigP*Q(klx_DJe|429<;MfM9O}1~D<)xmWq>u3t})2W z3B#7+Tzi`MjS7e`?2Bnt@q$v#8jI}%e`>h8FO>DAMH&qjeSUD_SqjVV(+m`p7;uV$ z)y(HkikS_NWChUa!-5yPX-*~2FyeSLEbYBX7BDPAl84IKnAD@VS{5EK>2u5#SbPLZ zbk6FF>l+u5s*00eY)}X_C~Oq!!?YNYJBG8oh*~JW{bW(nM~{xI1q?Ui7~erBx1jT` zzsx}H2DpXWabaSO6Q@L$4|`J^*5?cPG;!>v$^PPoZxgdl*XBdth7ns+?2w#nbNY}P zx@i@^O5p6oY}IUV1v0N$9mSlP;9SaC<()lv+t4LlZ{jUf^J03`vDlOiJJFCkSd))< zyQE4tQ-|KxTgvzyi@fUwJu}GXH=`hLs;XeHGd~8ejw(_RXxD)eW6Dz!1{txn9>Wq> zZqep52GsUn@GOGRxKl29hkCUr5!LDdR8&S<0%?sa7Wr)}S$2+&>HYXL9XS}NUJ%8- z9=sLU-!NlFbVzFoZfcyBaMGZ*J9nL%C^n?zV&N=q=9G)t-hoTVjgD1eHe1qmvK{6I z2lh%87M&44nC^jG;h`^-Wv1MM!m&Q!`e)LREP#Xl9A; zAa^Ps?g87NfwiOw2GffgUw^B1$WpJlY3&n(V4QR0U~S=*3Am#sC!iGyCv=n)+UuW)?`_Kl;_ zyHjgXRqG?&f-tXDA04zWlYOn1aS8&9o)Dxnvceoaq)qXqh>;^LxOs8Kj2LNpcQk#J zDM!x;flL4>vccuDa~Q1pJanTJN4_>!nFnXiKx9jv9{dEQDwsfoA$&NyYU3! zNp}EVM&x5@B+~YfP^?oXNAy#cJwoT$BFDm*w+M!MmHn&WT4PFq2reIM z5{jG$k;m(D<7P7^uSI<-Hr=qa%s(-=u74Omuk&nNsbsjeb;ae)te*OCcmtk4OvpM) z)u>-Fz6DxXy5hJWJ-Q9PJ~)r*io9<2iTV!A$8vkwQ=fPQDerk-w2D6X`j{3yAI3qVBA5 zk-EUIUy6v1A{g!#?0)J)L9eIOXGEWj4N@lexy+1DGCnRg@dfY*J}$(Yt&B*F*(zR! zJvChe*Q!2Wui4EQ_?(LHy<*8|;=#b*&|gvTe{`RLn3y${ zZdp*>;k*-L_KeW)HaB)QckCTYF$v?jU57P`7a45lNWn{wUBk4PubC0`bcXWvU0B{} z%3uSnw_#7W4O6F#h{Cz2t$WG@gc7g7jA2C^4JP>b@c|Ntz38^uT)hwSGCnEj;Dv(- zmO6h$Z|P{ou~(+8`~_<789ORnaQ({!4!Dz48O!cmOlB)33@ zt>CiK4UQwP$Sx}~u&nI18IJnbxaTz6LVDUL7=_t*sr?DD>7}n=({kBRllq(159n*$ zF#5(O=KHcvTWn`6{Cx7bM^Ws{w>u}OzA%&@`uPX}bsigJcP*vKN3ayawaI+Z6&EQ| z^U|2mwzrJKc7B!AOpg}V7+an&h}|1b!x%kCDBJ`CN(rHIoY4^E-_zKnk%}#DXD-2( zr6ylJRkwmiIGL8!O-w^^$H;0n-;fwJW}u_@g@n-sL+K&40FD~RyvlxLbsZ*7F*ri0 zxg?*GN>*j4c4d?~!~WED*Gg2KfK|7nh^F2XQE82od?dF}s(vU9<(vw^=5v@Xswk z<Zf}auN_~sd>S%ouuOxBH?dL{AgdImSp&`Q?HGD?o5Qcn-=JcPPP&7f_vM2 z_@>bObNsKwdLK{;7(x9#zr3H14zft%LNIHe6IKG24YRHxk$kV+U;Y`q@{`<9GVVbSRB6WTj%ZAR=yXvn90QhrVBMK}`tCu&gUNgG#m zZ#CRBQA5fHU30wW9{Z~z@Hzo*7YJ^cw)GQE!4%4h?xBL06NLp+X7{44vzVpc#)>@7 ziFjRi+7|+c6(1h?F36mGi*}#gkl~xP-pfzSNadsqrxQ!zqcVJ%B5z~LZ_fx$9;Rqa z=x2$&nq*VAZY8wD4>RN#v=pK3y?B=_y;TBxtbhq; z$AwOPg|7fN7b+9>hWk}rK>qAC-veIqb8jw!#4JbyKUXj@=e-M)4ha>|;3VD>zgh%$ zCt5jEvC2JlDhh=VNx53h3_j?3!i+Z(tlN-rxY>^nu$FODwH{LmUyVd`m=e6tRc26yA^+)~S z!}s|4n0!OT{LMCtcm6&2^Ww`uq-BytWMV|*NT&01HYRSW zi;AR6X{-oyI=wjFG@ltwvtvKaqr3)R>WP@pbcgMTn0l?gU$LQN{HB9%{w%oMG7 z^UVbHolx3Dh@vfbF@<18+aYOx*Fe}su12*l)#(Oh!w)V{EE==reZIrPaH0eC2^ur6hbT>vRnRQ zVycJqH5qo`P*Eid&=7FtsNRA;%aVzsHuYU4kb66*dy5i~4Z>%?a3wqbbJogX5Hi{< zOYeTM9Aogi&wzzCOmM8W8`3=_hy1CArH%?BPJmsRpwU zM@1j}iP-g%0)5~IL!j5DKqVt7p5E`;?CkmUv9!J#fr(E_?RMJj&N))XF`Ia5hjXn( zr|TkgjPAVBu0b+GK_c23m!fZaCay?W!<-^Uhho=Qnvf1M+3YD?cjcap1>LAEjz84P;H4F86BE4=*bt%rnv_TgDD; z{|*UOw0UUCHg`JM)mv(Iz(}JGeuGeq2CFrfu}!Z{ISVk~Y@2+RqlBitZ0DAcfX&15SAON{z@=w?Yq`N(CO|^cl&JPT+Mev3xNrLTCH??*|XQu7O1Vq zaLVDD>Xv4H@~SaxZCm34Z=Lte2cIY)R$T7BPw}3p8enhZBjI#Th4#%q z%~gIqzA$%&*th|bfLP!PT3jcp?I=+!^(qxYIB_o~#LjkISeE`!aHbcBCIl2_?)mj} z(gi~eCfr2anB!A=ZR#74!X=k`99@$VM=PtZl%}-dZV&^PGOZF)Sf5ef{)w|_*BaLjHc$Lxd5IpkxO`QdCtDlvj`7} z3D;+tH&XK6kAB0)^R?cu<=2#Mdf@XsLc9$FsXnd@HF9fhZQs0>m8xqPVxSk!Q(a*LBAIw?bOU2fP-mBfnEk&E)=eh6TLRZmo7jH^He5IqXG z5?inYo05|7bOC|-S-aLVxtVUTqMF-LD!3iT>D!{6>1Fj;ASfg*?127r+MzdR9a|1wgQ#r?-^dEl`D`*05&n=Eh~#+w@^HY+=j zUd9!2h#%Q5sFmKq6nD0q*+Jm!#kGbjVUTEc5Pm1T{;P(Poa!iVdI{%o_N$e3_T4qx z<&2K@`)AVq!QiOVSk;O9q#{c6C4^y4a3pB*u?kcS9}nDXhPX;L9a(xD`_SQP2phMT z3|8O0CsnUCGkv#i=tpQfa+dmmrRSqv^;hvY!nOl7P+H-hTl*S=kb>5oX#K{``6jjP z?kHzHaR@cZ5JHb#{kI_lmcRp7xy?IH^~&#@O7vq)@IrAyFi8kWHV?@Ubz(Xy7O{cQ zd6oz17&M&v)@`P@HG5VdeYcnu4OlQ`)tU5cG-6;u+R^z68@uUd;+JKN88We0Tq0e1 zMQO4_sIS%|&c|=onosYGNUoH?9b9JPacJ>G`V_$FN^v(5V}`aXQDf7NhMyn(sTK%IKH28EHe_zX)h`)fmaaPYx#b-{!w%JgwX9`0SjzwxBJ?(EkpV^<24M z!oNxP3qjA3b$y2R+4U+9E1Q!NW`48eMdfD-;v0I`z1hRZEbYy*>xzB*zC7&r)Q1m} z1deen%a?@sUKFAieeZeeA1jZ@qi-_@U%wc6W(+SPXY_vG3_jSxmB%DO9?a(gk3U#( zZerkIBGC_cQE>T$Y!ehg6lr9SJtzvYnLp=3Ru-SL6!s%AARTnrk##D_Y#MFiDj>LCU}EDB zrKds}Upz->YHlNg_8RZ(Bq|~_V=|1Zauo!#Jy1V!--@9T#Udq^gbvfdj$NHyfD~-c zPLcu^Hfr7&Ydm)wexef$ON=QyG0!8@i`}T>i94mxq`^@%;GIteoE-eCcmA)}{jURq z?~WL9$CBS1kf-76W9u}A6UdUi6_%*=$u~&@`>~K;03pMIKf)a=$D28%toH5YT!TKu z@e@q;LVU^!b;zgWT?W0j-Cg6fJ>l9Ndw=@ojXO}`<|09PW-N(reiV<2zb(1^RANA$ zHX$6GzH#vsRlb!{y2g~1Ru70j+f@o|Qytesl-hHLlsSXFWeeLR?M~Bx`rYUnofiAX zVLG)VuK5&lbNZJintXJ6^JYq=rw#VLkMXB$y!Ph@D~p@$)LUdpkPgS5JnPbMocd(0 z+s)k-?5`j}k5x_6*K3nsTe5W*bJi<-R;4~+(Fia2IBYPYcA~ zXAJ8a*Fax(2T1$OOkL>s%qwItdcvhHfW>O;7j+Bs_u~dfl1=%yfLw}L zFwdTG{ywb#kZbujC!S@BY7STmC=btJ#Tk-zyt9}|%0ysMf#J&Pjj5SLr)S;{2^0kx zQ`&n%C7~Et83gh_`ka<;yJ#K4n5&B^W!&RFJb#zrMW9!ir_#Ntez|CPYU%Mc)$Mw# zLdyff3ha$ATfj0=JaK9t?pmpEV~7-SDbZ*_#@Qqn6lST2@<2ZV%h?S=J9j+m6~w1J zQ22WAN-ke(*FI9tRwsf@!u3bt-gzP$*oWMF(@P{DR-8p0g!r)RVY=u^yLWAhLnS+I z#9AaG1iC1(=kYowu4_opm+1!d>f;y&X_18qDO#7gF+N6eQH-%Jg$& zWiE(VTg>(#UdoSx_9%;RDRQh7E+uC%h6cPya@*z(Naa*ofoCL~_@*1ihWGP=q)i(rrqk==%e{udWrhd}q3&k-B!xS2f z1T=<4%LE%q2yP3K1cOPvVt57lEdR&eR0btxGAJqu5$9|?3-aycX4#75Vtw{V;I@Se zBimlPfFdSh{wg@U&;{831H>?FTpxLJ!zBFFn7uK3{M4RaSbapBD?32g$q2FX09ko1)g0VC;!D(PV}X5}a)FICGA-H$61E zHI-1f`bZ&S>)W-@jGu)x|vJLySt0;g;#A z(vqp7%?7_u^vo0#T>KiqkQ4* z#Nkyyp@wpaO?NzZG9j9jrz$Xed>Ler=&n(hWrOX$Hzt{z0SM^a8kkjDlPlF#=HFLu zr0wacEh+g(j;xj&pOGmPOyKz!>j1yvXgT2Q-_D>Oz{gzyHrxR3?T&oh-I~hLryddx-MPE3( z3GzEn%W^zFH$H;|riGJyGksv_B*k&6U9Mj%x}h&p)G**M||7cB6@09MWq8ToBETXMG$aWYX>eQdiULP2bDW zRvs-7FDSx2WIWbSil+Og=v9UvyACtkxnsQ-AQ6#adb#Nxw?fR2EYmIlMA-n<4L|Xg89k3J;Ukf;@s+ z-C^vC5+a(%q=}jBF6uH1d34zVvw;PJ(4Z|ws1v7m>_^Ia-97)F1Cn{u{0S|Ff$c8} zEt78*HDt}1xU|*eX^gEb<*=mb5@}Nt`0*qW_*1#O?2=Qt&|5oIlV=Yp!zWFwM&#&X z-$X=*$CSbiJ%~x!1Tb%di4q)D{<{u^!ZXd&+z^80xQG6hMWRYxyc zkGgR*R)Ub#1)6ecA4cN1_7}~r3e(a}U*QylPGZXzI2eNV*z|eXsnT!>WJ?=G_#0L4 z4pJf#iL#iBpZZ`PQ4$Hd<4;QQP#4CZQ^ALg67(6+^H#xb7y2IwWZu7IChB#9$^rTe zeS?I`nBT#DGqDlEQ?5`ILOQn*w82m=oxVZQ51h^gTPq{5#hA^{%pLE>cZACTA?=Vy z$~fb6$0Z9Pd<0&8S(Q^H0$v};rgktzZEqLiWdSz}D8 zCLJeYf)=chAQzTF0fvTJYuIl#6Jf1hjeTH&e|Y8*+bEF*8pDeopXO9^+NQm;dv%E2 z$u)*+hntF&`ce+294>1erogQ0E|z?w1EYMAZJP(m1y{;R2e<+nkt1Tn*8?l5sL6-X z8(SnRafq38WflrvR9UZ9o(Kcn8prVxDcwao-;b6lC3i(icE5w3Yd1!QC54_DDsQQ& z<`6fRrM*0@KLABwSqW7qNY-et(}nZ`+`7Z$RcV@R>^8@S6hqxDz!Q7Y8A^SeTwDarBb8(7-t3mV(l+R44s`QHD3?SA_d&E)`D zH{30%t*mQ|gyG`q7leJdH6eLQxDj9wBawp4V_6m&B$TIT_2w7NiaoO4WIc9|)%wI2 zU8))0<~`=T$)2`#(1j$a?6S_+IvHsK#H}}tr@LG}d^xqGeU@vj)vxkCE!#j-5W^M+ z6B7wdpX!6^GqJ|8v!FyO+fv8{I7|jb_Brs%F>ASg@YiwlffC`Vp$PSC=Qs_Rx5uYn zobCLzsSH))q#0XXR9C6y?HJQ!R`d6iUifFnMVY{4HqdOQoE9w1n7pR$0^y zOj3A;lUuNQFtry}e7*vfyaO*G*9LCE zj%N}>u^wuz&eD_!E93I&i{tRp&0Xld=JJ3<2@B?1EPU2Ol-MphwVni6tkmE@q zF&H`>iL%=W!W)jxY6asNrXEc<*}3G52i|G@+$6LiiVY%*F#(ePL*!}LE}y&i33x{O zDO;Ri6rw~rNgKtxQ7jQ`6INGX8wm$JajYc}Z3s4eG;b8CkLj{<&Z#5G7eFPYj^B!g=i@}j27*5pT1eb#VX6{AbdvQ<;9hAgaIqykXKm>yGN*T;o_DRd_t(L9=-@e zs*>x%ywBb16!R8&yvywx1O#R(@Pc%z{ANZ9@|cgN-xwWqJFI%p(&*^Xr=WZ2#SRz^ z?S>}BLTR>icU{!2UDf*nW-21>4foky)2U<*28hqpHMvtY`^XOvaXcMq3<>diU>XG) z>Aqx$ympniXN|tY|N9sc^Ncg;n;Z2VV2oz}eT@r4re zy81bjS%DR1US$4WKlDg6bXi*IefMO%>8O{;B-6ZWqDtN{fba|?Qe%W7o?ewy#?RxA zqp3};9cFl#-a3ztM+Ss5mkjaN#8(l6 zT{vuFWlwEGIQS@(nIwBlQ!70?WinuvYr$|ijZ~jALTD3Awjr+w5n_UCoHWm13x(J> zvC0tzBLg#I>+3*Ux(zi7Wdia~Mc4^S1UT2TM|wNeSJ%5MyO5FFT8Y19)u*Wh6;q^w zyOvjW9Lf&<(h+OG4kvIabYfnfmt4&1MM6>uZQ>z>dp&QO^g|cq$$LDiz?( zk-EI@;r;+@^=v>8Yng>%VJzEZ3)7xzhMEa7Nh$pzd)`;R&6<~vvulF5)Shb}Pc!su z`7PP)YZuYgw*+^{S+C5cQVr~O{Crocq_aw#qXHL_9trYFINBlk65!QVxx-SUkoeZ$ zfw%A4d7mi{W|c>NR4ABQ_U%@7-ET1~+S`-+2o_zbd72&~wsFlHo~oJqirs`&5=w=( z61|@`If0 zwG%HrrAui2IgAd?u`@D|iyx6CDqXt#uo_Rf+OETr65}n%;9*p}6+DnxF4ZJpT%3+_ zjIsn4)bhDbPS!ocZ+A}!h+381&wb1KMpwz=&3s%iLX52PX|41Ty;U|kC_(O(=`J80 zp&S-$l+Oht*Y1I~uqnaK9t>(@h6k(CrGS;ofk_y7=)ozf#JQJJ^^Nun$iLw3%&XC* z(7zW%itg-P!aDK7u)>Ac`4B+Hrxh+Vf0SG`dTMUKDfgbti^^zlRAf^uzCX7t>Ek&{ z#szZ*Q+g&+0aw^ogH?h)Ci&|k?Y>&}9RIIW_%-~5U(x^mS_#%eUU30d8^ch4v_Jm- zTK(r(>3=LX4rQmM5gsJfAaj94!FoA$^fRez!4NAQ$rWg1$&>{qwX%A#$e?1t&rn^T zt%DfaNhev~?S@8d^0A$WK%u)92S?Rf~&Pc)Andr$0+%Mp0E#({d6&Mdvm~JM;a)y^+cp_~oO#P+dV2KlP z^k_*`ZhIA>X$iT49GYHECWdu2o)YtH>j2&Cq1i))AF(ENRR}=#*)jUIxO<`-?6Vp+ zW$>B2=1@#;##D`sy9kSXJ1sQViiUrEuc;h8i9*g>gL=i_NZ6^+d~!hsT6Ab=l`ytj z47TS1n->P~)Da>QPA_34n&av9d&Di1i_4*e8EThW-B8ITx}6tORAbhMqgqS1i7=<7 z>(pD-r*@B=Fj;Os#E0QXsbk`~v9DH>7KrkSq3h4Kx0xfOe~JWxJv2PuNb3nv>DzEd z-xdp{^?~(L9itD#bQ>9@h@q%R3};9IO2>n8PmTG&SK=vzL_$yeR<#=zkI{}@-$(oX zWR&4jbH1hNKrFW*ah$JM<9pncoTYcIZ|i|wg@^?_!kG2vVc*H^$G0$#CouJVDq1Rz zPdvg#Uaro<2`h@$`Sj6^cl$(LKp~`)C7UCrMkP-gGE}fgG{D3t^mPkkgE%vOQVi?O z3>#7A^D%M~KB@gk;fhjn728L%BH>Qpu;Le4ZEq}EQ+YV!$C6Z29P0CBlqi=@f%>)A z?af2Rr&Au~=TZ5DgZ7h+H4xTG%g0?UIM6Y|2kS~K$2g6fyPikvs*5nSHTs|nlp|@G zZj)Y|Q0hXgOjMt8Yy``$m-E#D1TLiYSCBIm&Fd2Ui23?L7aJ_ORXgguQ~c? z3Hgix5Q_!i{jcymV08F?Av`A3{BJP{9!U{F0XcaZ3Bjib-wFU`y8m2&+3x#=@a&!^8Swp^BGEsU0BoCnDbfDD z#COH~e<}!24gICy{@)9JPk-t#IXdyYvoiw7&l>Cg)K-4VxO=2* zTMVFC27HKq&;jnXUXFk|{DD#AM;rdyWIn|MEplE}2h>#tP@4L0csc-E@gMMnY_#>v z^c4UK@WPhn`r?+Brthr&42`p?vD^m$xdptX-wuR-T(w?Mkbi^*$nKiGvjqf^2^yQ} z^XTg8+uBNKTWA~pNOthF?z$CT&2Is9M*!IK{$6+d=YJ$nveC8z#3BMr9R|jR?*Izc z05$hN*ImX9*LWMyC76J^)BUJ8;9l!B43HN1L$^GAp2C294QBtV;$t?4!KeV&5DP#x zzlAORxN5!bQU8ekw=8OZuJQHiR?sH^UK#M%raIf`J#Qh^CAZX7{+sy3GXsey# zLA`+X#{tHYzjv)K;QZhZ?dP?$wELEID0bNnf4cz5h4A^@r%0F~kgB;XGCX#?yse?a}~J^qgU ztJy&y{EnLG#%SdmIKK@ zvi$QP@ifcKPdFXL|IT;c$IL&@dB4{0TjcQ5EHOU;KLY^&SI(HHDBnr}e*XWtz9n1v z>-skJoGbmUmEVM4o)&(ZdgVv)S}#K7-wOXY+5csQ{ls4S6#i*Cji2zPs=vYi0{eYG zNdNoW_^scbCa(C2nyB_KQ2!x~#nbvfO%U*tDOvMhF#YP=18AMqujvAwQa#mY|4HSq z{ZCZ?L#_QO{8ORvpYS-k{{;X2N&J)S_*1HG_Pa39Q_QD=2R|{_J%7ji_wol%d7cL0|KzFh{*CAN!Q)?rQ`_(V z=KS+;_0$daC+1DU|Bd1IBcK$X4{N7Q&j#7Va!BdZ~p9B+W zzY+YHCH{@A_GwF=dT9J43d;VC=(pGPpMGvnPrZL4N96s6{J;9>&u8FI8}anC@h6pc z;XhIRA9Lx`L$;r=n??Tw`+dOphaprcIy7SF#KPJ5NRtH_{|AO|Su+3t literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..cf497ceec --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Jun 16 01:35:27 CDT 2015 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip diff --git a/gradlew b/gradlew new file mode 100755 index 000000000..91a7e269e --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..aec99730b --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..553c1b13b --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'asterisk-java' From 73a97e34a358afb34c58f9b1bb8281aaefa3979b Mon Sep 17 00:00:00 2001 From: Michael Rice Date: Tue, 16 Jun 2015 02:13:23 -0500 Subject: [PATCH 0158/1055] added support for travis-ci to run tests --- .travis.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..366fe82b8 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: java + +jdk: +- oraclejdk7 +- oraclejdk8 +- openjdk7 + +script: +- ./gradlew test + +install: +- /bin/true + From 1ff56f83d1f353b5e9427cf1218fcb06963eb948 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Wed, 24 Jun 2015 18:37:04 +0300 Subject: [PATCH 0159/1055] StatusEvent: add new properties --- .../manager/event/StatusEvent.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java index ad34f4daf..1e96ae288 100644 --- a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java @@ -41,6 +41,18 @@ public class StatusEvent extends ResponseEvent private String bridgedChannel; private String bridgedUniqueId; private String uniqueId; + private String linkedId; + private String data; + private String readFormat; + private String writeFormat; + private String type; + private String effectiveConnectedLineName; + private String effectiveConnectedLineNum; + private String application; + private String callGroup; + private String nativeFormats; + private String pickupGroup; + private String timeToHangup; private Map variables; public StatusEvent(Object source) @@ -397,4 +409,123 @@ public void setVariables(Map variables) this.variables = variables; } + public String getLinkedId() + { + return linkedId; + } + + public void setLinkedId(String linkedId) + { + this.linkedId = linkedId; + } + + public String getData() + { + return data; + } + + public void setData(String data) + { + this.data = data; + } + + public String getReadFormat() + { + return readFormat; + } + + public void setReadFormat(String readFormat) + { + this.readFormat = readFormat; + } + + public String getWriteFormat() + { + return writeFormat; + } + + public void setWriteFormat(String writeFormat) + { + this.writeFormat = writeFormat; + } + + public String getType() + { + return type; + } + + public void setType(String type) + { + this.type = type; + } + + public String getEffectiveConnectedLineName() + { + return effectiveConnectedLineName; + } + + public void setEffectiveConnectedLineName(String effectiveConnectedLineName) + { + this.effectiveConnectedLineName = effectiveConnectedLineName; + } + + public String getEffectiveConnectedLineNum() + { + return effectiveConnectedLineNum; + } + + public void setEffectiveConnectedLineNum(String effectiveConnectedLineNum) + { + this.effectiveConnectedLineNum = effectiveConnectedLineNum; + } + + public String getApplication() + { + return application; + } + + public void setApplication(String application) + { + this.application = application; + } + + public String getCallGroup() + { + return callGroup; + } + + public void setCallGroup(String callGroup) + { + this.callGroup = callGroup; + } + + public String getNativeFormats() + { + return nativeFormats; + } + + public void setNativeFormats(String nativeFormats) + { + this.nativeFormats = nativeFormats; + } + + public String getPickupGroup() + { + return pickupGroup; + } + + public void setPickupGroup(String pickupGroup) + { + this.pickupGroup = pickupGroup; + } + + public String getTimeToHangup() + { + return timeToHangup; + } + + public void setTimeToHangup(String timeToHangup) + { + this.timeToHangup = timeToHangup; + } } From 0f1144b16b017440f8cafb64c7a852b612f68dc9 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Thu, 25 Jun 2015 18:39:09 +0300 Subject: [PATCH 0160/1055] InvalidPasswordEvent: accountId is a string --- .../asteriskjava/manager/event/InvalidPasswordEvent.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java index 4637e83d7..e478e3544 100644 --- a/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/InvalidPasswordEvent.java @@ -1,7 +1,5 @@ package org.asteriskjava.manager.event; -import java.math.BigInteger; - /** * Created by Alexander Polakov on 1/23/15. */ @@ -17,7 +15,7 @@ public class InvalidPasswordEvent extends ManagerEvent private String sessionid; private String receivedHash; private String localaddress; - private BigInteger accountId; + private String accountId; private String receivedChallenge; private String service; private String remoteAddress; @@ -88,12 +86,12 @@ public void setLocaladdress(String localaddress) this.localaddress = localaddress; } - public BigInteger getAccountId() + public String getAccountId() { return accountId; } - public void setAccountId(BigInteger accountId) + public void setAccountId(String accountId) { this.accountId = accountId; } From 88c917edf987336e245f95e835b395d019cf0455 Mon Sep 17 00:00:00 2001 From: enro Date: Fri, 26 Jun 2015 12:19:46 +0200 Subject: [PATCH 0161/1055] ManagerEvent getters and setters final to prevent useless overrides --- .../manager/event/AbstractBridgeEvent.java | 13 --- .../event/AbstractChannelStateEvent.java | 72 +-------------- .../event/AbstractParkedCallEvent.java | 42 --------- .../manager/event/ConfbridgeListEvent.java | 21 ----- .../manager/event/CoreShowChannelEvent.java | 48 ---------- .../manager/event/DahdiShowChannelsEvent.java | 19 ---- .../asteriskjava/manager/event/DialEvent.java | 16 +--- .../manager/event/DongleDeviceEntryEvent.java | 22 ----- .../manager/event/ExtensionStatusEvent.java | 34 ------- .../manager/event/FaxReceivedEvent.java | 22 ----- .../manager/event/FaxStatusEvent.java | 35 -------- .../asteriskjava/manager/event/JoinEvent.java | 43 --------- .../manager/event/ListDialplanEvent.java | 27 ------ .../manager/event/ManagerEvent.java | 66 +++++++------- .../manager/event/NewExtenEvent.java | 34 ------- .../manager/event/OriginateResponseEvent.java | 70 --------------- .../manager/event/ReceiveFaxEvent.java | 22 ----- .../manager/event/SendFaxEvent.java | 38 -------- .../manager/event/SendFaxStatusEvent.java | 38 -------- .../manager/event/SkypeLicenseEvent.java | 21 ----- .../manager/event/StatusEvent.java | 88 ------------------- .../manager/event/ZapShowChannelsEvent.java | 16 ---- 22 files changed, 39 insertions(+), 768 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java index 437bb235e..017cf878f 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractBridgeEvent.java @@ -10,7 +10,6 @@ public abstract class AbstractBridgeEvent extends ManagerEvent */ private static final long serialVersionUID = 1L; private String bridgeUniqueId; - private String privilege; private String bridgeType; private Integer bridgeNumChannels; private String bridgeCreator; @@ -32,18 +31,6 @@ public void setBridgeUniqueId(String bridgeUniqueId) this.bridgeUniqueId = bridgeUniqueId; } - @Override - public String getPrivilege() - { - return privilege; - } - - @Override - public void setPrivilege(String privilege) - { - this.privilege = privilege; - } - public String getBridgeType() { return bridgeType; diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java index 367464052..9ce3f7289 100755 --- a/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractChannelStateEvent.java @@ -32,79 +32,11 @@ public abstract class AbstractChannelStateEvent extends AbstractChannelEvent */ static final long serialVersionUID = 0L; - private Integer channelState; - private String channelStateDesc; - protected AbstractChannelStateEvent(Object source) { super(source); } - /** - * Returns the new state of the channel. - *

- * For Asterisk versions prior to 1.6 (that do not send the numeric value) - * it is derived from the descriptive text. - * - * @return the new state of the channel. - * @since 1.0.0 - */ - @Override - public Integer getChannelState() - { - return channelState == null ? AstState.str2state(channelStateDesc) : channelState; - } - - /** - * Sets the new state of the channel. - * - * @param channelState the new state of the channel. - * @since 1.0.0 - */ - @Override - public void setChannelState(Integer channelState) - { - this.channelState = channelState; - } - - /** - * Returns the new state of the channel as a descriptive text. - *

- * The following states are used: - *

- *

    - *
  • Down
  • - *
  • Rsrvd
  • - *
  • OffHook
  • - *
  • Dialing
  • - *
  • Ring
  • - *
  • Ringing
  • - *
  • Up
  • - *
  • Busy
  • - *
  • Dialing Offhook (since Asterik 1.6)
  • - *
  • Pre-ring (since Asterik 1.6)
  • - *
- * - * @return the new state of the channel as a descriptive text. - * @since 1.0.0 - */ - public String getChannelStateDesc() - { - return channelStateDesc; - } - - /** - * Sets the new state of the channel as a descriptive text. - * - * @param channelStateDesc the new state of the channel as a descriptive - * text. - * @since 1.0.0 - */ - public void setChannelStateDesc(String channelStateDesc) - { - this.channelStateDesc = channelStateDesc; - } - /** * Returns the new state of the channel as a descriptive text.
* This is an alias for {@link #getChannelStateDesc()}. @@ -117,7 +49,7 @@ public void setChannelStateDesc(String channelStateDesc) @Deprecated public String getState() { - return channelStateDesc; + return getChannelStateDesc(); } /** @@ -129,6 +61,6 @@ public String getState() */ public void setState(String state) { - this.channelStateDesc = state; + setChannelStateDesc(state); } } diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java index a81d09a55..33648021f 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractParkedCallEvent.java @@ -97,24 +97,6 @@ public void setParkingLot(String parkingLot) this.parkingLot = parkingLot; } - /** - * Returns the Caller*ID number of the parked channel. - * - * @return the Caller*ID number of the parked channel. - * @since 1.0.0 - */ - @Override - public String getCallerIdNum() - { - return getParkeeCallerIDNum(); - } - - @Override - public void setCallerIdNum(String callerIdNum) - { - this.setParkeeCallerIDNum(callerIdNum); - } - /** * Returns the unique id of the parked channel. *

@@ -341,28 +323,4 @@ public void setCallerId(String callerId) { setParkeeCallerIDNum(callerId); } - - @Deprecated - public String getCallerIdName() - { - return getParkeeCallerIDName(); - } - - @Deprecated - public void setCallerIdName(String callerIdName) - { - setParkeeCallerIDName(callerIdName); - } - - @Deprecated - public String getExten() - { - return getParkingSpace(); - } - - @Deprecated - public void setExten(String exten) - { - setParkingSpace(exten); - } } diff --git a/src/main/java/org/asteriskjava/manager/event/ConfbridgeListEvent.java b/src/main/java/org/asteriskjava/manager/event/ConfbridgeListEvent.java index 64a0928bd..e530b33bc 100644 --- a/src/main/java/org/asteriskjava/manager/event/ConfbridgeListEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ConfbridgeListEvent.java @@ -15,7 +15,6 @@ public class ConfbridgeListEvent extends ResponseEvent private String conference; private String callerIDnum; - private String callerIdName; private Boolean admin; private Boolean markedUser; private String channel; @@ -65,26 +64,6 @@ public String getCallerIDnum() return callerIDnum; } - /** - * Sets the Caller*ID Name of the channel in the list of the conference. - * - * @param callerIdName the Caller*ID Name of the channel in the list of the conference. - */ - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } - - /** - * Returns the Caller*ID Name of the channel in the list of the conference. - * - * @return the Caller*ID Name of the channel in the list of the conference. - */ - public String getCallerIdName() - { - return callerIdName; - } - /** * Sets the role of the caller in the list admin = yes or no of the conference. * diff --git a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java index e431286ca..731e984e7 100644 --- a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java @@ -34,12 +34,9 @@ public class CoreShowChannelEvent extends ResponseEvent private String uniqueid; private String channel; - private String context; private String extension; - private String channelstatedesc; private String application; private String applicationdata; - private String calleridnum; private String duration; private String accountcode; private String bridgedChannel; @@ -132,21 +129,6 @@ public void setBridgeduniqueid(String bridgeduniqueid) this.bridgeduniqueid = bridgeduniqueid; } - /** - * Returns the CallerID - * - * @return callerid - */ - public String getCalleridnum() - { - return calleridnum; - } - - public void setCalleridnum(String calleridnum) - { - this.calleridnum = calleridnum; - } - /** * Returns the Originate Channel name * @@ -162,36 +144,6 @@ public void setChannel(String channel) this.channel = channel; } - /** - * Returns the Channel state description (RING,...) - * - * @return description - */ - public String getChannelstatedesc() - { - return channelstatedesc; - } - - public void setChannelstatedesc(String channelstatedesc) - { - this.channelstatedesc = channelstatedesc; - } - - /** - * Returns the Context the channel is - * - * @return context - */ - public String getContext() - { - return context; - } - - public void setContext(String context) - { - this.context = context; - } - /** * Returns the duration of the call * diff --git a/src/main/java/org/asteriskjava/manager/event/DahdiShowChannelsEvent.java b/src/main/java/org/asteriskjava/manager/event/DahdiShowChannelsEvent.java index 344fb3d70..e878df7b6 100644 --- a/src/main/java/org/asteriskjava/manager/event/DahdiShowChannelsEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DahdiShowChannelsEvent.java @@ -34,7 +34,6 @@ public class DahdiShowChannelsEvent extends ResponseEvent private Integer Dahdichannel; private String signalling; private String signallingcode; - private String context; private Boolean dnd; private String alarm; private String uniqueid; @@ -135,24 +134,6 @@ public void setSignalling(String signalling) this.signalling = signalling; } - - - /** - * Returns the context of this Dahdi channel as defined in chan_Dahdi.conf. - */ - public String getContext() - { - return context; - } - - /** - * Sets the context of this Dahdi channel. - */ - public void setContext(String context) - { - this.context = context; - } - /** * Returns whether dnd (do not disturb) is enabled for this Dahdi channel. * diff --git a/src/main/java/org/asteriskjava/manager/event/DialEvent.java b/src/main/java/org/asteriskjava/manager/event/DialEvent.java index 348129141..7c1c7f0b6 100644 --- a/src/main/java/org/asteriskjava/manager/event/DialEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DialEvent.java @@ -77,16 +77,6 @@ public class DialEvent extends ManagerEvent private String destCallerIdName; private String destCallerIdNum; - /** - * The new Caller*ID. - */ - private String callerIdNum; - - /** - * The new Caller*ID Name. - */ - private String callerIdName; - /** * The unique id of the source channel. */ @@ -234,17 +224,19 @@ public void setDestChannel(String destination) @Deprecated public String getCallerId() { - return callerIdNum; + return getCallerIdNum(); } /** * Sets the caller*ID. * * @param callerId the caller*ID. + * @deprecated as of 1.0.0, use {@link #setCallerIdNum()} instead. */ + @Deprecated public void setCallerId(String callerId) { - this.callerIdNum = callerId; + setCallerIdNum(callerId); } /** diff --git a/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java b/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java index d8677dc18..4a9570835 100644 --- a/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java @@ -13,8 +13,6 @@ public class DongleDeviceEntryEvent extends ResponseEvent private String IMEISetting; private String IMSISetting; private String ChannelLanguage; - private String Context; - private String Exten; private String Group; private String RXGain; private String TXGain; @@ -132,26 +130,6 @@ public void setChannelLanguage(String ChannelLanguage) this.ChannelLanguage = ChannelLanguage; } - public String getContext() - { - return Context; - } - - public void setContext(String Context) - { - this.Context = Context; - } - - public String getExten() - { - return Exten; - } - - public void setExten(String Exten) - { - this.Exten = Exten; - } - public String getGroup() { return Group; diff --git a/src/main/java/org/asteriskjava/manager/event/ExtensionStatusEvent.java b/src/main/java/org/asteriskjava/manager/event/ExtensionStatusEvent.java index a9aac2e8a..c0a505cac 100644 --- a/src/main/java/org/asteriskjava/manager/event/ExtensionStatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ExtensionStatusEvent.java @@ -65,8 +65,6 @@ public class ExtensionStatusEvent extends ManagerEvent */ public static final int RINGING = 1 << 3; - private String exten; - private String context; private String hint; private Integer status; private String callerId; @@ -76,38 +74,6 @@ public ExtensionStatusEvent(Object source) super(source); } - /** - * Returns the extension. - */ - public String getExten() - { - return exten; - } - - /** - * Sets the extension. - */ - public void setExten(String exten) - { - this.exten = exten; - } - - /** - * Returns the context of the extension. - */ - public String getContext() - { - return context; - } - - /** - * Sets the context of the extension. - */ - public void setContext(String context) - { - this.context = context; - } - /** * Returns the hint assigned to the extension. The hint is used to map a channel (e.g. "SIP/123") to an * extension (e.g. "123").

diff --git a/src/main/java/org/asteriskjava/manager/event/FaxReceivedEvent.java b/src/main/java/org/asteriskjava/manager/event/FaxReceivedEvent.java index fdc05551a..4d3ae442e 100644 --- a/src/main/java/org/asteriskjava/manager/event/FaxReceivedEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/FaxReceivedEvent.java @@ -36,7 +36,6 @@ public class FaxReceivedEvent extends AbstractFaxEvent */ private static final long serialVersionUID = 1L; - private String exten; private String callerId; private String remoteStationId; private String localStationId; @@ -50,27 +49,6 @@ public FaxReceivedEvent(Object source) super(source); } - /** - * Returns the extension in Asterisk's dialplan the fax was received - * through. - * - * @return the extension the fax was received through. - */ - public String getExten() - { - return exten; - } - - /** - * Sets the extension the fax was received through. - * - * @param exten the extension the fax was received through. - */ - public void setExten(String exten) - { - this.exten = exten; - } - /** * Returns the Caller*ID of the calling party or an empty string if none is * available. diff --git a/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java b/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java index 0c5924e8a..d80a6f2ab 100644 --- a/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/FaxStatusEvent.java @@ -52,12 +52,10 @@ public class FaxStatusEvent extends AbstractFaxEvent private Integer rtnCount; private Integer dcnCount; private String remoteStationId; - private String context; private String localStationId; private String callerId; private String status; private String operation; - private String exten; public FaxStatusEvent(Object source) { @@ -513,22 +511,6 @@ public void setLocalStationId(String localStationId) this.localStationId = localStationId; } - /** - * @return the context - */ - public String getContext() - { - return context; - } - - /** - * @param context the context to set - */ - public void setContext(String context) - { - this.context = context; - } - /** * @return the callerId */ @@ -576,22 +558,5 @@ public void setOperation(String operation) { this.operation = operation; } - - /** - * @return the exten - */ - public String getExten() - { - return exten; - } - - /** - * @param exten the exten to set - */ - public void setExten(String exten) - { - this.exten = exten; - } - } diff --git a/src/main/java/org/asteriskjava/manager/event/JoinEvent.java b/src/main/java/org/asteriskjava/manager/event/JoinEvent.java index 5e2543f77..2d0e1ac3f 100644 --- a/src/main/java/org/asteriskjava/manager/event/JoinEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/JoinEvent.java @@ -62,49 +62,6 @@ public void setCallerId(String callerId) this.callerIdNum = callerId; } - /** - * Returns the Caller*ID number of the channel that joined the queue if set. - * If the channel has no caller id set "unknown" is returned. - * - * @return the Caller*ID number of the channel that joined the queue - * @since 1.0.0 - */ - public String getCallerIdNum() - { - return callerIdNum; - } - - /** - * Sets the Caller*ID number of the channel that joined the queue. - * - * @param callerIdNum the Caller*ID number of the channel that joined the queue. - */ - public void setCallerIdNum(String callerIdNum) - { - this.callerIdNum = callerIdNum; - } - - /** - * Returns the Caller*ID name of the channel that joined the queue if set. - * If the channel has no caller id set "unknown" is returned. - * - * @since 0.2 - */ - public String getCallerIdName() - { - return callerIdName; - } - - /** - * Sets the Caller*ID name of the channel that joined the queue. - * - * @since 0.2 - */ - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } - /** * Returns the position of the joined channel in the queue. */ diff --git a/src/main/java/org/asteriskjava/manager/event/ListDialplanEvent.java b/src/main/java/org/asteriskjava/manager/event/ListDialplanEvent.java index addf70367..1f8ceea49 100644 --- a/src/main/java/org/asteriskjava/manager/event/ListDialplanEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ListDialplanEvent.java @@ -18,10 +18,8 @@ public class ListDialplanEvent extends ResponseEvent private static final String PRIORITY_HINT = "hint"; - private String context; private String extension; private String extensionLabel; - private Integer priority; private boolean hint = false; private String application; private String appData; @@ -32,21 +30,6 @@ public ListDialplanEvent(Object source) super(source); } - /** - * Returns the context. - * - * @return the context. - */ - public String getContext() - { - return context; - } - - public void setContext(String context) - { - this.context = context; - } - /** * Returns the extension or extension pattern. * @@ -76,16 +59,6 @@ public void setExtensionLabel(String extensionLabel) this.extensionLabel = extensionLabel; } - /** - * Returns the priority. - * - * @return the priority or null if this is a hint. - */ - public Integer getPriority() - { - return priority; - } - /** * Checks whether this is a hint. * @return true if this is a hint, false otherwise. diff --git a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java index 998621a97..a525876ef 100644 --- a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java @@ -55,92 +55,92 @@ public abstract class ManagerEvent extends EventObject * @since 0.2 */ - public String getCallerIdName() + public final String getCallerIdName() { return callerIdName; } - public void setCallerIdName(String callerIdName) + public final void setCallerIdName(String callerIdName) { this.callerIdName = callerIdName; } - public String getConnectedLineNum() + public final String getConnectedLineNum() { return connectedLineNum; } - public void setConnectedLineNum(String connectedLineNum) + public final void setConnectedLineNum(String connectedLineNum) { this.connectedLineNum = connectedLineNum; } - public String getConnectedLineName() + public final String getConnectedLineName() { return connectedLineName; } - public void setConnectedLineName(String connectedLineName) + public final void setConnectedLineName(String connectedLineName) { this.connectedLineName = connectedLineName; } - public Integer getPriority() + public final Integer getPriority() { return priority; } - public void setPriority(Integer priority) + public final void setPriority(Integer priority) { this.priority = priority; } - public Integer getChannelState() + public final Integer getChannelState() { return channelState; } - public void setChannelState(Integer channelState) + public final void setChannelState(Integer channelState) { this.channelState = channelState; } - public String getChannelStateDesc() + public final String getChannelStateDesc() { return channelStateDesc; } - public void setChannelStateDesc(String channelStateDesc) + public final void setChannelStateDesc(String channelStateDesc) { this.channelStateDesc = channelStateDesc; } - public String getExten() + public final String getExten() { return exten; } - public void setExten(String exten) + public final void setExten(String exten) { this.exten = exten; } - public String getCallerIdNum() + public final String getCallerIdNum() { return callerIdNum; } - public void setCallerIdNum(String callerIdNum) + public final void setCallerIdNum(String callerIdNum) { this.callerIdNum = callerIdNum; } - public String getContext() + public final String getContext() { return context; } - public void setContext(String context) + public final void setContext(String context) { this.context = context; } @@ -186,7 +186,7 @@ public ManagerEvent(Object source) * (for example ConnectEvent and DisconnectEvent) may return * null. */ - public Date getDateReceived() + public final Date getDateReceived() { return dateReceived; } @@ -194,7 +194,7 @@ public Date getDateReceived() /** * Sets the point in time this event was received from the asterisk server. */ - public void setDateReceived(Date dateReceived) + public final void setDateReceived(Date dateReceived) { this.dateReceived = dateReceived; } @@ -207,7 +207,7 @@ public void setDateReceived(Date dateReceived) * * @since 0.2 */ - public String getPrivilege() + public final String getPrivilege() { return privilege; } @@ -217,7 +217,7 @@ public String getPrivilege() * * @since 0.2 */ - public void setPrivilege(String privilege) + public final void setPrivilege(String privilege) { this.privilege = privilege; } @@ -276,12 +276,12 @@ public final void setServer(String server) this.server = server; } - public String getSystemName() + public final String getSystemName() { return systemName; } - public void setSystemName(String systemName) + public final void setSystemName(String systemName) { this.systemName = systemName; } @@ -302,12 +302,12 @@ public void setSystemName(String systemName) * @see #getLine() * @since 1.0.0 */ - public String getFile() + public final String getFile() { return file; } - public void setFile(String file) + public final void setFile(String file) { this.file = file; } @@ -328,12 +328,12 @@ public void setFile(String file) * @see #getFunc() * @since 1.0.0 */ - public Integer getLine() + public final Integer getLine() { return line; } - public void setLine(Integer line) + public final void setLine(Integer line) { this.line = line; } @@ -354,12 +354,12 @@ public void setLine(Integer line) * @see #getLine() * @since 1.0.0 */ - public String getFunc() + public final String getFunc() { return func; } - public void setFunc(String func) + public final void setFunc(String func) { this.func = func; } @@ -380,12 +380,12 @@ public void setFunc(String func) * @see #getLine() * @since 1.0.0 */ - public Integer getSequenceNumber() + public final Integer getSequenceNumber() { return sequenceNumber; } - public void setSequenceNumber(Integer sequenceNumber) + public final void setSequenceNumber(Integer sequenceNumber) { this.sequenceNumber = sequenceNumber; } @@ -428,7 +428,7 @@ public String toString() return sb.toString(); } - protected void appendPropertyIfNotNull(StringBuilder sb, String property, Object value) + protected final void appendPropertyIfNotNull(StringBuilder sb, String property, Object value) { if (value != null) { diff --git a/src/main/java/org/asteriskjava/manager/event/NewExtenEvent.java b/src/main/java/org/asteriskjava/manager/event/NewExtenEvent.java index 5bd9e9ca8..f8953aa8c 100644 --- a/src/main/java/org/asteriskjava/manager/event/NewExtenEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/NewExtenEvent.java @@ -31,11 +31,9 @@ public class NewExtenEvent extends ManagerEvent static final long serialVersionUID = -467486409866099387L; private String uniqueId; - private String context; private String extension; private String application; private String appData; - private Integer priority; private String channel; private String language; @@ -122,22 +120,6 @@ public void setChannel(String channel) this.channel = channel; } - /** - * Returns the name of the context of the connected extension. - */ - public String getContext() - { - return context; - } - - /** - * Sets the name of the context of the connected extension. - */ - public void setContext(String context) - { - this.context = context; - } - /** * Returns the extension. */ @@ -153,20 +135,4 @@ public void setExtension(String extension) { this.extension = extension; } - - /** - * Returns the priority. - */ - public Integer getPriority() - { - return priority; - } - - /** - * Sets the priority. - */ - public void setPriority(Integer priority) - { - this.priority = priority; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/OriginateResponseEvent.java b/src/main/java/org/asteriskjava/manager/event/OriginateResponseEvent.java index d2086e005..16f104848 100644 --- a/src/main/java/org/asteriskjava/manager/event/OriginateResponseEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/OriginateResponseEvent.java @@ -31,12 +31,9 @@ public class OriginateResponseEvent extends ResponseEvent private static final long serialVersionUID = 910724860608259687L; private String response; private String channel; - private String context; - private String exten; private String uniqueId; private Integer reason; private String callerIdNum; - private String callerIdName; /** * @param source @@ -87,38 +84,6 @@ public void setChannel(String channel) this.channel = channel; } - /** - * Returns the name of the context of the extension to connect to. - */ - public String getContext() - { - return context; - } - - /** - * Sets the name of the context of the extension to connect to. - */ - public void setContext(String context) - { - this.context = context; - } - - /** - * Returns the the extension to connect to. - */ - public String getExten() - { - return exten; - } - - /** - * Sets the the extension to connect to. - */ - public void setExten(String exten) - { - this.exten = exten; - } - public Integer getReason() { return reason; @@ -145,24 +110,6 @@ public void setUniqueId(String uniqueId) this.uniqueId = uniqueId; } - /** - * Returns the Caller*ID Number of the originated channel. - *

- * Available sind Asterisk 1.4. - * - * @return the Caller*ID Number of the originated channel or null if none was set. - * @since 0.3 - */ - public String getCallerIdNum() - { - return callerIdNum; - } - - public void setCallerIdNum(String callerId) - { - this.callerIdNum = callerId; - } - // for backward compatibility only public void setCallerId(String callerId) { @@ -171,21 +118,4 @@ public void setCallerId(String callerId) this.callerIdNum = callerId; } } - - /** - * Returns the Caller*ID Name of the originated channel. - *

- * Available sind Asterisk 1.4. - * - * @return the Caller*ID Name of the originated channel or null if none was set. - */ - public String getCallerIdName() - { - return callerIdName; - } - - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } } diff --git a/src/main/java/org/asteriskjava/manager/event/ReceiveFaxEvent.java b/src/main/java/org/asteriskjava/manager/event/ReceiveFaxEvent.java index 7796fb1af..5dfb41444 100644 --- a/src/main/java/org/asteriskjava/manager/event/ReceiveFaxEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ReceiveFaxEvent.java @@ -7,8 +7,6 @@ public class ReceiveFaxEvent extends ManagerEvent { private static final long serialVersionUID = 0L; private String channel; - private String context; - private String exten; private String callerId; private String remoteStationId; private String localStationId; @@ -32,26 +30,6 @@ public void setChannel(String channel) this.channel = channel; } - public String getContext() - { - return context; - } - - public void setContext(String context) - { - this.context = context; - } - - public String getExten() - { - return exten; - } - - public void setExten(String exten) - { - this.exten = exten; - } - public String getCallerId() { return callerId; diff --git a/src/main/java/org/asteriskjava/manager/event/SendFaxEvent.java b/src/main/java/org/asteriskjava/manager/event/SendFaxEvent.java index 020582acd..1f6ae5ae0 100644 --- a/src/main/java/org/asteriskjava/manager/event/SendFaxEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SendFaxEvent.java @@ -25,8 +25,6 @@ public class SendFaxEvent extends AbstractFaxEvent * Serial version identifier. */ private static final long serialVersionUID = -1L; - private String context; - private String exten; private String callerId; private String localStationId; private String remoteStationId; @@ -42,42 +40,6 @@ public SendFaxEvent(Object source) } - /** - * @return the context - */ - public String getContext() - { - return context; - } - - - /** - * @param context the context to set - */ - public void setContext(String context) - { - this.context = context; - } - - - /** - * @return the exten - */ - public String getExten() - { - return exten; - } - - - /** - * @param exten the exten to set - */ - public void setExten(String exten) - { - this.exten = exten; - } - - /** * @return the callerId */ diff --git a/src/main/java/org/asteriskjava/manager/event/SendFaxStatusEvent.java b/src/main/java/org/asteriskjava/manager/event/SendFaxStatusEvent.java index bd9b45fce..f09be6e8b 100644 --- a/src/main/java/org/asteriskjava/manager/event/SendFaxStatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SendFaxStatusEvent.java @@ -25,8 +25,6 @@ public class SendFaxStatusEvent extends AbstractFaxEvent * Serial version identifier. */ private static final long serialVersionUID = -1L; - private String context; - private String exten; private String status; private String callerId; private String localStationId; @@ -39,42 +37,6 @@ public SendFaxStatusEvent(Object source) } - /** - * @return the context - */ - public String getContext() - { - return context; - } - - - /** - * @param context the context to set - */ - public void setContext(String context) - { - this.context = context; - } - - - /** - * @return the exten - */ - public String getExten() - { - return exten; - } - - - /** - * @param exten the exten to set - */ - public void setExten(String exten) - { - this.exten = exten; - } - - /** * @return the status */ diff --git a/src/main/java/org/asteriskjava/manager/event/SkypeLicenseEvent.java b/src/main/java/org/asteriskjava/manager/event/SkypeLicenseEvent.java index 2f2a73c27..96aefa352 100644 --- a/src/main/java/org/asteriskjava/manager/event/SkypeLicenseEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SkypeLicenseEvent.java @@ -31,7 +31,6 @@ public class SkypeLicenseEvent extends ResponseEvent * Serial version identifier. */ private static final long serialVersionUID = 1L; - private String file; private String key; private String expires; private String hostId; @@ -43,26 +42,6 @@ public SkypeLicenseEvent(Object source) super(source); } - /** - * Returns the name of the file this license is stored in. - * - * @return the name of the file this license is stored in. - */ - public String getFile() - { - return file; - } - - /** - * Sets the name of the file this license is stored in. - * - * @param file the name of the file this license is stored in. - */ - public void setFile(String file) - { - this.file = file; - } - /** * Returns the license key. * diff --git a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java index ad34f4daf..f6c6436c6 100644 --- a/src/main/java/org/asteriskjava/manager/event/StatusEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/StatusEvent.java @@ -16,8 +16,6 @@ */ package org.asteriskjava.manager.event; -import org.asteriskjava.util.AstState; - import java.util.Map; /** @@ -36,7 +34,6 @@ public class StatusEvent extends ResponseEvent private static final long serialVersionUID = -3619197512835308812L; private String channel; private String accountCode; - private Integer channelState; private Integer seconds; private String bridgedChannel; private String bridgedUniqueId; @@ -96,50 +93,6 @@ public void setCallerId(String callerIdNum) this.callerIdNum = callerIdNum; } - /** - * Returns the Caller*ID Number of this channel. - * - * @return the Caller*ID Number of this channel or null if none - * is available. - * @since 0.3 - */ - public String getCallerIdNum() - { - return callerIdNum; - } - - /** - * Sets the Caller*ID Number of this channel. - * - * @param callerIdNum the Caller*ID Number to set. - * @since 0.3 - */ - public void setCallerIdNum(String callerIdNum) - { - this.callerIdNum = callerIdNum; - } - - /** - * Returns the Caller*ID Name of this channel. - * - * @return the Caller*ID Name of this channel or null if none - * is available. - */ - public String getCallerIdName() - { - return callerIdName; - } - - /** - * Sets the Caller*ID Name of this channel. - * - * @param callerIdName the Caller*ID Name of this channel. - */ - public void setCallerIdName(String callerIdName) - { - this.callerIdName = callerIdName; - } - /** * Returns the account code of this channel. * @@ -187,47 +140,6 @@ public void setAccount(String account) this.accountCode = account; } - /** - * Returns the state of the channel. - *

- * For Asterisk versions prior to 1.6 (that do not send the numeric value) - * it is derived from the descriptive text. - * - * @return the state of the channel. - * @since 1.0.0 - */ - public Integer getChannelState() - { - return channelState == null ? AstState.str2state(channelStateDesc) : channelState; - } - - /** - * Sets the state of the channel. - * - * @param channelState the state of the channel. - * @since 1.0.0 - */ - public void setChannelState(Integer channelState) - { - this.channelState = channelState; - } - - /** - * Returns the state of the channel as a descriptive text. - * - * @return the state of the channel as a descriptive text. - * @since 1.0.0 - */ - public String getChannelStateDesc() - { - return channelStateDesc; - } - - public void setChannelStateDesc(String channelStateDesc) - { - this.channelStateDesc = channelStateDesc; - } - /** * Returns the state of the channel as a descriptive text. * diff --git a/src/main/java/org/asteriskjava/manager/event/ZapShowChannelsEvent.java b/src/main/java/org/asteriskjava/manager/event/ZapShowChannelsEvent.java index 3004b9f27..163b95b13 100644 --- a/src/main/java/org/asteriskjava/manager/event/ZapShowChannelsEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ZapShowChannelsEvent.java @@ -103,22 +103,6 @@ public void setSignalling(String signalling) this.signalling = signalling; } - /** - * Returns the context of this zap channel as defined in zapata.conf. - */ - public String getContext() - { - return context; - } - - /** - * Sets the context of this zap channel. - */ - public void setContext(String context) - { - this.context = context; - } - /** * Returns whether dnd (do not disturb) is enabled for this zap channel. * From d9161b95e285a26edd68fa7ab89674e57f4a23b2 Mon Sep 17 00:00:00 2001 From: "adrian.videanu" Date: Tue, 30 Jun 2015 09:09:09 +0300 Subject: [PATCH 0162/1055] -- format the code as required --- .../asteriskjava/live/RecordingException.java | 6 +- .../live/internal/AsteriskChannelImpl.java | 224 ++++++++++-------- 2 files changed, 131 insertions(+), 99 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/RecordingException.java b/src/main/java/org/asteriskjava/live/RecordingException.java index d12dfdcbf..b54a7e05d 100644 --- a/src/main/java/org/asteriskjava/live/RecordingException.java +++ b/src/main/java/org/asteriskjava/live/RecordingException.java @@ -27,10 +27,10 @@ public class RecordingException extends LiveException /** * Serial version identifier. */ - - private static final long serialVersionUID = 7804327171239361017L; - /** + private static final long serialVersionUID = 7804327171239361017L; + + /** * Creates a new instance with the given message. * * @param message the message diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java index f00d51619..04bf90b12 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskChannelImpl.java @@ -29,7 +29,6 @@ import org.asteriskjava.live.ExtensionHistoryEntry; import org.asteriskjava.live.HangupCause; import org.asteriskjava.live.LinkedChannelHistoryEntry; -import org.asteriskjava.live.LiveException; import org.asteriskjava.live.ManagerCommunicationException; import org.asteriskjava.live.RecordingException; import org.asteriskjava.live.NoSuchChannelException; @@ -103,15 +102,15 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel private final List linkedChannelHistory; private final List dialedChannelHistory; - private final List dialedChannels; + private final List dialedChannels; - private final List dialingChannels; + private final List dialingChannels; /** - * If this channel is bridged to another channel, the linkedChannels contains - the channel this channel is bridged with. + * If this channel is bridged to another channel, the linkedChannels + * contains the channel this channel is bridged with. */ - private final List linkedChannels; + private final List linkedChannels; /** * Indicates if this channel was linked to another channel at least once. @@ -143,7 +142,8 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel private Extension parkedAt; /** - * Last dtmf digit recieved on this channel if any, null otherwise. + * Last dtmf digit recieved on this channel if any, null + * otherwise. */ private Character dtmfReceived; @@ -162,9 +162,9 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel /** * Creates a new Channel. * - * @param server server this channel belongs to. - * @param name name of this channel, for example "SIP/1310-20da". - * @param id unique id of this channel, for example "1099015093.165". + * @param server server this channel belongs to. + * @param name name of this channel, for example "SIP/1310-20da". + * @param id unique id of this channel, for example "1099015093.165". * @param dateOfCreation date this channel has been created. * @throws IllegalArgumentException if any of the parameters are null. */ @@ -187,7 +187,8 @@ class AsteriskChannelImpl extends AbstractLiveObject implements AsteriskChannel } if (dateOfCreation == null) { - throw new IllegalArgumentException("Parameter 'dateOfCreation' passed to AsteriskChannelImpl() must not be null."); + throw new IllegalArgumentException( + "Parameter 'dateOfCreation' passed to AsteriskChannelImpl() must not be null."); } this.name = name; @@ -212,7 +213,7 @@ public String getId() * Changes the id of this channel. * * @param date date of the name change. - * @param id the new unique id of this channel. + * @param id the new unique id of this channel. */ void idChanged(Date date, String id) { @@ -302,15 +303,14 @@ public boolean wasInState(ChannelState state) public boolean wasBusy() { - return wasInState(ChannelState.BUSY) - || hangupCause == HangupCause.AST_CAUSE_BUSY + return wasInState(ChannelState.BUSY) || hangupCause == HangupCause.AST_CAUSE_BUSY || hangupCause == HangupCause.AST_CAUSE_USER_BUSY; } /** * Changes the state of this channel. * - * @param date when the state change occurred. + * @param date when the state change occurred. * @param state the new state of this channel. */ synchronized void stateChanged(Date date, ChannelState state) @@ -406,7 +406,7 @@ public List getExtensionHistory() /** * Adds a visted dialplan entry to the history. * - * @param date the date the extension has been visited. + * @param date the date the extension has been visited. * @param extension the visted dialplan entry to add. */ void extensionVisited(Date date, Extension extension) @@ -461,8 +461,8 @@ void callDetailRecordReceived(Date date, CallDetailRecordImpl callDetailRecord) * Sets dateOfRemoval, hangupCause and hangupCauseText and changes state to * {@link ChannelState#HUNGUP}. Fires a PropertyChangeEvent for state. * - * @param dateOfRemoval date the channel was hung up - * @param hangupCause cause for hangup + * @param dateOfRemoval date the channel was hung up + * @param hangupCause cause for hangup * @param hangupCauseText textual representation of hangup cause */ synchronized void hungup(Date dateOfRemoval, HangupCause hangupCause, String hangupCauseText) @@ -474,14 +474,12 @@ synchronized void hungup(Date dateOfRemoval, HangupCause hangupCause, String han stateChanged(dateOfRemoval, ChannelState.HUNGUP); } - - /** * Retrives the conplete List of all dialed channels associated to ths calls * * @return List of all dialed channels */ - public List getDialedChannels() + public List getDialedChannels() { final List copy; @@ -492,18 +490,22 @@ public List getDialedChannels() return copy; } -/* dialed channels */ + + /* dialed channels */ public AsteriskChannel getDialedChannel() { - synchronized(dialedChannels) { - for (AsteriskChannel channel:dialedChannels) { - if (channel != null) return channel; + synchronized (dialedChannels) + { + for (AsteriskChannel channel : dialedChannels) + { + if (channel != null) + return channel; } } return null; } - + public List getDialedChannelHistory() { final List copy; @@ -519,10 +521,13 @@ public List getDialedChannelHistory() synchronized void channelDialed(Date date, AsteriskChannel dialedChannel) { final AsteriskChannel oldDialedChannel; - synchronized(dialedChannels) { - if (dialedChannels.isEmpty()) oldDialedChannel = null; - else oldDialedChannel = dialedChannels.get(dialedChannels.size()-1); - dialedChannels.add(dialedChannel); + synchronized (dialedChannels) + { + if (dialedChannels.isEmpty()) + oldDialedChannel = null; + else + oldDialedChannel = dialedChannels.get(dialedChannels.size() - 1); + dialedChannels.add(dialedChannel); } final DialedChannelHistoryEntry historyEntry; @@ -536,26 +541,32 @@ synchronized void channelDialed(Date date, AsteriskChannel dialedChannel) } /* dialed channels */ - + public AsteriskChannel getDialingChannel() { - synchronized(dialingChannels) { - if (dialingChannels.isEmpty()) return null; - return dialingChannels.get(0); + synchronized (dialingChannels) + { + if (dialingChannels.isEmpty()) + return null; + return dialingChannels.get(0); } } synchronized void channelDialing(Date date, AsteriskChannel dialingChannel) { final AsteriskChannel oldDialingChannel; - synchronized(this.dialingChannels) { - if (this.dialingChannels.isEmpty()) { - oldDialingChannel = null; - this.dialingChannels.add(dialingChannel); - } else { - oldDialingChannel = this.dialingChannels.get(0); - this.dialingChannels.set(0, dialingChannel); - } + synchronized (this.dialingChannels) + { + if (this.dialingChannels.isEmpty()) + { + oldDialingChannel = null; + this.dialingChannels.add(dialingChannel); + } + else + { + oldDialingChannel = this.dialingChannels.get(0); + this.dialingChannels.set(0, dialingChannel); + } } firePropertyChange(PROPERTY_DIALING_CHANNEL, oldDialingChannel, dialingChannel); @@ -565,9 +576,11 @@ synchronized void channelDialing(Date date, AsteriskChannel dialingChannel) public AsteriskChannel getLinkedChannel() { - synchronized(linkedChannels) { - if (linkedChannels.isEmpty()) return null; - return linkedChannels.get(0); + synchronized (linkedChannels) + { + if (linkedChannels.isEmpty()) + return null; + return linkedChannels.get(0); } } @@ -591,21 +604,24 @@ public boolean wasLinked() /** * Sets the channel this channel is bridged with. * - * @param date the date this channel was linked. + * @param date the date this channel was linked. * @param linkedChannel the channel this channel is bridged with. */ synchronized void channelLinked(Date date, AsteriskChannel linkedChannel) { final AsteriskChannel oldLinkedChannel; - synchronized(this.linkedChannels) { - if (this.linkedChannels.isEmpty()) { - oldLinkedChannel = null; - this.linkedChannels.add(linkedChannel); - } - else { - oldLinkedChannel = this.linkedChannels.get(0); - this.linkedChannels.set(0, linkedChannel); - } + synchronized (this.linkedChannels) + { + if (this.linkedChannels.isEmpty()) + { + oldLinkedChannel = null; + this.linkedChannels.add(linkedChannel); + } + else + { + oldLinkedChannel = this.linkedChannels.get(0); + this.linkedChannels.set(0, linkedChannel); + } } final LinkedChannelHistoryEntry historyEntry; @@ -623,14 +639,17 @@ synchronized void channelUnlinked(Date date) { final AsteriskChannel oldLinkedChannel; - synchronized(this.linkedChannels) { - if (this.linkedChannels.isEmpty()) { - oldLinkedChannel = null; - } - else { - oldLinkedChannel = this.linkedChannels.get(0); - } - linkedChannels.clear(); + synchronized (this.linkedChannels) + { + if (this.linkedChannels.isEmpty()) + { + oldLinkedChannel = null; + } + else + { + oldLinkedChannel = this.linkedChannels.get(0); + } + linkedChannels.clear(); } final LinkedChannelHistoryEntry historyEntry; @@ -787,7 +806,8 @@ public void setVariable(String variable, String value) throws ManagerCommunicati } } - public void playDtmf(String digit) throws ManagerCommunicationException, NoSuchChannelException, IllegalArgumentException + public void playDtmf(String digit) throws ManagerCommunicationException, NoSuchChannelException, + IllegalArgumentException { ManagerResponse response; @@ -825,7 +845,8 @@ public void startMonitoring(String filename, String format, boolean mix) throws } } - public void changeMonitoring(String filename) throws ManagerCommunicationException, NoSuchChannelException, IllegalArgumentException + public void changeMonitoring(String filename) throws ManagerCommunicationException, NoSuchChannelException, + IllegalArgumentException { ManagerResponse response; @@ -874,40 +895,46 @@ public void unpauseMonitoring() throws ManagerCommunicationException, NoSuchChan } } - - public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, RecordingException + public void pauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, + RecordingException { ManagerResponse response; - response = server.sendAction(new PauseMixMonitorAction(this.name,1,direction.getStateName())); - if (response instanceof ManagerError) { - if (response.getMessage().equals("Cannot set mute flag")){ - throw new RecordingException(response.getMessage()+" on channel: '" + name); - } - else{ - throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); - } + response = server.sendAction(new PauseMixMonitorAction(this.name, 1, direction.getStateName())); + if (response instanceof ManagerError) + { + if (response.getMessage().equals("Cannot set mute flag")) + { + throw new RecordingException(response.getMessage() + " on channel: '" + name); + } + else + { + throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); + } } } - - public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, NoSuchChannelException, RecordingException + public void unPauseMixMonitor(MixMonitorDirection direction) throws ManagerCommunicationException, + NoSuchChannelException, RecordingException { ManagerResponse response; - response = server.sendAction(new PauseMixMonitorAction(this.name,0,direction.getStateName())); - if (response instanceof ManagerError) { - if (response.getMessage().equals("Cannot set mute flag")){ - throw new RecordingException(response.getMessage()+" on channel: '" + name); - } - else{ - throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); - } + response = server.sendAction(new PauseMixMonitorAction(this.name, 0, direction.getStateName())); + if (response instanceof ManagerError) + { + if (response.getMessage().equals("Cannot set mute flag")) + { + throw new RecordingException(response.getMessage() + " on channel: '" + name); + } + else + { + throw new NoSuchChannelException("Channel '" + name + "' is not available: " + response.getMessage()); + } } } - - + public Extension getParkedAt() { - // warning: the context of this extension will be null until we get the context property from + // warning: the context of this extension will be null until we get the + // context property from // the parked call event! return parkedAt; } @@ -977,9 +1004,13 @@ void setQueueEntry(AsteriskQueueEntryImpl queueEntry) firePropertyChange(PROPERTY_QUEUE_ENTRY, oldQueueEntry, queueEntry); } - public boolean isMonitored() {return this.isMonitored; } + public boolean isMonitored() + { + return this.isMonitored; + } - void setMonitored(boolean monitored) { + void setMonitored(boolean monitored) + { final boolean oldMonitored = this.isMonitored; this.isMonitored = monitored; @@ -990,9 +1021,9 @@ void setMonitored(boolean monitored) { public String toString() { final StringBuffer sb; - final List dialedChannels; - final List dialingChannel; - final List linkedChannel; + final List dialedChannels; + final List dialingChannel; + final List linkedChannel; sb = new StringBuffer("AsteriskChannel["); @@ -1017,9 +1048,10 @@ public String toString() sb.append("dialedChannel=AsteriskChannel["); synchronized (dialedChannels) { - for (AsteriskChannel dialedChannel:dialedChannels) { - sb.append("[id='").append(dialedChannel.getId()).append("',"); - sb.append("name='").append(dialedChannel.getName()).append("'],"); + for (AsteriskChannel dialedChannel : dialedChannels) + { + sb.append("[id='").append(dialedChannel.getId()).append("',"); + sb.append("name='").append(dialedChannel.getName()).append("'],"); } sb.append("],"); } From 99c355317955afa03a971e6aa1a3f8b12840d153 Mon Sep 17 00:00:00 2001 From: enro Date: Tue, 30 Jun 2015 13:59:43 +0200 Subject: [PATCH 0163/1055] Included missing null check in getChannelState (originally implemented in AbstractChannelStateEvent) --- .../java/org/asteriskjava/manager/event/ManagerEvent.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java index a525876ef..063502ac1 100644 --- a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java @@ -19,6 +19,7 @@ import java.lang.reflect.Method; import java.util.*; +import org.asteriskjava.util.AstState; import org.asteriskjava.util.ReflectionUtil; /** @@ -95,9 +96,9 @@ public final void setPriority(Integer priority) this.priority = priority; } - public final Integer getChannelState() + public Integer getChannelState() { - return channelState; + return channelState == null ? AstState.str2state(channelStateDesc) : channelState; } public final void setChannelState(Integer channelState) From b40aae8d3fc8fcadbee1090a9a9f11d6618690be Mon Sep 17 00:00:00 2001 From: enro Date: Tue, 30 Jun 2015 16:25:22 +0200 Subject: [PATCH 0164/1055] OriginateResponseEvent.setCallerId calls setCallerIdNum instead of setting member variable --- .../asteriskjava/manager/event/OriginateResponseEvent.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/OriginateResponseEvent.java b/src/main/java/org/asteriskjava/manager/event/OriginateResponseEvent.java index 16f104848..5576ba235 100644 --- a/src/main/java/org/asteriskjava/manager/event/OriginateResponseEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/OriginateResponseEvent.java @@ -33,7 +33,6 @@ public class OriginateResponseEvent extends ResponseEvent private String channel; private String uniqueId; private Integer reason; - private String callerIdNum; /** * @param source @@ -113,9 +112,9 @@ public void setUniqueId(String uniqueId) // for backward compatibility only public void setCallerId(String callerId) { - if (this.callerIdNum == null) + if (getCallerIdNum() == null) { - this.callerIdNum = callerId; + setCallerIdNum(callerId); } } } From 2ee248560e00fde0f6c0927b6dc54dd144fc0092 Mon Sep 17 00:00:00 2001 From: enro Date: Wed, 1 Jul 2015 10:36:27 +0200 Subject: [PATCH 0165/1055] Remove final modifiers from ManagerEvent getters and setters --- .../manager/event/ManagerEvent.java | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java index 063502ac1..43ee089e6 100644 --- a/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/ManagerEvent.java @@ -56,42 +56,42 @@ public abstract class ManagerEvent extends EventObject * @since 0.2 */ - public final String getCallerIdName() + public String getCallerIdName() { return callerIdName; } - public final void setCallerIdName(String callerIdName) + public void setCallerIdName(String callerIdName) { this.callerIdName = callerIdName; } - public final String getConnectedLineNum() + public String getConnectedLineNum() { return connectedLineNum; } - public final void setConnectedLineNum(String connectedLineNum) + public void setConnectedLineNum(String connectedLineNum) { this.connectedLineNum = connectedLineNum; } - public final String getConnectedLineName() + public String getConnectedLineName() { return connectedLineName; } - public final void setConnectedLineName(String connectedLineName) + public void setConnectedLineName(String connectedLineName) { this.connectedLineName = connectedLineName; } - public final Integer getPriority() + public Integer getPriority() { return priority; } - public final void setPriority(Integer priority) + public void setPriority(Integer priority) { this.priority = priority; } @@ -101,47 +101,47 @@ public Integer getChannelState() return channelState == null ? AstState.str2state(channelStateDesc) : channelState; } - public final void setChannelState(Integer channelState) + public void setChannelState(Integer channelState) { this.channelState = channelState; } - public final String getChannelStateDesc() + public String getChannelStateDesc() { return channelStateDesc; } - public final void setChannelStateDesc(String channelStateDesc) + public void setChannelStateDesc(String channelStateDesc) { this.channelStateDesc = channelStateDesc; } - public final String getExten() + public String getExten() { return exten; } - public final void setExten(String exten) + public void setExten(String exten) { this.exten = exten; } - public final String getCallerIdNum() + public String getCallerIdNum() { return callerIdNum; } - public final void setCallerIdNum(String callerIdNum) + public void setCallerIdNum(String callerIdNum) { this.callerIdNum = callerIdNum; } - public final String getContext() + public String getContext() { return context; } - public final void setContext(String context) + public void setContext(String context) { this.context = context; } @@ -187,7 +187,7 @@ public ManagerEvent(Object source) * (for example ConnectEvent and DisconnectEvent) may return * null. */ - public final Date getDateReceived() + public Date getDateReceived() { return dateReceived; } @@ -195,7 +195,7 @@ public final Date getDateReceived() /** * Sets the point in time this event was received from the asterisk server. */ - public final void setDateReceived(Date dateReceived) + public void setDateReceived(Date dateReceived) { this.dateReceived = dateReceived; } @@ -208,7 +208,7 @@ public final void setDateReceived(Date dateReceived) * * @since 0.2 */ - public final String getPrivilege() + public String getPrivilege() { return privilege; } @@ -218,7 +218,7 @@ public final String getPrivilege() * * @since 0.2 */ - public final void setPrivilege(String privilege) + public void setPrivilege(String privilege) { this.privilege = privilege; } @@ -277,12 +277,12 @@ public final void setServer(String server) this.server = server; } - public final String getSystemName() + public String getSystemName() { return systemName; } - public final void setSystemName(String systemName) + public void setSystemName(String systemName) { this.systemName = systemName; } @@ -303,12 +303,12 @@ public final void setSystemName(String systemName) * @see #getLine() * @since 1.0.0 */ - public final String getFile() + public String getFile() { return file; } - public final void setFile(String file) + public void setFile(String file) { this.file = file; } @@ -329,12 +329,12 @@ public final void setFile(String file) * @see #getFunc() * @since 1.0.0 */ - public final Integer getLine() + public Integer getLine() { return line; } - public final void setLine(Integer line) + public void setLine(Integer line) { this.line = line; } @@ -355,12 +355,12 @@ public final void setLine(Integer line) * @see #getLine() * @since 1.0.0 */ - public final String getFunc() + public String getFunc() { return func; } - public final void setFunc(String func) + public void setFunc(String func) { this.func = func; } @@ -381,12 +381,12 @@ public final void setFunc(String func) * @see #getLine() * @since 1.0.0 */ - public final Integer getSequenceNumber() + public Integer getSequenceNumber() { return sequenceNumber; } - public final void setSequenceNumber(Integer sequenceNumber) + public void setSequenceNumber(Integer sequenceNumber) { this.sequenceNumber = sequenceNumber; } @@ -429,7 +429,7 @@ public String toString() return sb.toString(); } - protected final void appendPropertyIfNotNull(StringBuilder sb, String property, Object value) + protected void appendPropertyIfNotNull(StringBuilder sb, String property, Object value) { if (value != null) { From 0eb3f22aa50df1b2f73d9871370348b70ffedf9f Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Mon, 6 Jul 2015 18:02:50 +0300 Subject: [PATCH 0166/1055] Add AttendedTransferEvent --- .../manager/event/AttendedTransferEvent.java | 850 ++++++++++++++++++ .../manager/internal/EventBuilderImpl.java | 1 + 2 files changed, 851 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/AttendedTransferEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/AttendedTransferEvent.java b/src/main/java/org/asteriskjava/manager/event/AttendedTransferEvent.java new file mode 100644 index 000000000..ed729c51f --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/AttendedTransferEvent.java @@ -0,0 +1,850 @@ +package org.asteriskjava.manager.event; + +/** + * Raised when attended transfer is complete + * + * https://wiki.asterisk.org/wiki/display/AST/Asterisk+13+ManagerEvent_AttendedTransfer + */ +public class AttendedTransferEvent extends AbstractBridgeEvent { + private static final long serialVersionUID = 1L; + + private String origTransfererChannel; + private String origTransfererChannelState; + private String origTransfererChannelStateDesc; + private String origTransfererCallerIDNum; + private String origTransfererCallerIDName; + private String origTransfererConnectedLineNum; + private String origTransfererConnectedLineName; + private String origTransfererAccountCode; + private String origTransfererContext; + private String origTransfererExten; + private String origTransfererPriority; + private String origTransfererUniqueid; + private String origBridgeUniqueid; + private String origBridgeType; + private String origBridgeTechnology; + private String origBridgeCreator; + private String origBridgeName; + private String origBridgeNumChannels; + private String secondTransfererChannel; + private String secondTransfererChannelState; + private String secondTransfererChannelStateDesc; + private String secondTransfererCallerIDNum; + private String secondTransfererCallerIDName; + private String secondTransfererConnectedLineNum; + private String secondTransfererConnectedLineName; + private String secondTransfererAccountCode; + private String secondTransfererContext; + private String secondTransfererExten; + private String secondTransfererPriority; + private String secondTransfererUniqueid; + private String secondBridgeUniqueid; + private String secondBridgeType; + private String secondBridgeTechnology; + private String secondBridgeCreator; + private String secondBridgeName; + private String secondBridgeNumChannels; + private String destType; + private String destBridgeUniqueid; + private String destApp; + private String localOneChannel; + private String localOneChannelState; + private String localOneChannelStateDesc; + private String localOneCallerIDNum; + private String localOneCallerIDName; + private String localOneConnectedLineNum; + private String localOneConnectedLineName; + private String localOneAccountCode; + private String localOneContext; + private String localOneExten; + private String localOnePriority; + private String localOneUniqueid; + private String localTwoChannel; + private String localTwoChannelState; + private String localTwoChannelStateDesc; + private String localTwoCallerIDNum; + private String localTwoCallerIDName; + private String localTwoConnectedLineNum; + private String localTwoConnectedLineName; + private String localTwoAccountCode; + private String localTwoContext; + private String localTwoExten; + private String localTwoPriority; + private String localTwoUniqueid; + private String destTransfererChannel; + private String transfereeChannel; + private String transfereeChannelState; + private String transfereeChannelStateDesc; + private String transfereeCallerIDNum; + private String transfereeCallerIDName; + private String transfereeConnectedLineNum; + private String transfereeConnectedLineName; + private String transfereeAccountCode; + private String transfereeContext; + private String transfereeExten; + private String transfereePriority; + private String transfereeUniqueid; + + public AttendedTransferEvent(Object source) + { + super(source); + } + + public String getOrigTransfererChannel() + { + return origTransfererChannel; + } + + public void setOrigTransfererChannel(String origTransfererChannel) + { + this.origTransfererChannel = origTransfererChannel; + } + + public String getOrigTransfererChannelState() + { + return origTransfererChannelState; + } + + public void setOrigTransfererChannelState(String origTransfererChannelState) + { + this.origTransfererChannelState = origTransfererChannelState; + } + + public String getOrigTransfererChannelStateDesc() + { + return origTransfererChannelStateDesc; + } + + public void setOrigTransfererChannelStateDesc(String origTransfererChannelStateDesc) + { + this.origTransfererChannelStateDesc = origTransfererChannelStateDesc; + } + + public String getOrigTransfererCallerIDNum() + { + return origTransfererCallerIDNum; + } + + public void setOrigTransfererCallerIDNum(String origTransfererCallerIDNum) + { + this.origTransfererCallerIDNum = origTransfererCallerIDNum; + } + + public String getOrigTransfererCallerIDName() + { + return origTransfererCallerIDName; + } + + public void setOrigTransfererCallerIDName(String origTransfererCallerIDName) + { + this.origTransfererCallerIDName = origTransfererCallerIDName; + } + + public String getOrigTransfererConnectedLineNum() + { + return origTransfererConnectedLineNum; + } + + public void setOrigTransfererConnectedLineNum(String origTransfererConnectedLineNum) + { + this.origTransfererConnectedLineNum = origTransfererConnectedLineNum; + } + + public String getOrigTransfererConnectedLineName() + { + return origTransfererConnectedLineName; + } + + public void setOrigTransfererConnectedLineName(String origTransfererConnectedLineName) + { + this.origTransfererConnectedLineName = origTransfererConnectedLineName; + } + + public String getOrigTransfererAccountCode() + { + return origTransfererAccountCode; + } + + public void setOrigTransfererAccountCode(String origTransfererAccountCode) { + this.origTransfererAccountCode = origTransfererAccountCode; + } + + public String getOrigTransfererContext() + { + return origTransfererContext; + } + + public void setOrigTransfererContext(String origTransfererContext) + { + this.origTransfererContext = origTransfererContext; + } + + public String getOrigTransfererExten() + { + return origTransfererExten; + } + + public void setOrigTransfererExten(String origTransfererExten) + { + this.origTransfererExten = origTransfererExten; + } + + public String getOrigTransfererPriority() + { + return origTransfererPriority; + } + + public void setOrigTransfererPriority(String origTransfererPriority) + { + this.origTransfererPriority = origTransfererPriority; + } + + public String getOrigTransfererUniqueid() + { + return origTransfererUniqueid; + } + + public void setOrigTransfererUniqueid(String origTransfererUniqueid) + { + this.origTransfererUniqueid = origTransfererUniqueid; + } + + public String getOrigBridgeUniqueid() + { + return origBridgeUniqueid; + } + + public void setOrigBridgeUniqueid(String origBridgeUniqueid) + { + this.origBridgeUniqueid = origBridgeUniqueid; + } + + public String getOrigBridgeType() + { + return origBridgeType; + } + + public void setOrigBridgeType(String origBridgeType) + { + this.origBridgeType = origBridgeType; + } + + public String getOrigBridgeTechnology() + { + return origBridgeTechnology; + } + + public void setOrigBridgeTechnology(String origBridgeTechnology) + { + this.origBridgeTechnology = origBridgeTechnology; + } + + public String getOrigBridgeCreator() + { + return origBridgeCreator; + } + + public void setOrigBridgeCreator(String origBridgeCreator) + { + this.origBridgeCreator = origBridgeCreator; + } + + public String getOrigBridgeName() + { + return origBridgeName; + } + + public void setOrigBridgeName(String origBridgeName) + { + this.origBridgeName = origBridgeName; + } + + public String getOrigBridgeNumChannels() + { + return origBridgeNumChannels; + } + + public void setOrigBridgeNumChannels(String origBridgeNumChannels) + { + this.origBridgeNumChannels = origBridgeNumChannels; + } + + public String getSecondTransfererChannel() + { + return secondTransfererChannel; + } + + public void setSecondTransfererChannel(String secondTransfererChannel) + { + this.secondTransfererChannel = secondTransfererChannel; + } + + public String getSecondTransfererChannelState() + { + return secondTransfererChannelState; + } + + public void setSecondTransfererChannelState(String secondTransfererChannelState) + { + this.secondTransfererChannelState = secondTransfererChannelState; + } + + public String getSecondTransfererChannelStateDesc() + { + return secondTransfererChannelStateDesc; + } + + public void setSecondTransfererChannelStateDesc(String secondTransfererChannelStateDesc) + { + this.secondTransfererChannelStateDesc = secondTransfererChannelStateDesc; + } + + public String getSecondTransfererCallerIDNum() + { + return secondTransfererCallerIDNum; + } + + public void setSecondTransfererCallerIDNum(String secondTransfererCallerIDNum) + { + this.secondTransfererCallerIDNum = secondTransfererCallerIDNum; + } + + public String getSecondTransfererCallerIDName() + { + return secondTransfererCallerIDName; + } + + public void setSecondTransfererCallerIDName(String secondTransfererCallerIDName) + { + this.secondTransfererCallerIDName = secondTransfererCallerIDName; + } + + public String getSecondTransfererConnectedLineNum() { + return secondTransfererConnectedLineNum; + } + + public void setSecondTransfererConnectedLineNum(String secondTransfererConnectedLineNum) + { + this.secondTransfererConnectedLineNum = secondTransfererConnectedLineNum; + } + + public String getSecondTransfererConnectedLineName() + { + return secondTransfererConnectedLineName; + } + + public void setSecondTransfererConnectedLineName(String secondTransfererConnectedLineName) + { + this.secondTransfererConnectedLineName = secondTransfererConnectedLineName; + } + + public String getSecondTransfererAccountCode() + { + return secondTransfererAccountCode; + } + + public void setSecondTransfererAccountCode(String secondTransfererAccountCode) + { + this.secondTransfererAccountCode = secondTransfererAccountCode; + } + + public String getSecondTransfererContext() + { + return secondTransfererContext; + } + + public void setSecondTransfererContext(String secondTransfererContext) + { + this.secondTransfererContext = secondTransfererContext; + } + + public String getSecondTransfererExten() + { + return secondTransfererExten; + } + + public void setSecondTransfererExten(String secondTransfererExten) + { + this.secondTransfererExten = secondTransfererExten; + } + + public String getSecondTransfererPriority() + { + return secondTransfererPriority; + } + + public void setSecondTransfererPriority(String secondTransfererPriority) + { + this.secondTransfererPriority = secondTransfererPriority; + } + + public String getSecondTransfererUniqueid() + { + return secondTransfererUniqueid; + } + + public void setSecondTransfererUniqueid(String secondTransfererUniqueid) + { + this.secondTransfererUniqueid = secondTransfererUniqueid; + } + + public String getSecondBridgeUniqueid() + { + return secondBridgeUniqueid; + } + + public void setSecondBridgeUniqueid(String secondBridgeUniqueid) + { + this.secondBridgeUniqueid = secondBridgeUniqueid; + } + + public String getSecondBridgeType() + { + return secondBridgeType; + } + + public void setSecondBridgeType(String secondBridgeType) + { + this.secondBridgeType = secondBridgeType; + } + + public String getSecondBridgeTechnology() + { + return secondBridgeTechnology; + } + + public void setSecondBridgeTechnology(String secondBridgeTechnology) + { + this.secondBridgeTechnology = secondBridgeTechnology; + } + + public String getSecondBridgeCreator() + { + return secondBridgeCreator; + } + + public void setSecondBridgeCreator(String secondBridgeCreator) + { + this.secondBridgeCreator = secondBridgeCreator; + } + + public String getSecondBridgeName() + { + return secondBridgeName; + } + + public void setSecondBridgeName(String secondBridgeName) + { + this.secondBridgeName = secondBridgeName; + } + + public String getSecondBridgeNumChannels() + { + return secondBridgeNumChannels; + } + + public void setSecondBridgeNumChannels(String secondBridgeNumChannels) + { + this.secondBridgeNumChannels = secondBridgeNumChannels; + } + + public String getDestType() + { + return destType; + } + + public void setDestType(String destType) + { + this.destType = destType; + } + + public String getDestBridgeUniqueid() + { + return destBridgeUniqueid; + } + + public void setDestBridgeUniqueid(String destBridgeUniqueid) + { + this.destBridgeUniqueid = destBridgeUniqueid; + } + + public String getDestApp() + { + return destApp; + } + + public void setDestApp(String destApp) + { + this.destApp = destApp; + } + + public String getLocalOneChannel() + { + return localOneChannel; + } + + public void setLocalOneChannel(String localOneChannel) + { + this.localOneChannel = localOneChannel; + } + + public String getLocalOneChannelState() + { + return localOneChannelState; + } + + public void setLocalOneChannelState(String localOneChannelState) + { + this.localOneChannelState = localOneChannelState; + } + + public String getLocalOneChannelStateDesc() + { + return localOneChannelStateDesc; + } + + public void setLocalOneChannelStateDesc(String localOneChannelStateDesc) + { + this.localOneChannelStateDesc = localOneChannelStateDesc; + } + + public String getLocalOneCallerIDNum() + { + return localOneCallerIDNum; + } + + public void setLocalOneCallerIDNum(String localOneCallerIDNum) + { + this.localOneCallerIDNum = localOneCallerIDNum; + } + + public String getLocalOneCallerIDName() + { + return localOneCallerIDName; + } + + public void setLocalOneCallerIDName(String localOneCallerIDName) + { + this.localOneCallerIDName = localOneCallerIDName; + } + + public String getLocalOneConnectedLineNum() + { + return localOneConnectedLineNum; + } + + public void setLocalOneConnectedLineNum(String localOneConnectedLineNum) + { + this.localOneConnectedLineNum = localOneConnectedLineNum; + } + + public String getLocalOneConnectedLineName() + { + return localOneConnectedLineName; + } + + public void setLocalOneConnectedLineName(String localOneConnectedLineName) + { + this.localOneConnectedLineName = localOneConnectedLineName; + } + + public String getLocalOneAccountCode() + { + return localOneAccountCode; + } + + public void setLocalOneAccountCode(String localOneAccountCode) + { + this.localOneAccountCode = localOneAccountCode; + } + + public String getLocalOneContext() + { + return localOneContext; + } + + public void setLocalOneContext(String localOneContext) + { + this.localOneContext = localOneContext; + } + + public String getLocalOneExten() + { + return localOneExten; + } + + public void setLocalOneExten(String localOneExten) + { + this.localOneExten = localOneExten; + } + + public String getLocalOnePriority() + { + return localOnePriority; + } + + public void setLocalOnePriority(String localOnePriority) + { + this.localOnePriority = localOnePriority; + } + + public String getLocalOneUniqueid() + { + return localOneUniqueid; + } + + public void setLocalOneUniqueid(String localOneUniqueid) + { + this.localOneUniqueid = localOneUniqueid; + } + + public String getLocalTwoChannel() + { + return localTwoChannel; + } + + public void setLocalTwoChannel(String localTwoChannel) + { + this.localTwoChannel = localTwoChannel; + } + + public String getLocalTwoChannelState() + { + return localTwoChannelState; + } + + public void setLocalTwoChannelState(String localTwoChannelState) + { + this.localTwoChannelState = localTwoChannelState; + } + + public String getLocalTwoChannelStateDesc() + { + return localTwoChannelStateDesc; + } + + public void setLocalTwoChannelStateDesc(String localTwoChannelStateDesc) + { + this.localTwoChannelStateDesc = localTwoChannelStateDesc; + } + + public String getLocalTwoCallerIDNum() + { + return localTwoCallerIDNum; + } + + public void setLocalTwoCallerIDNum(String localTwoCallerIDNum) + { + this.localTwoCallerIDNum = localTwoCallerIDNum; + } + + public String getLocalTwoCallerIDName() + { + return localTwoCallerIDName; + } + + public void setLocalTwoCallerIDName(String localTwoCallerIDName) + { + this.localTwoCallerIDName = localTwoCallerIDName; + } + + public String getLocalTwoConnectedLineNum() + { + return localTwoConnectedLineNum; + } + + public void setLocalTwoConnectedLineNum(String localTwoConnectedLineNum) + { + this.localTwoConnectedLineNum = localTwoConnectedLineNum; + } + + public String getLocalTwoConnectedLineName() + { + return localTwoConnectedLineName; + } + + public void setLocalTwoConnectedLineName(String localTwoConnectedLineName) + { + this.localTwoConnectedLineName = localTwoConnectedLineName; + } + + public String getLocalTwoAccountCode() + { + return localTwoAccountCode; + } + + public void setLocalTwoAccountCode(String localTwoAccountCode) + { + this.localTwoAccountCode = localTwoAccountCode; + } + + public String getLocalTwoContext() + { + return localTwoContext; + } + + public void setLocalTwoContext(String localTwoContext) + { + this.localTwoContext = localTwoContext; + } + + public String getLocalTwoExten() + { + return localTwoExten; + } + + public void setLocalTwoExten(String localTwoExten) + { + this.localTwoExten = localTwoExten; + } + + public String getLocalTwoPriority() + { + return localTwoPriority; + } + + public void setLocalTwoPriority(String localTwoPriority) + { + this.localTwoPriority = localTwoPriority; + } + + public String getLocalTwoUniqueid() + { + return localTwoUniqueid; + } + + public void setLocalTwoUniqueid(String localTwoUniqueid) + { + this.localTwoUniqueid = localTwoUniqueid; + } + + public String getDestTransfererChannel() + { + return destTransfererChannel; + } + + public void setDestTransfererChannel(String destTransfererChannel) + { + this.destTransfererChannel = destTransfererChannel; + } + + public String getTransfereeChannel() + { + return transfereeChannel; + } + + public void setTransfereeChannel(String transfereeChannel) + { + this.transfereeChannel = transfereeChannel; + } + + public String getTransfereeChannelState() + { + return transfereeChannelState; + } + + public void setTransfereeChannelState(String transfereeChannelState) + { + this.transfereeChannelState = transfereeChannelState; + } + + public String getTransfereeChannelStateDesc() + { + return transfereeChannelStateDesc; + } + + public void setTransfereeChannelStateDesc(String transfereeChannelStateDesc) + { + this.transfereeChannelStateDesc = transfereeChannelStateDesc; + } + + public String getTransfereeCallerIDNum() + { + return transfereeCallerIDNum; + } + + public void setTransfereeCallerIDNum(String transfereeCallerIDNum) + { + this.transfereeCallerIDNum = transfereeCallerIDNum; + } + + public String getTransfereeCallerIDName() + { + return transfereeCallerIDName; + } + + public void setTransfereeCallerIDName(String transfereeCallerIDName) + { + this.transfereeCallerIDName = transfereeCallerIDName; + } + + public String getTransfereeConnectedLineNum() + { + return transfereeConnectedLineNum; + } + + public void setTransfereeConnectedLineNum(String transfereeConnectedLineNum) + { + this.transfereeConnectedLineNum = transfereeConnectedLineNum; + } + + public String getTransfereeConnectedLineName() + { + return transfereeConnectedLineName; + } + + public void setTransfereeConnectedLineName(String transfereeConnectedLineName) + { + this.transfereeConnectedLineName = transfereeConnectedLineName; + } + + public String getTransfereeAccountCode() + { + return transfereeAccountCode; + } + + public void setTransfereeAccountCode(String transfereeAccountCode) + { + this.transfereeAccountCode = transfereeAccountCode; + } + + public String getTransfereeContext() + { + return transfereeContext; + } + + public void setTransfereeContext(String transfereeContext) + { + this.transfereeContext = transfereeContext; + } + + public String getTransfereeExten() + { + return transfereeExten; + } + + public void setTransfereeExten(String transfereeExten) + { + this.transfereeExten = transfereeExten; + } + + public String getTransfereePriority() + { + return transfereePriority; + } + + public void setTransfereePriority(String transfereePriority) + { + this.transfereePriority = transfereePriority; + } + + public String getTransfereeUniqueid() + { + return transfereeUniqueid; + } + + public void setTransfereeUniqueid(String transfereeUniqueid) + { + this.transfereeUniqueid = transfereeUniqueid; + } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 76a8a5c63..5959145f7 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -72,6 +72,7 @@ private void registerBuiltinEventClasses() registerEventClass(BridgeExecEvent.class); registerEventClass(BridgeLeaveEvent.class); registerEventClass(BlindTransferEvent.class); + registerEventClass(AttendedTransferEvent.class); registerEventClass(CdrEvent.class); registerEventClass(ChallengeSentEvent.class); registerEventClass(ChannelReloadEvent.class); From 95efb9ccf5d211e01bd109cdea705579e5c874b2 Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Tue, 7 Jul 2015 13:47:34 +0300 Subject: [PATCH 0167/1055] LocalBridgeEvent: add Asterisk 13 fields --- .../manager/event/LocalBridgeEvent.java | 264 ++++++++++++++++++ 1 file changed, 264 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/LocalBridgeEvent.java b/src/main/java/org/asteriskjava/manager/event/LocalBridgeEvent.java index 6bc6ad37b..8982d20a9 100644 --- a/src/main/java/org/asteriskjava/manager/event/LocalBridgeEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/LocalBridgeEvent.java @@ -39,6 +39,30 @@ public class LocalBridgeEvent extends ManagerEvent private String callerId1; private String callerId2; private String localOptimization; + private String localOneCalleridName; + private String localTwoChannel; + private String localTwoLanguage; + private String localTwoExten; + private String localOneChannel; + private String localOneContext; + private String localOneConnectedLineNum; + private String localOneConnectedLineName; + private String localOneChannelStateDesc; + private String localOneChannelState; + private String localOneExten; + private String localOneLanguage; + private String localOnePriority; + private String localOneUniqueId; + private String localTwochannelState; + private String localTwoChannelStateDesc; + private String localTwoPriority; + private String localTwoContext; + private String localTwoCalleridNum; + private String localTwoCalleridName; + private String localTwoUniqueid; + private String localOneCalleridNum; + private String localTwoConnectedLineName; + private String localTwoConnectedLineNum; public LocalBridgeEvent(Object source) { @@ -119,4 +143,244 @@ public String getLocalOptimization() { public void setLocalOptimization(String localOptimization) { this.localOptimization = localOptimization; } + + public String getLocalOneCalleridName() + { + return localOneCalleridName; + } + + public void setLocalOneCalleridName(String localOneCalleridName) + { + this.localOneCalleridName = localOneCalleridName; + } + + public String getLocalTwoChannel() + { + return localTwoChannel; + } + + public void setLocalTwoChannel(String localTwoChannel) + { + this.localTwoChannel = localTwoChannel; + } + + public String getLocalTwoLanguage() + { + return localTwoLanguage; + } + + public void setLocalTwoLanguage(String localTwoLanguage) + { + this.localTwoLanguage = localTwoLanguage; + } + + public String getLocalTwoExten() + { + return localTwoExten; + } + + public void setLocalTwoExten(String localTwoExten) + { + this.localTwoExten = localTwoExten; + } + + public String getLocalOneChannel() + { + return localOneChannel; + } + + public void setLocalOneChannel(String localOneChannel) + { + this.localOneChannel = localOneChannel; + } + + public String getLocalOneContext() + { + return localOneContext; + } + + public void setLocalOneContext(String localOneContext) + { + this.localOneContext = localOneContext; + } + + public String getLocalOneConnectedLineNum() + { + return localOneConnectedLineNum; + } + + public void setLocalOneConnectedLineNum(String localOneConnectedLineNum) + { + this.localOneConnectedLineNum = localOneConnectedLineNum; + } + + public String getLocalOneConnectedLineName() + { + return localOneConnectedLineName; + } + + public void setLocalOneConnectedLineName(String localOneConnectedLineName) + { + this.localOneConnectedLineName = localOneConnectedLineName; + } + + public String getLocalOneChannelStateDesc() + { + return localOneChannelStateDesc; + } + + public void setLocalOneChannelStateDesc(String localOneChannelStateDesc) + { + this.localOneChannelStateDesc = localOneChannelStateDesc; + } + + public String getLocalOneChannelState() + { + return localOneChannelState; + } + + public void setLocalOneChannelState(String localOneChannelState) + { + this.localOneChannelState = localOneChannelState; + } + + public String getLocalOneExten() + { + return localOneExten; + } + + public void setLocalOneExten(String localOneExten) + { + this.localOneExten = localOneExten; + } + + public String getLocalOneLanguage() + { + return localOneLanguage; + } + + public void setLocalOneLanguage(String localOneLanguage) + { + this.localOneLanguage = localOneLanguage; + } + + public String getLocalOnePriority() + { + return localOnePriority; + } + + public void setLocalOnePriority(String localOnePriority) + { + this.localOnePriority = localOnePriority; + } + + public String getLocalOneUniqueId() + { + return localOneUniqueId; + } + + public void setLocalOneUniqueId(String localOneUniqueId) + { + this.localOneUniqueId = localOneUniqueId; + } + + public String getLocalTwochannelState() + { + return localTwochannelState; + } + + public void setLocalTwochannelState(String localTwochannelState) + { + this.localTwochannelState = localTwochannelState; + } + + public String getLocalTwoChannelStateDesc() + { + return localTwoChannelStateDesc; + } + + public void setLocalTwoChannelStateDesc(String localTwoChannelStateDesc) + { + this.localTwoChannelStateDesc = localTwoChannelStateDesc; + } + + public String getLocalTwoPriority() + { + return localTwoPriority; + } + + public void setLocalTwoPriority(String localTwoPriority) + { + this.localTwoPriority = localTwoPriority; + } + + public String getLocalTwoContext() + { + return localTwoContext; + } + + public void setLocalTwoContext(String localTwoContext) + { + this.localTwoContext = localTwoContext; + } + + public String getLocalTwoCalleridNum() + { + return localTwoCalleridNum; + } + + public void setLocalTwoCalleridNum(String localTwoCalleridNum) + { + this.localTwoCalleridNum = localTwoCalleridNum; + } + + public String getLocalTwoCalleridName() + { + return localTwoCalleridName; + } + + public void setLocalTwoCalleridName(String localTwoCalleridName) + { + this.localTwoCalleridName = localTwoCalleridName; + } + + public String getLocalTwoUniqueid() + { + return localTwoUniqueid; + } + + public void setLocalTwoUniqueid(String localTwoUniqueid) + { + this.localTwoUniqueid = localTwoUniqueid; + } + + public String getLocalOneCalleridNum() + { + return localOneCalleridNum; + } + + public void setLocalOneCalleridNum(String localOneCalleridNum) + { + this.localOneCalleridNum = localOneCalleridNum; + } + + public String getLocalTwoConnectedLineName() + { + return localTwoConnectedLineName; + } + + public void setLocalTwoConnectedLineName(String localTwoConnectedLineName) + { + this.localTwoConnectedLineName = localTwoConnectedLineName; + } + + public String getLocalTwoConnectedLineNum() + { + return localTwoConnectedLineNum; + } + + public void setLocalTwoConnectedLineNum(String localTwoConnectedLineNum) + { + this.localTwoConnectedLineNum = localTwoConnectedLineNum; + } } From 4ed007e753fe80c1e241ee94d149c8b82aafef9f Mon Sep 17 00:00:00 2001 From: Alexander Polakov Date: Tue, 7 Jul 2015 12:40:45 +0300 Subject: [PATCH 0168/1055] Add CelEvent --- .../asteriskjava/manager/event/CelEvent.java | 252 ++++++++++++++++++ .../manager/internal/EventBuilderImpl.java | 1 + 2 files changed, 253 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/CelEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/CelEvent.java b/src/main/java/org/asteriskjava/manager/event/CelEvent.java new file mode 100644 index 000000000..5a2087d54 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/CelEvent.java @@ -0,0 +1,252 @@ +package org.asteriskjava.manager.event; +/** + * Raised when a Channel Event Log is generated for a channel. + * + * https://wiki.asterisk.org/wiki/display/AST/Asterisk+13+ManagerEvent_CEL + */ +public class CelEvent extends ManagerEvent +{ + public static final String CEL_EVENT_CHAN_START = "CHAN_START"; + public static final String CEL_EVENT_CHAN_END = "CHAN_END"; + public static final String CEL_EVENT_ANSWER = "ANSWER"; + public static final String CEL_EVENT_HANGUP = "HANGUP"; + public static final String CEL_EVENT_BRIDGE_ENTER = "BRIDGE_ENTER"; + public static final String CEL_EVENT_BRIDGE_EXIT = "BRIDGE_EXIT"; + public static final String CEL_EVENT_APP_START = "APP_START"; + public static final String CEL_EVENT_APP_END = "APP_END"; + public static final String CEL_EVENT_PARK_START = "PARK_START"; + public static final String CEL_EVENT_PARK_END = "PARK_END"; + public static final String CEL_EVENT_BLINDTRANSFER = "BLINDTRANSFER"; + public static final String CEL_EVENT_ATTENDEDTRANSFER = "ATTENDEDTRANSFER"; + public static final String CEL_EVENT_PICKUP = "PICKUP"; + public static final String CEL_EVENT_FORWARD = "FORWARD"; + public static final String CEL_EVENT_LINKEDID_END = "LINKEDID_END"; + public static final String CEL_EVENT_LOCAL_OPTIMIZE = "LOCAL_OPTIMIZE"; + public static final String CEL_EVENT_USER_DEFINED = "USER_DEFINED"; + + private String eventName; + private String accountCode; + private String callerIDnum; + private String callerIDname; + private String callerIDani; + private String callerIDrdnis; + private String callerIDdnid; + private String exten; + private String context; + private String application; + private String appData; + private String eventTime; + private String amaFlags; + private String uniqueID; + private String linkedID; + private String userField; + private String peer; + private String peerAccount; + private String extra; + private String channel; + + public CelEvent(Object source) + { + super(source); + } + + public String getEventName() + { + return eventName; + } + + public void setEventName(String eventName) + { + this.eventName = eventName; + } + + public String getAccountCode() + { + return accountCode; + } + + public void setAccountCode(String accountCode) + { + this.accountCode = accountCode; + } + + public String getCallerIDnum() + { + return callerIDnum; + } + + public void setCallerIDnum(String callerIDnum) + { + this.callerIDnum = callerIDnum; + } + + public String getCallerIDname() + { + return callerIDname; + } + + public void setCallerIDname(String callerIDname) + { + this.callerIDname = callerIDname; + } + + public String getCallerIDani() + { + return callerIDani; + } + + public void setCallerIDani(String callerIDani) + { + this.callerIDani = callerIDani; + } + + public String getCallerIDrdnis() + { + return callerIDrdnis; + } + + public void setCallerIDrdnis(String callerIDrdnis) + { + this.callerIDrdnis = callerIDrdnis; + } + + public String getCallerIDdnid() + { + return callerIDdnid; + } + + public void setCallerIDdnid(String callerIDdnid) + { + this.callerIDdnid = callerIDdnid; + } + + public String getExten() + { + return exten; + } + + public void setExten(String exten) + { + this.exten = exten; + } + + public String getContext() + { + return context; + } + + public void setContext(String context) + { + this.context = context; + } + + public String getApplication() + { + return application; + } + + public void setApplication(String application) + { + this.application = application; + } + + public String getAppData() + { + return appData; + } + + public void setAppData(String appData) + { + this.appData = appData; + } + + public String getEventTime() + { + return eventTime; + } + + public void setEventTime(String eventTime) + { + this.eventTime = eventTime; + } + + public String getAmaFlags() + { + return amaFlags; + } + + public void setAmaFlags(String amaFlags) + { + this.amaFlags = amaFlags; + } + + public String getUniqueID() + { + return uniqueID; + } + + public void setUniqueID(String uniqueID) + { + this.uniqueID = uniqueID; + } + + public String getLinkedID() + { + return linkedID; + } + + public void setLinkedID(String linkedID) + { + this.linkedID = linkedID; + } + + public String getUserField() + { + return userField; + } + + public void setUserField(String userField) + { + this.userField = userField; + } + + public String getPeer() + { + return peer; + } + + public void setPeer(String peer) + { + this.peer = peer; + } + + public String getPeerAccount() + { + return peerAccount; + } + + public void setPeerAccount(String peerAccount) + { + this.peerAccount = peerAccount; + } + + public String getExtra() + { + return extra; + } + + public void setExtra(String extra) + { + this.extra = extra; + } + + public String getChannel() + { + return channel; + } + + public void setChannel(String channel) + { + this.channel = channel; + } +} diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 76a8a5c63..26e952374 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -73,6 +73,7 @@ private void registerBuiltinEventClasses() registerEventClass(BridgeLeaveEvent.class); registerEventClass(BlindTransferEvent.class); registerEventClass(CdrEvent.class); + registerEventClass(CelEvent.class); registerEventClass(ChallengeSentEvent.class); registerEventClass(ChannelReloadEvent.class); registerEventClass(ChannelUpdateEvent.class); From 2609ad77e24bb82ecb58f81e3aca5dccfe729def Mon Sep 17 00:00:00 2001 From: pet Date: Tue, 14 Jul 2015 11:15:38 +0200 Subject: [PATCH 0169/1055] =?UTF-8?q?multiline=20content=20string=20f?= =?UTF-8?q?=C3=BCr=20long=20sipnotify=20messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/internal/ActionBuilderImpl.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java index 1a6e96fd8..8742179a3 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ActionBuilderImpl.java @@ -202,9 +202,21 @@ private void appendMap12(StringBuffer sb, String singularKey, Map getters = ReflectionUtil.getGetters(action.getClass()); - - if(getters.containsKey(ATTRIBUTES_PROPERTY_NAME)) + + if (getters.containsKey(ATTRIBUTES_PROPERTY_NAME)) { Method getter = getters.get(ATTRIBUTES_PROPERTY_NAME); Object value = null; @@ -127,18 +128,18 @@ else if (action.getActionId() != null) { logger.error("Unable to retrieve property '" + ATTRIBUTES_PROPERTY_NAME + "' of " + action.getClass(), ex); } - - if(value instanceof Map) + + if (value instanceof Map) { - Map attributes = (Map)value; + Map attributes = (Map) value; for (Map.Entry entry : attributes.entrySet()) { appendString(sb, entry.getKey() == null ? "null" : entry.getKey().toString(), - entry.getValue() == null ? "null" : entry.getValue().toString()); - } + entry.getValue() == null ? "null" : entry.getValue().toString()); + } } } - + sb.append(LINE_SEPARATOR); return sb.toString(); } @@ -202,20 +203,26 @@ private void appendMap12(StringBuffer sb, String singularKey, Map Date: Tue, 28 Jul 2015 19:49:40 +0200 Subject: [PATCH 0171/1055] Removed dependency to commons-lang3. --- pom.xml | 6 ------ .../live/internal/AsteriskQueueImpl.java | 20 +++++++++---------- .../internal/AsteriskQueueMemberImpl.java | 12 +++++------ .../java/org/asteriskjava/util/AstUtil.java | 11 ++++++++++ 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index e1ef82638..d620df858 100644 --- a/pom.xml +++ b/pom.xml @@ -226,12 +226,6 @@ 1.2.17 compile - - org.apache.commons - commons-lang3 - 3.1 - compile - org.slf4j slf4j-api diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueImpl.java index 836eeffcf..d775cb9d3 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueImpl.java @@ -24,11 +24,11 @@ import java.util.Timer; import java.util.TimerTask; -import org.apache.commons.lang3.ObjectUtils; import org.asteriskjava.live.AsteriskQueue; import org.asteriskjava.live.AsteriskQueueEntry; import org.asteriskjava.live.AsteriskQueueListener; import org.asteriskjava.live.AsteriskQueueMember; +import org.asteriskjava.util.AstUtil; import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; @@ -136,7 +136,7 @@ public String getStrategy() */ boolean setMax(Integer max) { - if(!ObjectUtils.equals(this.max, max)){ + if(!AstUtil.equals(this.max, max)){ this.max = max; stampLastUpdate(); return true; @@ -156,7 +156,7 @@ public Integer getServiceLevel() */ boolean setServiceLevel(Integer serviceLevel) { - if(!ObjectUtils.equals(this.serviceLevel, serviceLevel)){ + if(!AstUtil.equals(this.serviceLevel, serviceLevel)){ this.serviceLevel = serviceLevel; stampLastUpdate(); return true; @@ -176,7 +176,7 @@ public Integer getCalls() { * @return true if value updated, false otherwise */ boolean setCalls(Integer calls) { - if(!ObjectUtils.equals(this.calls, calls)){ + if(!AstUtil.equals(this.calls, calls)){ this.calls = calls; stampLastUpdate(); return true; @@ -200,7 +200,7 @@ public Integer getHoldTime() { * @return true if value updated, false otherwise */ boolean setHoldTime(Integer holdTime) { - if(!ObjectUtils.equals(this.holdTime, holdTime)){ + if(!AstUtil.equals(this.holdTime, holdTime)){ this.holdTime = holdTime; stampLastUpdate(); return true; @@ -219,7 +219,7 @@ public Integer getTalkTime() { * @return true if value updated, false otherwise */ boolean setTalkTime(Integer talkTime) { - if(!ObjectUtils.equals(this.talkTime, talkTime)){ + if(!AstUtil.equals(this.talkTime, talkTime)){ this.talkTime = talkTime; stampLastUpdate(); return true; @@ -238,7 +238,7 @@ public Integer getCompleted() { * @return true if value updated, false otherwise */ boolean setCompleted(Integer completed) { - if(!ObjectUtils.equals(this.completed, completed)){ + if(!AstUtil.equals(this.completed, completed)){ this.completed = completed; stampLastUpdate(); return true; @@ -257,7 +257,7 @@ public Integer getAbandoned() { * @return true if value updated, false otherwise */ boolean setAbandoned(Integer abandoned) { - if(!ObjectUtils.equals(this.abandoned, abandoned)){ + if(!AstUtil.equals(this.abandoned, abandoned)){ this.abandoned = abandoned; stampLastUpdate(); return true; @@ -277,7 +277,7 @@ public Double getServiceLevelPerf() { * @return true if value updated, false otherwise */ boolean setServiceLevelPerf(Double serviceLevelPerf) { - if(!ObjectUtils.equals(this.serviceLevelPerf, serviceLevelPerf)){ + if(!AstUtil.equals(this.serviceLevelPerf, serviceLevelPerf)){ this.serviceLevelPerf = serviceLevelPerf; stampLastUpdate(); return true; @@ -297,7 +297,7 @@ public Integer getWeight() */ boolean setWeight(Integer weight) { - if(!ObjectUtils.equals(this.weight, weight)){ + if(!AstUtil.equals(this.weight, weight)){ this.weight = weight; stampLastUpdate(); return true; diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java index 96b4cf431..59309ec7c 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java @@ -16,7 +16,6 @@ */ package org.asteriskjava.live.internal; -import org.apache.commons.lang3.ObjectUtils; import org.asteriskjava.live.AsteriskQueue; import org.asteriskjava.live.AsteriskQueueMember; import org.asteriskjava.live.InvalidPenaltyException; @@ -27,6 +26,7 @@ import org.asteriskjava.manager.action.QueuePenaltyAction; import org.asteriskjava.manager.response.ManagerError; import org.asteriskjava.manager.response.ManagerResponse; +import org.asteriskjava.util.AstUtil; /** * Default implementation of a queue member. @@ -214,7 +214,7 @@ public String toString() synchronized boolean stateChanged(QueueMemberState state) { - if(!ObjectUtils.equals(this.state, state)){ + if(!AstUtil.equals(this.state, state)){ QueueMemberState oldState = this.state; this.state = state; firePropertyChange(PROPERTY_STATE, oldState, state); @@ -225,7 +225,7 @@ synchronized boolean stateChanged(QueueMemberState state) synchronized boolean penaltyChanged(Integer penalty) { - if(!ObjectUtils.equals(this.penalty, penalty)){ + if(!AstUtil.equals(this.penalty, penalty)){ Integer oldPenalty = this.penalty; this.penalty = penalty; firePropertyChange(PROPERTY_PENALTY, oldPenalty, penalty); @@ -237,7 +237,7 @@ synchronized boolean penaltyChanged(Integer penalty) synchronized boolean pausedChanged(boolean paused) { - if(!ObjectUtils.equals(this.paused, paused)){ + if(!AstUtil.equals(this.paused, paused)){ boolean oldPaused = this.paused; this.paused = paused; firePropertyChange(PROPERTY_PAUSED, oldPaused, paused); @@ -247,7 +247,7 @@ synchronized boolean pausedChanged(boolean paused) } synchronized boolean callsTakenChanged(Integer callsTaken){ - if(!ObjectUtils.equals(this.callsTaken, callsTaken)){ + if(!AstUtil.equals(this.callsTaken, callsTaken)){ Integer oldcallsTaken = this.callsTaken; this.callsTaken = callsTaken; firePropertyChange(PROPERTY_CALLSTAKEN, oldcallsTaken, callsTaken); @@ -257,7 +257,7 @@ synchronized boolean callsTakenChanged(Integer callsTaken){ } synchronized boolean lastCallChanged(Long lastCall){ - if(!ObjectUtils.equals(this.lastCall, lastCall)){ + if(!AstUtil.equals(this.lastCall, lastCall)){ Long oldlastCall = this.lastCall; this.lastCall = lastCall; firePropertyChange(PROPERTY_LASTCALL, oldlastCall, lastCall); diff --git a/src/main/java/org/asteriskjava/util/AstUtil.java b/src/main/java/org/asteriskjava/util/AstUtil.java index 53020e693..bd120ce4a 100644 --- a/src/main/java/org/asteriskjava/util/AstUtil.java +++ b/src/main/java/org/asteriskjava/util/AstUtil.java @@ -104,6 +104,17 @@ public static boolean isTrue(Object o) return TRUE_LITERALS.contains(s.toLowerCase(Locale.US)); } + /** + * @param a an object + * @param b an object to be compared with {@code a} for equality + * @return {@code true} if the arguments are equal to each other + * and {@code false} otherwise + */ + public static boolean equals(Object a, Object b) + { + return a == b || a != null && a.equals(b); + } + /** * Parses a string for caller id information. *
From 44550a3f8a797865b2e835d2a28a8441e80237c8 Mon Sep 17 00:00:00 2001 From: leonardossilva Date: Tue, 25 Aug 2015 14:28:25 -0300 Subject: [PATCH 0172/1055] Update CoreShowChannelEvent.java Good afternoon, I noticed that while receiving the same event did not add to the object bridgeid as the variable name was different. I made a change by adding the variable bridgeid and creating their Getters and Setters and started to work. If interesting to add here that this change. Thank you --- .../manager/event/CoreShowChannelEvent.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java index 731e984e7..5fcab4124 100644 --- a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java @@ -41,6 +41,7 @@ public class CoreShowChannelEvent extends ResponseEvent private String accountcode; private String bridgedChannel; private String bridgeduniqueid; + private String bridgeid; public CoreShowChannelEvent(Object source) { @@ -128,7 +129,20 @@ public void setBridgeduniqueid(String bridgeduniqueid) { this.bridgeduniqueid = bridgeduniqueid; } + + /** + * Returns the Bridged UniqueID Case params name return "bridgeid" + * + * @return uniqueid + */ + public String getBridgeid() { + return bridgeid; + } + public void setBridgeid(String bridgeid) { + this.bridgeid = bridgeid; + } + /** * Returns the Originate Channel name * From 51c17557fb48216ef1a954b45b2fdbd88156f97a Mon Sep 17 00:00:00 2001 From: leonardossilva Date: Tue, 25 Aug 2015 14:36:11 -0300 Subject: [PATCH 0173/1055] Update EventBuilderImpl.java Good afternoon, I noticed that there is not in the package the classes for QueueCallerJoin and QueueCallerLeave events then based on class QueueCallerAbandonEvent created their classes these events and added to my project and it worked, and it was necessary to change this file also to generate the objects of events. I will add the classes in maneger.events package. If interesting to add here that this change. Thank you --- .../org/asteriskjava/manager/internal/EventBuilderImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java index 67176abdc..a84f34318 100644 --- a/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/EventBuilderImpl.java @@ -165,6 +165,8 @@ private void registerBuiltinEventClasses() registerEventClass(PickupEvent.class); registerEventClass(PriEventEvent.class); registerEventClass(QueueCallerAbandonEvent.class); + registerEventClass(QueueCallerJoinEvent.class); + registerEventClass(QueueCallerLeaveEvent.class); registerEventClass(QueueEntryEvent.class); registerEventClass(QueueMemberAddedEvent.class); registerEventClass(QueueMemberEvent.class); From 1f69227b2b0edd32d972758b8c71ed5b5e9c51fc Mon Sep 17 00:00:00 2001 From: leonardossilva Date: Tue, 25 Aug 2015 14:38:00 -0300 Subject: [PATCH 0174/1055] Create QueueCallerLeaveEvent Good afternoon, I added this event as had spoken at another fork If interesting to add here that this change. Thank you --- .../manager/event/QueueCallerLeaveEvent | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent diff --git a/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent b/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent new file mode 100644 index 000000000..8b50011bc --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent @@ -0,0 +1,59 @@ +/* + * Copyright 2004-2007 Stefan Reuter and others + * + * Licensed 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.asteriskjava.manager.event; + +/** + * A QueueCallerAbandonEvent is triggered when a caller abandons a queue before + * getting connected with an agent. + *

+ * It is implemented in apps/app_queue.c + *

+ * Available since Asterisk 1.4. + * + * @author martins + */ +public class QueueCallerLeaveEvent extends QueueEvent { + + /** + * Serializable version identifier + */ + private static final long serialVersionUID = 812069706662063871L; + + private Integer position; + + /** + * @param source + */ + public QueueCallerLeaveEvent(Object source) { + super(source); + } + + /** + * @return the position of the caller at the time they abandoned the queue + */ + public Integer getPosition() { + return position; + } + + /** + * @param position the position of the caller at the time they abandoned the + * queue + */ + public void setPosition(Integer position) { + this.position = position; + } +} From 26b3fb0d5bf9576da79e7c6527ddef80a433658a Mon Sep 17 00:00:00 2001 From: leonardossilva Date: Tue, 25 Aug 2015 14:38:39 -0300 Subject: [PATCH 0175/1055] Create QueueCallerJoinEvent Good afternoon, I added this event as had spoken at another fork If interesting to add here that this change. Thank you --- .../manager/event/QueueCallerJoinEvent | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent diff --git a/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent b/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent new file mode 100644 index 000000000..d9f2c73d6 --- /dev/null +++ b/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent @@ -0,0 +1,59 @@ +/* + * Copyright 2004-2007 Stefan Reuter and others + * + * Licensed 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.asteriskjava.manager.event; + +/** + * A QueueCallerAbandonEvent is triggered when a caller abandons a queue before + * getting connected with an agent. + *

+ * It is implemented in apps/app_queue.c + *

+ * Available since Asterisk 1.4. + * + * @author martins + */ +public class QueueCallerJoinEvent extends QueueEvent { + + /** + * Serializable version identifier + */ + private static final long serialVersionUID = 812069706662063871L; + + private Integer position; + + /** + * @param source + */ + public QueueCallerJoinEvent(Object source) { + super(source); + } + + /** + * @return the position of the caller at the time they abandoned the queue + */ + public Integer getPosition() { + return position; + } + + /** + * @param position the position of the caller at the time they abandoned the + * queue + */ + public void setPosition(Integer position) { + this.position = position; + } +} From 8013f0a921637d31a22f57090a17e83a3c0249aa Mon Sep 17 00:00:00 2001 From: Leonardo de Souza Silva Date: Wed, 26 Aug 2015 09:31:44 -0300 Subject: [PATCH 0176/1055] Update QueueCallerJoinEvent --- .../manager/event/QueueCallerJoinEvent | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent b/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent index d9f2c73d6..6333b7715 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent +++ b/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent @@ -17,16 +17,17 @@ package org.asteriskjava.manager.event; /** - * A QueueCallerAbandonEvent is triggered when a caller abandons a queue before + * A QueueCallerAbandonEvent is triggered when a caller join a queue before * getting connected with an agent. *

* It is implemented in apps/app_queue.c *

* Available since Asterisk 1.4. * - * @author martins + * @author Leonardo de Souza */ -public class QueueCallerJoinEvent extends QueueEvent { +public class QueueCallerJoinEvent extends QueueEvent +{ /** * Serializable version identifier @@ -38,22 +39,25 @@ public class QueueCallerJoinEvent extends QueueEvent { /** * @param source */ - public QueueCallerJoinEvent(Object source) { + public QueueCallerJoinEvent(Object source) + { super(source); } /** * @return the position of the caller at the time they abandoned the queue */ - public Integer getPosition() { + public Integer getPosition() + { return position; } /** * @param position the position of the caller at the time they abandoned the - * queue + * queue */ - public void setPosition(Integer position) { + public void setPosition(Integer position) + { this.position = position; } } From e707e6da641970c93968d716d9139cf49595f19e Mon Sep 17 00:00:00 2001 From: Leonardo de Souza Silva Date: Wed, 26 Aug 2015 09:32:27 -0300 Subject: [PATCH 0177/1055] Update QueueCallerJoinEvent Formated --- .../java/org/asteriskjava/manager/event/QueueCallerJoinEvent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent b/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent index 6333b7715..8f27e84b5 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent +++ b/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent @@ -17,7 +17,7 @@ package org.asteriskjava.manager.event; /** - * A QueueCallerAbandonEvent is triggered when a caller join a queue before + * A QueueCallerJoinEvent is triggered when a caller join a queue before * getting connected with an agent. *

* It is implemented in apps/app_queue.c From cd816b4c8d6f2ccfaaa8d55c2cfdd90efc9424a8 Mon Sep 17 00:00:00 2001 From: Leonardo de Souza Silva Date: Wed, 26 Aug 2015 09:33:24 -0300 Subject: [PATCH 0178/1055] Update QueueCallerLeaveEvent Formated --- .../manager/event/QueueCallerLeaveEvent | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent b/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent index 8b50011bc..8f6c3a7bb 100644 --- a/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent +++ b/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent @@ -17,16 +17,17 @@ package org.asteriskjava.manager.event; /** - * A QueueCallerAbandonEvent is triggered when a caller abandons a queue before + * A QueueCallerLeaveEvent is triggered when a caller leave a queue before * getting connected with an agent. *

* It is implemented in apps/app_queue.c *

* Available since Asterisk 1.4. * - * @author martins + * @author Leonardo de Souza */ -public class QueueCallerLeaveEvent extends QueueEvent { +public class QueueCallerLeaveEvent extends QueueEvent +{ /** * Serializable version identifier @@ -38,22 +39,25 @@ public class QueueCallerLeaveEvent extends QueueEvent { /** * @param source */ - public QueueCallerLeaveEvent(Object source) { + public QueueCallerLeaveEvent(Object source) + { super(source); } /** * @return the position of the caller at the time they abandoned the queue */ - public Integer getPosition() { + public Integer getPosition() + { return position; } /** * @param position the position of the caller at the time they abandoned the - * queue + * queue */ - public void setPosition(Integer position) { + public void setPosition(Integer position) + { this.position = position; } } From f4c2b55dfda3e59346d11f8c2e230a6f66d86005 Mon Sep 17 00:00:00 2001 From: Leonardo de Souza Silva Date: Thu, 27 Aug 2015 09:10:14 -0300 Subject: [PATCH 0179/1055] Update CoreShowChannelEvent.java I changed the deprecated methods to not to break any implementation that use them. --- .../manager/event/CoreShowChannelEvent.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java index 5fcab4124..2dfd4c8de 100644 --- a/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/CoreShowChannelEvent.java @@ -40,8 +40,9 @@ public class CoreShowChannelEvent extends ResponseEvent private String duration; private String accountcode; private String bridgedChannel; - private String bridgeduniqueid; private String bridgeid; + @Deprecated + private String bridgeduniqueid; public CoreShowChannelEvent(Object source) { @@ -120,29 +121,33 @@ public void setBridgedChannel(String bridgedChannel) * * @return uniqueid */ + @Deprecated public String getBridgeduniqueid() { return bridgeduniqueid; } + @Deprecated public void setBridgeduniqueid(String bridgeduniqueid) { this.bridgeduniqueid = bridgeduniqueid; } - + /** * Returns the Bridged UniqueID Case params name return "bridgeid" * * @return uniqueid */ - public String getBridgeid() { + public String getBridgeid() + { return bridgeid; } - public void setBridgeid(String bridgeid) { + public void setBridgeid(String bridgeid) + { this.bridgeid = bridgeid; } - + /** * Returns the Originate Channel name * From 005ee6bdbf4a37f5800874c3cfaa4a9b8f1ebea9 Mon Sep 17 00:00:00 2001 From: Jean Aunis Date: Wed, 2 Sep 2015 11:19:52 +0200 Subject: [PATCH 0180/1055] Fix compilation error due to missing .java extension --- .../event/{QueueCallerJoinEvent => QueueCallerJoinEvent.java} | 0 .../event/{QueueCallerLeaveEvent => QueueCallerLeaveEvent.java} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/main/java/org/asteriskjava/manager/event/{QueueCallerJoinEvent => QueueCallerJoinEvent.java} (100%) rename src/main/java/org/asteriskjava/manager/event/{QueueCallerLeaveEvent => QueueCallerLeaveEvent.java} (100%) diff --git a/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent b/src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent.java similarity index 100% rename from src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent rename to src/main/java/org/asteriskjava/manager/event/QueueCallerJoinEvent.java diff --git a/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent b/src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent.java similarity index 100% rename from src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent rename to src/main/java/org/asteriskjava/manager/event/QueueCallerLeaveEvent.java From 04d63b9043be9283f6fb8221ad7b782f1bfe1b34 Mon Sep 17 00:00:00 2001 From: Jean Aunis Date: Wed, 2 Sep 2015 11:20:27 +0200 Subject: [PATCH 0181/1055] Avoid sending a QueueStatusAction when receiving a QueueMemberStatusEvent --- .../live/internal/QueueManager.java | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/QueueManager.java b/src/main/java/org/asteriskjava/live/internal/QueueManager.java index 3a8d9624c..3b3092ec3 100644 --- a/src/main/java/org/asteriskjava/live/internal/QueueManager.java +++ b/src/main/java/org/asteriskjava/live/internal/QueueManager.java @@ -316,18 +316,22 @@ private void handleQueueMemberEvent(QueueMemberEvent event) event.getLastCall()); queue.addMember(member); - }else{ - if(member.stateChanged(QueueMemberState.valueOf(event.getStatus())) | - member.pausedChanged(event.getPaused()) | - member.penaltyChanged(event.getPenalty()) | - member.callsTakenChanged(event.getCallsTaken()) | - member.lastCallChanged(event.getLastCall())){ - queue.stampLastUpdate(); - } + } else { + manageQueueMemberChange(queue, member, event); } } + private void manageQueueMemberChange(AsteriskQueueImpl queue, AsteriskQueueMemberImpl member, QueueMemberEvent event) { + if(member.stateChanged(QueueMemberState.valueOf(event.getStatus())) | + member.pausedChanged(event.getPaused()) | + member.penaltyChanged(event.getPenalty()) | + member.callsTakenChanged(event.getCallsTaken()) | + member.lastCallChanged(event.getLastCall())){ + queue.stampLastUpdate(); + } + } + /** * Called during initialization to populate entries of the queues. * Currently does the same as handleJoinEvent() @@ -459,13 +463,7 @@ void handleQueueMemberStatusEvent(QueueMemberStatusEvent event) return; } - updateQueue(queue.getName()); - - member.stateChanged(QueueMemberState.valueOf(event.getStatus())); - member.penaltyChanged(event.getPenalty()); - member.lastCallChanged(event.getLastCall()); - member.callsTakenChanged(event.getCallsTaken()); - + manageQueueMemberChange(queue, member, event); queue.fireMemberStateChanged(member); } From 042c9ac514cd6153ff2d54ddddb91f55162af1bd Mon Sep 17 00:00:00 2001 From: Jean Aunis Date: Wed, 2 Sep 2015 13:03:10 +0200 Subject: [PATCH 0182/1055] Apply formatter --- .../live/internal/QueueManager.java | 262 +++++++++--------- 1 file changed, 136 insertions(+), 126 deletions(-) diff --git a/src/main/java/org/asteriskjava/live/internal/QueueManager.java b/src/main/java/org/asteriskjava/live/internal/QueueManager.java index 3b3092ec3..63db14f31 100644 --- a/src/main/java/org/asteriskjava/live/internal/QueueManager.java +++ b/src/main/java/org/asteriskjava/live/internal/QueueManager.java @@ -46,7 +46,7 @@ /** * Manages queue events on behalf of an AsteriskServer. - * + * * @author srt * @version $Id$ */ @@ -61,8 +61,8 @@ class QueueManager private long queuesMonitorLeaseTime = 1000; /** - * A map of ACD queues by there name. - * 101119 OLB: Modified to act as a LRU Cache to optimize updates + * A map of ACD queues by there name. 101119 OLB: Modified to act as a LRU + * Cache to optimize updates */ private final LinkedHashMap queuesLRU = new LinkedHashMap(); @@ -116,6 +116,7 @@ else if (event instanceof QueueEntryEvent) /** * Method to ask for a Queue data update + * * @author Octavio Luna * @param queue * @throws ManagerCommunicationException @@ -126,8 +127,8 @@ void updateQueue(String queue) throws ManagerCommunicationException try { - QueueStatusAction queueStatusAction = new QueueStatusAction(); - queueStatusAction.setQueue(queue); + QueueStatusAction queueStatusAction = new QueueStatusAction(); + queueStatusAction.setQueue(queue); re = server.sendEventGeneratingAction(queueStatusAction); } catch (ManagerCommunicationException e) @@ -148,13 +149,13 @@ void updateQueue(String queue) throws ManagerCommunicationException for (ManagerEvent event : re.getEvents()) { - //101119 OLB: solo actualizamos el QUEUE por ahora - if (event instanceof QueueParamsEvent) + // 101119 OLB: solo actualizamos el QUEUE por ahora + if (event instanceof QueueParamsEvent) { handleQueueParamsEvent((QueueParamsEvent) event); } - else if (event instanceof QueueMemberEvent) + else if (event instanceof QueueMemberEvent) { handleQueueMemberEvent((QueueMemberEvent) event); } @@ -166,12 +167,11 @@ else if (event instanceof QueueEntryEvent) } } - void disconnected() { synchronized (queuesLRU) { - for(AsteriskQueueImpl queue : queuesLRU.values()) + for (AsteriskQueueImpl queue : queuesLRU.values()) { queue.cancelServiceLevelTimer(); } @@ -181,14 +181,14 @@ void disconnected() /** * Gets (a copy of) the list of the queues. - * + * * @return a copy of the list of the queues. */ Collection getQueues() { - refreshQueuesIfForced(); + refreshQueuesIfForced(); - Collection copy; + Collection copy; synchronized (queuesLRU) { @@ -197,34 +197,37 @@ Collection getQueues() return copy; } - public List getQueuesUpdatedAfter(Date date) { - refreshQueuesIfForced(); + public List getQueuesUpdatedAfter(Date date) + { + refreshQueuesIfForced(); - List copy = new ArrayList(); - synchronized (queuesLRU) { - List>list = - new ArrayList>(queuesLRU.entrySet()); - ListIterator> iter = - list.listIterator(list.size()); + List copy = new ArrayList(); + synchronized (queuesLRU) + { + List> list = new ArrayList>( + queuesLRU.entrySet()); + ListIterator> iter = list.listIterator(list.size()); - Entry entry; - while(iter.hasPrevious()){ - entry = iter.previous(); - AsteriskQueueImpl astQueue = entry.getValue(); - if(astQueue.getLastUpdateMillis() <= date.getTime()){ - break; - } - copy.add(astQueue); - } + Entry entry; + while (iter.hasPrevious()) + { + entry = iter.previous(); + AsteriskQueueImpl astQueue = entry.getValue(); + if (astQueue.getLastUpdateMillis() <= date.getTime()) + { + break; + } + copy.add(astQueue); + } - } + } - return copy; - } + return copy; + } /** * Adds a queue to the internal map, keyed by name. - * + * * @param queue the AsteriskQueueImpl to be added */ private void addQueue(AsteriskQueueImpl queue) @@ -237,7 +240,7 @@ private void addQueue(AsteriskQueueImpl queue) /** * Called during initialization to populate the list of queues. - * + * * @param event the event received */ private void handleQueueParamsEvent(QueueParamsEvent event) @@ -256,46 +259,42 @@ private void handleQueueParamsEvent(QueueParamsEvent event) final Integer abandoned = event.getAbandoned(); final Double serviceLevelPerf = event.getServiceLevelPerf(); - queue = getInternalQueueByName(name); if (queue == null) { - queue = new AsteriskQueueImpl( - server, name, max, strategy, serviceLevel, weight, - calls, holdTime, talkTime, completed, abandoned, serviceLevelPerf); + queue = new AsteriskQueueImpl(server, name, max, strategy, serviceLevel, weight, calls, holdTime, talkTime, + completed, abandoned, serviceLevelPerf); logger.info("Adding new queue " + queue); addQueue(queue); } else { - // We should never reach that code as this method is only called for initialization + // We should never reach that code as this method is only called for + // initialization // So the queue should never be in the queues list synchronized (queue) { - synchronized (queuesLRU){ - - if(queue.setMax(max) | - queue.setServiceLevel(serviceLevel) | - queue.setWeight(weight) | - queue.setCalls(calls) | - queue.setHoldTime(holdTime) | - queue.setTalkTime(talkTime) | - queue.setCompleted(completed) | - queue.setAbandoned(abandoned) | - queue.setServiceLevelPerf(serviceLevelPerf)){ - - queuesLRU.remove(queue.getName()); - queuesLRU.put(queue.getName(), queue); - } - } + synchronized (queuesLRU) + { + + if (queue.setMax(max) | queue.setServiceLevel(serviceLevel) | queue.setWeight(weight) + | queue.setCalls(calls) | queue.setHoldTime(holdTime) | queue.setTalkTime(talkTime) + | queue.setCompleted(completed) | queue.setAbandoned(abandoned) + | queue.setServiceLevelPerf(serviceLevelPerf)) + { + + queuesLRU.remove(queue.getName()); + queuesLRU.put(queue.getName(), queue); + } + } } } } /** * Called during initialization to populate the members of the queues. - * + * * @param event the QueueMemberEvent received */ private void handleQueueMemberEvent(QueueMemberEvent event) @@ -310,39 +309,39 @@ private void handleQueueMemberEvent(QueueMemberEvent event) AsteriskQueueMemberImpl member = queue.getMember(event.getLocation()); if (member == null) { - member = new AsteriskQueueMemberImpl(server, queue, event.getLocation(), - QueueMemberState.valueOf(event.getStatus()), event.getPaused(), - event.getPenalty(), event.getMembership(), event.getCallsTaken(), + member = new AsteriskQueueMemberImpl(server, queue, event.getLocation(), QueueMemberState.valueOf(event + .getStatus()), event.getPaused(), event.getPenalty(), event.getMembership(), event.getCallsTaken(), event.getLastCall()); queue.addMember(member); - } else { + } + else + { manageQueueMemberChange(queue, member, event); } } - private void manageQueueMemberChange(AsteriskQueueImpl queue, AsteriskQueueMemberImpl member, QueueMemberEvent event) { - if(member.stateChanged(QueueMemberState.valueOf(event.getStatus())) | - member.pausedChanged(event.getPaused()) | - member.penaltyChanged(event.getPenalty()) | - member.callsTakenChanged(event.getCallsTaken()) | - member.lastCallChanged(event.getLastCall())){ + private void manageQueueMemberChange(AsteriskQueueImpl queue, AsteriskQueueMemberImpl member, QueueMemberEvent event) + { + if (member.stateChanged(QueueMemberState.valueOf(event.getStatus())) | member.pausedChanged(event.getPaused()) + | member.penaltyChanged(event.getPenalty()) | member.callsTakenChanged(event.getCallsTaken()) + | member.lastCallChanged(event.getLastCall())) + { queue.stampLastUpdate(); } } /** - * Called during initialization to populate entries of the queues. - * Currently does the same as handleJoinEvent() - * + * Called during initialization to populate entries of the queues. Currently + * does the same as handleJoinEvent() + * * @param event - the QueueEntryEvent received */ private void handleQueueEntryEvent(QueueEntryEvent event) { final AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); - final AsteriskChannelImpl channel = channelManager - .getChannelImplByName(event.getChannel()); + final AsteriskChannelImpl channel = channelManager.getChannelImplByName(event.getChannel()); if (queue == null) { @@ -357,14 +356,17 @@ private void handleQueueEntryEvent(QueueEntryEvent event) if (queue.getEntry(event.getChannel()) != null) { - logger.debug("Ignored duplicate queue entry during population in queue " - + event.getQueue() + " for channel " + event.getChannel()); + logger.debug("Ignored duplicate queue entry during population in queue " + event.getQueue() + " for channel " + + event.getChannel()); return; } - // Asterisk gives us an initial position but doesn't tell us when he shifts the others - // We won't use this data for ordering until there is a appropriate event in AMI. - // (and refreshing the whole queue is too intensive and suffers incoherencies + // Asterisk gives us an initial position but doesn't tell us when he + // shifts the others + // We won't use this data for ordering until there is a appropriate + // event in AMI. + // (and refreshing the whole queue is too intensive and suffers + // incoherencies // due to asynchronous shift that leaves holes if requested too fast) int reportedPosition = event.getPosition(); @@ -373,7 +375,7 @@ private void handleQueueEntryEvent(QueueEntryEvent event) /** * Called from AsteriskServerImpl whenever a new entry appears in a queue. - * + * * @param event the JoinEvent received */ void handleJoinEvent(JoinEvent event) @@ -394,14 +396,16 @@ void handleJoinEvent(JoinEvent event) if (queue.getEntry(event.getChannel()) != null) { - logger.error("Ignored duplicate queue entry in queue " - + event.getQueue() + " for channel " + event.getChannel()); + logger.error("Ignored duplicate queue entry in queue " + event.getQueue() + " for channel " + event.getChannel()); return; } - // Asterisk gives us an initial position but doesn't tell us when he shifts the others - // We won't use this data for ordering until there is a appropriate event in AMI. - // (and refreshing the whole queue is too intensive and suffers incoherencies + // Asterisk gives us an initial position but doesn't tell us when he + // shifts the others + // We won't use this data for ordering until there is a appropriate + // event in AMI. + // (and refreshing the whole queue is too intensive and suffers + // incoherencies // due to asynchronous shift that leaves holes if requested too fast) int reportedPosition = event.getPosition(); @@ -410,7 +414,7 @@ void handleJoinEvent(JoinEvent event) /** * Called from AsteriskServerImpl whenever an enty leaves a queue. - * + * * @param event - the LeaveEvent received */ void handleLeaveEvent(LeaveEvent event) @@ -432,8 +436,8 @@ void handleLeaveEvent(LeaveEvent event) final AsteriskQueueEntryImpl existingQueueEntry = queue.getEntry(event.getChannel()); if (existingQueueEntry == null) { - logger.error("Ignored leave event for non existing queue entry in queue " - + event.getQueue() + " for channel " + event.getChannel()); + logger.error("Ignored leave event for non existing queue entry in queue " + event.getQueue() + " for channel " + + event.getChannel()); return; } @@ -441,14 +445,14 @@ void handleLeaveEvent(LeaveEvent event) } /** - * Challange a QueueMemberStatusEvent. - * Called from AsteriskServerImpl whenever a member state changes. - * + * Challange a QueueMemberStatusEvent. Called from AsteriskServerImpl + * whenever a member state changes. + * * @param event that was triggered by Asterisk server. */ void handleQueueMemberStatusEvent(QueueMemberStatusEvent event) { - AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); + AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); if (queue == null) { @@ -467,7 +471,8 @@ void handleQueueMemberStatusEvent(QueueMemberStatusEvent event) queue.fireMemberStateChanged(member); } - void handleQueueMemberPausedEvent(QueueMemberPausedEvent event) { + void handleQueueMemberPausedEvent(QueueMemberPausedEvent event) + { AsteriskQueueImpl queue = getInternalQueueByName(event.getQueue()); if (queue == null) @@ -508,9 +513,10 @@ void handleQueueMemberPenaltyEvent(QueueMemberPenaltyEvent event) /** * Retrieves a queue by its name. - * + * * @param queueName name of the queue. - * @return the requested queue or null if there is no queue with the given name. + * @return the requested queue or null if there is no queue + * with the given name. */ AsteriskQueueImpl getQueueByName(String queueName) { @@ -522,12 +528,12 @@ AsteriskQueueImpl getQueueByName(String queueName) logger.error("Requested queue '" + queueName + "' not found!"); } - return queue; + return queue; } private AsteriskQueueImpl getInternalQueueByName(String queueName) { - AsteriskQueueImpl queue; + AsteriskQueueImpl queue; synchronized (queuesLRU) { @@ -536,25 +542,29 @@ private AsteriskQueueImpl getInternalQueueByName(String queueName) return queue; } - private void refreshQueueIfForced(String queueName) { - if(queuesMonitorForced){ - updateQueue(queueName); - } - } - - private void refreshQueuesIfForced() { - if(queuesMonitorForced){ - if((System.currentTimeMillis()-queueMonitorLastTimeReloaded) > - queuesMonitorLeaseTime){ - initialize(); - queueMonitorLastTimeReloaded = System.currentTimeMillis(); - } - } - } - - /** + private void refreshQueueIfForced(String queueName) + { + if (queuesMonitorForced) + { + updateQueue(queueName); + } + } + + private void refreshQueuesIfForced() + { + if (queuesMonitorForced) + { + if ((System.currentTimeMillis() - queueMonitorLastTimeReloaded) > queuesMonitorLeaseTime) + { + initialize(); + queueMonitorLastTimeReloaded = System.currentTimeMillis(); + } + } + } + + /** * Challange a QueueMemberAddedEvent. - * + * * @param event - the generated QueueMemberAddedEvent. */ public void handleQueueMemberAddedEvent(QueueMemberAddedEvent event) @@ -569,9 +579,8 @@ public void handleQueueMemberAddedEvent(QueueMemberAddedEvent event) AsteriskQueueMemberImpl member = queue.getMember(event.getLocation()); if (member == null) { - member = new AsteriskQueueMemberImpl(server, queue, event.getLocation(), - QueueMemberState.valueOf(event.getStatus()), event.getPaused(), - event.getPenalty(), event.getMembership(), event.getCallsTaken(), + member = new AsteriskQueueMemberImpl(server, queue, event.getLocation(), QueueMemberState.valueOf(event + .getStatus()), event.getPaused(), event.getPenalty(), event.getMembership(), event.getCallsTaken(), event.getLastCall()); } @@ -580,7 +589,7 @@ public void handleQueueMemberAddedEvent(QueueMemberAddedEvent event) /** * Challange a QueueMemberRemovedEvent. - * + * * @param event - the generated QueueMemberRemovedEvent. */ public void handleQueueMemberRemovedEvent(QueueMemberRemovedEvent event) @@ -595,20 +604,21 @@ public void handleQueueMemberRemovedEvent(QueueMemberRemovedEvent event) final AsteriskQueueMemberImpl member = queue.getMember(event.getLocation()); if (member == null) { - logger.error("Ignored QueueMemberRemovedEvent for unknown agent name: " - + event.getMemberName() + " location: " + event.getLocation() - + " queue: " + event.getQueue()); + logger.error("Ignored QueueMemberRemovedEvent for unknown agent name: " + event.getMemberName() + " location: " + + event.getLocation() + " queue: " + event.getQueue()); return; } queue.removeMember(member); } - public void forceQueuesMonitor(boolean force) { - queuesMonitorForced = force; - } + public void forceQueuesMonitor(boolean force) + { + queuesMonitorForced = force; + } - public boolean isQueuesMonitorForced() { - return queuesMonitorForced; - } + public boolean isQueuesMonitorForced() + { + return queuesMonitorForced; + } } From 9536a2a909e64ffcf59a346392d0a9d5cf27c349 Mon Sep 17 00:00:00 2001 From: Jean-Yves LEBLEU Date: Wed, 30 Sep 2015 10:42:05 +0200 Subject: [PATCH 0183/1055] Add asterisk 13 field to agent called event MemberName replace AgentName --- .../asteriskjava/manager/event/AgentCalledEvent.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java index 0a8dab942..7790f27df 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java @@ -39,6 +39,7 @@ public class AgentCalledEvent extends ManagerEvent private String channelCalling; private String destinationChannel; private String uniqueId; + private String memberName; private Map variables; @@ -198,6 +199,17 @@ public void setUniqueId(String uniqueId) this.uniqueId = uniqueId; } + /** + * Returns the Queue Member name. + *

+ * Available since Asterisk 13 replace agentName + *

+ * + */ + public String getMemberName() { return memberName;} + + public void setMemberName(String memberName) { this.memberName = memberName; } + /** * Returns the channel variables if eventwhencalled is set to * vars in queues.conf. From 80e357e511e27d0cfa39336b9a61e204b0f0fddb Mon Sep 17 00:00:00 2001 From: Jean-Yves LEBLEU Date: Thu, 1 Oct 2015 05:34:44 +0200 Subject: [PATCH 0184/1055] Mark agentName as deprecated (asterisk13) --- .../org/asteriskjava/manager/event/AgentCalledEvent.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java index 7790f27df..484c69423 100644 --- a/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AgentCalledEvent.java @@ -35,7 +35,6 @@ public class AgentCalledEvent extends ManagerEvent private static final long serialVersionUID = 1L; private String queue; private String agentCalled; - private String agentName; private String channelCalling; private String destinationChannel; private String uniqueId; @@ -98,15 +97,18 @@ public void setAgentCalled(String agentCalled) * * @return the name of the agent that has been called. * @since 1.0.0 + * @deprecated use {@lkink #getMemberName()} instead (asterisk 13) */ + @Deprecated public String getAgentName() { - return agentName; + return memberName; } + @Deprecated public void setAgentName(String agentName) { - this.agentName = agentName; + this.memberName = agentName; } /** From b17d6949bade1805602d54fb255ef51166f16d4d Mon Sep 17 00:00:00 2001 From: Cyril Godi Date: Fri, 30 Oct 2015 15:35:42 +0100 Subject: [PATCH 0185/1055] Fix Issues in MuteAudioAction.java This action did not work : - getters was not public - Direction string was not lowercase --- .../manager/action/MuteAudioAction.java | 56 +++++++++++++++++-- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index 7c52b2dd4..e206fe345 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -43,7 +43,19 @@ public class MuteAudioAction extends AbstractManagerAction /** The audio direct (relative to the pbx) which is to be muted. */ public enum Direction { - IN, OUT, ALL + IN("in"), OUT("out"), ALL("all"); + + String value; + + Direction(String value) + { + this.value = value; + } + + public String toString() + { + return this.value; + } } private Direction direction; @@ -105,20 +117,52 @@ public String getAction() return "MuteAudio"; //$NON-NLS-1$ } - String getChannel() + /** + * Returns the name of the channel to monitor. + */ + public String getChannel() { return this.channel; } - Direction getDirection() + /** + * Returns the audio direction which is to be muted/unmuted. + */ + public Direction getDirection() { return this.direction; } - State getState() + /** + * Returns the state controls whether we are muting or unmuting the channel. + */ + public State getState() { return this.state; } - -} \ No newline at end of file + /** + * Sets the name of the channel to monitor.

+ * This property is mandatory. + */ + public void setChannel(String channel) { + this.channel = channel; + } + + /** + * Sets the audio direction which is to be muted/unmuted.

+ * This property is mandatory. + */ + public void setDirection(Direction direction) { + this.direction = direction; + } + + /** + * Sets the state controls whether we are muting or unmuting the channel.

+ * This property is mandatory. + */ + public void setState(State state) { + this.state = state; + } + +} From 88cd0f2a1cb2acd31929b32dcaed6fd630984d5e Mon Sep 17 00:00:00 2001 From: relrix Date: Mon, 2 Nov 2015 22:48:08 -0800 Subject: [PATCH 0186/1055] Update MuteAudioAction.java Made getChannel , getDirection, and getState public so these getters are accessible from AbstractManagerAction class. --- .../org/asteriskjava/manager/action/MuteAudioAction.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java index 7c52b2dd4..45f2031b0 100644 --- a/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java +++ b/src/main/java/org/asteriskjava/manager/action/MuteAudioAction.java @@ -105,20 +105,20 @@ public String getAction() return "MuteAudio"; //$NON-NLS-1$ } - String getChannel() + public String getChannel() { return this.channel; } - Direction getDirection() + public Direction getDirection() { return this.direction; } - State getState() + public State getState() { return this.state; } -} \ No newline at end of file +} From 0e4951e986b4e12c844f8b1d8a2323d079e33646 Mon Sep 17 00:00:00 2001 From: sere Date: Thu, 5 Nov 2015 14:21:11 +0100 Subject: [PATCH 0187/1055] String encoding configurable, where UTF-8 is default (eg. important for manager/user events) --- .../manager/DefaultManagerConnection.java | 13 + .../manager/ManagerConnection.java | 35 +- .../internal/ManagerConnectionImpl.java | 2778 +++++++++-------- .../internal/SocketConnectionFacadeImpl.java | 21 +- 4 files changed, 1445 insertions(+), 1402 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java index 5ce6aa949..451480fb6 100644 --- a/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/DefaultManagerConnection.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.net.InetAddress; +import java.nio.charset.Charset; import org.asteriskjava.AsteriskVersion; import org.asteriskjava.manager.action.EventGeneratingAction; @@ -153,6 +154,12 @@ public void setPassword(String password) impl.setPassword(password); } + @Override + public void setEncoding(Charset encoding) + { + impl.setEncoding(encoding); + } + /** * Sets the time in milliseconds the synchronous sendAction methods * {@link #sendAction(ManagerAction)} will wait for a response before @@ -244,6 +251,12 @@ public String getPassword() return impl.getPassword(); } + @Override + public Charset getEncoding() + { + return impl.getEncoding(); + } + public AsteriskVersion getVersion() { return impl.getVersion(); diff --git a/src/main/java/org/asteriskjava/manager/ManagerConnection.java b/src/main/java/org/asteriskjava/manager/ManagerConnection.java index f69471f3a..8b9ad5e4f 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/ManagerConnection.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.net.InetAddress; +import java.nio.charset.Charset; import org.asteriskjava.AsteriskVersion; import org.asteriskjava.manager.action.EventGeneratingAction; @@ -90,6 +91,10 @@ public interface ManagerConnection */ AsteriskVersion getVersion(); + void setEncoding(Charset encoding); + + Charset getEncoding(); + /** * Returns whether to use SSL. *

@@ -150,7 +155,7 @@ public interface ManagerConnection *

* The event class must be a concrete class with a default constructor (one * that takes no arguments). - * + * * @param userEventClass the class representing the user event to register. * @throws IllegalArgumentException if userEventClass is not a valid event * class. @@ -163,7 +168,7 @@ public interface ManagerConnection * The timeout to use when connecting the the Asterisk server. *

* Default is 0, that is using Java's built-in default. - * + * * @param socketTimeout the timeout value to be used in milliseconds. * @see java.net.Socket#connect(java.net.SocketAddress, int) * @since 0.2 @@ -181,7 +186,7 @@ public interface ManagerConnection * PingThread. *

* Default is 0, that is no read timeout. - * + * * @param socketReadTimeout the read timeout value to be used in * milliseconds. * @see java.net.Socket#setSoTimeout(int) @@ -192,7 +197,7 @@ public interface ManagerConnection /** * Logs in to the Asterisk server with the username and password specified * when this connection was created. - * + * * @throws IllegalStateException if connection is not in state INITIAL or * DISCONNECTED. * @throws IOException if the network connection is disrupted. @@ -208,7 +213,7 @@ public interface ManagerConnection /** * Logs in to the Asterisk server with the username and password specified * when this connection was created and a given event mask. - * + * * @param events the event mask. Set to "on" if all events should be send, * "off" if not events should be sent or a combination of * "system", "call" and "log" (separated by ',') to specify what @@ -228,7 +233,7 @@ public interface ManagerConnection /** * Sends a LogoffAction to the Asterisk server and disconnects. - * + * * @throws IllegalStateException if not in state CONNECTED or RECONNECTING. * @see org.asteriskjava.manager.action.LogoffAction */ @@ -237,7 +242,7 @@ public interface ManagerConnection /** * Returns the protocol identifier, that is a string like "Asterisk Call * Manager/1.0". - * + * * @return the protocol identifier of the Asterisk Manager Interface in use * if it has already been received; null otherwise */ @@ -245,7 +250,7 @@ public interface ManagerConnection /** * Returns the lifecycle status of this connection. - * + * * @return the lifecycle status of this connection. */ ManagerConnectionState getState(); @@ -253,7 +258,7 @@ public interface ManagerConnection /** * Sends a ManagerAction to the Asterisk server and waits for the * corresponding ManagerResponse. - * + * * @param action the action to send to the Asterisk server * @return the corresponding response received from the Asterisk server * @throws IOException if the network connection is disrupted. @@ -271,7 +276,7 @@ ManagerResponse sendAction(ManagerAction action) throws IOException, TimeoutExce /** * Sends a ManagerAction to the Asterisk server and waits for the * corresponding {@link ManagerResponse}. - * + * * @param action the action to send to the Asterisk server * @param timeout milliseconds to wait for the response before throwing a * TimeoutException @@ -294,7 +299,7 @@ ManagerResponse sendAction(ManagerAction action, long timeout) throws IOExceptio * quickly and does not do any fancy processing because it is called from * the reader thread which is blocked for the time it takes to execute your * callbackHandler. - * + * * @param action the action to send to the Asterisk server * @param callback the callback handler to call when the response is * received or null if you are not interested in @@ -324,7 +329,7 @@ void sendAction(ManagerAction action, SendActionCallback callback) throws IOExce * {@link org.asteriskjava.manager.action.StatusAction}, * {@link org.asteriskjava.manager.action.QueueStatusAction} or * {@link org.asteriskjava.manager.action.AgentsAction}. - * + * * @param action the action to send to the Asterisk server * @return a ResponseEvents that contains the corresponding response and * response events received from the Asterisk server @@ -362,7 +367,7 @@ ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws IO * {@link org.asteriskjava.manager.action.StatusAction}, the * {@link org.asteriskjava.manager.action.QueueStatusAction} or the * {@link org.asteriskjava.manager.action.AgentsAction}. - * + * * @param action the action to send to the Asterisk server * @param timeout milliseconds to wait for the response and the action * complete event before throwing a TimeoutException @@ -391,7 +396,7 @@ ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long time *

* Event listeners are notified about new events in the same order as they * were registered. - * + * * @param eventListener the listener to call whenever a manager event is * received * @see #removeEventListener(ManagerEventListener) @@ -402,7 +407,7 @@ ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long time * Unregisters a previously registered event listener. *

* Does nothing if the given event listener hasn't be been regiered before. - * + * * @param eventListener the listener to remove * @see #addEventListener(ManagerEventListener) */ diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index f816750fc..2e85e47c9 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -27,6 +27,8 @@ import java.io.Serializable; import java.net.Socket; import java.net.InetAddress; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -72,588 +74,605 @@ */ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher { - private static final int RECONNECTION_INTERVAL_1 = 50; - private static final int RECONNECTION_INTERVAL_2 = 5000; - private static final String DEFAULT_HOSTNAME = "localhost"; - private static final int DEFAULT_PORT = 5038; - private static final int RECONNECTION_VERSION_INTERVAL = 500; - private static final int MAX_VERSION_ATTEMPTS = 4; - private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); + private static final int RECONNECTION_INTERVAL_1 = 50; + private static final int RECONNECTION_INTERVAL_2 = 5000; + private static final String DEFAULT_HOSTNAME = "localhost"; + private static final int DEFAULT_PORT = 5038; + private static final int RECONNECTION_VERSION_INTERVAL = 500; + private static final int MAX_VERSION_ATTEMPTS = 4; + private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); private static final Pattern VERSION_PATTERN_1_6 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.6[-. ].*"); private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.8[-. ].*"); - private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); - private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); - private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?12[-. ].*"); - private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?13[-. ].*"); - - private static final AtomicLong idCounter = new AtomicLong(0); - - /** - * Instance logger. - */ - private final Log logger = LogFactory.getLog(getClass()); - - private final long id; - - /** - * Used to construct the internalActionId. - */ - private AtomicLong actionIdCounter = new AtomicLong(0); - - /* Config attributes */ - /** - * Hostname of the Asterisk server to connect to. - */ - private String hostname = DEFAULT_HOSTNAME; - - /** - * TCP port to connect to. - */ - private int port = DEFAULT_PORT; - - /** - * true to use SSL for the connection, false for a - * plain text connection. - */ - private boolean ssl = false; - - /** - * The username to use for login as defined in Asterisk's - * manager.conf. - */ - protected String username; - - /** - * The password to use for login as defined in Asterisk's - * manager.conf. - */ - protected String password; - - /** - * The default timeout to wait for a ManagerResponse after sending a - * ManagerAction. - */ - private long defaultResponseTimeout = 2000; - - /** - * The default timeout to wait for the last ResponseEvent after sending an - * EventGeneratingAction. - */ - private long defaultEventTimeout = 5000; - - /** - * The timeout to use when connecting the the Asterisk server. - */ - private int socketTimeout = 0; - - /** + private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); + private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); + private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?12[-. ].*"); + private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?13[-. ].*"); + + private static final AtomicLong idCounter = new AtomicLong(0); + + /** + * Instance logger. + */ + private final Log logger = LogFactory.getLog(getClass()); + + private final long id; + + /** + * Used to construct the internalActionId. + */ + private AtomicLong actionIdCounter = new AtomicLong(0); + + /* Config attributes */ + /** + * Hostname of the Asterisk server to connect to. + */ + private String hostname = DEFAULT_HOSTNAME; + + /** + * TCP port to connect to. + */ + private int port = DEFAULT_PORT; + + /** + * true to use SSL for the connection, false for a + * plain text connection. + */ + private boolean ssl = false; + + /** + * The username to use for login as defined in Asterisk's + * manager.conf. + */ + protected String username; + + /** + * The password to use for login as defined in Asterisk's + * manager.conf. + */ + protected String password; + + /** + * Encoding used for transmission of strings. + */ + private Charset encoding = StandardCharsets.UTF_8; + + /** + * The default timeout to wait for a ManagerResponse after sending a + * ManagerAction. + */ + private long defaultResponseTimeout = 2000; + + /** + * The default timeout to wait for the last ResponseEvent after sending an + * EventGeneratingAction. + */ + private long defaultEventTimeout = 5000; + + /** + * The timeout to use when connecting the the Asterisk server. + */ + private int socketTimeout = 0; + + /** * Closes the connection (and reconnects) if no input has been read for the * given amount of milliseconds. A timeout of zero is interpreted as an * infinite timeout. - * - * @see Socket#setSoTimeout(int) - */ - private int socketReadTimeout = 0; - - /** - * true to continue to reconnect after an authentication - * failure. - */ - private boolean keepAliveAfterAuthenticationFailure = true; - - /** - * The socket to use for TCP/IP communication with Asterisk. - */ - private SocketConnectionFacade socket; - - /** - * The thread that runs the reader. - */ - private Thread readerThread; - private final AtomicLong readerThreadCounter = new AtomicLong(0); - - private final AtomicLong reconnectThreadCounter = new AtomicLong(0); - - /** - * The reader to use to receive events and responses from asterisk. - */ - private ManagerReader reader; - - /** - * The writer to use to send actions to asterisk. - */ - private ManagerWriter writer; - - /** - * The protocol identifer Asterisk sends on connect wrapped into an object - * to be used as mutex. - */ - private final ProtocolIdentifierWrapper protocolIdentifier; - - /** - * The version of the Asterisk server we are connected to. - */ - private AsteriskVersion version; - - /** - * Contains the registered handlers that process the ManagerResponses. - *

- * Key is the internalActionId of the Action sent and value the - * corresponding ResponseListener. - */ - private final Map responseListeners; - - /** - * Contains the event handlers that handle ResponseEvents for the - * sendEventGeneratingAction methods. - *

- * Key is the internalActionId of the Action sent and value the - * corresponding EventHandler. - */ - private final Map responseEventListeners; - - /** - * Contains the event handlers that users registered. - */ - private final List eventListeners; - - protected ManagerConnectionState state = INITIAL; - - private String eventMask; - - /** - * Creates a new instance. - */ - public ManagerConnectionImpl() - { - this.id = idCounter.getAndIncrement(); - this.responseListeners = new HashMap(); - this.responseEventListeners = new HashMap(); - this.eventListeners = new ArrayList(); - this.protocolIdentifier = new ProtocolIdentifierWrapper(); - } - - // the following two methods can be overriden when running test cases to - // return a mock object - protected ManagerReader createReader(Dispatcher dispatcher, Object source) - { - return new ManagerReaderImpl(dispatcher, source); - } - - protected ManagerWriter createWriter() - { - return new ManagerWriterImpl(); - } - - /** - * Sets the hostname of the asterisk server to connect to. - *

- * Default is localhost. - * - * @param hostname the hostname to connect to - */ - public void setHostname(String hostname) - { - this.hostname = hostname; - } - - /** - * Sets the port to use to connect to the asterisk server. This is the port - * specified in asterisk's manager.conf file. - *

- * Default is 5038. - * - * @param port the port to connect to - */ - public void setPort(int port) - { - if (port <= 0) - { - this.port = DEFAULT_PORT; - } - else - { - this.port = port; - } - } - - /** + * + * @see Socket#setSoTimeout(int) + */ + private int socketReadTimeout = 0; + + /** + * true to continue to reconnect after an authentication + * failure. + */ + private boolean keepAliveAfterAuthenticationFailure = true; + + /** + * The socket to use for TCP/IP communication with Asterisk. + */ + private SocketConnectionFacade socket; + + /** + * The thread that runs the reader. + */ + private Thread readerThread; + private final AtomicLong readerThreadCounter = new AtomicLong(0); + + private final AtomicLong reconnectThreadCounter = new AtomicLong(0); + + /** + * The reader to use to receive events and responses from asterisk. + */ + private ManagerReader reader; + + /** + * The writer to use to send actions to asterisk. + */ + private ManagerWriter writer; + + /** + * The protocol identifer Asterisk sends on connect wrapped into an object + * to be used as mutex. + */ + private final ProtocolIdentifierWrapper protocolIdentifier; + + /** + * The version of the Asterisk server we are connected to. + */ + private AsteriskVersion version; + + /** + * Contains the registered handlers that process the ManagerResponses. + *

+ * Key is the internalActionId of the Action sent and value the + * corresponding ResponseListener. + */ + private final Map responseListeners; + + /** + * Contains the event handlers that handle ResponseEvents for the + * sendEventGeneratingAction methods. + *

+ * Key is the internalActionId of the Action sent and value the + * corresponding EventHandler. + */ + private final Map responseEventListeners; + + /** + * Contains the event handlers that users registered. + */ + private final List eventListeners; + + protected ManagerConnectionState state = INITIAL; + + private String eventMask; + + /** + * Creates a new instance. + */ + public ManagerConnectionImpl() + { + this.id = idCounter.getAndIncrement(); + this.responseListeners = new HashMap(); + this.responseEventListeners = new HashMap(); + this.eventListeners = new ArrayList(); + this.protocolIdentifier = new ProtocolIdentifierWrapper(); + } + + // the following two methods can be overriden when running test cases to + // return a mock object + protected ManagerReader createReader(Dispatcher dispatcher, Object source) + { + return new ManagerReaderImpl(dispatcher, source); + } + + protected ManagerWriter createWriter() + { + return new ManagerWriterImpl(); + } + + /** + * Sets the hostname of the asterisk server to connect to. + *

+ * Default is localhost. + * + * @param hostname the hostname to connect to + */ + public void setHostname(String hostname) + { + this.hostname = hostname; + } + + /** + * Sets the port to use to connect to the asterisk server. This is the port + * specified in asterisk's manager.conf file. + *

+ * Default is 5038. + * + * @param port the port to connect to + */ + public void setPort(int port) + { + if (port <= 0) + { + this.port = DEFAULT_PORT; + } + else + { + this.port = port; + } + } + + /** * Sets whether to use SSL.
- * Default is false. - * + * Default is false. + * * @param ssl true to use SSL for the connection, - * false for a plain text connection. - * @since 0.3 - */ - public void setSsl(boolean ssl) - { - this.ssl = ssl; - } - - /** - * Sets the username to use to connect to the asterisk server. This is the - * username specified in asterisk's manager.conf file. - * + * false for a plain text connection. + * @since 0.3 + */ + public void setSsl(boolean ssl) + { + this.ssl = ssl; + } + + /** + * Sets the username to use to connect to the asterisk server. This is the + * username specified in asterisk's manager.conf file. + * * @param username the username to use for login - */ - public void setUsername(String username) - { - this.username = username; - } - - /** - * Sets the password to use to connect to the asterisk server. This is the - * password specified in Asterisk's manager.conf file. - * + */ + public void setUsername(String username) + { + this.username = username; + } + + /** + * Sets the password to use to connect to the asterisk server. This is the + * password specified in Asterisk's manager.conf file. + * * @param password the password to use for login - */ - public void setPassword(String password) - { - this.password = password; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendAction(ManagerAction)} will wait for a response before + */ + public void setPassword(String password) + { + this.password = password; + } + + @Override + public void setEncoding(Charset encoding) + { + this.encoding = encoding; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendAction(ManagerAction)} will wait for a response before * throwing a TimeoutException.
- * Default is 2000. - * + * Default is 2000. + * * @param defaultResponseTimeout default response timeout in milliseconds - * @since 0.2 - */ - public void setDefaultResponseTimeout(long defaultResponseTimeout) - { - this.defaultResponseTimeout = defaultResponseTimeout; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a + * @since 0.2 + */ + public void setDefaultResponseTimeout(long defaultResponseTimeout) + { + this.defaultResponseTimeout = defaultResponseTimeout; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a * response and the last response event before throwing a TimeoutException.
- * Default is 5000. - * + * Default is 5000. + * * @param defaultEventTimeout default event timeout in milliseconds - * @since 0.2 - */ - public void setDefaultEventTimeout(long defaultEventTimeout) - { - this.defaultEventTimeout = defaultEventTimeout; - } - - /** + * @since 0.2 + */ + public void setDefaultEventTimeout(long defaultEventTimeout) + { + this.defaultEventTimeout = defaultEventTimeout; + } + + /** * Set to true to try reconnecting to ther asterisk serve even * if the reconnection attempt threw an AuthenticationFailedException.
- * Default is true. - * + * Default is true. + * * @param keepAliveAfterAuthenticationFailure true to try * reconnecting to ther asterisk serve even if the reconnection * attempt threw an AuthenticationFailedException, - * false otherwise. - */ - public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) - { - this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; - } - - /* Implementation of ManagerConnection interface */ - - public String getUsername() - { - return username; - } - - public String getPassword() - { - return password; - } - - public AsteriskVersion getVersion() - { - return version; - } - - public String getHostname() - { - return hostname; - } - - public int getPort() - { - return port; - } - - public boolean isSsl() - { - return ssl; - } - - public InetAddress getLocalAddress() - { - return socket.getLocalAddress(); - } - - public int getLocalPort() - { - return socket.getLocalPort(); - } - - public InetAddress getRemoteAddress() - { - return socket.getRemoteAddress(); - } - - public int getRemotePort() - { - return socket.getRemotePort(); - } - - public void registerUserEventClass(Class< ? extends ManagerEvent> userEventClass) - { - if (reader == null) - { - reader = createReader(this, this); - } - - reader.registerEventClass(userEventClass); - } - - public void setSocketTimeout(int socketTimeout) - { - this.socketTimeout = socketTimeout; - } - - public void setSocketReadTimeout(int socketReadTimeout) - { - this.socketReadTimeout = socketReadTimeout; - } - - public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException - { - login(null); - } + * false otherwise. + */ + public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) + { + this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; + } + + /* Implementation of ManagerConnection interface */ + + public String getUsername() + { + return username; + } + + public String getPassword() + { + return password; + } + + @Override + public Charset getEncoding() + { + return encoding; + } + + public AsteriskVersion getVersion() + { + return version; + } + + public String getHostname() + { + return hostname; + } + + public int getPort() + { + return port; + } + + public boolean isSsl() + { + return ssl; + } + + public InetAddress getLocalAddress() + { + return socket.getLocalAddress(); + } + + public int getLocalPort() + { + return socket.getLocalPort(); + } + + public InetAddress getRemoteAddress() + { + return socket.getRemoteAddress(); + } + + public int getRemotePort() + { + return socket.getRemotePort(); + } + + public void registerUserEventClass(Class userEventClass) + { + if (reader == null) + { + reader = createReader(this, this); + } + + reader.registerEventClass(userEventClass); + } + + public void setSocketTimeout(int socketTimeout) + { + this.socketTimeout = socketTimeout; + } + + public void setSocketReadTimeout(int socketReadTimeout) + { + this.socketReadTimeout = socketReadTimeout; + } + + public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException + { + login(null); + } public synchronized void login(String eventMask) throws IOException, AuthenticationFailedException, TimeoutException - { - if (state != INITIAL && state != DISCONNECTED) - { - throw new IllegalStateException("Login may only be perfomed when in state " - + "INITIAL or DISCONNECTED, but connection is in state " + state); - } - - state = CONNECTING; - this.eventMask = eventMask; - try - { - doLogin(defaultResponseTimeout, eventMask); - } - finally - { - if (state != CONNECTED) - { - state = DISCONNECTED; - } - } - } - - /** + { + if (state != INITIAL && state != DISCONNECTED) + { + throw new IllegalStateException("Login may only be perfomed when in state " + + "INITIAL or DISCONNECTED, but connection is in state " + state); + } + + state = CONNECTING; + this.eventMask = eventMask; + try + { + doLogin(defaultResponseTimeout, eventMask); + } + finally + { + if (state != CONNECTED) + { + state = DISCONNECTED; + } + } + } + + /** * Does the real login, following the steps outlined below.
- *

    - *
  1. Connects to the asterisk server by calling {@link #connect()} if not - * already connected - *
  2. Waits until the protocol identifier is received but not longer than - * timeout ms. - *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType - * MD5. - *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} - * is sent using the calculated key (MD5 hash of the password appended to - * the received challenge). - *
- * @param timeout the maximum time to wait for the protocol identifier (in - * ms) + *
    + *
  1. Connects to the asterisk server by calling {@link #connect()} if not + * already connected + *
  2. Waits until the protocol identifier is received but not longer than + * timeout ms. + *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType + * MD5. + *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} + * is sent using the calculated key (MD5 hash of the password appended to + * the received challenge). + *
+ * @param timeout the maximum time to wait for the protocol identifier (in + * ms) * @param eventMask the event mask. Set to "on" if all events should be - * send, "off" if not events should be sent or a combination of - * "system", "call" and "log" (separated by ',') to specify what - * kind of events should be sent. - * @throws IOException if there is an i/o problem. + * send, "off" if not events should be sent or a combination of + * "system", "call" and "log" (separated by ',') to specify what + * kind of events should be sent. + * @throws IOException if there is an i/o problem. * @throws AuthenticationFailedException if username or password are - * incorrect and the login action returns an error or if the MD5 - * hash cannot be computed. The connection is closed in this - * case. - * @throws TimeoutException if a timeout occurs while waiting for the - * protocol identifier. The connection is closed in this case. - */ + * incorrect and the login action returns an error or if the MD5 + * hash cannot be computed. The connection is closed in this + * case. + * @throws TimeoutException if a timeout occurs while waiting for the + * protocol identifier. The connection is closed in this case. + */ protected synchronized void doLogin(long timeout, String eventMask) throws IOException, AuthenticationFailedException, TimeoutException - { - ChallengeAction challengeAction; - ManagerResponse challengeResponse; - String challenge; - String key; - LoginAction loginAction; - ManagerResponse loginResponse; - - if (socket == null) - { - connect(); - } - - synchronized (protocolIdentifier) - { - if (protocolIdentifier.value == null) - { - try - { - protocolIdentifier.wait(timeout); - } - catch (InterruptedException e) // NOPMD - { - Thread.currentThread().interrupt(); - } - } - - if (protocolIdentifier.value == null) - { - disconnect(); - if (reader != null && reader.getTerminationException() != null) - { - throw reader.getTerminationException(); - } - else - { - throw new TimeoutException("Timeout waiting for protocol identifier"); - } - } - } - - challengeAction = new ChallengeAction("MD5"); - try - { - challengeResponse = sendAction(challengeAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send challenge action", e); - } - - if (challengeResponse instanceof ChallengeResponse) - { - challenge = ((ChallengeResponse) challengeResponse).getChallenge(); - } - else - { - disconnect(); - throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " - + challengeResponse.getMessage()); - } - - try - { - MessageDigest md; - - md = MessageDigest.getInstance("MD5"); - if (challenge != null) - { - md.update(challenge.getBytes()); - } - if (password != null) - { - md.update(password.getBytes()); - } - key = ManagerUtil.toHexString(md.digest()); - } - catch (NoSuchAlgorithmException ex) - { - disconnect(); - throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); - } - - loginAction = new LoginAction(username, "MD5", key, eventMask); - try - { - loginResponse = sendAction(loginAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send login action", e); - } - - if (loginResponse instanceof ManagerError) - { - disconnect(); - throw new AuthenticationFailedException(loginResponse.getMessage()); - } - - logger.info("Successfully logged in"); - - version = determineVersion(); - - state = CONNECTED; - - writer.setTargetVersion(version); - - logger.info("Determined Asterisk version: " + version); - - // generate pseudo event indicating a successful login - ConnectEvent connectEvent = new ConnectEvent(this); - connectEvent.setProtocolIdentifier(getProtocolIdentifier()); - connectEvent.setDateReceived(DateUtil.getDate()); - // TODO could this cause a deadlock? - fireEvent(connectEvent); - } - - protected AsteriskVersion determineVersion() throws IOException, TimeoutException - { - int attempts = 0; - - // if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) - // { - // return AsteriskVersion.ASTERISK_1_6; - // } - - while (attempts++ < MAX_VERSION_ATTEMPTS) - { - final ManagerResponse showVersionFilesResponse; - final List showVersionFilesResult; - - // increase timeout as output is quite large + { + ChallengeAction challengeAction; + ManagerResponse challengeResponse; + String challenge; + String key; + LoginAction loginAction; + ManagerResponse loginResponse; + + if (socket == null) + { + connect(); + } + + synchronized (protocolIdentifier) + { + if (protocolIdentifier.value == null) + { + try + { + protocolIdentifier.wait(timeout); + } + catch (InterruptedException e) // NOPMD + { + Thread.currentThread().interrupt(); + } + } + + if (protocolIdentifier.value == null) + { + disconnect(); + if (reader != null && reader.getTerminationException() != null) + { + throw reader.getTerminationException(); + } + else + { + throw new TimeoutException("Timeout waiting for protocol identifier"); + } + } + } + + challengeAction = new ChallengeAction("MD5"); + try + { + challengeResponse = sendAction(challengeAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send challenge action", e); + } + + if (challengeResponse instanceof ChallengeResponse) + { + challenge = ((ChallengeResponse) challengeResponse).getChallenge(); + } + else + { + disconnect(); + throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " + + challengeResponse.getMessage()); + } + + try + { + MessageDigest md; + + md = MessageDigest.getInstance("MD5"); + if (challenge != null) + { + md.update(challenge.getBytes()); + } + if (password != null) + { + md.update(password.getBytes()); + } + key = ManagerUtil.toHexString(md.digest()); + } + catch (NoSuchAlgorithmException ex) + { + disconnect(); + throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); + } + + loginAction = new LoginAction(username, "MD5", key, eventMask); + try + { + loginResponse = sendAction(loginAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send login action", e); + } + + if (loginResponse instanceof ManagerError) + { + disconnect(); + throw new AuthenticationFailedException(loginResponse.getMessage()); + } + + logger.info("Successfully logged in"); + + version = determineVersion(); + + state = CONNECTED; + + writer.setTargetVersion(version); + + logger.info("Determined Asterisk version: " + version); + + // generate pseudo event indicating a successful login + ConnectEvent connectEvent = new ConnectEvent(this); + connectEvent.setProtocolIdentifier(getProtocolIdentifier()); + connectEvent.setDateReceived(DateUtil.getDate()); + // TODO could this cause a deadlock? + fireEvent(connectEvent); + } + + protected AsteriskVersion determineVersion() throws IOException, TimeoutException + { + int attempts = 0; + + // if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) + // { + // return AsteriskVersion.ASTERISK_1_6; + // } + + while (attempts++ < MAX_VERSION_ATTEMPTS) + { + final ManagerResponse showVersionFilesResponse; + final List showVersionFilesResult; + + // increase timeout as output is quite large showVersionFilesResponse = sendAction(new CommandAction("show version files pbx.c"), defaultResponseTimeout * 2); - if (!(showVersionFilesResponse instanceof CommandResponse)) - { - // return early in case of permission problems - // org.asteriskjava.manager.response.ManagerError: + if (!(showVersionFilesResponse instanceof CommandResponse)) + { + // return early in case of permission problems + // org.asteriskjava.manager.response.ManagerError: // actionId='null'; message='Permission denied'; // response='Error'; - // uniqueId='null'; systemHashcode=15231583 - break; - } + // uniqueId='null'; systemHashcode=15231583 + break; + } - showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); - if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) - { + showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); + if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) + { final String line1 = showVersionFilesResult.get(0); if (line1 != null && line1.startsWith("File")) - { - final String rawVersion; - - rawVersion = getRawVersion(); - if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) - { - return AsteriskVersion.ASTERISK_1_4; - } - return AsteriskVersion.ASTERISK_1_2; - } - else if (line1 != null && line1.contains("No such command")) - { + { + final String rawVersion; + + rawVersion = getRawVersion(); + if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) + { + return AsteriskVersion.ASTERISK_1_4; + } + return AsteriskVersion.ASTERISK_1_2; + } + else if (line1 != null && line1.contains("No such command")) + { final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction("core show version"), defaultResponseTimeout * 2); - if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) - { + if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) + { final List coreShowVersionResult = ((CommandResponse) coreShowVersionResponse).getResult(); if (coreShowVersionResult != null && coreShowVersionResult.size() > 0) @@ -700,601 +719,602 @@ else if (VERSION_PATTERN_13.matcher(coreLine).matches()) { // if it isn't the "no such command", break and return the // lowest version immediately - break; - } - } - } - - // as a fallback assume 1.6 - return AsteriskVersion.ASTERISK_1_6; - } - - protected String getRawVersion() - { - final ManagerResponse showVersionResponse; - - try - { - showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); - } - catch (Exception e) - { - return null; - } - - if (showVersionResponse instanceof CommandResponse) - { - final List showVersionResult; - - showVersionResult = ((CommandResponse) showVersionResponse).getResult(); - if (showVersionResult != null && showVersionResult.size() > 0) - { - return showVersionResult.get(0); - } - } - - return null; - } - - protected synchronized void connect() throws IOException - { - logger.info("Connecting to " + hostname + ":" + port); - - if (reader == null) - { - logger.debug("Creating reader for " + hostname + ":" + port); - reader = createReader(this, this); - } - - if (writer == null) - { - logger.debug("Creating writer"); - writer = createWriter(); - } - - logger.debug("Creating socket"); - socket = createSocket(); - - logger.debug("Passing socket to reader"); - reader.setSocket(socket); - - if (readerThread == null || !readerThread.isAlive() || reader.isDead()) - { - logger.debug("Creating and starting reader thread"); - readerThread = new Thread(reader); - readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" - + readerThreadCounter.getAndIncrement()); - readerThread.setDaemon(true); - readerThread.start(); - } - - logger.debug("Passing socket to writer"); - writer.setSocket(socket); - } - - protected SocketConnectionFacade createSocket() throws IOException - { - return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); - } - - public synchronized void logoff() throws IllegalStateException - { - if (state != CONNECTED && state != RECONNECTING) - { - throw new IllegalStateException("Logoff may only be perfomed when in state " - + "CONNECTED or RECONNECTING, but connection is in state " + state); - } - - state = DISCONNECTING; - - if (socket != null) - { - try - { - sendAction(new LogoffAction()); - } - catch (Exception e) - { - logger.warn("Unable to send LogOff action", e); - } - } - cleanup(); - state = DISCONNECTED; - } - - /** - * Closes the socket connection. - */ - protected synchronized void disconnect() - { - if (socket != null) - { - logger.info("Closing socket."); - try - { - socket.close(); - } - catch (IOException ex) - { - logger.warn("Unable to close socket: " + ex.getMessage()); - } - socket = null; - } - protocolIdentifier.value = null; - } + break; + } + } + } + + // as a fallback assume 1.6 + return AsteriskVersion.ASTERISK_1_6; + } + + protected String getRawVersion() + { + final ManagerResponse showVersionResponse; + + try + { + showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); + } + catch (Exception e) + { + return null; + } + + if (showVersionResponse instanceof CommandResponse) + { + final List showVersionResult; + + showVersionResult = ((CommandResponse) showVersionResponse).getResult(); + if (showVersionResult != null && showVersionResult.size() > 0) + { + return showVersionResult.get(0); + } + } + + return null; + } + + protected synchronized void connect() throws IOException + { + logger.info("Connecting to " + hostname + ":" + port); + + if (reader == null) + { + logger.debug("Creating reader for " + hostname + ":" + port); + reader = createReader(this, this); + } + + if (writer == null) + { + logger.debug("Creating writer"); + writer = createWriter(); + } + + logger.debug("Creating socket"); + socket = createSocket(); + + logger.debug("Passing socket to reader"); + reader.setSocket(socket); + + if (readerThread == null || !readerThread.isAlive() || reader.isDead()) + { + logger.debug("Creating and starting reader thread"); + readerThread = new Thread(reader); + readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" + + readerThreadCounter.getAndIncrement()); + readerThread.setDaemon(true); + readerThread.start(); + } + + logger.debug("Passing socket to writer"); + writer.setSocket(socket); + } + + protected SocketConnectionFacade createSocket() throws IOException + { + return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout, encoding); + } + + public synchronized void logoff() throws IllegalStateException + { + if (state != CONNECTED && state != RECONNECTING) + { + throw new IllegalStateException("Logoff may only be perfomed when in state " + + "CONNECTED or RECONNECTING, but connection is in state " + state); + } + + state = DISCONNECTING; + + if (socket != null) + { + try + { + sendAction(new LogoffAction()); + } + catch (Exception e) + { + logger.warn("Unable to send LogOff action", e); + } + } + cleanup(); + state = DISCONNECTED; + } + + /** + * Closes the socket connection. + */ + protected synchronized void disconnect() + { + if (socket != null) + { + logger.info("Closing socket."); + try + { + socket.close(); + } + catch (IOException ex) + { + logger.warn("Unable to close socket: " + ex.getMessage()); + } + socket = null; + } + protocolIdentifier.value = null; + } public ManagerResponse sendAction(ManagerAction action) throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException - { - return sendAction(action, defaultResponseTimeout); - } - - /* - * Implements synchronous sending of "simple" actions. - */ - public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, - IllegalArgumentException, IllegalStateException - { - ResponseHandlerResult result; - SendActionCallback callbackHandler; - - result = new ResponseHandlerResult(); - callbackHandler = new DefaultSendActionCallback(result); - - synchronized (result) - { - sendAction(action, callbackHandler); - - // definitely return null for the response of user events - if (action instanceof UserEventAction) - { - return null; - } - - // only wait if we did not yet receive the response. - // Responses may be returned really fast. - if (result.getResponse() == null) - { - try - { - result.wait(timeout); - } - catch (InterruptedException ex) - { - logger.warn("Interrupted while waiting for result"); - Thread.currentThread().interrupt(); - } - } - } - - // still no response? - if (result.getResponse() == null) - { - throw new TimeoutException("Timeout waiting for response to " + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); - } - - return result.getResponse(); - } + { + return sendAction(action, defaultResponseTimeout); + } + + /* + * Implements synchronous sending of "simple" actions. + */ + public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, + IllegalArgumentException, IllegalStateException + { + ResponseHandlerResult result; + SendActionCallback callbackHandler; + + result = new ResponseHandlerResult(); + callbackHandler = new DefaultSendActionCallback(result); + + synchronized (result) + { + sendAction(action, callbackHandler); + + // definitely return null for the response of user events + if (action instanceof UserEventAction) + { + return null; + } + + // only wait if we did not yet receive the response. + // Responses may be returned really fast. + if (result.getResponse() == null) + { + try + { + result.wait(timeout); + } + catch (InterruptedException ex) + { + logger.warn("Interrupted while waiting for result"); + Thread.currentThread().interrupt(); + } + } + } + + // still no response? + if (result.getResponse() == null) + { + throw new TimeoutException("Timeout waiting for response to " + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); + } + + return result.getResponse(); + } public void sendAction(ManagerAction action, SendActionCallback callback) throws IOException, IllegalArgumentException, IllegalStateException - { - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - - // In general sending actions is only allowed while connected, though - // there are a few exceptions, these are handled here: - if ((state == CONNECTING || state == RECONNECTING) - && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) - { - // when (re-)connecting challenge and login actions are ok. - } // NOPMD - else if (state == DISCONNECTING && action instanceof LogoffAction) - { - // when disconnecting logoff action is ok. - } // NOPMD - else if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED, but connection is in state " + state); - } - - if (socket == null) - { - throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); - } - - internalActionId = createInternalActionId(); - - // if the callbackHandler is null the user is obviously not interested - // in the response, thats fine. - if (callback != null) - { - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, callback); - } - } - - Class< ? extends ManagerResponse> responseClass = getExpectedResponseClass(action.getClass()); - if (responseClass != null) - { - reader.expectResponseClass(internalActionId, responseClass); - } - - writer.sendAction(action, internalActionId); - } - - boolean isShowVersionCommandAction(ManagerAction action) - { + { + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + + // In general sending actions is only allowed while connected, though + // there are a few exceptions, these are handled here: + if ((state == CONNECTING || state == RECONNECTING) + && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) + { + // when (re-)connecting challenge and login actions are ok. + } // NOPMD + else if (state == DISCONNECTING && action instanceof LogoffAction) + { + // when disconnecting logoff action is ok. + } // NOPMD + else if (state != CONNECTED) + { + throw new IllegalStateException("Actions may only be sent when in state " + + "CONNECTED, but connection is in state " + state); + } + + if (socket == null) + { + throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); + } + + internalActionId = createInternalActionId(); + + // if the callbackHandler is null the user is obviously not interested + // in the response, thats fine. + if (callback != null) + { + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, callback); + } + } + + Class responseClass = getExpectedResponseClass(action.getClass()); + if (responseClass != null) + { + reader.expectResponseClass(internalActionId, responseClass); + } + + writer.sendAction(action, internalActionId); + } + + boolean isShowVersionCommandAction(ManagerAction action) + { if (!(action instanceof CommandAction)) { - return false; - } - final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction) action).getCommand()); - return showVersionMatcher.matches(); - } + return false; + } + final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction) action).getCommand()); + return showVersionMatcher.matches(); + } - private Class< ? extends ManagerResponse> getExpectedResponseClass(Class< ? extends ManagerAction> actionClass) - { - final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); - if (annotation == null) - { - return null; - } + private Class getExpectedResponseClass(Class actionClass) + { + final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); + if (annotation == null) + { + return null; + } - return annotation.value(); - } + return annotation.value(); + } public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws IOException, EventTimeoutException, IllegalArgumentException, IllegalStateException - { - return sendEventGeneratingAction(action, defaultEventTimeout); - } - - /* - * Implements synchronous sending of event generating actions. - */ - public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, - EventTimeoutException, IllegalArgumentException, IllegalStateException - { - final ResponseEventsImpl responseEvents; - final ResponseEventHandler responseEventHandler; - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - else if (action.getActionCompleteEventClass() == null) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " - + action.getClass().getName() + " is null."); - } - else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" - + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() - + " is not a ResponseEvent."); - } - - if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED but connection is in state " + state); - } - - responseEvents = new ResponseEventsImpl(); - responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); - - internalActionId = createInternalActionId(); - - try - { - // register response handler... - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, responseEventHandler); - } - - // ...and event handler. - synchronized (this.responseEventListeners) - { - this.responseEventListeners.put(internalActionId, responseEventHandler); - } - - synchronized (responseEvents) - { - writer.sendAction(action, internalActionId); - // only wait if response has not yet arrived. - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - try - { - responseEvents.wait(timeout); - } - catch (InterruptedException e) - { - logger.warn("Interrupted while waiting for response events."); - Thread.currentThread().interrupt(); - } - } - } - - // still no response or not all events received and timed out? - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { + { + return sendEventGeneratingAction(action, defaultEventTimeout); + } + + /* + * Implements synchronous sending of event generating actions. + */ + public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, + EventTimeoutException, IllegalArgumentException, IllegalStateException + { + final ResponseEventsImpl responseEvents; + final ResponseEventHandler responseEventHandler; + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + else if (action.getActionCompleteEventClass() == null) + { + throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " + + action.getClass().getName() + " is null."); + } + else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) + { + throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" + + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() + + " is not a ResponseEvent."); + } + + if (state != CONNECTED) + { + throw new IllegalStateException("Actions may only be sent when in state " + + "CONNECTED but connection is in state " + state); + } + + responseEvents = new ResponseEventsImpl(); + responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); + + internalActionId = createInternalActionId(); + + try + { + // register response handler... + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, responseEventHandler); + } + + // ...and event handler. + synchronized (this.responseEventListeners) + { + this.responseEventListeners.put(internalActionId, responseEventHandler); + } + + synchronized (responseEvents) + { + writer.sendAction(action, internalActionId); + // only wait if response has not yet arrived. + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + try + { + responseEvents.wait(timeout); + } + catch (InterruptedException e) + { + logger.warn("Interrupted while waiting for response events."); + Thread.currentThread().interrupt(); + } + } + } + + // still no response or not all events received and timed out? + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { throw new EventTimeoutException("Timeout waiting for response or response events to " + action.getAction() + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), responseEvents); - } - - } - finally - { - // remove the event handler - synchronized (this.responseEventListeners) - { - this.responseEventListeners.remove(internalActionId); - } - - // Note: The response handler should have already been removed - // when the response was received, however we remove it here - // just in case it was never received. - synchronized (this.responseListeners) - { - this.responseListeners.remove(internalActionId); - } - - } - - return responseEvents; - } - - /** - * Creates a new unique internal action id based on the hash code of this - * connection and a sequence. - * - * @return a new internal action id - * @see ManagerUtil#addInternalActionId(String,String) - * @see ManagerUtil#getInternalActionId(String) - * @see ManagerUtil#stripInternalActionId(String) - */ - private String createInternalActionId() - { - final StringBuffer sb; - - sb = new StringBuffer(); - sb.append(this.hashCode()); - sb.append("_"); - sb.append(actionIdCounter.getAndIncrement()); - - return sb.toString(); - } - - public void addEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - // only add it if its not already there - if (!this.eventListeners.contains(listener)) - { - this.eventListeners.add(listener); - } - } - } - - public void removeEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - if (this.eventListeners.contains(listener)) - { - this.eventListeners.remove(listener); - } - } - } - - public String getProtocolIdentifier() - { - return protocolIdentifier.value; - } - - public ManagerConnectionState getState() - { - return state; - } - - /* Implementation of Dispatcher: callbacks for ManagerReader */ - - /** - * This method is called by the reader whenever a {@link ManagerResponse} is - * received. The response is dispatched to the associated - * {@link SendActionCallback}. - * + } + + } + finally + { + // remove the event handler + synchronized (this.responseEventListeners) + { + this.responseEventListeners.remove(internalActionId); + } + + + // Note: The response handler should have already been removed + // when the response was received, however we remove it here + // just in case it was never received. + synchronized (this.responseListeners) + { + this.responseListeners.remove(internalActionId); + } + + } + + return responseEvents; + } + + /** + * Creates a new unique internal action id based on the hash code of this + * connection and a sequence. + * + * @return a new internal action id + * @see ManagerUtil#addInternalActionId(String,String) + * @see ManagerUtil#getInternalActionId(String) + * @see ManagerUtil#stripInternalActionId(String) + */ + private String createInternalActionId() + { + final StringBuffer sb; + + sb = new StringBuffer(); + sb.append(this.hashCode()); + sb.append("_"); + sb.append(actionIdCounter.getAndIncrement()); + + return sb.toString(); + } + + public void addEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + // only add it if its not already there + if (!this.eventListeners.contains(listener)) + { + this.eventListeners.add(listener); + } + } + } + + public void removeEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + if (this.eventListeners.contains(listener)) + { + this.eventListeners.remove(listener); + } + } + } + + public String getProtocolIdentifier() + { + return protocolIdentifier.value; + } + + public ManagerConnectionState getState() + { + return state; + } + + /* Implementation of Dispatcher: callbacks for ManagerReader */ + + /** + * This method is called by the reader whenever a {@link ManagerResponse} is + * received. The response is dispatched to the associated + * {@link SendActionCallback}. + * * @param response the response received by the reader - * @see ManagerReader - */ - public void dispatchResponse(ManagerResponse response) - { - final String actionId; - String internalActionId; - SendActionCallback listener; - - // shouldn't happen - if (response == null) - { - logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); - return; - } - - actionId = response.getActionId(); - internalActionId = null; - listener = null; - - if (actionId != null) - { - internalActionId = ManagerUtil.getInternalActionId(actionId); - response.setActionId(ManagerUtil.stripInternalActionId(actionId)); - } - - logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); - - if (internalActionId != null) - { - synchronized (this.responseListeners) - { - listener = responseListeners.get(internalActionId); - if (listener != null) - { - this.responseListeners.remove(internalActionId); - } - else - { - // when using the async sendAction it's ok not to register a - // callback so if we don't find a response handler thats ok - logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); - } - } - } - else - { + * @see ManagerReader + */ + public void dispatchResponse(ManagerResponse response) + { + final String actionId; + String internalActionId; + SendActionCallback listener; + + // shouldn't happen + if (response == null) + { + logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); + return; + } + + actionId = response.getActionId(); + internalActionId = null; + listener = null; + + if (actionId != null) + { + internalActionId = ManagerUtil.getInternalActionId(actionId); + response.setActionId(ManagerUtil.stripInternalActionId(actionId)); + } + + logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); + + if (internalActionId != null) + { + synchronized (this.responseListeners) + { + listener = responseListeners.get(internalActionId); + if (listener != null) + { + this.responseListeners.remove(internalActionId); + } + else + { + // when using the async sendAction it's ok not to register a + // callback so if we don't find a response handler thats ok + logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); + } + } + } + else + { logger.error("Unable to retrieve internalActionId from response: " + "actionId '" + actionId + "':\n" + response); - } - - if (listener != null) - { - try - { - listener.onResponse(response); - } - catch (Exception e) - { - logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); - } - } - } - - /** - * This method is called by the reader whenever a ManagerEvent is received. - * The event is dispatched to all registered ManagerEventHandlers. - * + } + + if (listener != null) + { + try + { + listener.onResponse(response); + } + catch (Exception e) + { + logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); + } + } + } + + /** + * This method is called by the reader whenever a ManagerEvent is received. + * The event is dispatched to all registered ManagerEventHandlers. + * * @param event the event received by the reader - * @see #addEventListener(ManagerEventListener) - * @see #removeEventListener(ManagerEventListener) - * @see ManagerReader - */ - public void dispatchEvent(ManagerEvent event) - { - // shouldn't happen - if (event == null) - { - logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); - return; - } + * @see #addEventListener(ManagerEventListener) + * @see #removeEventListener(ManagerEventListener) + * @see ManagerReader + */ + public void dispatchEvent(ManagerEvent event) + { + // shouldn't happen + if (event == null) + { + logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); + return; + } dispatchLegacyEventIfNeeded(event); - logger.debug("Dispatching event:\n" + event.toString()); - - // Some events need special treatment besides forwarding them to the - // registered eventListeners (clients) - // These events are handled here at first: - - // Dispatch ResponseEvents to the appropriate responseEventListener - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - String internalActionId; - - responseEvent = (ResponseEvent) event; - internalActionId = responseEvent.getInternalActionId(); - if (internalActionId != null) - { - synchronized (responseEventListeners) - { - ManagerEventListener listener; - - listener = responseEventListeners.get(internalActionId); - if (listener != null) - { - try - { - listener.onManagerEvent(event); - } - catch (Exception e) - { + logger.debug("Dispatching event:\n" + event.toString()); + + // Some events need special treatment besides forwarding them to the + // registered eventListeners (clients) + // These events are handled here at first: + + // Dispatch ResponseEvents to the appropriate responseEventListener + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + String internalActionId; + + responseEvent = (ResponseEvent) event; + internalActionId = responseEvent.getInternalActionId(); + if (internalActionId != null) + { + synchronized (responseEventListeners) + { + ManagerEventListener listener; + + listener = responseEventListeners.get(internalActionId); + if (listener != null) + { + try + { + listener.onManagerEvent(event); + } + catch (Exception e) + { logger.warn("Unexpected exception in response event listener " + listener.getClass().getName(), e); - } - } - } - } - else - { - // ResponseEvent without internalActionId: - // this happens if the same event class is used as response - // event - // and as an event that is not triggered by a Manager command - // Example: QueueMemberStatusEvent. - // logger.debug("ResponseEvent without " - // + "internalActionId:\n" + responseEvent); - } // NOPMD - } - if (event instanceof DisconnectEvent) - { - // When we receive get disconnected while we are connected start - // a new reconnect thread and set the state to RECONNECTING. - if (state == CONNECTED) - { - state = RECONNECTING; - // close socket if still open and remove reference to - // readerThread - // After sending the DisconnectThread that thread will die - // anyway. - cleanup(); - Thread reconnectThread = new Thread(new Runnable() - { - public void run() - { - reconnect(); - } - }); - reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" - + reconnectThreadCounter.getAndIncrement()); - reconnectThread.setDaemon(true); - reconnectThread.start(); - // now the DisconnectEvent is dispatched to registered - // eventListeners - // (clients) and after that the ManagerReaderThread is gone. - // So effectively we replaced the reader thread by a - // ReconnectThread. - } - else - { - // when we receive a DisconnectEvent while not connected we - // ignore it and do not send it to clients - return; - } - } - if (event instanceof ProtocolIdentifierReceivedEvent) - { - ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; - String protocolIdentifier; - - protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; - protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); - setProtocolIdentifier(protocolIdentifier); - // no need to send this event to clients - return; - } - - fireEvent(event); - } - - /** + } + } + } + } + else + { + // ResponseEvent without internalActionId: + // this happens if the same event class is used as response + // event + // and as an event that is not triggered by a Manager command + // Example: QueueMemberStatusEvent. + // logger.debug("ResponseEvent without " + // + "internalActionId:\n" + responseEvent); + } // NOPMD + } + if (event instanceof DisconnectEvent) + { + // When we receive get disconnected while we are connected start + // a new reconnect thread and set the state to RECONNECTING. + if (state == CONNECTED) + { + state = RECONNECTING; + // close socket if still open and remove reference to + // readerThread + // After sending the DisconnectThread that thread will die + // anyway. + cleanup(); + Thread reconnectThread = new Thread(new Runnable() + { + public void run() + { + reconnect(); + } + }); + reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" + + reconnectThreadCounter.getAndIncrement()); + reconnectThread.setDaemon(true); + reconnectThread.start(); + // now the DisconnectEvent is dispatched to registered + // eventListeners + // (clients) and after that the ManagerReaderThread is gone. + // So effectively we replaced the reader thread by a + // ReconnectThread. + } + else + { + // when we receive a DisconnectEvent while not connected we + // ignore it and do not send it to clients + return; + } + } + if (event instanceof ProtocolIdentifierReceivedEvent) + { + ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; + String protocolIdentifier; + + protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; + protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); + setProtocolIdentifier(protocolIdentifier); + // no need to send this event to clients + return; + } + + fireEvent(event); + } + + /** * Enro 2015-03 Workaround to continue having Legacy Events from Asterisk * 13. */ @@ -1302,46 +1322,46 @@ private void dispatchLegacyEventIfNeeded(ManagerEvent event) { if (event instanceof DialBeginEvent) { - DialEvent legacyEvent = (new DialEvent((DialBeginEvent) event)); - dispatchEvent(legacyEvent); - } - } + DialEvent legacyEvent = (new DialEvent((DialBeginEvent) event)); + dispatchEvent(legacyEvent); + } + } - /** - * Notifies all {@link ManagerEventListener}s registered by users. - * + /** + * Notifies all {@link ManagerEventListener}s registered by users. + * * @param event the event to propagate - */ - private void fireEvent(ManagerEvent event) - { - synchronized (eventListeners) - { - for (ManagerEventListener listener : eventListeners) - { - try - { - listener.onManagerEvent(event); - } - catch (RuntimeException e) - { - logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); - } - } - } - } - - /** - * This method is called when a {@link ProtocolIdentifierReceivedEvent} is - * received from the reader. Having received a correct protocol identifier - * is the precodition for logging in. - * + */ + private void fireEvent(ManagerEvent event) + { + synchronized (eventListeners) + { + for (ManagerEventListener listener : eventListeners) + { + try + { + listener.onManagerEvent(event); + } + catch (RuntimeException e) + { + logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); + } + } + } + } + + /** + * This method is called when a {@link ProtocolIdentifierReceivedEvent} is + * received from the reader. Having received a correct protocol identifier + * is the precodition for logging in. + * * @param identifier the protocol version used by the Asterisk server. - */ - private void setProtocolIdentifier(final String identifier) - { - logger.info("Connected via " + identifier); + */ + private void setProtocolIdentifier(final String identifier) + { + logger.info("Connected via " + identifier); - if (!"Asterisk Call Manager/1.0".equals(identifier) + if (!"Asterisk Call Manager/1.0".equals(identifier) && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk // 1.6 && !"Asterisk Call Manager/1.2".equals(identifier) // bri @@ -1353,177 +1373,177 @@ private void setProtocolIdentifier(final String identifier) && !"Asterisk Call Manager/2.7.0".equals(identifier) // Asterisk // 13.2 && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) - && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) - { - logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); - } - - synchronized (protocolIdentifier) - { - protocolIdentifier.value = identifier; - protocolIdentifier.notifyAll(); - } - } - - /** + && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) + { + logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); + } + + synchronized (protocolIdentifier) + { + protocolIdentifier.value = identifier; + protocolIdentifier.notifyAll(); + } + } + + /** * Reconnects to the asterisk server when the connection is lost.
- * While keepAlive is true we will try to reconnect. - * Reconnection attempts will be stopped when the {@link #logoff()} method - * is called or when the login after a successful reconnect results in an - * {@link AuthenticationFailedException} suggesting that the manager - * credentials have changed and keepAliveAfterAuthenticationFailure is not + * While keepAlive is true we will try to reconnect. + * Reconnection attempts will be stopped when the {@link #logoff()} method + * is called or when the login after a successful reconnect results in an + * {@link AuthenticationFailedException} suggesting that the manager + * credentials have changed and keepAliveAfterAuthenticationFailure is not * set.
- * This method is called when a {@link DisconnectEvent} is received from the - * reader. - */ - private void reconnect() - { - int numTries; - - // try to reconnect - numTries = 0; - while (state == RECONNECTING) - { - try - { - if (numTries < 10) - { - // try to reconnect quite fast for the firt 10 times - // this succeeds if the server has just been restarted - Thread.sleep(RECONNECTION_INTERVAL_1); - } - else - { - // slow down after 10 unsuccessful attempts asuming a - // shutdown of the server - Thread.sleep(RECONNECTION_INTERVAL_2); - } - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - } - - try - { - connect(); - - try - { - doLogin(defaultResponseTimeout, eventMask); - logger.info("Successfully reconnected."); - // everything is ok again, so we leave - // when successful doLogin set the state to CONNECTED so no - // need to adjust it - break; - } - catch (AuthenticationFailedException e1) - { - if (keepAliveAfterAuthenticationFailure) - { - logger.error("Unable to log in after reconnect: " + e1.getMessage()); - } - else - { - logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); - state = DISCONNECTED; - } - } - catch (TimeoutException e1) - { - // shouldn't happen - but happens! - logger.error("TimeoutException while trying to log in " + "after reconnect."); - } - } - catch (IOException e) - { - // server seems to be still down, just continue to attempt - // reconnection - logger.warn("Exception while trying to reconnect: " + e.getMessage()); - } - numTries++; - } - } - - private void cleanup() - { - disconnect(); - this.readerThread = null; - } - - @Override - public String toString() - { - StringBuffer sb; - - sb = new StringBuffer("ManagerConnection["); - sb.append("id='").append(id).append("',"); - sb.append("hostname='").append(hostname).append("',"); - sb.append("port=").append(port).append(","); - sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); - - return sb.toString(); - } - - /* Helper classes */ - - /** - * A simple data object to store a ManagerResult. - */ - private static class ResponseHandlerResult implements Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 7831097958568769220L; - private ManagerResponse response; - - public ResponseHandlerResult() - { - } - - public ManagerResponse getResponse() - { - return this.response; - } - - public void setResponse(ManagerResponse response) - { - this.response = response; - } - } - - /** - * A simple response handler that stores the received response in a - * ResponseHandlerResult for further processing. - */ - private static class DefaultSendActionCallback implements SendActionCallback, Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 2926598671855316803L; - private final ResponseHandlerResult result; - - /** - * Creates a new instance. - * + * This method is called when a {@link DisconnectEvent} is received from the + * reader. + */ + private void reconnect() + { + int numTries; + + // try to reconnect + numTries = 0; + while (state == RECONNECTING) + { + try + { + if (numTries < 10) + { + // try to reconnect quite fast for the firt 10 times + // this succeeds if the server has just been restarted + Thread.sleep(RECONNECTION_INTERVAL_1); + } + else + { + // slow down after 10 unsuccessful attempts asuming a + // shutdown of the server + Thread.sleep(RECONNECTION_INTERVAL_2); + } + } + catch (InterruptedException e) + { + Thread.currentThread().interrupt(); + } + + try + { + connect(); + + try + { + doLogin(defaultResponseTimeout, eventMask); + logger.info("Successfully reconnected."); + // everything is ok again, so we leave + // when successful doLogin set the state to CONNECTED so no + // need to adjust it + break; + } + catch (AuthenticationFailedException e1) + { + if (keepAliveAfterAuthenticationFailure) + { + logger.error("Unable to log in after reconnect: " + e1.getMessage()); + } + else + { + logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); + state = DISCONNECTED; + } + } + catch (TimeoutException e1) + { + // shouldn't happen - but happens! + logger.error("TimeoutException while trying to log in " + "after reconnect."); + } + } + catch (IOException e) + { + // server seems to be still down, just continue to attempt + // reconnection + logger.warn("Exception while trying to reconnect: " + e.getMessage()); + } + numTries++; + } + } + + private void cleanup() + { + disconnect(); + this.readerThread = null; + } + + @Override + public String toString() + { + StringBuffer sb; + + sb = new StringBuffer("ManagerConnection["); + sb.append("id='").append(id).append("',"); + sb.append("hostname='").append(hostname).append("',"); + sb.append("port=").append(port).append(","); + sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); + + return sb.toString(); + } + + /* Helper classes */ + + /** + * A simple data object to store a ManagerResult. + */ + private static class ResponseHandlerResult implements Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 7831097958568769220L; + private ManagerResponse response; + + public ResponseHandlerResult() + { + } + + public ManagerResponse getResponse() + { + return this.response; + } + + public void setResponse(ManagerResponse response) + { + this.response = response; + } + } + + /** + * A simple response handler that stores the received response in a + * ResponseHandlerResult for further processing. + */ + private static class DefaultSendActionCallback implements SendActionCallback, Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 2926598671855316803L; + private final ResponseHandlerResult result; + + /** + * Creates a new instance. + * * @param result the result to store the response in - */ - public DefaultSendActionCallback(ResponseHandlerResult result) - { - this.result = result; - } - - public void onResponse(ManagerResponse response) - { - synchronized (result) - { - result.setResponse(response); - result.notifyAll(); - } - } - } + */ + public DefaultSendActionCallback(ResponseHandlerResult result) + { + this.result = result; + } + + public void onResponse(ManagerResponse response) + { + synchronized (result) + { + result.setResponse(response); + result.notifyAll(); + } + } + } /** * A combinded event and response handler that adds received events and the @@ -1534,10 +1554,10 @@ private static class ResponseEventHandler implements ManagerEventListener, SendA private final ResponseEventsImpl events; private final Class< ? > actionCompleteEventClass; - /** - * Creates a new instance. - * - * @param events the ResponseEventsImpl to store the events in + /** + * Creates a new instance. + * + * @param events the ResponseEventsImpl to store the events in * @param actionCompleteEventClass the type of event that indicates that * all events have been received */ @@ -1547,56 +1567,56 @@ public ResponseEventHandler(ResponseEventsImpl events, Class< ? > actionComplete this.actionCompleteEventClass = actionCompleteEventClass; } - public void onManagerEvent(ManagerEvent event) - { - synchronized (events) - { - // should always be a ResponseEvent, anyway... - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - - responseEvent = (ResponseEvent) event; - events.addEvent(responseEvent); - } - - // finished? - if (actionCompleteEventClass.isAssignableFrom(event.getClass())) - { - events.setComplete(true); - // notify if action complete event and response have been - // received - if (events.getResponse() != null) - { - events.notifyAll(); - } - } - } - } - - public void onResponse(ManagerResponse response) - { - synchronized (events) - { - events.setRepsonse(response); - if (response instanceof ManagerError) - { - events.setComplete(true); - } - - // finished? - // notify if action complete event and response have been - // received - if (events.isComplete()) - { - events.notifyAll(); - } - } - } - } - - private static class ProtocolIdentifierWrapper - { - String value; - } + public void onManagerEvent(ManagerEvent event) + { + synchronized (events) + { + // should always be a ResponseEvent, anyway... + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + + responseEvent = (ResponseEvent) event; + events.addEvent(responseEvent); + } + + // finished? + if (actionCompleteEventClass.isAssignableFrom(event.getClass())) + { + events.setComplete(true); + // notify if action complete event and response have been + // received + if (events.getResponse() != null) + { + events.notifyAll(); + } + } + } + } + + public void onResponse(ManagerResponse response) + { + synchronized (events) + { + events.setRepsonse(response); + if (response instanceof ManagerError) + { + events.setComplete(true); + } + + // finished? + // notify if action complete event and response have been + // received + if (events.isComplete()) + { + events.notifyAll(); + } + } + } + } + + private static class ProtocolIdentifierWrapper + { + String value; + } } diff --git a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java index baab4f118..fd7030ff9 100644 --- a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java +++ b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java @@ -24,6 +24,8 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.NoSuchElementException; import java.util.Scanner; import java.util.regex.Pattern; @@ -52,11 +54,12 @@ public class SocketConnectionFacadeImpl implements SocketConnectionFacade * @param ssl true to use SSL, false otherwise. * @param timeout 0 incidcates default * @param readTimeout see {@link Socket#setSoTimeout(int)} + * @param encoding the encoding used for transmission of strings * @throws IOException if the connection cannot be established. */ - public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeout, int readTimeout) throws IOException + public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeout, int readTimeout, Charset encoding) throws IOException { - this(host, port, ssl, timeout, readTimeout, CRNL_PATTERN); + this(host, port, ssl, timeout, readTimeout, encoding, CRNL_PATTERN); } /** @@ -67,10 +70,11 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou * @param ssl true to use SSL, false otherwise. * @param timeout 0 incidcates default * @param readTimeout see {@link Socket#setSoTimeout(int)} + * @param encoding the encoding used for transmission of strings * @param lineDelimiter a {@link Pattern} for matching the line delimiter for the socket * @throws IOException if the connection cannot be established. */ - public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeout, int readTimeout, Pattern lineDelimiter) throws IOException + public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeout, int readTimeout, Charset encoding, Pattern lineDelimiter) throws IOException { Socket socket; @@ -85,7 +89,7 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou socket.setSoTimeout(readTimeout); socket.connect(new InetSocketAddress(host, port), timeout); - initialize(socket, lineDelimiter); + initialize(socket, encoding, lineDelimiter); if (System.getProperty(Trace.TRACE_PROPERTY, "false").equalsIgnoreCase("true")) { trace = new FileTrace(socket); @@ -100,26 +104,27 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou */ SocketConnectionFacadeImpl(Socket socket) throws IOException { socket.setSoTimeout(MAX_SOCKET_READ_TIMEOUT_MILLIS); - initialize(socket, NL_PATTERN); + initialize(socket, StandardCharsets.UTF_8, NL_PATTERN); } /** 70 mi = 70 * 60 * 1000 */ private static final int MAX_SOCKET_READ_TIMEOUT_MILLIS = 4200000; - private void initialize(Socket socket, Pattern pattern) throws IOException + private void initialize(Socket socket, Charset encoding, Pattern pattern) throws IOException { this.socket = socket; InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, encoding)); this.scanner = new Scanner(reader); this.scanner.useDelimiter(pattern); - this.writer = new BufferedWriter(new OutputStreamWriter(outputStream)); + this.writer = new BufferedWriter(new OutputStreamWriter(outputStream, encoding)); } + @Override public String readLine() throws IOException { String line; From 113a5fdf37057d6f692df0ba8f4881ee14569beb Mon Sep 17 00:00:00 2001 From: sere Date: Wed, 18 Nov 2015 10:22:46 +0100 Subject: [PATCH 0188/1055] Restored public constructors for backward compatibility --- .../internal/SocketConnectionFacadeImpl.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java index fd7030ff9..564cc8e22 100644 --- a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java +++ b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java @@ -47,7 +47,22 @@ public class SocketConnectionFacadeImpl implements SocketConnectionFacade private Trace trace; /** - * Creates a new instance for use with the Manager API that uses CRNL ("\r\n") as line delimiter. + * Creates a new instance for use with the Manager API that uses UTF-8 as encoding and CRNL ("\r\n") as line delimiter. + * + * @param host the foreign host to connect to. + * @param port the foreign port to connect to. + * @param ssl true to use SSL, false otherwise. + * @param timeout 0 incidcates default + * @param readTimeout see {@link Socket#setSoTimeout(int)} + * @throws IOException if the connection cannot be established. + */ + public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeout, int readTimeout) throws IOException + { + this(host, port, ssl, timeout, readTimeout, StandardCharsets.UTF_8, CRNL_PATTERN); + } + + /** + * Creates a new instance for use with the Manager API that uses the given encoding and CRNL ("\r\n") as line delimiter. * * @param host the foreign host to connect to. * @param port the foreign port to connect to. @@ -63,7 +78,23 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou } /** - * Creates a new instance for use with the Manager API that uses the given line delimiter. + * Creates a new instance for use with the Manager API that uses UTF-8 as encoding and the given line delimiter. + * + * @param host the foreign host to connect to. + * @param port the foreign port to connect to. + * @param ssl true to use SSL, false otherwise. + * @param timeout 0 incidcates default + * @param readTimeout see {@link Socket#setSoTimeout(int)} + * @param lineDelimiter a {@link Pattern} for matching the line delimiter for the socket + * @throws IOException if the connection cannot be established. + */ + public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeout, int readTimeout, Pattern lineDelimiter) throws IOException + { + this(host, port, ssl, timeout, readTimeout, StandardCharsets.UTF_8, lineDelimiter); + } + + /** + * Creates a new instance for use with the Manager API that uses the given encoding and line delimiter. * * @param host the foreign host to connect to. * @param port the foreign port to connect to. From 043512c89cb0bd9d8320db697557ad8158a3014e Mon Sep 17 00:00:00 2001 From: mareckii Date: Wed, 25 Nov 2015 12:53:49 +0100 Subject: [PATCH 0189/1055] fixed invalid condition --- .../asteriskjava/fastagi/command/DatabaseDelTreeCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/asteriskjava/fastagi/command/DatabaseDelTreeCommand.java b/src/main/java/org/asteriskjava/fastagi/command/DatabaseDelTreeCommand.java index 43948a261..017476a36 100644 --- a/src/main/java/org/asteriskjava/fastagi/command/DatabaseDelTreeCommand.java +++ b/src/main/java/org/asteriskjava/fastagi/command/DatabaseDelTreeCommand.java @@ -107,7 +107,7 @@ public void setKeyTree(String keyTree) @Override public String buildCommand() { - if (keyTree == null) + if (keyTree != null) { return "DATABASE DELTREE " + escapeAndQuote(family) + " " + escapeAndQuote(keyTree); } From bb5b22cc09991920f9c7b370c5300b2e355094dc Mon Sep 17 00:00:00 2001 From: sere Date: Wed, 25 Nov 2015 15:32:52 +0100 Subject: [PATCH 0190/1055] Added comments for get/set encoding method --- .../asteriskjava/manager/ManagerConnection.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/org/asteriskjava/manager/ManagerConnection.java b/src/main/java/org/asteriskjava/manager/ManagerConnection.java index 8b9ad5e4f..fabbe06e7 100644 --- a/src/main/java/org/asteriskjava/manager/ManagerConnection.java +++ b/src/main/java/org/asteriskjava/manager/ManagerConnection.java @@ -91,8 +91,22 @@ public interface ManagerConnection */ AsteriskVersion getVersion(); + /** + * Sets the encoding to use to connect to the Asterisk server (eg. important for manager/user events). + * All connections should use the same encoding. + * The default is UTF-8. + * + * @param encoding the encoding to use for manager/user events etc. + */ void setEncoding(Charset encoding); + /** + * Returns the encoding to use to connect to the Asterisk server (eg. important for manager/user events). + * All connections should use the same encoding. + * The default is UTF-8. + * + * @return the encoding to use for manager/user events etc. + */ Charset getEncoding(); /** From b959b68c1329661d4bcadee6168d9977dce3f437 Mon Sep 17 00:00:00 2001 From: Sean Bright Date: Mon, 30 Nov 2015 09:02:13 -0500 Subject: [PATCH 0191/1055] Properly detect Asterisk instances built from git Asterisk from git uses a different version string to indicate that it is not from a release tarball. This commit updates the regular expressions to support: Asterisk 13... Asterisk SVN-branch-13... and Asterisk GIT-13 --- .../manager/internal/ManagerConnectionImpl.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index f816750fc..d21f27ec4 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -80,12 +80,12 @@ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher private static final int MAX_VERSION_ATTEMPTS = 4; private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); - private static final Pattern VERSION_PATTERN_1_6 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.6[-. ].*"); - private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.8[-. ].*"); - private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); - private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); - private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?12[-. ].*"); - private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?13[-. ].*"); + private static final Pattern VERSION_PATTERN_1_6 = Pattern.compile("^\\s*Asterisk ((SVN-branch|GIT)-)?1\\.6[-. ].*"); + private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk ((SVN-branch|GIT)-)?1\\.8[-. ].*"); + private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk ((SVN-branch|GIT)-)?10[-. ].*"); + private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk ((SVN-branch|GIT)-)?11[-. ].*"); + private static final Pattern VERSION_PATTERN_12 = Pattern.compile("^\\s*Asterisk ((SVN-branch|GIT)-)?12[-. ].*"); + private static final Pattern VERSION_PATTERN_13 = Pattern.compile("^\\s*Asterisk ((SVN-branch|GIT)-)?13[-. ].*"); private static final AtomicLong idCounter = new AtomicLong(0); From f7ea74d47d85aacbf57695691d3303ff20a415f2 Mon Sep 17 00:00:00 2001 From: sere Date: Fri, 4 Dec 2015 16:14:50 +0100 Subject: [PATCH 0192/1055] Added comments for constructors --- .../util/internal/SocketConnectionFacadeImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java index 564cc8e22..146a41faf 100644 --- a/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java +++ b/src/main/java/org/asteriskjava/util/internal/SocketConnectionFacadeImpl.java @@ -69,7 +69,7 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou * @param ssl true to use SSL, false otherwise. * @param timeout 0 incidcates default * @param readTimeout see {@link Socket#setSoTimeout(int)} - * @param encoding the encoding used for transmission of strings + * @param encoding the encoding used for transmission of strings (all connections should use the same encoding) * @throws IOException if the connection cannot be established. */ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeout, int readTimeout, Charset encoding) throws IOException @@ -101,7 +101,7 @@ public SocketConnectionFacadeImpl(String host, int port, boolean ssl, int timeou * @param ssl true to use SSL, false otherwise. * @param timeout 0 incidcates default * @param readTimeout see {@link Socket#setSoTimeout(int)} - * @param encoding the encoding used for transmission of strings + * @param encoding the encoding used for transmission of strings (all connections should use the same encoding) * @param lineDelimiter a {@link Pattern} for matching the line delimiter for the socket * @throws IOException if the connection cannot be established. */ From 304421c261da68df03ad2fb96683241c8df12c0a Mon Sep 17 00:00:00 2001 From: emopers Date: Sat, 5 Dec 2015 16:41:18 -0600 Subject: [PATCH 0193/1055] Fixing encoding issue --- .../java/org/asteriskjava/manager/event/AsyncAgiEvent.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java index 87b2a7213..227f9e97a 100644 --- a/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AsyncAgiEvent.java @@ -203,13 +203,12 @@ private List decode(String s) try { - final String decodedString = URLDecoder.decode(s, "ISO-8859-1"); + final String decodedString = URLDecoder.decode(s, "UTF-8"); result.addAll(Arrays.asList(decodedString.split("\n"))); } catch (UnsupportedEncodingException e) { - // won't happen as JDK ships with ISO-8859-1 - throw new RuntimeException("This JDK does not support ISO-8859-1 encoding", e); + throw new RuntimeException("This JDK does not support UTF-8 encoding", e); } return result; From fa6da8b9be4642c1d3b32c40498c7dfc00168331 Mon Sep 17 00:00:00 2001 From: Robert Sutton Date: Mon, 8 Feb 2016 11:06:46 +1100 Subject: [PATCH 0194/1055] add some ignores --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 65f9df09a..ca46e776c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ target .settings/* .idea classes +/.settings/ From d7fe2e0f4345307ed1a12520f879fd2127859853 Mon Sep 17 00:00:00 2001 From: Robert Sutton Date: Mon, 8 Feb 2016 13:42:49 +1100 Subject: [PATCH 0195/1055] fix warnings --- pom.xml | 4 +- src/main/java/org/asteriskjava/Cli.java | 4 +- .../asteriskjava/config/ConfigFileReader.java | 147 +- .../dialplan/ExtensionsConfigFileReader.java | 125 +- .../fastagi/AbstractAgiServer.java | 120 +- .../fastagi/DefaultAgiServer.java | 107 +- .../ResourceBundleMappingStrategy.java | 57 +- .../fastagi/ScriptEngineMappingStrategy.java | 126 +- .../command/DatabaseDelTreeCommand.java | 17 +- .../fastagi/command/GetDataCommand.java | 48 +- .../fastagi/internal/AgiChannelImpl.java | 70 +- .../fastagi/internal/AgiRequestImpl.java | 78 +- .../fastagi/internal/FastAgiReader.java | 9 +- .../internal/AsteriskQueueMemberImpl.java | 64 +- .../live/internal/MeetMeManager.java | 32 +- .../manager/event/AbstractChannelEvent.java | 17 +- .../manager/event/AbstractRtcpEvent.java | 19 +- .../manager/event/DAHDIChannelEvent.java | 42 +- .../manager/event/DongleDeviceEntryEvent.java | 363 +- .../manager/event/DongleNewCMGREvent.java | 37 +- .../manager/event/HangupRequestEvent.java | 16 +- .../manager/event/SoftHangupRequestEvent.java | 17 +- .../internal/ManagerConnectionImpl.java | 3186 ++++++++--------- .../manager/internal/ManagerUtil.java | 49 +- .../asteriskjava/tools/HtmlEventTracer.java | 39 +- .../java/org/asteriskjava/util/AstUtil.java | 57 +- .../java/org/asteriskjava/util/DateUtil.java | 14 +- .../org/asteriskjava/util/LogFactory.java | 30 +- .../util/MixMonitorDirection.java | 44 +- .../util/internal/Log4JLogger.java | 53 +- .../internal/SocketConnectionFacadeImpl.java | 76 +- .../config/ConfigFileParserTest.java | 4 + .../fastagi/ClassNameMappingStrategyTest.java | 2 +- .../fastagi/DefaultAgiServerTest.java | 7 +- .../ResourceBundleMappingStrategyTest.java | 2 +- .../ScriptEngineMappingStrategyTest.java | 7 +- .../fastagi/internal/AgiChannelImplTest.java | 2 +- .../fastagi/internal/AgiReaderImplTest.java | 2 +- .../fastagi/internal/AgiReplyImplTest.java | 12 + .../fastagi/internal/AgiRequestImplTest.java | 7 +- .../fastagi/internal/AgiWriterImplTest.java | 2 +- .../live/internal/AsteriskAgentImplTest.java | 42 +- .../internal/AsteriskQueueMemberImplTest.java | 2 +- .../manager/event/ChannelReloadEventTest.java | 2 +- .../event/SkypeBuddyStatusEventTest.java | 4 +- .../internal/ManagerConnectionImplTest.java | 56 +- .../internal/ManagerReaderImplTest.java | 115 +- .../internal/ManagerWriterImplTest.java | 1 + .../response/CoreStatusResponseTest.java | 4 +- .../org/asteriskjava/util/DateUtilTest.java | 4 +- 50 files changed, 2755 insertions(+), 2589 deletions(-) diff --git a/pom.xml b/pom.xml index 4ec5cf823..2006adf28 100644 --- a/pom.xml +++ b/pom.xml @@ -93,8 +93,8 @@ maven-compiler-plugin 3.2 - 1.6 - 1.6 + 1.7 + 1.7 diff --git a/src/main/java/org/asteriskjava/Cli.java b/src/main/java/org/asteriskjava/Cli.java index b74e76ef0..62b85f590 100644 --- a/src/main/java/org/asteriskjava/Cli.java +++ b/src/main/java/org/asteriskjava/Cli.java @@ -1,11 +1,11 @@ package org.asteriskjava; -import org.asteriskjava.fastagi.DefaultAgiServer; - import java.io.IOException; import java.io.InputStream; import java.util.Properties; +import org.asteriskjava.fastagi.DefaultAgiServer; + /** * Simple command line interface for Asterisk-Java. This class is run when Asterisk-Java is started * with {@code java -jar asterisk-java.jar}. It is configured as Main-Class in the manifest.

diff --git a/src/main/java/org/asteriskjava/config/ConfigFileReader.java b/src/main/java/org/asteriskjava/config/ConfigFileReader.java index 18aa62b21..c11fdccd4 100644 --- a/src/main/java/org/asteriskjava/config/ConfigFileReader.java +++ b/src/main/java/org/asteriskjava/config/ConfigFileReader.java @@ -4,13 +4,19 @@ import java.io.FileReader; import java.io.IOException; import java.nio.CharBuffer; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; /** - * Reads and parses Asterisk configuration files. - *
- * See Asterisk's main/config.c. - *
+ * Reads and parses Asterisk configuration files.
+ * See Asterisk's main/config.c.
* Client code is not supposed to use this class. * * @author srt @@ -21,11 +27,11 @@ public class ConfigFileReader private static final int MAX_LINE_LENGTH = 8192; private static char COMMENT_META = ';'; private static char COMMENT_TAG = '-'; - private static final Set> WARNING_CLASSES; + private static final Set> WARNING_CLASSES; static { - WARNING_CLASSES = new HashSet>(); + WARNING_CLASSES = new HashSet>(); WARNING_CLASSES.add(MissingEqualSignException.class); WARNING_CLASSES.add(UnknownDirectiveException.class); WARNING_CLASSES.add(MissingDirectiveParameterException.class); @@ -69,7 +75,6 @@ public ConfigFile readFile(String configfile) throws IOException, ConfigParseExc result = new ConfigFileImpl(configfile, new TreeMap(categories)); - return result; } @@ -127,7 +132,7 @@ ConfigElement processLine(String configfile, int lineno, CharBuffer buffer) thro position = buffer.position(); c = buffer.get(); - //System.out.println(position + ": " + c); + // System.out.println(position + ": " + c); if (c == COMMENT_META) { @@ -135,15 +140,14 @@ ConfigElement processLine(String configfile, int lineno, CharBuffer buffer) thro { /* Escaped semicolons aren't comments. */ } // NOPMD - else if (buffer.remaining() >= 3 - && buffer.get(position + 1) == COMMENT_TAG - && buffer.get(position + 2) == COMMENT_TAG - && buffer.get(position + 3) != COMMENT_TAG) + else if (buffer.remaining() >= 3 && buffer.get(position + 1) == COMMENT_TAG + && buffer.get(position + 2) == COMMENT_TAG && buffer.get(position + 3) != COMMENT_TAG) { /* Meta-Comment start detected ";--" */ currentCommentLevel++; - //System.out.println("Comment start, new level: " + currentCommentLevel); + // System.out.println("Comment start, new level: " + + // currentCommentLevel); if (!inComment()) { @@ -153,9 +157,7 @@ else if (buffer.remaining() >= 3 continue; } } - else if (inComment() - && position >= 2 - && buffer.get(position - 1) == COMMENT_TAG + else if (inComment() && position >= 2 && buffer.get(position - 1) == COMMENT_TAG && buffer.get(position - 2) == COMMENT_TAG) { /* Meta-Comment end detected */ @@ -166,22 +168,24 @@ else if (inComment() { buffer.reset(); - //int commentLength = (position + 1) - buffer.position(); + // int commentLength = (position + 1) - + // buffer.position(); - //buffer.reset(); - //for (int i = 0; i < commentLength; i++) - //{ - // commentBlock.append(buffer.get()); - //} + // buffer.reset(); + // for (int i = 0; i < commentLength; i++) + // { + // commentBlock.append(buffer.get()); + // } commentBlock.append(c); - //System.out.println("Comment end at " + position + ": '" + commentBlock.toString() + "'"); + // System.out.println("Comment end at " + position + ": + // '" + commentBlock.toString() + "'"); buffer.position(position + 1); buffer.compact(); buffer.flip(); - //System.out.println("Buffer compacted"); + // System.out.println("Buffer compacted"); continue; } } @@ -189,29 +193,30 @@ else if (inComment() { if (!inComment()) { - /* If ; is found, and we are not nested in a comment, we immediately stop all comment processing */ - //System.out.println("Found ; while not in comment"); + /* + * If ; is found, and we are not nested in a comment, we + * immediately stop all comment processing + */ + // System.out.println("Found ; while not in comment"); while (buffer.hasRemaining()) { lineCommentBuilder.append(buffer.get()); } break; } - else - { - /* Found ';' while in comment */ - } // NOPMD + + /* Found ';' while in comment */ + // NOPMD } } - if (inComment()) { commentBlock.append(c); } else { - //System.out.println("Added '" + c + "' to processLine"); + // System.out.println("Added '" + c + "' to processLine"); processLineBuilder.append(c); } } @@ -223,7 +228,7 @@ else if (inComment() processLineString = processLineBuilder.toString().trim(); lineCommentString = lineCommentBuilder.toString().trim(); - //System.out.println("process line: '" + processLineString + "'"); + // System.out.println("process line: '" + processLineString + "'"); if (processLineString.length() == 0) { if (lineCommentString.length() != 0) @@ -244,16 +249,14 @@ else if (inComment() } catch (ConfigParseException e) { - // some parsing exceptions are treated as warnings by Asterisk, we mirror this behavior. + // some parsing exceptions are treated as warnings by Asterisk, we + // mirror this behavior. if (WARNING_CLASSES.contains(e.getClass())) { warnings.add(e); return null; } - else - { - throw e; - } + throw e; } if (lineCommentString.length() != 0) @@ -291,8 +294,8 @@ else if (line.charAt(0) == '#') // a directive - #include or #exec { if (currentCategory == null) { - throw new ConfigParseException(configfile, lineno, - "parse error: No category context for line %d of %s", lineno, configfile); + throw new ConfigParseException(configfile, lineno, "parse error: No category context for line %d of %s", + lineno, configfile); } configElement = parseVariable(configfile, lineno, line); @@ -308,20 +311,20 @@ protected Category parseCategoryHeader(String configfile, int lineno, String lin final String name; final int nameEndPos; - /* format is one of the following: - * [foo] define a new category named 'foo' - * [foo](!) define a new template category named 'foo' - * [foo](+) append to category 'foo', error if foo does not exist. - * [foo](a) define a new category and inherit from template a. - * You can put a comma-separated list of templates and '!' and '+' - * between parentheses, with obvious meaning. - */ + /* + * format is one of the following: [foo] define a new category named + * 'foo' [foo](!) define a new template category named 'foo' [foo](+) + * append to category 'foo', error if foo does not exist. [foo](a) + * define a new category and inherit from template a. You can put a + * comma-separated list of templates and '!' and '+' between + * parentheses, with obvious meaning. + */ nameEndPos = line.indexOf(']'); if (nameEndPos == -1) { - throw new ConfigParseException(configfile, lineno, - "parse error: no closing ']', line %d of %s", lineno, configfile); + throw new ConfigParseException(configfile, lineno, "parse error: no closing ']', line %d of %s", lineno, + configfile); } name = line.substring(1, nameEndPos); category = new Category(configfile, lineno, name); @@ -337,8 +340,8 @@ protected Category parseCategoryHeader(String configfile, int lineno, String lin optionsEndPos = optionsString.indexOf(')'); if (optionsEndPos == -1) { - throw new ConfigParseException(configfile, lineno, - "parse error: no closing ')', line %d of %s", lineno, configfile); + throw new ConfigParseException(configfile, lineno, "parse error: no closing ')', line %d of %s", lineno, + configfile); } options = optionsString.substring(1, optionsEndPos).split(","); @@ -356,12 +359,12 @@ else if ("+".equals(cur)) // category addition if (categoryToAddTo == null) { throw new ConfigParseException(configfile, lineno, - "Category addition requested, but category '%s' does not exist, line %d of %s", - name, lineno, configfile); + "Category addition requested, but category '%s' does not exist, line %d of %s", name, lineno, + configfile); } - //todo implement category addition - //category = categoryToAddTo; + // todo implement category addition + // category = categoryToAddTo; } else { @@ -371,8 +374,8 @@ else if ("+".equals(cur)) // category addition if (baseCategory == null) { throw new ConfigParseException(configfile, lineno, - "Inheritance requested, but category '%s' does not exist, line %d of %s", - cur, lineno, configfile); + "Inheritance requested, but category '%s' does not exist, line %d of %s", cur, lineno, + configfile); } inheritCategory(category, baseCategory); } @@ -414,15 +417,14 @@ ConfigDirective parseDirective(String configfile, int lineno, String line) throw param = paramBuilder.toString().trim(); - if (param.length() != 0 && - (param.charAt(0) == '"' || param.charAt(0) == '<' || param.charAt(0) == '>')) + if (param.length() != 0 && (param.charAt(0) == '"' || param.charAt(0) == '<' || param.charAt(0) == '>')) { param = param.substring(1); } int endPos = param.length() - 1; - if (param.length() != 0 && - (param.charAt(endPos) == '"' || param.charAt(endPos) == '<' || param.charAt(endPos) == '>')) + if (param.length() != 0 + && (param.charAt(endPos) == '"' || param.charAt(endPos) == '<' || param.charAt(endPos) == '>')) { param = param.substring(0, endPos); } @@ -437,18 +439,19 @@ else if ("include".equalsIgnoreCase(name)) } else { - throw new UnknownDirectiveException(configfile, lineno, - "Unknown directive '%s' at line %d of %s", name, lineno, configfile); + throw new UnknownDirectiveException(configfile, lineno, "Unknown directive '%s' at line %d of %s", name, lineno, + configfile); } if (param.length() == 0) { + if (name == null) + { + name = ""; + } throw new MissingDirectiveParameterException(configfile, lineno, - "Directive '#%s' needs an argument (%s) at line %d of %s", - name.toLowerCase(Locale.US), - "include".equalsIgnoreCase(name) ? "filename" : "/path/to/executable", - lineno, - configfile); + "Directive '#%s' needs an argument (%s) at line %d of %s", name.toLowerCase(Locale.US), + "include".equalsIgnoreCase(name) ? "filename" : "/path/to/executable", lineno, configfile); } return directive; @@ -463,8 +466,8 @@ protected ConfigVariable parseVariable(String configfile, int lineno, String lin pos = line.indexOf('='); if (pos == -1) { - throw new MissingEqualSignException(configfile, lineno, - "No '=' (equal sign) in line %d of %s", lineno, configfile); + throw new MissingEqualSignException(configfile, lineno, "No '=' (equal sign) in line %d of %s", lineno, + configfile); } name = line.substring(0, pos).trim(); diff --git a/src/main/java/org/asteriskjava/config/dialplan/ExtensionsConfigFileReader.java b/src/main/java/org/asteriskjava/config/dialplan/ExtensionsConfigFileReader.java index 98914a8e5..fe1922082 100644 --- a/src/main/java/org/asteriskjava/config/dialplan/ExtensionsConfigFileReader.java +++ b/src/main/java/org/asteriskjava/config/dialplan/ExtensionsConfigFileReader.java @@ -17,28 +17,26 @@ public class ExtensionsConfigFileReader extends ConfigFileReader { /* * This method corresponds to an iteration of the loop at line 2212 Notes: - * 1. [general] and [globals] are allowed to be a context here if they contain only configvariables - * 2. switch and ignorepat are treated like regular ConfigVariable. + * 1. [general] and [globals] are allowed to be a context here if they + * contain only configvariables 2. switch and ignorepat are treated like + * regular ConfigVariable. */ @Override protected ConfigElement processTextLine(String configfile, int lineno, String line) throws ConfigParseException { ConfigElement configElement; - - if( - (line.trim().startsWith("exten") || line.trim().startsWith("include")) && - currentCategory != null && - (currentCategory.getName().equals("general") || currentCategory.getName().equals("globals")) - ) - throw new ConfigParseException(configfile, lineno, "cannot have 'exten' or 'include' in global or general sections"); - - + + if ((line.trim().startsWith("exten") || line.trim().startsWith("include")) && currentCategory != null + && (currentCategory.getName().equals("general") || currentCategory.getName().equals("globals"))) + throw new ConfigParseException(configfile, lineno, + "cannot have 'exten' or 'include' in global or general sections"); + /* - * Goal here is to break out anything unique that we might want to - * look at and parse separately. For now, only exten and include fit - * that criteria. Eventually, I could see parsing sections for things - * from macros, contexts to differentiate them from categories, switch - * for realtime, and more. + * Goal here is to break out anything unique that we might want to look + * at and parse separately. For now, only exten and include fit that + * criteria. Eventually, I could see parsing sections for things from + * macros, contexts to differentiate them from categories, switch for + * realtime, and more. */ if (line.trim().startsWith("exten")) { @@ -46,7 +44,7 @@ protected ConfigElement processTextLine(String configfile, int lineno, String li currentCategory.addElement(configElement); return configElement; } - else if(line.trim().startsWith("include")) + else if (line.trim().startsWith("include")) { // use parseVariable since we have access to it ConfigVariable configvar = parseVariable(configfile, lineno, line); @@ -54,83 +52,92 @@ else if(line.trim().startsWith("include")) currentCategory.addElement(configElement); return configElement; } - + // leave everything else the same configElement = super.processTextLine(configfile, lineno, line); - + return configElement; } - + /* Roughly corresponds to pbx_config.c:2222 */ protected ConfigExtension parseExtension(String configfile, int lineno, String line) throws ConfigParseException { ConfigVariable initialVariable = parseVariable(configfile, lineno, line); - - if(!initialVariable.getName().equals("exten")) + + if (!initialVariable.getName().equals("exten")) throw new ConfigParseException(configfile, lineno, "missing 'exten' near " + line); line = initialVariable.getValue().trim(); int nameIndex = line.indexOf(",", 0); - if(nameIndex == -1) + if (nameIndex == -1) throw new ConfigParseException(configfile, lineno, "missing extension name near " + line); String name = line.substring(0, nameIndex); - line = line.substring(name.length()+1, line.length()).trim(); - + line = line.substring(name.length() + 1, line.length()).trim(); + int priorityDelimiter = line.indexOf(",", 0); - if(priorityDelimiter == -1) + if (priorityDelimiter == -1) throw new ConfigParseException(configfile, lineno, "missing extension priority near " + line); String priority = line.substring(0, priorityDelimiter); - line = line.substring(priority.length()+1, line.length()).trim(); + line = line.substring(priority.length() + 1, line.length()).trim(); - String [] application = harvestApplicationWithArguments(line); - - return new ConfigExtension(configfile,lineno,name,priority,application); + String[] application = harvestApplicationWithArguments(line); + + return new ConfigExtension(configfile, lineno, name, priority, application); } - + /* Roughly corresponds to pbx_config.c:2276 */ - private static String [] harvestApplicationWithArguments(String arg) + private static String[] harvestApplicationWithArguments(String arg) { List args = new ArrayList(); - - if(args != null && arg.trim().length() >= 0) + + if (arg.trim().length() >= 0) { String appl = "", data = ""; - + /* Find the first occurrence of either '(' or ',' */ int firstc = arg.indexOf(','); int firstp = arg.indexOf('('); - - if (firstc != -1 && (firstp == -1 || firstc < firstp)) { + + if (firstc != -1 && (firstp == -1 || firstc < firstp)) + { /* comma found, no parenthesis */ /* or both found, but comma found first */ - String [] split = arg.split(","); + String[] split = arg.split(","); appl = split[0]; - for(int i = 1; i < split.length; i++) - data += split[i] + (i+1 + * Sets the default number of worker threads in the thread pool.
* This is the number of threads that are available even if they are idle. *
* The default pool size is 10. @@ -132,20 +136,20 @@ public synchronized void setPoolSize(int poolSize) * @return the maximum number of worker threads in the thread pool. * @since 1.0.0 */ - public int getMaximumPoolSize() + public synchronized int getMaximumPoolSize() { return maximumPoolSize; } /** - * Sets the maximum number of worker threads in the thread pool. - *
- * This equals the maximum number of concurrent requests this AgiServer can serve. - *
+ * Sets the maximum number of worker threads in the thread pool.
+ * This equals the maximum number of concurrent requests this AgiServer can + * serve.
* The default maximum pool size is 100. * * @param maximumPoolSize the maximum size of the worker thread pool. - * @throws IllegalArgumentException if maximumPoolSize is less than current pool size or less than or equal to 0. + * @throws IllegalArgumentException if maximumPoolSize is less than current + * pool size or less than or equal to 0. * @see java.util.concurrent.ThreadPoolExecutor#setMaximumPoolSize(int) */ public synchronized void setMaximumPoolSize(int maximumPoolSize) @@ -157,7 +161,8 @@ public synchronized void setMaximumPoolSize(int maximumPoolSize) if (maximumPoolSize < poolSize) { - throw new IllegalArgumentException("New maximumPoolSize (" + maximumPoolSize + ") is less than current pool size (" + poolSize + ")"); + throw new IllegalArgumentException( + "New maximumPoolSize (" + maximumPoolSize + ") is less than current pool size (" + poolSize + ")"); } if (pool != null) @@ -168,7 +173,8 @@ public synchronized void setMaximumPoolSize(int maximumPoolSize) } /** - * Sets the strategy to use for mapping AgiRequests to AgiScripts that serve them. + * Sets the strategy to use for mapping AgiRequests to AgiScripts that serve + * them. * * @param mappingStrategy the mapping strategy to use. */ @@ -209,7 +215,8 @@ protected void finalize() throws Throwable } /** - * Execute the runnable using the configured ThreadPoolExecutor obtained from {@link #getPool()}. + * Execute the runnable using the configured ThreadPoolExecutor obtained + * from {@link #getPool()}. * * @param command the command to run. * @throws RejectedExecutionException if the runnable can't be executed @@ -241,33 +248,41 @@ private synchronized ThreadPoolExecutor getPool() return pool; } + /** + * Returns the approximate number of AgiConnectionHandler threads that are + * actively executing tasks. + * + * @see ThreadPoolExecutor#getActiveCount() + * @see #getPoolActiveThreadCount() + * @see org.asteriskjava.fastagi.internal.AgiConnectionHandler#AGI_CONNECTION_HANDLERS + */ + public int getPoolActiveTaskCount() + { + if (pool != null) + { + return pool.getActiveCount(); + } + return -1; + }// getPoolActiveCount - /** - * Returns the approximate number of AgiConnectionHandler threads that are actively executing tasks. - * @see ThreadPoolExecutor#getActiveCount() - * @see #getPoolActiveThreadCount() - * @see org.asteriskjava.fastagi.internal.AgiConnectionHandler#AGI_CONNECTION_HANDLERS - */ - public int getPoolActiveTaskCount () { - if (pool != null) { - return pool.getActiveCount(); - } - return -1; - }//getPoolActiveCount - - public int getPoolActiveThreadCount () { - if (pool != null) { - return pool.getPoolSize(); - } - return -1; - }//getPoolActiveThreadCount + public int getPoolActiveThreadCount() + { + if (pool != null) + { + return pool.getPoolSize(); + } + return -1; + }// getPoolActiveThreadCount /** - * Creates a new ThreadPoolExecutor to serve the AGI requests. The nature of this pool - * defines how many concurrent requests can be handled. The default implementation - * returns a dynamic thread pool defined by the poolSize and maximumPoolSize properties.

- * You can override this method to change this behavior. For example you can use a cached - * pool with + * Creates a new ThreadPoolExecutor to serve the AGI requests. The nature of + * this pool defines how many concurrent requests can be handled. The + * default implementation returns a dynamic thread pool defined by the + * poolSize and maximumPoolSize properties. + *

+ * You can override this method to change this behavior. For example you can + * use a cached pool with + * *

      * return Executors.newCachedThreadPool(new DaemonThreadFactory());
      * 
@@ -278,12 +293,7 @@ public int getPoolActiveThreadCount () { */ protected ThreadPoolExecutor createPool() { - return new ThreadPoolExecutor( - poolSize, - (maximumPoolSize < poolSize) ? poolSize : maximumPoolSize, - 50000L, TimeUnit.MILLISECONDS, - new SynchronousQueue(), - new DaemonThreadFactory() - ); + return new ThreadPoolExecutor(poolSize, (maximumPoolSize < poolSize) ? poolSize : maximumPoolSize, 50000L, + TimeUnit.MILLISECONDS, new SynchronousQueue(), new DaemonThreadFactory()); } } diff --git a/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java b/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java index 66cf11e63..3551a4d9b 100644 --- a/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java +++ b/src/main/java/org/asteriskjava/fastagi/DefaultAgiServer.java @@ -16,6 +16,12 @@ */ package org.asteriskjava.fastagi; +import java.io.IOException; +import java.net.InetAddress; +import java.util.MissingResourceException; +import java.util.ResourceBundle; +import java.util.concurrent.RejectedExecutionException; + import org.asteriskjava.fastagi.internal.AgiChannelFactory; import org.asteriskjava.fastagi.internal.AgiConnectionHandler; import org.asteriskjava.fastagi.internal.DefaultAgiChannelFactory; @@ -27,14 +33,9 @@ import org.asteriskjava.util.SocketConnectionFacade; import org.asteriskjava.util.internal.ServerSocketFacadeImpl; -import java.io.IOException; -import java.net.InetAddress; -import java.util.MissingResourceException; -import java.util.ResourceBundle; -import java.util.concurrent.RejectedExecutionException; - /** - * Default implementation of the {@link org.asteriskjava.fastagi.AgiServer} interface for FastAGI. + * Default implementation of the {@link org.asteriskjava.fastagi.AgiServer} + * interface for FastAGI. * * @author srt * @version $Id$ @@ -52,9 +53,9 @@ public class DefaultAgiServer extends AbstractAgiServer implements AgiServer * The default bind port. */ private static final int DEFAULT_BIND_PORT = 4573; - - /** Default 50? Windows server max 200? */ - private static final int BACKLOG = 200; + + /** Default 50? Windows server max 200? */ + private static final int BACKLOG = 200; private ServerSocketFacade serverSocket; @@ -72,9 +73,11 @@ public DefaultAgiServer() } /** - * Creates a new DefaultAgiServer and set a custom factory for creating AgiChannels + * Creates a new DefaultAgiServer and set a custom factory for creating + * AgiChannels * - * @param agiChannelFactory The factory to use for creating new AgiChannel instances. + * @param agiChannelFactory The factory to use for creating new AgiChannel + * instances. */ public DefaultAgiServer(AgiChannelFactory agiChannelFactory) { @@ -82,9 +85,11 @@ public DefaultAgiServer(AgiChannelFactory agiChannelFactory) } /** - * Creates a new DefaultAgiServer and loads its configuration from an alternative resource bundle. + * Creates a new DefaultAgiServer and loads its configuration from an + * alternative resource bundle. * - * @param configResourceBundleName the name of the conifiguration resource bundle (default is "fastagi"). + * @param configResourceBundleName the name of the conifiguration resource + * bundle (default is "fastagi"). */ public DefaultAgiServer(String configResourceBundleName) { @@ -92,9 +97,11 @@ public DefaultAgiServer(String configResourceBundleName) } /** - * Creates a new DefaultAgiServer that uses the given {@link MappingStrategy}. + * Creates a new DefaultAgiServer that uses the given + * {@link MappingStrategy}. * - * @param mappingStrategy the MappingStrategy to use to determine the AgiScript to run. + * @param mappingStrategy the MappingStrategy to use to determine the + * AgiScript to run. * @since 1.0.0 */ public DefaultAgiServer(MappingStrategy mappingStrategy) @@ -103,7 +110,8 @@ public DefaultAgiServer(MappingStrategy mappingStrategy) } /** - * Creates a new DefaultAgiServer that runs the given {@link AgiScript} for all requests. + * Creates a new DefaultAgiServer that runs the given {@link AgiScript} for + * all requests. * * @param agiScript the AgiScript to run. * @since 1.0.0 @@ -114,11 +122,13 @@ public DefaultAgiServer(AgiScript agiScript) } /** - * Creates a new DefaultAgiServer and loads its configuration from an alternative resource bundle and - * uses the given {@link MappingStrategy}. + * Creates a new DefaultAgiServer and loads its configuration from an + * alternative resource bundle and uses the given {@link MappingStrategy}. * - * @param configResourceBundleName the name of the conifiguration resource bundle (default is "fastagi"). - * @param mappingStrategy the MappingStrategy to use to determine the AgiScript to run. + * @param configResourceBundleName the name of the conifiguration resource + * bundle (default is "fastagi"). + * @param mappingStrategy the MappingStrategy to use to determine the + * AgiScript to run. * @since 1.0.0 */ public DefaultAgiServer(String configResourceBundleName, MappingStrategy mappingStrategy) @@ -127,15 +137,19 @@ public DefaultAgiServer(String configResourceBundleName, MappingStrategy mapping } /** - * Creates a new DefaultAgiServer and loads its configuration from an alternative resource bundle and - * uses the given {@link MappingStrategy}. + * Creates a new DefaultAgiServer and loads its configuration from an + * alternative resource bundle and uses the given {@link MappingStrategy}. * - * @param configResourceBundleName the name of the conifiguration resource bundle (default is "fastagi"). - * @param mappingStrategy the MappingStrategy to use to determine the AgiScript to run. - * @param agiChannelFactory The factory to use for creating new AgiChannel instances. + * @param configResourceBundleName the name of the conifiguration resource + * bundle (default is "fastagi"). + * @param mappingStrategy the MappingStrategy to use to determine the + * AgiScript to run. + * @param agiChannelFactory The factory to use for creating new AgiChannel + * instances. * @since 1.0.0 */ - public DefaultAgiServer(String configResourceBundleName, MappingStrategy mappingStrategy, AgiChannelFactory agiChannelFactory) + public DefaultAgiServer(String configResourceBundleName, MappingStrategy mappingStrategy, + AgiChannelFactory agiChannelFactory) { super(agiChannelFactory); @@ -147,8 +161,8 @@ public DefaultAgiServer(String configResourceBundleName, MappingStrategy mapping compositeMappingStrategy.addStrategy(new ClassNameMappingStrategy()); if (ReflectionUtil.isClassAvailable("javax.script.ScriptEngineManager")) { - MappingStrategy scriptEngineMappingStrategy = - (MappingStrategy) ReflectionUtil.newInstance("org.asteriskjava.fastagi.ScriptEngineMappingStrategy"); + MappingStrategy scriptEngineMappingStrategy = (MappingStrategy) ReflectionUtil + .newInstance("org.asteriskjava.fastagi.ScriptEngineMappingStrategy"); if (scriptEngineMappingStrategy != null) { compositeMappingStrategy.addStrategy(scriptEngineMappingStrategy); @@ -174,10 +188,8 @@ public DefaultAgiServer(String configResourceBundleName, MappingStrategy mapping loadConfig(); } - /** - * Sets the TCP port to listen on for new connections. - *
+ * Sets the TCP port to listen on for new connections.
* The default port is 4573. * * @param bindPort the port to bind to. @@ -190,8 +202,7 @@ public void setBindPort(int bindPort) } /** - * Sets the TCP port to listen on for new connections. - *
+ * Sets the TCP port to listen on for new connections.
* The default port is 4573. * * @param port the port to bind to. @@ -215,17 +226,21 @@ public int getPort() /** * Returns the address this server is configured to bind to. + * * @return the address this server is configured to bind to. */ - public InetAddress getAddress() { + public InetAddress getAddress() + { return address; } /** * Sets the address to bind server. + * * @param address the address to bind to. */ - public void setAddress(InetAddress address) { + public void setAddress(InetAddress address) + { this.address = address; } @@ -318,18 +333,16 @@ public void startup() throws IOException, IllegalStateException { break; } - else - { - // handle exception but continue to run - handleException("IOException while waiting for connections.", e); - continue; - } + // handle exception but continue to run + handleException("IOException while waiting for connections.", e); + continue; } logger.debug("Received connection from " + socket.getRemoteAddress()); // execute connection handler - final AgiConnectionHandler connectionHandler = new FastAgiConnectionHandler(getMappingStrategy(), socket, this.getAgiChannelFactory()); + final AgiConnectionHandler connectionHandler = new FastAgiConnectionHandler(getMappingStrategy(), socket, + this.getAgiChannelFactory()); try { execute(connectionHandler); @@ -337,7 +350,8 @@ public void startup() throws IOException, IllegalStateException catch (RejectedExecutionException e) { logger.warn("Execution was rejected by pool. Try to increase the pool size."); - // release resources like closing the socket if execution was rejected due to the pool size + // release resources like closing the socket if execution was + // rejected due to the pool size connectionHandler.release(); } } @@ -356,13 +370,14 @@ public void run() } catch (IOException e) // NOPMD { - // nothing we can do about that and exceptions have already been logged + // nothing we can do about that and exceptions have already been + // logged // by startup(). } } @Override - public void shutdown() throws IllegalStateException + public synchronized void shutdown() throws IllegalStateException { // setting the death flag causes the accept() loop to exit when a // SocketException occurs. diff --git a/src/main/java/org/asteriskjava/fastagi/ResourceBundleMappingStrategy.java b/src/main/java/org/asteriskjava/fastagi/ResourceBundleMappingStrategy.java index b93f6550b..afbfb2cb8 100644 --- a/src/main/java/org/asteriskjava/fastagi/ResourceBundleMappingStrategy.java +++ b/src/main/java/org/asteriskjava/fastagi/ResourceBundleMappingStrategy.java @@ -16,12 +16,19 @@ */ package org.asteriskjava.fastagi; -import java.util.*; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.MissingResourceException; +import java.util.ResourceBundle; /** - * A MappingStrategy that is configured via a resource bundle.

+ * A MappingStrategy that is configured via a resource bundle. + *

* The resource bundle contains the script part of the url as key and the fully - * qualified class name of the corresponding AgiScript as value.

+ * qualified class name of the corresponding AgiScript as value. + *

* Example: * *

@@ -30,9 +37,10 @@
  * 
* * LeastCostDialAgiScript and HelloAgiScript must both implement the AgiScript - * interface and have a default constructor with no parameters.

+ * interface and have a default constructor with no parameters. + *

* The resource bundle (properties) file is called - * fastagi-mapping.properties by default and must be available on + * fastagi-mapping.properties by default and must be available on * the classpath. * * @author srt @@ -55,8 +63,8 @@ public ResourceBundleMappingStrategy() } /** - * Creates a new ResourceBundleMappingStrategy with the given basename - * of the resource bundle to use. + * Creates a new ResourceBundleMappingStrategy with the given basename of + * the resource bundle to use. * * @param resourceBundleName basename of the resource bundle to use */ @@ -66,12 +74,11 @@ public ResourceBundleMappingStrategy(String resourceBundleName) } /** - * Creates a new ResourceBundleMappingStrategy indicating whether to use shared - * instances or not. + * Creates a new ResourceBundleMappingStrategy indicating whether to use + * shared instances or not. * * @param shareInstances true to use shared instances, - * false to create a new instance for - * each request. + * false to create a new instance for each request. * @since 0.3 */ public ResourceBundleMappingStrategy(boolean shareInstances) @@ -80,14 +87,13 @@ public ResourceBundleMappingStrategy(boolean shareInstances) } /** - * Creates a new ResourceBundleMappingStrategy with the given basename - * of the resource bundle to use and indicating whether to use shared - * instances or not. + * Creates a new ResourceBundleMappingStrategy with the given basename of + * the resource bundle to use and indicating whether to use shared instances + * or not. * * @param resourceBundleName basename of the resource bundle to use * @param shareInstances true to use shared instances, - * false to create a new instance for - * each request. + * false to create a new instance for each request. * @since 0.3 */ public ResourceBundleMappingStrategy(String resourceBundleName, boolean shareInstances) @@ -98,7 +104,8 @@ public ResourceBundleMappingStrategy(String resourceBundleName, boolean shareIns } /** - * Sets the basename of the resource bundle to use.

+ * Sets the basename of the resource bundle to use. + *

* Default is "fastagi-mapping". * * @param resourceBundleName basename of the resource bundle to use @@ -115,14 +122,13 @@ public void setResourceBundleName(String resourceBundleName) /** * Sets whether to use shared instances or not. If set to true - * all AgiRequests are served by the same instance of an - * AgiScript, if set to false a new instance is created for - * each request.

+ * all AgiRequests are served by the same instance of an AgiScript, if set + * to false a new instance is created for each request. + *

* Default is true. * * @param shareInstances true to use shared instances, - * false to create a new instance for - * each request. + * false to create a new instance for each request. * @since 0.3 */ public synchronized void setShareInstances(boolean shareInstances) @@ -133,7 +139,7 @@ public synchronized void setShareInstances(boolean shareInstances) private synchronized void loadResourceBundle() { ResourceBundle resourceBundle; - Enumeration keys; + Enumeration< ? > keys; mappings = new HashMap(); if (shareInstances) @@ -189,9 +195,6 @@ public synchronized AgiScript determineScript(AgiRequest request) { return instances.get(request.getScript()); } - else - { - return createAgiScriptInstance(mappings.get(request.getScript())); - } + return createAgiScriptInstance(mappings.get(request.getScript())); } } diff --git a/src/main/java/org/asteriskjava/fastagi/ScriptEngineMappingStrategy.java b/src/main/java/org/asteriskjava/fastagi/ScriptEngineMappingStrategy.java index fbfac7875..4bc57c30c 100644 --- a/src/main/java/org/asteriskjava/fastagi/ScriptEngineMappingStrategy.java +++ b/src/main/java/org/asteriskjava/fastagi/ScriptEngineMappingStrategy.java @@ -16,25 +16,34 @@ */ package org.asteriskjava.fastagi; -import org.asteriskjava.util.LogFactory; -import org.asteriskjava.util.Log; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import javax.script.Bindings; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; -import javax.script.Bindings; import javax.script.ScriptException; -import java.io.*; -import java.util.Arrays; -import java.util.regex.Matcher; -import java.util.List; -import java.util.ArrayList; -import java.net.URLClassLoader; -import java.net.URL; -import java.net.MalformedURLException; + +import org.asteriskjava.util.Log; +import org.asteriskjava.util.LogFactory; /** - * A MappingStrategy that uses {@link javax.script.ScriptEngine} to run AgiScripts. This MappingStrategy - * can be used to run JavaScript, Groovy, JRuby, etc. scripts. + * A MappingStrategy that uses {@link javax.script.ScriptEngine} to run + * AgiScripts. This MappingStrategy can be used to run JavaScript, Groovy, + * JRuby, etc. scripts. * * @since 1.0.0 */ @@ -60,7 +69,8 @@ public class ScriptEngineMappingStrategy implements MappingStrategy protected ScriptEngineManager scriptEngineManager = null; /** - * Creates a new ScriptEngineMappingStrategy that searches for scripts in the current directory. + * Creates a new ScriptEngineMappingStrategy that searches for scripts in + * the current directory. */ public ScriptEngineMappingStrategy() { @@ -68,10 +78,12 @@ public ScriptEngineMappingStrategy() } /** - * Creates a new ScriptEngineMappingStrategy that searches for scripts on the given path. + * Creates a new ScriptEngineMappingStrategy that searches for scripts on + * the given path. * * @param scriptPath array of directory names to search for script files. - * @param libPath array of directory names to search for additional libraries (jar files). + * @param libPath array of directory names to search for additional + * libraries (jar files). */ public ScriptEngineMappingStrategy(String[] scriptPath, String[] libPath) { @@ -80,21 +92,24 @@ public ScriptEngineMappingStrategy(String[] scriptPath, String[] libPath) } /** - * Sets the path to search for script files.

+ * Sets the path to search for script files. + *

* Default is "agi". * * @param scriptPath array of directory names to search for script files. */ public void setScriptPath(String[] scriptPath) { - this.scriptPath = Arrays.copyOf(scriptPath, scriptPath.length);; + this.scriptPath = Arrays.copyOf(scriptPath, scriptPath.length); } /** - * Sets the path to search for additional libraries (jar files).

+ * Sets the path to search for additional libraries (jar files). + *

* Default is "lib". * - * @param libPath array of directory names to search for additional libraries (jar files). + * @param libPath array of directory names to search for additional + * libraries (jar files). */ public void setLibPath(String[] libPath) { @@ -104,7 +119,8 @@ public void setLibPath(String[] libPath) @Override public AgiScript determineScript(AgiRequest request, AgiChannel channel) { - // check is a file corresponding to the AGI request is found on the scriptPath + // check is a file corresponding to the AGI request is found on the + // scriptPath final File file = searchFile(request.getScript(), scriptPath); if (file == null) { @@ -140,8 +156,9 @@ protected ScriptEngine getScriptEngine(File file) } /** - * Returns the ScriptEngineManager to use for loading the ScriptEngine. The ScriptEngineManager is only - * created once and reused for subsequent requests. Override this method to provide your own implementation. + * Returns the ScriptEngineManager to use for loading the ScriptEngine. The + * ScriptEngineManager is only created once and reused for subsequent + * requests. Override this method to provide your own implementation. * * @return the ScriptEngineManager to use for loading the ScriptEngine. * @see javax.script.ScriptEngineManager#ScriptEngineManager() @@ -156,8 +173,9 @@ protected synchronized ScriptEngineManager getScriptEngineManager() } /** - * Returns the ClassLoader to use for the ScriptEngineManager. Adds all jar files in the "lib" subdirectory of - * the current directory to the class path. Override this method to provide your own ClassLoader. + * Returns the ClassLoader to use for the ScriptEngineManager. Adds all jar + * files in the "lib" subdirectory of the current directory to the class + * path. Override this method to provide your own ClassLoader. * * @return the ClassLoader to use for the ScriptEngineManager. * @see #getScriptEngineManager() @@ -187,18 +205,25 @@ public boolean accept(File dir, String name) return name.endsWith(".jar"); } }); - - for (File jarFile : jarFiles) + if (jarFiles != null) { - try - { - jarFileUrls.add(jarFile.toURI().toURL()); - } - catch (MalformedURLException e) + + for (File jarFile : jarFiles) { - // should not happen + try + { + jarFileUrls.add(jarFile.toURI().toURL()); + } + catch (MalformedURLException e) + { + // should not happen + } } } + else + { + logger.error("Didn't find any jar files at " + libDir.getAbsolutePath()); + } } if (jarFileUrls.size() == 0) @@ -213,8 +238,10 @@ public boolean accept(File dir, String name) * Searches for the file with the given name on the path. * * @param scriptName the name of the file to search for. - * @param path an array of directories to search for the file in order of preference. - * @return the canonical file if found on the path or null if not found. + * @param path an array of directories to search for the file in order of + * preference. + * @return the canonical file if found on the path or null if + * not found. */ protected File searchFile(String scriptName, String[] path) { @@ -265,12 +292,15 @@ protected File searchFile(String scriptName, String[] path) } /** - * Checks whether a file is contained within a given directory (or a sub directory) or not. + * Checks whether a file is contained within a given directory (or a sub + * directory) or not. * * @param file the file to check. - * @param dir the directory to check. - * @return true if file is below directory, false otherwise. - * @throws IOException if the canonical path of file or dir cannot be determined. + * @param dir the directory to check. + * @return true if file is below directory, false + * otherwise. + * @throws IOException if the canonical path of file or dir cannot be + * determined. */ protected final boolean isInside(File file, File dir) throws IOException { @@ -281,7 +311,8 @@ protected final boolean isInside(File file, File dir) throws IOException * Returns the extension (the part after the last ".") of the given script. * * @param scriptName the name of the script to return the extension of. - * @return the extension of the script or null if there is no extension. + * @return the extension of the script or null if there is no + * extension. */ protected static String getExtension(String scriptName) { @@ -330,7 +361,7 @@ protected class ScriptEngineAgiScript implements NamedAgiScript /** * Creates a new ScriptEngineAgiScript. * - * @param file the file that contains the script to execute. + * @param file the file that contains the script to execute. * @param scriptEngine the ScriptEngine to use for executing the script. */ public ScriptEngineAgiScript(File file, ScriptEngine scriptEngine) @@ -371,13 +402,14 @@ public void service(AgiRequest request, AgiChannel channel) throws AgiException } /** - * Override this method if you want to add additional bindings before the script is run. By default the - * AGI request, AGI channel and the filename are available to scripts under the bindings "request", "channel" - * and "javax.script.filename". + * Override this method if you want to add additional bindings before the + * script is run. By default the AGI request, AGI channel and the filename + * are available to scripts under the bindings "request", "channel" and + * "javax.script.filename". * - * @param file the script file. - * @param request the AGI request. - * @param channel the AGI channel. + * @param file the script file. + * @param request the AGI request. + * @param channel the AGI channel. * @param bindings the bindings to populate. */ protected void populateBindings(File file, AgiRequest request, AgiChannel channel, Bindings bindings) diff --git a/src/main/java/org/asteriskjava/fastagi/command/DatabaseDelTreeCommand.java b/src/main/java/org/asteriskjava/fastagi/command/DatabaseDelTreeCommand.java index 43948a261..35449a710 100644 --- a/src/main/java/org/asteriskjava/fastagi/command/DatabaseDelTreeCommand.java +++ b/src/main/java/org/asteriskjava/fastagi/command/DatabaseDelTreeCommand.java @@ -17,7 +17,9 @@ package org.asteriskjava.fastagi.command; /** - * Deletes a family or specific keytree within a family in the Asterisk database.

+ * Deletes a family or specific keytree within a family in the Asterisk + * database. + *

* Returns 1 if successful, 0 otherwise. * * @author srt @@ -52,7 +54,8 @@ public DatabaseDelTreeCommand(String family) } /** - * Creates a new DatabaseDelCommand to delete a keytree within a given family. + * Creates a new DatabaseDelCommand to delete a keytree within a given + * family. * * @param family the family of the keytree to delete. * @param keyTree the keytree to delete. @@ -97,7 +100,8 @@ public String getKeyTree() /** * Sets the keytree to delete. * - * @param keyTree the keytree to delete, null to delete the whole family. + * @param keyTree the keytree to delete, null to delete the + * whole family. */ public void setKeyTree(String keyTree) { @@ -105,15 +109,12 @@ public void setKeyTree(String keyTree) } @Override - public String buildCommand() + public String buildCommand() { if (keyTree == null) { return "DATABASE DELTREE " + escapeAndQuote(family) + " " + escapeAndQuote(keyTree); } - else - { - return "DATABASE DELTREE " + escapeAndQuote(family); - } + return "DATABASE DELTREE " + escapeAndQuote(family); } } diff --git a/src/main/java/org/asteriskjava/fastagi/command/GetDataCommand.java b/src/main/java/org/asteriskjava/fastagi/command/GetDataCommand.java index 14c6c62f8..d93a0b5e7 100644 --- a/src/main/java/org/asteriskjava/fastagi/command/GetDataCommand.java +++ b/src/main/java/org/asteriskjava/fastagi/command/GetDataCommand.java @@ -17,9 +17,11 @@ package org.asteriskjava.fastagi.command; /** - * Stream the given file, and recieve DTMF data. The user may interrupt the streaming - * by starting to enter digits.

- * Returns the digits recieved from the channel at the other end.

+ * Stream the given file, and recieve DTMF data. The user may interrupt the + * streaming by starting to enter digits. + *

+ * Returns the digits recieved from the channel at the other end. + *

* Input ends when the timeout is reached, the maximum number of digits is read * or the user presses #. * @@ -36,21 +38,22 @@ public class GetDataCommand extends AbstractAgiCommand private static final int DEFAULT_MAX_DIGITS = 1024; private static final int DEFAULT_TIMEOUT = 0; - /** * The name of the file to stream. */ private String file; /** - * The timeout in milliseconds to wait for data.

+ * The timeout in milliseconds to wait for data. + *

* 0 means standard timeout value, -1 means "ludicrous time" (essentially * never times out). */ private long timeout; /** - * The maximum number of digits to read.

+ * The maximum number of digits to read. + *

* Must be in [1..1024]. */ private int maxDigits; @@ -74,7 +77,8 @@ public GetDataCommand(String file) * 1024. * * @param file the name of the file to stream, must not include extension. - * @param timeout the timeout in milliseconds to wait for data.

+ * @param timeout the timeout in milliseconds to wait for data. + *

* 0 means standard timeout value, -1 means "ludicrous time" * (essentially never times out). */ @@ -90,16 +94,16 @@ public GetDataCommand(String file, long timeout) * Creates a new GetDataCommand with the given timeout and maxDigits. * * @param file the name of the file to stream, must not include extension. - * @param timeout the timeout in milliseconds to wait for data.

+ * @param timeout the timeout in milliseconds to wait for data. + *

* 0 means standard timeout value, -1 means "ludicrous time" * (essentially never times out). - * @param maxDigits the maximum number of digits to read.

+ * @param maxDigits the maximum number of digits to read. + *

* Must be in [1..1024]. - * * @throws IllegalArgumentException if maxDigits is not in [1..1024] */ - public GetDataCommand(String file, long timeout, int maxDigits) - throws IllegalArgumentException + public GetDataCommand(String file, long timeout, int maxDigits) throws IllegalArgumentException { super(); if (maxDigits < 1 || maxDigits > 1024) @@ -123,7 +127,8 @@ public String getFile() } /** - * Sets the name of the file to stream.

+ * Sets the name of the file to stream. + *

* This attribute is mandatory. * * @param file the name of the file to stream, must not include extension. @@ -146,7 +151,8 @@ public long getTimeout() /** * Sets the timeout to wait for data. * - * @param timeout the timeout in milliseconds to wait for data.

+ * @param timeout the timeout in milliseconds to wait for data. + *

* 0 means standard timeout value, -1 means "ludicrous time" * (essentially never times out). */ @@ -168,9 +174,9 @@ public int getMaxDigits() /** * Sets the maximum number of digits to read. * - * @param maxDigits the maximum number of digits to read.

+ * @param maxDigits the maximum number of digits to read. + *

* Must be in [1..1024]. - * * @throws IllegalArgumentException if maxDigits is not in [1..1024] */ public void setMaxDigits(int maxDigits) throws IllegalArgumentException @@ -184,7 +190,7 @@ public void setMaxDigits(int maxDigits) throws IllegalArgumentException } @Override - public String buildCommand() + public String buildCommand() { if (maxDigits == DEFAULT_MAX_DIGITS) { @@ -192,12 +198,8 @@ public String buildCommand() { return "GET DATA " + escapeAndQuote(file); } - else - { - return "GET DATA " + escapeAndQuote(file) + " " + timeout; - } + return "GET DATA " + escapeAndQuote(file) + " " + timeout; } - return "GET DATA " + escapeAndQuote(file) + " " + timeout + " " - + maxDigits; + return "GET DATA " + escapeAndQuote(file) + " " + timeout + " " + maxDigits; } } diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java index af14a6089..aa2a901d5 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiChannelImpl.java @@ -16,8 +16,55 @@ */ package org.asteriskjava.fastagi.internal; -import org.asteriskjava.fastagi.*; -import org.asteriskjava.fastagi.command.*; +import org.asteriskjava.fastagi.AgiChannel; +import org.asteriskjava.fastagi.AgiException; +import org.asteriskjava.fastagi.AgiHangupException; +import org.asteriskjava.fastagi.AgiRequest; +import org.asteriskjava.fastagi.AgiSpeechException; +import org.asteriskjava.fastagi.InvalidCommandSyntaxException; +import org.asteriskjava.fastagi.InvalidOrUnknownCommandException; +import org.asteriskjava.fastagi.SpeechRecognitionResult; +import org.asteriskjava.fastagi.command.AgiCommand; +import org.asteriskjava.fastagi.command.AnswerCommand; +import org.asteriskjava.fastagi.command.ChannelStatusCommand; +import org.asteriskjava.fastagi.command.ControlStreamFileCommand; +import org.asteriskjava.fastagi.command.DatabaseDelCommand; +import org.asteriskjava.fastagi.command.DatabaseDelTreeCommand; +import org.asteriskjava.fastagi.command.DatabaseGetCommand; +import org.asteriskjava.fastagi.command.DatabasePutCommand; +import org.asteriskjava.fastagi.command.ExecCommand; +import org.asteriskjava.fastagi.command.GetDataCommand; +import org.asteriskjava.fastagi.command.GetFullVariableCommand; +import org.asteriskjava.fastagi.command.GetOptionCommand; +import org.asteriskjava.fastagi.command.GetVariableCommand; +import org.asteriskjava.fastagi.command.GosubCommand; +import org.asteriskjava.fastagi.command.HangupCommand; +import org.asteriskjava.fastagi.command.RecordFileCommand; +import org.asteriskjava.fastagi.command.SayAlphaCommand; +import org.asteriskjava.fastagi.command.SayDateTimeCommand; +import org.asteriskjava.fastagi.command.SayDigitsCommand; +import org.asteriskjava.fastagi.command.SayNumberCommand; +import org.asteriskjava.fastagi.command.SayPhoneticCommand; +import org.asteriskjava.fastagi.command.SayTimeCommand; +import org.asteriskjava.fastagi.command.SetAutoHangupCommand; +import org.asteriskjava.fastagi.command.SetCallerIdCommand; +import org.asteriskjava.fastagi.command.SetContextCommand; +import org.asteriskjava.fastagi.command.SetExtensionCommand; +import org.asteriskjava.fastagi.command.SetMusicOffCommand; +import org.asteriskjava.fastagi.command.SetMusicOnCommand; +import org.asteriskjava.fastagi.command.SetPriorityCommand; +import org.asteriskjava.fastagi.command.SetVariableCommand; +import org.asteriskjava.fastagi.command.SpeechActivateGrammarCommand; +import org.asteriskjava.fastagi.command.SpeechCreateCommand; +import org.asteriskjava.fastagi.command.SpeechDeactivateGrammarCommand; +import org.asteriskjava.fastagi.command.SpeechDestroyCommand; +import org.asteriskjava.fastagi.command.SpeechLoadGrammarCommand; +import org.asteriskjava.fastagi.command.SpeechRecognizeCommand; +import org.asteriskjava.fastagi.command.SpeechSetCommand; +import org.asteriskjava.fastagi.command.SpeechUnloadGrammarCommand; +import org.asteriskjava.fastagi.command.StreamFileCommand; +import org.asteriskjava.fastagi.command.VerboseCommand; +import org.asteriskjava.fastagi.command.WaitForDigitCommand; import org.asteriskjava.fastagi.reply.AgiReply; /** @@ -353,7 +400,8 @@ public char recordFile(String file, String format, String escapeDigits, int time return lastReply.getResultCodeAsChar(); } - public char recordFile(String file, String format, String escapeDigits, int timeout, int offset, boolean beep, int maxSilence) throws AgiException + public char recordFile(String file, String format, String escapeDigits, int timeout, int offset, boolean beep, + int maxSilence) throws AgiException { sendCommand(new RecordFileCommand(file, format, escapeDigits, timeout, offset, beep, maxSilence)); return lastReply.getResultCodeAsChar(); @@ -376,7 +424,8 @@ public char controlStreamFile(String file, String escapeDigits, int offset) thro return lastReply.getResultCodeAsChar(); } - public char controlStreamFile(String file, String escapeDigits, int offset, String forwardDigit, String rewindDigit, String pauseDigit) throws AgiException + public char controlStreamFile(String file, String escapeDigits, int offset, String forwardDigit, String rewindDigit, + String pauseDigit) throws AgiException { sendCommand(new ControlStreamFileCommand(file, escapeDigits, offset, forwardDigit, rewindDigit, pauseDigit)); return lastReply.getResultCodeAsChar(); @@ -396,10 +445,7 @@ public void speechCreate(String engine) throws AgiException { throw new AgiSpeechException("Speech object for default engine cannot be created"); } - else - { - throw new AgiSpeechException("Speech object for engine '" + engine + "' cannot be created"); - } + throw new AgiSpeechException("Speech object for engine '" + engine + "' cannot be created"); } } @@ -499,7 +545,9 @@ public void gosub(String context, String extension, String priority, String... a { sendCommand(new GosubCommand(context, extension, priority, arguments)); } - - - public AgiRequest getInternalAgiRequest () { return request;} + + public AgiRequest getInternalAgiRequest() + { + return request; + } } diff --git a/src/main/java/org/asteriskjava/fastagi/internal/AgiRequestImpl.java b/src/main/java/org/asteriskjava/fastagi/internal/AgiRequestImpl.java index a8bd5e060..f748c85ed 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/AgiRequestImpl.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/AgiRequestImpl.java @@ -16,18 +16,23 @@ */ package org.asteriskjava.fastagi.internal; -import org.asteriskjava.fastagi.AgiRequest; -import org.asteriskjava.util.AstUtil; -import org.asteriskjava.util.Log; -import org.asteriskjava.util.LogFactory; - import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.URLDecoder; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.asteriskjava.fastagi.AgiRequest; +import org.asteriskjava.util.AstUtil; +import org.asteriskjava.util.Log; +import org.asteriskjava.util.LogFactory; /** * Default implementation of the AGIRequest interface. @@ -75,7 +80,8 @@ public class AgiRequestImpl implements AgiRequest /** * Creates a new AgiRequestImpl based on a preparsed map of parameters. * - * @param request a map representing the AGI request. Keys must not contain the "agi_" or "ogi_" prefix. + * @param request a map representing the AGI request. Keys must not contain + * the "agi_" or "ogi_" prefix. * @since 1.0.0 */ private AgiRequestImpl(final Map request) @@ -95,12 +101,14 @@ private AgiRequestImpl(final Map request) } /** - * Builds a map containing variable names as key (with the "agi_" or "ogi_" prefix - * stripped) and the corresponding values.

+ * Builds a map containing variable names as key (with the "agi_" or "ogi_" + * prefix stripped) and the corresponding values. + *

* Syntactically invalid and empty variables are skipped. * * @param lines the environment to transform. - * @return a map with the variables set corresponding to the given environment. + * @return a map with the variables set corresponding to the given + * environment. * @throws IllegalArgumentException if lines is null */ private static Map buildMap(final Collection lines) throws IllegalArgumentException @@ -209,7 +217,8 @@ public String getLanguage() return request.get("language"); } - @Deprecated public String getCallerId() + @Deprecated + public String getCallerId() { return getCallerIdNumber(); } @@ -231,11 +240,8 @@ public String getCallerIdNumber() return callerId; } - else - { - // Asterisk 1.0 - return getCallerId10(); - } + // Asterisk 1.0 + return getCallerId10(); } public String getCallerIdName() @@ -253,11 +259,8 @@ public String getCallerIdName() return callerIdName; } - else - { - // Asterisk 1.0 - return getCallerIdName10(); - } + // Asterisk 1.0 + return getCallerIdName10(); } /** @@ -305,29 +308,29 @@ private synchronized String getCallerIdName10() public String getDnid() { String dnid; - + dnid = request.get("dnid"); - + if (dnid == null || "unknown".equals(dnid)) { return null; } - - return dnid; + + return dnid; } public String getRdnis() { String rdnis; - + rdnis = request.get("rdnis"); - + if (rdnis == null || "unknown".equals(rdnis)) { return null; } - - return rdnis; + + return rdnis; } public String getContext() @@ -357,10 +360,7 @@ public Boolean getEnhanced() { return Boolean.TRUE; } - else - { - return Boolean.FALSE; - } + return Boolean.FALSE; } return null; } @@ -393,7 +393,7 @@ public Integer getCallingPres() { return null; } - + try { return Integer.valueOf(request.get("callingpres")); @@ -410,7 +410,7 @@ public Integer getCallingTns() { return null; } - + try { return Integer.valueOf(request.get("callingtns")); @@ -427,7 +427,7 @@ public Integer getCallingTon() { return null; } - + try { return Integer.valueOf(request.get("callington")); @@ -565,7 +565,7 @@ public synchronized String[] getArguments() int maxIndex = 0; for (Map.Entry entry : request.entrySet()) { - if (! entry.getKey().startsWith("arg_")) + if (!entry.getKey().startsWith("arg_")) { continue; } @@ -583,7 +583,7 @@ public synchronized String[] getArguments() { arguments[i] = map.get(i + 1); } - + return arguments.clone(); } @@ -628,7 +628,7 @@ void setRemotePort(int remotePort) } @Override - public String toString() + public String toString() { StringBuffer sb; diff --git a/src/main/java/org/asteriskjava/fastagi/internal/FastAgiReader.java b/src/main/java/org/asteriskjava/fastagi/internal/FastAgiReader.java index 57e4b4f01..746b18f07 100644 --- a/src/main/java/org/asteriskjava/fastagi/internal/FastAgiReader.java +++ b/src/main/java/org/asteriskjava/fastagi/internal/FastAgiReader.java @@ -100,7 +100,7 @@ public AgiReply readReply() throws AgiException } // TODO Asterisk 1.6 sends "HANGUP" when the channel is hung up. - //System.out.println(line); + // System.out.println(line); if (line.startsWith("HANGUP")) { if (line.length() > 6) @@ -140,11 +140,8 @@ public AgiReply readReply() throws AgiException // Special handling for gosub, see AJ-257 if (reply.getStatus() == AgiReply.SC_TRYING) { - return readReply(); - } - else - { - return reply; + return readReply(); } + return reply; } } diff --git a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java index 249483ed3..49c9f78b5 100644 --- a/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java +++ b/src/main/java/org/asteriskjava/live/internal/AsteriskQueueMemberImpl.java @@ -16,11 +16,16 @@ */ package org.asteriskjava.live.internal; -import org.asteriskjava.live.*; -import org.asteriskjava.manager.response.ManagerResponse; -import org.asteriskjava.manager.response.ManagerError; -import org.asteriskjava.manager.action.QueuePenaltyAction; +import org.asteriskjava.live.AsteriskQueue; +import org.asteriskjava.live.AsteriskQueueMember; +import org.asteriskjava.live.InvalidPenaltyException; +import org.asteriskjava.live.ManagerCommunicationException; +import org.asteriskjava.live.NoSuchInterfaceException; +import org.asteriskjava.live.QueueMemberState; import org.asteriskjava.manager.action.QueuePauseAction; +import org.asteriskjava.manager.action.QueuePenaltyAction; +import org.asteriskjava.manager.response.ManagerError; +import org.asteriskjava.manager.response.ManagerResponse; /** * Default implementation of a queue member. @@ -42,19 +47,18 @@ class AsteriskQueueMemberImpl extends AbstractLiveObject implements AsteriskQueu /** * Creates a new queue member. * - * @param server server this channel belongs to. - * @param queue queue this member is registered to. - * @param location location of member. - * @param state state of this member. - * @param paused true if this member is currently paused, false otherwise. - * @param penalty penalty of this member. - * @param membership "dynamic" if the added member is a dynamic queue member, "static" - * if the added member is a static queue member. + * @param server server this channel belongs to. + * @param queue queue this member is registered to. + * @param location location of member. + * @param state state of this member. + * @param paused true if this member is currently paused, + * false otherwise. + * @param penalty penalty of this member. + * @param membership "dynamic" if the added member is a dynamic queue + * member, "static" if the added member is a static queue member. */ - AsteriskQueueMemberImpl(final AsteriskServerImpl server, - final AsteriskQueueImpl queue, String location, - QueueMemberState state, boolean paused, - Integer penalty, String membership) + AsteriskQueueMemberImpl(final AsteriskServerImpl server, final AsteriskQueueImpl queue, String location, + QueueMemberState state, boolean paused, Integer penalty, String membership) { super(server); this.queue = queue; @@ -80,7 +84,8 @@ public QueueMemberState getState() return state; } - @Deprecated public boolean getPaused() + @Deprecated + public boolean getPaused() { return isPaused(); } @@ -106,18 +111,15 @@ private void sendPauseAction(QueuePauseAction action) throws ManagerCommunicatio if (response instanceof ManagerError) { - //Message: Interface not found + // Message: Interface not found if (action.getQueue() != null) { - //Message: Interface not found - throw new NoSuchInterfaceException("Unable to change paused state for '" + action.getInterface() + "' on '" + - action.getQueue() + "': " + response.getMessage()); - } - else - { - throw new NoSuchInterfaceException("Unable to change paused state for '" + action.getInterface() + - "' on all queues: " + response.getMessage()); + // Message: Interface not found + throw new NoSuchInterfaceException("Unable to change paused state for '" + action.getInterface() + "' on '" + + action.getQueue() + "': " + response.getMessage()); } + throw new NoSuchInterfaceException("Unable to change paused state for '" + action.getInterface() + + "' on all queues: " + response.getMessage()); } } @@ -141,19 +143,19 @@ public Integer getPenalty() return penalty; } - public void setPenalty(int penalty) throws IllegalArgumentException, ManagerCommunicationException, InvalidPenaltyException + public void setPenalty(int penalty) + throws IllegalArgumentException, ManagerCommunicationException, InvalidPenaltyException { if (penalty < 0) { throw new IllegalArgumentException("Penalty must not be negative"); } - final ManagerResponse response = server.sendAction( - new QueuePenaltyAction(location, penalty, queue.getName())); + final ManagerResponse response = server.sendAction(new QueuePenaltyAction(location, penalty, queue.getName())); if (response instanceof ManagerError) { - throw new InvalidPenaltyException("Unable to set penalty for '" + location + "' on '" + - queue.getName() + "': " + response.getMessage()); + throw new InvalidPenaltyException( + "Unable to set penalty for '" + location + "' on '" + queue.getName() + "': " + response.getMessage()); } } diff --git a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java index 872f7e98a..4dea3957b 100644 --- a/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java +++ b/src/main/java/org/asteriskjava/live/internal/MeetMeManager.java @@ -16,6 +16,14 @@ */ package org.asteriskjava.live.internal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import org.asteriskjava.live.ManagerCommunicationException; import org.asteriskjava.live.MeetMeRoom; import org.asteriskjava.manager.action.CommandAction; @@ -30,10 +38,6 @@ import org.asteriskjava.util.Log; import org.asteriskjava.util.LogFactory; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - /** * Manages MeetMe events on behalf of an AsteriskServer. * @@ -74,11 +78,8 @@ void initialize() void disconnected() { /* - synchronized (rooms) - { - rooms.clear(); - } - */ + * synchronized (rooms) { rooms.clear(); } + */ } Collection getMeetMeRooms() @@ -147,7 +148,8 @@ void handleMeetMeEvent(AbstractMeetMeEvent event) + " but is user of no room"); } } - // Mmmm should remove from the room before firing PropertyChangeEvents ? + // Mmmm should remove from the room before firing + // PropertyChangeEvents ? user.left(event.getDateReceived()); room.removeUser(user); channel.setMeetMeUserImpl(null); @@ -183,7 +185,13 @@ private void populateRoom(MeetMeRoomImpl room) final CommandAction meetMeListAction; final ManagerResponse response; final List lines; - final Collection userNumbers = new ArrayList(); // list of user numbers in the room + final Collection userNumbers = new ArrayList(); // list + // of + // user + // numbers + // in + // the + // room meetMeListAction = new CommandAction(MEETME_LIST_COMMAND + " " + room.getRoomNumber()); try @@ -270,7 +278,7 @@ else if (channelUser != null && roomUser == null) channelUser.setMuted(muted); room.addUser(channelUser); } - else if (channelUser == null) + else if (channelUser == null && roomUser != null) { roomUser.setMuted(muted); channel.setMeetMeUserImpl(roomUser); diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java index 3f43b0023..63638eeb0 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractChannelEvent.java @@ -47,7 +47,7 @@ public abstract class AbstractChannelEvent extends ManagerEvent /** * The unique id of the channel. */ - private String uniqueId; + protected String uniqueId; protected AbstractChannelEvent(Object source) { @@ -85,13 +85,15 @@ public final void setUniqueId(String uniqueId) } /** - * Returns the Caller*ID of the channel if set or null if none has been set. + * Returns the Caller*ID of the channel if set or null if none + * has been set. * * @return the Caller*ID * @deprecated * @see #getCallerIdNum() */ - @Deprecated public final String getCallerId() + @Deprecated + public final String getCallerId() { return callerIdNum; } @@ -102,13 +104,15 @@ public final void setUniqueId(String uniqueId) * @param callerId the Caller*ID of the channel. * @deprecated */ - @Deprecated public final void setCallerId(String callerId) + @Deprecated + public final void setCallerId(String callerId) { this.callerIdNum = callerId; } /** - * Returns the Caller*ID number of the channel if set or null if none has been set. + * Returns the Caller*ID number of the channel if set or null + * if none has been set. * * @return the Caller*ID number * @since 0.3 @@ -124,7 +128,8 @@ public final void setCallerIdNum(String callerIdNum) } /** - * Returns the Caller*ID Name of the channel if set or null if none has been set. + * Returns the Caller*ID Name of the channel if set or null if + * none has been set. * * @return the Caller*ID Name of the channel. */ diff --git a/src/main/java/org/asteriskjava/manager/event/AbstractRtcpEvent.java b/src/main/java/org/asteriskjava/manager/event/AbstractRtcpEvent.java index b47e39dda..5b52b74da 100644 --- a/src/main/java/org/asteriskjava/manager/event/AbstractRtcpEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/AbstractRtcpEvent.java @@ -20,7 +20,8 @@ import java.net.UnknownHostException; /** - * Abstract base class for RTCP related events.

+ * Abstract base class for RTCP related events. + *

* * @author srt * @version $Id$ @@ -40,8 +41,8 @@ public AbstractRtcpEvent(Object source) } /** - * Returns the short term loss ratio. This is the fraction of packets lost since the last RR - * or SR packet was sent. + * Returns the short term loss ratio. This is the fraction of packets lost + * since the last RR or SR packet was sent. * * @return the short term loss ratio. */ @@ -96,10 +97,7 @@ protected Long secStringToLong(String s) { return Long.parseLong(s.substring(0, s.length() - "(sec)".length())); } - else - { - return Long.parseLong(s); - } + return Long.parseLong(s); } protected Double secStringToDouble(String s) @@ -113,10 +111,7 @@ protected Double secStringToDouble(String s) { return Double.parseDouble(s.substring(0, s.length() - "(sec)".length())); } - else - { - return Double.parseDouble(s); - } + return Double.parseDouble(s); } protected InetAddress stringToAddress(String addressWithPort) @@ -168,4 +163,4 @@ protected Integer stringToPort(String addressWithPort) return Integer.parseInt(port); } -} \ No newline at end of file +} diff --git a/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java b/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java index dc1afd0f4..ae10592b8 100644 --- a/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DAHDIChannelEvent.java @@ -1,57 +1,61 @@ -package org.asteriskjava.manager.event; +package org.asteriskjava.manager.event; /** - * * @author Sebastian */ -public class DAHDIChannelEvent extends ManagerEvent { +public class DAHDIChannelEvent extends ManagerEvent +{ + private static final long serialVersionUID = 1L; private String dahdichannel; private String dahdispan; private String uniqueid; private String channel; - - public String getDahdichannel() { + public String getDahdichannel() + { return dahdichannel; } - public void setDahdichannel(String dahdichannel) { + public void setDahdichannel(String dahdichannel) + { this.dahdichannel = dahdichannel; } - public String getDahdispan() { + public String getDahdispan() + { return dahdispan; } - public void setDahdispan(String dahdispan) { + public void setDahdispan(String dahdispan) + { this.dahdispan = dahdispan; } - public String getUniqueid() { + public String getUniqueid() + { return uniqueid; } - public void setUniqueid(String uniqueid) { + public void setUniqueid(String uniqueid) + { this.uniqueid = uniqueid; } - public String getChannel() { + public String getChannel() + { return channel; } - public void setChannel(String channel) { + public void setChannel(String channel) + { this.channel = channel; } - - - - - public DAHDIChannelEvent(Object source) + + public DAHDIChannelEvent(Object source) { super(source); } - - + } diff --git a/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java b/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java index c1ee863fe..79c7227df 100644 --- a/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DongleDeviceEntryEvent.java @@ -1,10 +1,10 @@ package org.asteriskjava.manager.event; - public class DongleDeviceEntryEvent extends ResponseEvent { - + + private static final long serialVersionUID = 1L; private String Device; private String AudioSetting; private String DataSetting; @@ -28,7 +28,7 @@ public class DongleDeviceEntryEvent extends ResponseEvent private String MinimalDTMFGap; private String MinimalDTMFDuration; private String MinimalDTMFInterval; - + private String State; private String AudioState; private String DataState; @@ -64,477 +64,590 @@ public class DongleDeviceEntryEvent extends ResponseEvent private String Waiting; private String Releasing; private String Initializing; - - - public DongleDeviceEntryEvent(Object source) + + public DongleDeviceEntryEvent(Object source) { super(source); } - public String getDevice() { + public String getDevice() + { return Device; } - public void setDevice(String Device) { + public void setDevice(String Device) + { this.Device = Device; } - public String getAudioSetting() { + public String getAudioSetting() + { return AudioSetting; } - public void setAudioSetting(String AudioSetting) { + public void setAudioSetting(String AudioSetting) + { this.AudioSetting = AudioSetting; } - public String getDataSetting() { + public String getDataSetting() + { return DataSetting; } - public void setDataSetting(String DataSetting) { + public void setDataSetting(String DataSetting) + { this.DataSetting = DataSetting; } - public String getIMEISetting() { + public String getIMEISetting() + { return IMEISetting; } - public void setIMEISetting(String IMEISetting) { + public void setIMEISetting(String IMEISetting) + { this.IMEISetting = IMEISetting; } - public String getIMSISetting() { + public String getIMSISetting() + { return IMSISetting; } - public void setIMSISetting(String IMSISetting) { + public void setIMSISetting(String IMSISetting) + { this.IMSISetting = IMSISetting; } - public String getChannelLanguage() { + public String getChannelLanguage() + { return ChannelLanguage; } - public void setChannelLanguage(String ChannelLanguage) { + public void setChannelLanguage(String ChannelLanguage) + { this.ChannelLanguage = ChannelLanguage; } - public String getContext() { + public String getContext() + { return Context; } - public void setContext(String Context) { + public void setContext(String Context) + { this.Context = Context; } - public String getExten() { + public String getExten() + { return Exten; } - public void setExten(String Exten) { + public void setExten(String Exten) + { this.Exten = Exten; } - public String getGroup() { + public String getGroup() + { return Group; } - public void setGroup(String Group) { + public void setGroup(String Group) + { this.Group = Group; } - public String getRXGain() { + public String getRXGain() + { return RXGain; } - public void setRXGain(String RXGain) { + public void setRXGain(String RXGain) + { this.RXGain = RXGain; } - public String getTXGain() { + public String getTXGain() + { return TXGain; } - public void setTXGain(String TXGain) { + public void setTXGain(String TXGain) + { this.TXGain = TXGain; } - public String getU2DIAG() { + public String getU2DIAG() + { return U2DIAG; } - public void setU2DIAG(String U2DIAG) { + public void setU2DIAG(String U2DIAG) + { this.U2DIAG = U2DIAG; } - public String getUseCallingPres() { + public String getUseCallingPres() + { return UseCallingPres; } - public void setUseCallingPres(String UseCallingPres) { + public void setUseCallingPres(String UseCallingPres) + { this.UseCallingPres = UseCallingPres; } - public String getDefaultCallingPres() { + public String getDefaultCallingPres() + { return DefaultCallingPres; } - public void setDefaultCallingPres(String DefaultCallingPres) { + public void setDefaultCallingPres(String DefaultCallingPres) + { this.DefaultCallingPres = DefaultCallingPres; } - public String getAutoDeleteSMS() { + public String getAutoDeleteSMS() + { return AutoDeleteSMS; } - public void setAutoDeleteSMS(String AutoDeleteSMS) { + public void setAutoDeleteSMS(String AutoDeleteSMS) + { this.AutoDeleteSMS = AutoDeleteSMS; } - public String getDisableSMS() { + public String getDisableSMS() + { return DisableSMS; } - public void setDisableSMS(String DisableSMS) { + public void setDisableSMS(String DisableSMS) + { this.DisableSMS = DisableSMS; } - public String getResetDongle() { + public String getResetDongle() + { return ResetDongle; } - public void setResetDongle(String ResetDongle) { + public void setResetDongle(String ResetDongle) + { this.ResetDongle = ResetDongle; } - public String getSMSPDU() { + public String getSMSPDU() + { return SMSPDU; } - public void setSMSPDU(String SMSPDU) { + public void setSMSPDU(String SMSPDU) + { this.SMSPDU = SMSPDU; } - public String getCallWaitingSetting() { + public String getCallWaitingSetting() + { return CallWaitingSetting; } - public void setCallWaitingSetting(String CallWaitingSetting) { + public void setCallWaitingSetting(String CallWaitingSetting) + { this.CallWaitingSetting = CallWaitingSetting; } - public String getDTMF() { + public String getDTMF() + { return DTMF; } - public void setDTMF(String DTMF) { + public void setDTMF(String DTMF) + { this.DTMF = DTMF; } - public String getMinimalDTMFGap() { + public String getMinimalDTMFGap() + { return MinimalDTMFGap; } - public void setMinimalDTMFGap(String MinimalDTMFGap) { + public void setMinimalDTMFGap(String MinimalDTMFGap) + { this.MinimalDTMFGap = MinimalDTMFGap; } - public String getMinimalDTMFDuration() { + public String getMinimalDTMFDuration() + { return MinimalDTMFDuration; } - public void setMinimalDTMFDuration(String MinimalDTMFDuration) { + public void setMinimalDTMFDuration(String MinimalDTMFDuration) + { this.MinimalDTMFDuration = MinimalDTMFDuration; } - public String getMinimalDTMFInterval() { + public String getMinimalDTMFInterval() + { return MinimalDTMFInterval; } - public void setMinimalDTMFInterval(String MinimalDTMFInterval) { + public void setMinimalDTMFInterval(String MinimalDTMFInterval) + { this.MinimalDTMFInterval = MinimalDTMFInterval; } - public String getState() { + public String getState() + { return State; } - public void setState(String State) { + public void setState(String State) + { this.State = State; } - public String getAudioState() { + public String getAudioState() + { return AudioState; } - public void setAudioState(String AudioState) { + public void setAudioState(String AudioState) + { this.AudioState = AudioState; } - public String getDataState() { + public String getDataState() + { return DataState; } - public void setDataState(String DataState) { + public void setDataState(String DataState) + { this.DataState = DataState; } - public String getVoice() { + public String getVoice() + { return Voice; } - public void setVoice(String Voice) { + public void setVoice(String Voice) + { this.Voice = Voice; } - public String getSMS() { + public String getSMS() + { return SMS; } - public void setSMS(String SMS) { + public void setSMS(String SMS) + { this.SMS = SMS; } - public String getManufacturer() { + public String getManufacturer() + { return Manufacturer; } - public void setManufacturer(String Manufacturer) { + public void setManufacturer(String Manufacturer) + { this.Manufacturer = Manufacturer; } - public String getModel() { + public String getModel() + { return Model; } - public void setModel(String Model) { + public void setModel(String Model) + { this.Model = Model; } - public String getFirmware() { + public String getFirmware() + { return Firmware; } - public void setFirmware(String Firmware) { + public void setFirmware(String Firmware) + { this.Firmware = Firmware; } - public String getIMEIState() { + public String getIMEIState() + { return IMEIState; } - public void setIMEIState(String IMEIState) { + public void setIMEIState(String IMEIState) + { this.IMEIState = IMEIState; } - public String getGSMRegistrationStatus() { + public String getGSMRegistrationStatus() + { return GSMRegistrationStatus; } - public void setGSMRegistrationStatus(String GSMRegistrationStatus) { + public void setGSMRegistrationStatus(String GSMRegistrationStatus) + { this.GSMRegistrationStatus = GSMRegistrationStatus; } - public String getRSSI() { + public String getRSSI() + { return RSSI; } - public void setRSSI(String RSSI) { + public void setRSSI(String RSSI) + { this.RSSI = RSSI; } - public String getMode() { + public String getMode() + { return Mode; } - public void setMode(String Mode) { + public void setMode(String Mode) + { this.Mode = Mode; } - public String getSubmode() { + public String getSubmode() + { return Submode; } - public void setSubmode(String Submode) { + public void setSubmode(String Submode) + { this.Submode = Submode; } - public String getProviderName() { + public String getProviderName() + { return ProviderName; } - public void setProviderName(String ProviderName) { + public void setProviderName(String ProviderName) + { this.ProviderName = ProviderName; } - public String getLocationAreaCode() { + public String getLocationAreaCode() + { return LocationAreaCode; } - public void setLocationAreaCode(String LocationAreaCode) { + public void setLocationAreaCode(String LocationAreaCode) + { this.LocationAreaCode = LocationAreaCode; } - public String getCellID() { + public String getCellID() + { return CellID; } - public void setCellID(String CellID) { + public void setCellID(String CellID) + { this.CellID = CellID; } - public String getSubscriberNumber() { + public String getSubscriberNumber() + { return SubscriberNumber; } - public void setSubscriberNumber(String SubscriberNumber) { + public void setSubscriberNumber(String SubscriberNumber) + { this.SubscriberNumber = SubscriberNumber; } - public String getSMSServiceCenter() { + public String getSMSServiceCenter() + { return SMSServiceCenter; } - public void setSMSServiceCenter(String SMSServiceCenter) { + public void setSMSServiceCenter(String SMSServiceCenter) + { this.SMSServiceCenter = SMSServiceCenter; } - public String getUseUCS2Encoding() { + public String getUseUCS2Encoding() + { return UseUCS2Encoding; } - public void setUseUCS2Encoding(String UseUCS2Encoding) { + public void setUseUCS2Encoding(String UseUCS2Encoding) + { this.UseUCS2Encoding = UseUCS2Encoding; } - public String getUSSDUse7BitEncoding() { + public String getUSSDUse7BitEncoding() + { return USSDUse7BitEncoding; } - public void setUSSDUse7BitEncoding(String USSDUse7BitEncoding) { + public void setUSSDUse7BitEncoding(String USSDUse7BitEncoding) + { this.USSDUse7BitEncoding = USSDUse7BitEncoding; } - public String getUSSDUseUCS2Decoding() { + public String getUSSDUseUCS2Decoding() + { return USSDUseUCS2Decoding; } - public void setUSSDUseUCS2Decoding(String USSDUseUCS2Decoding) { + public void setUSSDUseUCS2Decoding(String USSDUseUCS2Decoding) + { this.USSDUseUCS2Decoding = USSDUseUCS2Decoding; } - public String getTasksInQueue() { + public String getTasksInQueue() + { return TasksInQueue; } - public void setTasksInQueue(String TasksInQueue) { + public void setTasksInQueue(String TasksInQueue) + { this.TasksInQueue = TasksInQueue; } - public String getCommandsInQueue() { + public String getCommandsInQueue() + { return CommandsInQueue; } - public void setCommandsInQueue(String CommandsInQueue) { + public void setCommandsInQueue(String CommandsInQueue) + { this.CommandsInQueue = CommandsInQueue; } - public String getCallWaitingState() { + public String getCallWaitingState() + { return CallWaitingState; } - public void setCallWaitingState(String CallWaitingState) { + public void setCallWaitingState(String CallWaitingState) + { this.CallWaitingState = CallWaitingState; } - public String getCurrentDeviceState() { + public String getCurrentDeviceState() + { return CurrentDeviceState; } - public void setCurrentDeviceState(String CurrentDeviceState) { + public void setCurrentDeviceState(String CurrentDeviceState) + { this.CurrentDeviceState = CurrentDeviceState; } - public String getDesiredDeviceState() { + public String getDesiredDeviceState() + { return DesiredDeviceState; } - public void setDesiredDeviceState(String DesiredDeviceState) { + public void setDesiredDeviceState(String DesiredDeviceState) + { this.DesiredDeviceState = DesiredDeviceState; } - public String getCallsChannels() { + public String getCallsChannels() + { return CallsChannels; } - public void setCallsChannels(String CallsChannels) { + public void setCallsChannels(String CallsChannels) + { this.CallsChannels = CallsChannels; } - public String getActive() { + public String getActive() + { return Active; } - public void setActive(String Active) { + public void setActive(String Active) + { this.Active = Active; } - public String getHeld() { + public String getHeld() + { return Held; } - public void setHeld(String Held) { + public void setHeld(String Held) + { this.Held = Held; } - public String getDialing() { + public String getDialing() + { return Dialing; } - public void setDialing(String Dialing) { + public void setDialing(String Dialing) + { this.Dialing = Dialing; } - public String getAlerting() { + public String getAlerting() + { return Alerting; } - public void setAlerting(String Alerting) { + public void setAlerting(String Alerting) + { this.Alerting = Alerting; } - public String getIncoming() { + public String getIncoming() + { return Incoming; } - public void setIncoming(String Incoming) { + public void setIncoming(String Incoming) + { this.Incoming = Incoming; } - public String getWaiting() { + public String getWaiting() + { return Waiting; } - public void setWaiting(String Waiting) { + public void setWaiting(String Waiting) + { this.Waiting = Waiting; } - public String getReleasing() { + public String getReleasing() + { return Releasing; } - public void setReleasing(String Releasing) { + public void setReleasing(String Releasing) + { this.Releasing = Releasing; } - public String getInitializing() { + public String getInitializing() + { return Initializing; } - public void setInitializing(String Initializing) { + public void setInitializing(String Initializing) + { this.Initializing = Initializing; } - - - + } diff --git a/src/main/java/org/asteriskjava/manager/event/DongleNewCMGREvent.java b/src/main/java/org/asteriskjava/manager/event/DongleNewCMGREvent.java index 4db959e6a..6f58b2d70 100644 --- a/src/main/java/org/asteriskjava/manager/event/DongleNewCMGREvent.java +++ b/src/main/java/org/asteriskjava/manager/event/DongleNewCMGREvent.java @@ -2,29 +2,22 @@ public class DongleNewCMGREvent extends ManagerEvent { - private static final long serialVersionUID = 3257845467831284784L; - private String device; - private String message; + private static final long serialVersionUID = 3257845467831284784L; + private String device; - - + public DongleNewCMGREvent(Object source) + { + super(source); + } - public DongleNewCMGREvent(Object source) - { - super(source); - } + public String getDevice() + { + return this.device; + } - public String getDevice() { - return this.device; - } + public void setDevice(String device) + { + this.device = device; + } - public void setDevice(String device) { - this.device = device; - } - - - - - - -} \ No newline at end of file +} diff --git a/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java b/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java index 3cf3a3daf..8e0e10e21 100644 --- a/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/HangupRequestEvent.java @@ -17,7 +17,8 @@ package org.asteriskjava.manager.event; /** - * A HangupEvent is triggered when a channel is requested hung up.

+ * A HangupEvent is triggered when a channel is requested hung up. + *

* It is implemented in channel.c */ public class HangupRequestEvent extends AbstractChannelEvent @@ -27,22 +28,9 @@ public class HangupRequestEvent extends AbstractChannelEvent */ static final long serialVersionUID = 0L; - - private String uniqueid; - - public HangupRequestEvent(Object source) { super(source); } - - public String getUniqueid() { - return uniqueid; - } - - public void setUniqueid(String uniqueid) { - this.uniqueid = uniqueid; - } - } diff --git a/src/main/java/org/asteriskjava/manager/event/SoftHangupRequestEvent.java b/src/main/java/org/asteriskjava/manager/event/SoftHangupRequestEvent.java index 0af16ccbb..ed936fb93 100644 --- a/src/main/java/org/asteriskjava/manager/event/SoftHangupRequestEvent.java +++ b/src/main/java/org/asteriskjava/manager/event/SoftHangupRequestEvent.java @@ -17,7 +17,8 @@ package org.asteriskjava.manager.event; /** - * A HangupEvent is triggered when a channel is hung up.

+ * A HangupEvent is triggered when a channel is hung up. + *

* It is implemented in channel.c */ public class SoftHangupRequestEvent extends AbstractChannelEvent @@ -28,7 +29,6 @@ public class SoftHangupRequestEvent extends AbstractChannelEvent static final long serialVersionUID = 0L; private Integer cause; - private String uniqueid; public SoftHangupRequestEvent(Object source) { @@ -56,17 +56,4 @@ public void setCause(Integer cause) this.cause = cause; } - - public String getUniqueid() { - return uniqueid; - } - - public void setUniqueid(String uniqueid) { - this.uniqueid = uniqueid; - } - - - - - } diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java index 971659867..58d3485da 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerConnectionImpl.java @@ -25,8 +25,8 @@ import java.io.IOException; import java.io.Serializable; -import java.net.Socket; import java.net.InetAddress; +import java.net.Socket; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -38,13 +38,22 @@ import java.util.regex.Pattern; import org.asteriskjava.AsteriskVersion; -import org.asteriskjava.manager.*; +import org.asteriskjava.manager.AuthenticationFailedException; +import org.asteriskjava.manager.EventTimeoutException; +import org.asteriskjava.manager.ExpectedResponse; +import org.asteriskjava.manager.ManagerConnection; +import org.asteriskjava.manager.ManagerConnectionState; +import org.asteriskjava.manager.ManagerEventListener; +import org.asteriskjava.manager.ResponseEvents; +import org.asteriskjava.manager.SendActionCallback; +import org.asteriskjava.manager.TimeoutException; import org.asteriskjava.manager.action.ChallengeAction; import org.asteriskjava.manager.action.CommandAction; import org.asteriskjava.manager.action.EventGeneratingAction; import org.asteriskjava.manager.action.LoginAction; import org.asteriskjava.manager.action.LogoffAction; import org.asteriskjava.manager.action.ManagerAction; +import org.asteriskjava.manager.action.UserEventAction; import org.asteriskjava.manager.event.ConnectEvent; import org.asteriskjava.manager.event.DisconnectEvent; import org.asteriskjava.manager.event.ManagerEvent; @@ -59,7 +68,6 @@ import org.asteriskjava.util.LogFactory; import org.asteriskjava.util.SocketConnectionFacade; import org.asteriskjava.util.internal.SocketConnectionFacadeImpl; -import org.asteriskjava.manager.action.UserEventAction; /** * Internal implemention of the ManagerConnection interface. @@ -70,1636 +78,1584 @@ */ public class ManagerConnectionImpl implements ManagerConnection, Dispatcher { - private static final int RECONNECTION_INTERVAL_1 = 50; - private static final int RECONNECTION_INTERVAL_2 = 5000; - private static final String DEFAULT_HOSTNAME = "localhost"; - private static final int DEFAULT_PORT = 5038; - private static final int RECONNECTION_VERSION_INTERVAL = 500; - private static final int MAX_VERSION_ATTEMPTS = 4; - private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); + private static final int RECONNECTION_INTERVAL_1 = 50; + private static final int RECONNECTION_INTERVAL_2 = 5000; + private static final String DEFAULT_HOSTNAME = "localhost"; + private static final int DEFAULT_PORT = 5038; + private static final int RECONNECTION_VERSION_INTERVAL = 500; + private static final int MAX_VERSION_ATTEMPTS = 4; + private static final Pattern SHOW_VERSION_PATTERN = Pattern.compile("^(core )?show version.*"); private static final Pattern VERSION_PATTERN_1_6 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.6[-. ].*"); private static final Pattern VERSION_PATTERN_1_8 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?1\\.8[-. ].*"); - private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); - private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); - - private static final AtomicLong idCounter = new AtomicLong(0); - - /** - * Instance logger. - */ - private final Log logger = LogFactory.getLog(getClass()); - - private final long id; - - /** - * Used to construct the internalActionId. - */ - private AtomicLong actionIdCounter = new AtomicLong(0); - - /* Config attributes */ - /** - * Hostname of the Asterisk server to connect to. - */ - private String hostname = DEFAULT_HOSTNAME; - - /** - * TCP port to connect to. - */ - private int port = DEFAULT_PORT; - - /** -<<<<<<< HEAD - * true to use SSL for the connection, false - * for a plain text connection. -======= - * true to use SSL for the connection, false for a - * plain text connection. ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - private boolean ssl = false; - - /** - * The username to use for login as defined in Asterisk's - * manager.conf. - */ - protected String username; - - /** - * The password to use for login as defined in Asterisk's - * manager.conf. - */ - protected String password; - - /** - * The default timeout to wait for a ManagerResponse after sending a - * ManagerAction. - */ - private long defaultResponseTimeout = 2000; - - /** - * The default timeout to wait for the last ResponseEvent after sending an - * EventGeneratingAction. - */ - private long defaultEventTimeout = 5000; - - /** - * The timeout to use when connecting the the Asterisk server. - */ - private int socketTimeout = 0; - - /** -<<<<<<< HEAD - * Closes the connection (and reconnects) if no input has been read for the given amount - * of milliseconds. A timeout of zero is interpreted as an infinite timeout. -======= - * Closes the connection (and reconnects) if no input has been read for the - * given amount of milliseconds. A timeout of zero is interpreted as an - * infinite timeout. ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * - * @see Socket#setSoTimeout(int) - */ - private int socketReadTimeout = 0; - - /** -<<<<<<< HEAD - * true to continue to reconnect after an authentication failure. -======= - * true to continue to reconnect after an authentication - * failure. ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - private boolean keepAliveAfterAuthenticationFailure = true; - - /** - * The socket to use for TCP/IP communication with Asterisk. - */ - private SocketConnectionFacade socket; - - /** - * The thread that runs the reader. - */ - private Thread readerThread; - private final AtomicLong readerThreadCounter = new AtomicLong(0); - - private final AtomicLong reconnectThreadCounter = new AtomicLong(0); - - /** - * The reader to use to receive events and responses from asterisk. - */ - private ManagerReader reader; - - /** - * The writer to use to send actions to asterisk. - */ - private ManagerWriter writer; - - /** - * The protocol identifer Asterisk sends on connect wrapped into an object - * to be used as mutex. - */ - private final ProtocolIdentifierWrapper protocolIdentifier; - - /** - * The version of the Asterisk server we are connected to. - */ - private AsteriskVersion version; - - /** - * Contains the registered handlers that process the ManagerResponses. -<<<<<<< HEAD - *
-======= - *

->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * Key is the internalActionId of the Action sent and value the - * corresponding ResponseListener. - */ - private final Map responseListeners; - - /** - * Contains the event handlers that handle ResponseEvents for the - * sendEventGeneratingAction methods. -<<<<<<< HEAD - *
-======= - *

->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * Key is the internalActionId of the Action sent and value the - * corresponding EventHandler. - */ - private final Map responseEventListeners; - - /** - * Contains the event handlers that users registered. - */ - private final List eventListeners; - - protected ManagerConnectionState state = INITIAL; - - private String eventMask; - - /** - * Creates a new instance. - */ - public ManagerConnectionImpl() - { - this.id = idCounter.getAndIncrement(); - this.responseListeners = new HashMap(); - this.responseEventListeners = new HashMap(); - this.eventListeners = new ArrayList(); - this.protocolIdentifier = new ProtocolIdentifierWrapper(); - } - - // the following two methods can be overriden when running test cases to - // return a mock object - protected ManagerReader createReader(Dispatcher dispatcher, Object source) - { - return new ManagerReaderImpl(dispatcher, source); - } - - protected ManagerWriter createWriter() - { - return new ManagerWriterImpl(); - } - - /** - * Sets the hostname of the asterisk server to connect to. -<<<<<<< HEAD - *
- * Default is localhost. - * - * @param hostname the hostname to connect to -======= - *

- * Default is localhost. - * - * @param hostname - * the hostname to connect to ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - public void setHostname(String hostname) - { - this.hostname = hostname; - } - - /** - * Sets the port to use to connect to the asterisk server. This is the port - * specified in asterisk's manager.conf file. -<<<<<<< HEAD - *
- * Default is 5038. - * - * @param port the port to connect to -======= - *

- * Default is 5038. - * - * @param port - * the port to connect to ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - public void setPort(int port) - { - if (port <= 0) - { - this.port = DEFAULT_PORT; - } - else - { - this.port = port; - } - } - - /** - * Sets whether to use SSL. -<<<<<<< HEAD - *
- * Default is false. - * - * @param ssl true to use SSL for the connection, -======= - *

- * Default is false. - * - * @param ssl - * true to use SSL for the connection, ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * false for a plain text connection. - * @since 0.3 - */ - public void setSsl(boolean ssl) - { - this.ssl = ssl; - } - - /** - * Sets the username to use to connect to the asterisk server. This is the - * username specified in asterisk's manager.conf file. - * -<<<<<<< HEAD - * @param username the username to use for login -======= - * @param username - * the username to use for login ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - public void setUsername(String username) - { - this.username = username; - } - - /** - * Sets the password to use to connect to the asterisk server. This is the - * password specified in Asterisk's manager.conf file. - * -<<<<<<< HEAD - * @param password the password to use for login -======= - * @param password - * the password to use for login ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - public void setPassword(String password) - { - this.password = password; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendAction(ManagerAction)} will wait for a response before - * throwing a TimeoutException. -<<<<<<< HEAD - *
- * Default is 2000. - * + private static final Pattern VERSION_PATTERN_10 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?10[-. ].*"); + private static final Pattern VERSION_PATTERN_11 = Pattern.compile("^\\s*Asterisk (SVN-branch-)?11[-. ].*"); + + private static final AtomicLong idCounter = new AtomicLong(0); + + /** + * Instance logger. + */ + private final Log logger = LogFactory.getLog(getClass()); + + private final long id; + + /** + * Used to construct the internalActionId. + */ + private AtomicLong actionIdCounter = new AtomicLong(0); + + /* Config attributes */ + /** + * Hostname of the Asterisk server to connect to. + */ + private String hostname = DEFAULT_HOSTNAME; + + /** + * TCP port to connect to. + */ + private int port = DEFAULT_PORT; + + /** + * <<<<<<< HEAD true to use SSL for the connection, + * false for a plain text connection. ======= true + * to use SSL for the connection, false for a plain text + * connection. >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + private boolean ssl = false; + + /** + * The username to use for login as defined in Asterisk's + * manager.conf. + */ + protected String username; + + /** + * The password to use for login as defined in Asterisk's + * manager.conf. + */ + protected String password; + + /** + * The default timeout to wait for a ManagerResponse after sending a + * ManagerAction. + */ + private long defaultResponseTimeout = 2000; + + /** + * The default timeout to wait for the last ResponseEvent after sending an + * EventGeneratingAction. + */ + private long defaultEventTimeout = 5000; + + /** + * The timeout to use when connecting the the Asterisk server. + */ + private int socketTimeout = 0; + + /** + * <<<<<<< HEAD Closes the connection (and reconnects) if no input has been + * read for the given amount of milliseconds. A timeout of zero is + * interpreted as an infinite timeout. ======= Closes the connection (and + * reconnects) if no input has been read for the given amount of + * milliseconds. A timeout of zero is interpreted as an infinite timeout. + * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 + * + * @see Socket#setSoTimeout(int) + */ + private int socketReadTimeout = 0; + + /** + * <<<<<<< HEAD true to continue to reconnect after an + * authentication failure. ======= true to continue to + * reconnect after an authentication failure. >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + private boolean keepAliveAfterAuthenticationFailure = true; + + /** + * The socket to use for TCP/IP communication with Asterisk. + */ + private SocketConnectionFacade socket; + + /** + * The thread that runs the reader. + */ + private Thread readerThread; + private final AtomicLong readerThreadCounter = new AtomicLong(0); + + private final AtomicLong reconnectThreadCounter = new AtomicLong(0); + + /** + * The reader to use to receive events and responses from asterisk. + */ + private ManagerReader reader; + + /** + * The writer to use to send actions to asterisk. + */ + private ManagerWriter writer; + + /** + * The protocol identifer Asterisk sends on connect wrapped into an object + * to be used as mutex. + */ + private final ProtocolIdentifierWrapper protocolIdentifier; + + /** + * The version of the Asterisk server we are connected to. + */ + private AsteriskVersion version; + + /** + * Contains the registered handlers that process the ManagerResponses. + * <<<<<<< HEAD
+ * ======= + *

+ * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 Key is the + * internalActionId of the Action sent and value the corresponding + * ResponseListener. + */ + private final Map responseListeners; + + /** + * Contains the event handlers that handle ResponseEvents for the + * sendEventGeneratingAction methods. <<<<<<< HEAD
+ * ======= + *

+ * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 Key is the + * internalActionId of the Action sent and value the corresponding + * EventHandler. + */ + private final Map responseEventListeners; + + /** + * Contains the event handlers that users registered. + */ + private final List eventListeners; + + protected ManagerConnectionState state = INITIAL; + + private String eventMask; + + /** + * Creates a new instance. + */ + public ManagerConnectionImpl() + { + this.id = idCounter.getAndIncrement(); + this.responseListeners = new HashMap(); + this.responseEventListeners = new HashMap(); + this.eventListeners = new ArrayList(); + this.protocolIdentifier = new ProtocolIdentifierWrapper(); + } + + // the following two methods can be overriden when running test cases to + // return a mock object + protected ManagerReader createReader(Dispatcher dispatcher, Object source) + { + return new ManagerReaderImpl(dispatcher, source); + } + + protected ManagerWriter createWriter() + { + return new ManagerWriterImpl(); + } + + /** + * Sets the hostname of the asterisk server to connect to. <<<<<<< HEAD
+ * Default is localhost. + * + * @param hostname the hostname to connect to ======= + *

+ * Default is localhost. + * @param hostname the hostname to connect to >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + public void setHostname(String hostname) + { + this.hostname = hostname; + } + + /** + * Sets the port to use to connect to the asterisk server. This is the port + * specified in asterisk's manager.conf file. <<<<<<< HEAD
+ * Default is 5038. + * + * @param port the port to connect to ======= + *

+ * Default is 5038. + * @param port the port to connect to >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + public void setPort(int port) + { + if (port <= 0) + { + this.port = DEFAULT_PORT; + } + else + { + this.port = port; + } + } + + /** + * Sets whether to use SSL. <<<<<<< HEAD
+ * Default is false. + * + * @param ssl true to use SSL for the connection, ======= + *

+ * Default is false. + * @param ssl true to use SSL for the connection, >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 false + * for a plain text connection. + * @since 0.3 + */ + public void setSsl(boolean ssl) + { + this.ssl = ssl; + } + + /** + * Sets the username to use to connect to the asterisk server. This is the + * username specified in asterisk's manager.conf file. <<<<<<< + * HEAD + * + * @param username the username to use for login ======= + * @param username the username to use for login >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + public void setUsername(String username) + { + this.username = username; + } + + /** + * Sets the password to use to connect to the asterisk server. This is the + * password specified in Asterisk's manager.conf file. <<<<<<< + * HEAD + * + * @param password the password to use for login ======= + * @param password the password to use for login >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + public void setPassword(String password) + { + this.password = password; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendAction(ManagerAction)} will wait for a response before + * throwing a TimeoutException. <<<<<<< HEAD
+ * Default is 2000. + * * @param defaultResponseTimeout default response timeout in milliseconds -======= - *

- * Default is 2000. - * - * @param defaultResponseTimeout - * default response timeout in milliseconds ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * @since 0.2 - */ - public void setDefaultResponseTimeout(long defaultResponseTimeout) - { - this.defaultResponseTimeout = defaultResponseTimeout; - } - - /** - * Sets the time in milliseconds the synchronous method - * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a - * response and the last response event before throwing a TimeoutException. -<<<<<<< HEAD - *
- * Default is 5000. - * - * @param defaultEventTimeout default event timeout in milliseconds -======= - *

- * Default is 5000. - * - * @param defaultEventTimeout - * default event timeout in milliseconds ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * @since 0.2 - */ - public void setDefaultEventTimeout(long defaultEventTimeout) - { - this.defaultEventTimeout = defaultEventTimeout; - } - - /** -<<<<<<< HEAD - * Set to true to try reconnecting to ther asterisk serve - * even if the reconnection attempt threw an AuthenticationFailedException. - *
-======= - * Set to true to try reconnecting to ther asterisk serve even - * if the reconnection attempt threw an AuthenticationFailedException. - *

->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * Default is true. - * - * @param keepAliveAfterAuthenticationFailure - * true to try reconnecting to ther asterisk serve -<<<<<<< HEAD - * even if the reconnection attempt threw an AuthenticationFailedException, - * false otherwise. -======= - * even if the reconnection attempt threw an - * AuthenticationFailedException, false otherwise. ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) - { - this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; - } - - /* Implementation of ManagerConnection interface */ - - public String getUsername() - { - return username; - } - - public String getPassword() - { - return password; - } - - public AsteriskVersion getVersion() - { - return version; - } - - public String getHostname() - { - return hostname; - } - - public int getPort() - { - return port; - } - - public boolean isSsl() - { - return ssl; - } - - public InetAddress getLocalAddress() - { - return socket.getLocalAddress(); - } - - public int getLocalPort() - { - return socket.getLocalPort(); - } - - public InetAddress getRemoteAddress() - { - return socket.getRemoteAddress(); - } - - public int getRemotePort() - { - return socket.getRemotePort(); - } - - public void registerUserEventClass(Class userEventClass) - { - if (reader == null) - { - reader = createReader(this, this); - } - - reader.registerEventClass(userEventClass); - } - - public void setSocketTimeout(int socketTimeout) - { - this.socketTimeout = socketTimeout; - } - - public void setSocketReadTimeout(int socketReadTimeout) - { - this.socketReadTimeout = socketReadTimeout; - } - - public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException - { - login(null); - } + * ======= + *

+ * Default is 2000. + * @param defaultResponseTimeout default response timeout in milliseconds + * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 + * @since 0.2 + */ + public void setDefaultResponseTimeout(long defaultResponseTimeout) + { + this.defaultResponseTimeout = defaultResponseTimeout; + } + + /** + * Sets the time in milliseconds the synchronous method + * {@link #sendEventGeneratingAction(EventGeneratingAction)} will wait for a + * response and the last response event before throwing a TimeoutException. + * <<<<<<< HEAD
+ * Default is 5000. + * + * @param defaultEventTimeout default event timeout in milliseconds ======= + *

+ * Default is 5000. + * @param defaultEventTimeout default event timeout in milliseconds >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + * @since 0.2 + */ + public void setDefaultEventTimeout(long defaultEventTimeout) + { + this.defaultEventTimeout = defaultEventTimeout; + } + + /** + * <<<<<<< HEAD Set to true to try reconnecting to ther + * asterisk serve even if the reconnection attempt threw an + * AuthenticationFailedException.
+ * ======= Set to true to try reconnecting to ther asterisk + * serve even if the reconnection attempt threw an + * AuthenticationFailedException. + *

+ * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 Default is + * true. + * + * @param keepAliveAfterAuthenticationFailure true to try + * reconnecting to ther asterisk serve <<<<<<< HEAD even if the + * reconnection attempt threw an AuthenticationFailedException, + * false otherwise. ======= even if the reconnection + * attempt threw an AuthenticationFailedException, + * false otherwise. >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + public void setKeepAliveAfterAuthenticationFailure(boolean keepAliveAfterAuthenticationFailure) + { + this.keepAliveAfterAuthenticationFailure = keepAliveAfterAuthenticationFailure; + } + + /* Implementation of ManagerConnection interface */ + + public String getUsername() + { + return username; + } + + public String getPassword() + { + return password; + } + + public AsteriskVersion getVersion() + { + return version; + } + + public String getHostname() + { + return hostname; + } + + public int getPort() + { + return port; + } + + public boolean isSsl() + { + return ssl; + } + + public InetAddress getLocalAddress() + { + return socket.getLocalAddress(); + } + + public int getLocalPort() + { + return socket.getLocalPort(); + } + + public InetAddress getRemoteAddress() + { + return socket.getRemoteAddress(); + } + + public int getRemotePort() + { + return socket.getRemotePort(); + } + + public void registerUserEventClass(Class< ? extends ManagerEvent> userEventClass) + { + if (reader == null) + { + reader = createReader(this, this); + } + + reader.registerEventClass(userEventClass); + } + + public void setSocketTimeout(int socketTimeout) + { + this.socketTimeout = socketTimeout; + } + + public void setSocketReadTimeout(int socketReadTimeout) + { + this.socketReadTimeout = socketReadTimeout; + } + + public synchronized void login() throws IOException, AuthenticationFailedException, TimeoutException + { + login(null); + } public synchronized void login(String eventMask) throws IOException, AuthenticationFailedException, TimeoutException - { - if (state != INITIAL && state != DISCONNECTED) - { - throw new IllegalStateException("Login may only be perfomed when in state " - + "INITIAL or DISCONNECTED, but connection is in state " + state); - } - - state = CONNECTING; - this.eventMask = eventMask; - try - { - doLogin(defaultResponseTimeout, eventMask); - } - finally - { - if (state != CONNECTED) - { - state = DISCONNECTED; - } - } - } - - /** - * Does the real login, following the steps outlined below. -<<<<<<< HEAD + { + if (state != INITIAL && state != DISCONNECTED) + { + throw new IllegalStateException("Login may only be perfomed when in state " + + "INITIAL or DISCONNECTED, but connection is in state " + state); + } + + state = CONNECTING; + this.eventMask = eventMask; + try + { + doLogin(defaultResponseTimeout, eventMask); + } + finally + { + if (state != CONNECTED) + { + state = DISCONNECTED; + } + } + } + + /** + * Does the real login, following the steps outlined below. <<<<<<< HEAD *
-======= - *

->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - *

    - *
  1. Connects to the asterisk server by calling {@link #connect()} if not - * already connected - *
  2. Waits until the protocol identifier is received but not longer than - * timeout ms. - *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType - * MD5. - *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} - * is sent using the calculated key (MD5 hash of the password appended to - * the received challenge). - *
- * - - * @param timeout the maximum time to wait for the protocol identifier (in - * ms) + * ======= + *

+ * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 + *

    + *
  1. Connects to the asterisk server by calling {@link #connect()} if not + * already connected + *
  2. Waits until the protocol identifier is received but not longer than + * timeout ms. + *
  3. Sends a {@link ChallengeAction} requesting a challenge for authType + * MD5. + *
  4. When the {@link ChallengeResponse} is received a {@link LoginAction} + * is sent using the calculated key (MD5 hash of the password appended to + * the received challenge). + *
+ * + * @param timeout the maximum time to wait for the protocol identifier (in + * ms) * @param eventMask the event mask. Set to "on" if all events should be - * send, "off" if not events should be sent or a combination of - * "system", "call" and "log" (separated by ',') to specify what - * kind of events should be sent. - * @throws IOException if there is an i/o problem. + * send, "off" if not events should be sent or a combination of + * "system", "call" and "log" (separated by ',') to specify what + * kind of events should be sent. + * @throws IOException if there is an i/o problem. * @throws AuthenticationFailedException if username or password are - * incorrect and the login action returns an error or if the MD5 - * hash cannot be computed. The connection is closed in this - * case. - * @throws TimeoutException if a timeout occurs while waiting for the - * protocol identifier. The connection is closed in this case. - */ - protected synchronized void doLogin(long timeout, String eventMask) throws IOException, AuthenticationFailedException, - TimeoutException - { - ChallengeAction challengeAction; - ManagerResponse challengeResponse; - String challenge; - String key; - LoginAction loginAction; - ManagerResponse loginResponse; - - if (socket == null) - { - connect(); - } - - synchronized (protocolIdentifier) - { - if (protocolIdentifier.value == null) - { - try - { - protocolIdentifier.wait(timeout); - } - catch (InterruptedException e) // NOPMD - { - Thread.currentThread().interrupt(); - } - } - - if (protocolIdentifier.value == null) - { - disconnect(); - if (reader != null && reader.getTerminationException() != null) - { - throw reader.getTerminationException(); - } - else - { - throw new TimeoutException("Timeout waiting for protocol identifier"); - } - } - } - - challengeAction = new ChallengeAction("MD5"); - try - { - challengeResponse = sendAction(challengeAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send challenge action", e); - } - - if (challengeResponse instanceof ChallengeResponse) - { - challenge = ((ChallengeResponse) challengeResponse).getChallenge(); - } - else - { - disconnect(); - throw new AuthenticationFailedException("Unable to get challenge from Asterisk. ChallengeAction returned: " - + challengeResponse.getMessage()); - } - - try - { - MessageDigest md; - - md = MessageDigest.getInstance("MD5"); - if (challenge != null) - { - md.update(challenge.getBytes()); - } - if (password != null) - { - md.update(password.getBytes()); - } - key = ManagerUtil.toHexString(md.digest()); - } - catch (NoSuchAlgorithmException ex) - { - disconnect(); - throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); - } - - loginAction = new LoginAction(username, "MD5", key, eventMask); - try - { - loginResponse = sendAction(loginAction); - } - catch (Exception e) - { - disconnect(); - throw new AuthenticationFailedException("Unable to send login action", e); - } - - if (loginResponse instanceof ManagerError) - { - disconnect(); - throw new AuthenticationFailedException(loginResponse.getMessage()); - } - - logger.info("Successfully logged in"); - - version = determineVersion(); - - state = CONNECTED; - - writer.setTargetVersion(version); - - logger.info("Determined Asterisk version: " + version); - - // generate pseudo event indicating a successful login - ConnectEvent connectEvent = new ConnectEvent(this); - connectEvent.setProtocolIdentifier(getProtocolIdentifier()); - connectEvent.setDateReceived(DateUtil.getDate()); - // TODO could this cause a deadlock? - fireEvent(connectEvent); - } - - protected AsteriskVersion determineVersion() throws IOException, TimeoutException - { - int attempts = 0; - - // if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) - // { - // return AsteriskVersion.ASTERISK_1_6; - // } - - while (attempts++ < MAX_VERSION_ATTEMPTS) - { - final ManagerResponse showVersionFilesResponse; - final List showVersionFilesResult; - - // increase timeout as output is quite large + * incorrect and the login action returns an error or if the MD5 + * hash cannot be computed. The connection is closed in this + * case. + * @throws TimeoutException if a timeout occurs while waiting for the + * protocol identifier. The connection is closed in this case. + */ + protected synchronized void doLogin(long timeout, String eventMask) + throws IOException, AuthenticationFailedException, TimeoutException + { + ChallengeAction challengeAction; + ManagerResponse challengeResponse; + String challenge; + String key; + LoginAction loginAction; + ManagerResponse loginResponse; + + if (socket == null) + { + connect(); + } + + synchronized (protocolIdentifier) + { + if (protocolIdentifier.value == null) + { + try + { + protocolIdentifier.wait(timeout); + } + catch (InterruptedException e) // NOPMD + { + Thread.currentThread().interrupt(); + } + } + + if (protocolIdentifier.value == null) + { + disconnect(); + if (reader != null && reader.getTerminationException() != null) + { + throw reader.getTerminationException(); + } + throw new TimeoutException("Timeout waiting for protocol identifier"); + } + } + + challengeAction = new ChallengeAction("MD5"); + try + { + challengeResponse = sendAction(challengeAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send challenge action", e); + } + + if (challengeResponse instanceof ChallengeResponse) + { + challenge = ((ChallengeResponse) challengeResponse).getChallenge(); + } + else + { + disconnect(); + throw new AuthenticationFailedException( + "Unable to get challenge from Asterisk. ChallengeAction returned: " + challengeResponse.getMessage()); + } + + try + { + MessageDigest md; + + md = MessageDigest.getInstance("MD5"); + if (challenge != null) + { + md.update(challenge.getBytes()); + } + if (password != null) + { + md.update(password.getBytes()); + } + key = ManagerUtil.toHexString(md.digest()); + } + catch (NoSuchAlgorithmException ex) + { + disconnect(); + throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); + } + + loginAction = new LoginAction(username, "MD5", key, eventMask); + try + { + loginResponse = sendAction(loginAction); + } + catch (Exception e) + { + disconnect(); + throw new AuthenticationFailedException("Unable to send login action", e); + } + + if (loginResponse instanceof ManagerError) + { + disconnect(); + throw new AuthenticationFailedException(loginResponse.getMessage()); + } + + logger.info("Successfully logged in"); + + version = determineVersion(); + + state = CONNECTED; + + writer.setTargetVersion(version); + + logger.info("Determined Asterisk version: " + version); + + // generate pseudo event indicating a successful login + ConnectEvent connectEvent = new ConnectEvent(this); + connectEvent.setProtocolIdentifier(getProtocolIdentifier()); + connectEvent.setDateReceived(DateUtil.getDate()); + // TODO could this cause a deadlock? + fireEvent(connectEvent); + } + + protected AsteriskVersion determineVersion() throws IOException, TimeoutException + { + int attempts = 0; + + // if ("Asterisk Call Manager/1.1".equals(protocolIdentifier.value)) + // { + // return AsteriskVersion.ASTERISK_1_6; + // } + + while (attempts++ < MAX_VERSION_ATTEMPTS) + { + final ManagerResponse showVersionFilesResponse; + final List showVersionFilesResult; + + // increase timeout as output is quite large showVersionFilesResponse = sendAction(new CommandAction("show version files pbx.c"), defaultResponseTimeout * 2); - if (!(showVersionFilesResponse instanceof CommandResponse)) - { - // return early in case of permission problems - // org.asteriskjava.manager.response.ManagerError: - // actionId='null'; message='Permission denied'; response='Error'; - // uniqueId='null'; systemHashcode=15231583 - break; - } - - showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); - if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) - { + if (!(showVersionFilesResponse instanceof CommandResponse)) + { + // return early in case of permission problems + // org.asteriskjava.manager.response.ManagerError: + // actionId='null'; message='Permission denied'; + // response='Error'; + // uniqueId='null'; systemHashcode=15231583 + break; + } + + showVersionFilesResult = ((CommandResponse) showVersionFilesResponse).getResult(); + if (showVersionFilesResult != null && showVersionFilesResult.size() > 0) + { final String line1 = showVersionFilesResult.get(0); if (line1 != null && line1.startsWith("File")) - { - final String rawVersion; - - rawVersion = getRawVersion(); - if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) - { - return AsteriskVersion.ASTERISK_1_4; - } - return AsteriskVersion.ASTERISK_1_2; - } - else if (line1 != null && line1.contains("No such command")) - { - - final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction("core show version"), defaultResponseTimeout * 2); - - if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) - { + { + final String rawVersion; + + rawVersion = getRawVersion(); + if (rawVersion != null && rawVersion.startsWith("Asterisk 1.4")) + { + return AsteriskVersion.ASTERISK_1_4; + } + return AsteriskVersion.ASTERISK_1_2; + } + else if (line1 != null && line1.contains("No such command")) + { + + final ManagerResponse coreShowVersionResponse = sendAction(new CommandAction("core show version"), + defaultResponseTimeout * 2); + + if (coreShowVersionResponse != null && coreShowVersionResponse instanceof CommandResponse) + { final List coreShowVersionResult = ((CommandResponse) coreShowVersionResponse).getResult(); - if (coreShowVersionResult != null && coreShowVersionResult.size() > 0) - { - final String coreLine = coreShowVersionResult.get(0); - - if (coreLine != null) - { - if (VERSION_PATTERN_1_6.matcher(coreLine).matches()) - { - return AsteriskVersion.ASTERISK_1_6; - } - else if (VERSION_PATTERN_1_8.matcher(coreLine).matches()) - { - return AsteriskVersion.ASTERISK_1_8; - } - else if (VERSION_PATTERN_10.matcher(coreLine).matches()) - { - return AsteriskVersion.ASTERISK_10; - } - else if (VERSION_PATTERN_11.matcher(coreLine).matches()) - { - return AsteriskVersion.ASTERISK_11; - } - } - } - } - - try - { - Thread.sleep(RECONNECTION_VERSION_INTERVAL); - } - catch (Exception ex) - { - // ingnore - } // NOPMD - } - else - { - // if it isn't the "no such command", break and return the lowest version immediately - break; - } - } - } - - // as a fallback assume 1.6 - return AsteriskVersion.ASTERISK_1_6; - } - - protected String getRawVersion() - { - final ManagerResponse showVersionResponse; - - try - { - showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); - } - catch (Exception e) - { - return null; - } - - if (showVersionResponse instanceof CommandResponse) - { - final List showVersionResult; - - showVersionResult = ((CommandResponse) showVersionResponse).getResult(); - if (showVersionResult != null && showVersionResult.size() > 0) - { - return showVersionResult.get(0); - } - } - - return null; - } - - protected synchronized void connect() throws IOException - { - logger.info("Connecting to " + hostname + ":" + port); - - if (reader == null) - { - logger.debug("Creating reader for " + hostname + ":" + port); - reader = createReader(this, this); - } - - if (writer == null) - { - logger.debug("Creating writer"); - writer = createWriter(); - } - - logger.debug("Creating socket"); - socket = createSocket(); - - logger.debug("Passing socket to reader"); - reader.setSocket(socket); - - if (readerThread == null || !readerThread.isAlive() || reader.isDead()) - { - logger.debug("Creating and starting reader thread"); - readerThread = new Thread(reader); - readerThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" - + readerThreadCounter.getAndIncrement()); - readerThread.setDaemon(true); - readerThread.start(); - } - - logger.debug("Passing socket to writer"); - writer.setSocket(socket); - } - - protected SocketConnectionFacade createSocket() throws IOException - { - return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); - } - - public synchronized void logoff() throws IllegalStateException - { - if (state != CONNECTED && state != RECONNECTING) - { - throw new IllegalStateException("Logoff may only be perfomed when in state " - + "CONNECTED or RECONNECTING, but connection is in state " + state); - } - - state = DISCONNECTING; - - if (socket != null) - { - try - { - sendAction(new LogoffAction()); - } - catch (Exception e) - { - logger.warn("Unable to send LogOff action", e); - } - } - cleanup(); - state = DISCONNECTED; - } - - /** - * Closes the socket connection. - */ - protected synchronized void disconnect() - { - if (socket != null) - { - logger.info("Closing socket."); - try - { - socket.close(); - } - catch (IOException ex) - { - logger.warn("Unable to close socket: " + ex.getMessage()); - } - socket = null; - } - protocolIdentifier.value = null; - } - - public ManagerResponse sendAction(ManagerAction action) throws IOException, TimeoutException, IllegalArgumentException, - IllegalStateException - { - return sendAction(action, defaultResponseTimeout); - } - - /* - * Implements synchronous sending of "simple" actions. - */ - public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException, - IllegalArgumentException, IllegalStateException - { - ResponseHandlerResult result; - SendActionCallback callbackHandler; - - result = new ResponseHandlerResult(); - callbackHandler = new DefaultSendActionCallback(result); - - synchronized (result) - { - sendAction(action, callbackHandler); - - // definitely return null for the response of user events - if (action instanceof UserEventAction) - { - return null; - } - - // only wait if we did not yet receive the response. - // Responses may be returned really fast. - if (result.getResponse() == null) - { - try - { - result.wait(timeout); - } - catch (InterruptedException ex) - { - logger.warn("Interrupted while waiting for result"); - Thread.currentThread().interrupt(); - } - } - } - - // still no response? - if (result.getResponse() == null) - { - throw new TimeoutException("Timeout waiting for response to " + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); - } - - return result.getResponse(); - } - - public void sendAction(ManagerAction action, SendActionCallback callback) throws IOException, IllegalArgumentException, - IllegalStateException - { - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - - // In general sending actions is only allowed while connected, though - // there are a few exceptions, these are handled here: - if ((state == CONNECTING || state == RECONNECTING) - && (action instanceof ChallengeAction || action instanceof LoginAction || isShowVersionCommandAction(action))) - { - // when (re-)connecting challenge and login actions are ok. - } // NOPMD - else if (state == DISCONNECTING && action instanceof LogoffAction) - { - // when disconnecting logoff action is ok. - } // NOPMD - else if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED, but connection is in state " + state); - } - - if (socket == null) - { - throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); - } - - internalActionId = createInternalActionId(); - - // if the callbackHandler is null the user is obviously not interested - // in the response, thats fine. - if (callback != null) - { - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, callback); - } - } - - Class responseClass = getExpectedResponseClass(action.getClass()); - if (responseClass != null) - { - reader.expectResponseClass(internalActionId, responseClass); - } - - writer.sendAction(action, internalActionId); - } - - boolean isShowVersionCommandAction(ManagerAction action) - { - if (! (action instanceof CommandAction)) { - return false; - } - final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction) action).getCommand()); - return showVersionMatcher.matches(); - } - - private Class getExpectedResponseClass(Class actionClass) - { - final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); - if (annotation == null) - { - return null; - } - - return annotation.value(); - } - - public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) throws IOException, EventTimeoutException, - IllegalArgumentException, IllegalStateException - { - return sendEventGeneratingAction(action, defaultEventTimeout); - } - - /* - * Implements synchronous sending of event generating actions. - */ - public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) throws IOException, - EventTimeoutException, IllegalArgumentException, IllegalStateException - { - final ResponseEventsImpl responseEvents; - final ResponseEventHandler responseEventHandler; - final String internalActionId; - - if (action == null) - { - throw new IllegalArgumentException("Unable to send action: action is null."); - } - else if (action.getActionCompleteEventClass() == null) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass for " - + action.getClass().getName() + " is null."); - } - else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) - { - throw new IllegalArgumentException("Unable to send action: actionCompleteEventClass (" - + action.getActionCompleteEventClass().getName() + ") for " + action.getClass().getName() - + " is not a ResponseEvent."); - } - - if (state != CONNECTED) - { - throw new IllegalStateException("Actions may only be sent when in state " - + "CONNECTED but connection is in state " + state); - } - - responseEvents = new ResponseEventsImpl(); - responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); - - internalActionId = createInternalActionId(); - - try - { - // register response handler... - synchronized (this.responseListeners) - { - this.responseListeners.put(internalActionId, responseEventHandler); - } - - // ...and event handler. - synchronized (this.responseEventListeners) - { - this.responseEventListeners.put(internalActionId, responseEventHandler); - } - - synchronized (responseEvents) - { - writer.sendAction(action, internalActionId); - // only wait if response has not yet arrived. - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - try - { - responseEvents.wait(timeout); - } - catch (InterruptedException e) - { - logger.warn("Interrupted while waiting for response events."); - Thread.currentThread().interrupt(); - } - } - } - - // still no response or not all events received and timed out? - if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) - { - throw new EventTimeoutException("Timeout waiting for response or response events to " - + action.getAction() - + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), - responseEvents); - } - - } - finally - { - // remove the event handler - synchronized (this.responseEventListeners) - { - this.responseEventListeners.remove(internalActionId); - } - - - // Note: The response handler should have already been removed - // when the response was received, however we remove it here - // just in case it was never received. - synchronized (this.responseListeners) - { - this.responseListeners.remove(internalActionId); - } - - } - - return responseEvents; - } - - /** - * Creates a new unique internal action id based on the hash code of this - * connection and a sequence. - * - * @return a new internal action id - * @see ManagerUtil#addInternalActionId(String,String) - * @see ManagerUtil#getInternalActionId(String) - * @see ManagerUtil#stripInternalActionId(String) - */ - private String createInternalActionId() - { - final StringBuffer sb; - - sb = new StringBuffer(); - sb.append(this.hashCode()); - sb.append("_"); - sb.append(actionIdCounter.getAndIncrement()); - - return sb.toString(); - } - - public void addEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - // only add it if its not already there - if (!this.eventListeners.contains(listener)) - { - this.eventListeners.add(listener); - } - } - } - - public void removeEventListener(final ManagerEventListener listener) - { - synchronized (this.eventListeners) - { - if (this.eventListeners.contains(listener)) - { - this.eventListeners.remove(listener); - } - } - } - - public String getProtocolIdentifier() - { - return protocolIdentifier.value; - } - - public ManagerConnectionState getState() - { - return state; - } - - /* Implementation of Dispatcher: callbacks for ManagerReader */ - - /** - * This method is called by the reader whenever a {@link ManagerResponse} is - * received. The response is dispatched to the associated - * {@link SendActionCallback}. - * -<<<<<<< HEAD - * @param response the response received by the reader -======= - * @param response - * the response received by the reader ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * @see ManagerReader - */ - public void dispatchResponse(ManagerResponse response) - { - final String actionId; - String internalActionId; - SendActionCallback listener; - - // shouldn't happen - if (response == null) - { - logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); - return; - } - - actionId = response.getActionId(); - internalActionId = null; - listener = null; - - if (actionId != null) - { - internalActionId = ManagerUtil.getInternalActionId(actionId); - response.setActionId(ManagerUtil.stripInternalActionId(actionId)); - } - - logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); - - if (internalActionId != null) - { - synchronized (this.responseListeners) - { - listener = responseListeners.get(internalActionId); - if (listener != null) - { - this.responseListeners.remove(internalActionId); - } - else - { - // when using the async sendAction it's ok not to register a - // callback so if we don't find a response handler thats ok - logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); - } - } - } - else - { - logger.error("Unable to retrieve internalActionId from response: " + "actionId '" + actionId + "':\n" + response); - } - - if (listener != null) - { - try - { - listener.onResponse(response); - } - catch (Exception e) - { - logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); - } - } - } - - /** - * This method is called by the reader whenever a ManagerEvent is received. - * The event is dispatched to all registered ManagerEventHandlers. - * + if (coreShowVersionResult != null && coreShowVersionResult.size() > 0) + { + final String coreLine = coreShowVersionResult.get(0); + + if (coreLine != null) + { + if (VERSION_PATTERN_1_6.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_1_6; + } + else if (VERSION_PATTERN_1_8.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_1_8; + } + else if (VERSION_PATTERN_10.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_10; + } + else if (VERSION_PATTERN_11.matcher(coreLine).matches()) + { + return AsteriskVersion.ASTERISK_11; + } + } + } + } + + try + { + Thread.sleep(RECONNECTION_VERSION_INTERVAL); + } + catch (Exception ex) + { + // ingnore + } // NOPMD + } + else + { + // if it isn't the "no such command", break and return the + // lowest version immediately + break; + } + } + } + + // as a fallback assume 1.6 + return AsteriskVersion.ASTERISK_1_6; + } + + protected String getRawVersion() + { + final ManagerResponse showVersionResponse; + + try + { + showVersionResponse = sendAction(new CommandAction("show version"), defaultResponseTimeout * 2); + } + catch (Exception e) + { + return null; + } + + if (showVersionResponse instanceof CommandResponse) + { + final List showVersionResult; + + showVersionResult = ((CommandResponse) showVersionResponse).getResult(); + if (showVersionResult != null && showVersionResult.size() > 0) + { + return showVersionResult.get(0); + } + } + + return null; + } + + protected synchronized void connect() throws IOException + { + logger.info("Connecting to " + hostname + ":" + port); + + if (reader == null) + { + logger.debug("Creating reader for " + hostname + ":" + port); + reader = createReader(this, this); + } + + if (writer == null) + { + logger.debug("Creating writer"); + writer = createWriter(); + } + + logger.debug("Creating socket"); + socket = createSocket(); + + logger.debug("Passing socket to reader"); + reader.setSocket(socket); + + if (readerThread == null || !readerThread.isAlive() || reader.isDead()) + { + logger.debug("Creating and starting reader thread"); + readerThread = new Thread(reader); + readerThread + .setName("Asterisk-Java ManagerConnection-" + id + "-Reader-" + readerThreadCounter.getAndIncrement()); + readerThread.setDaemon(true); + readerThread.start(); + } + + logger.debug("Passing socket to writer"); + writer.setSocket(socket); + } + + protected SocketConnectionFacade createSocket() throws IOException + { + return new SocketConnectionFacadeImpl(hostname, port, ssl, socketTimeout, socketReadTimeout); + } + + public synchronized void logoff() throws IllegalStateException + { + if (state != CONNECTED && state != RECONNECTING) + { + throw new IllegalStateException("Logoff may only be perfomed when in state " + + "CONNECTED or RECONNECTING, but connection is in state " + state); + } + + state = DISCONNECTING; + + if (socket != null) + { + try + { + sendAction(new LogoffAction()); + } + catch (Exception e) + { + logger.warn("Unable to send LogOff action", e); + } + } + cleanup(); + state = DISCONNECTED; + } + + /** + * Closes the socket connection. + */ + protected synchronized void disconnect() + { + if (socket != null) + { + logger.info("Closing socket."); + try + { + socket.close(); + } + catch (IOException ex) + { + logger.warn("Unable to close socket: " + ex.getMessage()); + } + socket = null; + } + protocolIdentifier.value = null; + } + + public ManagerResponse sendAction(ManagerAction action) + throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException + { + return sendAction(action, defaultResponseTimeout); + } + + /* + * Implements synchronous sending of "simple" actions. + */ + public ManagerResponse sendAction(ManagerAction action, long timeout) + throws IOException, TimeoutException, IllegalArgumentException, IllegalStateException + { + ResponseHandlerResult result; + SendActionCallback callbackHandler; + + result = new ResponseHandlerResult(); + callbackHandler = new DefaultSendActionCallback(result); + + synchronized (result) + { + sendAction(action, callbackHandler); + + // definitely return null for the response of user events + if (action instanceof UserEventAction) + { + return null; + } + + // only wait if we did not yet receive the response. + // Responses may be returned really fast. + if (result.getResponse() == null) + { + try + { + result.wait(timeout); + } + catch (InterruptedException ex) + { + logger.warn("Interrupted while waiting for result"); + Thread.currentThread().interrupt(); + } + } + } + + // still no response? + if (result.getResponse() == null) + { + throw new TimeoutException("Timeout waiting for response to " + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")")); + } + + return result.getResponse(); + } + + public void sendAction(ManagerAction action, SendActionCallback callback) + throws IOException, IllegalArgumentException, IllegalStateException + { + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + + // In general sending actions is only allowed while connected, though + // there are a few exceptions, these are handled here: + if ((state == CONNECTING || state == RECONNECTING) && (action instanceof ChallengeAction + || action instanceof LoginAction || isShowVersionCommandAction(action))) + { + // when (re-)connecting challenge and login actions are ok. + } // NOPMD + else if (state == DISCONNECTING && action instanceof LogoffAction) + { + // when disconnecting logoff action is ok. + } // NOPMD + else if (state != CONNECTED) + { + throw new IllegalStateException( + "Actions may only be sent when in state " + "CONNECTED, but connection is in state " + state); + } + + if (socket == null) + { + throw new IllegalStateException("Unable to send " + action.getAction() + " action: socket not connected."); + } + + internalActionId = createInternalActionId(); + + // if the callbackHandler is null the user is obviously not interested + // in the response, thats fine. + if (callback != null) + { + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, callback); + } + } + + Class< ? extends ManagerResponse> responseClass = getExpectedResponseClass(action.getClass()); + if (responseClass != null) + { + reader.expectResponseClass(internalActionId, responseClass); + } + + writer.sendAction(action, internalActionId); + } + + boolean isShowVersionCommandAction(ManagerAction action) + { + if (!(action instanceof CommandAction)) + { + return false; + } + final Matcher showVersionMatcher = SHOW_VERSION_PATTERN.matcher(((CommandAction) action).getCommand()); + return showVersionMatcher.matches(); + } + + private Class< ? extends ManagerResponse> getExpectedResponseClass(Class< ? extends ManagerAction> actionClass) + { + final ExpectedResponse annotation = actionClass.getAnnotation(ExpectedResponse.class); + if (annotation == null) + { + return null; + } + + return annotation.value(); + } + + public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action) + throws IOException, EventTimeoutException, IllegalArgumentException, IllegalStateException + { + return sendEventGeneratingAction(action, defaultEventTimeout); + } + + /* + * Implements synchronous sending of event generating actions. + */ + public ResponseEvents sendEventGeneratingAction(EventGeneratingAction action, long timeout) + throws IOException, EventTimeoutException, IllegalArgumentException, IllegalStateException + { + final ResponseEventsImpl responseEvents; + final ResponseEventHandler responseEventHandler; + final String internalActionId; + + if (action == null) + { + throw new IllegalArgumentException("Unable to send action: action is null."); + } + else if (action.getActionCompleteEventClass() == null) + { + throw new IllegalArgumentException( + "Unable to send action: actionCompleteEventClass for " + action.getClass().getName() + " is null."); + } + else if (!ResponseEvent.class.isAssignableFrom(action.getActionCompleteEventClass())) + { + throw new IllegalArgumentException( + "Unable to send action: actionCompleteEventClass (" + action.getActionCompleteEventClass().getName() + + ") for " + action.getClass().getName() + " is not a ResponseEvent."); + } + + if (state != CONNECTED) + { + throw new IllegalStateException( + "Actions may only be sent when in state " + "CONNECTED but connection is in state " + state); + } + + responseEvents = new ResponseEventsImpl(); + responseEventHandler = new ResponseEventHandler(responseEvents, action.getActionCompleteEventClass()); + + internalActionId = createInternalActionId(); + + try + { + // register response handler... + synchronized (this.responseListeners) + { + this.responseListeners.put(internalActionId, responseEventHandler); + } + + // ...and event handler. + synchronized (this.responseEventListeners) + { + this.responseEventListeners.put(internalActionId, responseEventHandler); + } + + synchronized (responseEvents) + { + writer.sendAction(action, internalActionId); + // only wait if response has not yet arrived. + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + try + { + responseEvents.wait(timeout); + } + catch (InterruptedException e) + { + logger.warn("Interrupted while waiting for response events."); + Thread.currentThread().interrupt(); + } + } + } + + // still no response or not all events received and timed out? + if ((responseEvents.getResponse() == null || !responseEvents.isComplete())) + { + throw new EventTimeoutException( + "Timeout waiting for response or response events to " + action.getAction() + + (action.getActionId() == null ? "" : " (actionId: " + action.getActionId() + ")"), + responseEvents); + } + + } + finally + { + // remove the event handler + synchronized (this.responseEventListeners) + { + this.responseEventListeners.remove(internalActionId); + } + + // Note: The response handler should have already been removed + // when the response was received, however we remove it here + // just in case it was never received. + synchronized (this.responseListeners) + { + this.responseListeners.remove(internalActionId); + } + + } + + return responseEvents; + } + + /** + * Creates a new unique internal action id based on the hash code of this + * connection and a sequence. + * + * @return a new internal action id + * @see ManagerUtil#addInternalActionId(String,String) + * @see ManagerUtil#getInternalActionId(String) + * @see ManagerUtil#stripInternalActionId(String) + */ + private String createInternalActionId() + { + final StringBuffer sb; + + sb = new StringBuffer(); + sb.append(this.hashCode()); + sb.append("_"); + sb.append(actionIdCounter.getAndIncrement()); + + return sb.toString(); + } + + public void addEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + // only add it if its not already there + if (!this.eventListeners.contains(listener)) + { + this.eventListeners.add(listener); + } + } + } + + public void removeEventListener(final ManagerEventListener listener) + { + synchronized (this.eventListeners) + { + if (this.eventListeners.contains(listener)) + { + this.eventListeners.remove(listener); + } + } + } + + public String getProtocolIdentifier() + { + return protocolIdentifier.value; + } + + public ManagerConnectionState getState() + { + return state; + } + + /* Implementation of Dispatcher: callbacks for ManagerReader */ + + /** + * This method is called by the reader whenever a {@link ManagerResponse} is + * received. The response is dispatched to the associated + * {@link SendActionCallback}. <<<<<<< HEAD + * + * @param response the response received by the reader ======= + * @param response the response received by the reader >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + * @see ManagerReader + */ + public void dispatchResponse(ManagerResponse response) + { + final String actionId; + String internalActionId; + SendActionCallback listener; + + // shouldn't happen + if (response == null) + { + logger.error("Unable to dispatch null response. This should never happen. Please file a bug."); + return; + } + + actionId = response.getActionId(); + internalActionId = null; + listener = null; + + if (actionId != null) + { + internalActionId = ManagerUtil.getInternalActionId(actionId); + response.setActionId(ManagerUtil.stripInternalActionId(actionId)); + } + + logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); + + if (internalActionId != null) + { + synchronized (this.responseListeners) + { + listener = responseListeners.get(internalActionId); + if (listener != null) + { + this.responseListeners.remove(internalActionId); + } + else + { + // when using the async sendAction it's ok not to register a + // callback so if we don't find a response handler thats ok + logger.debug("No response listener registered for " + "internalActionId '" + internalActionId + "'"); + } + } + } + else + { + logger.error( + "Unable to retrieve internalActionId from response: " + "actionId '" + actionId + "':\n" + response); + } + + if (listener != null) + { + try + { + listener.onResponse(response); + } + catch (Exception e) + { + logger.warn("Unexpected exception in response listener " + listener.getClass().getName(), e); + } + } + } + + /** + * This method is called by the reader whenever a ManagerEvent is received. + * The event is dispatched to all registered ManagerEventHandlers. + * * @param event the event received by the reader - * @see #addEventListener(ManagerEventListener) - * @see #removeEventListener(ManagerEventListener) - * @see ManagerReader - */ - public void dispatchEvent(ManagerEvent event) - { - // shouldn't happen - if (event == null) - { - logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); - return; - } - - logger.debug("Dispatching event:\n" + event.toString()); - - // Some events need special treatment besides forwarding them to the - // registered eventListeners (clients) - // These events are handled here at first: - - // Dispatch ResponseEvents to the appropriate responseEventListener - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - String internalActionId; - - responseEvent = (ResponseEvent) event; - internalActionId = responseEvent.getInternalActionId(); - if (internalActionId != null) - { - synchronized (responseEventListeners) - { - ManagerEventListener listener; - - listener = responseEventListeners.get(internalActionId); - if (listener != null) - { - try - { - listener.onManagerEvent(event); - } - catch (Exception e) - { + * @see #addEventListener(ManagerEventListener) + * @see #removeEventListener(ManagerEventListener) + * @see ManagerReader + */ + public void dispatchEvent(ManagerEvent event) + { + // shouldn't happen + if (event == null) + { + logger.error("Unable to dispatch null event. This should never happen. Please file a bug."); + return; + } + + logger.debug("Dispatching event:\n" + event.toString()); + + // Some events need special treatment besides forwarding them to the + // registered eventListeners (clients) + // These events are handled here at first: + + // Dispatch ResponseEvents to the appropriate responseEventListener + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + String internalActionId; + + responseEvent = (ResponseEvent) event; + internalActionId = responseEvent.getInternalActionId(); + if (internalActionId != null) + { + synchronized (responseEventListeners) + { + ManagerEventListener listener; + + listener = responseEventListeners.get(internalActionId); + if (listener != null) + { + try + { + listener.onManagerEvent(event); + } + catch (Exception e) + { logger.warn("Unexpected exception in response event listener " + listener.getClass().getName(), e); - } - } - } - } - else - { - // ResponseEvent without internalActionId: - // this happens if the same event class is used as response - // event - // and as an event that is not triggered by a Manager command - // Example: QueueMemberStatusEvent. - // logger.debug("ResponseEvent without " - // + "internalActionId:\n" + responseEvent); - } // NOPMD - } - if (event instanceof DisconnectEvent) - { - // When we receive get disconnected while we are connected start - // a new reconnect thread and set the state to RECONNECTING. - if (state == CONNECTED) - { - state = RECONNECTING; - // close socket if still open and remove reference to - // readerThread - // After sending the DisconnectThread that thread will die - // anyway. - cleanup(); - Thread reconnectThread = new Thread(new Runnable() - { - public void run() - { - reconnect(); - } - }); - reconnectThread.setName("Asterisk-Java ManagerConnection-" + id + "-Reconnect-" - + reconnectThreadCounter.getAndIncrement()); - reconnectThread.setDaemon(true); - reconnectThread.start(); - // now the DisconnectEvent is dispatched to registered - // eventListeners - // (clients) and after that the ManagerReaderThread is gone. - // So effectively we replaced the reader thread by a - // ReconnectThread. - } - else - { - // when we receive a DisconnectEvent while not connected we - // ignore it and do not send it to clients - return; - } - } - if (event instanceof ProtocolIdentifierReceivedEvent) - { - ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; - String protocolIdentifier; - - protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; - protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); - setProtocolIdentifier(protocolIdentifier); - // no need to send this event to clients - return; - } - - fireEvent(event); - } - - /** - * Notifies all {@link ManagerEventListener}s registered by users. - * -<<<<<<< HEAD - * @param event the event to propagate -======= - * @param event - * the event to propagate ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - private void fireEvent(ManagerEvent event) - { - synchronized (eventListeners) - { - for (ManagerEventListener listener : eventListeners) - { - try - { - listener.onManagerEvent(event); - } - catch (RuntimeException e) - { - logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); - } - } - } - } - - /** - * This method is called when a {@link ProtocolIdentifierReceivedEvent} is - * received from the reader. Having received a correct protocol identifier - * is the precodition for logging in. - * -<<<<<<< HEAD + } + } + } + } + else + { + // ResponseEvent without internalActionId: + // this happens if the same event class is used as response + // event + // and as an event that is not triggered by a Manager command + // Example: QueueMemberStatusEvent. + // logger.debug("ResponseEvent without " + // + "internalActionId:\n" + responseEvent); + } // NOPMD + } + if (event instanceof DisconnectEvent) + { + // When we receive get disconnected while we are connected start + // a new reconnect thread and set the state to RECONNECTING. + if (state == CONNECTED) + { + state = RECONNECTING; + // close socket if still open and remove reference to + // readerThread + // After sending the DisconnectThread that thread will die + // anyway. + cleanup(); + Thread reconnectThread = new Thread(new Runnable() + { + public void run() + { + reconnect(); + } + }); + reconnectThread.setName( + "Asterisk-Java ManagerConnection-" + id + "-Reconnect-" + reconnectThreadCounter.getAndIncrement()); + reconnectThread.setDaemon(true); + reconnectThread.start(); + // now the DisconnectEvent is dispatched to registered + // eventListeners + // (clients) and after that the ManagerReaderThread is gone. + // So effectively we replaced the reader thread by a + // ReconnectThread. + } + else + { + // when we receive a DisconnectEvent while not connected we + // ignore it and do not send it to clients + return; + } + } + if (event instanceof ProtocolIdentifierReceivedEvent) + { + ProtocolIdentifierReceivedEvent protocolIdentifierReceivedEvent; + String protocolIdentifier; + + protocolIdentifierReceivedEvent = (ProtocolIdentifierReceivedEvent) event; + protocolIdentifier = protocolIdentifierReceivedEvent.getProtocolIdentifier(); + setProtocolIdentifier(protocolIdentifier); + // no need to send this event to clients + return; + } + + fireEvent(event); + } + + /** + * Notifies all {@link ManagerEventListener}s registered by users. <<<<<<< + * HEAD + * + * @param event the event to propagate ======= + * @param event the event to propagate >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + private void fireEvent(ManagerEvent event) + { + synchronized (eventListeners) + { + for (ManagerEventListener listener : eventListeners) + { + try + { + listener.onManagerEvent(event); + } + catch (RuntimeException e) + { + logger.warn("Unexpected exception in eventHandler " + listener.getClass().getName(), e); + } + } + } + } + + /** + * This method is called when a {@link ProtocolIdentifierReceivedEvent} is + * received from the reader. Having received a correct protocol identifier + * is the precodition for logging in. <<<<<<< HEAD + * * @param identifier the protocol version used by the Asterisk server. -======= - * @param identifier - * the protocol version used by the Asterisk server. ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - private void setProtocolIdentifier(final String identifier) - { - logger.info("Connected via " + identifier); - - if (!"Asterisk Call Manager/1.0".equals(identifier) - && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk 1.6 - && !"Asterisk Call Manager/1.2".equals(identifier) // bri stuffed - && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk 11 - && !"OpenPBX Call Manager/1.0".equals(identifier) - && !"CallWeaver Call Manager/1.0".equals(identifier) - && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) - { - logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); - } - - synchronized (protocolIdentifier) - { - protocolIdentifier.value = identifier; - protocolIdentifier.notifyAll(); - } - } - - /** - * Reconnects to the asterisk server when the connection is lost. -<<<<<<< HEAD - *
-======= - *

->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * While keepAlive is true we will try to reconnect. - * Reconnection attempts will be stopped when the {@link #logoff()} method - * is called or when the login after a successful reconnect results in an - * {@link AuthenticationFailedException} suggesting that the manager - * credentials have changed and keepAliveAfterAuthenticationFailure is not - * set. -<<<<<<< HEAD - *
-======= - *

->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - * This method is called when a {@link DisconnectEvent} is received from the - * reader. - */ - private void reconnect() - { - int numTries; - - // try to reconnect - numTries = 0; - while (state == RECONNECTING) - { - try - { - if (numTries < 10) - { - // try to reconnect quite fast for the firt 10 times - // this succeeds if the server has just been restarted - Thread.sleep(RECONNECTION_INTERVAL_1); - } - else - { - // slow down after 10 unsuccessful attempts asuming a - // shutdown of the server - Thread.sleep(RECONNECTION_INTERVAL_2); - } - } - catch (InterruptedException e) - { - Thread.currentThread().interrupt(); - } - - try - { - connect(); - - try - { - doLogin(defaultResponseTimeout, eventMask); - logger.info("Successfully reconnected."); - // everything is ok again, so we leave - // when successful doLogin set the state to CONNECTED so no - // need to adjust it - break; - } - catch (AuthenticationFailedException e1) - { - if (keepAliveAfterAuthenticationFailure) - { - logger.error("Unable to log in after reconnect: " + e1.getMessage()); - } - else - { - logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); - state = DISCONNECTED; - } - } - catch (TimeoutException e1) - { - // shouldn't happen - but happens! - logger.error("TimeoutException while trying to log in " + "after reconnect."); - } - } - catch (IOException e) - { - // server seems to be still down, just continue to attempt - // reconnection - logger.warn("Exception while trying to reconnect: " + e.getMessage()); - } - numTries++; - } - } - - private void cleanup() - { - disconnect(); - this.readerThread = null; - } - - @Override - public String toString() - { - StringBuffer sb; - - sb = new StringBuffer("ManagerConnection["); - sb.append("id='").append(id).append("',"); - sb.append("hostname='").append(hostname).append("',"); - sb.append("port=").append(port).append(","); - sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); - - return sb.toString(); - } - - /* Helper classes */ - - /** - * A simple data object to store a ManagerResult. - */ - private static class ResponseHandlerResult implements Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 7831097958568769220L; - private ManagerResponse response; - - public ResponseHandlerResult() - { - } - - public ManagerResponse getResponse() - { - return this.response; - } - - public void setResponse(ManagerResponse response) - { - this.response = response; - } - } - - /** - * A simple response handler that stores the received response in a - * ResponseHandlerResult for further processing. - */ - private static class DefaultSendActionCallback implements SendActionCallback, Serializable - { - /** - * Serializable version identifier. - */ - private static final long serialVersionUID = 2926598671855316803L; - private final ResponseHandlerResult result; - - /** - * Creates a new instance. - * -<<<<<<< HEAD - * @param result the result to store the response in -======= - * @param result - * the result to store the response in ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - public DefaultSendActionCallback(ResponseHandlerResult result) - { - this.result = result; - } - - public void onResponse(ManagerResponse response) - { - synchronized (result) - { - result.setResponse(response); - result.notifyAll(); - } - } - } - - /** - * A combinded event and response handler that adds received events and the - * response to a ResponseEvents object. - */ - private static class ResponseEventHandler implements ManagerEventListener, SendActionCallback - { - private final ResponseEventsImpl events; - private final Class actionCompleteEventClass; - - /** - * Creates a new instance. - * -<<<<<<< HEAD - * @param events the ResponseEventsImpl to store the events in + * ======= + * @param identifier the protocol version used by the Asterisk server. + * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + private void setProtocolIdentifier(final String identifier) + { + logger.info("Connected via " + identifier); + + if (!"Asterisk Call Manager/1.0".equals(identifier) && !"Asterisk Call Manager/1.1".equals(identifier) // Asterisk + // 1.6 + && !"Asterisk Call Manager/1.2".equals(identifier) // bri + // stuffed + && !"Asterisk Call Manager/1.3".equals(identifier) // Asterisk + // 11 + && !"OpenPBX Call Manager/1.0".equals(identifier) && !"CallWeaver Call Manager/1.0".equals(identifier) + && !(identifier != null && identifier.startsWith("Asterisk Call Manager Proxy/"))) + { + logger.warn("Unsupported protocol version '" + identifier + "'. Use at your own risk."); + } + + synchronized (protocolIdentifier) + { + protocolIdentifier.value = identifier; + protocolIdentifier.notifyAll(); + } + } + + /** + * Reconnects to the asterisk server when the connection is lost. <<<<<<< + * HEAD
+ * ======= + *

+ * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 While keepAlive is + * true we will try to reconnect. Reconnection attempts will be + * stopped when the {@link #logoff()} method is called or when the login + * after a successful reconnect results in an + * {@link AuthenticationFailedException} suggesting that the manager + * credentials have changed and keepAliveAfterAuthenticationFailure is not + * set. <<<<<<< HEAD
+ * ======= + *

+ * >>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 This method is called + * when a {@link DisconnectEvent} is received from the reader. + */ + private void reconnect() + { + int numTries; + + // try to reconnect + numTries = 0; + while (state == RECONNECTING) + { + try + { + if (numTries < 10) + { + // try to reconnect quite fast for the firt 10 times + // this succeeds if the server has just been restarted + Thread.sleep(RECONNECTION_INTERVAL_1); + } + else + { + // slow down after 10 unsuccessful attempts asuming a + // shutdown of the server + Thread.sleep(RECONNECTION_INTERVAL_2); + } + } + catch (InterruptedException e) + { + Thread.currentThread().interrupt(); + } + + try + { + connect(); + + try + { + doLogin(defaultResponseTimeout, eventMask); + logger.info("Successfully reconnected."); + // everything is ok again, so we leave + // when successful doLogin set the state to CONNECTED so no + // need to adjust it + break; + } + catch (AuthenticationFailedException e1) + { + if (keepAliveAfterAuthenticationFailure) + { + logger.error("Unable to log in after reconnect: " + e1.getMessage()); + } + else + { + logger.error("Unable to log in after reconnect: " + e1.getMessage() + ". Giving up."); + state = DISCONNECTED; + } + } + catch (TimeoutException e1) + { + // shouldn't happen - but happens! + logger.error("TimeoutException while trying to log in " + "after reconnect."); + } + } + catch (IOException e) + { + // server seems to be still down, just continue to attempt + // reconnection + + String message = e.getClass().getSimpleName(); + if (e.getMessage() != null) + { + message = e.getMessage(); + } + logger.warn("Exception while trying to reconnect: " + message); + } + numTries++; + } + } + + private void cleanup() + { + disconnect(); + this.readerThread = null; + } + + @Override + public String toString() + { + StringBuffer sb; + + sb = new StringBuffer("ManagerConnection["); + sb.append("id='").append(id).append("',"); + sb.append("hostname='").append(hostname).append("',"); + sb.append("port=").append(port).append(","); + sb.append("systemHashcode=").append(System.identityHashCode(this)).append("]"); + + return sb.toString(); + } + + /* Helper classes */ + + /** + * A simple data object to store a ManagerResult. + */ + private static class ResponseHandlerResult implements Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 7831097958568769220L; + private ManagerResponse response; + + public ResponseHandlerResult() + { + } + + public ManagerResponse getResponse() + { + return this.response; + } + + public void setResponse(ManagerResponse response) + { + this.response = response; + } + } + + /** + * A simple response handler that stores the received response in a + * ResponseHandlerResult for further processing. + */ + private static class DefaultSendActionCallback implements SendActionCallback, Serializable + { + /** + * Serializable version identifier. + */ + private static final long serialVersionUID = 2926598671855316803L; + private final ResponseHandlerResult result; + + /** + * Creates a new instance. <<<<<<< HEAD + * + * @param result the result to store the response in ======= + * @param result the result to store the response in >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + public DefaultSendActionCallback(ResponseHandlerResult result) + { + this.result = result; + } + + public void onResponse(ManagerResponse response) + { + synchronized (result) + { + result.setResponse(response); + result.notifyAll(); + } + } + } + + /** + * A combinded event and response handler that adds received events and the + * response to a ResponseEvents object. + */ + private static class ResponseEventHandler implements ManagerEventListener, SendActionCallback + { + private final ResponseEventsImpl events; + private final Class< ? > actionCompleteEventClass; + + /** + * Creates a new instance. <<<<<<< HEAD + * + * @param events the ResponseEventsImpl to store the events in + * @param actionCompleteEventClass the type of event that indicates that + * all events have been received ======= + * @param events the ResponseEventsImpl to store the events in * @param actionCompleteEventClass the type of event that indicates that - * all events have been received -======= - * @param events - * the ResponseEventsImpl to store the events in - * @param actionCompleteEventClass - * the type of event that indicates that all events have been - * received ->>>>>>> da53d55f889fc734bc7f597b4ebf4669145f3639 - */ - public ResponseEventHandler(ResponseEventsImpl events, Class actionCompleteEventClass) - { - this.events = events; - this.actionCompleteEventClass = actionCompleteEventClass; - } - - public void onManagerEvent(ManagerEvent event) - { - synchronized (events) - { - // should always be a ResponseEvent, anyway... - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - - responseEvent = (ResponseEvent) event; - events.addEvent(responseEvent); - } - - // finished? - if (actionCompleteEventClass.isAssignableFrom(event.getClass())) - { - events.setComplete(true); - // notify if action complete event and response have been - // received - if (events.getResponse() != null) - { - events.notifyAll(); - } - } - } - } - - public void onResponse(ManagerResponse response) - { - synchronized (events) - { - events.setRepsonse(response); - if (response instanceof ManagerError) - { - events.setComplete(true); - } - - // finished? - // notify if action complete event and response have been - // received - if (events.isComplete()) - { - events.notifyAll(); - } - } - } - } - - private static class ProtocolIdentifierWrapper - { - String value; - } + * all events have been received >>>>>>> + * da53d55f889fc734bc7f597b4ebf4669145f3639 + */ + public ResponseEventHandler(ResponseEventsImpl events, Class< ? > actionCompleteEventClass) + { + this.events = events; + this.actionCompleteEventClass = actionCompleteEventClass; + } + + public void onManagerEvent(ManagerEvent event) + { + synchronized (events) + { + // should always be a ResponseEvent, anyway... + if (event instanceof ResponseEvent) + { + ResponseEvent responseEvent; + + responseEvent = (ResponseEvent) event; + events.addEvent(responseEvent); + } + + // finished? + if (actionCompleteEventClass.isAssignableFrom(event.getClass())) + { + events.setComplete(true); + // notify if action complete event and response have been + // received + if (events.getResponse() != null) + { + events.notifyAll(); + } + } + } + } + + public void onResponse(ManagerResponse response) + { + synchronized (events) + { + events.setRepsonse(response); + if (response instanceof ManagerError) + { + events.setComplete(true); + } + + // finished? + // notify if action complete event and response have been + // received + if (events.isComplete()) + { + events.notifyAll(); + } + } + } + } + + private static class ProtocolIdentifierWrapper + { + String value; + } } diff --git a/src/main/java/org/asteriskjava/manager/internal/ManagerUtil.java b/src/main/java/org/asteriskjava/manager/internal/ManagerUtil.java index 36181d7b5..fdf0dfab8 100644 --- a/src/main/java/org/asteriskjava/manager/internal/ManagerUtil.java +++ b/src/main/java/org/asteriskjava/manager/internal/ManagerUtil.java @@ -18,12 +18,13 @@ /** * Utilitiy class with some static helper methods that are used in multiple - * contexts within the manager package.

- * The methods for handling the internal action id are used to make sure we - * send unique ids to Asterisk even when the user of Asterisk-Java does not - * provide a unique action id or no action id at all.

- * All the methods contained in this class are supposed to be internally - * only. + * contexts within the manager package. + *

+ * The methods for handling the internal action id are used to make sure we send + * unique ids to Asterisk even when the user of Asterisk-Java does not provide a + * unique action id or no action id at all. + *

+ * All the methods contained in this class are supposed to be internally only. * * @author srt * @version $Id$ @@ -35,8 +36,7 @@ public class ManagerUtil /** * The hex digits used to build a hex string representation of a byte array. */ - private static final char[] hexChar = {'0', '1', '2', '3', '4', '5', '6', - '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + private static final char[] hexChar = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * Converts a byte array to a hex string representing it. The hex digits are @@ -48,7 +48,7 @@ public class ManagerUtil public static String toHexString(byte[] b) { final StringBuilder sb; - + sb = new StringBuilder(b.length * 2); for (byte aB : b) { @@ -61,8 +61,8 @@ public static String toHexString(byte[] b) /** * Returns the internal action id contained in the given action id. * - * @param actionId the action id prefixed by the internal action - * id as received from Asterisk. + * @param actionId the action id prefixed by the internal action id as + * received from Asterisk. * @return the internal action id that has been added before. * @see #addInternalActionId(String, String) */ @@ -74,23 +74,20 @@ public static String getInternalActionId(String actionId) { return null; } - + delimiterIndex = actionId.indexOf(INTERNAL_ACTION_ID_DELIMITER); if (delimiterIndex > 0) { return actionId.substring(0, delimiterIndex); } - else - { - return null; - } + return null; } /** * Strips the internal action id from the given action id. * - * @param actionId the action id prefixed by the internal action - * id as received from Asterisk. + * @param actionId the action id prefixed by the internal action id as + * received from Asterisk. * @return the original action id, that is the action id as it was before * the internal action id was added. * @see #addInternalActionId(String, String) @@ -106,15 +103,9 @@ public static String stripInternalActionId(String actionId) { return actionId.substring(delimiterIndex + 1); } - else - { - return null; - } - } - else - { return null; } + return null; } /** @@ -125,16 +116,12 @@ public static String stripInternalActionId(String actionId) * @return the action id prefixed by the internal action id suitable to be * sent to Asterisk. */ - public static String addInternalActionId(String actionId, - String internalActionId) + public static String addInternalActionId(String actionId, String internalActionId) { if (actionId == null) { return internalActionId + INTERNAL_ACTION_ID_DELIMITER; } - else - { - return internalActionId + INTERNAL_ACTION_ID_DELIMITER + actionId; - } + return internalActionId + INTERNAL_ACTION_ID_DELIMITER + actionId; } } diff --git a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java index 3f2a9aa16..ab63038c4 100644 --- a/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java +++ b/src/main/java/org/asteriskjava/tools/HtmlEventTracer.java @@ -1,9 +1,5 @@ package org.asteriskjava.tools; -import org.asteriskjava.live.DefaultAsteriskServer; -import org.asteriskjava.manager.ManagerEventListener; -import org.asteriskjava.manager.event.*; - import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; @@ -14,9 +10,23 @@ import java.util.List; import java.util.Map; +import org.asteriskjava.live.DefaultAsteriskServer; +import org.asteriskjava.manager.ManagerEventListener; +import org.asteriskjava.manager.event.AbstractParkedCallEvent; +import org.asteriskjava.manager.event.BridgeEvent; +import org.asteriskjava.manager.event.DialEvent; +import org.asteriskjava.manager.event.HangupEvent; +import org.asteriskjava.manager.event.HoldEvent; +import org.asteriskjava.manager.event.ManagerEvent; +import org.asteriskjava.manager.event.NewChannelEvent; +import org.asteriskjava.manager.event.NewExtenEvent; +import org.asteriskjava.manager.event.NewStateEvent; +import org.asteriskjava.manager.event.RenameEvent; + /** * A diagnostic tool that creates an HTML file showing the state changing events - * received from Asterisk on the Manager API.

+ * received from Asterisk on the Manager API. + *

* The following events are shown: *