annotate rep/Editor.java @ 326:b1a6acf0b8a9

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