annotate rep/SessionManager.java @ 492:d2afd4efdd2d

remove unMergedCmds, use sentList instead.
author one
date Sat, 23 Oct 2010 16:15:14 +0900
parents cc262a519b8a
children ebfa3b05a8dd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
266
4a02c7f26794 *** empty log message ***
kono
parents: 264
diff changeset
1
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
2 package rep;
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
3
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
4 import java.io.IOException;
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
5 import java.net.InetSocketAddress;
267
c513cf1ce9cc call handle.cancel() on socket channel close.
kono
parents: 266
diff changeset
6 import java.nio.channels.ClosedChannelException;
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
7 import java.util.LinkedList;
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
8
346
edf0e0a5ffc8 *** empty log message ***
kono
parents: 343
diff changeset
9 import org.xml.sax.SAXException;
edf0e0a5ffc8 *** empty log message ***
kono
parents: 343
diff changeset
10
198
ff3fcdcccc85 *** empty log message ***
pin
parents: 192
diff changeset
11
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
12
337
5ba5b7a9761b use REPLogger
kono
parents: 336
diff changeset
13 import rep.channel.REPLogger;
133
8dce4348966c *** empty log message ***
kono
parents: 124
diff changeset
14 import rep.channel.REPSocketChannel;
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
15 import rep.gui.CloseButtonEvent;
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
16 import rep.gui.DoGUIUpdate;
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
17 import rep.gui.SelectButtonEvent;
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
18 import rep.gui.SessionManagerEvent;
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
19 import rep.gui.SessionManagerEventListener;
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
20 import rep.gui.SessionManagerGUI;
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
21 import rep.gui.SessionManagerGUIimpl;
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
22 import rep.handler.Editor;
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
23 import rep.handler.REPNode;
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
24 import rep.handler.FirstConnector;
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
25 import rep.handler.Forwarder;
56
6ead43b2475e *** empty log message ***
pin
parents: 53
diff changeset
26 import rep.xml.SessionXMLDecoder;
45
10f1adf6d74d *** empty log message ***
pin
parents: 39
diff changeset
27 import rep.xml.SessionXMLEncoder;
264
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
28
198
ff3fcdcccc85 *** empty log message ***
pin
parents: 192
diff changeset
29 /*
264
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
30 +-------+--------+--------+-------+--------+---------+------+
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
31 | cmd | session| editor | seqid | lineno | textsiz | text |
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
32 | | id | id | | | | |
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
33 +-------+--------+--------+-------+--------+---------+------+
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
34 o---------- header section (network order) ----------o
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
35
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
36 int cmd; kind of command
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
37 int sid; session ID : uniqu to editing file
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
38 int eid; editor ID : owner editor ID = 1。Session に対して unique
308
c5be84d53c7f *** empty log message ***
kono
parents: 304
diff changeset
39 -1 session manager command
c5be84d53c7f *** empty log message ***
kono
parents: 304
diff changeset
40 -2 merge command
264
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
41 int seqno; Sequence number : sequence number はエディタごとに管理
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
42 int lineno; line number
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
43 int textsize; textsize : bytesize
8c02ec16b874 *** empty log message ***
pin
parents: 259
diff changeset
44 byte[] text;
198
ff3fcdcccc85 *** empty log message ***
pin
parents: 192
diff changeset
45 */
1
3f5bf0255f5e *** empty log message ***
pin
parents: 0
diff changeset
46
384
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
47 public class SessionManager extends ServerMainLoop
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
48 implements SessionManagerEventListener {
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
49 SessionList sessionList = new SessionList();
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
50 // Known Session Manager List, At most one parent. No parent means master.
384
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
51 SessionManagerList smList = new SessionManagerList();
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
52 // Known Editor list. Connected Editor has a channel.
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
53 // Session Manager Channel may have dummy editors.
391
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 389
diff changeset
54 public EditorList editorList = new EditorList();
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
55 // Queue limit for debugging purpose.
387
6f356d160e58 IPv6 any address
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 386
diff changeset
56 static final int packetLimit = 400;
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
57
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
58 // globalSessionID = SessionManagerID * MAXID + localSessionID
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
59 private static final int MAXID = 10000;
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
60 SessionXMLDecoder decoder = new SessionXMLDecoder();
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
61 SessionXMLEncoder encoder = new SessionXMLEncoder();
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
62 // SocketChannel for our parent. At most one parent is allowed.
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
63 private REPNode sm_join_channel;
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
64 // Routing table for session and session manager.
369
7d21eb209e27 *** empty log message ***
kono
parents: 367
diff changeset
65 private RoutingTable routingTable = new RoutingTable(this);
386
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
66 // sync option
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
67 public boolean sync = true;
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
68 // list olny local editor in GUI
2c815dd5f797 add comments.
one
parents: 399
diff changeset
69 protected boolean listLocalEditorOnly = false;
2c815dd5f797 add comments.
one
parents: 399
diff changeset
70
384
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
71 static public REPLogger logger = REPLogger.singleton();
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
72
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
73 public static void main(String[] args) throws InterruptedException, IOException {
384
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
74 int port =ServerMainLoop.DEFAULT_PORT;
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
75 int port_s = ServerMainLoop.DEFAULT_PORT;
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
76 //System.setProperty("file.encoding", "UTF-8");
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
77 if(args.length > 0){
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
78 if (args.length!=2) {
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
79 logger.writeLog("Usage: sessionManager our_port parent_port");
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
80 return;
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
81 }
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
82 port = Integer.parseInt(args[0]);
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
83 port_s = Integer.parseInt(args[1]);
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
84 }
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
85 SessionManager sm = new SessionManager();
336
d00cb51ba652 *** empty log message ***
kono
parents: 334
diff changeset
86 sm.setReceivePort(port);
d00cb51ba652 *** empty log message ***
kono
parents: 334
diff changeset
87 sm.setParentPort(port_s);
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
88 // Ok start main loop
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
89 sm.init(port,new SessionManagerGUIimpl(sm));
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
90 }
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
91
280
a549bd4dadb8 *** empty log message ***
kono
parents: 279
diff changeset
92 public void init(int port, SessionManagerGUI gui) throws IOException, InterruptedException {
384
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
93 mainLoop(this, port, gui);
2
02fa9a68d9a2 *** empty log message ***
pin
parents: 1
diff changeset
94 }
02fa9a68d9a2 *** empty log message ***
pin
parents: 1
diff changeset
95
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
96 /*
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
97 * After loop detection, we give up session manager join.
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
98 */
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
99 private void cancel_sm_join() {
364
c965ef2b5fd6 *** empty log message ***
kono
parents: 363
diff changeset
100 logger.writeLog("Loop detected "+this);
384
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
101 removeChannel(this, sm_join_channel);
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
102 sm_join_channel=null;
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
103 }
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
104
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
105
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
106 /**
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
107 * GUI から、呼ばれて、Session Managerに接続する。
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
108 * Host 名のSession Manager に SM_JOIN する。自分は、Session を持っていては
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
109 * ならない。複数のSession Managerにjoinすることは出来ない。(NATを実装するまでは)。
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
110 * @param host
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
111 * @return error massage, return null when no errors.
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
112 */
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
113 public String connectSessionManager(String host, int port) {
2c815dd5f797 add comments.
one
parents: 399
diff changeset
114 if (sm_join_channel!=null) return "No Channel of sessionManager, Network Error.";
2c815dd5f797 add comments.
one
parents: 399
diff changeset
115 if (!sessionList.isEmpty()) return "Cannot connect with sessions.";
2c815dd5f797 add comments.
one
parents: 399
diff changeset
116 if (!smList.isMaster()) return "Already connected to the master.";
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
117 /*
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
118 * IPv6 対応では、複数のアドレスを取って、それのすべてに接続を試す必要が
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
119 * ある。
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
120 */
1
3f5bf0255f5e *** empty log message ***
pin
parents: 0
diff changeset
121 InetSocketAddress addr = new InetSocketAddress(host, port);
3f5bf0255f5e *** empty log message ***
pin
parents: 0
diff changeset
122 try {
186
d22384c0026c *** empty log message ***
kent
parents: 185
diff changeset
123 REPSocketChannel<REPCommand> sessionchannel = REPSocketChannel.<REPCommand>create(new REPCommandPacker());
1
3f5bf0255f5e *** empty log message ***
pin
parents: 0
diff changeset
124 sessionchannel.connect(addr);
337
5ba5b7a9761b use REPLogger
kono
parents: 336
diff changeset
125 while(!sessionchannel.finishConnect());
387
6f356d160e58 IPv6 any address
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 386
diff changeset
126 REPNode sm = new FirstConnector(this,sessionchannel);
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
127 registerChannel(sessionchannel, sm);
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 347
diff changeset
128 sm_join(sm);
1
3f5bf0255f5e *** empty log message ***
pin
parents: 0
diff changeset
129 }catch (IOException e) {
3f5bf0255f5e *** empty log message ***
pin
parents: 0
diff changeset
130 }
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
131 return null;
1
3f5bf0255f5e *** empty log message ***
pin
parents: 0
diff changeset
132 }
364
c965ef2b5fd6 *** empty log message ***
kono
parents: 363
diff changeset
133
378
c78569ab5fce *** empty log message ***
kono
parents: 377
diff changeset
134 public void connectSessionManager(String host) {
c78569ab5fce *** empty log message ***
kono
parents: 377
diff changeset
135 connectSessionManager(host,parent_port);
364
c965ef2b5fd6 *** empty log message ***
kono
parents: 363
diff changeset
136 }
77
eb78312ea831 *** empty log message ***
pin
parents: 76
diff changeset
137
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
138 /**
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
139 * channel に SMCMD_SM_JOIN command を送る。
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
140 * @param channel
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
141 */
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
142 private void sm_join(REPNode channel){
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
143 sm_join_channel = channel;
122
790c8dd42a7b *** empty log message ***
kono
parents: 117
diff changeset
144 //SM_JOINコマンドを生成。
77
eb78312ea831 *** empty log message ***
pin
parents: 76
diff changeset
145 REPCommand command = new REPCommand();
eb78312ea831 *** empty log message ***
pin
parents: 76
diff changeset
146 command.setCMD(REP.SMCMD_SM_JOIN);
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 347
diff changeset
147 command.setEID(-1); // request Parent SessionManagerID
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 347
diff changeset
148 command.setSID(-1); // request SessionManagerID
79
d1877cfd131d *** empty log message ***
pin
parents: 78
diff changeset
149
122
790c8dd42a7b *** empty log message ***
kono
parents: 117
diff changeset
150 //hostnameをセット。
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 347
diff changeset
151 setMyHostName(channel.getLocalHostName());
82
4bb583553a42 *** empty log message ***
pin
parents: 81
diff changeset
152
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
153 String string = myHost;
77
eb78312ea831 *** empty log message ***
pin
parents: 76
diff changeset
154 command.setString(string);
eb78312ea831 *** empty log message ***
pin
parents: 76
diff changeset
155
122
790c8dd42a7b *** empty log message ***
kono
parents: 117
diff changeset
156 //SM_JOINコマンドを送信。
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 347
diff changeset
157 channel.send(command);
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
158 // ack を受け取ったら、SessionManagerのListに追加。ここではやらない。
77
eb78312ea831 *** empty log message ***
pin
parents: 76
diff changeset
159 }
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 347
diff changeset
160
361
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
161 /*
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
162 * Select Session from Manager button
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
163 * selected editor is joined editor directly connected to this session
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
164 * manager.
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
165 */
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
166 public void selectSession(SelectButtonEvent event) throws IOException {
250
5f357ca66714 *** empty log message ***
pin
parents: 246
diff changeset
167 int sid = event.getSID();
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
168 Session session = sessionList.get(sid);
365
c432755c3555 distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents: 364
diff changeset
169 if (session==null) throw new IOException();
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
170 REPNode editor = event.getEditor();
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
171 if (editor.hasSession()) return;
365
c432755c3555 distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents: 364
diff changeset
172 // assert(getSMID(editor.eid)==smList.sessionManagerID());
c432755c3555 distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents: 364
diff changeset
173 // assert(editor.channel!=null);
c432755c3555 distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents: 364
diff changeset
174 editor.setSID(sid); // mark as selected
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
175 selectSession0(sid, session, editor.getEID(), editor);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
176 }
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
177
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
178 private void selectSession0(int sid, Session session, int eid, REPNode editor) {
389
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
179 logger.writeLog("Select sid="+sid+" and "+editor);
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
180 if (editor.isDirect()&&editor.getEID()==eid) {
386
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
181 REPCommand command = new REPCommand();
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
182 command.setSID(sid);
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
183 command.setEID(eid);
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
184 command.setString(session.getName());
389
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
185 if(session.hasOwner()){
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
186 editor.selectSession(command,session);
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
187 }else {
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
188 forwardSelect(sid, session, eid, editor);
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
189 }
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
190 } else {
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
191 // we don't have this editor, search the editor first.
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
192 REPNode next = routingTable.toSessionManager(getSMID(eid));
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
193 // pass the select command to the next path.
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
194 REPCommand command = new REPCommand();
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
195 command.setCMD(REP.SMCMD_SELECT0);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
196 command.setSID(sid);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
197 command.setEID(eid);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
198 command.setString(editor.getHost());
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
199 next.send(command);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
200 }
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
201 }
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
202
386
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
203 public void forwardSelect(int sid, Session session, int eid,
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
204 REPNode editor) {
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
205 REPNode next;
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
206 // session searching continue...
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
207 next = routingTable.toSessionManager(getSMID(sid));
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
208 // make a forwarding channel here
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
209 REPNode f = createSessionForwarder(sid, next);
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
210 session.setFirstForwarder(f);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
211 session.addForwarder(editor);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
212 // pass the select command to the next path.
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
213 REPCommand command = new REPCommand();
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
214 command.setCMD(REP.SMCMD_SELECT);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
215 command.setSID(sid);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
216 command.setEID(eid);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
217 command.setString(editor.getHost());
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
218 next.send(command);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
219 }
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
220
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
221 private REPNode createSessionForwarder(int sid, REPNode editor) {
387
6f356d160e58 IPv6 any address
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 386
diff changeset
222 REPNode f = new Forwarder(this,editor.channel);
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
223 f.setEID(makeID(editorList.newEid()));
387
6f356d160e58 IPv6 any address
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 386
diff changeset
224 // f.setChannel(editor.channel); // incoming channel
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
225 f.setHost(myHost);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
226 f.setSID(sid);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
227 return f;
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
228 }
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
229
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
230 /*
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
231 * Create and send UPDATE command.
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
232 */
386
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
233 public void sendUpdate(int sid) {
359
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
234 REPCommand command = makeREPCommandWithSessionList(REP.SMCMD_UPDATE);
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
235 command.setSID(sid);
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
236 command.setEID(REP.SM_EID.id);
386
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
237 if (isMaster()) {
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
238 command.setCMD(REP.SMCMD_UPDATE_ACK);
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
239 smList.sendToSlaves(command);
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
240 } else {
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
241 smList.sendToMaster(command);
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
242 }
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
243 }
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
244
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
245 /*
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
246 * Create new editor in this sessin manager. A dummy editor
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
247 * is created also.
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
248 */
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
249 public REPNode newEditor(REPSocketChannel<REPCommand> channel) {
359
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
250 int eid = makeID(editorList.newEid());
387
6f356d160e58 IPv6 any address
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 386
diff changeset
251 REPNode editor = new Editor(eid, this, channel);
359
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
252 editorList.add(editor);
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
253 return editor;
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
254 }
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
255
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
256 /*
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
257 * Create new session.
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
258 */
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
259 public Session newSession(REPNode master) {
359
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
260 int sid= makeID(sessionList.newSessionID());
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
261 Session session = new Session(sid, master);
360
b25f832f875d *** empty log message ***
kono
parents: 359
diff changeset
262 sessionList.put(sid, session);
359
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
263 return session;
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
264 }
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
265
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
266 /*
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
267 * GUI command interface for close session.
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
268 */
259
9e36fd27e2b6 *** empty log message ***
pin
parents: 258
diff changeset
269 public void closeSession(SessionManagerEvent event) {
9e36fd27e2b6 *** empty log message ***
pin
parents: 258
diff changeset
270 Session session = ((CloseButtonEvent) event).getSession();
9e36fd27e2b6 *** empty log message ***
pin
parents: 258
diff changeset
271 session.closeSession();
9e36fd27e2b6 *** empty log message ***
pin
parents: 258
diff changeset
272 sessionList.remove(session);
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
273 manager.updateGUI(this);
259
9e36fd27e2b6 *** empty log message ***
pin
parents: 258
diff changeset
274 }
9e36fd27e2b6 *** empty log message ***
pin
parents: 258
diff changeset
275
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
276 /*
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
277 * Remove editors which has the cannel.
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
278 */
274
ad487e63e3c8 *** empty log message ***
kono
parents: 271
diff changeset
279 public void remove(REPSocketChannel<REPCommand> channel) {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
280 int i = 0;
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
281 for(Session s:sessionList.values()) {
274
ad487e63e3c8 *** empty log message ***
kono
parents: 271
diff changeset
282 if (s.deleteEditor(channel)) {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
283 i++;
274
ad487e63e3c8 *** empty log message ***
kono
parents: 271
diff changeset
284 }
ad487e63e3c8 *** empty log message ***
kono
parents: 271
diff changeset
285 }
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
286 assert(i==1);
274
ad487e63e3c8 *** empty log message ***
kono
parents: 271
diff changeset
287 // can be other session manager? what should I do?
ad487e63e3c8 *** empty log message ***
kono
parents: 271
diff changeset
288 }
ad487e63e3c8 *** empty log message ***
kono
parents: 271
diff changeset
289
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
290
318
dc57e24ea3df *** empty log message ***
kono
parents: 317
diff changeset
291 public void remove(Editor editor) {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
292 Session s = sessionList.get(editor.getSID());
362
f0bd158dace6 *** empty log message ***
kono
parents: 361
diff changeset
293 if (s==null) {
f0bd158dace6 *** empty log message ***
kono
parents: 361
diff changeset
294 assert(false);
f0bd158dace6 *** empty log message ***
kono
parents: 361
diff changeset
295 editorList.remove(editor);
f0bd158dace6 *** empty log message ***
kono
parents: 361
diff changeset
296 } else if (editor.isMaster()) {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
297 removeSession(s);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
298 } else {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
299 s.deleteForwarder(editor);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
300 editorList.remove(editor);
318
dc57e24ea3df *** empty log message ***
kono
parents: 317
diff changeset
301 }
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
302 manager.updateGUI(this);
341
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
303 }
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
304
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
305 private void removeSession(Session s0) {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
306 s0.remove(this);
341
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
307 sessionList.remove(s0);
359
fa041bae35f1 all code written for distributed session except gather.
kono
parents: 358
diff changeset
308 sendUpdate(s0.getSID());
318
dc57e24ea3df *** empty log message ***
kono
parents: 317
diff changeset
309 }
dc57e24ea3df *** empty log message ***
kono
parents: 317
diff changeset
310
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
311 public boolean sessionManage(REPNode forwarder, REPCommand command) throws ClosedChannelException,
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
312 IOException {
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
313 switch(command.cmd){
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
314
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
315 // Session Manager Command
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
316
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
317 case SMCMD_JOIN:
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
318 {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
319 // first connection or forwarded command
367
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
320 routingTable.add(forwarder,getSMID(command.eid));
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
321 if(isMaster()) {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
322 REPCommand ackCommand = new REPCommand();
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
323 ackCommand.setCMD(REP.SMCMD_JOIN_ACK);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
324 ackCommand.setEID(command.eid);
360
b25f832f875d *** empty log message ***
kono
parents: 359
diff changeset
325 ackCommand.setSID(command.sid);
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
326 ackCommand.string = command.string;
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
327 smList.sendToSlaves(ackCommand);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
328 registEditor(forwarder,ackCommand);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
329 } else {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
330 smList.sendToMaster(command);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
331 }
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
332 manager.updateGUI(this);
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
333 }
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
334
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
335 break;
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
336
361
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
337 case SMCMD_PUT_ACK:
366
e391433fa9f1 *** empty log message ***
kono
parents: 365
diff changeset
338 if (forwarder.isDirect()) {
e391433fa9f1 *** empty log message ***
kono
parents: 365
diff changeset
339 // send put_ack to the editor now.
e391433fa9f1 *** empty log message ***
kono
parents: 365
diff changeset
340 command.setCMD(REP.SMCMD_PUT_ACK);
e391433fa9f1 *** empty log message ***
kono
parents: 365
diff changeset
341 command.string = command.string;
e391433fa9f1 *** empty log message ***
kono
parents: 365
diff changeset
342 command.setEID(command.eid);
e391433fa9f1 *** empty log message ***
kono
parents: 365
diff changeset
343 command.setSID(command.sid);
e391433fa9f1 *** empty log message ***
kono
parents: 365
diff changeset
344 forwarder.send(command);
e391433fa9f1 *** empty log message ***
kono
parents: 365
diff changeset
345 }
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
346 case SMCMD_JOIN_ACK:
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
347 registEditor(forwarder,command);
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
348 manager.updateGUI(this);
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
349 break;
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
350
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
351 case SMCMD_PUT:
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
352 {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
353 // first connection or forwarded command
367
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
354 routingTable.add(forwarder,getSMID(command.eid));
370
46c95d8885ad fix put_ack in single server test.
kono
parents: 369
diff changeset
355 REPCommand ack = new REPCommand(command); ack.setCMD(REP.SMCMD_PUT_ACK);
46c95d8885ad fix put_ack in single server test.
kono
parents: 369
diff changeset
356 if(isMaster()) {
371
97aa54c9afe6 *** empty log message ***
kono
parents: 370
diff changeset
357 // Reached to the top of the tree, multicast the ack.
370
46c95d8885ad fix put_ack in single server test.
kono
parents: 369
diff changeset
358 smList.sendToSlaves(ack);
46c95d8885ad fix put_ack in single server test.
kono
parents: 369
diff changeset
359 registEditor(forwarder,ack);
371
97aa54c9afe6 *** empty log message ***
kono
parents: 370
diff changeset
360 if (forwarder.isDirect()) {
97aa54c9afe6 *** empty log message ***
kono
parents: 370
diff changeset
361 // If put editor on the master, no SMCMD_PUT_ACK is
97aa54c9afe6 *** empty log message ***
kono
parents: 370
diff changeset
362 // generated. Send ack to the editor now.
97aa54c9afe6 *** empty log message ***
kono
parents: 370
diff changeset
363 forwarder.send(ack);
97aa54c9afe6 *** empty log message ***
kono
parents: 370
diff changeset
364 }
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
365 } else {
371
97aa54c9afe6 *** empty log message ***
kono
parents: 370
diff changeset
366 // Pass this to the master.
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
367 smList.sendToMaster(command);
361
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
368 // registEditor will be done by SMCMD_PUT_ACK
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
369 }
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
370 manager.updateGUI(this);
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
371
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
372 }
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
373 break;
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
374
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
375 case SMCMD_SELECT0:
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
376 /*
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
377 * finding joining editor, do not make the path.
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
378 */
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
379 REPNode editor = editorList.get(command.eid);
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
380 if (editor==null|| !editor.isDirect()) {
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
381 REPNode next = routingTable.toSessionManager(getSMID(command.eid));
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
382 next.send(command);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
383 break;
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
384 }
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
385 // we've found the editor, fall thru.
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
386 case SMCMD_SELECT:
361
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
387 {
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
388 /*
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
389 * finding active session ring from joined editor.
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
390 */
361
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
391 Session session = sessionList.get(command.sid);
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
392 if (session==null) {
365
c432755c3555 distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents: 364
diff changeset
393 session = new Session(command.sid, command.string,null);
c432755c3555 distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents: 364
diff changeset
394 sessionList.put(command.sid,session);
361
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
395 }
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
396 // Do not directly addForwarder(forwarder). It may be
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
397 // shared among sessions.
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
398 REPNode f = createSessionForwarder(command.sid, forwarder);
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
399 session.addForwarder(f); // f.next is set up here.
389
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
400 if(session.hasOwner()){
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
401 forwarder.selectSession(command,session);
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
402 }else {
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
403 forwardSelect(command.sid, session, command.eid, forwarder);
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
404 }
361
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
405 }
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
406 break;
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
407 case SMCMD_SELECT_ACK:
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
408 {
369
7d21eb209e27 *** empty log message ***
kono
parents: 367
diff changeset
409 // Sessionが見つかったので、select したeditorに教える。
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
410 Session session = sessionList.get(command.sid);
376
c4ffdac26132 *** empty log message ***
kono
parents: 372
diff changeset
411 searchSelectedEditor(command,session.getForwarder(forwarder.channel));
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
412 }
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
413 break;
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
414
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
415 case SMCMD_SM_JOIN:
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
416 {
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
417 // SM_JOIN中にSMCMD_SM_JOINが来たら、これはループなので、
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
418 ///自分のSM_JOINを取り消す。
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
419 if (sm_join_channel!=null) cancel_sm_join();
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
420 // SMCMD_SM_JOIN は、master まで上昇する。
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
421 // masterでなければ、自分のparentに転送する。
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
422 if(isMaster()) {
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
423 // master であれば、SessionManager IDを決めて、
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
424 // 自分のsmList に登録
377
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
425 registSessionManager(forwarder, command);
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
426 } else {
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
427 if (forwarder.sid==-1) {
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
428 // direct link の場合は、識別のために、EIDに直上の
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
429 // smid を入れておく。
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
430 command.setEID(smList.sessionManagerID());
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
431 }
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
432 smList.sendToMaster(command);
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
433 }
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
434 }
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
435 break;
386
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
436
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
437 case SMCMD_SYNC_ACK:
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
438 break;
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
439
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
440 case SMCMD_SM_JOIN_ACK:
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
441 send_sm_join_ack(command.eid, command.sid, command);
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
442 break;
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
443
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
444 case SMCMD_UPDATE:
386
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
445 sendUpdate(command.sid);
bba62c4ac323 sync-option
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 385
diff changeset
446 break;
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
447 case SMCMD_UPDATE_ACK:
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
448 command.setString(mergeUpdate(command));
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
449 // 下に知らせる
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
450 smList.sendToSlaves(command);
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
451 manager.updateGUI(this);
353
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
452 break;
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
453 default:
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
454 return false;
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
455 }
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
456 return true;
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
457 }
0d47ff22ee0e *** empty log message ***
kono
parents: 352
diff changeset
458
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
459 private void registSessionManager(REPNode forwarder, REPCommand command) {
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
460 REPNode sm;
377
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
461 int psid = command.eid;
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
462 if (forwarder.sid!=-1) {
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
463 // すでに channelはSessionManager Idを持っていて、
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
464 // direct link ではないので、
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
465 // channel を持たないForwarderとして登録する
387
6f356d160e58 IPv6 any address
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 386
diff changeset
466 sm = new Forwarder(this,null);
377
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
467 } else {
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
468 sm = forwarder;
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
469 }
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
470 int sid = smList.addNewSessionManager(sm,command);
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
471 routingTable.add(forwarder,sid);
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
472
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
473 REPCommand sendCommand = makeREPCommandWithSessionList(REP.SMCMD_SM_JOIN_ACK);
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
474 // command.eid==smList.sesionManagerID() の場合は、
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
475 // 待っている自分の下のsessionManagerにsidをassignする必要がある。
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
476 sendCommand.setSID(sid); // new Session manager ID
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
477 // 複数のSM_JOIN_ACKを識別するには、最初にSM_JOINを受け付けた
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
478 // Session manager IDを使う。
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
479 sendCommand.setEID(psid);
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
480 send_sm_join_ack(psid, sid, sendCommand);
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
481 }
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
482
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
483
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
484 void send_sm_join_ack(int psid, int sid,REPCommand sendCommand) {
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
485 if (psid==smList.sessionManagerID()) {
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
486 // 直下のsessionManagerにIDを割り振る必要がある。
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
487 smList.assignSessionManagerIDtoWaitingSM(sid);
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
488 // ここで smList に一つだけ追加されるので
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
489 // 待っている最初のsm一つにだけ、sm_join_ackが新たに送られる。
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
490 }
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
491 smList.sendToSlaves(sendCommand);
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
492 }
85a5980d96d8 *** empty log message ***
kono
parents: 376
diff changeset
493
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
494 /*
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
495 * 指定されたeditorがlocalにあるかどうかを調べる。なければ、他に送る。戻って何回も探すことが
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
496 * あり得るので、よろしくない。
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
497 */
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
498 private void searchSelectedEditor(REPCommand command, REPNode editor) {
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
499 for(;editor.isDirect();editor = editor.getNextForwarder()) {
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
500 if (editor.getEID()==command.eid) {
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
501 // select したeditor を見つけた
389
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
502 editor.joinAck(command,command.sid);
372
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
503 return;
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
504 }
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
505 }
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
506 // ここにはありませんでした。
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
507 editor.send(command);
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
508 }
e16b6326fdac *** empty log message ***
kono
parents: 371
diff changeset
509
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
510
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
511 /**
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
512 * UPDATE/UPDATE_ACKにより送られてきたSessionの情報を追加する
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
513 * @param command
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
514 * @return
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
515 * @throws IOException
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
516 */
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
517 private String mergeUpdate(REPCommand command) throws IOException {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
518 SessionList receivedSessionList;
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
519 try {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
520 receivedSessionList = decoder.decode(command.string);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
521 } catch (SAXException e) {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
522 throw new IOException();
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
523 }
363
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
524 // 受け取った情報と自分の情報を混ぜる。
1a8856580d38 *** empty log message ***
kono
parents: 362
diff changeset
525 sessionList.merge(receivedSessionList);
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
526 //XMLを生成。送信コマンドにセット。
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
527 return encoder.sessionListToXML(sessionList);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
528
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
529 }
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
530
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
531 /*
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
532 * id has SessionManager ID part
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
533 */
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
534 private int makeID(int newid) {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
535 return newid+smList.sessionManagerID()*MAXID;
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
536 }
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
537
384
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
538 int getSMID(int id) {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
539 return id/MAXID;
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
540 }
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
541
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
542
361
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
543 /**
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
544 * Register Editor to our editorList. No connection is made.
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
545 * @param forwarder Editor to be add
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
546 * @param command
65c6d12a5835 *** empty log message ***
kono
parents: 360
diff changeset
547 */
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
548 public void registEditor(REPNode forwarder,REPCommand command) {
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
549 // make ack for PUT/JOIN. Do not send this to the editor,
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
550 // before select. After select, ack is sent to the editor.
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
551 REPNode editor;
367
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
552 if (getSMID(command.eid)==smList.sessionManagerID()) {
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
553 if (forwarder.isDirect()) {
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
554 editor = (Editor)forwarder;
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
555 } else
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
556 return;
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
557 } else {
387
6f356d160e58 IPv6 any address
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 386
diff changeset
558 editor = new Editor(manager, command.eid);
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
559 }
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
560 editor.setName(command.string);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
561 editor.setSID(command.sid);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
562 if (!editorList.hasEid(command.eid)) {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
563 editorList.add(editor);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
564 }
367
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
565 if (command.cmd==REP.SMCMD_PUT_ACK) {
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
566 Session session = new Session(command.sid, command.string, editor);
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
567 sessionList.put(command.sid, session);
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
568 }
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
569 // we don't join ack to the direct linked editor. We
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
570 // have to wait select command
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
571 }
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
572
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
573
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
574 private REPCommand makeREPCommandWithSessionList(REP cmd) {
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
575 //SessionListからXMLを生成。
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
576 //joinしてきたSessionManagerに対してACKを送信。
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
577 REPCommand sendCommand = new REPCommand();
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
578 sendCommand.setCMD(cmd);
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
579 sendCommand.setString(encoder.sessionListToXML(sessionList));
355
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
580 return sendCommand;
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
581 }
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
582
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
583
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
584 public boolean isMaster() {
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
585 return smList.isMaster();
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
586 }
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
587
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
588
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
589 public void setSessionManagerID(int sid) {
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
590 smList.setSessionManagerID(sid);
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
591 }
98607350f7d1 *** empty log message ***
kono
parents: 353
diff changeset
592
358
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
593
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
594 public Session getSession(int sid) {
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
595 return sessionList.get(sid);
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
596 }
034acadc0cdc *** empty log message ***
kono
parents: 356
diff changeset
597
382
4b87f89b3afd REP Session Manager (Java version)
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 378
diff changeset
598 public void setParent(REPNode fw) {
365
c432755c3555 distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents: 364
diff changeset
599 smList.setParent(fw);
c432755c3555 distributed session debug continue... SELECT/SELECT_ACK loop
kono
parents: 364
diff changeset
600 }
367
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
601
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
602 public String toString() {
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
603 int myId = 0;
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
604 if (smList!=null) myId = smList.sessionManagerID();
384
bcdf5476b8e4 restructured-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 382
diff changeset
605 return "rep.SessionManager-"+myId+"@"+super.toString();
367
1bde894edd83 *** empty log message ***
kono
parents: 366
diff changeset
606 }
385
1fca50ce3508 first-working-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 384
diff changeset
607
1fca50ce3508 first-working-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 384
diff changeset
608 public void addWaitingSessionManager(REPNode fw, REPCommand command) {
1fca50ce3508 first-working-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 384
diff changeset
609 smList.addWaitingSessionManager(fw, command);
1fca50ce3508 first-working-version
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 384
diff changeset
610 }
389
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 387
diff changeset
611
391
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 389
diff changeset
612 public int getId() {
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 389
diff changeset
613 return smList.sessionManagerID();
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 389
diff changeset
614 }
one@firefly.cr.ie.u-ryukyu.ac.jp
parents: 389
diff changeset
615
399
19705f4b8015 waitingCommandInMerge
one
parents: 392
diff changeset
616 public void checkWaitingCommandInMerge() {
19705f4b8015 waitingCommandInMerge
one
parents: 392
diff changeset
617 for(REPNode e:editorList.values()) {
19705f4b8015 waitingCommandInMerge
one
parents: 392
diff changeset
618 e.checkWaitingCommandInMerge();
19705f4b8015 waitingCommandInMerge
one
parents: 392
diff changeset
619 }
19705f4b8015 waitingCommandInMerge
one
parents: 392
diff changeset
620
19705f4b8015 waitingCommandInMerge
one
parents: 392
diff changeset
621 }
19705f4b8015 waitingCommandInMerge
one
parents: 392
diff changeset
622
412
2c815dd5f797 add comments.
one
parents: 399
diff changeset
623 /**
2c815dd5f797 add comments.
one
parents: 399
diff changeset
624 * Notify status change to our GUI
2c815dd5f797 add comments.
one
parents: 399
diff changeset
625 */
2c815dd5f797 add comments.
one
parents: 399
diff changeset
626 protected void updateGUI(ServerMainLoop serverMainLoop) {
2c815dd5f797 add comments.
one
parents: 399
diff changeset
627 //リストのコピーをGUIに渡す
2c815dd5f797 add comments.
one
parents: 399
diff changeset
628 LinkedList<Session> sList = new LinkedList<Session>(sessionList.values());
2c815dd5f797 add comments.
one
parents: 399
diff changeset
629 LinkedList<REPNode> eList;
2c815dd5f797 add comments.
one
parents: 399
diff changeset
630 if (listLocalEditorOnly ) {
2c815dd5f797 add comments.
one
parents: 399
diff changeset
631 // Do not list an editor or session outside of this session manager to
2c815dd5f797 add comments.
one
parents: 399
diff changeset
632 // avoid confusion. Actually we can joinSession to an editor outside of
2c815dd5f797 add comments.
one
parents: 399
diff changeset
633 // this manager, but is not secure to do this.
2c815dd5f797 add comments.
one
parents: 399
diff changeset
634 eList = new LinkedList<REPNode>();
2c815dd5f797 add comments.
one
parents: 399
diff changeset
635 for(REPNode e:editorList.values()) {
2c815dd5f797 add comments.
one
parents: 399
diff changeset
636 if (getSMID(e.eid)==smList.sessionManagerID()) {
2c815dd5f797 add comments.
one
parents: 399
diff changeset
637 eList.add(e);
2c815dd5f797 add comments.
one
parents: 399
diff changeset
638 }
2c815dd5f797 add comments.
one
parents: 399
diff changeset
639 }
2c815dd5f797 add comments.
one
parents: 399
diff changeset
640 } else {
2c815dd5f797 add comments.
one
parents: 399
diff changeset
641 eList = new LinkedList<REPNode>(editorList.values());
2c815dd5f797 add comments.
one
parents: 399
diff changeset
642 }
2c815dd5f797 add comments.
one
parents: 399
diff changeset
643 //GUIに反映
2c815dd5f797 add comments.
one
parents: 399
diff changeset
644 Runnable doRun = new DoGUIUpdate(sList, eList, serverMainLoop.gui);
2c815dd5f797 add comments.
one
parents: 399
diff changeset
645 serverMainLoop.gui.invokeLater(doRun);
2c815dd5f797 add comments.
one
parents: 399
diff changeset
646 }
2c815dd5f797 add comments.
one
parents: 399
diff changeset
647
485
cc262a519b8a add dead lock detection (don't forget remove )
one
parents: 461
diff changeset
648 @Override
cc262a519b8a add dead lock detection (don't forget remove )
one
parents: 461
diff changeset
649 public void deadlockDetected() throws IOException {
cc262a519b8a add dead lock detection (don't forget remove )
one
parents: 461
diff changeset
650 logger.writeLog("Deadlock detected");
cc262a519b8a add dead lock detection (don't forget remove )
one
parents: 461
diff changeset
651 for(REPNode e:editorList.values()) {
cc262a519b8a add dead lock detection (don't forget remove )
one
parents: 461
diff changeset
652 logger.writeLog(" "+e+"\n"+e.report());
cc262a519b8a add dead lock detection (don't forget remove )
one
parents: 461
diff changeset
653 }
cc262a519b8a add dead lock detection (don't forget remove )
one
parents: 461
diff changeset
654 throw new IOException();
cc262a519b8a add dead lock detection (don't forget remove )
one
parents: 461
diff changeset
655 }
458
c22f6833d736 synchronize Editor's waiting queue and Manager's writing queue
one
parents: 412
diff changeset
656
0
e41994ce73c7 *** empty log message ***
pin
parents:
diff changeset
657 }