changeset 78:a14d4b7337d9

*** empty log message ***
author kent
date Sat, 10 Nov 2007 17:02:18 +0900
parents 015cdb9ecc21
children 9d060c0c9658
files src/pathfinder/EditorEmulator2.java src/pathfinder/SeMaEmulator.java src/pathfinder/TestMerger2.java src/pathfinder/Text.java
diffstat 4 files changed, 166 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pathfinder/EditorEmulator2.java	Sat Nov 10 17:02:18 2007 +0900
@@ -0,0 +1,88 @@
+package pathfinder;
+
+import java.util.Queue;
+
+import remoteeditor.command.REPCommand;
+import remoteeditor.network.REP;
+import sample.merge.Translater;
+
+public class EditorEmulator2 extends Thread{
+	private int eid;
+	private int seq;
+	private boolean isOwner;
+	private NetworkSimulator<REPCommand> ns;
+	private ChannelSimulator<REPCommand> cs;
+	private Queue<REPCommand> CmdList;
+	private Translater translater;
+	private Text text;
+	private boolean running=true;
+
+	public EditorEmulator2(int _eid, NetworkSimulator<REPCommand> _ns, Queue<REPCommand> q, String _name) {
+		super(_name);
+		eid = _eid;
+		ns = _ns;
+		CmdList = q;
+		translater = new Translater(_eid);
+		text = new Text();
+		cs = ns.connect();
+	}
+
+	public void setOwner(boolean f){
+		isOwner = f;
+	}
+	synchronized public void finish(){
+		running = false;
+	}
+
+	public void run(){
+		System.out.println("Editor"+eid+" start.");
+
+		// Send All Command that is included CmdList.
+		sendAllCommand();
+
+		// MainLoop, 
+		while(running){
+			REPCommand cmd = cs.read();
+			if (cmd==null) continue;
+
+			//終了条件
+			if (checkQuit(cmd)){
+				System.out.println("\tEditor"+eid+" catch QUIT command emited by itself.");
+				assert null==translater.transReceiveCmd(cmd);
+				running=false; break;
+			}
+			System.out.println("\tEditor"+eid+" catch command:>> "+cmd.toString());
+			if (isOwner) cmd.setThroughMaster(true);
+			cmd = translater.transReceiveCmd(cmd);
+			if (cmd==null) continue;
+
+			text.edit(cmd);
+			cs.write(cmd);
+		}
+
+		System.out.println("Editor"+eid+" finish.");
+	}
+
+	private void sendAllCommand() {
+		for (REPCommand cmd: CmdList){
+			cmd.seq = seq;
+			cmd.eid = eid;
+			cmd.setString("this is inserted or replaced by Editor"+eid+":"+seq);
+			cmd = translater.transSendCmd(cmd);
+			cs.write(cmd);
+			seq++;
+		}
+
+		// Send Quit Command
+		cs.write( translater.transSendCmd( new REPCommand(REP.SMCMD_QUIT, 0, eid, seq++, 0, 0, "QUIT by Editor"+eid)));
+	}
+
+	private boolean checkQuit(REPCommand cmd) {
+		// 最初に全部のコマンドを送信するから、自分のQUITが来るのは最後
+		return (cmd.eid==eid && cmd.cmd==REP.SMCMD_QUIT);
+	}
+
+	public Text getText(){
+		return text;
+	}
+}
\ No newline at end of file
--- a/src/pathfinder/SeMaEmulator.java	Sat Nov 10 12:02:18 2007 +0900
+++ b/src/pathfinder/SeMaEmulator.java	Sat Nov 10 17:02:18 2007 +0900
@@ -6,6 +6,7 @@
 public class SeMaEmulator<P> extends Thread {
 	private int MAX_PACKET;
 	private int MAX_CLIENT;
+	private boolean running=true;
 	private NetworkSimulator<P> ns;
 	private List<ChannelSimulator<P>> csList;
 
@@ -19,23 +20,18 @@
 		this(_ns, 2, 0);
 	}
 
