asterisk-java-cvs Mailing List for Asterisk-Java Library (Page 93)
Brought to you by:
srt
You can subscribe to this list here.
2005 |
Jan
(4) |
Feb
(75) |
Mar
(211) |
Apr
(70) |
May
(12) |
Jun
(7) |
Jul
(96) |
Aug
(90) |
Sep
(11) |
Oct
(42) |
Nov
(45) |
Dec
(4) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2006 |
Jan
(20) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(32) |
Aug
|
Sep
(4) |
Oct
(2) |
Nov
(10) |
Dec
|
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(4) |
Jul
(3) |
Aug
(73) |
Sep
(13) |
Oct
(4) |
Nov
(1) |
Dec
(7) |
2009 |
Jan
(1) |
Feb
(2) |
Mar
(48) |
Apr
(21) |
May
(14) |
Jun
(11) |
Jul
(9) |
Aug
(2) |
Sep
(11) |
Oct
(14) |
Nov
(6) |
Dec
(4) |
2010 |
Jan
(3) |
Feb
(2) |
Mar
|
Apr
|
May
(3) |
Jun
(3) |
Jul
|
Aug
|
Sep
|
Oct
(9) |
Nov
|
Dec
(12) |
2011 |
Jan
(1) |
Feb
(5) |
Mar
(7) |
Apr
(1) |
May
(1) |
Jun
|
Jul
|
Aug
(10) |
Sep
|
Oct
(5) |
Nov
|
Dec
|
2012 |
Jan
(3) |
Feb
|
Mar
(3) |
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
(3) |
Oct
|
Nov
(2) |
Dec
(2) |
2013 |
Jan
|
Feb
(2) |
Mar
(1) |
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
(3) |
Sep
|
Oct
(2) |
Nov
|
Dec
(1) |
2014 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(1) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
(5) |
2015 |
Jan
(1) |
Feb
|
Mar
|
Apr
(25) |
May
(10) |
Jun
(4) |
Jul
(7) |
Aug
(4) |
Sep
(1) |
Oct
(1) |
Nov
(3) |
Dec
(1) |
2016 |
Jan
|
Feb
(42) |
Mar
(6) |
Apr
(15) |
May
(3) |
Jun
(1) |
Jul
(11) |
Aug
|
Sep
|
Oct
(17) |
Nov
(2) |
Dec
|
2017 |
Jan
|
Feb
(4) |
Mar
(1) |
Apr
(3) |
May
(2) |
Jun
(3) |
Jul
(7) |
Aug
(11) |
Sep
(5) |
Oct
(7) |
Nov
(4) |
Dec
(4) |
2018 |
Jan
(11) |
Feb
(11) |
Mar
(3) |
Apr
|
May
(9) |
Jun
(6) |
Jul
(17) |
Aug
(9) |
Sep
(2) |
Oct
(4) |
Nov
(3) |
Dec
(3) |
2019 |
Jan
(13) |
Feb
(1) |
Mar
(1) |
Apr
|
May
(5) |
Jun
|
Jul
(1) |
Aug
(6) |
Sep
|
Oct
|
Nov
(3) |
Dec
|
2020 |
Jan
(2) |
Feb
(72) |
Mar
(8) |
Apr
(11) |
May
(12) |
Jun
(3) |
Jul
(12) |
Aug
(3) |
Sep
(5) |
Oct
(4) |
Nov
|
Dec
(9) |
2021 |
Jan
|
Feb
(31) |
Mar
(6) |
Apr
(3) |
May
|
Jun
(2) |
Jul
|
Aug
(2) |
Sep
|
Oct
(9) |
Nov
|
Dec
(32) |
2022 |
Jan
(5) |
Feb
(7) |
Mar
(2) |
Apr
(3) |
May
|
Jun
|
Jul
(3) |
Aug
|
Sep
(2) |
Oct
(111) |
Nov
(105) |
Dec
(26) |
2023 |
Jan
(25) |
Feb
(6) |
Mar
(10) |
Apr
(54) |
May
(41) |
Jun
(24) |
Jul
(6) |
Aug
(11) |
Sep
(9) |
Oct
(8) |
Nov
(55) |
Dec
(34) |
2024 |
Jan
(6) |
Feb
(4) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(2) |
Aug
(89) |
Sep
(48) |
Oct
(31) |
Nov
(9) |
Dec
(19) |
2025 |
Jan
(12) |
Feb
(18) |
Mar
(9) |
Apr
(7) |
May
|
Jun
(7) |
Jul
(5) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Stefan R. <sr...@us...> - 2005-03-05 22:47:10
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/fastagi In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24114/src/test/net/sf/asterisk/fastagi Added Files: AGIRequestBuilderImplTest.java Log Message: Added initial stuff for fastagi support --- NEW FILE: AGIRequestBuilderImplTest.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.fastagi; import java.util.ArrayList; import java.util.Collection; import junit.framework.TestCase; public class AGIRequestBuilderImplTest extends TestCase { private AGIRequestBuilder agiRequestBuilder; protected void setUp() { this.agiRequestBuilder = new AGIRequestBuilderImpl(); } public void testBuildAGIRequest() { Collection lines; AGIRequest request; lines = new ArrayList(); lines.add("agi_network: yes"); lines.add("agi_network_script: myscript.agi"); lines.add("agi_request: agi://host/myscript.agi"); lines.add("agi_channel: SIP/1234-d715"); lines.add("agi_language: en"); lines.add("agi_type: SIP"); lines.add("agi_uniqueid: 1110023416.6"); lines.add("agi_callerid: John Doe<1234>"); lines.add("agi_dnid: 8870"); lines.add("agi_rdnis: unknown"); lines.add("agi_context: local"); lines.add("agi_extension: 8870"); lines.add("agi_priority: 1"); lines.add("agi_enhanced: 0.0"); lines.add("agi_accountcode: "); request = agiRequestBuilder.buildAGIRequest(lines); assertEquals("incorrect script", "myscript.agi", request.getScript()); assertEquals("incorrect requestURL", "agi://host/myscript.agi", request.getRequestURL()); assertEquals("incorrect channel", "SIP/1234-d715", request.getChannel()); assertEquals("incorrect uniqueId", "SIP/1234-d715", request.getChannel()); assertEquals("incorrect type", "SIP", request.getType()); assertEquals("incorrect language", "en", request.getLanguage()); assertEquals("incorrect callerId", "1234", request.getCallerId()); assertEquals("incorrect callerIdName", "John Doe", request.getCallerIdName()); assertEquals("incorrect dnid", "8870", request.getDnid()); assertEquals("incorrect rdnis", "unknown", request.getRdnis()); assertEquals("incorrect context", "local", request.getContext()); assertEquals("incorrect extension", "8870", request.getExtension()); assertEquals("incorrect priority", new Integer(1), request.getPriority()); assertEquals("incorrect enhanced", Boolean.FALSE, request.getEnhanced()); assertNull("incorrect accountCode must not be set", request.getAccountCode()); } public void testBuildAGIRequestWithoutCallerIdName() { Collection lines; AGIRequest request; lines = new ArrayList(); lines.add("agi_callerid: 1234"); request = agiRequestBuilder.buildAGIRequest(lines); assertEquals("incorrect callerId", "1234", request.getCallerId()); assertNull("callerIdName must not be set", request.getCallerIdName()); } public void testBuildAGIRequestWithoutCallerIdNameButBracket() { Collection lines; AGIRequest request; lines = new ArrayList(); lines.add("agi_callerid: <1234>"); request = agiRequestBuilder.buildAGIRequest(lines); assertEquals("incorrect callerId", "1234", request.getCallerId()); assertNull("callerIdName must not be set", request.getCallerIdName()); } public void testBuildAGIRequestWithoutCallerIdNameButBracketAndQuotesAndSpace() { Collection lines; AGIRequest request; lines = new ArrayList(); lines.add("agi_callerid: \"\" <1234>"); request = agiRequestBuilder.buildAGIRequest(lines); assertEquals("incorrect callerId", "1234", request.getCallerId()); assertNull("callerIdName must not be set", request.getCallerIdName()); } public void testBuildAGIRequestWithQuotedCallerIdName() { Collection lines; AGIRequest request; lines = new ArrayList(); lines.add("agi_callerid: \"John Doe\"<1234>"); request = agiRequestBuilder.buildAGIRequest(lines); assertEquals("incorrect callerId", "1234", request.getCallerId()); assertEquals("incorrect callerIdName", "John Doe", request.getCallerIdName()); } public void testBuildAGIRequestWithQuotedCallerIdNameAndSpace() { Collection lines; AGIRequest request; lines = new ArrayList(); lines.add("agi_callerid: \"John Doe\" <1234>"); request = agiRequestBuilder.buildAGIRequest(lines); assertEquals("incorrect callerId", "1234", request.getCallerId()); assertEquals("incorrect callerIdName", "John Doe", request.getCallerIdName()); } public void testBuildAGIRequestWithoutCallerId() { Collection lines; AGIRequest request; lines = new ArrayList(); lines.add("agi_callerid: "); request = agiRequestBuilder.buildAGIRequest(lines); assertNull("callerId must not be set", request.getCallerId()); assertNull("callerIdName must not be set", request.getCallerIdName()); } public void testBuildAGIRequestWithNullEnvironment() { try { agiRequestBuilder.buildAGIRequest(null); fail("No IllegalArgumentException thrown."); } catch (IllegalArgumentException e) { } } public void testBuildAGIRequestWithUnusualInput() { Collection lines; AGIRequest request; lines = new ArrayList(); lines.add("var without agi prefix: a value"); lines.add("agi_without_colon: another value"); lines.add("agi_without_space_after_colon:"); lines.add("agi_channel: SIP/1234-a892"); request = agiRequestBuilder.buildAGIRequest(lines); assertEquals("incorrect channel", "SIP/1234-a892", request.getChannel()); } } |
From: Stefan R. <sr...@us...> - 2005-03-05 22:46:29
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/fastagi/command In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23987/src/java/net/sf/asterisk/fastagi/command Log Message: Directory /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/fastagi/command added to the repository |
From: Stefan R. <sr...@us...> - 2005-03-05 22:46:29
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/fastagi In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23987/src/java/net/sf/asterisk/fastagi Log Message: Directory /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/fastagi added to the repository |
From: Stefan R. <sr...@us...> - 2005-03-05 22:46:29
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/fastagi/command In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23987/src/test/net/sf/asterisk/fastagi/command Log Message: Directory /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/fastagi/command added to the repository |
From: Stefan R. <sr...@us...> - 2005-03-05 22:46:29
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/fastagi In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23987/src/test/net/sf/asterisk/fastagi Log Message: Directory /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/fastagi added to the repository |
From: Stefan R. <sr...@us...> - 2005-03-05 13:34:39
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20712/src/java/net/sf/asterisk/manager Modified Files: ManagerReader.java ResponseBuilder.java ActionBuilder.java ManagerWriterImpl.java EventBuilder.java ManagerWriter.java ManagerReaderImpl.java Added Files: ResponseBuilderImpl.java ActionBuilderImpl.java EventBuilderImpl.java Log Message: Refactored (Action|Event|Response)Builder into interfaces --- NEW FILE: ResponseBuilderImpl.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import java.util.Map; import net.sf.asterisk.manager.response.ChallengeResponse; import net.sf.asterisk.manager.response.ExtensionStateResponse; import net.sf.asterisk.manager.response.MailboxCountResponse; import net.sf.asterisk.manager.response.MailboxStatusResponse; import net.sf.asterisk.manager.response.ManagerError; import net.sf.asterisk.manager.response.ManagerResponse; /** * Default implementation of the ResponseBuilder interface. * * @see net.sf.asterisk.manager.response.ManagerResponse * @author srt * @version $Id: ResponseBuilderImpl.java,v 1.1 2005/03/05 13:34:23 srt Exp $ */ public class ResponseBuilderImpl implements ResponseBuilder { /** * Constructs an instance of ManagerResponse based on a map of attributes. * * @param attributes the attributes and their values. The keys of this map must be all lower * case. * @return the response with the given attributes. */ public ManagerResponse buildResponse(final Map attributes) { ManagerResponse response; String responseType; responseType = (String) attributes.get("response"); // determine type if ("error".equalsIgnoreCase(responseType)) { response = new ManagerError(); } else if (attributes.containsKey("challenge")) { ChallengeResponse challengeResponse = new ChallengeResponse(); challengeResponse.setChallenge((String) attributes.get("challenge")); response = challengeResponse; } else if (attributes.containsKey("mailbox") && attributes.containsKey("waiting")) { MailboxStatusResponse mailboxStatusResponse = new MailboxStatusResponse(); mailboxStatusResponse.setMailbox((String) attributes.get("mailbox")); if ("1".equals((String) attributes.get("waiting"))) { mailboxStatusResponse.setWaiting(Boolean.TRUE); } else { mailboxStatusResponse.setWaiting(Boolean.FALSE); } response = mailboxStatusResponse; } else if (attributes.containsKey("mailbox") && attributes.containsKey("newmessages") && attributes.containsKey("oldmessages")) { MailboxCountResponse mailboxCountResponse = new MailboxCountResponse(); mailboxCountResponse.setMailbox((String) attributes.get("mailbox")); mailboxCountResponse.setNewMessages(new Integer((String) attributes.get("newmessages"))); mailboxCountResponse.setOldMessages(new Integer((String) attributes.get("oldmessages"))); response = mailboxCountResponse; } else if (attributes.containsKey("exten") && attributes.containsKey("context") && attributes.containsKey("hint") && attributes.containsKey("status")) { ExtensionStateResponse extensionStateResponse = new ExtensionStateResponse(); extensionStateResponse.setExten((String) attributes.get("exten")); extensionStateResponse.setContext((String) attributes.get("context")); extensionStateResponse.setHint((String) attributes.get("hint")); extensionStateResponse.setStatus(new Integer((String) attributes.get("status"))); response = extensionStateResponse; } else { response = new ManagerResponse(); } // fill known attributes response.setResponse(responseType); if (attributes.containsKey("actionid")) { response.setActionId((String) attributes.get("actionid")); } if (attributes.containsKey("message")) { response.setMessage((String) attributes.get("message")); } if (attributes.containsKey("uniqueid")) { response.setUniqueId((String) attributes.get("uniqueid")); } return response; } } --- NEW FILE: ActionBuilderImpl.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.sf.asterisk.manager.action.ManagerAction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Default implementation of the ActionBuilder interface. * * @author srt * @version $Id: ActionBuilderImpl.java,v 1.1 2005/03/05 13:34:23 srt Exp $ */ public class ActionBuilderImpl implements ActionBuilder { /** * Instance logger. */ private final Log logger = LogFactory.getLog(getClass()); public final String buildAction(final ManagerAction action) { StringBuffer sb; Map getters; sb = new StringBuffer(); getters = getGetters(action.getClass()); Iterator i = getters.keySet().iterator(); while (i.hasNext()) { String name; Method getter; Object value; String stringValue; name = (String) i.next(); if ("class".equals(name)) { continue; } getter = (Method) getters.get(name); try { value = getter.invoke(action, new Object[]{}); } catch (IllegalAccessException ex) { logger.error("Unable to retrieve property '" + name + "' of " + action.getClass(), ex); continue; } catch (InvocationTargetException ex) { logger.error("Unable to retrieve property '" + name + "' of " + action.getClass(), ex); continue; } if (value == null) { continue; } if (value instanceof String) { stringValue = (String) value; } else { stringValue = value.toString(); } sb.append(name); sb.append(": "); sb.append(stringValue); sb.append("\r\n"); } sb.append("\r\n"); return sb.toString(); } /** * Returns a Map of getter methods of the given class.<br> * The key of the map contains the name of the attribute that can be accessed by the getter, the * value the getter itself (an instance of java.lang.reflect.Method). A method is considered a * getter if its name starts with "get", it is declared public and takes no arguments. * * @param clazz the class to return the getters for * @return a Map of attributes and their accessor methods (getters) */ private Map getGetters(final Class clazz) { Map accessors = new HashMap(); Method[] methods = clazz.getMethods(); for (int i = 0; i < methods.length; i++) { String name; String methodName; Method method = methods[i]; methodName = method.getName(); if (!methodName.startsWith("get")) { continue; } // skip methods with != 0 parameters if (method.getParameterTypes().length != 0) { continue; } // ok seems to be an accessor name = methodName.substring("get".length()).toLowerCase(); if (name.length() == 0) { continue; } accessors.put(name, method); } return accessors; } } --- NEW FILE: EventBuilderImpl.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import net.sf.asterisk.manager.event.AgentCallbackLoginEvent; import net.sf.asterisk.manager.event.AgentCallbackLogoffEvent; import net.sf.asterisk.manager.event.AgentCalledEvent; import net.sf.asterisk.manager.event.AgentLoginEvent; import net.sf.asterisk.manager.event.AgentLogoffEvent; import net.sf.asterisk.manager.event.AlarmClearEvent; import net.sf.asterisk.manager.event.AlarmEvent; import net.sf.asterisk.manager.event.CdrEvent; import net.sf.asterisk.manager.event.DialEvent; import net.sf.asterisk.manager.event.ExtensionStatusEvent; import net.sf.asterisk.manager.event.HangupEvent; import net.sf.asterisk.manager.event.HoldedCallEvent; import net.sf.asterisk.manager.event.JoinEvent; import net.sf.asterisk.manager.event.LeaveEvent; import net.sf.asterisk.manager.event.LinkEvent; import net.sf.asterisk.manager.event.ManagerEvent; import net.sf.asterisk.manager.event.MeetMeJoinEvent; import net.sf.asterisk.manager.event.MeetMeLeaveEvent; import net.sf.asterisk.manager.event.MessageWaitingEvent; import net.sf.asterisk.manager.event.NewCallerIdEvent; 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.OriginateFailureEvent; import net.sf.asterisk.manager.event.OriginateSuccessEvent; import net.sf.asterisk.manager.event.ParkedCallEvent; import net.sf.asterisk.manager.event.ParkedCallsCompleteEvent; import net.sf.asterisk.manager.event.PeerStatusEvent; import net.sf.asterisk.manager.event.QueueEntryEvent; import net.sf.asterisk.manager.event.QueueMemberEvent; import net.sf.asterisk.manager.event.QueueMemberStatusEvent; import net.sf.asterisk.manager.event.QueueParamsEvent; import net.sf.asterisk.manager.event.RegistryEvent; import net.sf.asterisk.manager.event.ReloadEvent; import net.sf.asterisk.manager.event.RenameEvent; import net.sf.asterisk.manager.event.ResponseEvent; import net.sf.asterisk.manager.event.ShutdownEvent; 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.event.ZapShowChannelsCompleteEvent; import net.sf.asterisk.manager.event.ZapShowChannelsEvent; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * Default implementation of the EventBuilder interface. * * @see net.sf.asterisk.manager.event.ManagerEvent * @author srt * @version $Id: EventBuilderImpl.java,v 1.1 2005/03/05 13:34:23 srt Exp $ */ public class EventBuilderImpl implements EventBuilder { private final Log logger = LogFactory.getLog(getClass()); private Map registeredEventClasses; public EventBuilderImpl() { this.registeredEventClasses = new HashMap(); registerBuiltinEventClasses(); } private void registerBuiltinEventClasses() { registerEventClass(AgentCallbackLoginEvent.class); registerEventClass(AgentCallbackLogoffEvent.class); registerEventClass(AgentCalledEvent.class); registerEventClass(AgentLoginEvent.class); registerEventClass(AgentLogoffEvent.class); registerEventClass(AlarmEvent.class); registerEventClass(AlarmClearEvent.class); registerEventClass(CdrEvent.class); registerEventClass(DialEvent.class); registerEventClass(ExtensionStatusEvent.class); registerEventClass(HangupEvent.class); registerEventClass(HoldedCallEvent.class); registerEventClass(JoinEvent.class); registerEventClass(LeaveEvent.class); registerEventClass(LinkEvent.class); registerEventClass(MeetMeJoinEvent.class); registerEventClass(MeetMeLeaveEvent.class); registerEventClass(MessageWaitingEvent.class); registerEventClass(NewCallerIdEvent.class); registerEventClass(NewChannelEvent.class); registerEventClass(NewExtenEvent.class); registerEventClass(NewStateEvent.class); registerEventClass(OriginateFailureEvent.class); registerEventClass(OriginateSuccessEvent.class); registerEventClass(ParkedCallEvent.class); registerEventClass(ParkedCallsCompleteEvent.class); registerEventClass(PeerStatusEvent.class); registerEventClass(QueueEntryEvent.class); registerEventClass(QueueMemberEvent.class); registerEventClass(QueueMemberStatusEvent.class); registerEventClass(QueueParamsEvent.class); registerEventClass(RegistryEvent.class); registerEventClass(ReloadEvent.class); registerEventClass(RenameEvent.class); registerEventClass(ShutdownEvent.class); registerEventClass(StatusEvent.class); registerEventClass(StatusCompleteEvent.class); registerEventClass(UnlinkEvent.class); registerEventClass(ZapShowChannelsEvent.class); registerEventClass(ZapShowChannelsCompleteEvent.class); } public void registerEventClass(Class clazz) { String className; String eventType; className = clazz.getName(); eventType = className.substring(className.lastIndexOf('.') + 1).toLowerCase(); if (eventType.endsWith("event")) { eventType = eventType.substring(0, eventType.length() - "event".length()); } registerEventClass(eventType, clazz); } /** * Registers a new event class for the event given by eventType. * * @param eventType the name of the event to register the class for. For example "Join". * @param clazz the event class to register, must extend net.sf.asterisk.manager.event.Event. */ public void registerEventClass(String eventType, Class clazz) { Constructor defaultConstructor; if (!ManagerEvent.class.isAssignableFrom(clazz)) { throw new IllegalArgumentException(clazz + " is not a ManagerEvent"); } if ((clazz.getModifiers() & Modifier.ABSTRACT) != 0) { throw new IllegalArgumentException(clazz + " is abstract"); } try { defaultConstructor = clazz.getConstructor(new Class[]{Object.class}); } catch (NoSuchMethodException ex) { throw new IllegalArgumentException(clazz + " has no usable constructor"); } if ((defaultConstructor.getModifiers() & Modifier.PUBLIC) == 0) { throw new IllegalArgumentException(clazz + " has no public default constructor"); } registeredEventClasses.put(eventType.toLowerCase(), clazz); logger.debug("Registered event type '" + eventType + "' (" + clazz + ")"); } public ManagerEvent buildEvent(Object source, Map attributes) { ManagerEvent event; String eventType; Class eventClass; Constructor constructor; if (attributes.get("event") == null) { logger.error("No event event type in properties"); return null; } eventType = ((String) attributes.get("event")).toLowerCase(); eventClass = (Class) registeredEventClasses.get(eventType); if (eventClass == null) { logger.warn("No event class registered for event type '" + eventType + "', attributes: " + attributes); return null; } try { constructor = eventClass.getConstructor(new Class[]{Object.class}); } catch (NoSuchMethodException ex) { logger.error("Unable to get constructor of " + eventClass, ex); return null; } try { event = (ManagerEvent) constructor.newInstance(new Object[]{source}); } catch (Exception ex) { logger.error("Unable to create new instance of " + eventClass, ex); return null; } setAttributes(event, attributes); if (event instanceof ResponseEvent) { ResponseEvent responseEvent; String actionId; responseEvent = (ResponseEvent) event; actionId = responseEvent.getActionId(); if (actionId != null) { responseEvent.setActionId(Util.stripInternalActionId(actionId)); } } return event; } private void setAttributes(ManagerEvent event, Map attributes) { Map setters; setters = getSetters(event.getClass()); Iterator i = attributes.keySet().iterator(); while (i.hasNext()) { String name; Object value; Class dataType; Method setter; name = (String) i.next(); if ("event".equals(name)) { continue; } /* * The source property needs special handling as it is already defined in * java.util.EventObject (the base class of ManagerEvent), so we have to translate it. */ if ("source".equals(name)) { setter = (Method) setters.get("src"); } else { setter = (Method) setters.get(name); } if (setter == null) { logger.error("Unable to set property '" + name + "' on " + event.getClass() + ": no setter"); continue; } dataType = setter.getParameterTypes()[0]; if (dataType.isAssignableFrom(String.class)) { value = attributes.get(name); } else { try { Constructor constructor = dataType.getConstructor(new Class[]{String.class}); value = constructor.newInstance(new Object[]{attributes.get(name)}); } catch (Exception e) { logger.error("Unable to convert value '" + attributes.get(name) + "' of property '" + name + "' on " + event.getClass() + " to required type " + dataType, e); continue; } } try { setter.invoke(event, new Object[]{value}); } catch (Exception e) { logger.error("Unable to set property '" + name + "' on " + event.getClass(), e); continue; } } } private Map getSetters(Class clazz) { Map accessors = new HashMap(); Method[] methods = clazz.getMethods(); for (int i = 0; i < methods.length; i++) { String name; String methodName; Method method = methods[i]; methodName = method.getName(); if (!methodName.startsWith("set")) { continue; } // skip methods with != 1 parameters if (method.getParameterTypes().length != 1) { continue; } // ok seems to be an accessor name = methodName.substring("set".length()).toLowerCase(); accessors.put(name, method); } return accessors; } } Index: ManagerReader.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ManagerReader.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -p -r1.7 -r1.8 --- ManagerReader.java 5 Mar 2005 01:39:51 -0000 1.7 +++ ManagerReader.java 5 Mar 2005 13:34:23 -0000 1.8 @@ -21,7 +21,7 @@ import net.sf.asterisk.manager.io.Socket /** * The ManagerReader reads events and responses from the asterisk server, parses them using - * EventBuilder and ResponseBuilder and dispatches them to the associated ManagerConnection.<br> + * EventBuilderImpl and ResponseBuilder and dispatches them to the associated ManagerConnection.<br> * This class is intended to be used only by the DefaultManagerConnection. * * @see net.sf.asterisk.manager.EventBuilder @@ -43,7 +43,7 @@ interface ManagerReader extends Runnable void setSocket(final SocketConnectionFacade socket); /** - * Registers a new event type with the underlying EventBuilder.<br> + * Registers a new event type with the underlying EventBuilderImpl.<br> * The eventClass must extend ManagerEvent. * * @see EventBuilder Index: ResponseBuilder.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ResponseBuilder.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ResponseBuilder.java 1 Mar 2005 19:25:35 -0000 1.1 +++ ResponseBuilder.java 5 Mar 2005 13:34:23 -0000 1.2 @@ -18,11 +18,6 @@ package net.sf.asterisk.manager; import java.util.Map; -import net.sf.asterisk.manager.response.ChallengeResponse; -import net.sf.asterisk.manager.response.ExtensionStateResponse; -import net.sf.asterisk.manager.response.MailboxCountResponse; -import net.sf.asterisk.manager.response.MailboxStatusResponse; -import net.sf.asterisk.manager.response.ManagerError; import net.sf.asterisk.manager.response.ManagerResponse; /** @@ -32,8 +27,9 @@ import net.sf.asterisk.manager.response. * @author srt * @version $Id$ */ -public class ResponseBuilder +public interface ResponseBuilder { + /** * Constructs an instance of ManagerResponse based on a map of attributes. * @@ -41,80 +37,5 @@ public class ResponseBuilder * case. * @return the response with the given attributes. */ - public ManagerResponse buildResponse(final Map attributes) - { - ManagerResponse response; - String responseType; - - responseType = (String) attributes.get("response"); - - // determine type - if ("error".equalsIgnoreCase(responseType)) - { - response = new ManagerError(); - } - else if (attributes.containsKey("challenge")) - { - ChallengeResponse challengeResponse = new ChallengeResponse(); - challengeResponse.setChallenge((String) attributes.get("challenge")); - response = challengeResponse; - } - else if (attributes.containsKey("mailbox") && attributes.containsKey("waiting")) - { - MailboxStatusResponse mailboxStatusResponse = new MailboxStatusResponse(); - mailboxStatusResponse.setMailbox((String) attributes.get("mailbox")); - - if ("1".equals((String) attributes.get("waiting"))) - { - mailboxStatusResponse.setWaiting(Boolean.TRUE); - } - else - { - mailboxStatusResponse.setWaiting(Boolean.FALSE); - } - - response = mailboxStatusResponse; - } - else if (attributes.containsKey("mailbox") && attributes.containsKey("newmessages") - && attributes.containsKey("oldmessages")) - { - MailboxCountResponse mailboxCountResponse = new MailboxCountResponse(); - mailboxCountResponse.setMailbox((String) attributes.get("mailbox")); - mailboxCountResponse.setNewMessages(new Integer((String) attributes.get("newmessages"))); - mailboxCountResponse.setOldMessages(new Integer((String) attributes.get("oldmessages"))); - response = mailboxCountResponse; - } - else if (attributes.containsKey("exten") && attributes.containsKey("context") && attributes.containsKey("hint") - && attributes.containsKey("status")) - { - ExtensionStateResponse extensionStateResponse = new ExtensionStateResponse(); - extensionStateResponse.setExten((String) attributes.get("exten")); - extensionStateResponse.setContext((String) attributes.get("context")); - extensionStateResponse.setHint((String) attributes.get("hint")); - extensionStateResponse.setStatus(new Integer((String) attributes.get("status"))); - response = extensionStateResponse; - } - else - { - response = new ManagerResponse(); - } - - // fill known attributes - response.setResponse(responseType); - - if (attributes.containsKey("actionid")) - { - response.setActionId((String) attributes.get("actionid")); - } - if (attributes.containsKey("message")) - { - response.setMessage((String) attributes.get("message")); - } - if (attributes.containsKey("uniqueid")) - { - response.setUniqueId((String) attributes.get("uniqueid")); - } - - return response; - } + ManagerResponse buildResponse(Map attributes); } Index: ActionBuilder.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ActionBuilder.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -p -r1.4 -r1.5 --- ActionBuilder.java 25 Feb 2005 23:34:52 -0000 1.4 +++ ActionBuilder.java 5 Mar 2005 13:34:23 -0000 1.5 @@ -16,17 +16,8 @@ */ package net.sf.asterisk.manager; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - import net.sf.asterisk.manager.action.ManagerAction; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - /** * Transforms ManagerActions to Strings suitable to be sent to Asterisk.<br> * The attributes are determined using reflection. @@ -34,14 +25,9 @@ import org.apache.commons.logging.LogFac * @author srt * @version $Id$ */ -public class ActionBuilder +public interface ActionBuilder { /** - * Instance logger. - */ - private final Log logger = LogFactory.getLog(getClass()); - - /** * Builds a String suitable to be sent to Asterisk based on the given action object.<br> * Asterisk actions consist of an unordered set of key value pairs corresponding to the * attributes of the ManagerActions. Key and value are separated by a colon (":"), key value @@ -50,112 +36,5 @@ public class ActionBuilder * @param action the action to transform * @return a String representing the given action in an asterisk compatible format */ - public final String buildAction(final ManagerAction action) - { - StringBuffer sb; - Map getters; - - sb = new StringBuffer(); - getters = getGetters(action.getClass()); - - Iterator i = getters.keySet().iterator(); - while (i.hasNext()) - { - String name; - Method getter; - Object value; - String stringValue; - - name = (String) i.next(); - - if ("class".equals(name)) - { - continue; - } - - getter = (Method) getters.get(name); - try - { - value = getter.invoke(action, new Object[]{}); - } - catch (IllegalAccessException ex) - { - logger.error("Unable to retrieve property '" + name + "' of " + action.getClass(), ex); - continue; - } - catch (InvocationTargetException ex) - { - logger.error("Unable to retrieve property '" + name + "' of " + action.getClass(), ex); - continue; - } - - if (value == null) - { - continue; - } - - if (value instanceof String) - { - stringValue = (String) value; - } - else - { - stringValue = value.toString(); - } - - sb.append(name); - sb.append(": "); - sb.append(stringValue); - sb.append("\r\n"); - } - - sb.append("\r\n"); - return sb.toString(); - } - - /** - * Returns a Map of getter methods of the given class.<br> - * The key of the map contains the name of the attribute that can be accessed by the getter, the - * value the getter itself (an instance of java.lang.reflect.Method). A method is considered a - * getter if its name starts with "get", it is declared public and takes no arguments. - * - * @param clazz the class to return the getters for - * @return a Map of attributes and their accessor methods (getters) - */ - private Map getGetters(final Class clazz) - { - Map accessors = new HashMap(); - Method[] methods = clazz.getMethods(); - - for (int i = 0; i < methods.length; i++) - { - String name; - String methodName; - Method method = methods[i]; - - methodName = method.getName(); - if (!methodName.startsWith("get")) - { - continue; - } - - // skip methods with != 0 parameters - if (method.getParameterTypes().length != 0) - { - continue; - } - - // ok seems to be an accessor - name = methodName.substring("get".length()).toLowerCase(); - - if (name.length() == 0) - { - continue; - } - - accessors.put(name, method); - } - - return accessors; - } + String buildAction(final ManagerAction action); } Index: ManagerWriterImpl.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ManagerWriterImpl.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -p -r1.2 -r1.3 --- ManagerWriterImpl.java 5 Mar 2005 04:18:52 -0000 1.2 +++ ManagerWriterImpl.java 5 Mar 2005 13:34:23 -0000 1.3 @@ -50,7 +50,7 @@ class ManagerWriterImpl implements Manag */ ManagerWriterImpl() { - this.actionBuilder = new ActionBuilder(); + this.actionBuilder = new ActionBuilderImpl(); } public synchronized void setSocket(final SocketConnectionFacade socket) Index: EventBuilder.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/EventBuilder.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -p -r1.7 -r1.8 --- EventBuilder.java 2 Mar 2005 18:35:38 -0000 1.7 +++ EventBuilder.java 5 Mar 2005 13:34:23 -0000 1.8 @@ -16,58 +16,9 @@ */ package net.sf.asterisk.manager; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Iterator; import java.util.Map; -import net.sf.asterisk.manager.event.AgentCallbackLoginEvent; -import net.sf.asterisk.manager.event.AgentCallbackLogoffEvent; -import net.sf.asterisk.manager.event.AgentCalledEvent; -import net.sf.asterisk.manager.event.AgentLoginEvent; -import net.sf.asterisk.manager.event.AgentLogoffEvent; -import net.sf.asterisk.manager.event.AlarmClearEvent; -import net.sf.asterisk.manager.event.AlarmEvent; -import net.sf.asterisk.manager.event.CdrEvent; -import net.sf.asterisk.manager.event.DialEvent; -import net.sf.asterisk.manager.event.ExtensionStatusEvent; -import net.sf.asterisk.manager.event.HangupEvent; -import net.sf.asterisk.manager.event.HoldedCallEvent; -import net.sf.asterisk.manager.event.JoinEvent; -import net.sf.asterisk.manager.event.LeaveEvent; -import net.sf.asterisk.manager.event.LinkEvent; import net.sf.asterisk.manager.event.ManagerEvent; -import net.sf.asterisk.manager.event.MeetMeJoinEvent; -import net.sf.asterisk.manager.event.MeetMeLeaveEvent; -import net.sf.asterisk.manager.event.MessageWaitingEvent; -import net.sf.asterisk.manager.event.NewCallerIdEvent; -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.OriginateFailureEvent; -import net.sf.asterisk.manager.event.OriginateSuccessEvent; -import net.sf.asterisk.manager.event.ParkedCallEvent; -import net.sf.asterisk.manager.event.ParkedCallsCompleteEvent; -import net.sf.asterisk.manager.event.PeerStatusEvent; -import net.sf.asterisk.manager.event.QueueEntryEvent; -import net.sf.asterisk.manager.event.QueueMemberEvent; -import net.sf.asterisk.manager.event.QueueMemberStatusEvent; -import net.sf.asterisk.manager.event.QueueParamsEvent; -import net.sf.asterisk.manager.event.RegistryEvent; -import net.sf.asterisk.manager.event.ReloadEvent; -import net.sf.asterisk.manager.event.RenameEvent; -import net.sf.asterisk.manager.event.ResponseEvent; -import net.sf.asterisk.manager.event.ShutdownEvent; -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.event.ZapShowChannelsCompleteEvent; -import net.sf.asterisk.manager.event.ZapShowChannelsEvent; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; /** * Transforms maps of attributes to instances of ManagerEvent. @@ -76,60 +27,8 @@ import org.apache.commons.logging.LogFac * @author srt * @version $Id$ */ -public class EventBuilder +public interface EventBuilder { - private final Log logger = LogFactory.getLog(getClass()); - private Map registeredEventClasses; - - public EventBuilder() - { - this.registeredEventClasses = new HashMap(); - registerBuiltinEventClasses(); - } - - private void registerBuiltinEventClasses() - { - registerEventClass(AgentCallbackLoginEvent.class); - registerEventClass(AgentCallbackLogoffEvent.class); - registerEventClass(AgentCalledEvent.class); - registerEventClass(AgentLoginEvent.class); - registerEventClass(AgentLogoffEvent.class); - registerEventClass(AlarmEvent.class); - registerEventClass(AlarmClearEvent.class); - registerEventClass(CdrEvent.class); - registerEventClass(DialEvent.class); - registerEventClass(ExtensionStatusEvent.class); - registerEventClass(HangupEvent.class); - registerEventClass(HoldedCallEvent.class); - registerEventClass(JoinEvent.class); - registerEventClass(LeaveEvent.class); - registerEventClass(LinkEvent.class); - registerEventClass(MeetMeJoinEvent.class); - registerEventClass(MeetMeLeaveEvent.class); - registerEventClass(MessageWaitingEvent.class); - registerEventClass(NewCallerIdEvent.class); - registerEventClass(NewChannelEvent.class); - registerEventClass(NewExtenEvent.class); - registerEventClass(NewStateEvent.class); - registerEventClass(OriginateFailureEvent.class); - registerEventClass(OriginateSuccessEvent.class); - registerEventClass(ParkedCallEvent.class); - registerEventClass(ParkedCallsCompleteEvent.class); - registerEventClass(PeerStatusEvent.class); - registerEventClass(QueueEntryEvent.class); - registerEventClass(QueueMemberEvent.class); - registerEventClass(QueueMemberStatusEvent.class); - registerEventClass(QueueParamsEvent.class); - registerEventClass(RegistryEvent.class); - registerEventClass(ReloadEvent.class); - registerEventClass(RenameEvent.class); - registerEventClass(ShutdownEvent.class); - registerEventClass(StatusEvent.class); - registerEventClass(StatusCompleteEvent.class); - registerEventClass(UnlinkEvent.class); - registerEventClass(ZapShowChannelsEvent.class); - registerEventClass(ZapShowChannelsCompleteEvent.class); - } /** * Registers a new event class. The event this class is registered for is simply derived from @@ -139,221 +38,7 @@ public class EventBuilder * * @param clazz the event class to register, must extend net.sf.asterisk.manager.event.Event. */ - public void registerEventClass(Class clazz) - { - String className; - String eventType; - - className = clazz.getName(); - eventType = className.substring(className.lastIndexOf('.') + 1).toLowerCase(); - - if (eventType.endsWith("event")) - { - eventType = eventType.substring(0, eventType.length() - "event".length()); - } - - registerEventClass(eventType, clazz); - } - - /** - * Registers a new event class for the event given by eventType. - * - * @param eventType the name of the event to register the class for. For example "Join". - * @param clazz the event class to register, must extend net.sf.asterisk.manager.event.Event. - */ - public void registerEventClass(String eventType, Class clazz) - { - Constructor defaultConstructor; - - if (!ManagerEvent.class.isAssignableFrom(clazz)) - { - throw new IllegalArgumentException(clazz + " is not a ManagerEvent"); - } - - if ((clazz.getModifiers() & Modifier.ABSTRACT) != 0) - { - throw new IllegalArgumentException(clazz + " is abstract"); - } - - try - { - defaultConstructor = clazz.getConstructor(new Class[]{Object.class}); - } - catch (NoSuchMethodException ex) - { - throw new IllegalArgumentException(clazz + " has no usable constructor"); - } - - if ((defaultConstructor.getModifiers() & Modifier.PUBLIC) == 0) - { - throw new IllegalArgumentException(clazz + " has no public default constructor"); - } - - registeredEventClasses.put(eventType.toLowerCase(), clazz); - - logger.debug("Registered event type '" + eventType + "' (" + clazz + ")"); - } - - public ManagerEvent buildEvent(Object source, Map attributes) - { - ManagerEvent event; - String eventType; - Class eventClass; - Constructor constructor; - - if (attributes.get("event") == null) - { - logger.error("No event event type in properties"); - return null; - } - - eventType = ((String) attributes.get("event")).toLowerCase(); - eventClass = (Class) registeredEventClasses.get(eventType); - if (eventClass == null) - { - logger.warn("No event class registered for event type '" + eventType + "', attributes: " + attributes); - return null; - } - - try - { - constructor = eventClass.getConstructor(new Class[]{Object.class}); - } - catch (NoSuchMethodException ex) - { - logger.error("Unable to get constructor of " + eventClass, ex); - return null; - } - - try - { - event = (ManagerEvent) constructor.newInstance(new Object[]{source}); - } - catch (Exception ex) - { - logger.error("Unable to create new instance of " + eventClass, ex); - return null; - } - - setAttributes(event, attributes); - - if (event instanceof ResponseEvent) - { - ResponseEvent responseEvent; - String actionId; - - responseEvent = (ResponseEvent) event; - actionId = responseEvent.getActionId(); - if (actionId != null) - { - responseEvent.setActionId(Util.stripInternalActionId(actionId)); - } - } - - return event; - } - - private void setAttributes(ManagerEvent event, Map attributes) - { - Map setters; - - setters = getSetters(event.getClass()); - - Iterator i = attributes.keySet().iterator(); - while (i.hasNext()) - { - String name; - Object value; - Class dataType; - Method setter; - - name = (String) i.next(); - - if ("event".equals(name)) - { - continue; - } - - /* - * The source property needs special handling as it is already defined in - * java.util.EventObject (the base class of ManagerEvent), so we have to translate it. - */ - if ("source".equals(name)) - { - setter = (Method) setters.get("src"); - } - else - { - setter = (Method) setters.get(name); - } - - if (setter == null) - { - logger.error("Unable to set property '" + name + "' on " + event.getClass() + ": no setter"); - continue; - } - - dataType = setter.getParameterTypes()[0]; - - if (dataType.isAssignableFrom(String.class)) - { - value = attributes.get(name); - } - else - { - try - { - Constructor constructor = dataType.getConstructor(new Class[]{String.class}); - value = constructor.newInstance(new Object[]{attributes.get(name)}); - } - catch (Exception e) - { - logger.error("Unable to convert value '" + attributes.get(name) + "' of property '" + name - + "' on " + event.getClass() + " to required type " + dataType, e); - continue; - } - } - - try - { - setter.invoke(event, new Object[]{value}); - } - catch (Exception e) - { - logger.error("Unable to set property '" + name + "' on " + event.getClass(), e); - continue; - } - } - } - - private Map getSetters(Class clazz) - { - Map accessors = new HashMap(); - Method[] methods = clazz.getMethods(); - - for (int i = 0; i < methods.length; i++) - { - String name; - String methodName; - Method method = methods[i]; - - methodName = method.getName(); - if (!methodName.startsWith("set")) - { - continue; - } - - // skip methods with != 1 parameters - if (method.getParameterTypes().length != 1) - { - continue; - } - - // ok seems to be an accessor - name = methodName.substring("set".length()).toLowerCase(); - accessors.put(name, method); - } + void registerEventClass(Class clazz); - return accessors; - } + ManagerEvent buildEvent(Object source, Map attributes); } Index: ManagerWriter.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ManagerWriter.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ManagerWriter.java 2 Mar 2005 23:15:49 -0000 1.1 +++ ManagerWriter.java 5 Mar 2005 13:34:23 -0000 1.2 @@ -22,7 +22,7 @@ import net.sf.asterisk.manager.action.Ma import net.sf.asterisk.manager.io.SocketConnectionFacade; /** - * The ManagerWriter transforms actions using the ActionBuilder and sends them to the asterisk + * The ManagerWriter transforms actions using an ActionBuilder and sends them to the asterisk * server.<br> * This class is intended to be used only by the DefaultManagerConnection. * Index: ManagerReaderImpl.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ManagerReaderImpl.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -p -r1.2 -r1.3 --- ManagerReaderImpl.java 5 Mar 2005 01:39:51 -0000 1.2 +++ ManagerReaderImpl.java 5 Mar 2005 13:34:23 -0000 1.3 @@ -80,6 +80,7 @@ class ManagerReaderImpl implements Manag /** * Creates a new ManagerReaderImpl. + * * @param dispatcher the dispatcher to use for dispatching events and responses. */ ManagerReaderImpl(final Dispatcher dispatcher, AsteriskServer asteriskServer) @@ -87,19 +88,20 @@ class ManagerReaderImpl implements Manag this.dispatcher = dispatcher; this.asteriskServer = asteriskServer; - this.eventBuilder = new EventBuilder(); - this.responseBuilder = new ResponseBuilder(); + this.eventBuilder = new EventBuilderImpl(); + this.responseBuilder = new ResponseBuilderImpl(); } /** * Sets the socket to use for reading from the asterisk server. + * * @param socket the socket to use for reading from the asterisk server. */ public void setSocket(final SocketConnectionFacade socket) { this.socket = socket; } - + public void registerEventClass(Class eventClass) { eventBuilder.registerEventClass(eventClass); |
From: Stefan R. <sr...@us...> - 2005-03-05 13:34:35
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20712/src/test/net/sf/asterisk/manager Added Files: ResponseBuilderImplTest.java ActionBuilderImplTest.java EventBuilderImplTest.java Removed Files: ResponseBuilderTest.java EventBuilderTest.java ActionBuilderTest.java Log Message: Refactored (Action|Event|Response)Builder into interfaces --- NEW FILE: ResponseBuilderImplTest.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import java.util.HashMap; import java.util.Map; import net.sf.asterisk.manager.response.ChallengeResponse; import net.sf.asterisk.manager.response.ExtensionStateResponse; import net.sf.asterisk.manager.response.MailboxCountResponse; import net.sf.asterisk.manager.response.MailboxStatusResponse; import net.sf.asterisk.manager.response.ManagerError; import net.sf.asterisk.manager.response.ManagerResponse; import junit.framework.TestCase; public class ResponseBuilderImplTest extends TestCase { private ResponseBuilder responseBuilder; private Map attributes; public void setUp() { this.responseBuilder = new ResponseBuilderImpl(); this.attributes = new HashMap(); } public void testBuildResponse() { ManagerResponse response; attributes.put("response", "Success"); response = responseBuilder.buildResponse(attributes); assertEquals("Response of wrong type", ManagerResponse.class, response.getClass()); assertEquals("Response not set correctly", "Success", response.getResponse()); } public void testBuildError() { ManagerResponse response; attributes.put("response", "Error"); attributes.put("message", "Missing action in request"); response = responseBuilder.buildResponse(attributes); assertEquals("Response of wrong type", ManagerError.class, response.getClass()); assertEquals("Message not set correctly", "Missing action in request", response.getMessage()); } public void testBuildErrorWithActionId() { ManagerResponse response; attributes.put("response", "Error"); attributes.put("actionid", "1234"); attributes.put("message", "Missing action in request"); response = responseBuilder.buildResponse(attributes); assertEquals("ActionId not set correctly", "1234", response.getActionId()); } public void testBuildChallengeResponse() { ManagerResponse response; attributes.put("response", "Success"); attributes.put("challenge", "131494410"); response = responseBuilder.buildResponse(attributes); assertEquals("Response of wrong type", ChallengeResponse.class, response.getClass()); assertEquals("Challenge not set correctly", "131494410", ((ChallengeResponse) response).getChallenge()); } public void testBuildMailboxStatusResponse() { ManagerResponse response; attributes.put("response", "Success"); attributes.put("message", "Mailbox Status"); attributes.put("mailbox", "123"); attributes.put("waiting", "1"); response = responseBuilder.buildResponse(attributes); assertEquals("Response of wrong type", MailboxStatusResponse.class, response.getClass()); MailboxStatusResponse mailboxStatusResponse = (MailboxStatusResponse) response; assertEquals("Mailbox not set correctly", "123", mailboxStatusResponse.getMailbox()); assertEquals("Waiting not set correctly", Boolean.TRUE, mailboxStatusResponse.getWaiting()); } public void testBuildMailboxStatusResponseWithNoWaiting() { ManagerResponse response; attributes.put("response", "Success"); attributes.put("message", "Mailbox Status"); attributes.put("mailbox", "123,user2"); attributes.put("waiting", "0"); response = responseBuilder.buildResponse(attributes); assertEquals("Response of wrong type", MailboxStatusResponse.class, response.getClass()); MailboxStatusResponse mailboxStatusResponse = (MailboxStatusResponse) response; assertEquals("Mailbox not set correctly", "123,user2", mailboxStatusResponse.getMailbox()); assertEquals("Waiting not set correctly", Boolean.FALSE, mailboxStatusResponse.getWaiting()); } public void testBuildMailboxCountResponse() { ManagerResponse response; attributes.put("response", "Success"); attributes.put("message", "Mailbox Message Count"); attributes.put("mailbox", "123@myctx"); attributes.put("newmessages", "2"); attributes.put("oldmessages", "5"); response = responseBuilder.buildResponse(attributes); assertEquals("Response of wrong type", MailboxCountResponse.class, response.getClass()); MailboxCountResponse mailboxCountResponse = (MailboxCountResponse) response; assertEquals("Mailbox not set correctly", "123@myctx", mailboxCountResponse.getMailbox()); assertEquals("New messages not set correctly", new Integer(2), mailboxCountResponse.getNewMessages()); assertEquals("Old messages set correctly", new Integer(5), mailboxCountResponse.getOldMessages()); } public void testBuildExtensionStateResponse() { ManagerResponse response; attributes.put("response", "Success"); attributes.put("message", "Extension Status"); attributes.put("exten", "1"); attributes.put("context", "default"); attributes.put("hint", ""); attributes.put("status", "-1"); response = responseBuilder.buildResponse(attributes); assertEquals("Response of wrong type", ExtensionStateResponse.class, response.getClass()); ExtensionStateResponse extensionStateResponse = (ExtensionStateResponse) response; assertEquals("Exten not set correctly", "1", extensionStateResponse.getExten()); assertEquals("Context not set correctly", "default", extensionStateResponse.getContext()); assertEquals("Hint not set correctly", "", extensionStateResponse.getHint()); assertEquals("Status not set correctly", new Integer(-1), extensionStateResponse.getStatus()); } } --- NEW FILE: ActionBuilderImplTest.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import junit.framework.TestCase; import net.sf.asterisk.manager.action.ManagerAction; public class ActionBuilderImplTest extends TestCase { private ActionBuilder actionBuilder; public void setUp() { this.actionBuilder = new ActionBuilderImpl(); } public void testBuildAction() { MyAction myAction; String actual; myAction = new MyAction(); myAction.setFirstProperty("first value"); myAction.setSecondProperty(new Integer(2)); myAction.setNonPublicProperty("private"); actual = actionBuilder.buildAction(myAction); assertTrue("Action name missing", actual.indexOf("action: My\r\n") >= 0); assertTrue("First property missing", actual.indexOf("firstproperty: first value\r\n") >= 0); assertTrue("Second property missing", actual.indexOf("secondproperty: 2\r\n") >= 0); assertTrue("Missing trailing CRNL CRNL", actual.endsWith("\r\n\r\n")); assertEquals("Incorrect length", 61, actual.length()); } public void testBuildActionWithNullValue() { MyAction myAction; String actual; myAction = new MyAction(); myAction.setFirstProperty("first value"); actual = actionBuilder.buildAction(myAction); assertTrue("Action name missing", actual.indexOf("action: My\r\n") >= 0); assertTrue("First property missing", actual.indexOf("firstproperty: first value\r\n") >= 0); assertTrue("Missing trailing CRNL CRNL", actual.endsWith("\r\n\r\n")); assertEquals("Incorrect length", 42, actual.length()); } class MyAction extends ManagerAction { private static final long serialVersionUID = 3257568425345102641L; private String firstProperty; private Integer secondProperty; private String nonPublicProperty; public String getAction() { return "My"; } public String getFirstProperty() { return firstProperty; } public void setFirstProperty(String firstProperty) { this.firstProperty = firstProperty; } public Integer getSecondProperty() { return secondProperty; } public void setSecondProperty(Integer secondProperty) { this.secondProperty = secondProperty; } protected String getNonPublicProperty() { return nonPublicProperty; } protected void setNonPublicProperty(String privateProperty) { this.nonPublicProperty = privateProperty; } public String get() { return "This method must not be considered a getter"; } public String getIndexedProperty(int i) { return "This method must not be considered a getter relevant for building the action"; } } } --- NEW FILE: EventBuilderImplTest.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import java.util.HashMap; import java.util.Map; import junit.framework.TestCase; import net.sf.asterisk.manager.event.CdrEvent; import net.sf.asterisk.manager.event.ChannelEvent; import net.sf.asterisk.manager.event.ManagerEvent; import net.sf.asterisk.manager.event.NewChannelEvent; import net.sf.asterisk.manager.event.NewExtenEvent; import net.sf.asterisk.manager.event.ResponseEvent; import net.sf.asterisk.manager.event.ShutdownEvent; import net.sf.asterisk.manager.event.StatusCompleteEvent; /** * @author srt * @version $Id: EventBuilderImplTest.java,v 1.1 2005/03/05 13:34:23 srt Exp $ */ public class EventBuilderImplTest extends TestCase { private EventBuilder eventBuilder; public void setUp() { this.eventBuilder = new EventBuilderImpl(); } public void testRegisterEvent() { eventBuilder.registerEventClass(NewChannelEvent.class); } public void testRegisterEventWithAbstractEvent() { try { eventBuilder.registerEventClass(ChannelEvent.class); fail("registerEvent() must not accept abstract classes"); } catch (IllegalArgumentException ex) { } } public void testRegisterEventWithWrongClass() { try { eventBuilder.registerEventClass(String.class); fail("registerEvent() must only accept subclasses of ManagerEvent"); } catch (IllegalArgumentException ex) { } } /* * public void testGetSetters() { Map setters; EventBuilderImpl eventBuilder = * getEventBuilder(); * * setters = eventBuilder.getSetters(NewChannelEvent.class); * * assertTrue("Setter not found", setters.containsKey("callerid")); } */ public void testBuildEventWithMixedCaseSetter() { Map properties = new HashMap(); String callerid = "1234"; NewChannelEvent event; properties.put("event", "Newchannel"); properties.put("callerid", callerid); event = (NewChannelEvent) eventBuilder.buildEvent(this, properties); assertNotNull(event); assertEquals("Returned event is of wrong type", NewChannelEvent.class, event.getClass()); assertEquals("String property not set correctly", callerid, event.getCallerId()); assertEquals("Source not set correctly", this, event.getSource()); } public void testBuildEventWithIntegerProperty() { Map properties = new HashMap(); String channel = "SIP/1234"; Integer priority = new Integer(1); NewExtenEvent event; properties.put("event", "newexten"); properties.put("channel", channel); properties.put("priority", priority.toString()); event = (NewExtenEvent) eventBuilder.buildEvent(this, properties); assertNotNull(event); assertEquals("Returned event is of wrong type", NewExtenEvent.class, event.getClass()); assertEquals("String property not set correctly", channel, event.getChannel()); assertEquals("Integer property not set correctly", priority, event.getPriority()); } public void testBuildEventWithBooleanProperty() { Map properties = new HashMap(); ShutdownEvent event; eventBuilder.registerEventClass(ShutdownEvent.class); properties.put("event", "shutdown"); properties.put("restart", "True"); event = (ShutdownEvent) eventBuilder.buildEvent(this, properties); assertNotNull(event); assertEquals("Returned event is of wrong type", ShutdownEvent.class, event.getClass()); assertEquals("Boolean property not set correctly", Boolean.TRUE, event.getRestart()); } public void testBuildEventWithUnregisteredEvent() { Map properties = new HashMap(); ManagerEvent event; properties.put("event", "Nonexisting"); event = eventBuilder.buildEvent(this, properties); assertNull(event); } public void testBuildEventWithEmptyAttributes() { Map properties = new HashMap(); ManagerEvent event; event = eventBuilder.buildEvent(this, properties); assertNull(event); } public void testBuildEventWithResponseEvent() { Map properties = new HashMap(); ManagerEvent event; properties.put("event", "StatusComplete"); properties.put("actionid", "1234-origId"); event = eventBuilder.buildEvent(this, properties); assertNotNull(event); assertEquals("Returned event is of wrong type", StatusCompleteEvent.class, event.getClass()); assertEquals("ActionId not set correctly", "origId", ((ResponseEvent) event).getActionId()); } public void testBuildEventWithSourceProperty() { Map properties = new HashMap(); ManagerEvent event; properties.put("event", "Cdr"); properties.put("source", "source value"); event = eventBuilder.buildEvent(this, properties); assertNotNull(event); assertEquals("Src property not set correctly", "source value", ((CdrEvent) event).getSrc()); } } --- ResponseBuilderTest.java DELETED --- --- EventBuilderTest.java DELETED --- --- ActionBuilderTest.java DELETED --- |
From: Stefan R. <sr...@us...> - 2005-03-05 04:19:04
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32475/src/java/net/sf/asterisk/manager Modified Files: ManagerWriterImpl.java Log Message: Renamed SocketConnectionFacade.print(String) to SocketConnectionFacade.write(String) Index: ManagerWriterImpl.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ManagerWriterImpl.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ManagerWriterImpl.java 2 Mar 2005 23:15:49 -0000 1.1 +++ ManagerWriterImpl.java 5 Mar 2005 04:18:52 -0000 1.2 @@ -69,7 +69,7 @@ class ManagerWriterImpl implements Manag actionString = actionBuilder.buildAction(action); - socket.print(actionString); + socket.write(actionString); socket.flush(); logger.debug("Sent " + action.getAction() + " action with actionId '" + action.getActionId() + "':\n" |
From: Stefan R. <sr...@us...> - 2005-03-05 04:19:04
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/io In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32475/src/java/net/sf/asterisk/manager/io Modified Files: SocketConnectionFacade.java SocketConnectionFacadeImpl.java Log Message: Renamed SocketConnectionFacade.print(String) to SocketConnectionFacade.write(String) Index: SocketConnectionFacade.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/io/SocketConnectionFacade.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- SocketConnectionFacade.java 2 Mar 2005 23:15:50 -0000 1.1 +++ SocketConnectionFacade.java 5 Mar 2005 04:18:53 -0000 1.2 @@ -22,7 +22,7 @@ public interface SocketConnectionFacade { String readLine() throws IOException; - void print(String s) throws IOException; + void write(String s) throws IOException; void flush() throws IOException; Index: SocketConnectionFacadeImpl.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/io/SocketConnectionFacadeImpl.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -p -r1.2 -r1.3 --- SocketConnectionFacadeImpl.java 5 Mar 2005 04:13:18 -0000 1.2 +++ SocketConnectionFacadeImpl.java 5 Mar 2005 04:18:53 -0000 1.3 @@ -41,7 +41,7 @@ public class SocketConnectionFacadeImpl return reader.readLine(); } - public void print(String s) throws IOException + public void write(String s) throws IOException { writer.write(s); } |
From: Stefan R. <sr...@us...> - 2005-03-05 04:19:04
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32475/src/test/net/sf/asterisk/manager Modified Files: ManagerWriterImplTest.java Log Message: Renamed SocketConnectionFacade.print(String) to SocketConnectionFacade.write(String) Index: ManagerWriterImplTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/ManagerWriterImplTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ManagerWriterImplTest.java 2 Mar 2005 23:15:50 -0000 1.1 +++ ManagerWriterImplTest.java 5 Mar 2005 04:18:53 -0000 1.2 @@ -51,7 +51,7 @@ public class ManagerWriterImplTest exten socketMC = MockControl.createControl(SocketConnectionFacade.class); socketConnectionFacade = (SocketConnectionFacade) socketMC.getMock(); - socketConnectionFacade.print("action: Status\r\n\r\n"); + socketConnectionFacade.write("action: Status\r\n\r\n"); socketConnectionFacade.flush(); socketMC.replay(); |
From: Stefan R. <sr...@us...> - 2005-03-05 04:15:42
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31518/src/java/net/sf/asterisk/manager Modified Files: DefaultManagerConnection.java Log Message: Added name to readerThread for better debugging (it's called ManagerReaderThread) Index: DefaultManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/DefaultManagerConnection.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -p -r1.8 -r1.9 --- DefaultManagerConnection.java 5 Mar 2005 01:39:51 -0000 1.8 +++ DefaultManagerConnection.java 5 Mar 2005 04:15:34 -0000 1.9 @@ -330,7 +330,7 @@ public class DefaultManagerConnection im this.socket = createSocket(); this.reader.setSocket(socket); - this.readerThread = new Thread(reader); + this.readerThread = new Thread(reader, "ManagerReaderThread"); this.readerThread.start(); this.writer.setSocket(socket); |
From: Stefan R. <sr...@us...> - 2005-03-05 04:13:28
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/io In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30717/src/java/net/sf/asterisk/manager/io Modified Files: SocketConnectionFacadeImpl.java Log Message: Changed PrintWriter to BufferedWriter Index: SocketConnectionFacadeImpl.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/io/SocketConnectionFacadeImpl.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- SocketConnectionFacadeImpl.java 2 Mar 2005 23:15:50 -0000 1.1 +++ SocketConnectionFacadeImpl.java 5 Mar 2005 04:13:18 -0000 1.2 @@ -17,23 +17,23 @@ package net.sf.asterisk.manager.io; import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; -import java.io.PrintWriter; import java.net.Socket; public class SocketConnectionFacadeImpl implements SocketConnectionFacade { private final Socket socket; private final BufferedReader reader; - private final PrintWriter writer; + private final BufferedWriter writer; public SocketConnectionFacadeImpl(String host, int port) throws IOException { this.socket = new Socket(host, port); this.reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); - this.writer = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream())); + this.writer = new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream())); } public String readLine() throws IOException @@ -43,7 +43,7 @@ public class SocketConnectionFacadeImpl public void print(String s) throws IOException { - writer.print(s); + writer.write(s); } public void flush() throws IOException |
From: Stefan R. <sr...@us...> - 2005-03-05 04:12:50
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30402/src/java/net/sf/asterisk/manager Modified Files: DefaultAsteriskManager.java Log Message: Fixed handleConnectEvent Index: DefaultAsteriskManager.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/DefaultAsteriskManager.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -p -r1.2 -r1.3 --- DefaultAsteriskManager.java 23 Feb 2005 22:50:57 -0000 1.2 +++ DefaultAsteriskManager.java 5 Mar 2005 04:12:39 -0000 1.3 @@ -66,6 +66,7 @@ public class DefaultAsteriskManager impl private boolean channelsInitialized; private boolean queuesInitialized; private boolean initialized; + private boolean loggedIn; public DefaultAsteriskManager() { @@ -76,6 +77,7 @@ public class DefaultAsteriskManager impl // TODO fix detection of queuesInitialized this.queuesInitialized = true; this.initialized = false; + this.loggedIn = false; } public void setManagerConnection(ManagerConnection connection) @@ -87,6 +89,8 @@ public class DefaultAsteriskManager impl { connection.addEventHandler(this); connection.login(); + + loggedIn = true; connection.sendAction(new StatusAction()); connection.sendAction(new QueueStatusAction()); } @@ -303,6 +307,12 @@ public class DefaultAsteriskManager impl */ protected void handleConnectEvent(ConnectEvent connectEvent) { + // first connect is no reconnect ;) + if (!loggedIn) + { + return; + } + try { connection.sendAction(new StatusAction()); |
From: Stefan R. <sr...@us...> - 2005-03-05 02:58:37
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14379/src/test/net/sf/asterisk/manager Modified Files: DefaultManagerConnectionTest.java Log Message: Fixed timing when checking for ManagerReader.run() being called Index: DefaultManagerConnectionTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/DefaultManagerConnectionTest.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -p -r1.5 -r1.6 --- DefaultManagerConnectionTest.java 5 Mar 2005 01:39:51 -0000 1.5 +++ DefaultManagerConnectionTest.java 5 Mar 2005 02:58:24 -0000 1.6 @@ -127,7 +127,10 @@ public class DefaultManagerConnectionTes assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); - // assertEquals("run() not called 1 time", 1, mockReader.runCalls); + // Some time for the reader thread to be started. Otherwise run() might not yet have been + // called. + Thread.sleep(10); + assertEquals("run() not called 1 time", 1, mockReader.runCalls); assertEquals("unexpected call to die()", 0, mockReader.dieCalls); assertTrue("keepAlive not set", dmc.getKeepAlive()); @@ -168,8 +171,10 @@ public class DefaultManagerConnectionTes assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); - // TODO why is run() not called? - // assertEquals("run() not called 1 time", 1, mockReader.runCalls); + // Some time for the reader thread to be started. Otherwise run() might not yet have been + // called. + Thread.sleep(10); + assertEquals("run() not called 1 time", 1, mockReader.runCalls); assertEquals("unexpected call to die()", 0, mockReader.dieCalls); socketMC.verify(); @@ -231,6 +236,9 @@ public class DefaultManagerConnectionTes assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); + // Some time for the reader thread to be started. Otherwise run() might not yet have been + // called. + Thread.sleep(10); assertEquals("run() not called 1 time", 1, mockReader.runCalls); assertEquals("unexpected call to die()", 0, mockReader.dieCalls); @@ -263,6 +271,9 @@ public class DefaultManagerConnectionTes assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); + // Some time for the reader thread to be started. Otherwise run() might not yet have been + // called. + Thread.sleep(10); assertEquals("run() not called 1 time", 1, mockReader.runCalls); assertEquals("unexpected call to die()", 0, mockReader.dieCalls); |
From: Stefan R. <sr...@us...> - 2005-03-05 02:28:06
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7613/src/java/net/sf/asterisk/manager Modified Files: ManagerConnection.java Log Message: Added UserEvent Index: ManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/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 5 Mar 2005 01:39:51 -0000 1.4 +++ ManagerConnection.java 5 Mar 2005 02:27:58 -0000 1.5 @@ -36,10 +36,16 @@ public interface ManagerConnection /** * Registers a new user event type.<br> * Asterisk allows you to send custom events via the UserEvent application. If you choose to - * send such events you can extend the abstract class ManagerEvent and add your own attributes. - * After registering a user event type asterisk-java will handle such events the same way it - * handles the internal events and inform your registered event handlers. + * send such events you can extend the abstract class UserEvent provide a name for your new + * event and optionally add your own attributes. After registering a user event type + * asterisk-java will handle such events the same way it handles the internal events and inform + * your registered event handlers.<br> + * Note: If you write your own asterisk applications that use asterisk's + * <code>manager_event()</code> function directly and don't use the channel and uniqueid + * attributes provided by UserEvent you can also register events that directly subclass + * ManagerEvent. * + * @see net.sf.asterisk.manager.event.UserEvent * @see ManagerEvent * * @param userEventClass the class of the user event to register. |
From: Stefan R. <sr...@us...> - 2005-03-05 02:28:06
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/event In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7613/src/java/net/sf/asterisk/manager/event Added Files: UserEvent.java Log Message: Added UserEvent --- NEW FILE: UserEvent.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager.event; /** * Abstract base class for user events.<br> * You can send arbitrary user events via the UserEvent application provided with asterisk. A user * event by default has the attributes channel and uniqueId but you can add custom attributes by * specifying an event body.<br> * To add your own user events you must subclass this class and name it corresponding to your event. * If you plan to send an event by <code>UserEvent(VIPCall)</code> you will create a new class * called VIPCallEvent that extends UserEvent. To pass additional data create appropriate attributes * with getter and setter methods in your new class.<br> * Example: * <pre> * public class VIPCallEvent extends UserEvent * { * private String firstName; * * public VIPCallEvent(Object source) * { * super(source); * } * * public String getFirstName() * { * return firstName; * } * * public void setFirstName(String firstName) * { * this.firstName = firstName; * } * } * </pre> * To send this event use <code>UserEvent(VIPCall|firstName: Jon)</code> in your dialplan.<br> * The UserEvent is implemented in <code>apps/app_userevent.c</code>. * * @author srt * @version $Id: UserEvent.java,v 1.1 2005/03/05 02:27:58 srt Exp $ */ public abstract class UserEvent extends ManagerEvent { /** * Serial version identifier */ private static final long serialVersionUID = 3256725065466000695L; /** * The name of the channel. */ private String channel; /** * The unique id of the channel. */ private String uniqueId; public UserEvent(Object source) { super(source); } /** * Returns the name of the channel this event occured in. * * @return the name of the channel this event occured in. */ public String getChannel() { return channel; } /** * Sets the name of the channel this event occured in. * * @param channel the name of the channel this event occured in. */ public void setChannel(String channel) { this.channel = channel; } /** * Returns the unqiue id of the channel this event occured in. * * @return the unqiue id of the channel this event occured in. */ public String getUniqueId() { return uniqueId; } /** * Sets the unqiue id of the channel this event occured in. * * @param uniqueId the unqiue id of the channel this event occured in. */ public void setUniqueId(String uniqueId) { this.uniqueId = uniqueId; } } |
From: Stefan R. <sr...@us...> - 2005-03-05 01:40:02
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27309/src/java/net/sf/asterisk/manager Modified Files: ManagerReader.java DefaultManagerConnection.java ManagerConnection.java ManagerReaderImpl.java Log Message: Added registerUserEventClass() to ManagerConnection to allow users to add their custom event classes without changing asterisk-java's source code Index: ManagerReader.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ManagerReader.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -p -r1.6 -r1.7 --- ManagerReader.java 2 Mar 2005 23:15:38 -0000 1.6 +++ ManagerReader.java 5 Mar 2005 01:39:51 -0000 1.7 @@ -16,6 +16,7 @@ */ package net.sf.asterisk.manager; +import net.sf.asterisk.manager.event.ManagerEvent; import net.sf.asterisk.manager.io.SocketConnectionFacade; /** @@ -41,6 +42,17 @@ interface ManagerReader extends Runnable */ void setSocket(final SocketConnectionFacade socket); + /** + * Registers a new event type with the underlying EventBuilder.<br> + * The eventClass must extend ManagerEvent. + * + * @see EventBuilder + * @see ManagerEvent + * + * @param eventClass class of the event to register. + */ + void registerEventClass(Class event); + void die(); } Index: DefaultManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/DefaultManagerConnection.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -p -r1.7 -r1.8 --- DefaultManagerConnection.java 5 Mar 2005 00:32:50 -0000 1.7 +++ DefaultManagerConnection.java 5 Mar 2005 01:39:51 -0000 1.8 @@ -194,6 +194,16 @@ public class DefaultManagerConnection im /* Implementation of ManagerConnection interface */ + public void registerUserEventClass(Class userEventClass) + { + if (reader == null) + { + reader = createReader(this, asteriskServer); + } + + reader.registerEventClass(userEventClass); + } + /** * Logs in to the asterisk manager using asterisk's MD5 based challenge/response protocol. The * login is delayed until the protocol identifier has been received by the reader. Index: ManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ManagerConnection.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -p -r1.3 -r1.4 --- ManagerConnection.java 23 Feb 2005 23:00:50 -0000 1.3 +++ ManagerConnection.java 5 Mar 2005 01:39:51 -0000 1.4 @@ -19,6 +19,7 @@ package net.sf.asterisk.manager; import java.io.IOException; import net.sf.asterisk.manager.action.ManagerAction; +import net.sf.asterisk.manager.event.ManagerEvent; import net.sf.asterisk.manager.response.ManagerResponse; /** @@ -33,6 +34,19 @@ import net.sf.asterisk.manager.response. public interface ManagerConnection { /** + * Registers a new user event type.<br> + * Asterisk allows you to send custom events via the UserEvent application. If you choose to + * send such events you can extend the abstract class ManagerEvent and add your own attributes. + * After registering a user event type asterisk-java will handle such events the same way it + * handles the internal events and inform your registered event handlers. + * + * @see ManagerEvent + * + * @param userEventClass the class of the user event to register. + */ + void registerUserEventClass(Class userEventClass); + + /** * Logs in to the asterisk server with the username and password specified when this connection * was created. * @@ -132,6 +146,7 @@ public interface ManagerConnection /** * Returns the Asterisk server of this connection. + * * @return the Asterisk server of this connection. */ AsteriskServer getAsteriskServer(); Index: ManagerReaderImpl.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/ManagerReaderImpl.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ManagerReaderImpl.java 2 Mar 2005 23:15:50 -0000 1.1 +++ ManagerReaderImpl.java 5 Mar 2005 01:39:51 -0000 1.2 @@ -99,6 +99,11 @@ class ManagerReaderImpl implements Manag { this.socket = socket; } + + public void registerEventClass(Class eventClass) + { + eventBuilder.registerEventClass(eventClass); + } /** * Reads line by line from the asterisk server, sets the protocol identifier as soon as it is |
From: Stefan R. <sr...@us...> - 2005-03-05 01:40:02
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27309/src/test/net/sf/asterisk/manager Modified Files: ManagerReaderImplTest.java ManagerReaderMock.java DefaultManagerConnectionTest.java Added Files: MyUserEvent.java Log Message: Added registerUserEventClass() to ManagerConnection to allow users to add their custom event classes without changing asterisk-java's source code --- NEW FILE: MyUserEvent.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import net.sf.asterisk.manager.event.ManagerEvent; public class MyUserEvent extends ManagerEvent { private static final long serialVersionUID = 3689913989471418169L; public MyUserEvent(Object source) { super(source); } } Index: ManagerReaderImplTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/ManagerReaderImplTest.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -p -r1.2 -r1.3 --- ManagerReaderImplTest.java 4 Mar 2005 22:21:04 -0000 1.2 +++ ManagerReaderImplTest.java 5 Mar 2005 01:39:51 -0000 1.3 @@ -54,7 +54,7 @@ public class ManagerReaderImplTest exten socketConnectionFacadeMC = MockControl.createControl(SocketConnectionFacade.class); socketConnectionFacade = (SocketConnectionFacade) socketConnectionFacadeMC.getMock(); } - + protected void tearDown() { DateUtil.overrideCurrentDate(null); @@ -132,6 +132,38 @@ public class ManagerReaderImplTest exten dispatcherMC.verify(); } + public void testRunReceivingUserEvent() throws Exception + { + DisconnectEvent disconnectEvent; + MyUserEvent myUserEvent; + + managerReader.registerEventClass(MyUserEvent.class); + + socketConnectionFacade.readLine(); + socketConnectionFacadeMC.setReturnValue("Event: MyUser"); + socketConnectionFacade.readLine(); + socketConnectionFacadeMC.setReturnValue(""); + socketConnectionFacade.readLine(); + socketConnectionFacadeMC.setReturnValue(null); + + myUserEvent = new MyUserEvent(asteriskServer); + myUserEvent.setDateReceived(now); + dispatcher.dispatchEvent(myUserEvent); + + disconnectEvent = new DisconnectEvent(asteriskServer); + disconnectEvent.setDateReceived(now); + dispatcher.dispatchEvent(disconnectEvent); + + socketConnectionFacadeMC.replay(); + dispatcherMC.replay(); + + managerReader.setSocket(socketConnectionFacade); + managerReader.run(); + + socketConnectionFacadeMC.verify(); + dispatcherMC.verify(); + } + public void testRunReceivingResponse() throws Exception { DisconnectEvent disconnectEvent; Index: ManagerReaderMock.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/ManagerReaderMock.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ManagerReaderMock.java 4 Mar 2005 22:21:04 -0000 1.1 +++ ManagerReaderMock.java 5 Mar 2005 01:39:51 -0000 1.2 @@ -29,6 +29,11 @@ public class ManagerReaderMock implement } + public void registerEventClass(Class event) + { + throw new UnsupportedOperationException(); + } + public void setSocket(SocketConnectionFacade socket) { setSocketCalls++; Index: DefaultManagerConnectionTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/DefaultManagerConnectionTest.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -p -r1.4 -r1.5 --- DefaultManagerConnectionTest.java 5 Mar 2005 00:43:45 -0000 1.4 +++ DefaultManagerConnectionTest.java 5 Mar 2005 01:39:51 -0000 1.5 @@ -76,6 +76,27 @@ public class DefaultManagerConnectionTes assertEquals("Invalid password", "p", dmc.getPassword()); } + public void testRegisterUserEventClass() + { + MockControl managerReaderMC; + ManagerReader managerReader; + + managerReaderMC = MockControl.createControl(ManagerReader.class); + managerReader = (ManagerReader) managerReaderMC.getMock(); + + managerReader.registerEventClass(MyUserEvent.class); + managerReaderMC.replay(); + + dmc = new MockedDefaultManagerConnection(managerReader, mockWriter, mockSocket); + dmc.registerUserEventClass(MyUserEvent.class); + + assertEquals("unexpected call to createSocket", 0, dmc.createSocketCalls); + assertEquals("unexpected call to createWriter", 0, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + managerReaderMC.verify(); + } + public void testLogin() throws Exception { MockControl managerEventHandlerMC; |
From: Stefan R. <sr...@us...> - 2005-03-05 00:43:53
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12473/src/test/net/sf/asterisk/manager Modified Files: DefaultManagerConnectionTest.java Log Message: Fixed setSleepTime and setDefaultTimeout to fit Index: DefaultManagerConnectionTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/DefaultManagerConnectionTest.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -p -r1.3 -r1.4 --- DefaultManagerConnectionTest.java 5 Mar 2005 00:33:16 -0000 1.3 +++ DefaultManagerConnectionTest.java 5 Mar 2005 00:43:45 -0000 1.4 @@ -53,7 +53,8 @@ public class DefaultManagerConnectionTes dmc = new MockedDefaultManagerConnection(mockReader, mockWriter, mockSocket); // make tests faster that expect a TimeoutException - dmc.setDefaultTimeout(10); + dmc.setSleepTime(5); + dmc.setDefaultTimeout(20); mockWriter.setDispatcher(dmc); mockWriter.setAsteriskServer(asteriskServer); |
From: Stefan R. <sr...@us...> - 2005-03-05 00:33:27
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9825/src/test/net/sf/asterisk/manager Modified Files: ManagerWriterMock.java DefaultManagerConnectionTest.java Log Message: Added testReconnectWithKeepAliveAfterAuthenticationFailure Index: ManagerWriterMock.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/ManagerWriterMock.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -p -r1.2 -r1.3 --- ManagerWriterMock.java 5 Mar 2005 00:14:32 -0000 1.2 +++ ManagerWriterMock.java 5 Mar 2005 00:33:16 -0000 1.3 @@ -129,6 +129,7 @@ public class ManagerWriterMock implement { throw new RuntimeException("Expected authType 'MD5' got '" + authType + "'"); } + if (!expectedUsername.equals(username)) { throw new RuntimeException("Expected username '" + expectedUsername + "' got '" + username + "'"); @@ -140,7 +141,9 @@ public class ManagerWriterMock implement { ManagerResponse loginResponse; - if (key.equals(expectedKey)) + // let testReconnectWithKeepAliveAfterAuthenticationFailure succeed after + // 3 unsuccessful attempts + if (key.equals(expectedKey) || loginActionsSent > 2) { loginResponse = new ManagerResponse(); loginResponse.setResponse("Success"); Index: DefaultManagerConnectionTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/DefaultManagerConnectionTest.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -p -r1.2 -r1.3 --- DefaultManagerConnectionTest.java 5 Mar 2005 00:14:32 -0000 1.2 +++ DefaultManagerConnectionTest.java 5 Mar 2005 00:33:16 -0000 1.3 @@ -422,7 +422,7 @@ public class DefaultManagerConnectionTes // fake successful login dmc.setKeepAlive(true); - + dmc.setThrowIOExceptionOnFirstSocketCreate(true); dmc.setUsername("username"); @@ -467,7 +467,40 @@ public class DefaultManagerConnectionTes assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); assertFalse("keepAlive not disabled", dmc.getKeepAlive()); - + + socketMC.verify(); + } + + public void testReconnectWithKeepAliveAfterAuthenticationFailure() throws Exception + { + DisconnectEvent disconnectEvent; + + // 2 unsuccessful attempts + mockSocket.close(); + mockSocket.close(); + socketMC.replay(); + disconnectEvent = new DisconnectEvent(asteriskServer); + + // fake successful login + dmc.setKeepAlive(true); + + // to prevent an infinite loop we will be able to log in after two unsuccessful attempts + // even if the password is not correct. + dmc.setKeepAliveAfterAuthenticationFailure(true); + dmc.setUsername("username"); + + dmc.dispatchEvent(disconnectEvent); + + assertEquals("createSocket not called 3 time", 3, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 3 time", 3, mockWriter.challengeActionsSent); + assertEquals("login action not sent 3 time", 3, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertTrue("keepAlive not enabled", dmc.getKeepAlive()); + socketMC.verify(); } |
From: Stefan R. <sr...@us...> - 2005-03-05 00:32:59
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9684/src/java/net/sf/asterisk/manager Modified Files: DefaultManagerConnection.java Log Message: Fixed overly verbose exception logging Index: DefaultManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/DefaultManagerConnection.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -p -r1.6 -r1.7 --- DefaultManagerConnection.java 5 Mar 2005 00:14:32 -0000 1.6 +++ DefaultManagerConnection.java 5 Mar 2005 00:32:50 -0000 1.7 @@ -684,7 +684,7 @@ public class DefaultManagerConnection im { if (this.keepAliveAfterAuthenticationFailure) { - logger.error("Unable to log in after reconnect.", e1); + logger.error("Unable to log in after reconnect."); } else { @@ -705,7 +705,7 @@ public class DefaultManagerConnection im catch (IOException e) { // server seems to be still down, just continue to attempt reconnection - logger.warn("Exception while trying to reconnect", e); + logger.warn("Exception while trying to reconnect: " + e.getMessage()); } numTries++; } |
From: Stefan R. <sr...@us...> - 2005-03-05 00:14:41
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4089/src/java/net/sf/asterisk/manager Modified Files: DefaultManagerConnection.java Log Message: Added more unit tests for DefaultManagerConnection Index: DefaultManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/DefaultManagerConnection.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -p -r1.5 -r1.6 --- DefaultManagerConnection.java 4 Mar 2005 22:21:04 -0000 1.5 +++ DefaultManagerConnection.java 5 Mar 2005 00:14:32 -0000 1.6 @@ -59,8 +59,8 @@ public class DefaultManagerConnection im /* Config attributes */ private AsteriskServer asteriskServer; - private String username; - private String password; + protected String username; + protected String password; private long defaultTimeout = 2000; private long sleepTime = 50; private boolean keepAliveAfterAuthenticationFailure = false; @@ -81,7 +81,7 @@ public class DefaultManagerConnection im private String protocolIdentifier; private final Map responseHandlers; private final Collection eventHandlers; - private boolean keepAlive = false; + protected boolean keepAlive = false; public DefaultManagerConnection() { @@ -273,8 +273,14 @@ public class DefaultManagerConnection im try { MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(challenge.getBytes()); - md.update(password.getBytes()); + if (challenge != null) + { + md.update(challenge.getBytes()); + } + if (password != null) + { + md.update(password.getBytes()); + } loginAction.setKey(Util.toHexString(md.digest())); } catch (NoSuchAlgorithmException ex) @@ -305,7 +311,7 @@ public class DefaultManagerConnection im { this.reader = createReader(this, asteriskServer); } - + if (this.writer == null) { this.writer = createWriter(); @@ -583,16 +589,13 @@ public class DefaultManagerConnection im ManagerEventHandler eventHandler; eventHandler = (ManagerEventHandler) i.next(); - if (eventHandler != null) + try { - try - { - eventHandler.handleEvent(event); - } - catch (Exception e) - { - logger.warn("Exception calling eventHandler", e); - } + eventHandler.handleEvent(event); + } + catch (Exception e) + { + logger.warn("Exception calling eventHandler", e); } } } @@ -685,7 +688,7 @@ public class DefaultManagerConnection im } else { - logger.error("Unable to log in after reconnect. Giving up.", e1); + logger.error("Unable to log in after reconnect. Giving up."); this.keepAlive = false; } } |
From: Stefan R. <sr...@us...> - 2005-03-05 00:14:41
|
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4089/src/test/net/sf/asterisk/manager Modified Files: ManagerWriterMock.java DefaultManagerConnectionTest.java Log Message: Added more unit tests for DefaultManagerConnection Index: ManagerWriterMock.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/ManagerWriterMock.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ManagerWriterMock.java 4 Mar 2005 22:21:04 -0000 1.1 +++ ManagerWriterMock.java 5 Mar 2005 00:14:32 -0000 1.2 @@ -20,10 +20,12 @@ import java.io.IOException; import net.sf.asterisk.manager.action.ChallengeAction; 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.io.SocketConnectionFacade; import net.sf.asterisk.manager.response.ChallengeResponse; +import net.sf.asterisk.manager.response.ManagerError; import net.sf.asterisk.manager.response.ManagerResponse; public class ManagerWriterMock implements ManagerWriter @@ -36,9 +38,12 @@ public class ManagerWriterMock implement private String expectedKey; private String expectedUsername; + private boolean sendResponse = true; + private boolean sendConnectEvent = true; public int challengeActionsSent = 0; public int loginActionsSent = 0; + public int logoffActionsSent = 0; public int otherActionsSent = 0; public ManagerWriterMock() @@ -59,27 +64,39 @@ public class ManagerWriterMock implement { this.expectedKey = key; } - + public void setExpectedUsername(String username) { this.expectedUsername = username; } + public void setSendResponse(boolean sendResponse) + { + this.sendResponse = sendResponse; + } + + public void setSendConnectEvent(boolean sendConnectEvent) + { + this.sendConnectEvent = sendConnectEvent; + } + public void setSocket(SocketConnectionFacade socket) { this.socket = socket; - ConnectEvent connectEvent; - connectEvent = new ConnectEvent(asteriskServer); - connectEvent.setProtocolIdentifier("Asterisk Call Manager/1.0"); - dispatcher.dispatchEvent(connectEvent); + if (sendConnectEvent) + { + ConnectEvent connectEvent; + connectEvent = new ConnectEvent(asteriskServer); + connectEvent.setProtocolIdentifier("Asterisk Call Manager/1.0"); + dispatcher.dispatchEvent(connectEvent); + } } public void sendAction(ManagerAction action) throws IOException { if (action instanceof ChallengeAction) { - ChallengeResponse challengeResponse; ChallengeAction challengeAction = (ChallengeAction) action; String authType = challengeAction.getAuthType(); @@ -88,51 +105,83 @@ public class ManagerWriterMock implement throw new RuntimeException("Expected authType 'MD5' got '" + authType + "'"); } - challengeResponse = new ChallengeResponse(); - challengeResponse.setActionId(action.getActionId()); - challengeResponse.setChallenge(CHALLENGE); - dispatcher.dispatchResponse(challengeResponse); - challengeActionsSent++; + + if (sendResponse) + { + ChallengeResponse challengeResponse; + + challengeResponse = new ChallengeResponse(); + challengeResponse.setActionId(action.getActionId()); + challengeResponse.setChallenge(CHALLENGE); + dispatcher.dispatchResponse(challengeResponse); + } } else if (action instanceof LoginAction) { - ManagerResponse loginResponse; + LoginAction loginAction = (LoginAction) action; String username = loginAction.getUsername(); String key = loginAction.getKey(); String authType = loginAction.getAuthType(); - if (!authType.equals("MD5")) + if (!"MD5".equals(authType)) { throw new RuntimeException("Expected authType 'MD5' got '" + authType + "'"); } - if (!username.equals(expectedUsername)) + if (!expectedUsername.equals(username)) { throw new RuntimeException("Expected username '" + expectedUsername + "' got '" + username + "'"); } - if (!key.equals(expectedKey)) + + loginActionsSent++; + + if (sendResponse) { - throw new RuntimeException("Expected key '" + expectedKey + "' got '" + key + "'"); + ManagerResponse loginResponse; + + if (key.equals(expectedKey)) + { + loginResponse = new ManagerResponse(); + loginResponse.setResponse("Success"); + } + else + { + loginResponse = new ManagerError(); + loginResponse.setResponse("Error"); + loginResponse.setMessage("Authentication failed"); + } + loginResponse.setActionId(action.getActionId()); + dispatcher.dispatchResponse(loginResponse); } + } + else if (action instanceof LogoffAction) + { + logoffActionsSent++; - loginResponse = new ManagerResponse(); - loginResponse.setActionId(action.getActionId()); - loginResponse.setResponse("Success"); - dispatcher.dispatchResponse(loginResponse); + if (sendResponse) + { + ManagerResponse response; - loginActionsSent++; + response = new ManagerResponse(); + response.setActionId(action.getActionId()); + response.setResponse("Success"); + dispatcher.dispatchResponse(response); + } } else { - ManagerResponse response; - - response = new ManagerResponse(); - response.setActionId(action.getActionId()); - response.setResponse("Success"); - dispatcher.dispatchResponse(response); - otherActionsSent++; + + if (sendResponse) + { + ManagerResponse response; + + response = new ManagerResponse(); + response.setActionId(action.getActionId()); + response.setResponse("Success"); + dispatcher.dispatchResponse(response); + } } } } Index: DefaultManagerConnectionTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/DefaultManagerConnectionTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- DefaultManagerConnectionTest.java 4 Mar 2005 22:21:04 -0000 1.1 +++ DefaultManagerConnectionTest.java 5 Mar 2005 00:14:32 -0000 1.2 @@ -16,9 +16,12 @@ */ package net.sf.asterisk.manager; +import java.io.IOException; + import junit.framework.TestCase; 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.io.SocketConnectionFacade; import net.sf.asterisk.manager.response.ManagerResponse; @@ -38,22 +41,40 @@ public class DefaultManagerConnectionTes asteriskServer = new AsteriskServer("localhost", 5038); mockWriter = new ManagerWriterMock(); + mockWriter.setExpectedUsername("username"); + // md5 sum of 12345password + mockWriter.setExpectedKey("40b1b887502902a8ce61a16e44630f7c"); + mockReader = new ManagerReaderMock(); socketMC = MockControl.createControl(SocketConnectionFacade.class); mockSocket = (SocketConnectionFacade) socketMC.getMock(); dmc = new MockedDefaultManagerConnection(mockReader, mockWriter, mockSocket); + + // make tests faster that expect a TimeoutException + dmc.setDefaultTimeout(10); + mockWriter.setDispatcher(dmc); mockWriter.setAsteriskServer(asteriskServer); } - public void testConstructor() + public void testDefaultConstructor() { assertEquals("Invalid default hostname", "localhost", dmc.getAsteriskServer().getHostname()); assertEquals("Invalid default port", 5038, dmc.getAsteriskServer().getPort()); } + public void testFullConstructor() + { + dmc = new MockedDefaultManagerConnection("host", 1234, "u", "p"); + + assertEquals("Invalid hostname", "host", dmc.getAsteriskServer().getHostname()); + assertEquals("Invalid port", 1234, dmc.getAsteriskServer().getPort()); + assertEquals("Invalid username", "u", dmc.getUsername()); + assertEquals("Invalid password", "p", dmc.getPassword()); + } + public void testLogin() throws Exception { MockControl managerEventHandlerMC; @@ -70,14 +91,51 @@ public class DefaultManagerConnectionTes socketMC.replay(); + dmc.setUsername("username"); + dmc.setPassword("password"); + dmc.addEventHandler(managerEventHandler); + dmc.login(); + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); + // assertEquals("run() not called 1 time", 1, mockReader.runCalls); + assertEquals("unexpected call to die()", 0, mockReader.dieCalls); + + assertTrue("keepAlive not set", dmc.getKeepAlive()); + + socketMC.verify(); + managerEventHandlerMC.verify(); + } + + public void testLoginIncorrectKey() throws Exception + { + ConnectEvent connectEvent; + + mockSocket.close(); + socketMC.replay(); + mockWriter.setExpectedUsername("username"); // md5 sum of 12345password mockWriter.setExpectedKey("40b1b887502902a8ce61a16e44630f7c"); dmc.setUsername("username"); - dmc.setPassword("password"); - dmc.addEventHandler(managerEventHandler); - dmc.login(); + dmc.setPassword("wrong password"); + + try + { + dmc.login(); + fail("No AuthenticationFailedException thrown"); + } + catch (AuthenticationFailedException e) + { + } assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); @@ -88,11 +146,143 @@ public class DefaultManagerConnectionTes assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); + // TODO why is run() not called? + // assertEquals("run() not called 1 time", 1, mockReader.runCalls); + assertEquals("unexpected call to die()", 0, mockReader.dieCalls); + + socketMC.verify(); + } + + public void testLoginIOExceptionOnConnect() throws Exception + { + socketMC.replay(); + + dmc.setThrowIOExceptionOnFirstSocketCreate(true); + try + { + dmc.login(); + fail("No IOException thrown"); + } + catch (IOException e) + { + } + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("unexpected challenge action sent", 0, mockWriter.challengeActionsSent); + assertEquals("unexpected login action sent", 0, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertEquals("unexpected call to setSocket()", 0, mockReader.setSocketCalls); + assertEquals("unexpected call to run()", 0, mockReader.runCalls); + assertEquals("unexpected call to die()", 0, mockReader.dieCalls); + + socketMC.verify(); + } + + public void testLoginTimeoutOnConnect() throws Exception + { + mockSocket.close(); + socketMC.replay(); + + // provoke timeout + mockWriter.setSendConnectEvent(false); + + try + { + dmc.login(); + fail("No TimeoutException on login()"); + } + catch (TimeoutException e) + { + assertEquals("Timeout waiting for protocol identifier", e.getMessage()); + } + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("unexpected challenge action sent", 0, mockWriter.challengeActionsSent); + assertEquals("unexpected login action sent", 0, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); + assertEquals("run() not called 1 time", 1, mockReader.runCalls); + assertEquals("unexpected call to die()", 0, mockReader.dieCalls); + + socketMC.verify(); + } + + public void testLoginTimeoutOnChallengeAction() throws Exception + { + socketMC.replay(); + + // provoke timeout + mockWriter.setSendResponse(false); + + try + { + dmc.login(); + fail("No TimeoutException on login()"); + } + catch (TimeoutException e) + { + assertEquals("Timeout waiting for response to Challenge", e.getMessage()); + } + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("unexpected login action sent", 0, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); assertEquals("run() not called 1 time", 1, mockReader.runCalls); assertEquals("unexpected call to die()", 0, mockReader.dieCalls); socketMC.verify(); - managerEventHandlerMC.verify(); + } + + public void testLogoffWhenConnected() throws Exception + { + mockSocket.close(); + socketMC.replay(); + + // fake connect + dmc.connect(); + + dmc.logoff(); + + assertEquals("logoff action not sent 1 time", 1, mockWriter.logoffActionsSent); + socketMC.verify(); + } + + public void testLogoffWhenNotConnected() throws Exception + { + socketMC.replay(); + + dmc.logoff(); + + assertEquals("unexpected logoff action sent", 0, mockWriter.logoffActionsSent); + socketMC.verify(); + } + + public void testSendActionWithNullAction() throws Exception + { + // fake connect + dmc.connect(); + try + { + dmc.sendAction(null); + fail("No IllgealArgumentException thrown"); + } + catch (IllegalArgumentException e) + { + } } public void testSendActionWhenNotConnected() throws Exception @@ -129,12 +319,166 @@ public class DefaultManagerConnectionTes assertEquals("other actions not sent 1 time", 1, mockWriter.otherActionsSent); } + public void testSendActionTimeout() throws Exception + { + StatusAction statusAction; + + statusAction = new StatusAction(); + statusAction.setActionId("123"); + + // fake connect + dmc.connect(); + // provoke timeout + mockWriter.setSendResponse(false); + try + { + dmc.sendAction(statusAction); + fail("No TimeoutException thrown"); + } + catch (TimeoutException e) + { + } + + assertEquals("other actions not sent 1 time", 1, mockWriter.otherActionsSent); + } + + public void testDispatchResponseUnexpectedResponse() + { + ManagerResponse response; + + response = new ManagerResponse(); + // internalActionId: 123_0 + response.setActionId("123_0-abc"); + response.setResponse("Success"); + + // expected result is ignoring the response and logging + dmc.dispatchResponse(response); + } + + public void testDispatchResponseMissingInternalActionId() + { + ManagerResponse response; + + response = new ManagerResponse(); + response.setActionId("abc"); + response.setResponse("Success"); + + // expected result is ignoring the response and logging + dmc.dispatchResponse(response); + } + + public void testDispatchResponseNullActionId() + { + ManagerResponse response; + + response = new ManagerResponse(); + response.setActionId(null); + response.setResponse("Success"); + + // expected result is ignoring the response and logging + dmc.dispatchResponse(response); + } + + public void testDispatchResponseNullResponse() + { + // expected result is ignoring and logging + dmc.dispatchResponse(null); + } + + public void testReconnect() throws Exception + { + DisconnectEvent disconnectEvent; + + socketMC.replay(); + disconnectEvent = new DisconnectEvent(asteriskServer); + + // fake successful login + dmc.setKeepAlive(true); + + dmc.setUsername("username"); + dmc.setPassword("password"); + + dmc.dispatchEvent(disconnectEvent); + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertTrue("keepAlive not enabled", dmc.getKeepAlive()); + + socketMC.verify(); + } + + public void testReconnectWithIOException() throws Exception + { + DisconnectEvent disconnectEvent; + + socketMC.replay(); + disconnectEvent = new DisconnectEvent(asteriskServer); + + // fake successful login + dmc.setKeepAlive(true); + + dmc.setThrowIOExceptionOnFirstSocketCreate(true); + + dmc.setUsername("username"); + dmc.setPassword("password"); + + dmc.dispatchEvent(disconnectEvent); + + assertEquals("createSocket not called 1 time", 2, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertTrue("keepAlive not enabled", dmc.getKeepAlive()); + + socketMC.verify(); + } + + public void testReconnectWithAuthenticationFailure() throws Exception + { + DisconnectEvent disconnectEvent; + + mockSocket.close(); + socketMC.replay(); + disconnectEvent = new DisconnectEvent(asteriskServer); + + // fake successful login + dmc.setKeepAlive(true); + + dmc.setUsername("username"); + + dmc.dispatchEvent(disconnectEvent); + + assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); + assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); + assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); + + assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); + assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); + assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); + + assertFalse("keepAlive not disabled", dmc.getKeepAlive()); + + socketMC.verify(); + } + private class MockedDefaultManagerConnection extends DefaultManagerConnection { ManagerReader mockReader; ManagerWriter mockWriter; SocketConnectionFacade mockSocket; + private boolean throwIOExceptionOnFirstSocketCreate = false; + public int createReaderCalls = 0; public int createWriterCalls = 0; public int createSocketCalls = 0; @@ -148,6 +492,36 @@ public class DefaultManagerConnectionTes this.mockSocket = mockSocket; } + public MockedDefaultManagerConnection(String hostname, int port, String username, String password) + { + super(hostname, port, username, password); + } + + public void setThrowIOExceptionOnFirstSocketCreate(boolean throwIOExceptionOnSocketCreate) + { + this.throwIOExceptionOnFirstSocketCreate = throwIOExceptionOnSocketCreate; + } + + public String getUsername() + { + return username; + } + + public String getPassword() + { + return password; + } + + public void setKeepAlive(boolean keepAlive) + { + this.keepAlive = keepAlive; + } + + public boolean getKeepAlive() + { + return keepAlive; + } + protected ManagerReader createReader(Dispatcher d, AsteriskServer s) { createReaderCalls++; @@ -160,9 +534,14 @@ public class DefaultManagerConnectionTes return mockWriter; } - protected SocketConnectionFacade createSocket() + protected SocketConnectionFacade createSocket() throws IOException { createSocketCalls++; + + if (throwIOExceptionOnFirstSocketCreate && createSocketCalls == 1) + { + throw new IOException(); + } return mockSocket; } } |
From: Stefan R. <sr...@us...> - 2005-03-04 22:21:16
|
Update of /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3989/src/java/net/sf/asterisk/manager Modified Files: AsteriskServer.java DefaultManagerConnection.java Log Message: Added unit tests for DefaultManagerConnection Index: AsteriskServer.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/AsteriskServer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -p -r1.3 -r1.4 --- AsteriskServer.java 23 Feb 2005 22:50:57 -0000 1.3 +++ AsteriskServer.java 4 Mar 2005 22:21:04 -0000 1.4 @@ -99,4 +99,40 @@ public class AsteriskServer implements S { this.port = port; } + + public boolean equals(Object o) + { + if (o == null || !(o instanceof AsteriskServer)) + { + return false; + } + + AsteriskServer s = (AsteriskServer) o; + if (this.getHostname() != null) + { + if (!this.getHostname().equals(s.getHostname())) + { + return false; + } + } + else + { + if (s.getHostname() != null) + { + return false; + } + } + + if (this.getPort() != s.getPort()) + { + return false; + } + + return true; + } + + public String toString() + { + return "AsteriskServer[hostname='" + hostname + "',port=" + port + "]"; + } } Index: DefaultManagerConnection.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/java/net/sf/asterisk/manager/DefaultManagerConnection.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -p -r1.4 -r1.5 --- DefaultManagerConnection.java 2 Mar 2005 23:15:49 -0000 1.4 +++ DefaultManagerConnection.java 4 Mar 2005 22:21:04 -0000 1.5 @@ -71,12 +71,12 @@ public class DefaultManagerConnection im /** * The reader to use to receive events and responses from asterisk. */ - private final ManagerReader reader; + private ManagerReader reader; /** * The writer to use to send actions to asterisk. */ - private final ManagerWriter writer; + private ManagerWriter writer; private String protocolIdentifier; private final Map responseHandlers; @@ -87,8 +87,6 @@ public class DefaultManagerConnection im { this.asteriskServer = new AsteriskServer(); - this.reader = new ManagerReaderImpl(this, asteriskServer); - this.writer = new ManagerWriterImpl(); this.responseHandlers = new HashMap(); this.eventHandlers = new HashSet(); } @@ -103,6 +101,16 @@ public class DefaultManagerConnection im setPassword(password); } + protected ManagerReader createReader(Dispatcher dispatcher, AsteriskServer server) + { + return new ManagerReaderImpl(dispatcher, server); + } + + protected ManagerWriter createWriter() + { + return new ManagerWriterImpl(); + } + /** * Sets the hostname of the asterisk server to connect to.<br> * Default is <code>localhost</code>. @@ -289,10 +297,20 @@ public class DefaultManagerConnection im logger.info("Successfully logged in"); } - private synchronized void connect() throws IOException + protected synchronized void connect() throws IOException { logger.info("Connecting to " + asteriskServer.getHostname() + " port " + asteriskServer.getPort()); + if (this.reader == null) + { + this.reader = createReader(this, asteriskServer); + } + + if (this.writer == null) + { + this.writer = createWriter(); + } + this.socket = createSocket(); this.reader.setSocket(socket); @@ -512,6 +530,10 @@ public class DefaultManagerConnection im { this.responseHandlers.remove(internalActionId); } + else + { + logger.warn("No response handler registered for internalActionId '" + internalActionId + "'"); + } } } else @@ -574,27 +596,24 @@ public class DefaultManagerConnection im } } } - + if (event instanceof ConnectEvent) { setProtocolIdentifier(((ConnectEvent) event).getProtocolIdentifier()); } if (event instanceof DisconnectEvent) { - handleDisconnection(); + reconnect(); } } /** - * This method is called by the reader when the asterisk server receives the protocol - * identifier, i.e. a string like "Asterisk Call Manager/1.0". Having received a correct - * protocol identifier is the precodition for logging in. - * - * @param protocolIdentifier the protocol version received by the reader + * This method is called when a {@link ConnectEvent} is received from the reader. Having + * received a correct protocol identifier is the precodition for logging in. * - * @see ManagerReaderImpl + * @param protocolIdentifier the protocol version used by the asterisk server. */ - void setProtocolIdentifier(String protocolIdentifier) + private void setProtocolIdentifier(final String protocolIdentifier) { logger.info("Connected via " + protocolIdentifier); @@ -609,13 +628,14 @@ public class DefaultManagerConnection im } /** - * This method is called by the reader if the connection to the asterisk server is lost. While - * keepAlive is <code>true</code> we will try to reconnect. Reconnection attempts will be - * stopped when the {@link #logoff()} method is called or when the login after a successful + * Reconnects to the asterisk server when the connection is lost.<br> + * While keepAlive is <code>true</code> 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. + * credentials have changed and keepAliveAfterAuthenticationFailure is not set.<br> + * This method is called when a {@link DisconnectEvent} is received from the reader. */ - void handleDisconnection() + private void reconnect() { int numTries; |
Update of /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3989/src/test/net/sf/asterisk/manager Modified Files: ManagerReaderImplTest.java Added Files: ManagerWriterMock.java ManagerReaderMock.java DefaultManagerConnectionTest.java Log Message: Added unit tests for DefaultManagerConnection --- NEW FILE: ManagerWriterMock.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import java.io.IOException; import net.sf.asterisk.manager.action.ChallengeAction; import net.sf.asterisk.manager.action.LoginAction; import net.sf.asterisk.manager.action.ManagerAction; import net.sf.asterisk.manager.event.ConnectEvent; import net.sf.asterisk.manager.io.SocketConnectionFacade; import net.sf.asterisk.manager.response.ChallengeResponse; import net.sf.asterisk.manager.response.ManagerResponse; public class ManagerWriterMock implements ManagerWriter { private static final String CHALLENGE = "12345"; private Dispatcher dispatcher; private AsteriskServer asteriskServer; private SocketConnectionFacade socket; private String expectedKey; private String expectedUsername; public int challengeActionsSent = 0; public int loginActionsSent = 0; public int otherActionsSent = 0; public ManagerWriterMock() { } public void setDispatcher(Dispatcher dispatcher) { this.dispatcher = dispatcher; } public void setAsteriskServer(AsteriskServer asteriskServer) { this.asteriskServer = asteriskServer; } public void setExpectedKey(String key) { this.expectedKey = key; } public void setExpectedUsername(String username) { this.expectedUsername = username; } public void setSocket(SocketConnectionFacade socket) { this.socket = socket; ConnectEvent connectEvent; connectEvent = new ConnectEvent(asteriskServer); connectEvent.setProtocolIdentifier("Asterisk Call Manager/1.0"); dispatcher.dispatchEvent(connectEvent); } public void sendAction(ManagerAction action) throws IOException { if (action instanceof ChallengeAction) { ChallengeResponse challengeResponse; ChallengeAction challengeAction = (ChallengeAction) action; String authType = challengeAction.getAuthType(); if (!authType.equals("MD5")) { throw new RuntimeException("Expected authType 'MD5' got '" + authType + "'"); } challengeResponse = new ChallengeResponse(); challengeResponse.setActionId(action.getActionId()); challengeResponse.setChallenge(CHALLENGE); dispatcher.dispatchResponse(challengeResponse); challengeActionsSent++; } else if (action instanceof LoginAction) { ManagerResponse loginResponse; LoginAction loginAction = (LoginAction) action; String username = loginAction.getUsername(); String key = loginAction.getKey(); String authType = loginAction.getAuthType(); if (!authType.equals("MD5")) { throw new RuntimeException("Expected authType 'MD5' got '" + authType + "'"); } if (!username.equals(expectedUsername)) { throw new RuntimeException("Expected username '" + expectedUsername + "' got '" + username + "'"); } if (!key.equals(expectedKey)) { throw new RuntimeException("Expected key '" + expectedKey + "' got '" + key + "'"); } loginResponse = new ManagerResponse(); loginResponse.setActionId(action.getActionId()); loginResponse.setResponse("Success"); dispatcher.dispatchResponse(loginResponse); loginActionsSent++; } else { ManagerResponse response; response = new ManagerResponse(); response.setActionId(action.getActionId()); response.setResponse("Success"); dispatcher.dispatchResponse(response); otherActionsSent++; } } } --- NEW FILE: ManagerReaderMock.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import net.sf.asterisk.manager.io.SocketConnectionFacade; public class ManagerReaderMock implements ManagerReader { public int setSocketCalls = 0; public int dieCalls = 0; public int runCalls = 0; public ManagerReaderMock() { } public void setSocket(SocketConnectionFacade socket) { setSocketCalls++; } public void die() { dieCalls++; } public void run() { runCalls++; } } --- NEW FILE: DefaultManagerConnectionTest.java --- /* * Copyright 2004-2005 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 net.sf.asterisk.manager; import junit.framework.TestCase; import net.sf.asterisk.manager.action.StatusAction; import net.sf.asterisk.manager.event.ConnectEvent; import net.sf.asterisk.manager.io.SocketConnectionFacade; import net.sf.asterisk.manager.response.ManagerResponse; import org.easymock.MockControl; public class DefaultManagerConnectionTest extends TestCase { protected MockControl socketMC; protected SocketConnectionFacade mockSocket; protected ManagerWriterMock mockWriter; protected ManagerReaderMock mockReader; protected MockedDefaultManagerConnection dmc; protected AsteriskServer asteriskServer; protected void setUp() throws Exception { asteriskServer = new AsteriskServer("localhost", 5038); mockWriter = new ManagerWriterMock(); mockReader = new ManagerReaderMock(); socketMC = MockControl.createControl(SocketConnectionFacade.class); mockSocket = (SocketConnectionFacade) socketMC.getMock(); dmc = new MockedDefaultManagerConnection(mockReader, mockWriter, mockSocket); mockWriter.setDispatcher(dmc); mockWriter.setAsteriskServer(asteriskServer); } public void testConstructor() { assertEquals("Invalid default hostname", "localhost", dmc.getAsteriskServer().getHostname()); assertEquals("Invalid default port", 5038, dmc.getAsteriskServer().getPort()); } public void testLogin() throws Exception { MockControl managerEventHandlerMC; ManagerEventHandler managerEventHandler; ConnectEvent connectEvent; managerEventHandlerMC = MockControl.createControl(ManagerEventHandler.class); managerEventHandler = (ManagerEventHandler) managerEventHandlerMC.getMock(); connectEvent = new ConnectEvent(asteriskServer); connectEvent.setProtocolIdentifier("Asterisk Call Manager/1.0"); managerEventHandler.handleEvent(connectEvent); managerEventHandlerMC.replay(); socketMC.replay(); mockWriter.setExpectedUsername("username"); // md5 sum of 12345password mockWriter.setExpectedKey("40b1b887502902a8ce61a16e44630f7c"); dmc.setUsername("username"); dmc.setPassword("password"); dmc.addEventHandler(managerEventHandler); dmc.login(); assertEquals("createSocket not called 1 time", 1, dmc.createSocketCalls); assertEquals("createWriter not called 1 time", 1, dmc.createWriterCalls); assertEquals("createReader not called 1 time", 1, dmc.createReaderCalls); assertEquals("challenge action not sent 1 time", 1, mockWriter.challengeActionsSent); assertEquals("login action not sent 1 time", 1, mockWriter.loginActionsSent); assertEquals("unexpected other actions sent", 0, mockWriter.otherActionsSent); assertEquals("setSocket() not called 1 time", 1, mockReader.setSocketCalls); assertEquals("run() not called 1 time", 1, mockReader.runCalls); assertEquals("unexpected call to die()", 0, mockReader.dieCalls); socketMC.verify(); managerEventHandlerMC.verify(); } public void testSendActionWhenNotConnected() throws Exception { StatusAction statusAction; statusAction = new StatusAction(); try { dmc.sendAction(statusAction); fail("No IllegalStateException thrown"); } catch (IllegalStateException e) { } } public void testSendAction() throws Exception { StatusAction statusAction; ManagerResponse response; statusAction = new StatusAction(); statusAction.setActionId("123"); // fake connect dmc.connect(); response = dmc.sendAction(statusAction); assertEquals("incorrect actionId in response", "123", response.getActionId()); assertEquals("incorrect response", "Success", response.getResponse()); assertEquals("other actions not sent 1 time", 1, mockWriter.otherActionsSent); } private class MockedDefaultManagerConnection extends DefaultManagerConnection { ManagerReader mockReader; ManagerWriter mockWriter; SocketConnectionFacade mockSocket; public int createReaderCalls = 0; public int createWriterCalls = 0; public int createSocketCalls = 0; public MockedDefaultManagerConnection(ManagerReader mockReader, ManagerWriter mockWriter, SocketConnectionFacade mockSocket) { super(); this.mockReader = mockReader; this.mockWriter = mockWriter; this.mockSocket = mockSocket; } protected ManagerReader createReader(Dispatcher d, AsteriskServer s) { createReaderCalls++; return mockReader; } protected ManagerWriter createWriter() { createWriterCalls++; return mockWriter; } protected SocketConnectionFacade createSocket() { createSocketCalls++; return mockSocket; } } } Index: ManagerReaderImplTest.java =================================================================== RCS file: /cvsroot/asterisk-java/asterisk-java/src/test/net/sf/asterisk/manager/ManagerReaderImplTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -p -r1.1 -r1.2 --- ManagerReaderImplTest.java 2 Mar 2005 23:15:50 -0000 1.1 +++ ManagerReaderImplTest.java 4 Mar 2005 22:21:04 -0000 1.2 @@ -42,7 +42,7 @@ public class ManagerReaderImplTest exten private AsteriskServer asteriskServer; private ManagerReader managerReader; - public void setUp() + protected void setUp() { now = new Date(); DateUtil.overrideCurrentDate(now); @@ -54,6 +54,11 @@ public class ManagerReaderImplTest exten socketConnectionFacadeMC = MockControl.createControl(SocketConnectionFacade.class); socketConnectionFacade = (SocketConnectionFacade) socketConnectionFacadeMC.getMock(); } + + protected void tearDown() + { + DateUtil.overrideCurrentDate(null); + } public void testRunWithoutSocket() throws Exception { |