package com.limegroup.gnutella.rudp.messages; import java.nio.ByteBuffer; import org.limewire.rudp.messages.AckMessage; import org.limewire.rudp.messages.DataMessage; import org.limewire.rudp.messages.FinMessage; import org.limewire.rudp.messages.KeepAliveMessage; import org.limewire.rudp.messages.MessageFormatException; import org.limewire.rudp.messages.RUDPMessage; import org.limewire.rudp.messages.RUDPMessageFactory; import org.limewire.rudp.messages.SynMessage; import org.limewire.rudp.messages.SynMessage.Role; import com.google.inject.Inject; import com.google.inject.Singleton; import com.google.inject.name.Named; @Singleton class LimeRUDPMessageFactory implements RUDPMessageFactory { private final RUDPMessageFactory delegate; @Inject public LimeRUDPMessageFactory(@Named("delegate") RUDPMessageFactory delegate) { if (delegate == null) { throw new NullPointerException("Delegate is null"); } else if (delegate instanceof LimeRUDPMessageFactory) { throw new IllegalArgumentException("Recursive delegation"); } this.delegate = delegate; } /** Returns the delegate factory. */ RUDPMessageFactory getDelegate() { return delegate; } public RUDPMessage createMessage(ByteBuffer... data) throws MessageFormatException { RUDPMessage msg = delegate.createMessage(data); if (msg instanceof AckMessage) { return new LimeAckMessageImpl((AckMessage)msg); } else if (msg instanceof DataMessage) { return new LimeDataMessageImpl((DataMessage)msg); } else if (msg instanceof FinMessage) { return new LimeFinMessageImpl((FinMessage)msg); } else if (msg instanceof KeepAliveMessage) { return new LimeKeepAliveMessageImpl((KeepAliveMessage)msg); } else if (msg instanceof SynMessage) { return new LimeSynMessageImpl((SynMessage)msg); } throw new IllegalArgumentException(msg.getClass() + " is unhandled"); } public AckMessage createAckMessage(byte connectionID, long sequenceNumber, long windowStart, int windowSpace) { return new LimeAckMessageImpl( delegate.createAckMessage(connectionID, sequenceNumber, windowStart, windowSpace)); } public DataMessage createDataMessage(byte connectionID, long sequenceNumber, ByteBuffer chunk) { return new LimeDataMessageImpl( delegate.createDataMessage(connectionID, sequenceNumber, chunk)); } public FinMessage createFinMessage(byte connectionID, long sequenceNumber, byte reasonCode) { return new LimeFinMessageImpl( delegate.createFinMessage(connectionID, sequenceNumber, reasonCode)); } public KeepAliveMessage createKeepAliveMessage(byte connectionID, long windowStart, int windowSpace) { return new LimeKeepAliveMessageImpl( delegate.createKeepAliveMessage(connectionID, windowStart, windowSpace)); } public SynMessage createSynMessage(byte connectionID, Role role) { return new LimeSynMessageImpl( delegate.createSynMessage(connectionID, role)); } public SynMessage createSynMessage(byte connectionID, byte theirConnectionID, Role role) { return new LimeSynMessageImpl( delegate.createSynMessage(connectionID, theirConnectionID, role)); } }