changeset 326:b1a6acf0b8a9

*** empty log message ***
author kono
date Sat, 11 Oct 2008 19:04:38 +0900
parents be0831086e63
children 7b6dede07f4a
files rep/Editor.java rep/translator/Translate.java rep/translator/Translator.java rep/translator/TranslatorImpl.java
diffstat 4 files changed, 67 insertions(+), 241 deletions(-) [+]
line wrap: on
line diff
--- a/rep/Editor.java	Sat Oct 11 17:43:51 2008 +0900
+++ b/rep/Editor.java	Sat Oct 11 19:04:38 2008 +0900
@@ -13,7 +13,6 @@
 	private Translator translator;
 	private List<REPCommand> sentList = new LinkedList<REPCommand>();
 	// REPCommands we are going to send to the next editor
-	private REPCommandOptimizer optimizer;
 	//private REPCommand quit2 = null;
 	private SessionManager manager;
 	private REPCommand quit2=null;
@@ -22,16 +21,16 @@
 		super(manager);
 		this.manager = manager;
 		eid = editorNo;
-		translator = new TranslatorImpl(eid);
+		REPCommandOptimizer optimizer;
 		if (doOptimize) optimizer = new DeleteInsertOptimizer(); //タカノがつくったおぷてぃまいざ
 		else            optimizer = new NullOptimizer();         //なにもしないけどOptimizer.
