Mercurial > hg > RemoteEditor > Eclipse
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(){