### Eclipse Workspace Patch 1.0 #P JGroups Index: src/org/jgroups/blocks/mux/Muxer.java =================================================================== RCS file: /cvsroot/javagroups/JGroups/src/org/jgroups/blocks/mux/Muxer.java,v retrieving revision 1.1 diff -u -r1.1 Muxer.java --- src/org/jgroups/blocks/mux/Muxer.java 13 Apr 2010 17:57:07 -0000 1.1 +++ src/org/jgroups/blocks/mux/Muxer.java 6 Jun 2010 15:46:42 -0000 @@ -15,8 +15,31 @@ void add(short id, T handler); /** + * Gets the handler registered under the specified id + * @param id a mux id + * @return the handler, or null if no handler is registered under + * id + */ + T get(short id); + + /** * Unregisters the handler associated with the specifed mux identifier * @param id a mux id */ void remove(short id); + + /** + * Gets the handler for messages that have no mux header. + * + * @return the default handler, or null if no default handler + * has been set + */ + T getDefaultHandler(); + + /** + * Sets the handler for messages that have no mux header. + * + * @param handler a handler for messages that have no mux header + */ + void setDefaultHandler(T handler); } Index: src/org/jgroups/blocks/mux/MuxUpHandler.java =================================================================== RCS file: /cvsroot/javagroups/JGroups/src/org/jgroups/blocks/mux/MuxUpHandler.java,v retrieving revision 1.2 diff -u -r1.2 MuxUpHandler.java --- src/org/jgroups/blocks/mux/MuxUpHandler.java 15 Apr 2010 20:05:22 -0000 1.2 +++ src/org/jgroups/blocks/mux/MuxUpHandler.java 6 Jun 2010 15:46:42 -0000 @@ -17,7 +17,7 @@ public class MuxUpHandler implements UpHandler, Muxer { private final Map handlers = new ConcurrentHashMap(); - private final UpHandler defaultHandler; + private volatile UpHandler defaultHandler; /** * Creates a multiplexing up handler, with no default handler. @@ -45,6 +45,15 @@ /** * {@inheritDoc} + * @see org.jgroups.blocks.mux.Muxer#get(short) + */ + @Override + public UpHandler get(short id) { + return handlers.get(id); + } + + /** + * {@inheritDoc} * @see org.jgroups.blocks.mux.Muxer#remove(short) */ @Override @@ -52,7 +61,17 @@ handlers.remove(id); } - /** + @Override + public UpHandler getDefaultHandler() { + return defaultHandler; + } + + @Override + public void setDefaultHandler(UpHandler handler) { + this.defaultHandler = handler; + } + + /** * {@inheritDoc} * @see org.jgroups.UpHandler#up(org.jgroups.Event) */ Index: src/org/jgroups/blocks/MessageDispatcher.java =================================================================== RCS file: /cvsroot/javagroups/JGroups/src/org/jgroups/blocks/MessageDispatcher.java,v retrieving revision 1.105 diff -u -r1.105 MessageDispatcher.java --- src/org/jgroups/blocks/MessageDispatcher.java 28 Apr 2010 14:54:29 -0000 1.105 +++ src/org/jgroups/blocks/MessageDispatcher.java 6 Jun 2010 15:46:42 -0000 @@ -2,6 +2,7 @@ package org.jgroups.blocks; import org.jgroups.*; +import org.jgroups.blocks.mux.Muxer; import org.jgroups.logging.Log; import org.jgroups.logging.LogFactory; import org.jgroups.protocols.TP; @@ -64,7 +65,7 @@ setMessageListener(l); setMembershipListener(l2); if(channel != null) { - channel.setUpHandler(prot_adapter); + installUpHandler(prot_adapter, true); } start(); } @@ -79,7 +80,7 @@ setMessageListener(l); setMembershipListener(l2); if(channel != null) { - channel.setUpHandler(prot_adapter); + installUpHandler(prot_adapter, true); } start(); } @@ -95,7 +96,7 @@ setMessageListener(l); setMembershipListener(l2); if(channel != null) { - channel.setUpHandler(prot_adapter); + installUpHandler(prot_adapter, true); } start(); } @@ -352,9 +353,50 @@ local_addr=channel.getAddress(); if(prot_adapter == null) prot_adapter=new ProtocolAdapter(); - if (channel.getUpHandler() == null) { - channel.setUpHandler(prot_adapter); - } + // Don't force installing the UpHandler so subclasses can use this + // method and still integrate with a MuxUpHandler + installUpHandler(prot_adapter, false); + } + + /** + * Sets the given UpHandler as the UpHandler for the channel, or, if the + * channel already has a Muxer installed as it's UpHandler, sets the given + * handler as the Muxer's {@link Muxer#setDefaultHandler(Object) default handler}. + * If the relevant handler is already installed, the canReplace + * controls whether this method replaces it (after logging a WARN) or simply + * leaves handler uninstalled. + *

+ * Passing false as the canReplace value allows + * callers to use this method to install defaults without concern about + * inadvertently overriding + * + * @param handler the UpHandler to install + * @param canReplace true if an existing Channel upHandler or + * Muxer default upHandler can be replaced; false + * if this method shouldn't install + */ + protected void installUpHandler(UpHandler handler, boolean canReplace) + { + UpHandler existing = channel.getUpHandler(); + if (existing == null) { + channel.setUpHandler(handler); + } + else if (existing instanceof Muxer) { + @SuppressWarnings("unchecked") + Muxer mux = (Muxer) existing; + if (mux.getDefaultHandler() == null) { + mux.setDefaultHandler(handler); + } + else if (canReplace) { + log.warn("Channel Muxer already has a default up handler installed (" + + mux.getDefaultHandler() + ") but now it is being overridden"); + mux.setDefaultHandler(handler); + } + } + else if (canReplace) { + log.warn("Channel already has an up handler installed (" + existing + ") but now it is being overridden"); + channel.setUpHandler(handler); + } } @Deprecated