Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
kill another out of date script
[simgrid.git] / contrib / psg / src / example / chord / CreateNw.java
1 /**\r
2  * \r
3  */\r
4 package example.chord;\r
5 \r
6 import peersim.core.*;\r
7 import peersim.config.Configuration;\r
8 import java.math.*;\r
9 \r
10 /**\r
11  * @author Andrea\r
12  * \r
13  */\r
14 public class CreateNw implements Control {\r
15 \r
16         private int pid = 0;\r
17 \r
18         private static final String PAR_IDLENGTH = "idLength";\r
19 \r
20         private static final String PAR_PROT = "protocol";\r
21 \r
22         private static final String PAR_SUCCSIZE = "succListSize";\r
23 \r
24         int idLength = 0;\r
25 \r
26         int successorLsize = 0;\r
27 \r
28         int fingSize = 0;\r
29         //campo x debug\r
30         boolean verbose = false;\r
31 \r
32         /**\r
33          * \r
34          */\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
39         }\r
40 \r
41         /*\r
42          * (non-Javadoc)\r
43          * \r
44          * @see peersim.core.Control#execute()\r
45          */\r
46 \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
51                         cp.m = idLength;\r
52                         cp.succLSize = successorLsize;\r
53                         cp.varSuccList = 0;\r
54                         cp.chordId = new BigInteger(idLength, CommonState.r);\r
55                         cp.fingerTable = new Node[idLength];\r
56                         cp.successorList = new Node[successorLsize];\r
57                 }\r
58                 NodeComparator nc = new NodeComparator(pid);\r
59                 Network.sort(nc);\r
60                 createFingerTable();\r
61                 return false;\r
62         }\r
63 \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
72                 try {\r
73                         BigInteger newId = ((ChordProtocol) ((Node) Network.get(middle))\r
74                                         .getProtocol(pid)).chordId;\r
75                         BigInteger lowId;\r
76                         if (middle > 0)\r
77                                 lowId = ((ChordProtocol) ((Node) Network.get(middle - 1))\r
78                                                 .getProtocol(pid)).chordId;\r
79                         else\r
80                                 lowId = newId;\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
86                         }\r
87                         if ((id.compareTo(newId) == -1) && (id.compareTo(lowId) == 1)) {\r
88                                 if (middle > 0)\r
89                                         return Network.get(middle - 1);\r
90                                 else\r
91                                         return Network.get(0);\r
92                         }\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
97                         }\r
98                         return null;\r
99                 } catch (Exception e) {\r
100                         e.printStackTrace();\r
101                         return null;\r
102                 }\r
103         }\r
104 \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
115                                 else\r
116                                         cp.successorList[a] = Network.get(a);\r
117                         }\r
118                         if (i > 0)\r
119                                 cp.predecessor = (Node) Network.get(i - 1);\r
120                         else\r
121                                 cp.predecessor = (Node) Network.get(Network.size() - 1);\r
122                         int j = 0;\r
123                         for (j = 0; j < idLength; j++) {\r
124                                 BigInteger base;\r
125                                 if (j == 0)\r
126                                         base = BigInteger.ONE;\r
127                                 else {\r
128                                         base = BigInteger.valueOf(2);\r
129                                         for (int exp = 1; exp < j; exp++) {\r
130                                                 base = base.multiply(BigInteger.valueOf(2));\r
131                                         }\r
132                                 }\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
137                                                 break;\r
138                                         }\r
139                                         if (pot.compareTo(idFirst) == -1) {\r
140                                                 cp.fingerTable[j] = Network.get(Network.size() - 1);\r
141                                                 continue;\r
142                                         }\r
143                                 }\r
144                                 cp.fingerTable[j] = findId(pot, 0, Network.size() - 1);\r
145                         }\r
146                 }\r
147         }\r
148 }\r