[Asterisk-java-cvs] CVS: asterisk-java/src/java/net/sf/asterisk/manager DefaultAsteriskManager.java,
Brought to you by:
srt
From: Stefan R. <sr...@us...> - 2005-07-16 23:27:23
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29072/src/java/net/sf/asterisk/manager Modified Files: DefaultAsteriskManager.java AsteriskManager.java Originate.java Log Message: Adopted DefaultAsteriskManager to use the new EventGeneratingAction features of ManagerConnection Index: DefaultAsteriskManager.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/DefaultAsteriskManager.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -p -r1.6 -r1.7 --- DefaultAsteriskManager.java 7 Jul 2005 00:27:29 -0000 1.6 +++ DefaultAsteriskManager.java 16 Jul 2005 23:26:58 -0000 1.7 @@ -17,16 +17,13 @@ package net.sf.asterisk.manager; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; -import java.util.List; 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; @@ -36,17 +33,14 @@ import net.sf.asterisk.manager.event.Man import net.sf.asterisk.manager.event.NewChannelEvent; import net.sf.asterisk.manager.event.NewExtenEvent; import net.sf.asterisk.manager.event.NewStateEvent; +import net.sf.asterisk.manager.event.OriginateEvent; import net.sf.asterisk.manager.event.OriginateFailureEvent; -import net.sf.asterisk.manager.event.OriginateSuccessEvent; import net.sf.asterisk.manager.event.QueueEntryEvent; import net.sf.asterisk.manager.event.QueueMemberEvent; import net.sf.asterisk.manager.event.QueueParamsEvent; import net.sf.asterisk.manager.event.RenameEvent; -import net.sf.asterisk.manager.event.StatusCompleteEvent; import net.sf.asterisk.manager.event.StatusEvent; import net.sf.asterisk.manager.event.UnlinkEvent; -import net.sf.asterisk.manager.response.ManagerResponse; - import net.sf.asterisk.util.Log; import net.sf.asterisk.util.LogFactory; @@ -62,42 +56,25 @@ public class DefaultAsteriskManager AsteriskManager, ManagerEventHandler { - private final Log log = LogFactory.getLog(this.getClass()); + private final Log logger = LogFactory.getLog(this.getClass()); private ManagerConnection connection; /** * A map of all active channel by their unique id. */ - private Map channels; - - /** - * A map of all of the originating calls by their actionid. - */ - private Map calls; + private final Map channels; /** * Sequence to track calls. */ private int callSequence; - private Map queues; - private List queuedEvents; - private boolean channelsInitialized; - private boolean queuesInitialized; - private boolean initialized; - private boolean loggedIn; + private final Map queues; public DefaultAsteriskManager() { - this.calls = Collections.synchronizedMap(new HashMap()); this.channels = Collections.synchronizedMap(new HashMap()); this.queues = Collections.synchronizedMap(new HashMap()); - this.queuedEvents = Collections.synchronizedList(new ArrayList()); - this.channelsInitialized = false; - // TODO fix detection of queuesInitialized - this.queuesInitialized = true; - this.initialized = false; - this.loggedIn = false; } public void setManagerConnection(ManagerConnection connection) @@ -108,28 +85,89 @@ public class DefaultAsteriskManager public void initialize() throws TimeoutException, IOException, AuthenticationFailedException { - connection.addEventHandler(this); connection.login(); - loggedIn = true; - connection.sendAction(new StatusAction()); - connection.sendAction(new QueueStatusAction()); + initializeChannels(); + initializeQueues(); + + connection.addEventHandler(this); + } + + private void initializeChannels() throws EventTimeoutException, IOException + { + ResponseEvents re; + Iterator i; + + re = connection.sendEventGeneratingAction(new StatusAction()); + i = re.getEvents().iterator(); + while (i.hasNext()) + { + ManagerEvent event; + + event = (ManagerEvent) i.next(); + if (event instanceof StatusEvent) + { + handleStatusEvent((StatusEvent) event); + } + } + } + + private void initializeQueues() throws IOException + { + ResponseEvents re; + Iterator i; + + try + { + re = connection.sendEventGeneratingAction(new StatusAction()); + } + catch (EventTimeoutException e) + { + // this happens with Asterisk 1.0.x as it doesn't send a + // QueueStatusCompleteEvent + re = e.getPartialResult(); + } + + i = re.getEvents().iterator(); + while (i.hasNext()) + { + ManagerEvent event; + + event = (ManagerEvent) i.next(); + if (event instanceof QueueParamsEvent) + { + handleQueueParamsEvent((QueueParamsEvent) event); + } + else if (event instanceof QueueMemberEvent) + { + handleQueueMemberEvent((QueueMemberEvent) event); + } + else if (event instanceof QueueEntryEvent) + { + handleQueueEntryEvent((QueueEntryEvent) event); + } + } } /* Implementation of the AsteriskManager interface */ public Call originateCall(Originate originate) throws TimeoutException, - IOException, Exception + IOException { - Call call; OriginateAction originateAction; - String actionid; + ResponseEvents responseEvents; + Long timeout; - call = new Call(); - originateAction = new OriginateAction(); - actionid = System.identityHashCode(this) + "#" + (++callSequence); + if (originate.getTimeout() == null) + { + timeout = new Long(30000); + } + else + { + timeout = originate.getTimeout(); + } - // set the action properties + originateAction = new OriginateAction(); originateAction.setAccount(originate.getAccount()); originateAction.setApplication(originate.getApplication()); originateAction.setCallerId(originate.getCallerId()); @@ -138,34 +176,18 @@ public class DefaultAsteriskManager originateAction.setData(originate.getData()); originateAction.setExten(originate.getExten()); originateAction.setPriority(originate.getPriority()); - originateAction.setTimeout(originate.getTimeout()); + originateAction.setTimeout(timeout); originateAction.setVariable(originate.getVariableString()); // must set async to true to receive OriginateEvents. originateAction.setAsync(Boolean.TRUE); - originateAction.setActionId(actionid); - - ManagerResponse response = connection.sendAction(originateAction); - // TODO check the response, don't bother waiting for an originatesuccess - // or originatefailure if the response is bad - if ("Success".equalsIgnoreCase(response.getResponse())) - { - // register and listen for the OriginateSuccess or OriginateFailure - // event - synchronized (call) - { - calls.put(actionid, call); - call.wait(); - } - } - else - { - call.setStartTime(new Date()); - call.setEndTime(call.getStartTime()); - } + // 2000 ms extra for the OriginateFailureEvent should be fine + responseEvents = connection.sendEventGeneratingAction(originateAction, + timeout.longValue() + 2000); - return call; + return originateEvent2Call((OriginateEvent) responseEvents.getEvents() + .toArray()[0]); } /** @@ -182,7 +204,7 @@ public class DefaultAsteriskManager } /* Implementation of the ManagerEventHandler interface */ - + /** * Handles all events received from the asterisk server.<br> * Events are queued until channels and queues are initialized and then @@ -200,58 +222,7 @@ public class DefaultAsteriskManager { handleDisconnectEvent((DisconnectEvent) event); } - - // build initial state if not yet initialized, dispatch otherwise. - if (!initialized) - { - if (event instanceof StatusEvent) - { - handleStatusEvent((StatusEvent) event); - } - else if (event instanceof StatusCompleteEvent) - { - handleStatusCompleteEvent((StatusCompleteEvent) event); - } - else if (event instanceof QueueParamsEvent) - { - handleQueueParamsEvent((QueueParamsEvent) event); - } - else if (event instanceof QueueMemberEvent) - { - handleQueueMemberEvent((QueueMemberEvent) event); - } - else if (event instanceof QueueEntryEvent) - { - handleQueueEntryEvent((QueueEntryEvent) event); - } - else - { - queuedEvents.add(event); - } - - if (channelsInitialized && queuesInitialized) - { - Iterator i = queuedEvents.iterator(); - - while (i.hasNext()) - { - ManagerEvent queuedEvent = (ManagerEvent) i.next(); - dispatchEvent(queuedEvent); - i.remove(); - } - - this.initialized = true; - } - } - else - { - dispatchEvent(event); - } - } - - protected void dispatchEvent(ManagerEvent event) - { - if (event instanceof NewChannelEvent) + else if (event instanceof NewChannelEvent) { handleNewChannelEvent((NewChannelEvent) event); } @@ -279,14 +250,6 @@ public class DefaultAsteriskManager { handleHangupEvent((HangupEvent) event); } - else if (event instanceof OriginateSuccessEvent) - { - handleOriginateSuccessEvent((OriginateSuccessEvent) event); - } - else if (event instanceof OriginateFailureEvent) - { - handleOriginateFailureEvent((OriginateFailureEvent) event); - } } protected void addChannel(Channel channel) @@ -350,17 +313,11 @@ public class DefaultAsteriskManager if (isNew) { - log.info("Adding new channel " + channel.getName()); + logger.info("Adding new channel " + channel.getName()); addChannel(channel); } } - protected void handleStatusCompleteEvent(StatusCompleteEvent event) - { - log.info("Channels are now initialized"); - this.channelsInitialized = true; - } - /** * Resets the internal state when the connection to the asterisk server is * lost. @@ -369,11 +326,6 @@ public class DefaultAsteriskManager { this.channels.clear(); this.queues.clear(); - this.queuedEvents.clear(); - this.channelsInitialized = false; - // TODO fix detection of queuesInitialized - this.queuesInitialized = true; - this.initialized = false; } /** @@ -382,28 +334,22 @@ public class DefaultAsteriskManager */ protected void handleConnectEvent(ConnectEvent connectEvent) { - // first connect is no reconnect ;) - if (!loggedIn) - { - return; - } - try { - connection.sendAction(new StatusAction()); + initializeChannels(); } catch (Exception e) { - log.error("Unable to request channel status after reconnect.", e); + logger.error("Unable to initialize channels after reconnect.", e); } try { - connection.sendAction(new QueueStatusAction()); + initializeQueues(); } - catch (Exception e) + catch (IOException e) { - log.error("Unable to request queue status after reconnect.", e); + logger.error("Unable to initialize queues after reconnect.", e); } } @@ -427,7 +373,7 @@ public class DefaultAsteriskManager if (isNew) { - log.info("Adding new queue " + queue.getName()); + logger.info("Adding new queue " + queue.getName()); addQueue(queue); } } @@ -444,13 +390,13 @@ public class DefaultAsteriskManager if (queue == null) { - log.error("ignored QueueEntryEvent for unknown queue " + logger.error("ignored QueueEntryEvent for unknown queue " + event.getQueue()); return; } if (channel == null) { - log.error("ignored QueueEntryEvent for unknown channel " + logger.error("ignored QueueEntryEvent for unknown channel " + event.getChannel()); return; } @@ -490,7 +436,7 @@ public class DefaultAsteriskManager channel.setCallerId(event.getCallerId()); channel.setState(ChannelStateEnum.getEnum(event.getState())); - log.info("Adding channel " + channel.getName()); + logger.info("Adding channel " + channel.getName()); addChannel(channel); } @@ -499,7 +445,7 @@ public class DefaultAsteriskManager Channel channel = (Channel) channels.get(event.getUniqueId()); if (channel == null) { - log.error("Ignored NewExtenEvent for unknown channel " + logger.error("Ignored NewExtenEvent for unknown channel " + event.getChannel()); return; } @@ -519,7 +465,7 @@ public class DefaultAsteriskManager Channel channel = (Channel) channels.get(event.getUniqueId()); if (channel == null) { - log.error("Ignored NewStateEvent for unknown channel " + logger.error("Ignored NewStateEvent for unknown channel " + event.getChannel()); return; } @@ -532,7 +478,7 @@ public class DefaultAsteriskManager Channel channel = (Channel) channels.get(event.getUniqueId()); if (channel == null) { - log.error("Ignored HangupEvent for unknown channel " + logger.error("Ignored HangupEvent for unknown channel " + event.getChannel()); return; } @@ -542,7 +488,7 @@ public class DefaultAsteriskManager channel.setState(ChannelStateEnum.HUNGUP); } - log.info("Removing channel " + channel.getName() + " due to hangup"); + logger.info("Removing channel " + channel.getName() + " due to hangup"); removeChannel(channel); } @@ -553,18 +499,18 @@ public class DefaultAsteriskManager if (channel1 == null) { - log.error("Ignored LinkEvent for unknown channel " + logger.error("Ignored LinkEvent for unknown channel " + event.getChannel1()); return; } if (channel2 == null) { - log.error("Ignored LinkEvent for unknown channel " + logger.error("Ignored LinkEvent for unknown channel " + event.getChannel2()); return; } - log.info("Linking channels " + channel1.getName() + " and " + logger.info("Linking channels " + channel1.getName() + " and " + channel2.getName()); synchronized (this) { @@ -580,18 +526,18 @@ public class DefaultAsteriskManager if (channel1 == null) { - log.error("Ignored UnlinkEvent for unknown channel " + logger.error("Ignored UnlinkEvent for unknown channel " + event.getChannel1()); return; } if (channel2 == null) { - log.error("Ignored UnlinkEvent for unknown channel " + logger.error("Ignored UnlinkEvent for unknown channel " + event.getChannel2()); return; } - log.info("Unlinking channels " + channel1.getName() + " and " + logger.info("Unlinking channels " + channel1.getName() + " and " + channel2.getName()); synchronized (channel1) { @@ -608,64 +554,27 @@ public class DefaultAsteriskManager { Channel channel = (Channel) channels.get(event.getUniqueId()); - log.info("Renaming channel '" + channel.getName() + "' to '" + logger.info("Renaming channel '" + channel.getName() + "' to '" + event.getNewname() + "'"); channel.setName(event.getNewname()); } - protected void handleOriginateSuccessEvent(OriginateSuccessEvent event) + protected Call originateEvent2Call(OriginateEvent event) { - log.debug("Got OriginateSuccess Event" + event); - // see if there is a call registered for this actionid - synchronized (calls) - { - Call call = (Call) calls.get(event.getActionId()); - log.debug("Found a call waiting for this OriginateSuccess event"); - // update the call and notify that it is ready - if (call != null) - { - synchronized (call) - { - Channel channel; - - calls.remove(call); - - channel = (Channel) channels.get(event.getUniqueId()); - call.setUniqueId(event.getUniqueId()); - call.setChannel(channel); - call.setStartTime(event.getDateReceived()); - call.setReason(event.getReason()); - call.notify(); - } - } - } - } + Call call; + Channel channel; - protected void handleOriginateFailureEvent(OriginateFailureEvent event) - { - // see if there is a call registered for this actionid - synchronized (calls) + channel = (Channel) channels.get(event.getUniqueId()); + call = new Call(); + call.setUniqueId(event.getUniqueId()); + call.setChannel(channel); + call.setStartTime(event.getDateReceived()); + if (event instanceof OriginateFailureEvent) { - Call call = (Call) calls.get(event.getActionId()); - - // update the call and notify that it is ready - if (call != null) - { - synchronized (call) - { - Channel channel; - - calls.remove(call); - - channel = (Channel) channels.get(event.getUniqueId()); - call.setUniqueId(event.getUniqueId()); - call.setChannel(channel); - call.setStartTime(event.getDateReceived()); - call.setEndTime(event.getDateReceived()); - call.setReason(event.getReason()); - call.notify(); - } - } + call.setEndTime(event.getDateReceived()); } + call.setReason(event.getReason()); + + return call; } } Index: AsteriskManager.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/AsteriskManager.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -p -r1.6 -r1.7 --- AsteriskManager.java 7 Jul 2005 00:27:35 -0000 1.6 +++ AsteriskManager.java 16 Jul 2005 23:26:59 -0000 1.7 @@ -41,8 +41,7 @@ public interface AsteriskManager * @throws TimeoutException if the originated call is not answered in time * @throws IOException if the action cannot be sent to the asterisk server */ - public Call originateCall(Originate originate) throws TimeoutException, - IOException, Exception; + public Call originateCall(Originate originate) throws TimeoutException, IOException; /** * Returns a Map of active channels.<br> Index: Originate.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/Originate.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- Originate.java 22 Jun 2005 18:27:12 -0000 1.1 +++ Originate.java 16 Jul 2005 23:27:11 -0000 1.2 @@ -28,7 +28,7 @@ public class Originate private String exten; private String context; private Integer priority; - private Integer timeout; + private Long timeout; private String callerId; private Map variables = new HashMap(); private String account; @@ -174,7 +174,7 @@ public class Originate /** * Returns the timeout for the origination. */ - public Integer getTimeout() + public Long getTimeout() { return timeout; } @@ -183,9 +183,9 @@ public class Originate * Sets the timeout (in milliseconds) for the origination.<br> * The channel must be answered within this time, otherwise the origination * is considered to have failed and an OriginateFailureEvent is generated.<br> - * If not set, asterisk assumes a default value of 30000 meaning 30 seconds. + * If not set, a default value of 30000 is asumed meaning 30 seconds. */ - public void setTimeout(Integer timeout) + public void setTimeout(Long timeout) { this.timeout = timeout; } |