package com.limegroup.gnutella.dht;
import org.limewire.mojito.Context;
import org.limewire.mojito.MojitoDHT;
import org.limewire.mojito.MojitoFactory;
import org.limewire.mojito.routing.RouteTable;
import org.limewire.mojito.routing.Vendor;
import org.limewire.mojito.routing.Version;
import com.limegroup.gnutella.dht.DHTManager.DHTMode;
import com.limegroup.gnutella.util.EventDispatcher;
/**
* Controls passive leaf nodes (DHT nodes which are Gnutella leaves that
* do not fulfill the requirements to become active DHT Nodes). Passive leaf nodes
* must be able to receive solicited UDP to communicate with DHT nodes. They
* also mark mark themselves as firewalled so that nobody will add them to
* the RouteTables.
* <p>
* Passive leaf nodes must be connected (via Gnutella) to a DHT
* enabled Ultrapeer. The reasoning is that a passive leaf node does not bootstrap,
* nor performs any other DHT maintenance operations like refreshing the Buckets
* to avoid additional load on the DHT. They depend entirely on their
* Ultrapeer which feeds them constantly with fresh Contacts. The RouteTable of
* a passive leaf Node is a simple List of size k with LRU eviction (see
* <a href="http://en.wikipedia.org/wiki/Cache_algorithms">Least Recently Used</a>
* caching algorithm).
*/
class PassiveLeafController extends AbstractDHTController {
private RouteTable routeTable;
PassiveLeafController(Vendor vendor, Version version,
EventDispatcher<DHTEvent, DHTEventListener> dispatcher,
DHTControllerFacade dhtControllerFacade) {
super(vendor, version, dispatcher, DHTMode.PASSIVE_LEAF,
dhtControllerFacade);
}
@Override
protected MojitoDHT createMojitoDHT(Vendor vendor, Version version) {
MojitoDHT dht = MojitoFactory.createFirewalledDHT("PassiveLeafDHT", vendor, version);
((Context)dht).setBootstrapped(true);
((Context)dht).setBucketRefresherDisabled(true);
routeTable = new PassiveLeafRouteTable(vendor, version);
dht.setRouteTable(routeTable);
assert (dht.isFirewalled());
return dht;
}
@Override
public void start() {
super.start();
if (isRunning()) {
sendUpdatedCapabilities();
}
}
}