Mercurial > hg > RemoteEditor > Eclipse
view src/sample/merge/Translate.java @ 57:f055e65c7e3c
*** empty log message ***
author | pin |
---|---|
date | Tue, 24 Jul 2007 17:40:07 +0900 |
parents | 679491395f8f |
children | 403272ec470c |
line wrap: on
line source
package sample.merge; import java.util.Iterator; import java.util.List; import remoteeditor.command.REPCommand; import remoteeditor.network.REP; public class Translate { List <REPCommand> userList; List <REPCommand> tokenList; private boolean REP_IGNORE = true; public int myeid; public Translate(){ } //public Translate(List<REPCommand> userList, List<REPCommand> tokenList){ // this.userList = userList; // this.tokenList = tokenList; //merge(); //} public Translate(List<REPCommand> userCmdList, List<REPCommand> tokenCmdList) { this.userList = userCmdList; this.tokenList = tokenCmdList; } public void addUserList(REPCommand usercmd){ userList.add(usercmd); } public void addTokenList(REPCommand tokencmd){ if(tokencmd.eid == myeid){ tokenList.clear(); userList.remove(0); }else{ tokenList.add(tokencmd); } } void merge(){ REPCommand h_pricmd; REPCommand l_pricmd; // Iterator userListIterator = userList.iterator(); // while(userListIterator.hasNext()){ for(REPCommand userCmd:userList){ //Iterator tokenListIterator = tokenList.iterator(); //Rep_Cmd userCmd = (Rep_Cmd)userListIterator.next(); if(userCmd.stat) continue; /* 削除される(予定)のREPコマンドの比較は無視 */ //while(tokenListIterator.hasNext()){ for(REPCommand tokenCmd:tokenList){ // Rep_Cmd tokenCmd =(Rep_Cmd)tokenListIterator.next(); if(tokenCmd.eid == myeid) { if(tokenCmd.seq == userCmd.seq){ tokenCmd.stat = REP_IGNORE; userCmd.stat = REP_IGNORE; } } if(tokenCmd.stat == REP_IGNORE) continue; /* 削除される(予定)のREPコマンドの比較は無視 */ if(userCmd.stat == REP_IGNORE) break; if(userCmd.lineno < tokenCmd.lineno) { /* UsersLineNumber < TokensLineNumber */ if(userCmd.cmd == REP.REP_INSERT_CMD){ tokenCmd.lineno++; }else if(userCmd.cmd == REP.REP_DELETE_CMD){ tokenCmd.lineno--; } }else if(userCmd.lineno > tokenCmd.lineno){ /* UsersLineNumber > TokensLineNumber */ if(tokenCmd.cmd == REP.REP_INSERT_CMD){ userCmd.lineno++; }else if(tokenCmd.cmd == REP.REP_DELETE_CMD){ userCmd.lineno--; } }else if(userCmd.lineno == tokenCmd.lineno){ /* UsersLineNumber == TokensLineNumber */ /* * 行番号が重なるとREPコマンドの競合が起こるので、 * どちらかが譲らないといけない。 * uid が小さい方を優先(h_pricmdに)し、 * uid が大きい方(l_pricmd)を変更する。 */ if(userCmd.eid < tokenCmd.eid){ h_pricmd = userCmd; l_pricmd = tokenCmd; }else { h_pricmd = tokenCmd; l_pricmd = userCmd; } if(h_pricmd.cmd == REP.REP_INSERT_CMD){ l_pricmd.lineno++; }else if(l_pricmd.cmd == REP.REP_REPLACE_CMD){ if(l_pricmd.cmd == REP.REP_INSERT_CMD){ /* h_pricmd が優先され,l_pricmd は削除(無視に)する */ l_pricmd.stat = REP_IGNORE; }else if(l_pricmd.cmd == REP.REP_DELETE_CMD){ /* * l_pricmd 側ではすでにdeleteされているので、 * h_pricmd を REP_REPLACE_CMD -> REP_INSERT_CMD へ変更。 */ h_pricmd.cmd = REP.REP_INSERT_CMD; l_pricmd.stat = REP_IGNORE; } }else if(h_pricmd.cmd == REP.REP_DELETE_CMD){ if (l_pricmd.cmd == REP.REP_INSERT_CMD) { h_pricmd.lineno++; } else if(l_pricmd.cmd == REP.REP_REPLACE_CMD){ /* * h_pricmd 側ではすでにdeleteされているので、 * l_pricmd 側を REP_REPLACE_CMD -> REP_INSERT_CMD へ変更。 */ l_pricmd.cmd = REP.REP_INSERT_CMD; h_pricmd.stat= REP_IGNORE; } else { /* l_pricmd->cmd == REP_DELETE_LINE_CMD */ /* * 相手と削除する行が重なるので、 * 両方のコマンドを無視にする。 * 相手先ではすでにこの行は削除されている。 */ h_pricmd.stat = REP_IGNORE; l_pricmd.stat = REP_IGNORE; break; } } } } } // Iterator userListIterator = userList.iterator(); // while(userListIterator.hasNext()){ // //Iterator tokenListIterator = tokenList.iterator(); // REPCommand userCmd = (REPCommand)userListIterator.next(); // if(userCmd.stat == REP_IGNORE){ // userListIterator.remove(); // } // } // // Iterator tokenListIterator = tokenList.iterator(); // while(tokenListIterator.hasNext()){ // REPCommand tokenCmd = (REPCommand)tokenListIterator.next(); // if(tokenCmd.stat == REP_IGNORE){ // tokenListIterator.remove(); // } // } } public void setMyEID(int myeid2) { // TODO Auto-generated method stub myeid = myeid2; } }