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