annotate src/main/java/jp/ac/u_ryukyu/treevnc/TreeManagement.java @ 223:3189e210a7ed

indent fix.
author oc
date Sun, 06 Jul 2014 12:46:20 +0900
parents f1d7cb4a1868
children 0e0e6744432c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
206
2b3eb4a9492f MyRfbProto reorganization
oc
parents: 195
diff changeset
1 package jp.ac.u_ryukyu.treevnc;
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
153
e68dfd1972ac fix bad names.
oc
parents: 147
diff changeset
3
e68dfd1972ac fix bad names.
oc
parents: 147
diff changeset
4 import java.io.IOException;
208
f1d7cb4a1868 compute netmask and netaddress
oc
parents: 206
diff changeset
5 import java.net.InetAddress;
153
e68dfd1972ac fix bad names.
oc
parents: 147
diff changeset
6 import java.util.LinkedList;
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
153
e68dfd1972ac fix bad names.
oc
parents: 147
diff changeset
8 public class TreeManagement {
188
f176bffcdc4a add showTreeNode option.
oc
parents: 178
diff changeset
9
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
10 private LinkedList<TreeVNCNode> nodeList = new LinkedList<TreeVNCNode>();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
11 boolean runflag = false;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
12 private final int treebranch = 2;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
13 private boolean showTreeNode = false;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
14 private byte[] netmask;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
15 private byte[] netaddress;
188
f176bffcdc4a add showTreeNode option.
oc
parents: 178
diff changeset
16
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
17 public TreeManagement(String hostName, int vncport, boolean showTree) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
18 TreeVNCNode me = new TreeVNCNode(hostName, vncport,"localhost");
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
19 showTreeNode = showTree;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
20 me.setTreeNum(0);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
21 nodeList.add(me);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
22 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
23
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
24 //
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
25 // private boolean checkAddress(String line) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
26 // String test[] = line.split("\\.");
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
27 // int a = Integer.parseInt(test[0]);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
28 // int b = Integer.parseInt(test[1]);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
29 // if ((192 == a && b == 168) || (172 == a && (b > 15 || b < 32))
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
30 // || 10 == a) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
31 // return true;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
32 // } else {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
33 // return false;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
34 // }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
35 // }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
138
c3761c896607 minor fix
oc
parents: 136
diff changeset
37
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
38 /**
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
39 * a parent is lost, remove from the list and move last one into here
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
40 * @param nodeNum
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
41 * parent value
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
42 */
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
43 private void moveLastNodeToLostNodePosition(int nodeNum) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
44 nodeList.remove(nodeNum);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
45 TreeVNCNode node = nodeList.removeLast();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
46 node.setTreeNum(nodeNum);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
47 nodeList.add(nodeNum, node) ;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
48 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
50 private void checkParameter(int parent, int counter, int leaderflag2) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
51 System.out.print("number p =" + parent);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
52 System.out.print(" number i =" + counter);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
53 System.out.println(" leaderflag=" + leaderflag2 + "\n");
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
54 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
56 private TreeVNCNode getParentNode(int nodeNum) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
57 int parentnum = (nodeNum - 1) / treebranch;
135
ada4d850a820 lostParent and notFoundParenet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
58 return nodeList.get(parentnum);
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
59 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
60
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
61
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
62 public TreeVNCNode getChildNode(TreeVNCNode newparent, int i) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
63 int child = newparent.getTreeNum() * treebranch + i + 1;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
64 if (child >= nodeList.size()) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
65 return(null);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
66 } else {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
67 return(nodeList.get(child));
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
68 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
69
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
70 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
71
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
72 /**
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
73 * A parent is lost, move last node which has no child to the position
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
74 * @param hostname
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
75 * @param port
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
76 * @param myHostName
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
77 */
195
a204b53a30c7 set connectTo localhostname.
oc
parents: 188
diff changeset
78 public void fixLostParent(String hostname, int port, String myHostName) {
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
79 TreeVNCNode lostParentNode = lookup(nodeList,hostname,port);
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
80 if (lostParentNode == null ) return; // some thing wrong
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
81 int treeNumber = lostParentNode.getTreeNum();
172
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
82 TreeVNCNode deadParent = getParentNode(treeNumber);
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
83 TreeVNCNode me = nodeList.getFirst();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
84 me.setHostName(myHostName);
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
85 if (deadParent.getTreeNum() == 0) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
86 // if dead root, connect me.
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
87 connectTo(me, lostParentNode);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
88 return;
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
89 }
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
90 if (getChildNode(deadParent, 0) == null) return;
172
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
91 moveLastNodeToLostNodePosition(deadParent.getTreeNum());
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
92 lostNodeConnection(deadParent);
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
93 // if lostParentNode is the last one, we don't need reconnection
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
94 // Thread.sleep(intv_time);
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
95 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
96
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
97 /**
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
98 * send reconnect to all children
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
99 * @param newparent
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
100 */
172
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
101 private void lostNodeConnection(TreeVNCNode oldParent) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
102 TreeVNCNode newparent = nodeList.get(oldParent.getTreeNum());
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
103 TreeVNCNode grandfather = getParentNode(newparent.getTreeNum());
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
104
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
105 connectTo(grandfather, newparent);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
106
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
107 for(int i=0; i < treebranch; i++) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
108 TreeVNCNode child = getChildNode(newparent, i);
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
109 if (child != null) {
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
110 connectTo(newparent, child);
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
111 }
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
112 }
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
113
188
f176bffcdc4a add showTreeNode option.
oc
parents: 178
diff changeset
114 if (showTreeNode) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
115 showTreeNode();
188
f176bffcdc4a add showTreeNode option.
oc
parents: 178
diff changeset
116 }
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
117 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
118
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
119
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
120
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
121 public void connectTo(TreeVNCNode newparent, TreeVNCNode n) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
122 TreeVncProtocol vc1 = new TreeVncProtocol(n.getHostname(),n.getPort());
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
123 try {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
124 short nodeId = (short) n.getTreeNum();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
125 vc1.connectTo(newparent.getHostname(), newparent.getPort(), isLeader(n), nodeId);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
126 } catch (IOException e) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
127 // log
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
128 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
129 }
173
70068c2642de fix lostParent.
oc
parents: 172
diff changeset
130
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
131 private int isLeader(TreeVNCNode n) {
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
132 return ( n.getTreeNum() % treebranch == 1) ? 1 : 0;
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
133 }
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
134
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
135 private TreeVNCNode lookup(LinkedList<TreeVNCNode> list, String hostname, int port) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
136 for (TreeVNCNode r : list) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
137 if (r.getHostname().equals(hostname) && r.getPort() == port )
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
138 return r;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
139 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
140 return null;
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
141 }
135
ada4d850a820 lostParent and notFoundParenet
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 134
diff changeset
142
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
143 /**
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
144 * Determine tree topology and send CONNECT_TO command
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
145 * @param hostname
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
146 * @param port
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
147 */
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
148 public void decideWhereToConnect(String hostname, int port, String localhostname) {
147
703db66138b5 WhereToConnect
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
149 TreeVNCNode node = new TreeVNCNode(hostname,port,localhostname);
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
150 node.setTreeNum(nodeList.size());
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
151 nodeList.add(node);
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
152 if (nodeList.size() >= treebranch + 1) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
153 TreeVNCNode parent = getParentNode(node.getTreeNum());
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
154 checkParameter(parent.getTreeNum(), nodeList.size(), isLeader(node));
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
155 connectTo(parent, node);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
156 } else {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
157 // connect to me
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
158 TreeVNCNode me = nodeList.getFirst();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
159 me.setHostName(localhostname);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
160 connectTo(me, node);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
161 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
162 if (showTreeNode) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
163 showTreeNode();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
164 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
165 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
166
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
167 /**
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
168 * show Tree Node.
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
169 */
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
170 public void showTreeNode() {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
171 int nl = 0, pow = 2;
163
c850c2fce039 add showTreeNode method.
oc
parents: 153
diff changeset
172 for (int i=0; i<nodeList.size(); i++) {
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
173 TreeVNCNode treeNode = nodeList.get(i);
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
174 System.out.print(treeNode.getTreeNum() + ":" + treeNode.getPort() + ":" + treeNode.getHostname());
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
175 if (i==nl) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
176 System.out.println();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
177 nl = nl + pow;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
178 pow = pow * pow;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
179 } else {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
180 System.out.print(" ");
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
181 }
172
73c42f9d04a8 fix send connectTo command when lostNodeConnection.
oc
parents: 169
diff changeset
182
163
c850c2fce039 add showTreeNode method.
oc
parents: 153
diff changeset
183 }
188
f176bffcdc4a add showTreeNode option.
oc
parents: 178
diff changeset
184 System.out.println();
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
185 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
187 public LinkedList<TreeVNCNode> getList() {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
188 return nodeList;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
189 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
190
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
191 public void setList(LinkedList<TreeVNCNode> _ls) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
192 nodeList = _ls;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
193 }
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
194
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
195 public int getTreeBranch() {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
196 return treebranch;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
197 }
136
81b558b38b9f reconnection
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 135
diff changeset
198
223
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
199 public void setNetMask(byte[] netmask,byte[] netaddress) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
200 this.netmask = netmask;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
201 this.netaddress = netaddress;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
202 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
203
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
204 public boolean onTheSameNetwork(InetAddress adr ) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
205 byte [] byteadr = adr.getAddress();
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
206 if (byteadr.length != netmask.length) return false;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
207 for(int i=0; i < netmask.length; i++) {
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
208 if ((netmask[i] & byteadr[i])!=netaddress[i]) return false;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
209 }
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
210 return true;
3189e210a7ed indent fix.
oc
parents: 208
diff changeset
211 }
208
f1d7cb4a1868 compute netmask and netaddress
oc
parents: 206
diff changeset
212
54
0ae87c7e767c bug fix
one
parents: 53
diff changeset
213 }