+	synchronized public void finish(){
+		running = false;
+	}
+
 	/**
 	 * Check whether the NetworkSimulator hold waiting connections.
 	 */
-	private boolean checkAccept(){
-		boolean flag=false;
+	private void checkAccept(){
 		ChannelSimulator<P> cs;
 		while((cs=ns.accept())!=null){
 			csList.add(cs);
-			flag = true;
 		}
-		return flag;
-/*
-		cs = ns.accept();
-		if (cs==null) return false;
-		csList.add(cs);
-		return true;
-*/
 	}
 
 	public void run(){
@@ -48,7 +44,8 @@
 
 		/* Main Loop */
 		ChannelSimulator<P> cs = csList.get(i);
-		while(MAX_PACKET==0 || count<MAX_PACKET){
+		while(running
+				&& MAX_PACKET==0 || count<MAX_PACKET){
 			packet=cs.read();          // [i]からread
 			//if(packet!=null) System.out.println("SeMa catch packet to "+i+":>> "+packet.toString());
 			i = (i+1)%csList.size();   // i++
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pathfinder/TestMerger2.java	Sat Nov 10 17:02:18 2007 +0900
@@ -0,0 +1,69 @@
+package pathfinder;
+
+
+import gov.nasa.jpf.jvm.Verify;
+
+import java.util.LinkedList;
+
+import remoteeditor.command.REPCommand;
+import remoteeditor.network.REP;
+
+public class TestMerger2 {
+	static public int cmdNO[] = { REP.REPCMD_INSERT, REP.REPCMD_REPLACE, REP.REPCMD_DELETE };
+	private int N_editor;
+	private int N_packet;
+	private NetworkSimulator<REPCommand> ns;
+	private SeMaEmulator<REPCommand> sm;
+	private LinkedList<EditorEmulator2> editors;
+
+	public TestMerger2(int editor, int packet){
+		N_editor = editor;
+		N_packet = packet;
+		ns = new NetworkSimulator<REPCommand>();
+		sm = new SeMaEmulator<REPCommand>(ns, N_editor, 0);
+		editors = new LinkedList<EditorEmulator2>();
+	}
+
+	public static void main(String[] args){
+		TestMerger2 tm;
+		tm = new TestMerger2(2, 3);
+		tm.init();
+		tm.startTest();
+	}
+	
+	private void init(){
+		for (int i=0; i<N_editor; i++){
+			int j;
+			LinkedList<REPCommand> cmds = new LinkedList<REPCommand>();
+			// 各エディタが送信するコマンド列を生成
+			for(j=0; j<N_packet; j++) {
+				REPCommand cmd = new REPCommand(cmdNO[Verify.random(2)],
+				                                0, i, j,
+				                                10, //Verify.random(text.size()-1), //size-1?
+				                                0, null);
+				cmds.add( cmd);
+			}
+			EditorEmulator2 ee = new EditorEmulator2(i, ns, cmds, "Editor"+i); 
+			editors.add(ee);
+		}
+	}
+
+	private void startTest() {
+		for (EditorEmulator2 ee: editors){
+			ee.start();
+		}
+		sm.start();
+
+		try {
+			for (EditorEmulator2 ee: editors){
+				//ee.finish();
+				ee.join();
+			}
+			sm.finish();
+			sm.join();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
--- a/src/pathfinder/Text.java	Sat Nov 10 12:02:18 2007 +0900
+++ b/src/pathfinder/Text.java	Sat Nov 10 17:02:18 2007 +0900
@@ -43,7 +43,7 @@
 		if (cmd.cmd==REP.REPCMD_INSERT)        insert(cmd.lineno, cmd.string);
 		else if (cmd.cmd==REP.REPCMD_REPLACE)  replace(cmd.lineno, cmd.string);
 		else if (cmd.cmd==REP.REPCMD_DELETE)   delete(cmd.lineno);
-		else assert false;
+		//else assert false;
 	}
 
 	public int size(){