Mercurial > hg > RemoteEditor > Eclipse
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
--- 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; } }