/*
* Copyright 2012 Thomas Bocek
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package net.tomp2p.relay;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Random;
import net.tomp2p.connection.Bindings;
import net.tomp2p.dht.PeerBuilderDHT;
import net.tomp2p.dht.PeerDHT;
import net.tomp2p.message.Message;
import net.tomp2p.message.Message.Type;
import net.tomp2p.p2p.AutomaticFuture;
import net.tomp2p.p2p.Peer;
import net.tomp2p.p2p.PeerBuilder;
import net.tomp2p.peers.Number160;
import net.tomp2p.peers.PeerAddress;
import net.tomp2p.peers.PeerMap;
import net.tomp2p.peers.PeerMapConfiguration;
import net.tomp2p.rpc.RPC.Commands;
public class UtilsNAT {
public static PeerDHT[] createNodesDHT(int nrOfPeers, Random rnd, int port) throws Exception {
return createNodesDHT(nrOfPeers, rnd, port, null);
}
public static PeerDHT[] createNodesDHT(int nrOfPeers, Random rnd, int port, AutomaticFuture automaticFuture)
throws Exception {
return createNodesDHT(nrOfPeers, rnd, port, automaticFuture, false);
}
/**
* Creates peers for testing. The first peer (peer[0]) will be used as the master. This means that
* shutting down
* peer[0] will shut down all other peers
*
* @param nrOfPeers
* The number of peers to create including the master
* @param rnd
* The random object to create random peer IDs
* @param port
* The port where the master peer will listen to
* @return All the peers, with the master peer at position 0 -> peer[0]
* @throws Exception
* If the creation of nodes fail.
*/
public static PeerDHT[] createNodesDHT(int nrOfPeers, Random rnd, int port, AutomaticFuture automaticFuture,
boolean maintenance) throws Exception {
if (nrOfPeers < 1) {
throw new IllegalArgumentException("Cannot create less than 1 peer");
}
Bindings bindings = new Bindings();// .addInterface("lo");
PeerDHT[] peers = new PeerDHT[nrOfPeers];
final Peer master;
if (automaticFuture != null) {
Number160 peerId = new Number160(rnd);
PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId));
master = new PeerBuilder(peerId).ports(port).enableMaintenance(maintenance).bindings(bindings).peerMap(peerMap)
.start().addAutomaticFuture(automaticFuture);
peers[0] = new PeerBuilderDHT(master).start();
} else {
Number160 peerId = new Number160(rnd);
PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId));
master = new PeerBuilder(peerId).enableMaintenance(maintenance).bindings(bindings).peerMap(peerMap).ports(port)
.start();
peers[0] = new PeerBuilderDHT(master).start();
}
for (int i = 1; i < nrOfPeers; i++) {
if (automaticFuture != null) {
Number160 peerId = new Number160(rnd);
PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId));
Peer peer = new PeerBuilder(peerId).masterPeer(master).enableMaintenance(maintenance)
.enableMaintenance(maintenance).peerMap(peerMap).bindings(bindings).start()
.addAutomaticFuture(automaticFuture);
peers[i] = new PeerBuilderDHT(peer).start();
} else {
Number160 peerId = new Number160(rnd);
PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId).peerNoVerification());
Peer peer = new PeerBuilder(peerId).enableMaintenance(maintenance).bindings(bindings).peerMap(peerMap)
.masterPeer(master).start();
peers[i] = new PeerBuilderDHT(peer).start();
}
}
System.err.println("peers created.");
return peers;
}
/**
* Perfect routing, where each neighbor has contacted each other. This means that for small number of
* peers, every
* peer knows every other peer.
*
* @param peers
* The peers taking part in the p2p network.
*/
public static void perfectRouting(PeerDHT... peers) {
for (int i = 0; i < peers.length; i++) {
for (int j = 0; j < peers.length; j++)
peers[i].peer().peerBean().peerMap().peerFound(peers[j].peer().peerAddress(), null, null, null);
}
System.err.println("perfect routing done.");
}
public static Peer[] createNodes(int nrOfPeers, Random rnd, int port) throws Exception {
return createNodes(nrOfPeers, rnd, port, null);
}
public static Peer[] createNodes(int nrOfPeers, Random rnd, int port, AutomaticFuture automaticFuture) throws Exception {
return createNodes(nrOfPeers, rnd, port, automaticFuture, false);
}
/**
* Creates peers for testing. The first peer (peer[0]) will be used as the master. This means that
* shutting down
* peer[0] will shut down all other peers
*
* @param nrOfPeers
* The number of peers to create including the master
* @param rnd
* The random object to create random peer IDs
* @param port
* The port where the master peer will listen to
* @return All the peers, with the master peer at position 0 -> peer[0]
* @throws Exception
* If the creation of nodes fail.
*/
public static Peer[] createNodes(int nrOfPeers, Random rnd, int port, AutomaticFuture automaticFuture,
boolean maintenance) throws Exception {
if (nrOfPeers < 1) {
throw new IllegalArgumentException("Cannot create less than 1 peer");
}
Bindings bindings = new Bindings().addAddress(InetAddress.getLocalHost());
// Bindings bindings = new Bindings().addInterface("lo0");
Peer[] peers = new Peer[nrOfPeers];
if (automaticFuture != null) {
Number160 peerId = new Number160(rnd);
PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId));
peers[0] = new PeerBuilder(peerId).ports(port).enableMaintenance(maintenance).bindings(bindings)
.peerMap(peerMap).start().addAutomaticFuture(automaticFuture);
} else {
Number160 peerId = new Number160(rnd);
PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId));
peers[0] = new PeerBuilder(peerId).enableMaintenance(maintenance).bindings(bindings).peerMap(peerMap)
.ports(port).start();
}
for (int i = 1; i < nrOfPeers; i++) {
if (automaticFuture != null) {
Number160 peerId = new Number160(rnd);
PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId));
peers[i] = new PeerBuilder(peerId).masterPeer(peers[0]).enableMaintenance(maintenance)
.enableMaintenance(maintenance).peerMap(peerMap).bindings(bindings).start()
.addAutomaticFuture(automaticFuture);
} else {
Number160 peerId = new Number160(rnd);
PeerMap peerMap = new PeerMap(new PeerMapConfiguration(peerId).peerNoVerification());
peers[i] = new PeerBuilder(peerId).enableMaintenance(maintenance).bindings(bindings).peerMap(peerMap)
.masterPeer(peers[0]).start();
}
}
System.err.println("peers created.");
return peers;
}
/**
* Perfect routing, where each neighbor has contacted each other. This means that for small number of
* peers, every
* peer knows every other peer.
*
* @param peers
* The peers taking part in the p2p network.
*/
public static void perfectRouting(Peer... peers) {
for (int i = 0; i < peers.length; i++) {
for (int j = 0; j < peers.length; j++)
peers[i].peerBean().peerMap().peerFound(peers[j].peerAddress(), null, null, null);
}
System.err.println("perfect routing done.");
}
public static PeerAddress createAddress() throws UnknownHostException {
return createAddress(new Number160("0x5678"), "127.0.0.1", 8005, 8006, false, false);
}
public static PeerAddress createRandomAddress() throws UnknownHostException {
Random rnd = new Random();
return createAddress(new Number160(rnd), "127.0.0.1", rnd.nextInt(10000), rnd.nextInt(10000), rnd.nextBoolean(),
rnd.nextBoolean());
}
public static PeerAddress createAddress(Number160 idSender, String inetSender, int tcpPortSender, int udpPortSender,
boolean firewallUDP, boolean firewallTCP) throws UnknownHostException {
PeerAddress n1 = PeerAddress.create(idSender, inetSender, udpPortSender, tcpPortSender, udpPortSender + 1);
return n1;
}
/**
* Creates a message with random content
*/
public static Message createRandomMessage() {
Random rnd = new Random();
Message message = new Message();
message.command(Commands.values()[rnd.nextInt(Commands.values().length)].getNr());
message.type(Type.values()[rnd.nextInt(Type.values().length)]);
message.recipientSocket(new InetSocketAddress(1234));
message.recipient(PeerAddress.create(new Number160(rnd), message.recipientSocket()));
message.senderSocket(new InetSocketAddress(5678));
message.sender(PeerAddress.create(new Number160(rnd), message.senderSocket()));
return message;
}
public static boolean messagesEqual(Message m1, Message m2) {
return m1.messageId() == m2.messageId()
&& m1.hasContent() == m2.hasContent()
&& m1.type() == m2.type()
&& m1.command() == m2.command()
&& m1.sender().equals(m2.sender())
&& m1.recipient().equals(m2.recipient())
&& m1.sender().equals(m2.sender())
&& m1.recipient().equals(m2.recipient());
}
}