annotate rep/Editor.java @ 281:c3969dd625b2

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