package org.jboss.ha.core.jgroups.blocks.mux;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.jgroups.Event;
import org.jgroups.UpHandler;
import org.jgroups.blocks.mux.MuxHeader;
import org.jgroups.stack.StateTransferInfo;
import org.jgroups.util.ImmutableReference;
/**
* Overrides superclass to allow state transfer multiplexing.
*
* @author Brian Stansberry
*/
public class MuxUpHandler extends org.jgroups.blocks.mux.MuxUpHandler
{
private final Map<Short, UpHandler> stateTransferHandlers = new ConcurrentHashMap<Short, UpHandler>();
/**
* Creates a multiplexing up handler, with no default handler.
*/
public MuxUpHandler()
{
super();
}
/**
* Creates a multiplexing up handler using the specified default handler.
* @param defaultHandler a default up handler to handle messages with no {@link MuxHeader}
*/
public MuxUpHandler(UpHandler defaultHandler)
{
super(defaultHandler);
}
/**
* {@inheritDoc}
* @see org.jgroups.blocks.mux.Muxer#add(short, java.lang.Object)
*/
@Override
public void add(short id, UpHandler handler)
{
super.add(id, handler);
if (handler instanceof StateTransferFilter)
{
stateTransferHandlers.put(Short.valueOf(id), handler);
}
}
/**
* {@inheritDoc}
* @see org.jgroups.blocks.mux.Muxer#remove(short)
*/
@Override
public void remove(short id)
{
super.remove(id);
stateTransferHandlers.remove(Short.valueOf(id));
}
/**
* {@inheritDoc}
* @see org.jgroups.blocks.mux.MuxUpHandler#handleStateTransferEvent(org.jgroups.Event)
*/
@Override
protected ImmutableReference<Object> handleStateTransferEvent(Event evt)
{
StateTransferInfo info = (StateTransferInfo) evt.getArg();
for (UpHandler uh : stateTransferHandlers.values())
{
if (uh instanceof StateTransferFilter)
{
if (((StateTransferFilter) uh).accepts(info.state_id))
{
return new ImmutableReference<Object>(uh.up(evt));
}
}
}
return null;
}
}