Mercurial > hg > RemoteEditor > Eclipse
view src/sample/merge/Translate.java @ 28:d01cc686b54f
*** empty log message ***
author | pin |
---|---|
date | Mon, 18 Dec 2006 19:47:03 +0900 |
parents | b5493a5932ac |
children | 96306e8dc217 |
line wrap: on
line source
package sample.merge; import java.util.List; import remoteeditor.network.REP; public class Translate { List <Rep_Cmd> userList; List <Rep_Cmd> tokenList; private boolean REP_IGNORE = true; public Translate(List<Rep_Cmd> userList, List<Rep_Cmd> tokenList){ this.userList = userList; this.tokenList = tokenList; merge(); } void merge(){ Rep_Cmd h_pricmd; Rep_Cmd l_pricmd; // Iterator userListIterator = userList.iterator(); // while(userListIterator.hasNext()){ for(Rep_Cmd userCmd:userList){ //Iterator tokenListIterator = tokenList.iterator(); //Rep_Cmd userCmd = (Rep_Cmd)userListIterator.next(); if(userCmd.stat) continue; /* 削除される(予定)のREPコマンドの比較は無視 */ //while(tokenListIterator.hasNext()){ for(Rep_Cmd tokenCmd:tokenList){ // Rep_Cmd tokenCmd =(Rep_Cmd)tokenListIterator.next(); 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; } } } } } } }