[Asterisk-java-cvs] CVS: asterisk-java/src/net/sf/asterisk/manager DefaultManagerConnection.java,1.9
Brought to you by:
srt
From: Stefan R. <sr...@us...> - 2005-01-31 01:18:22
|
Update of /cvsroot/asterisk-java/asterisk-java/src/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17184/src/net/sf/asterisk/manager Modified Files: DefaultManagerConnection.java ManagerConnection.java DefaultAsteriskManager.java Log Message: - added ConnectEvent and DisconnectEvent - DefaultAsteriskManager now refreshes its state after restarting asterisk Index: DefaultManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/net/sf/asterisk/manager/DefaultManagerConnection.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -p -r1.9 -r1.10 --- DefaultManagerConnection.java 23 Oct 2004 07:19:45 -0000 1.9 +++ DefaultManagerConnection.java 31 Jan 2005 01:18:03 -0000 1.10 @@ -24,6 +24,8 @@ import net.sf.asterisk.manager.action.Ch import net.sf.asterisk.manager.action.LoginAction; import net.sf.asterisk.manager.action.LogoffAction; import net.sf.asterisk.manager.action.ManagerAction; +import net.sf.asterisk.manager.event.ConnectEvent; +import net.sf.asterisk.manager.event.DisconnectEvent; import net.sf.asterisk.manager.event.ManagerEvent; import net.sf.asterisk.manager.response.ChallengeResponse; import net.sf.asterisk.manager.response.ManagerError; @@ -174,8 +176,7 @@ public class DefaultManagerConnection im login(defaultTimeout); } - private void login(long timeout) throws IOException, AuthenticationFailedException, - TimeoutException + private void login(long timeout) throws IOException, AuthenticationFailedException, TimeoutException { long timeSpent; ChallengeAction challengeAction; @@ -228,8 +229,7 @@ public class DefaultManagerConnection im { logger.error("Unable to create login key using MD5 Message Digest", ex); disconnect(); - throw new AuthenticationFailedException( - "Unable to create login key using MD5 Message Digest", ex); + throw new AuthenticationFailedException("Unable to create login key using MD5 Message Digest", ex); } loginResponse = sendAction(loginAction); @@ -245,6 +245,9 @@ public class DefaultManagerConnection im this.keepAlive = true; logger.info("Successfully logged in"); + + // notify event listeners + dispatchEvent(new ConnectEvent(this)); } private void connect() throws IOException @@ -271,10 +274,10 @@ public class DefaultManagerConnection im logoffAction = new LogoffAction(); sendAction(logoffAction); - + disconnect(); } - + private void disconnect() { if (this.writer != null) @@ -304,8 +307,7 @@ public class DefaultManagerConnection im return sendAction(action, defaultTimeout); } - public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, - TimeoutException + public ManagerResponse sendAction(ManagerAction action, long timeout) throws IOException, TimeoutException { long timeSpent; ResponseHandlerResult result; @@ -326,8 +328,7 @@ public class DefaultManagerConnection im if (timeSpent > timeout) { - throw new TimeoutException("Timeout waiting for response to " - + action.getAction()); + throw new TimeoutException("Timeout waiting for response to " + action.getAction()); } } catch (InterruptedException ex) @@ -338,8 +339,7 @@ public class DefaultManagerConnection im return result.getResponse(); } - public void sendAction(ManagerAction action, ManagerResponseHandler callbackHandler) - throws IOException + public void sendAction(ManagerAction action, ManagerResponseHandler callbackHandler) throws IOException { String internalActionId; @@ -376,10 +376,10 @@ public class DefaultManagerConnection im this.writer.print(actionString); this.writer.flush(); - logger.debug("Sent action with internalActionId '" + internalActionId + "':\n"+ actionString); + logger.debug("Sent action with internalActionId '" + internalActionId + "':\n" + actionString); } } - + /** * Creates a new unique internal action id based on the hash code of this * connection and a sequence. @@ -452,15 +452,13 @@ public class DefaultManagerConnection im response.setActionId(Util.stripInternalActionId(actionId)); } - logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" - + response); + logger.debug("Dispatching response with internalActionId '" + internalActionId + "':\n" + response); if (internalActionId != null) { synchronized (this.responseHandlers) { - responseHandler = (ManagerResponseHandler) this.responseHandlers - .get(internalActionId); + responseHandler = (ManagerResponseHandler) this.responseHandlers.get(internalActionId); if (responseHandler != null) { this.responseHandlers.remove(internalActionId); @@ -469,7 +467,8 @@ public class DefaultManagerConnection im } else { - logger.error("Unable to retrieve internalActionId from response: asterisk sent actionId '" + actionId + "':\n" + response); + logger.error("Unable to retrieve internalActionId from response: asterisk sent actionId '" + actionId + + "':\n" + response); } if (responseHandler != null) @@ -565,6 +564,10 @@ public class DefaultManagerConnection im // clean up at first disconnect(); + // notify event listeners + dispatchEvent(new DisconnectEvent(this)); + + // try to reconnect numTries = 0; while (this.keepAlive) { Index: ManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/net/sf/asterisk/manager/ManagerConnection.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -p -r1.4 -r1.5 --- ManagerConnection.java 29 Sep 2004 15:18:21 -0000 1.4 +++ ManagerConnection.java 31 Jan 2005 01:18:04 -0000 1.5 @@ -48,7 +48,7 @@ public interface ManagerConnection * @see net.sf.asterisk.manager.action.LogoffAction */ void logoff() throws IOException, TimeoutException; - + /** * Returns the protocol identifier, i.e. a string like "Asterisk Call Manager/1.0". * @@ -99,7 +99,7 @@ public interface ManagerConnection * @throws IOException */ void sendAction(ManagerAction action, ManagerResponseHandler callbackHandler) throws IOException; - + /** * Registers an event handler to be called whenever an {@link net.sf.asterisk.manager.event.ManagerEvent} * is receiced from the asterisk server. @@ -109,7 +109,7 @@ public interface ManagerConnection * @see #removeEventHandler(ManagerEventHandler) */ void addEventHandler(ManagerEventHandler eventHandler); - + /** * Unregisters a previously registered event handler.<br> * Does nothing if the given event handler hasn't be been regiered before. Index: DefaultAsteriskManager.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/net/sf/asterisk/manager/DefaultAsteriskManager.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -p -r1.7 -r1.8 --- DefaultAsteriskManager.java 29 Jan 2005 10:59:57 -0000 1.7 +++ DefaultAsteriskManager.java 31 Jan 2005 01:18:04 -0000 1.8 @@ -17,6 +17,8 @@ import java.util.Map; import net.sf.asterisk.manager.action.OriginateAction; import net.sf.asterisk.manager.action.QueueStatusAction; import net.sf.asterisk.manager.action.StatusAction; +import net.sf.asterisk.manager.event.ConnectEvent; +import net.sf.asterisk.manager.event.DisconnectEvent; import net.sf.asterisk.manager.event.HangupEvent; import net.sf.asterisk.manager.event.LinkEvent; import net.sf.asterisk.manager.event.ManagerEvent; @@ -109,6 +111,16 @@ public class DefaultAsteriskManager impl { System.out.println("received: " + event); + if (event instanceof ConnectEvent) + { + handleConnectEvent((ConnectEvent) event); + } + else if (event instanceof DisconnectEvent) + { + handleDisconnectEvent((DisconnectEvent) event); + } + + // build initial state if not yet initialized, dispatch otherwise. if (!initialized) { if (event instanceof StatusEvent) @@ -219,8 +231,8 @@ public class DefaultAsteriskManager impl channel = new Channel(event.getChannel(), event.getUniqueId()); if (event.getSeconds() != null) { - channel.setDateOfCreation(new Date(System.currentTimeMillis() - - (event.getSeconds().intValue() * 1000))); + channel + .setDateOfCreation(new Date(System.currentTimeMillis() - (event.getSeconds().intValue() * 1000))); } isNew = true; } @@ -260,6 +272,45 @@ public class DefaultAsteriskManager impl this.channelsInitialized = true; } + /** + * Resets the internal state when the connection to the asterisk server is lost. + */ + protected void handleDisconnectEvent(DisconnectEvent disconnectEvent) + { + this.channels.clear(); + this.queues.clear(); + this.queuedEvents.clear(); + this.channelsInitialized = false; + //TODO fix detection of queuesInitialized + this.queuesInitialized = true; + this.initialized = false; + } + + /** + * Requests the current state from the asterisk server after the connection to the asterisk + * server is restored. + */ + protected void handleConnectEvent(ConnectEvent connectEvent) + { + try + { + connection.sendAction(new StatusAction()); + } + catch (Exception e) + { + log.error("Unable to request channel status from asterisk server after reconnect.", e); + } + + try + { + connection.sendAction(new QueueStatusAction()); + } + catch (Exception e) + { + log.error("Unable to request queue status from asterisk server after reconnect.", e); + } + } + protected void handleQueueParamsEvent(QueueParamsEvent event) { Queue queue; |