Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
08c4195e1f4e117682a879af757dd66ddec9b358
[jaceP2P.git] / src / jaceP2P / TokenThread.java
1 package jaceP2P;
2
3 import java.util.Vector;
4
5 public class TokenThread extends Thread {
6
7         public static TokenThread Instance = null;
8
9         public boolean token = false;
10
11         public TokenThread() {
12         }
13
14         public boolean getToken() {
15                 return token;
16         }
17
18         public static TokenThread Instance() {
19
20                 if (Instance == null)
21                         Instance = new TokenThread();
22                 return Instance;
23         }
24
25         public void run() {
26
27                 while (true) {
28                         try {
29                                 Thread.sleep(2000);
30                                 // System.out.println("TokenThread still alive");
31                                 if (token) {
32                                         // System.out.println("distribute!!!!");
33                                         distribute();
34                                 } else {
35                                         // System.out.println("waiting !!!! token="+token);
36                                         wait();
37
38                                 }
39                         } catch (Exception e) {
40                         }
41                 }
42         }
43
44         public void setToken() {
45                 token = true;
46                 ScanThreadSuperNode.Instance().setToken(false);
47                 System.out.println("the token is put to true in the tokenthread");
48                 try {
49                         synchronized (TokenThread.Instance()) {
50                                 TokenThread.Instance().notify();
51                         }
52                 } catch (Exception e) {
53                         System.out.println("unable to notify :" + e);
54                 }
55                 // System.out.println("finished set token");
56         }
57
58         @SuppressWarnings("unchecked")
59         public void distribute() {
60                 System.out.println("totalDaemons="
61                                 + SuperNodeListe.Instance().getTotalDaemons());
62                 int nbLocal = Register.Instance().getSize();
63                 int totalDaemons;
64                 Vector liste = SuperNodeListe.Instance().getListe();
65                 synchronized (SuperNodeListe.Instance()) {
66                         synchronized (Register.Instance()) {
67                                 if (nbLocal > 5) {
68                                         totalDaemons = SuperNodeListe.Instance().getTotalDaemons();
69                                         int nbDaemons = totalDaemons / liste.size();
70                                         // System.out.println("nbDaemons="+nbDaemons+" totalDaemons="+totalDaemons+" nbLocal="+nbLocal);
71                                         if (nbDaemons < nbLocal)
72                                                 for (int i = 0; i < liste.size(); i++)
73                                                         if (((SuperNodeData) liste.get(i)).getNbOfNodes() < nbDaemons)
74                                                                 try {
75                                                                         // System.out.println("Snode="+i+" nodes="+((SuperNodeData)liste.get(i)).getNbOfNodes());
76                                                                         Vector nodes = Register.Instance()
77                                                                                         .getListe();
78                                                                         int amountToSend = nbDaemons
79                                                                                         - ((SuperNodeData) liste.get(i))
80                                                                                                         .getNbOfNodes();
81                                                                         Vector newVector = new Vector();
82                                                                         for (int j = 0; j < amountToSend; j++) {
83                                                                                 newVector.add(nodes.elementAt(j));
84                                                                         }
85                                                                         ((SuperNodeData) liste.get(i)).getStub()
86                                                                                         .sendSurplus(newVector);
87                                                                         for (int j = 0; j < amountToSend; j++)
88                                                                                 nodes.remove(0);
89                                                                         int index = SuperNodeListe.Instance()
90                                                                                         .existSuperNode(
91                                                                                                         LocalHost.Instance()
92                                                                                                                         .getIP());
93                                                                         ((SuperNodeData) SuperNodeListe.Instance()
94                                                                                         .getListe().get(index))
95                                                                                         .setNbOfNodes(Register.Instance()
96                                                                                                         .getSize());
97                                                                         System.out.println("size reg="
98                                                                                         + Register.Instance().getSize()
99                                                                                         + " liste="
100                                                                                         + ((SuperNodeData) SuperNodeListe
101                                                                                                         .Instance().getListe().get(
102                                                                                                                         index))
103                                                                                                         .getNbOfNodes());
104                                                                         new ForwardCount().start();
105                                                                 } catch (Exception e) {
106
107                                                                         System.out
108                                                                                         .println("unable to send surplus to "
109                                                                                                         + ((SuperNodeData) liste
110                                                                                                                         .get(i)).getIP()
111                                                                                                         + " :" + e);
112                                                                 }
113
114                                 }
115                         }
116                 }
117                 boolean sendToken = true;
118                 while (sendToken) {
119                         // index of local node
120                         int index = SuperNodeListe.Instance().existSuperNode(
121                                         LocalHost.Instance().getIP());
122                         // index of next node
123
124                         // System.out.println("index="+index);
125                         // System.out.println(SuperNodeListe.Instance().getListe().size());
126                         // System.out.println(((SuperNodeData)SuperNodeListe.Instance().getListe().elementAt(0)).getIP());
127                         index = (index + 1) % SuperNodeListe.Instance().getListe().size();
128                         // System.out.println("index="+index);
129                         try {
130                                 ((SuperNodeData) liste.elementAt(index)).getStub().setToken();
131                                 if (index != SuperNodeListe.Instance().existSuperNode(
132                                                 LocalHost.Instance().getIP()))
133                                         token = false;
134                                 sendToken = false;
135                                 System.out.println("Passing token to " + index);
136                         } catch (Exception e) {
137                                 try {
138                                         System.out.println("Unable to send Token to "
139                                                         + ((SuperNodeData) liste.elementAt(index)).getIP()
140                                                         + " :" + e);
141                                         /*
142                                          * SuperNodeListe.Instance().removeSuperNode(((SuperNodeData)
143                                          * liste.elementAt(index)));
144                                          * 
145                                          * try{ for(int
146                                          * i=0;i<SuperNodeListe.Instance().getListe().size();i++)
147                                          * 
148                                          * ((SuperNodeData)SuperNodeListe.Instance().getListe().
149                                          * elementAt
150                                          * (i)).getStub.removeSuperNode(((SuperNodeData)liste
151                                          * .elementAt(index)));
152                                          * 
153                                          * }catch(Exception e2){System.out.println(
154                                          * "diffuse the message concerning a dead superNode: "+e2);
155                                          * } if(index==SuperNodeListe.Instance().getListe().size())
156                                          * index=0;
157                                          * HeartBeatThread.Instance().setServer(((SuperNodeData
158                                          * )liste.elementAt(index)).getStub()); try{
159                                          */
160
161                                         Thread.sleep(HeartBeatSNode.Instance().getHeartTime());
162                                 } catch (Exception e2) {
163                                         System.out.println("-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_");
164                                 }
165                         }
166                 }
167         }
168 }