1
|
1 package rep;
|
|
2
|
122
|
3 import java.util.LinkedList;
|
142
|
4 import java.util.List;
|
1
|
5
|
131
|
6 import rep.channel.REPSocketChannel;
|
142
|
7 import rep.translater.TranslaterImp1;
|
131
|
8
|
1
|
9 public class Editor {
|
23
|
10 private int eid;
|
132
|
11 private REPSocketChannel<REPCommand> myChannel;
|
21
|
12 private String host;
|
178
|
13 //private String port;
|
39
|
14 private String file;
|
142
|
15 private TranslaterImp1 translater;
|
|
16 private List<REPCommand> sentList;
|
155
|
17
|
|
18 public Editor(){
|
|
19 setHostAndPort(myChannel);
|
|
20 translater = new TranslaterImp1(eid);
|
|
21 sentList = new LinkedList<REPCommand>();
|
|
22 }
|
1
|
23
|
132
|
24 public Editor(int editorNo, REPSocketChannel<REPCommand> channel){
|
23
|
25 this.eid = editorNo;
|
56
|
26 this.myChannel = channel;
|
142
|
27 translater = new TranslaterImp1(eid);
|
|
28 sentList = new LinkedList<REPCommand>();
|
152
|
29 setHostAndPort(myChannel);
|
56
|
30 }
|
142
|
31
|
132
|
32 public Editor(REPSocketChannel<REPCommand> channel) {
|
56
|
33 this.myChannel = channel;
|
|
34 setHostAndPort(myChannel);
|
152
|
35 translater = new TranslaterImp1(eid);
|
|
36 sentList = new LinkedList<REPCommand>();
|
56
|
37 }
|
142
|
38
|
|
39 public LinkedList<REPCommand> translate(REPCommand command){
|
|
40 LinkedList<REPCommand> list = new LinkedList<REPCommand>();
|
|
41 if(command.eid == eid){
|
|
42 if(checkReturnedCommand(command)){
|
152
|
43 //エディタからのコマンドが元のエディタに戻ってきた
|
164
|
44 //マージして送信
|
142
|
45 REPCommand[] cmds = translater.catchOwnCommand(command);
|
|
46 sendMergedCommand(cmds);
|
|
47 return null;
|
|
48 }else{
|
152
|
49 //エディタからの新たな編集コマンド
|
142
|
50 sentList.add(command);
|
|
51 translater.transSendCmd(command);
|
|
52 list.add(command);
|
|
53 }
|
179
|
54 }else if(eid == REP.MERGE_EID){
|
|
55 //マージコマンドが返ってきた
|
|
56 if(translater.checkMergeConflict(command)){
|
|
57 //マージ中にエディタからの割り込みがあった場合
|
|
58 LinkedList<REPCommand> mergeAgainList = translater.getMergeAgain();
|
|
59 for(REPCommand againCommand: mergeAgainList){
|
|
60 myChannel.write(againCommand);
|
|
61 }
|
|
62 }
|
142
|
63 }else{
|
152
|
64 //他のエディタからの編集コマンド
|
142
|
65 REPCommand[] cmds = translater.transReceiveCmd(command);
|
|
66 for(REPCommand cmd : cmds){
|
|
67 list.add(cmd);
|
|
68 }
|
|
69 }
|
|
70 return list;
|
|
71 }
|
|
72
|
|
73 private void sendMergedCommand(REPCommand[] cmds) {
|
|
74 for(int i = 0; i < cmds.length; i++){
|
179
|
75 REPCommand mergeCommand = cmds[i];
|
|
76 mergeCommand.setEID(REP.MERGE_EID);
|
|
77 myChannel.write(mergeCommand);
|
142
|
78 }
|
|
79 }
|
56
|
80
|
142
|
81 private boolean checkReturnedCommand(REPCommand command) {
|
|
82 if(sentList.size() > 0){
|
|
83 if(sentList.get(0).seq == command.seq){
|
|
84 sentList.remove(0);
|
|
85 return true;
|
|
86 }else{
|
|
87 System.out.println("error:Editor.checkReturnedCommand()");
|
|
88 }
|
|
89 }
|
|
90 return false;
|
74
|
91 }
|
|
92
|
132
|
93 private void setHostAndPort(REPSocketChannel<REPCommand> myChannel2) {
|
195
|
94 //host = myChannel2.socket().getRemoteSocketAddress().toString();
|
178
|
95
|
1
|
96 }
|
|
97
|
132
|
98 public REPSocketChannel<REPCommand> getChannel() {
|
56
|
99 return myChannel;
|
1
|
100 }
|
21
|
101
|
|
102 public void setHost(String host){
|
|
103 this.host = host;
|
|
104 }
|
178
|
105
|
21
|
106
|
|
107 public String getHost(){
|
|
108 return host;
|
|
109 }
|
178
|
110
|
21
|
111
|
23
|
112 public int getEID() {
|
|
113 return eid;
|
|
114 }
|
|
115
|
|
116 public void setEID(int eid) {
|
|
117 this.eid = eid;
|
|
118 }
|
24
|
119 public String toString(){
|
178
|
120 return (host + ":" + file);
|
24
|
121 }
|
23
|
122
|
38
|
123 public String getName() {
|
39
|
124 return file;
|
|
125 }
|
|
126
|
|
127 public void setName(String string) {
|
|
128 file = string;
|
38
|
129 }
|
|
130
|
179
|
131 public void send(REPCommand command) {
|
|
132 myChannel.write(command);
|
56
|
133 }
|
|
134
|
178
|
135 public void setChannel(REPSocketChannel<REPCommand> channel) {
|
83
|
136 myChannel = channel;
|
|
137 }
|
|
138
|
164
|
139 public boolean isMerging() {
|
|
140 return translater.isMerging();
|
|
141 }
|
|
142
|
1
|
143 }
|