1 package example.chord;
\r
3 import java.math.BigInteger;
\r
4 import java.util.Random;
\r
5 import peersim.config.Configuration;
\r
6 import peersim.core.CommonState;
\r
7 import peersim.core.Network;
\r
8 import peersim.core.Node;
\r
9 import peersim.dynamics.NodeInitializer;
\r
11 public class ChordInitializer implements NodeInitializer {
\r
13 private static final String PAR_PROT = "protocol";
\r
15 private int pid = 0;
\r
17 private ChordProtocol cp;
\r
19 public ChordInitializer(String prefix) {
\r
20 pid = Configuration.getPid(prefix + "." + PAR_PROT);
\r
23 public void initialize(Node n) {
\r
24 cp = (ChordProtocol) n.getProtocol(pid);
\r
28 public void join(Node myNode) {
\r
29 Random generator = new Random();
\r
30 //Random generator = new Random(1234567890);
\r
31 cp.predecessor = null;
\r
32 // search a node to join
\r
35 n = Network.get(generator.nextInt(Network.size()));
\r
36 } while (n == null || n.isUp() == false);
\r
37 cp.m = ((ChordProtocol) n.getProtocol(pid)).m;
\r
38 cp.chordId = new BigInteger(cp.m, CommonState.r);
\r
39 ChordProtocol cpRemote = (ChordProtocol) n.getProtocol(pid);
\r
41 Node successor = cpRemote.find_successor(cp.chordId);
\r
43 cp.stabilizations = 0;
\r
44 cp.varSuccList = cpRemote.varSuccList;
\r
46 cp.succLSize = cpRemote.succLSize;
\r
47 cp.successorList = new Node[cp.succLSize];
\r
48 cp.successorList[0] = successor;
\r
49 cp.fingerTable = new Node[cp.m];
\r
51 BigInteger lastId = ((ChordProtocol) Network.get(Network.size() - 1)
\r
52 .getProtocol(pid)).chordId;
\r
54 cp.stabilizations++;
\r
55 succId = cp.successorList[0].getID();
\r
56 cp.stabilize(myNode);
\r
57 if (((ChordProtocol) cp.successorList[0].getProtocol(pid)).chordId
\r
58 .compareTo(cp.chordId) < 0) {
\r
59 cp.successorList[0] = ((ChordProtocol) cp.successorList[0]
\r
60 .getProtocol(pid)).find_successor(cp.chordId);
\r
62 // controllo di non essere l'ultimo elemento della rete
\r
63 if (cp.chordId.compareTo(lastId) > 0) {
\r
64 cp.successorList[0] = Network.get(0);
\r
67 } while (cp.successorList[0].getID() != succId
\r
68 || ((ChordProtocol) cp.successorList[0].getProtocol(pid)).chordId
\r
69 .compareTo(cp.chordId) < 0);
\r