21
|
1 package sample.merge;
|
|
2
|
|
3 import java.util.List;
|
|
4 import remoteeditor.network.REP;
|
|
5
|
|
6 public class Translate {
|
|
7 List <Rep_Cmd> userList;
|
|
8 List <Rep_Cmd> tokenList;
|
28
|
9 private boolean REP_IGNORE = true;
|
21
|
10 public Translate(List<Rep_Cmd> userList, List<Rep_Cmd> tokenList){
|
|
11 this.userList = userList;
|
|
12 this.tokenList = tokenList;
|
|
13 merge();
|
|
14 }
|
|
15
|
|
16
|
|
17 void merge(){
|
|
18 Rep_Cmd h_pricmd;
|
|
19 Rep_Cmd l_pricmd;
|
|
20 // Iterator userListIterator = userList.iterator();
|
|
21 // while(userListIterator.hasNext()){
|
|
22 for(Rep_Cmd userCmd:userList){
|
|
23 //Iterator tokenListIterator = tokenList.iterator();
|
|
24 //Rep_Cmd userCmd = (Rep_Cmd)userListIterator.next();
|
28
|
25 if(userCmd.stat) continue; /* 削除される(予定)のREPコマンドの比較は無視 */
|
21
|
26 //while(tokenListIterator.hasNext()){
|
|
27 for(Rep_Cmd tokenCmd:tokenList){
|
|
28 // Rep_Cmd tokenCmd =(Rep_Cmd)tokenListIterator.next();
|
|
29 if(tokenCmd.stat == REP_IGNORE) continue; /* 削除される(予定)のREPコマンドの比較は無視 */
|
|
30 if(userCmd.stat == REP_IGNORE) break;
|
|
31 if(userCmd.lineno < tokenCmd.lineno) { /* UsersLineNumber < TokensLineNumber */
|
|
32 if(userCmd.cmd == REP.REP_INSERT_CMD){
|
|
33 tokenCmd.lineno++;
|
|
34 }else if(userCmd.cmd == REP.REP_DELETE_CMD){
|
|
35 tokenCmd.lineno--;
|
|
36 }
|
|
37 }else if(userCmd.lineno > tokenCmd.lineno){ /* UsersLineNumber > TokensLineNumber */
|
|
38 if(tokenCmd.cmd == REP.REP_INSERT_CMD){
|
|
39 userCmd.lineno++;
|
|
40 }else if(tokenCmd.cmd == REP.REP_DELETE_CMD){
|
|
41 userCmd.lineno--;
|
|
42 }
|
|
43 }else if(userCmd.lineno == tokenCmd.lineno){ /* UsersLineNumber == TokensLineNumber */
|
|
44 /*
|
|
45 * 行番号が重なるとREPコマンドの競合が起こるので、
|
|
46 * どちらかが譲らないといけない。
|
|
47 * uid が小さい方を優先(h_pricmdに)し、
|
|
48 * uid が大きい方(l_pricmd)を変更する。
|
|
49 */
|
|
50 if(userCmd.eid < tokenCmd.eid){
|
|
51 h_pricmd = userCmd;
|
|
52 l_pricmd = tokenCmd;
|
|
53 }else {
|
|
54 h_pricmd = tokenCmd;
|
|
55 l_pricmd = userCmd;
|
|
56 }
|
|
57 if(h_pricmd.cmd == REP.REP_INSERT_CMD){
|
|
58 l_pricmd.lineno++;
|
|
59 }else if(l_pricmd.cmd == REP.REP_REPLACE_CMD){
|
|
60 if(l_pricmd.cmd == REP.REP_INSERT_CMD){
|
|
61 /* h_pricmd が優先され,l_pricmd は削除(無視に)する */
|
|
62 l_pricmd.stat = REP_IGNORE;
|
|
63 }else if(l_pricmd.cmd == REP.REP_DELETE_CMD){
|
|
64 /*
|
|
65 * l_pricmd 側ではすでにdeleteされているので、
|
|
66 * h_pricmd を REP_REPLACE_CMD -> REP_INSERT_CMD へ変更。
|
|
67 */
|
|
68 h_pricmd.cmd = REP.REP_INSERT_CMD;
|
|
69 l_pricmd.stat = REP_IGNORE;
|
|
70 }
|
|
71 }else if(h_pricmd.cmd == REP.REP_DELETE_CMD){
|
|
72 if (l_pricmd.cmd == REP.REP_INSERT_CMD) {
|
|
73 h_pricmd.lineno++;
|
|
74 } else if(l_pricmd.cmd == REP.REP_REPLACE_CMD){
|
|
75 /*
|
|
76 * h_pricmd 側ではすでにdeleteされているので、
|
|
77 * l_pricmd 側を REP_REPLACE_CMD -> REP_INSERT_CMD へ変更。
|
|
78 */
|
|
79 l_pricmd.cmd = REP.REP_INSERT_CMD;
|
|
80 h_pricmd.stat= REP_IGNORE;
|
|
81 } else { /* l_pricmd->cmd == REP_DELETE_LINE_CMD */
|
|
82 /*
|
|
83 * 相手と削除する行が重なるので、
|
|
84 * 両方のコマンドを無視にする。
|
|
85 * 相手先ではすでにこの行は削除されている。
|
|
86 */
|
|
87 h_pricmd.stat = REP_IGNORE;
|
|
88 l_pricmd.stat = REP_IGNORE;
|
|
89 break;
|
|
90 }
|
|
91 }
|
|
92 }
|
|
93 }
|
|
94 }
|
|
95 }
|
|
96 }
|