4 package example.chord;
\r
6 import peersim.core.*;
\r
7 import peersim.config.Configuration;
\r
14 public class CreateNw implements Control {
\r
16 private int pid = 0;
\r
18 private static final String PAR_IDLENGTH = "idLength";
\r
20 private static final String PAR_PROT = "protocol";
\r
22 private static final String PAR_SUCCSIZE = "succListSize";
\r
26 int successorLsize = 0;
\r
30 boolean verbose = false;
\r
35 public CreateNw(String prefix) {
\r
36 pid = Configuration.getPid(prefix + "." + PAR_PROT);
\r
37 idLength = Configuration.getInt(prefix + "." + PAR_IDLENGTH);
\r
38 successorLsize = Configuration.getInt(prefix + "." + PAR_SUCCSIZE);
\r
44 * @see peersim.core.Control#execute()
\r
47 public boolean execute() {
\r
48 for (int i = 0; i < Network.size(); i++) {
\r
49 Node node = (Node) Network.get(i);
\r
50 ChordProtocol cp = (ChordProtocol) node.getProtocol(pid);
\r
52 cp.succLSize = successorLsize;
\r
54 cp.chordId = new BigInteger(idLength, CommonState.r);
\r
55 cp.fingerTable = new Node[idLength];
\r
56 cp.successorList = new Node[successorLsize];
\r
58 NodeComparator nc = new NodeComparator(pid);
\r
60 createFingerTable();
\r
64 public Node findId(BigInteger id, int nodeOne, int nodeTwo) {
\r
65 if (nodeOne >= (nodeTwo - 1))
\r
66 return Network.get(nodeOne);
\r
67 int middle = (nodeOne + nodeTwo) / 2;
\r
68 if (((middle) >= Network.size() - 1))
\r
69 System.out.print("ERROR: Middle is bigger than Network.size");
\r
70 if (((middle) <= 0))
\r
71 return Network.get(0);
\r
73 BigInteger newId = ((ChordProtocol) ((Node) Network.get(middle))
\r
74 .getProtocol(pid)).chordId;
\r
77 lowId = ((ChordProtocol) ((Node) Network.get(middle - 1))
\r
78 .getProtocol(pid)).chordId;
\r
81 BigInteger highId = ((ChordProtocol) ((Node) Network
\r
82 .get(middle + 1)).getProtocol(pid)).chordId;
\r
83 if (id.compareTo(newId) == 0
\r
84 || ((id.compareTo(newId) == 1) && (id.compareTo(highId) == -1))) {
\r
85 return Network.get(middle);
\r
87 if ((id.compareTo(newId) == -1) && (id.compareTo(lowId) == 1)) {
\r
89 return Network.get(middle - 1);
\r
91 return Network.get(0);
\r
93 if (id.compareTo(newId) == -1) {
\r
94 return findId(id, nodeOne, middle);
\r
95 } else if (id.compareTo(newId) == 1) {
\r
96 return findId(id, middle, nodeTwo);
\r
99 } catch (Exception e) {
\r
100 e.printStackTrace();
\r
105 public void createFingerTable() {
\r
106 BigInteger idFirst = ((ChordProtocol) Network.get(0).getProtocol(pid)).chordId;
\r
107 BigInteger idLast = ((ChordProtocol) Network.get(Network.size() - 1)
\r
108 .getProtocol(pid)).chordId;
\r
109 for (int i = 0; i < Network.size(); i++) {
\r
110 Node node = (Node) Network.get(i);
\r
111 ChordProtocol cp = (ChordProtocol) node.getProtocol(pid);
\r
112 for (int a = 0; a < successorLsize; a++) {
\r
113 if (a + i < (Network.size() - 1))
\r
114 cp.successorList[a] = Network.get(a + i + 1);
\r
116 cp.successorList[a] = Network.get(a);
\r
119 cp.predecessor = (Node) Network.get(i - 1);
\r
121 cp.predecessor = (Node) Network.get(Network.size() - 1);
\r
123 for (j = 0; j < idLength; j++) {
\r
126 base = BigInteger.ONE;
\r
128 base = BigInteger.valueOf(2);
\r
129 for (int exp = 1; exp < j; exp++) {
\r
130 base = base.multiply(BigInteger.valueOf(2));
\r
133 BigInteger pot = cp.chordId.add(base);
\r
134 if (pot.compareTo(idLast) == 1) {
\r
135 pot = (pot.mod(idLast));
\r
136 if (pot.compareTo(cp.chordId) != -1) {
\r
139 if (pot.compareTo(idFirst) == -1) {
\r
140 cp.fingerTable[j] = Network.get(Network.size() - 1);
\r
144 cp.fingerTable[j] = findId(pot, 0, Network.size() - 1);
\r