package org.radargun.protocols; import java.io.DataInput; import java.io.DataOutput; import java.util.Set; import org.jgroups.Event; import org.jgroups.Global; import org.jgroups.Header; import org.jgroups.Message; import org.jgroups.conf.ClassConfigurator; import org.jgroups.logging.Log; import org.jgroups.logging.LogFactory; import org.jgroups.stack.Protocol; import org.jgroups.util.Streamable; public class SLAVE_PARTITION extends Protocol { protected static final short PROTOCOL_ID = (short) 0x51A7; protected static Log log = LogFactory.getLog(SLAVE_PARTITION.class); protected int slaveIndex = -1; protected Set<Integer> allowedSlaves; static { log.info("Registering SLAVE_PARTITION with id " + PROTOCOL_ID); ClassConfigurator.add(PROTOCOL_ID, SlaveHeader.class); } public void setAllowedSlaves(Set<Integer> slaves) { allowedSlaves = slaves; } public void setSlaveIndex(int slaveIndex) { this.slaveIndex = slaveIndex; } @Override public Object up(Event evt) { switch (evt.getType()) { case Event.MSG: Message msg = (Message) evt.getArg(); SlaveHeader header = (SlaveHeader) msg.getHeader(PROTOCOL_ID); if (header != null && header.getIndex() < 0) { log.trace("Message " + msg.getSrc() + " -> " + msg.getDest() + " with slaveIndex -1"); } else if (header != null && allowedSlaves != null) { if (!allowedSlaves.contains(header.getIndex())) { log.trace("Discarding message " + msg.getSrc() + " -> " + msg.getDest() + " with slaveIndex " + header.getIndex()); return null; } } } return up_prot.up(evt); } @Override public Object down(Event evt) { switch (evt.getType()) { case Event.MSG: Message msg = (Message) evt.getArg(); msg.putHeader(PROTOCOL_ID, new SlaveHeader(this.slaveIndex)); } return down_prot.down(evt); } public static class SlaveHeader extends Header implements Streamable { int index = -1; public SlaveHeader() { } public SlaveHeader(int index) { this.index = index; } public int getIndex() { return index; } public String toString() { return "slaveIndex=" + index; } public int size() { return Global.INT_SIZE; } @Override public void writeTo(DataOutput out) throws Exception { out.writeInt(index); } @Override public void readFrom(DataInput in) throws Exception { index = in.readInt(); } } }