annotate rep/Editor.java @ 379:fa8ca18f74d2 final-version-for-this-branch

worked.
author kono
date Wed, 22 Oct 2008 18:27:13 +0900
parents c78569ab5fce
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
1 package rep;
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
2
358
034acadc0cdc *** empty log message ***
kono
parents: 353
diff changeset
3 import java.io.IOException;
122
790c8dd42a7b *** empty log message ***
kono
parents: 83
diff changeset
4 import java.util.LinkedList;
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
5 import java.util.List;
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
6
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
7 import rep.channel.REPSelectionKey;
131
617a47cb0150 *** empty log message ***
pin
parents: 122
diff changeset
8 import rep.channel.REPSocketChannel;
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
9 import rep.handler.PacketSet;
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
10 import rep.optimizers.*;
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
11 import rep.translator.Translator;
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
12 import rep.translator.TranslatorImpl;
131
617a47cb0150 *** empty log message ***
pin
parents: 122
diff changeset
13
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
14 public class Editor extends Forwarder {
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
15
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
16 private Translator translator;
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
17 private List<REPCommand> sentList = new LinkedList<REPCommand>();
315
20fb70068089 *** empty log message ***
kono
parents: 313
diff changeset
18 // REPCommands we are going to send to the next editor
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
19 //private REPCommand quit2 = null;
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
20 private SessionManager manager;
318
dc57e24ea3df *** empty log message ***
kono
parents: 317
diff changeset
21 private REPCommand quit2=null;
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
22
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
23 public Editor(SessionManager manager,boolean doOptimize,int editorNo){
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
24 super(manager);
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
25 this.manager = manager;
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
26 eid = editorNo;
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
27 REPCommandOptimizer optimizer;
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
28 if (doOptimize) optimizer = new DeleteInsertOptimizer(); //タカノがつくったおぷてぃまいざ
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
29 else optimizer = new NullOptimizer(); //なにもしないけどOptimizer.
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
30 translator = new TranslatorImpl(eid,optimizer);
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
31
155
bbd2801d8ce0 *** empty log message ***
pin
parents: 152
diff changeset
32 }
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
33
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
34 public Editor(SessionManager manager,int editorNo, REPSocketChannel<REPCommand> channel){
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
35 this(manager,false,editorNo);
319
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
36 this.channel = channel;
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
37 }
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
38
328
6ceb222570cb merge is working now.
kono
parents: 327
diff changeset
39 public void translate(REPCommand command){
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
40
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
41 if(command.eid == eid){
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
42 //エディタからの新たな編集コマンド
364
c965ef2b5fd6 *** empty log message ***
kono
parents: 358
diff changeset
43 if (next==this) return; // singleton case
327
7b6dede07f4a *** empty log message ***
kono
parents: 326
diff changeset
44 translator.transSendCmd(command);
7b6dede07f4a *** empty log message ***
kono
parents: 326
diff changeset
45 sentList.add(new REPCommand(command));
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
46 assert(sentList.size()<limit);
328
6ceb222570cb merge is working now.
kono
parents: 327
diff changeset
47 next.send(command);
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
48 return;
366
e391433fa9f1 *** empty log message ***
kono
parents: 364
diff changeset
49 } else if(command.eid == REP.MERGE_EID.id){
179
763aad2da6b3 *** empty log message ***
pin
parents: 178
diff changeset
50 //マージコマンドが返ってきた
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
51 if(translator.checkMergeConflict(command)){
179
763aad2da6b3 *** empty log message ***
pin
parents: 178
diff changeset
52 //マージ中にエディタからの割り込みがあった場合
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
53 translator.getMergeAgain(this);
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
54 }
373
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
55 checkEndMerge();
366
e391433fa9f1 *** empty log message ***
kono
parents: 364
diff changeset
56 } else if(command.eid == next.getEID()){
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
57 // 次のEditorで一周するコマンドが来た
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
58 if(next==this) return; // singleton case
373
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
59 // これは、distributed case では、うまくいかないので、送り先のforwarder で処理する。
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
60 if (next.isDirect())
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
61 ((Editor) next).checkReturnedCommand(command);
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
62 else
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
63 next.send(command);
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
64 } else {
152
2ce1a378da85 *** empty log message ***
pin
parents: 142
diff changeset
65 //他のエディタからの編集コマンド
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
66 assert (command.eid!=REP.MERGE_EID.id && command.eid!=eid );
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
67 if (manager.hasWaitingCommand(channel)) {
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
68 // We cannot do this operation before watingCommandQueue.
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
69 manager.addWaitingCommand(new PacketSet(channel, this, command));
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
70 return;
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
71 }
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
72 if(!isMerging()) {
328
6ceb222570cb merge is working now.
kono
parents: 327
diff changeset
73 translator.transReceiveCmd(next,command);
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
74 return;
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
75 }
328
6ceb222570cb merge is working now.
kono
parents: 327
diff changeset
76 manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command)));
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
77 }
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
78 return;
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
79 }
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
80
323
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
81 boolean merge(REPCommand command) {
313
0585fd2410b8 Single Insert Command worked.
kono
parents: 308
diff changeset
82 //マージして送信
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
83 return translator.catchOwnCommand(this);
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
84 }
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
85
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
86 void checkReturnedCommand(REPCommand command) {
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
87 REPCommand prev = sentList.remove(0);
327
7b6dede07f4a *** empty log message ***
kono
parents: 326
diff changeset
88 if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) {
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
89 String err = "Editor.checkReturnedCommand() : command = " + command + " prev=";
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
90 err += prev==null?"null":prev.toString();
337
5ba5b7a9761b use REPLogger
kono
parents: 332
diff changeset
91 SessionManager.logger.writeLog(err);
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
92 assert(false);
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
93 }
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
94
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
95 // START_MERGE を送る
373
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
96 // 送らないで良い場合もある?
325
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
97 REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,"");
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
98 send(cmd);
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
99 // Session Manager 側で、このeditorへの他のeditorからの
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
100 // 入力を止めて、merge にそなえる。merge は、eidtor 側から
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
101 // ACKが来てから始まる。
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
102 translator.startMerge(cmd);
be0831086e63 *** empty log message ***
kono
parents: 324
diff changeset
103 return;
74
391d44c94799 *** empty log message ***
pin
parents: 56
diff changeset
104 }
391d44c94799 *** empty log message ***
pin
parents: 56
diff changeset
105
319
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
106 @Override
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
107 public void setQuit2(REPCommand cmd) {
327
7b6dede07f4a *** empty log message ***
kono
parents: 326
diff changeset
108 quit2 = cmd;
7b6dede07f4a *** empty log message ***
kono
parents: 326
diff changeset
109 checkQuit();
318
dc57e24ea3df *** empty log message ***
kono
parents: 317
diff changeset
110 // do not send quit2 until we received all pending
dc57e24ea3df *** empty log message ***
kono
parents: 317
diff changeset
111 // command
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
112 }
23
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
113
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
114 @Override
23
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
115 public void setEID(int eid) {
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
116 this.eid = eid;
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
117 translator.setEid(eid);
23
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
118 }
316
77f443f6dc9f add session manager channel handler
kono
parents: 315
diff changeset
119
24
7012a944e58f *** empty log message ***
pin
parents: 23
diff changeset
120 public String toString(){
304
75192c844a8d *** empty log message ***
kono
parents: 302
diff changeset
121 return ("Editor eid="+eid+" sid="+sid+" " + host + ":" + file);
24
7012a944e58f *** empty log message ***
pin
parents: 23
diff changeset
122 }
23
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
123
164
3841cc75b808 *** empty log message ***
pin
parents: 155
diff changeset
124 public boolean isMerging() {
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
125 return translator.isMerging();
164
3841cc75b808 *** empty log message ***
pin
parents: 155
diff changeset
126 }
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
127
315
20fb70068089 *** empty log message ***
kono
parents: 313
diff changeset
128
164
3841cc75b808 *** empty log message ***
pin
parents: 155
diff changeset
129
373
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
130 void checkEndMerge() {
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
131 if(translator.isMerging()) return;
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
132 REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,eid,sid,seq(),0,"");
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
133 send(mergeEnd);
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
134 if (quit2!=null) checkQuit();
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
135 }
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
136
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
137 private boolean checkQuit() {
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
138 if (sentList.size()==0&&!isMerging()) {
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
139 send(quit2);
327
7b6dede07f4a *** empty log message ***
kono
parents: 326
diff changeset
140 quit2 = null;
326
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
141 return true;
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
142 }
b1a6acf0b8a9 *** empty log message ***
kono
parents: 325
diff changeset
143 return false;
317
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
144 }
c83a3faec487 *** empty log message ***
kono
parents: 316
diff changeset
145
319
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
146 @Override
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
147 public boolean manage(REPCommand receivedCommand) {
330
ddfc786811b9 *** empty log message ***
kono
parents: 328
diff changeset
148
ddfc786811b9 *** empty log message ***
kono
parents: 328
diff changeset
149
319
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
150 switch(receivedCommand.cmd){
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
151 // Editor Command
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
152
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
153 case REPCMD_DELETE:
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
154 case REPCMD_INSERT:
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
155 case REPCMD_NOP:
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
156 {
328
6ceb222570cb merge is working now.
kono
parents: 327
diff changeset
157 translate(receivedCommand);
319
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
158 break;
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
159 }
323
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
160
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
161 case SMCMD_START_MERGE_ACK:
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
162 {
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
163 // マージの処理と次のエディタへコマンドを送信する処理
324
e235998427a6 try to fix merger
kono
parents: 323
diff changeset
164 translator.mergeAck();
323
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
165 if (!merge(receivedCommand)) {
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
166 // nothing to do, send END_MERGE
373
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
167 checkEndMerge();
323
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
168 }
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
169 break;
1e605880d49e *** empty log message ***
kono
parents: 319
diff changeset
170 }
319
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
171 case SMCMD_QUIT:
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
172 {
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
173 next.send(receivedCommand);
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
174 break;
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
175 }
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
176 case SMCMD_QUIT_2:
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
177 {
328
6ceb222570cb merge is working now.
kono
parents: 327
diff changeset
178 // QUIT_2 is returned.
341
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
179 if (receivedCommand.eid!=eid) {
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
180 // stop this editor unless this is the start, starter will stopped
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
181 // by QUIT_2_ACK
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
182 manager.remove(this);
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
183 }
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
184 // don't send quit_2 directly to the editor until all pending
319
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
185 // merge is processed.
373
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
186 // this does not work in distributed case.
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
187 if (next.isDirect())
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
188 next.setQuit2(receivedCommand);
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
189 else
ab4405cd3351 looks like we are done. Wait for further test.
kono
parents: 366
diff changeset
190 next.send(receivedCommand);
341
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
191 break;
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
192 }
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
193 case SMCMD_QUIT_2_ACK:
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
194 {
a9a740e685fa remove session using QUIT_2_ACK
kono
parents: 337
diff changeset
195 manager.remove(this);
319
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
196 break;
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
197 }
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
198 default:
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
199 return false;
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
200 }
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
201 return true;
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
202 }
dfed28488274 *** empty log message ***
kono
parents: 318
diff changeset
203
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
204
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
205 @Override
358
034acadc0cdc *** empty log message ***
kono
parents: 353
diff changeset
206 public void handle(REPSelectionKey<REPCommand> key) throws IOException {
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
207 REPSocketChannel<REPCommand> channel = key.channel1();
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
208 REPCommand command = channel.read();
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
209 SessionManager.logger.writeLog("REPHandlerImpl.handle() read : command = " + command +" from "+channel);
353
0d47ff22ee0e *** empty log message ***
kono
parents: 349
diff changeset
210 if (manager.sessionManage(this, command)) return;
349
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
211 manage(command);
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
212 }
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
213
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
214 @Override
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
215 public void cancel(REPSocketChannel<REPCommand> socketChannel) {
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
216 manager.remove(socketChannel);
ef4afcae0c92 now Forwarder associates each client channel.
kono
parents: 341
diff changeset
217 }
358
034acadc0cdc *** empty log message ***
kono
parents: 353
diff changeset
218
034acadc0cdc *** empty log message ***
kono
parents: 353
diff changeset
219 public boolean isMaster() {
034acadc0cdc *** empty log message ***
kono
parents: 353
diff changeset
220 return mode==REP.SMCMD_PUT;
034acadc0cdc *** empty log message ***
kono
parents: 353
diff changeset
221 }
378
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
222
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
223 /* Handle special case first, usually these cases
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
224 * are handled in the next Editor in a session manager, but
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
225 * it is forwarded here.
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
226 */
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
227 public void forwardedCommandManage(REPCommand command, Forwarder forwarder) {
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
228 if (command.cmd==REP.SMCMD_QUIT_2) {
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
229 // we have to wait next editor's finishing before sending this.
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
230 // this is odd, but the editor itself does not know it's merging
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
231 // state. Only this session manager knows it.
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
232 setQuit2(command);
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
233 } else if (command.eid==eid) {
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
234 // if we handle in editor.manage(), this editor cannot distinguish this
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
235 // and user input command from the editor.
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
236 switch(command.cmd) {
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
237 case REPCMD_DELETE:
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
238 case REPCMD_INSERT:
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
239 case REPCMD_NOP:
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
240 checkReturnedCommand(command);
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
241 return;
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
242 }
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
243 }
379
fa8ca18f74d2 worked.
kono
parents: 378
diff changeset
244 send(command);
378
c78569ab5fce *** empty log message ***
kono
parents: 373
diff changeset
245 }
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
246 }