Mercurial > hg > RemoteEditor > REPSessionManager
comparison rep/handler/Editor.java @ 391:3b0a5a55e3ee
24
author | one@firefly.cr.ie.u-ryukyu.ac.jp |
---|---|
date | Mon, 10 Nov 2008 22:25:14 +0900 |
parents | 6f356d160e58 |
children | 1d5b608f39da |
comparison
equal
deleted
inserted
replaced
390:aa07134fea32 | 391:3b0a5a55e3ee |
---|---|
18 private Translator translator; | 18 private Translator translator; |
19 // REPCommands we are going to send to the next editor | 19 // REPCommands we are going to send to the next editor |
20 private List<REPCommand> sentList = new LinkedList<REPCommand>(); | 20 private List<REPCommand> sentList = new LinkedList<REPCommand>(); |
21 private REPCommand quit2=null; | 21 private REPCommand quit2=null; |
22 private boolean merging; | 22 private boolean merging; |
23 public static boolean noMergeMode=false; | |
23 static final boolean doOptimize = true; | 24 static final boolean doOptimize = true; |
24 | 25 |
25 public Editor(SessionManager manager,int editorNo){ | 26 public Editor(SessionManager manager,int editorNo){ |
26 // no translator case | 27 // no translator case |
27 super(manager, null); | 28 super(manager, null); |
36 translator = new Translator(eid,optimizer); | 37 translator = new Translator(eid,optimizer); |
37 } | 38 } |
38 | 39 |
39 | 40 |
40 public void translate(REPCommand command){ | 41 public void translate(REPCommand command){ |
41 | 42 if (command.eid == eid){ |
42 if(command.eid == eid){ | |
43 //エディタからの新たな編集コマンド | 43 //エディタからの新たな編集コマンド |
44 if (next==this) return; // singleton case | 44 if (next==this) return; // singleton case |
45 translator.transSendCmd(command); | 45 translator.transSendCmd(command); |
46 sentList.add(new REPCommand(command)); | 46 sentList.add(new REPCommand(command)); |
47 assert(sentList.size()<limit); | 47 assert(sentList.size()<limit); |
48 next.send(command); | 48 next.send(command); |
49 return; | 49 return; |
50 } else if(command.eid == REP.MERGE_EID.id){ | 50 } else if (command.eid == REP.MERGE_EID.id){ |
51 //マージコマンドが返ってきた | 51 //マージコマンドが返ってきた |
52 if(translator.checkMergeConflict(command)){ | 52 if(translator.checkMergeConflict(command)){ |
53 //マージ中にエディタからの割り込みがあった場合 | 53 //マージ中にエディタからの割り込みがあった場合 |
54 translator.getMergeAgain(this); | 54 translator.getMergeAgain(this); |
55 } | 55 } |
56 checkEndMerge(); | 56 checkEndMerge(); |
57 } else if(command.eid == next.getEID()){ | 57 } else if (command.eid == next.getEID()){ |
58 // 次のEditorで一周するコマンドが来た | 58 // 次のEditorで一周するコマンドが来た |
59 if(next==this) return; // singleton case | 59 if (next==this) return; // singleton case |
60 // これは、distributed case では、うまくいかないので、送り先のforwarder で処理する。 | 60 // これは、distributed case では、うまくいかないので、送り先のforwarder で処理する。 |
61 if (next.isDirect()) | 61 if (next.isDirect()) |
62 ((Editor) next).checkReturnedCommand(command); | 62 ((Editor) next).checkReturnedCommand(command); |
63 else | 63 else |
64 next.send(command); | 64 next.send(command); |
65 } else { | 65 } else { |
66 //他のエディタからの編集コマンド | 66 //他のエディタからの編集コマンド |
67 assert (command.eid!=REP.MERGE_EID.id && command.eid!=eid ); | |
68 if (manager.hasWaitingCommand(channel)) { | 67 if (manager.hasWaitingCommand(channel)) { |
69 // We cannot do this operation before watingCommandQueue. | 68 // We cannot do this operation before watingCommandQueue. |
70 manager.addWaitingCommand(new PacketSet(channel, this, command)); | 69 manager.addWaitingCommand(new PacketSet(channel, this, command)); |
71 return; | 70 return; |
72 } | 71 } else if (isMerging()) { |
73 if(!isMerging()) { | 72 manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command))); |
73 } else { | |
74 translator.transReceiveCmd(next,command); | 74 translator.transReceiveCmd(next,command); |
75 return; | 75 } |
76 } | |
77 manager.addWaitingCommand(new PacketSet(getChannel(), this, new REPCommand(command))); | |
78 } | 76 } |
79 return; | 77 return; |
80 } | 78 } |
81 | 79 |
82 boolean merge(REPCommand command) { | 80 boolean merge(REPCommand command) { |
83 //マージして送信 | 81 //マージして送信 |
84 return translator.catchOwnCommand(this); | 82 return translator.catchOwnCommand(this); |
85 } | 83 } |
86 | 84 |
85 /** | |
86 * 一周して来たcommandの処理。 | |
87 * @param command | |
88 */ | |
87 void checkReturnedCommand(REPCommand command) { | 89 void checkReturnedCommand(REPCommand command) { |
88 REPCommand prev = sentList.remove(0); | 90 REPCommand prev = sentList.remove(0); |
89 if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) { | 91 if (prev==null || prev.seq != command.seq || prev.eid!=command.eid) { |
90 String err = "Editor.checkReturnedCommand() : command = " + command + " prev="; | 92 String err = "Editor.checkReturnedCommand() : command = " + command + " prev="; |
91 err += prev==null?"null":prev.toString(); | 93 err += prev==null?"null":prev.toString(); |
92 ServerMainLoop.logger.writeLog(err); | 94 ServerMainLoop.logger.writeLog(err); |
93 assert(false); | 95 assert(false); |
94 } | 96 } |
95 | 97 |
98 // merge は必須だが、EditorのCommand実装をテストするには邪魔なので、off に出来るようにする。 | |
99 if (noMergeMode) { | |
100 // END_MERGE を出さないと、EditorがprevSeqをreset出来ない。 | |
101 REPCommand ack = new REPCommand(REP.SMCMD_END_MERGE,command.sid,REP.SM_EID.id,seq(),0,""); | |
102 send(ack); | |
103 return; | |
104 } | |
96 // START_MERGE を送る | 105 // START_MERGE を送る |
97 // 送らないで良い場合もある? | 106 // 送らないで良い場合もある? |
98 REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,""); | 107 REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,""); |
99 send(cmd); | 108 send(cmd); |
100 merging = true; | 109 merging = true; |
215 } | 224 } |
216 | 225 |
217 | 226 |
218 @Override | 227 @Override |
219 public void handle(REPCommand command, REPSelectionKey<REPCommand> key) throws IOException { | 228 public void handle(REPCommand command, REPSelectionKey<REPCommand> key) throws IOException { |
220 ServerMainLoop.logger.writeLog("REPHandlerImpl.handle() read : command = " + command +" from "+channel); | 229 ServerMainLoop.logger.writeLog("Manager "+manager.getId()+"read : command = " + command |
230 +" from "+manager.editorList.editorByChannel(channel)); | |
221 if (command.cmd==REP.SMCMD_JOIN||command.cmd==REP.SMCMD_PUT) { | 231 if (command.cmd==REP.SMCMD_JOIN||command.cmd==REP.SMCMD_PUT) { |
222 assert false; | 232 assert false; |
223 // 若干問題があるらしい | 233 // 若干問題があるらしい |
224 next = new Forwarder(manager,next.channel); | 234 next = new Forwarder(manager,next.channel); |
225 REPNode first = new FirstConnector(manager,channel); | 235 REPNode first = new FirstConnector(manager,channel); |