package edu.uw.zookeeper.protocol.client; import com.google.common.base.Function; import edu.uw.zookeeper.common.Factory; import edu.uw.zookeeper.protocol.Message; import edu.uw.zookeeper.protocol.Operation; import edu.uw.zookeeper.protocol.ProtocolRequestMessage; import edu.uw.zookeeper.protocol.proto.Records; public class AssignXidProcessor implements XidGenerator, Function<Operation.Request, Message.ClientSession> { public static Factory<AssignXidProcessor> factory() { return new Factory<AssignXidProcessor>() { @Override public AssignXidProcessor get() { return AssignXidProcessor.newInstance(); } }; } public static AssignXidProcessor newInstance() { return newInstance(XidIncrementer.fromZero()); } public static AssignXidProcessor newInstance(XidIncrementer xid) { return new AssignXidProcessor(xid); } private final XidIncrementer xids; private AssignXidProcessor(XidIncrementer xids) { this.xids = xids; } @Override public Message.ClientSession apply(Operation.Request input) { Message.ClientSession output; if (input instanceof Message.ClientSession) { output = (Message.ClientSession) input; if (output instanceof Operation.RequestId) { xids.setIfGreater(((Operation.RequestId) output).xid() + 1); } } else if (input instanceof Operation.ProtocolRequest<?>) { Operation.ProtocolRequest<?> request = (Operation.ProtocolRequest<?>) input; output = ProtocolRequestMessage.of(request.xid(), request.record()); } else if (input instanceof Records.Request) { int xid; if (input instanceof Operation.RequestId) { xid = ((Operation.RequestId) input).xid(); } else { xid = next(); } output = ProtocolRequestMessage.of(xid, (Records.Request) input); } else { throw new IllegalArgumentException(input.toString()); } return output; } @Override public int get() { return xids.get(); } @Override public int next() { return xids.next(); } @Override public String toString() { return xids.toString(); } }