changeset 20:e5472194938a

*** empty log message ***
author pin
date Tue, 31 Oct 2006 19:01:04 +0900
parents cc68a00f9850
children 8b58e6bb09c1
files bin/remoteeditor/network/REP.class src/remoteeditor/network/REP.java src/sample/merge/Merge.java src/sample/merge/MergeSample.java src/sample/merge/Rep_Cmd.java
diffstat 5 files changed, 113 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
Binary file bin/remoteeditor/network/REP.class has changed
--- a/src/remoteeditor/network/REP.java	Tue Oct 31 16:30:54 2006 +0900
+++ b/src/remoteeditor/network/REP.java	Tue Oct 31 19:01:04 2006 +0900
@@ -44,23 +44,23 @@
 	//ByteBuffer read_buffer = ByteBuffer.allocateDirect(1024);
 	
 	String string;
-	private RSocketListener socketListener;
-	private Shell shell;
+	public RSocketListener socketListener;
+	Shell shell;
 	
-	List myCmdList = new LinkedList();
-	List othersCmdList = new LinkedList();
+	List <Rep_Cmd> myCmdList = new LinkedList<Rep_Cmd>();
+	List <Rep_Cmd> othersCmdList = new LinkedList<Rep_Cmd>();
 	private String filename;
 	
 	public REP() throws Exception {
 		String host = "localhost";
-		int port = 8080;
+		int port = 8765;
 		
 		InputDialog dialog = new InputDialog(shell, "REP", "host", "localhost", null);
 		if(dialog.open() == Window.OK){
 			host = dialog.getValue();
 		}
 		
-		dialog = new InputDialog(shell, "REP", "port", "8080", null);
+		dialog = new InputDialog(shell, "REP", "port", "8756", null);
 		if (dialog.open() == Window.OK) {
 			try {
 				port = Integer.parseInt(dialog.getValue());
@@ -112,10 +112,15 @@
 		System.out.println("read packet:" + cmd +", "+ sid +", "+ eid +", "+ seqid +", "+ lineno +", "+ textsiz +", "+ string);
 	}
 	
-	public void insert(int offset, int length, String text) throws IOException {
+	public void insert(int offset, int length, String text)  {
 		cmd = REP_INSERT_CMD;
 		seqid = (byte)offset;
-		sc.write(pack(cmd, sid, eid, seqid, lineno, text));
+		try {
+			sc.write(pack(cmd, sid, eid, seqid, lineno, text));
+		} catch (IOException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
 		try {
 			myCmdList.add(new Rep_Cmd(cmd, sid, eid, seqid, lineno, length, text));
 			System.out.println("myCmdList : " + myCmdList.toString());
--- a/src/sample/merge/Merge.java	Tue Oct 31 16:30:54 2006 +0900
+++ b/src/sample/merge/Merge.java	Tue Oct 31 19:01:04 2006 +0900
@@ -9,11 +9,12 @@
 public class Merge {
 	
 	public static void main(String[] args) throws Exception{
-		List userCmdList = new LinkedList();
-		List tokenCmdList = new LinkedList();
+		List <Rep_Cmd> userCmdList = new LinkedList<Rep_Cmd>();
+		List <Rep_Cmd> tokenCmdList = new LinkedList<Rep_Cmd>();
 
 		System.out.println("---------- パターン2 ----------");
 		userCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 1, 0, 10, 4, "test"));
+		userCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 1, 0, 11, 5, "test2"));
 		System.out.println("UserList : " + userCmdList.toString());
 		tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 12, 5, "test3"));
 		tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 15, 5, "test4"));
@@ -26,8 +27,8 @@
 		System.out.println("");
 		
 		System.out.println("---------- パターン2 ----------");
-		userCmdList = new LinkedList();
-		tokenCmdList = new LinkedList();
+		userCmdList = new LinkedList<Rep_Cmd>();
+		tokenCmdList = new LinkedList<Rep_Cmd>();
 		userCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 1, 0, 10, 4, "test"));
 		System.out.println("UserList : " + userCmdList.toString());
 		tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 5, 5, "test3"));
@@ -38,7 +39,47 @@
 		System.out.println("NewUserList : " + userCmdList.toString());
 		System.out.println("NewTokenList : " + tokenCmdList.toString());
 		
+		System.out.println("");
 		
+		System.out.println("---------- パターン3 ----------");
+		userCmdList = new LinkedList<Rep_Cmd>();
+		tokenCmdList = new LinkedList<Rep_Cmd>();
+		userCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 1, 0, 10, 4, "test"));
+		System.out.println("UserList : " + userCmdList.toString());
+		tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 10, 5, "test3"));
+		System.out.println("TokenList : " + tokenCmdList.toString());
+		new MergeSample(userCmdList, tokenCmdList);
+		System.out.println();
+		System.out.println("NewUserList : " + userCmdList.toString());
+		System.out.println("NewTokenList : " + tokenCmdList.toString());
+		
+		System.out.println("");
+		
+		System.out.println("---------- パターン4 ----------");
+		userCmdList = new LinkedList<Rep_Cmd>();
+		tokenCmdList = new LinkedList<Rep_Cmd>();
+		userCmdList.add(new Rep_Cmd(REP.REP_DELETE_CMD, 1, 1, 0, 10, 4, "test"));
+		System.out.println("UserList : " + userCmdList.toString());
+		tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 10, 5, "test3"));
+		System.out.println("TokenList : " + tokenCmdList.toString());
+		new MergeSample(userCmdList, tokenCmdList);
+		System.out.println();
+		System.out.println("NewUserList : " + userCmdList.toString());
+		System.out.println("NewTokenList : " + tokenCmdList.toString());
+		
+		System.out.println("");
+		
+		System.out.println("---------- パターン5 ----------");
+		userCmdList = new LinkedList<Rep_Cmd>();
+		tokenCmdList = new LinkedList<Rep_Cmd>();
+		userCmdList.add(new Rep_Cmd(REP.REP_DELETE_CMD, 1, 1, 0, 10, 4, "test"));
+		System.out.println("UserList : " + userCmdList.toString());
+		tokenCmdList.add(new Rep_Cmd(REP.REP_REPLACE_CMD, 1, 2, 0, 10, 5, "test3"));
+		System.out.println("TokenList : " + tokenCmdList.toString());
+		new MergeSample(userCmdList, tokenCmdList);
+		System.out.println();
+		System.out.println("NewUserList : " + userCmdList.toString());
+		System.out.println("NewTokenList : " + tokenCmdList.toString());
 		
 	}
 	
--- a/src/sample/merge/MergeSample.java	Tue Oct 31 16:30:54 2006 +0900
+++ b/src/sample/merge/MergeSample.java	Tue Oct 31 19:01:04 2006 +0900
@@ -6,10 +6,10 @@
 import remoteeditor.network.REP;
 
 public class MergeSample {
-	List userList;
-	List tokenList;
+	List <Rep_Cmd> userList;
+	List <Rep_Cmd> tokenList;
 	private int REP_IGNORE = -1;
-	public MergeSample(List userList, List tokenList){
+	public MergeSample(List<Rep_Cmd> userList, List<Rep_Cmd> tokenList){
 		this.userList = userList;
 		this.tokenList = tokenList;
 		merge();
@@ -17,13 +17,17 @@
 
 
 	void merge(){
-		Iterator userListIterator = userList.iterator();
-		while(userListIterator.hasNext()){
-			Iterator tokenListIterator = tokenList.iterator();
-			Rep_Cmd userCmd = (Rep_Cmd)userListIterator.next();
+		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 == REP_IGNORE) continue;     /* 削除される(予定)のREPコマンドの比較は無視 */
-			while(tokenListIterator.hasNext()){
-				Rep_Cmd tokenCmd =(Rep_Cmd)tokenListIterator.next();
+			//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 */
@@ -45,6 +49,48 @@
 	                 * 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;
+	                    }
+					}
 				}
 			}
 		}
--- a/src/sample/merge/Rep_Cmd.java	Tue Oct 31 16:30:54 2006 +0900
+++ b/src/sample/merge/Rep_Cmd.java	Tue Oct 31 19:01:04 2006 +0900
@@ -1,7 +1,5 @@
 package sample.merge;
 
-import java.nio.ByteBuffer;
-
 public class Rep_Cmd  {
 	public int cmd;
 	public int sid;