/*
* Mojito Distributed Hash Table (Mojito DHT)
* Copyright (C) 2006-2007 LimeWire LLC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.limewire.mojito.util;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.limewire.mojito.KUID;
import org.limewire.mojito.MojitoDHT;
import org.limewire.mojito.MojitoFactory;
import org.limewire.mojito.concurrent.DHTFuture;
import org.limewire.mojito.result.BootstrapResult;
import org.limewire.mojito.result.PingResult;
import org.limewire.mojito.settings.KademliaSettings;
public class MojitoUtils {
private MojitoUtils() {
}
/**
* A helper method to bootstrap a MojitoDHT instance.
* <p>
* It tries to ping the given SocketAddress (this blocks) and in
* case of a success it will kick off a bootstrap process and returns
* a DHTFuture for the process.
*/
public static DHTFuture<BootstrapResult> bootstrap(MojitoDHT dht, SocketAddress addr)
throws ExecutionException, InterruptedException {
PingResult pong = dht.ping(addr).get();
return dht.bootstrap(pong.getContact());
}
/**
* Creates <code>factor</code> * {@link KademliaSettings#REPLICATION_PARAMETER} bootstrapped DHTs
* and stores each under its node id in a map.
* <p>
* Instances are bound from port 3000 onwards.
* <p>
* Make sure to close them in a try-finally block.
*/
public static List<MojitoDHT> createBootStrappedDHTs(int factor) throws Exception {
return createBootStrappedDHTs(factor, 3000);
}
/**
* Creates <code>factor</code> * {@link KademliaSettings#REPLICATION_PARAMETER} bootstrapped DHTs.
* <p>
* Make sure to close them in a try-finally block.
*
* @param port the port offset to start binding the instances on
*/
public static List<MojitoDHT> createBootStrappedDHTs(int factor, int port) throws Exception {
if (factor < 1) {
throw new IllegalArgumentException("only values >= 1");
}
int k = KademliaSettings.REPLICATION_PARAMETER.getValue();
List<MojitoDHT> dhts = new ArrayList<MojitoDHT>();
for (int i = 0; i < factor * k; i++) {
MojitoDHT dht = MojitoFactory.createDHT("DHT-" + i);
dht.bind(new InetSocketAddress(port + i));
dht.start();
if (i > 0) {
dht.bootstrap(new InetSocketAddress("localhost", port)).get();
}
dhts.add(dht);
}
dhts.get(0).bootstrap(dhts.get(1).getContactAddress()).get();
return dhts;
}
/**
* Creates <code>factor</code> * {@link KademliaSettings#REPLICATION_PARAMETER} bootstrapped DHTs
* and stores each under its node id in a map.
* <p>
* Instances are bound from port 3000 onwards.
* <p>
* Make sure to close them in a try-finally block.
*/
public static Map<KUID, MojitoDHT> createBootStrappedDHTsMap(int factor) throws Exception {
return createBootStrappedDHTsMap(factor, 3000);
}
/**
* Creates <code>factor</code> * {@link KademliaSettings#REPLICATION_PARAMETER} bootstrapped DHTs
* and stores each under its node id in a map.
* <p>
* Make sure to close them in a try-finally block.
*
* @param port the port offset to start binding the instances on
*/
public static Map<KUID, MojitoDHT> createBootStrappedDHTsMap(int factor, int port) throws Exception {
if (factor < 1) {
throw new IllegalArgumentException("only values >= 1");
}
int k = KademliaSettings.REPLICATION_PARAMETER.getValue();
Map<KUID, MojitoDHT> dhts = new LinkedHashMap<KUID, MojitoDHT>();
MojitoDHT first = null;
for (int i = 0; i < factor * k; i++) {
MojitoDHT dht = MojitoFactory.createDHT("DHT-" + i);
dht.bind(new InetSocketAddress(port + i));
dht.start();
if (i > 0) {
dht.bootstrap(new InetSocketAddress("localhost", port)).get();
} else {
first = dht;
}
dhts.put(dht.getLocalNodeID(), dht);
}
if (first != null) { // unnecessary null check to satisfy compiler, although if k was null it would be necessary
first.bootstrap(new InetSocketAddress("localhost", 3000 + 1)).get();
}
return dhts;
}
}