+		translator = new TranslatorImpl(eid,optimizer);
 		
 	}
 
 	public Editor(SessionManager manager,int editorNo, REPSocketChannel<REPCommand> channel){
 		this(manager,false,editorNo);
 		this.channel = channel;
-		setHostAndPort(channel);
 	}
 
 	public void translate(Editor nextEditor, REPCommand command){
@@ -48,12 +47,9 @@
 			//マージコマンドが返ってきた
 			if(translator.checkMergeConflict(command)){
 				//マージ中にエディタからの割り込みがあった場合
-				if (optimizedSend(translator.getMergeAgain())) {
-					endMerge();
-					return;
-				}
-			} else
-				endMerge();
+				translator.getMergeAgain(this);
+			}
+			endMerge();
 		}else{
 			//他のエディタからの編集コマンド
 			if(!isMerging()) {
@@ -74,18 +70,13 @@
 	}
 
 	void checkReturnedCommand(REPCommand command) {
-		if(sentList.size() > 0){
-			if(sentList.get(0).seq == command.seq){
-				sentList.remove(0);
-				if (quit2!=null&&sentList.size()==0) {
-					send(quit2);
-					manager.remove(this);
-				}
-			}else{
-				System.out.println("Editor.checkReturnedCommand() : command = " + command);
-				assert(false);
-			}
+		REPCommand prev = sentList.remove(0);
+		if (prev==null || prev.seq != command.seq) {
+			String err = "Editor.checkReturnedCommand() : command = " + command + " prev=";
+			err += prev==null?"null":prev.toString();
+			assert(false);
 		}
+
 		// START_MERGE を送る
 		REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,"");
 		send(cmd);
@@ -98,22 +89,11 @@
 
 	@Override
 	public void setQuit2(REPCommand cmd) {
-		if (sentList.size()==0) {
-			send(cmd);
-			manager.remove(this);
-		}
+		if (!checkQuit()) 
+			quit2 = cmd;
 		// do not send quit2 until we received all pending
 		// command
-		quit2 = cmd;
 	}
-	
-	private void setHostAndPort(REPSocketChannel<REPCommand> myChannel2) {
-		//host = myChannel2.socket().getRemoteSocketAddress().toString();
-		
-	}
-
-
-
 
 	@Override
 	public void setEID(int eid) {
@@ -130,28 +110,21 @@
 	}
 
 	
-	/**
-	 * Sent optimized merged command list
-	 * @param output
-	 * @return if any sent commands output 
-	 */
-	public boolean optimizedSend(LinkedList<REPCommand> output) {
-		List<REPCommand> output1 = optimizer.optimize(output);
-		if (output1.size()==0) return false;
-		for(REPCommand c:output1) {
-			REPCommand m = new REPCommand(c);
-			m.setEID(REP.MERGE_EID.id);
-			m.setSEQID(seq());
-			send(m);
-		}				
-		return true;
-	}
 
 	void endMerge() {
 		if(translator.isMerging()) return;
 		REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,eid,sid,seq(),0,"");
-		send(mergeEnd);
-		translator.endMerge();
+		send(mergeEnd);				
+		if (quit2!=null) checkQuit();
+	}
+
+	private boolean checkQuit() {
+		if (sentList.size()==0&&!isMerging()) {
+			send(quit2);
+			manager.remove(this);
+			return true;
+		}
+		return false;
 	}
 
 	@Override
--- a/rep/translator/Translate.java	Sat Oct 11 17:43:51 2008 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-package rep.translator;
-
-import java.util.List;
-
-import rep.REPCommand;
-import rep.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�R�}���h�̔�r�͖��� */
-			//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�R�}���h�̔�r�͖��� */
-				if(userCmd.stat == REP_IGNORE) break;
-				if(userCmd.lineno < tokenCmd.lineno) {     /* UsersLineNumber < TokensLineNumber */
-					if(userCmd.cmd == REP.REPCMD_INSERT){
-						tokenCmd.lineno++;
-					}else if(userCmd.cmd == REP.REPCMD_DELETE){
-						tokenCmd.lineno--;
-					}
-				}else if(userCmd.lineno > tokenCmd.lineno){     /* UsersLineNumber > TokensLineNumber */
-					if(tokenCmd.cmd == REP.REPCMD_INSERT){
-						userCmd.lineno++;
-					}else if(tokenCmd.cmd == REP.REPCMD_DELETE){
-						userCmd.lineno--;
-					}
-				}else if(userCmd.lineno == tokenCmd.lineno){     /* UsersLineNumber == TokensLineNumber */
-					/*
-	                 * �s�ԍ����d�Ȃ��REP�R�}���h�̋������N����̂ŁA
-	                 * �ǂ��炩�����Ȃ��Ƃ����Ȃ��B
-	                 * uid �����������D��(h_pricmd��)���A
-	                 * uid ���傫����(l_pricmd)��ύX����B
-	                 */
-					if(userCmd.eid < tokenCmd.eid){
-						h_pricmd = userCmd;
-						l_pricmd = tokenCmd;
-					}else {
-						h_pricmd = tokenCmd;
-						l_pricmd = userCmd;
-					}
-					if(h_pricmd.cmd == REP.REPCMD_INSERT){
-						l_pricmd.lineno++;
-					}else if(l_pricmd.cmd == REP.REPCMD_REPLACE){
-						if(l_pricmd.cmd == REP.REPCMD_INSERT){
-	                        /* h_pricmd ���D�悳��,l_pricmd �͍폜(������)���� */
-							l_pricmd.stat = REP_IGNORE;
-						}else if(l_pricmd.cmd == REP.REPCMD_DELETE){
-							/*
-	                         * l_pricmd ���ł͂��ł�delete����Ă���̂ŁA
-	                         * h_pricmd �� REP_REPLACE_CMD -> REP_INSERT_CMD �֕ύX�B
-	                         */
-							h_pricmd.cmd = REP.REPCMD_INSERT;
-							l_pricmd.stat = REP_IGNORE;
-						}
-					}else if(h_pricmd.cmd == REP.REPCMD_DELETE){
-	                    if (l_pricmd.cmd == REP.REPCMD_INSERT) {
-	                        h_pricmd.lineno++;
-	                    } else if(l_pricmd.cmd == REP.REPCMD_REPLACE){
-	                        /*
-	                         * h_pricmd ���ł͂��ł�delete����Ă���̂ŁA
-	                         * l_pricmd ���� REP_REPLACE_CMD -> REP_INSERT_CMD �֕ύX�B
-	                         */
-	                        l_pricmd.cmd = REP.REPCMD_INSERT;
-	                        h_pricmd.stat= REP_IGNORE;
-	                    } else {  /* l_pricmd->cmd == REP_DELETE_LINE_CMD */
-	                        /*
-	                         * ����ƍ폜����s���d�Ȃ�̂ŁA
-	                         * ����̃R�}���h�𖳎��ɂ���B
-	                         * �����ł͂��łɂ��̍s�͍폜����Ă���B
-	                         */
-	                        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;
-	}
-}
--- a/rep/translator/Translator.java	Sat Oct 11 17:43:51 2008 +0900
+++ b/rep/translator/Translator.java	Sat Oct 11 19:04:38 2008 +0900
@@ -1,7 +1,5 @@
 package rep.translator;
 
-import java.util.LinkedList;
-
 import rep.Editor;
 import rep.Forwarder;
 import rep.REPCommand;
@@ -41,7 +39,7 @@
 
 	boolean checkMergeConflict(REPCommand command);
 
-	public LinkedList<REPCommand> getMergeAgain();
+	public void getMergeAgain(Editor editor);
 
 	public void startMerge(REPCommand cmd);
 
@@ -49,7 +47,5 @@
 
 	public boolean isMerging();
 
-	public void endMerge();
-
 	public void mergeAck();
 }
--- a/rep/translator/TranslatorImpl.java	Sat Oct 11 17:43:51 2008 +0900
+++ b/rep/translator/TranslatorImpl.java	Sat Oct 11 19:04:38 2008 +0900
@@ -3,31 +3,32 @@
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.LinkedList;
-import java.util.Stack;
+import java.util.List;
 import java.util.TreeSet;
 
 import rep.Editor;
 import rep.Forwarder;
 import rep.REPCommand;
 import rep.REP;
