package com.limegroup.gnutella.dht.io;
import org.limewire.inspection.InspectionHistogram;
import org.limewire.inspection.InspectionPoint;
import org.limewire.mojito.Context;
import org.limewire.mojito.io.MessageDispatcher;
import org.limewire.mojito.io.MessageDispatcherFactory;
import org.limewire.mojito.io.MessageDispatcher.MessageDispatcherEvent;
import org.limewire.mojito.io.MessageDispatcher.MessageDispatcherListener;
import org.limewire.mojito.messages.DHTMessage.OpCode;
import org.limewire.security.SecureMessageVerifier;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.limegroup.gnutella.MessageRouter;
import com.limegroup.gnutella.UDPService;
import com.limegroup.gnutella.messages.Message;
import com.limegroup.gnutella.messages.MessageFactory;
/**
* Creates {@link LimeMessageDispatcherImpl}s.
*/
@Singleton
public class LimeMessageDispatcherFactoryImpl implements
MessageDispatcherFactory {
private final Provider<com.limegroup.gnutella.MessageDispatcher> messageDispatcher;
private final Provider<MessageRouter> messageRouter;
private final Provider<SecureMessageVerifier> secureMessageVerifier;
private final Provider<UDPService >udpService;
private final MessageFactory messageFactory;
@InspectionPoint("dht sent messages")
private final Message.MessageCounter sentDHTMessageCounter = new Message.MessageCounter(50);
@InspectionPoint("dht received messages")
private final Message.MessageCounter receivedDHTMessageCounter = new Message.MessageCounter(50);
@InspectionPoint("dht sent messages histogram")
private final InspectionHistogram<OpCode> sentMessagesHistogram = new InspectionHistogram<OpCode>();
@InspectionPoint("dht received messages histogram")
private final InspectionHistogram<OpCode> receivedMessagesHistogram = new InspectionHistogram<OpCode>();
private final CountingMessageDispatcherListener dispatcherListener = new CountingMessageDispatcherListener();
@Inject
public LimeMessageDispatcherFactoryImpl(
Provider<com.limegroup.gnutella.MessageDispatcher> messageDispatcher,
Provider<MessageRouter> messageRouter,
Provider<SecureMessageVerifier> secureMessageVerifier, Provider<UDPService> udpService,
MessageFactory messageFactory) {
this.messageDispatcher = messageDispatcher;
this.messageRouter = messageRouter;
this.secureMessageVerifier = secureMessageVerifier;
this.udpService = udpService;
this.messageFactory = messageFactory;
}
public MessageDispatcher create(Context context) {
LimeMessageDispatcherImpl messageDispatcherImpl = new LimeMessageDispatcherImpl(context, udpService,
secureMessageVerifier, messageRouter, messageDispatcher, messageFactory);
messageDispatcherImpl.addMessageDispatcherListener(dispatcherListener);
return messageDispatcherImpl;
}
private class CountingMessageDispatcherListener implements MessageDispatcherListener {
public void handleMessageDispatcherEvent(MessageDispatcherEvent event) {
switch (event.getEventType()) {
case MESSAGE_RECEIVED:
receivedDHTMessageCounter.countMessage((Message)event.getMessage());
receivedMessagesHistogram.count(event.getMessage().getOpCode());
break;
case MESSAGE_SENT:
sentDHTMessageCounter.countMessage((Message)event.getMessage());
sentMessagesHistogram.count(event.getMessage().getOpCode());
break;
}
}
}
}