annotate rep/Editor.java @ 353:0d47ff22ee0e

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