[Asterisk-java-cvs] CVS: asterisk-java/src/java/net/sf/asterisk/manager ResponseBuilderImpl.java,NON
Brought to you by:
srt
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); |