annotate rep/Editor.java @ 308:c5be84d53c7f channel-simulator-update **INVALID**

*** empty log message ***
author kono
date Sat, 04 Oct 2008 22:12:34 +0900
parents 75192c844a8d
children 0585fd2410b8
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
213
4d9b32666ed2 *** empty log message ***
pin
parents: 212
diff changeset
3 import java.util.ArrayList;
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;
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
6
304
75192c844a8d *** empty log message ***
kono
parents: 302
diff changeset
7 import rep.channel.REPLogger;
131
617a47cb0150 *** empty log message ***
pin
parents: 122
diff changeset
8 import rep.channel.REPSocketChannel;
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
9 import rep.optimizers.*;
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
10 import rep.translater.TranslaterImp1;
131
617a47cb0150 *** empty log message ***
pin
parents: 122
diff changeset
11
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
12 public class Editor {
281
c3969dd625b2 GUIless test routine.
kono
parents: 278
diff changeset
13 private int eid; // unique id in a session
c3969dd625b2 GUIless test routine.
kono
parents: 278
diff changeset
14 private int sid = -1 ; // globally unique session id
132
70fc1e70652c *** empty log message ***
kent
parents: 131
diff changeset
15 private REPSocketChannel<REPCommand> myChannel;
21
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
16 private String host;
39
c873ee0318f8 *** empty log message ***
pin
parents: 38
diff changeset
17 private String file;
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
18 private TranslaterImp1 translater;
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
19 private List<REPCommand> sentList;
213
4d9b32666ed2 *** empty log message ***
pin
parents: 212
diff changeset
20 private List<REPCommand> sentMergedList;
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
21 private REPCommandOptimizer optimizer;
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
22 private List<REPCommand> writeQueue;
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
23 private REPCommand quit2 = null;
304
75192c844a8d *** empty log message ***
kono
parents: 302
diff changeset
24 private REPLogger ns = REPLogger.singleton();
308
c5be84d53c7f *** empty log message ***
kono
parents: 304
diff changeset
25 private final int limit=100;
155
bbd2801d8ce0 *** empty log message ***
pin
parents: 152
diff changeset
26
bbd2801d8ce0 *** empty log message ***
pin
parents: 152
diff changeset
27 public Editor(){
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
28 this(true);
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
29 }
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
30 public Editor(boolean doOptimize){
155
bbd2801d8ce0 *** empty log message ***
pin
parents: 152
diff changeset
31 setHostAndPort(myChannel);
bbd2801d8ce0 *** empty log message ***
pin
parents: 152
diff changeset
32 translater = new TranslaterImp1(eid);
bbd2801d8ce0 *** empty log message ***
pin
parents: 152
diff changeset
33 sentList = new LinkedList<REPCommand>();
265
6c2f54265471 editor list initialize
kono
parents: 224
diff changeset
34 sentMergedList = new LinkedList<REPCommand>();
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
35 writeQueue = new LinkedList<REPCommand>();
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
36
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
37 if (doOptimize) optimizer = new DeleteInsertOptimizer(); //タカノがつくったおぷてぃまいざ
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
38 else optimizer = new NullOptimizer(); //なにもしないけどOptimizer.
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
39
155
bbd2801d8ce0 *** empty log message ***
pin
parents: 152
diff changeset
40 }
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
41
132
70fc1e70652c *** empty log message ***
kent
parents: 131
diff changeset
42 public Editor(int editorNo, REPSocketChannel<REPCommand> channel){
23
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
43 this.eid = editorNo;
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
44 this.myChannel = channel;
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
45 translater = new TranslaterImp1(eid);
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
46 sentList = new LinkedList<REPCommand>();
265
6c2f54265471 editor list initialize
kono
parents: 224
diff changeset
47 sentMergedList = new LinkedList<REPCommand>();
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
48 writeQueue = new LinkedList<REPCommand>();
152
2ce1a378da85 *** empty log message ***
pin
parents: 142
diff changeset
49 setHostAndPort(myChannel);
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
50 }
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
51
132
70fc1e70652c *** empty log message ***
kent
parents: 131
diff changeset
52 public Editor(REPSocketChannel<REPCommand> channel) {
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
53 this.myChannel = channel;
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
54 setHostAndPort(myChannel);
152
2ce1a378da85 *** empty log message ***
pin
parents: 142
diff changeset
55 translater = new TranslaterImp1(eid);
2ce1a378da85 *** empty log message ***
pin
parents: 142
diff changeset
56 sentList = new LinkedList<REPCommand>();
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
57 writeQueue = new LinkedList<REPCommand>();
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
58 }
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
59
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
60 public List<REPCommand> translate(REPCommand command){
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
61 List<REPCommand> list = new LinkedList<REPCommand>();
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
62 if(command.eid == eid){
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
63 if(checkReturnedCommand(command)){
152
2ce1a378da85 *** empty log message ***
pin
parents: 142
diff changeset
64 //エディタからのコマンドが元のエディタに戻ってきた
164
3841cc75b808 *** empty log message ***
pin
parents: 155
diff changeset
65 //マージして送信
213
4d9b32666ed2 *** empty log message ***
pin
parents: 212
diff changeset
66 ArrayList<REPCommand> cmds = translater.catchOwnCommand(command);
4d9b32666ed2 *** empty log message ***
pin
parents: 212
diff changeset
67 //optimizer
4d9b32666ed2 *** empty log message ***
pin
parents: 212
diff changeset
68 //マージ中のエディタからの割り込み検知に使う
4d9b32666ed2 *** empty log message ***
pin
parents: 212
diff changeset
69 sentMergedList.addAll(cmds);
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
70 sendMergedCommand(cmds);
265
6c2f54265471 editor list initialize
kono
parents: 224
diff changeset
71 return list;
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
72 }else{
152
2ce1a378da85 *** empty log message ***
pin
parents: 142
diff changeset
73 //エディタからの新たな編集コマンド
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
74 sentList.add(command);
308
c5be84d53c7f *** empty log message ***
kono
parents: 304
diff changeset
75 assert(sentList.size()<limit);
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
76 translater.transSendCmd(command);
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
77 list.add(command);
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
78 }
271
kono
parents: 265
diff changeset
79 }else if(eid == REP.MERGE_EID.id){
179
763aad2da6b3 *** empty log message ***
pin
parents: 178
diff changeset
80 //マージコマンドが返ってきた
763aad2da6b3 *** empty log message ***
pin
parents: 178
diff changeset
81 if(translater.checkMergeConflict(command)){
763aad2da6b3 *** empty log message ***
pin
parents: 178
diff changeset
82 //マージ中にエディタからの割り込みがあった場合
224
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
83 List<REPCommand> mergeAgainList = translater.getMergeAgain();
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
84
6b0dd92b8e45 add optimizer to Editor
kent
parents: 213
diff changeset
85 mergeAgainList = optimizer.optimize(mergeAgainList);
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
86 writeQueue.addAll(mergeAgainList);
308
c5be84d53c7f *** empty log message ***
kono
parents: 304
diff changeset
87 assert(writeQueue.size()<limit);
179
763aad2da6b3 *** empty log message ***
pin
parents: 178
diff changeset
88 }
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
89 }else{
152
2ce1a378da85 *** empty log message ***
pin
parents: 142
diff changeset
90 //他のエディタからの編集コマンド
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
91 REPCommand[] cmds = translater.transReceiveCmd(command);
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
92 for(REPCommand cmd : cmds){
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
93 list.add(cmd);
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
94 }
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
95 }
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
96 return list;
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
97 }
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
98
213
4d9b32666ed2 *** empty log message ***
pin
parents: 212
diff changeset
99 private void sendMergedCommand(ArrayList<REPCommand> cmds) {
4d9b32666ed2 *** empty log message ***
pin
parents: 212
diff changeset
100 for(REPCommand mergeCommand : cmds){
271
kono
parents: 265
diff changeset
101 mergeCommand.setEID(REP.MERGE_EID.id);
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
102 writeQueue.add(mergeCommand);
308
c5be84d53c7f *** empty log message ***
kono
parents: 304
diff changeset
103 assert(writeQueue.size()<limit);
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
104 }
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
105 }
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
106
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
107 private boolean checkReturnedCommand(REPCommand command) {
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
108 if(sentList.size() > 0){
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
109 if(sentList.get(0).seq == command.seq){
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
110 sentList.remove(0);
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
111 return true;
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
112 }else{
296
c35f01b5060f *** empty log message ***
pin
parents: 295
diff changeset
113 System.err.println("Editor.checkReturnedCommand() : command = " + command);
302
4ee012f19855 *** empty log message ***
kono
parents: 300
diff changeset
114 //assert(false);
142
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
115 }
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
116 }
abaf502e6d8f *** empty log message ***
pin
parents: 132
diff changeset
117 return false;
74
391d44c94799 *** empty log message ***
pin
parents: 56
diff changeset
118 }
391d44c94799 *** empty log message ***
pin
parents: 56
diff changeset
119
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
120
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
121 public boolean doWaitingWrite() {
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
122 // 一気に送ると、向こう側(Editor)で、dead lock する可能性がある。
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
123 // select loop の中で一つ一つ送るしかない。Editor側から割り込まれる可能性も
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
124 //  ある。その時に複数のコマンドを送っていると、どこに割り込まれたかを判断する
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
125 // ことが出来ない。そこで、一つ一つReturnを確認する必要がある。つまり、
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
126 // select loop で送るしかない。
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
127 REPCommand cmd;
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
128 if (writeQueue.size()>0) {
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
129 cmd = writeQueue.remove(0);
304
75192c844a8d *** empty log message ***
kono
parents: 302
diff changeset
130 ns.writeLog("SessionManager write to "+myChannel+" cmd="+cmd);
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
131 myChannel.write(cmd);
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
132 return true;
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
133 } else if (quit2!=null && sentList.size()==0) {
304
75192c844a8d *** empty log message ***
kono
parents: 302
diff changeset
134 //myChannel.write(quit2);
302
4ee012f19855 *** empty log message ***
kono
parents: 300
diff changeset
135 quit2 = null;
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
136 return true;
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
137 }
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
138 return false;
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
139 }
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
140
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
141 public void setQuit2(REPCommand cmd) {
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
142 quit2 = cmd;
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
143 }
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
144
132
70fc1e70652c *** empty log message ***
kent
parents: 131
diff changeset
145 private void setHostAndPort(REPSocketChannel<REPCommand> myChannel2) {
195
63f36334e8dc *** empty log message ***
pin
parents: 179
diff changeset
146 //host = myChannel2.socket().getRemoteSocketAddress().toString();
178
a097b1d619a1 *** empty log message ***
pin
parents: 164
diff changeset
147
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
148 }
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
149
132
70fc1e70652c *** empty log message ***
kent
parents: 131
diff changeset
150 public REPSocketChannel<REPCommand> getChannel() {
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
151 return myChannel;
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
152 }
21
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
153
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
154 public void setHost(String host){
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
155 this.host = host;
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
156 }
178
a097b1d619a1 *** empty log message ***
pin
parents: 164
diff changeset
157
21
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
158
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
159 public String getHost(){
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
160 return host;
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
161 }
178
a097b1d619a1 *** empty log message ***
pin
parents: 164
diff changeset
162
21
2d4bab638a71 *** empty log message ***
pin
parents: 2
diff changeset
163
23
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
164 public int getEID() {
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
165 return eid;
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
166 }
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
167
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
168 public void setEID(int eid) {
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
169 this.eid = eid;
300
8f6b7a1890b2 *** empty log message ***
kono
parents: 296
diff changeset
170 translater.setEid(eid);
23
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
171 }
24
7012a944e58f *** empty log message ***
pin
parents: 23
diff changeset
172 public String toString(){
304
75192c844a8d *** empty log message ***
kono
parents: 302
diff changeset
173 return ("Editor eid="+eid+" sid="+sid+" " + host + ":" + file);
24
7012a944e58f *** empty log message ***
pin
parents: 23
diff changeset
174 }
23
01657c033761 *** empty log message ***
pin
parents: 21
diff changeset
175
38
de8638eb0edd *** empty log message ***
pin
parents: 24
diff changeset
176 public String getName() {
39
c873ee0318f8 *** empty log message ***
pin
parents: 38
diff changeset
177 return file;
c873ee0318f8 *** empty log message ***
pin
parents: 38
diff changeset
178 }
c873ee0318f8 *** empty log message ***
pin
parents: 38
diff changeset
179
c873ee0318f8 *** empty log message ***
pin
parents: 38
diff changeset
180 public void setName(String string) {
c873ee0318f8 *** empty log message ***
pin
parents: 38
diff changeset
181 file = string;
38
de8638eb0edd *** empty log message ***
pin
parents: 24
diff changeset
182 }
de8638eb0edd *** empty log message ***
pin
parents: 24
diff changeset
183
179
763aad2da6b3 *** empty log message ***
pin
parents: 178
diff changeset
184 public void send(REPCommand command) {
304
75192c844a8d *** empty log message ***
kono
parents: 302
diff changeset
185 writeQueue.add(command);
308
c5be84d53c7f *** empty log message ***
kono
parents: 304
diff changeset
186 assert(writeQueue.size()<limit);
56
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
187 }
6ead43b2475e *** empty log message ***
pin
parents: 39
diff changeset
188
178
a097b1d619a1 *** empty log message ***
pin
parents: 164
diff changeset
189 public void setChannel(REPSocketChannel<REPCommand> channel) {
83
9381b4734a0b *** empty log message ***
pin
parents: 74
diff changeset
190 myChannel = channel;
9381b4734a0b *** empty log message ***
pin
parents: 74
diff changeset
191 }
9381b4734a0b *** empty log message ***
pin
parents: 74
diff changeset
192
164
3841cc75b808 *** empty log message ***
pin
parents: 155
diff changeset
193 public boolean isMerging() {
3841cc75b808 *** empty log message ***
pin
parents: 155
diff changeset
194 return translater.isMerging();
3841cc75b808 *** empty log message ***
pin
parents: 155
diff changeset
195 }
281
c3969dd625b2 GUIless test routine.
kono
parents: 278
diff changeset
196 public boolean hasSession() {
c3969dd625b2 GUIless test routine.
kono
parents: 278
diff changeset
197 return sid != -1;
c3969dd625b2 GUIless test routine.
kono
parents: 278
diff changeset
198 }
c3969dd625b2 GUIless test routine.
kono
parents: 278
diff changeset
199 public void setSID(int sessionID) {
c3969dd625b2 GUIless test routine.
kono
parents: 278
diff changeset
200 sid = sessionID;
c3969dd625b2 GUIless test routine.
kono
parents: 278
diff changeset
201 }
164
3841cc75b808 *** empty log message ***
pin
parents: 155
diff changeset
202
1
3f5bf0255f5e *** empty log message ***
pin
parents:
diff changeset
203 }