Commit 8f8909e0 authored by Gaston Dombiak's avatar Gaston Dombiak Committed by gaston

Added support for adding and removing IQHandlers dynamically. JM-115


git-svn-id: http://svn.igniterealtime.org/svn/repos/messenger/trunk@852 b35dd754-fafc-0310-a699-88a17e54d16e
parent 3f908f1a
...@@ -11,10 +11,9 @@ ...@@ -11,10 +11,9 @@
package org.jivesoftware.messenger.spi; package org.jivesoftware.messenger.spi;
import java.util.HashMap; import java.util.*;
import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap;
import java.util.LinkedList;
import java.util.Map;
import org.jivesoftware.messenger.*; import org.jivesoftware.messenger.*;
import org.jivesoftware.messenger.auth.UnauthorizedException; import org.jivesoftware.messenger.auth.UnauthorizedException;
import org.jivesoftware.messenger.container.BasicModule; import org.jivesoftware.messenger.container.BasicModule;
...@@ -34,8 +33,8 @@ import org.dom4j.Element; ...@@ -34,8 +33,8 @@ import org.dom4j.Element;
public class IQRouterImpl extends BasicModule implements IQRouter { public class IQRouterImpl extends BasicModule implements IQRouter {
private RoutingTable routingTable; private RoutingTable routingTable;
private LinkedList iqHandlers = new LinkedList(); private List<IQHandler> iqHandlers = new ArrayList<IQHandler>();
private Map namespace2Handlers = new HashMap(); private Map<String, IQHandler> namespace2Handlers = new ConcurrentHashMap<String, IQHandler>();
private SessionManager sessionManager; private SessionManager sessionManager;
/** /**
...@@ -170,25 +169,58 @@ public class IQRouterImpl extends BasicModule implements IQRouter { ...@@ -170,25 +169,58 @@ public class IQRouterImpl extends BasicModule implements IQRouter {
} }
private IQHandler getHandler(String namespace) { private IQHandler getHandler(String namespace) {
IQHandler handler = null; IQHandler handler = namespace2Handlers.get(namespace);
handler = (IQHandler)namespace2Handlers.get(namespace);
if (handler == null) { if (handler == null) {
Iterator handlerIter = iqHandlers.iterator(); for (IQHandler handlerCandidate : iqHandlers) {
while (handlerIter.hasNext() && handler == null) {
IQHandler handlerCandidate = (IQHandler)handlerIter.next();
IQHandlerInfo handlerInfo = handlerCandidate.getInfo(); IQHandlerInfo handlerInfo = handlerCandidate.getInfo();
if (handlerInfo != null && namespace.equalsIgnoreCase(handlerInfo.getNamespace())) { if (handlerInfo != null && namespace.equalsIgnoreCase(handlerInfo.getNamespace())) {
handler = handlerCandidate; handler = handlerCandidate;
namespace2Handlers.put(namespace, handler);
break;
} }
} }
if (handler != null) {
namespace2Handlers.put(namespace, handler);
}
} }
return handler; return handler;
} }
/**
* <p>Adds a new IQHandler to the list of registered handler. The new IQHandler will be
* responsible for handling IQ packet whose namespace matches the namespace of the
* IQHandler.</p>
*
* An IllegalArgumentException may be thrown if the IQHandler to register was already provided
* by the server. The server provides a certain list of IQHandlers when the server is
* started up.
*
* @param handler the IQHandler to add to the list of registered handler.
*/
public void addHandler(IQHandler handler) {
if (iqHandlers.contains(handler)) {
throw new IllegalArgumentException("IQHandler already provided by the server");
}
// Register the handler as the handler of the namespace
namespace2Handlers.put(handler.getInfo().getNamespace(), handler);
}
/**
* <p>Removes an IQHandler from the list of registered handler. The IQHandler to remove was
* responsible for handling IQ packet whose namespace matches the namespace of the
* IQHandler.</p>
*
* An IllegalArgumentException may be thrown if the IQHandler to remove was already provided
* by the server. The server provides a certain list of IQHandlers when the server is
* started up.
*
* @param handler the IQHandler to remove from the list of registered handler.
*/
public void removeHandler(IQHandler handler) {
if (iqHandlers.contains(handler)) {
throw new IllegalArgumentException("Cannot remove an IQHandler provided by the server");
}
// Unregister the handler as the handler of the namespace
namespace2Handlers.remove(handler.getInfo().getNamespace());
}
public void initialize(XMPPServer server) { public void initialize(XMPPServer server) {
super.initialize(server); super.initialize(server);
routingTable = server.getRoutingTable(); routingTable = server.getRoutingTable();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment