changeset 154:6a3c982bd72a

*** empty log message ***
author pin
date Sun, 24 Aug 2008 13:43:50 +0900
parents 6326e5ea4595
children 0dfb6413a31e
files bin/remoteeditor/network/REP.class src/pathfinder/mergetest/EditorSimulator.java src/pathfinder/mergetest/EditorSimulatorWithoutMerger.java src/pathfinder/mergetest/SelectorSimulator.java src/pathfinder/mergetest/SessionManagerSimulatorWithMerger.java src/pathfinder/mergetest/TestMerger2.java src/pathfinder/mergetest/UsersSimulator.java src/remoteeditor/network/REP.java src/sample/merge/TranslaterImp1.java
diffstat 9 files changed, 126 insertions(+), 84 deletions(-) [+]
line wrap: on
line diff
Binary file bin/remoteeditor/network/REP.class has changed
--- a/src/pathfinder/mergetest/EditorSimulator.java	Sat Aug 23 11:28:16 2008 +0900
+++ b/src/pathfinder/mergetest/EditorSimulator.java	Sun Aug 24 13:43:50 2008 +0900
@@ -23,7 +23,7 @@
 		ns = _ns;
 		
 		translater = new TranslaterImp1(_eid);
-		text = new Text(strings);
+		if(strings != null) text = new Text(strings);
 		cs = ns.connect();
 	}
 
--- a/src/pathfinder/mergetest/EditorSimulatorWithoutMerger.java	Sat Aug 23 11:28:16 2008 +0900
+++ b/src/pathfinder/mergetest/EditorSimulatorWithoutMerger.java	Sun Aug 24 13:43:50 2008 +0900
@@ -1,14 +1,10 @@
 package pathfinder.mergetest;
 
-import java.util.Queue;
-
 import remoteeditor.command.REPCommand;
 import remoteeditor.network.REP;
 
 public class EditorSimulatorWithoutMerger extends EditorSimulator {
 
-	private boolean lock;
-
 	public EditorSimulatorWithoutMerger(int _eid, NetworkSimulator<REPCommand> _ns, String[] strings, String _name) {
 		super(_eid, _ns, strings, _name);
 	}
@@ -25,9 +21,15 @@
 				/* received Command */
 
 				ns.writeLog("\tEditor"+eid+" catch command from "+cmd.eid+" NO."+cmd.seq, 3);
-				//if (eid == 3) ns.writeLog("\tEditor"+eid+" catch command from "+cmd.eid+" :"+cmd, 1);
+				//if (eid == 0) ns.writeLog("\tEditor"+eid+" catch command from "+cmd.eid+" :"+cmd, 1);
 
 				//manage(cmd);
+				
+				if(cmd.cmd == REP.SMCMD_QUIT_2){
+					cs.write(new REPCommand(cmd));
+					running = false;
+					break;
+				}
 
 				if (cmd.eid==eid){
 					//発行したコマンドが戻ってきた場合
@@ -50,7 +52,7 @@
 				}else if(cmd.eid == -2){
 					// Merged Commands.
 					String replacedText = text.edit(cmd);
-					sendOneCommand(cmd, replacedText);
+					//sendOneCommand(cmd, replacedText);
 					
 					/* 終了条件  */
 					if (cmd.cmd==REP.SMCMD_QUIT){
@@ -86,8 +88,6 @@
 	}
 
 	private void lockEdit(boolean b) {
-		// TODO Auto-generated method stub
-		lock = b;
 	}
 
 	protected void sendOneCommand(REPCommand cmd, String replacedText){
--- a/src/pathfinder/mergetest/SelectorSimulator.java	Sat Aug 23 11:28:16 2008 +0900
+++ b/src/pathfinder/mergetest/SelectorSimulator.java	Sun Aug 24 13:43:50 2008 +0900
@@ -20,14 +20,13 @@
 		
 		synchronized(ns){
 			boolean empty = false;
-			while(empty){
+			//while(empty){
 				for(SelectionKeySimulator<P> key : keyList){
 					ChannelSimulator<P> channel = key.channel();
 					if(channel.readQisEmpty()){
 						empty = true;
 					}else{
 						empty = false;
-						//selectedKeys = key;
 						selectedKeys.add(key);
 						break;
 					}
@@ -36,10 +35,9 @@
 				try {
 					if(empty) ns.wait();
 				} catch (InterruptedException e) {
-					// TODO Auto-generated catch block
 					//e.printStackTrace();
 				}
-			}
+			//}
 		}
 		return selectedKeys.size();
 	}
--- a/src/pathfinder/mergetest/SessionManagerSimulatorWithMerger.java	Sat Aug 23 11:28:16 2008 +0900
+++ b/src/pathfinder/mergetest/SessionManagerSimulatorWithMerger.java	Sun Aug 24 13:43:50 2008 +0900
@@ -11,9 +11,7 @@
 
 	private List<TranslaterImp1> editorList;
 	private SelectorSimulator<P> selector;
-	//private List<ArrayList<REPCommand>> sentList;
 	private List<EditorObject<P>> editorList2;
-	private int countQuit;
 	private int startQuit2;
 
 	public SessionManagerSimulatorWithMerger(NetworkSimulator<P> _ns) {
@@ -54,6 +52,7 @@
 		//Selectorを用いた実装
 		//while(running && (MAX_PACKET==0 || count<MAX_PACKET)){
 		while(running){
+			
 			// Main Loop
 			selector.select();
 			for(SelectionKeySimulator<P> key : selector.selectedKeys()){
@@ -67,7 +66,6 @@
 					ChannelSimulator<P> channel = key.channel();
 					P packet = channel.read();
 					REPCommand command = unpack(packet);
-					
 					manage(channel, command);
 				}
 			}
@@ -82,6 +80,8 @@
 		int eid = getEID(channel);
 		int neid = getNextEID(eid);
 		
+		ns.writeLog("SessionManager received from " + ":" + eid + ": " + command, 3);
+		
 		EditorObject editor = getEditor(eid);
 		EditorObject nextEditor = getEditor(neid);
 		//editor.receive(command);
@@ -109,11 +109,13 @@
 
 
 	private void quit(EditorObject nextEditor, REPCommand command) {
+		nextEditor.send(command);
 		if(command.eid == nextEditor.eid){
 			//quitコマンドが一周してきた
-			command.setCMD(REP.SMCMD_QUIT_2);
+			if(editorList.get(nextEditor.eid).isEmpty()) {
+				command.setCMD(REP.SMCMD_QUIT_2);
+			}
 		}
-		nextEditor.send(command);
 	}
 	
 	private void quit2(EditorObject nextEditor, REPCommand command, int fromPort) {
@@ -124,56 +126,53 @@
 		}
 		nextEditor.send(command);
 		if(startQuit2 == -1) startQuit2 = fromPort;
-		else if(startQuit2 == nextEditor.eid) quitSessionManager();
-	}
-
-	private void quitSessionManager() {
-		running = false;
+		else if(startQuit2 == nextEditor.eid) ;//finish();
 	}
 
 	private void translate(int eid, int neid, REPCommand command) {
-		// TODO Auto-generated method stub
-//		ChannelSimulator<P> channel = csList.get(eid);
-//		ChannelSimulator<P> nextChannel = csList.get(neid);
-		
+
 		ChannelSimulator<P> channel = getChannel(eid);
 		ChannelSimulator<P> nextChannel = getChannel(neid);
-		
+
 		EditorObject editor = getEditor(eid);
-		
+
 		if(command.eid == eid){
 			if(checkOwnCommand(command)){
-					//エディタからの編集コマンドが戻ってきた場合、マージしてエディタへ反映
+				//エディタからの編集コマンドが戻ってきた場合、マージしてエディタへ反映
 				REPCommand[] cmds = editorList.get(eid).catchOwnCommand(command);
 				for(REPCommand cmd : cmds){
 					REPCommand tmp2 = new REPCommand(cmd);
-					tmp2.eid = REP.SMCMD_MERGE_EID;
+					tmp2.eid = REP.MERGE_EID;
 					channel.write(pack(tmp2));
 				}
-				
+
 			}else{
 
-					//エディタからの新たな編集コマンド
-					editorList.get(eid).transSendCmd(command);
-					nextChannel.write(pack(command));
+				//エディタからの新たな編集コマンド
+				editorList.get(eid).transSendCmd(command);
+				nextChannel.write(pack(command));
 
 			}
-		}else if(command.eid == REP.SMCMD_MERGE_EID){
-			 //マージのときにエディタとの間に衝突がないか確認
-			editorList.get(eid).checkMergeConflict();
+		}else if(command.eid == REP.MERGE_EID){
+			//マージのときにエディタからの割り込みがないか確認
+			if(editorList.get(eid).checkMergeConflict(command)){
+				LinkedList<REPCommand> againList = editorList.get(eid).getMergeAgain();
+				for(REPCommand againCommand : againList){
+					channel.write(pack(againCommand));
+				}
+			}
 		}else{
 
-				//他のエディタからのコマンドはマージャへ追加しを次のエディタへ送信する
+			//他のエディタからのコマンドはマージャへ追加し次のエディタへ送信する
 			REPCommand[] cmds = editorList.get(eid).transReceiveCmd(command);
 			for(REPCommand cmd : cmds){
 				nextChannel.write(pack(cmd));
 			}
-			
+
 		}
 	}
 
 	private EditorObject getEditor(int eid) {
-		// TODO Auto-generated method stub
 		for(EditorObject editor : editorList2){
 			if(editor.getEID() == eid) {
 				return editor;
@@ -203,11 +202,10 @@
 	}
 
 	private boolean checkOwnCommand(REPCommand command) {
-		// TODO Auto-generated method stub
 		boolean ownCommand = false;
-		LinkedList<REPCommand> sentCommand = editorList.get(command.eid).getSentCmds();
-		if(sentCommand.size() > 0){
-			if(sentCommand.get(0).seq == command.seq){
+		LinkedList<REPCommand> sentCommands = editorList.get(command.eid).getSentCmds();
+		if(sentCommands.size() > 0){
+			if(sentCommands.get(0).seq == command.seq){
 				ownCommand = true;
 			}
 		}
--- a/src/pathfinder/mergetest/TestMerger2.java	Sat Aug 23 11:28:16 2008 +0900
+++ b/src/pathfinder/mergetest/TestMerger2.java	Sun Aug 24 13:43:50 2008 +0900
@@ -17,7 +17,8 @@
 		"kkk", "lll", "mmm", "nnn", "ooo",
 		"ppp", "qqq", "rrr", "sss", "ttt",
 		"uuu", "vvv", "www", "xxx", "yyy", "zzz"
-	};
+	};	
+	static private String[] text1 = {""};
 
 	public TestMerger2(){
 		editors = new LinkedList<EditorSimulatorWithoutMerger>();
@@ -34,7 +35,6 @@
 
 		/* create, initialize and start test.  */
 		tm = new TestMerger2();
-		//tm.init(false, i, j, 1);  // init( boolean SM?, int max_client, int max_packet, int loglevel);
 		tm.init(true, i, j, 1);
 		tm.startTest();
 
@@ -79,7 +79,6 @@
 			try {
 				sema.join();
 			} catch (InterruptedException e) {
-				// TODO Auto-generated catch block
 				e.printStackTrace();
 			}
 		}
@@ -87,10 +86,11 @@
 
 	 LinkedList<REPCommand> userCommand(int eid){
 		LinkedList<REPCommand> cmds = new LinkedList<REPCommand>();
-		cmds .add(new REPCommand(REP.REPCMD_REPLACE, 0, eid, 1, 0, 0, "replaced by editor:" + eid + ":1"));
-		cmds .add(new REPCommand(REP.REPCMD_REPLACE, 0, eid, 2, 0, 0, "replaced by editor:" + eid + ":2"));
-		cmds .add(new REPCommand(REP.REPCMD_REPLACE, 0, eid, 3, 0, 0, "replaced by editor:" + eid + ":3"));
-		if(eid == 0) cmds .add(new REPCommand(REP.SMCMD_QUIT, 0, eid, 4, 0, 0, "replaced by editor:" + eid + ":4"));
+		int sid = 0; int eid2 = -1; int seq = 0; int line = 0;
+		cmds .add(new REPCommand(REP.REPCMD_INSERT, sid, eid2, seq++, line, 0, "inserted by editor:" + eid + ":0"));
+		cmds .add(new REPCommand(REP.REPCMD_INSERT, sid, eid2, seq++, line, 0, "inserted by editor:" + eid + ":1"));
+		cmds .add(new REPCommand(REP.REPCMD_INSERT, sid, eid2, seq++, line, 0, "inserted by editor:" + eid + ":2"));
+		if(eid == 0) cmds.add(new REPCommand(REP.SMCMD_QUIT, sid, eid, seq++, line, 0, "sent by editor:" + eid + ":3"));
 		return cmds;
 	}
 	
@@ -104,35 +104,27 @@
 			sema = null;
 		}
 		ns.setLogLevel(ll);
-
+		
 		/* create UsersSimulator.  */
 		for(int i = 0; i < ne; i++){
-			ChannelSimulator<REPCommand> channel = ns.getAcceptedSession(i);
-			users.add(new UsersSimulator(channel, userCommand(i)));	
+			users.add(new UsersSimulator(ns, i, userCommand(i)));
 		}
-
+		
 		/* create ne Editors and np commands.  */
 		for (int i=0; i<ne; i++){
-			//LinkedList<REPCommand> cmds = new LinkedList<REPCommand>();
-			// 各エディタが送信するコマンド列を生成
-
-			/* create command list.  */
-			/*
-			for (int j=0; j<np; j++){
-				String str = "created by Editor"+i+":"+j;
-				REPCommand cmd = new REPCommand(REP.REPCMD_INSERT,
-					0, i, j,
-					10, //Verify.random(text.size()-1), //size-1?
-					str.length(), str);
-				cmds.add( cmd);
+			/* create a Editor, and pass command list to it.  */
+			EditorSimulatorWithoutMerger ee;
+			if(i == 0) {
+				ee = new EditorSimulatorWithoutMerger(i, ns, text0, "Editor:"+i);
+			}else {
+				ee = new EditorSimulatorWithoutMerger(i, ns, text0, "Editor:"+i);
 			}
-			*/
-
-			/* create a Editor, and pass command list to it.  */
-			EditorSimulatorWithoutMerger ee = new EditorSimulatorWithoutMerger(i, ns, i==0?text0:null, "Editor"+i);
+			
 			if(i==0) ee.setOwner(true);
 			editors.add(ee);
 		}
+		
+		
 	}
 
 	protected void printAllTexts(){
--- a/src/pathfinder/mergetest/UsersSimulator.java	Sat Aug 23 11:28:16 2008 +0900
+++ b/src/pathfinder/mergetest/UsersSimulator.java	Sun Aug 24 13:43:50 2008 +0900
@@ -6,19 +6,21 @@
 
 public class UsersSimulator extends Thread {
 	private NetworkSimulator<REPCommand> ns;
-	private ChannelSimulator<REPCommand> cs;
 	private LinkedList<REPCommand> cmds;
+	private int eid;
 
-	public UsersSimulator(ChannelSimulator<REPCommand> _cs, LinkedList<REPCommand> _cmds){
-		cs = _cs;
+	public UsersSimulator(NetworkSimulator<REPCommand> ns2, int _eid, LinkedList<REPCommand> _cmds) {
+		ns = ns2;
+		eid = _eid;
 		cmds = _cmds;
 	}
 
 	public void run(){
 		ns.writeLog("UsersSimulator start.", 1);
+		ChannelSimulator<REPCommand> channel = ns.getAcceptedSession(eid);
 		while(cmds.size()>0){
 			REPCommand cmd0 = createCmd();
-			cs.write(cmd0);
+			channel.write(cmd0);
 		}
 
 		ns.writeLog("UsersSimulator finish.", 1);
@@ -29,7 +31,9 @@
 		return cmd;
 	}
 
-	
-	public void init(){
+	public void init() {
+		// TODO Auto-generated method stub
+		
 	}
+
 }
--- a/src/remoteeditor/network/REP.java	Sat Aug 23 11:28:16 2008 +0900
+++ b/src/remoteeditor/network/REP.java	Sun Aug 24 13:43:50 2008 +0900
@@ -42,7 +42,9 @@
 	public static final int SMCMD_START_MERGE_ACK = 76;
 	public static final int SMCMD_END_MERGE = 77;
 	public static final int SMCMD_QUIT_2 = 78;
-	public static final int SMCMD_MERGE_EID = -2;
+	
+	
+	public static final int MERGE_EID = -2;
 	
 	//public static final int SMCMD_START_MERGE = 73;
 	//public static final int SMCMD_START_MERGE_ACK = 74;
--- a/src/sample/merge/TranslaterImp1.java	Sat Aug 23 11:28:16 2008 +0900
+++ b/src/sample/merge/TranslaterImp1.java	Sun Aug 24 13:43:50 2008 +0900
@@ -4,6 +4,7 @@
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Stack;
 import java.util.TreeSet;
 
@@ -19,12 +20,17 @@
 	public int eid;
 	private int seq;
 	private LinkedList<REPCommand> undoReplaceList;
+	private LinkedList<REPCommand> sentMergedList;
+	private int interruptNumber;
+	private LinkedList<REPCommand> mergeAgainList;
 
 	public TranslaterImp1(int _eid){
 		eid = _eid;
 		sentCmds = new LinkedList<REPCommand>();
 		unMergedCmds = new Stack<REPCommand>();
 		undoReplaceList = new LinkedList<REPCommand>();
+		mergeAgainList = new LinkedList<REPCommand>();
+		sentMergedList = new LinkedList<REPCommand>();
 	}
 
 	/**
@@ -37,6 +43,12 @@
 		setCmdState(cmd);
 		sentCmds.add(cmd);
 		unMergedCmds.push(cmd);
+		
+		//マージ中にユーザから割り込みがあった場合
+		if(sentMergedList.size() > 0){
+			mergeAgainList.add(cmd);
+		}
+		
 		return cmd;
 	}
 	/**
@@ -67,8 +79,10 @@
 			returnCmds.add( cmds.get(i));
 			unMergedCmds.push( cmds.get(i));
 		}
-		//returnCmds.addAll( cmds);
-		//unMergedCmds.addAll( cmds);
+		
+		//マージ中のエディタからの割り込み検知に使う
+		sentMergedList.addAll(returnCmds);
+		
 		return returnCmds.toArray(new REPCommand[0]);
 	}
 
@@ -228,8 +242,42 @@
 		undoReplaceList.add(command);
 	}
 
-	public void checkMergeConflict() {
-		// TODO Auto-generated method stub
-		
+	public boolean checkMergeConflict(REPCommand command) {
+		sentMergedList.remove();
+		if(mergeAgainList.size() > 0){
+			mergeAgainList.add(command);
+			if(sentMergedList.size() == 0){
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	public LinkedList<REPCommand> getMergeAgain() {
+		LinkedList<REPCommand> returnCommand = new LinkedList<REPCommand>();
+		for(int i = 0; i < mergeAgainList.size(); i++){
+			returnCommand.add(createUndo(mergeAgainList.getLast()));
+		}
+		for(REPCommand command : mergeAgainList){
+			if(command.eid == REP.MERGE_EID){
+				returnCommand.add(command);
+			}
+		}
+		for(REPCommand command : mergeAgainList){
+			if(command.eid == eid){
+				returnCommand.add(command);
+			}
+		}
+		mergeAgainList.clear();
+		sentMergedList = returnCommand;
+		return returnCommand;
+	}
+
+	public boolean isEmpty() {
+		if(unMergedCmds.size() > 0) return false;
+		if(sentMergedList.size() > 0) return false;
+		if(sentCmds.size() > 0) return false;
+		return true;
 	}
 }