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;
	                    }
					}
				}
			}
		}
	}
}