+import rep.optimizers.REPCommandOptimizer;
 
 public class TranslatorImpl implements Translator{
 	public int eid;
 	/*
 	 * queue が5つもいるって、あまりに馬鹿げてる。
 	 */
+	public REPCommandOptimizer optimizer;
 	private LinkedList<REPCommand> sentCmds;
-	private Stack<REPCommand> unMergedCmds;
-	private LinkedList<REPCommand> undoReplaceList;
+	private LinkedList<REPCommand> unMergedCmds;
 	public LinkedList<REPCommand> sentMergedList;
 	private LinkedList<REPCommand> mergeAgainList;
 	boolean merge_mode = false;
 
-	public TranslatorImpl(int _eid){
+	public TranslatorImpl(int _eid,REPCommandOptimizer opt){
 		eid = _eid;
+		optimizer = opt;
 		sentCmds = new LinkedList<REPCommand>();
-		unMergedCmds = new Stack<REPCommand>();
-		undoReplaceList = new LinkedList<REPCommand>();
+		unMergedCmds = new LinkedList<REPCommand>();
 		mergeAgainList = new LinkedList<REPCommand>();
 		sentMergedList = new LinkedList<REPCommand>();
 	}
@@ -40,7 +41,7 @@
 	 */
 	public REPCommand transSendCmd(REPCommand cmd){
 		sentCmds.add(cmd);
-		unMergedCmds.push(cmd);
+		unMergedCmds.add(cmd);
 		
 		//マージ中にユーザから割り込みがあった場合
 		if(isMerging()){
@@ -61,7 +62,7 @@
 		LinkedList<REPCommand> cmds = new LinkedList<REPCommand>();
 				//スタック上にあるコマンドを全部undoコマンドにする
 		while ( !unMergedCmds.isEmpty() ){
-			REPCommand cmd0 = unMergedCmds.pop();
+			REPCommand cmd0 = unMergedCmds.removeLast();
 			output.add( createUndo(cmd0) );
 			cmds.add(cmd0);
 		}
@@ -73,11 +74,33 @@
 		output.addAll(cmds);
 		for(REPCommand c: cmds) {
 			output.add(c);
-			unMergedCmds.push(c);
+			unMergedCmds.add(c);
 		}
-		return editor.optimizedSend(output);
+		return optimizedSend(editor,output);
 	}
 
+	/**
+	 * Sent optimized merged command list
+	 * @param editor 
+	 * @param output
+	 * @return if any sent commands output 
+	 */
+	public boolean optimizedSend(Editor editor, LinkedList<REPCommand> output) {
+		List<REPCommand> output1 = optimizer.optimize(output);
+		if (output1.size()==0) {
+			merge_mode = false;
+			return false;
+		}
+		for(REPCommand c:output1) {
+			REPCommand m = new REPCommand(c);
+			m.setEID(REP.MERGE_EID.id);
+			m.setSEQID(editor.seq());
+			sentMergedList.add(m);
+			editor.send(m);
+		}				
+		return true;
+	}
+	
 	public REPCommand prev() {
 		return sentCmds.poll();
 	}
@@ -146,7 +169,7 @@
 	public void transReceiveCmd(Forwarder nextEditor,REPCommand cmd){
 		assert (cmd.eid != eid);
 		// nop command の挿入は Editor 側で行って、こちら側ではやらない
-		unMergedCmds.push(cmd);
+		unMergedCmds.add(cmd);
 		nextEditor.send(cmd);
 	}
 
@@ -154,32 +177,21 @@
 		eid = _eid;
 	}
 
-	public Stack<REPCommand> getList() {
-		return unMergedCmds;
-	}
-
-	public LinkedList<REPCommand> getSentCmds() {
-		return sentCmds;
-	}
-
-	public void setUndoCommand(REPCommand command) {
-		undoReplaceList.add(command);
-	}
-
 	public boolean checkMergeConflict(REPCommand command) {
-		// sentMergedList.remove();
+		REPCommand prev = sentMergedList.remove();
+		assert (prev.seq==command.seq);
 		
 		if(mergeAgainList.size() > 0){
 			mergeAgainList.add(command);
-			if(sentMergedList.size() == 0){
-				return true;
-			}
+			return true;
 		}
-
+		if(sentMergedList.size()==0) {
+			merge_mode=false;
+		}
 		return false;
 	}
 
-	public LinkedList<REPCommand> getMergeAgain() {
+	public void getMergeAgain(Editor editor) {
 		LinkedList<REPCommand> returnCommand = new LinkedList<REPCommand>();
 		for(int i = 0; i < mergeAgainList.size(); i++){
 			//eid = REP.MEGE_EID
@@ -197,8 +209,7 @@
 			}
 		}
 		mergeAgainList.clear();
-		sentMergedList = returnCommand;
-		return returnCommand;
+		optimizedSend(editor, returnCommand);
 	}
 
 	public boolean isFinished() {
@@ -217,13 +228,8 @@
 	}
 
 	public void mergeAck() {
-
 	}
 	
-	public void endMerge() {
-		if(isFinished())
-			merge_mode = false;
-	}