package com.limegroup.gnutella.dht.messages; import java.io.IOException; import java.math.BigInteger; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.util.Collection; import org.limewire.mojito.KUID; import org.limewire.mojito.db.DHTValueEntity; import org.limewire.mojito.db.DHTValueType; import org.limewire.mojito.messages.DHTMessage; import org.limewire.mojito.messages.FindNodeRequest; import org.limewire.mojito.messages.FindNodeResponse; import org.limewire.mojito.messages.FindValueRequest; import org.limewire.mojito.messages.FindValueResponse; import org.limewire.mojito.messages.MessageFactory; import org.limewire.mojito.messages.MessageFormatException; import org.limewire.mojito.messages.MessageID; import org.limewire.mojito.messages.PingRequest; import org.limewire.mojito.messages.PingResponse; import org.limewire.mojito.messages.StatsRequest; import org.limewire.mojito.messages.StatsResponse; import org.limewire.mojito.messages.StoreRequest; import org.limewire.mojito.messages.StoreResponse; import org.limewire.mojito.messages.StatsRequest.StatisticType; import org.limewire.mojito.messages.StoreResponse.StoreStatusCode; import org.limewire.mojito.routing.Contact; import org.limewire.security.SecurityToken; /** * Takes a true <code>MessageFactory</code> as an argument, * delegates all requests to it and wraps the constructed instances of * <code>DHTMessage</code> into "Wire" Messages. */ public class MessageFactoryWire implements MessageFactory { private final MessageFactory delegate; public MessageFactoryWire(MessageFactory delegate) { if (delegate == null) { throw new NullPointerException("Delegate is null"); } else if (delegate instanceof MessageFactoryWire) { throw new IllegalArgumentException("Recursive delegation"); } this.delegate = delegate; } public MessageID createMessageID(SocketAddress dst) { return delegate.createMessageID(dst); } public DHTMessage createMessage(SocketAddress src, ByteBuffer... data) throws MessageFormatException, IOException { DHTMessage msg = delegate.createMessage(src, data); if (msg instanceof PingRequest) { return new PingRequestWireImpl((PingRequest)msg); } else if (msg instanceof PingResponse) { return new PingResponseWireImpl((PingResponse)msg); } else if (msg instanceof FindNodeRequest) { return new FindNodeRequestWireImpl((FindNodeRequest)msg); } else if (msg instanceof FindNodeResponse) { return new FindNodeResponseWireImpl((FindNodeResponse)msg); } else if (msg instanceof FindValueRequest) { return new FindValueRequestWireImpl((FindValueRequest)msg); } else if (msg instanceof FindValueResponse) { return new FindValueResponseWireImpl((FindValueResponse)msg); } else if (msg instanceof StoreRequest) { return new StoreRequestWireImpl((StoreRequest)msg); } else if (msg instanceof StoreResponse) { return new StoreResponseWireImpl((StoreResponse)msg); } else if (msg instanceof StatsRequest) { return new StatsRequestWireImpl((StatsRequest)msg); } else if (msg instanceof StatsResponse) { return new StatsResponseWireImpl((StatsResponse)msg); } throw new IOException(msg.getClass() + " is unhandled"); } public ByteBuffer writeMessage(SocketAddress dst, DHTMessage message) throws IOException { return delegate.writeMessage(dst, message); } public FindNodeRequest createFindNodeRequest(Contact src, SocketAddress dst, KUID lookupId) { return new FindNodeRequestWireImpl( delegate.createFindNodeRequest(src, dst, lookupId)); } public FindNodeResponse createFindNodeResponse(Contact src, Contact dst, MessageID messageId, Collection<? extends Contact> nodes) { return new FindNodeResponseWireImpl( delegate.createFindNodeResponse(src, dst, messageId, nodes)); } public FindValueRequest createFindValueRequest(Contact src, SocketAddress dst, KUID lookupId, Collection<KUID> keys, DHTValueType valueType) { return new FindValueRequestWireImpl( delegate.createFindValueRequest(src, dst, lookupId, keys, valueType)); } public FindValueResponse createFindValueResponse(Contact src, Contact dst, MessageID messageId, float requestLoad, Collection<? extends DHTValueEntity> entities, Collection<KUID> secondaryKeys) { return new FindValueResponseWireImpl( delegate.createFindValueResponse(src, dst, messageId, requestLoad, entities, secondaryKeys)); } public PingRequest createPingRequest(Contact src, SocketAddress dst) { return new PingRequestWireImpl( delegate.createPingRequest(src, dst)); } public PingResponse createPingResponse(Contact src, Contact dst, MessageID messageId, SocketAddress externalAddress, BigInteger estimatedSize) { return new PingResponseWireImpl( delegate.createPingResponse(src, dst, messageId, externalAddress, estimatedSize)); } public StatsRequest createStatsRequest(Contact src, SocketAddress dst, StatisticType stats) { return new StatsRequestWireImpl( delegate.createStatsRequest(src, dst, stats)); } public StatsResponse createStatsResponse(Contact src, Contact dst, MessageID messageId, byte[] statistics) { return new StatsResponseWireImpl( delegate.createStatsResponse(src, dst, messageId, statistics)); } public StoreRequest createStoreRequest(Contact src, SocketAddress dst, SecurityToken securityToken, Collection<? extends DHTValueEntity> values) { return new StoreRequestWireImpl( delegate.createStoreRequest(src, dst, securityToken, values)); } public StoreResponse createStoreResponse(Contact src, Contact dst, MessageID messageId, Collection<StoreStatusCode> status) { return new StoreResponseWireImpl( delegate.createStoreResponse(src, dst, messageId, status)); } }