Mercurial > hg > RemoteEditor > REPSessionManager
changeset 326:b1a6acf0b8a9
*** empty log message ***
author | kono |
---|---|
date | Sat, 11 Oct 2008 19:04:38 +0900 |
parents | be0831086e63 |
children | 7b6dede07f4a |
files | rep/Editor.java rep/translator/Translate.java rep/translator/Translator.java rep/translator/TranslatorImpl.java |
diffstat | 4 files changed, 67 insertions(+), 241 deletions(-) [+] |
line wrap: on
line diff
--- a/rep/Editor.java Sat Oct 11 17:43:51 2008 +0900 +++ b/rep/Editor.java Sat Oct 11 19:04:38 2008 +0900 @@ -13,7 +13,6 @@ private Translator translator; private List<REPCommand> sentList = new LinkedList<REPCommand>(); // REPCommands we are going to send to the next editor - private REPCommandOptimizer optimizer; //private REPCommand quit2 = null; private SessionManager manager; private REPCommand quit2=null; @@ -22,16 +21,16 @@ super(manager); this.manager = manager; eid = editorNo; - translator = new TranslatorImpl(eid); + REPCommandOptimizer optimizer; if (doOptimize) optimizer = new DeleteInsertOptimizer(); //タカノがつくったおぷてぃまいざ else optimizer = new NullOptimizer(); //なにもしないけどOptimizer. + translator = new TranslatorImpl(eid,optimizer); } public Editor(SessionManager manager,int editorNo, REPSocketChannel<REPCommand> channel){ this(manager,false,editorNo); this.channel = channel; - setHostAndPort(channel); } public void translate(Editor nextEditor, REPCommand command){ @@ -48,12 +47,9 @@ //マージコマンドが返ってきた if(translator.checkMergeConflict(command)){ //マージ中にエディタからの割り込みがあった場合 - if (optimizedSend(translator.getMergeAgain())) { - endMerge(); - return; - } - } else - endMerge(); + translator.getMergeAgain(this); + } + endMerge(); }else{ //他のエディタからの編集コマンド if(!isMerging()) { @@ -74,18 +70,13 @@ } void checkReturnedCommand(REPCommand command) { - if(sentList.size() > 0){ - if(sentList.get(0).seq == command.seq){ - sentList.remove(0); - if (quit2!=null&&sentList.size()==0) { - send(quit2); - manager.remove(this); - } - }else{ - System.out.println("Editor.checkReturnedCommand() : command = " + command); - assert(false); - } + REPCommand prev = sentList.remove(0); + if (prev==null || prev.seq != command.seq) { + String err = "Editor.checkReturnedCommand() : command = " + command + " prev="; + err += prev==null?"null":prev.toString(); + assert(false); } + // START_MERGE を送る REPCommand cmd = new REPCommand(REP.SMCMD_START_MERGE,command.sid,REP.SM_EID.id,seq(),0,""); send(cmd); @@ -98,22 +89,11 @@ @Override public void setQuit2(REPCommand cmd) { - if (sentList.size()==0) { - send(cmd); - manager.remove(this); - } + if (!checkQuit()) + quit2 = cmd; // do not send quit2 until we received all pending // command - quit2 = cmd; } - - private void setHostAndPort(REPSocketChannel<REPCommand> myChannel2) { - //host = myChannel2.socket().getRemoteSocketAddress().toString(); - - } - - - @Override public void setEID(int eid) { @@ -130,28 +110,21 @@ } - /** - * Sent optimized merged command list - * @param output - * @return if any sent commands output - */ - public boolean optimizedSend(LinkedList<REPCommand> output) { - List<REPCommand> output1 = optimizer.optimize(output); - if (output1.size()==0) return false; - for(REPCommand c:output1) { - REPCommand m = new REPCommand(c); - m.setEID(REP.MERGE_EID.id); - m.setSEQID(seq()); - send(m); - } - return true; - } void endMerge() { if(translator.isMerging()) return; REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,eid,sid,seq(),0,""); - send(mergeEnd); - translator.endMerge(); + send(mergeEnd); + if (quit2!=null) checkQuit(); + } + + private boolean checkQuit() { + if (sentList.size()==0&&!isMerging()) { + send(quit2); + manager.remove(this); + return true; + } + return false; } @Override
--- a/rep/translator/Translate.java Sat Oct 11 17:43:51 2008 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,149 +0,0 @@ -package rep.translator; - -import java.util.List; - -import rep.REPCommand; -import rep.REP; - -public class Translate { - List <REPCommand> userList; - List <REPCommand> tokenList; - private boolean REP_IGNORE = true; - public int myeid; - - public Translate(){ - - } - - //public Translate(List<REPCommand> userList, List<REPCommand> tokenList){ - // this.userList = userList; - // this.tokenList = tokenList; - //merge(); - //} - - - - public Translate(List<REPCommand> userCmdList, List<REPCommand> tokenCmdList) { - this.userList = userCmdList; - this.tokenList = tokenCmdList; - } - - public void addUserList(REPCommand usercmd){ - userList.add(usercmd); - } - public void addTokenList(REPCommand tokencmd){ - if(tokencmd.eid == myeid){ - tokenList.clear(); - userList.remove(0); - }else{ - tokenList.add(tokencmd); - } - } - - void merge(){ - REPCommand h_pricmd; - REPCommand l_pricmd; -// Iterator userListIterator = userList.iterator(); -// while(userListIterator.hasNext()){ - for(REPCommand userCmd:userList){ - //Iterator tokenListIterator = tokenList.iterator(); - //Rep_Cmd userCmd = (Rep_Cmd)userListIterator.next(); - if(userCmd.stat) continue; /* �폜�����(�\��)��REP�R�}���h�̔�r�͖��� */ - //while(tokenListIterator.hasNext()){ - for(REPCommand tokenCmd:tokenList){ -// Rep_Cmd tokenCmd =(Rep_Cmd)tokenListIterator.next(); - if(tokenCmd.eid == myeid) { - if(tokenCmd.seq == userCmd.seq){ - tokenCmd.stat = REP_IGNORE; - userCmd.stat = REP_IGNORE; - } - } - if(tokenCmd.stat == REP_IGNORE) continue; /* �폜�����(�\��)��REP�R�}���h�̔�r�͖��� */ - if(userCmd.stat == REP_IGNORE) break; - if(userCmd.lineno < tokenCmd.lineno) { /* UsersLineNumber < TokensLineNumber */ - if(userCmd.cmd == REP.REPCMD_INSERT){ - tokenCmd.lineno++; - }else if(userCmd.cmd == REP.REPCMD_DELETE){ - tokenCmd.lineno--; - } - }else if(userCmd.lineno > tokenCmd.lineno){ /* UsersLineNumber > TokensLineNumber */ - if(tokenCmd.cmd == REP.REPCMD_INSERT){ - userCmd.lineno++; - }else if(tokenCmd.cmd == REP.REPCMD_DELETE){ - userCmd.lineno--; - } - }else if(userCmd.lineno == tokenCmd.lineno){ /* UsersLineNumber == TokensLineNumber */ - /* - * �s�ԍ����d�Ȃ��REP�R�}���h�̋������N����̂ŁA - * �ǂ��炩�����Ȃ��Ƃ����Ȃ��B - * uid �����������D��(h_pricmd��)���A - * uid ���傫����(l_pricmd)��ύX����B - */ - if(userCmd.eid < tokenCmd.eid){ - h_pricmd = userCmd; - l_pricmd = tokenCmd; - }else { - h_pricmd = tokenCmd; - l_pricmd = userCmd; - } - if(h_pricmd.cmd == REP.REPCMD_INSERT){ - l_pricmd.lineno++; - }else if(l_pricmd.cmd == REP.REPCMD_REPLACE){ - if(l_pricmd.cmd == REP.REPCMD_INSERT){ - /* h_pricmd ���D�悳��,l_pricmd �͍폜(������)���� */ - l_pricmd.stat = REP_IGNORE; - }else if(l_pricmd.cmd == REP.REPCMD_DELETE){ - /* - * l_pricmd ���ł͂��ł�delete����Ă���̂ŁA - * h_pricmd �� REP_REPLACE_CMD -> REP_INSERT_CMD �֕ύX�B - */ - h_pricmd.cmd = REP.REPCMD_INSERT; - l_pricmd.stat = REP_IGNORE; - } - }else if(h_pricmd.cmd == REP.REPCMD_DELETE){ - if (l_pricmd.cmd == REP.REPCMD_INSERT) { - h_pricmd.lineno++; - } else if(l_pricmd.cmd == REP.REPCMD_REPLACE){ - /* - * h_pricmd ���ł͂��ł�delete����Ă���̂ŁA - * l_pricmd ���� REP_REPLACE_CMD -> REP_INSERT_CMD �֕ύX�B - */ - l_pricmd.cmd = REP.REPCMD_INSERT; - h_pricmd.stat= REP_IGNORE; - } else { /* l_pricmd->cmd == REP_DELETE_LINE_CMD */ - /* - * ����ƍ폜����s���d�Ȃ�̂ŁA - * ����̃R�}���h���ɂ���B - * �����ł͂��łɂ��̍s�͍폜����Ă���B - */ - h_pricmd.stat = REP_IGNORE; - l_pricmd.stat = REP_IGNORE; - break; - } - } - } - } - } -// Iterator userListIterator = userList.iterator(); -// while(userListIterator.hasNext()){ -// //Iterator tokenListIterator = tokenList.iterator(); -// REPCommand userCmd = (REPCommand)userListIterator.next(); -// if(userCmd.stat == REP_IGNORE){ -// userListIterator.remove(); -// } -// } -// -// Iterator tokenListIterator = tokenList.iterator(); -// while(tokenListIterator.hasNext()){ -// REPCommand tokenCmd = (REPCommand)tokenListIterator.next(); -// if(tokenCmd.stat == REP_IGNORE){ -// tokenListIterator.remove(); -// } -// } - } - - public void setMyEID(int myeid2) { - // TODO Auto-generated method stub - myeid = myeid2; - } -}
--- a/rep/translator/Translator.java Sat Oct 11 17:43:51 2008 +0900 +++ b/rep/translator/Translator.java Sat Oct 11 19:04:38 2008 +0900 @@ -1,7 +1,5 @@ package rep.translator; -import java.util.LinkedList; - import rep.Editor; import rep.Forwarder; import rep.REPCommand; @@ -41,7 +39,7 @@ boolean checkMergeConflict(REPCommand command); - public LinkedList<REPCommand> getMergeAgain(); + public void getMergeAgain(Editor editor); public void startMerge(REPCommand cmd); @@ -49,7 +47,5 @@ public boolean isMerging(); - public void endMerge(); - public void mergeAck(); }
--- a/rep/translator/TranslatorImpl.java Sat Oct 11 17:43:51 2008 +0900 +++ b/rep/translator/TranslatorImpl.java Sat Oct 11 19:04:38 2008 +0900 @@ -3,31 +3,32 @@ import java.util.Collection; import java.util.Comparator; import java.util.LinkedList; -import java.util.Stack; +import java.util.List; import java.util.TreeSet; import rep.Editor; import rep.Forwarder; import rep.REPCommand; import rep.REP; +import rep.optimizers.REPCommandOptimizer; public class TranslatorImpl implements Translator{ public int eid; /* * queue が5つもいるって、あまりに馬鹿げてる。 */ + public REPCommandOptimizer optimizer; private LinkedList<REPCommand> sentCmds; - private Stack<REPCommand> unMergedCmds; - private LinkedList<REPCommand> undoReplaceList; + private LinkedList<REPCommand> unMergedCmds; public LinkedList<REPCommand> sentMergedList; private LinkedList<REPCommand> mergeAgainList; boolean merge_mode = false; - public TranslatorImpl(int _eid){ + public TranslatorImpl(int _eid,REPCommandOptimizer opt){ eid = _eid; + optimizer = opt; sentCmds = new LinkedList<REPCommand>(); - unMergedCmds = new Stack<REPCommand>(); - undoReplaceList = new LinkedList<REPCommand>(); + unMergedCmds = new LinkedList<REPCommand>(); mergeAgainList = new LinkedList<REPCommand>(); sentMergedList = new LinkedList<REPCommand>(); } @@ -40,7 +41,7 @@ */ public REPCommand transSendCmd(REPCommand cmd){ sentCmds.add(cmd); - unMergedCmds.push(cmd); + unMergedCmds.add(cmd); //マージ中にユーザから割り込みがあった場合 if(isMerging()){ @@ -61,7 +62,7 @@ LinkedList<REPCommand> cmds = new LinkedList<REPCommand>(); //スタック上にあるコマンドを全部undoコマンドにする while ( !unMergedCmds.isEmpty() ){ - REPCommand cmd0 = unMergedCmds.pop(); + REPCommand cmd0 = unMergedCmds.removeLast(); output.add( createUndo(cmd0) ); cmds.add(cmd0); } @@ -73,11 +74,33 @@ output.addAll(cmds); for(REPCommand c: cmds) { output.add(c); - unMergedCmds.push(c); + unMergedCmds.add(c); } - return editor.optimizedSend(output); + return optimizedSend(editor,output); } + /** + * Sent optimized merged command list + * @param editor + * @param output + * @return if any sent commands output + */ + public boolean optimizedSend(Editor editor, LinkedList<REPCommand> output) { + List<REPCommand> output1 = optimizer.optimize(output); + if (output1.size()==0) { + merge_mode = false; + return false; + } + for(REPCommand c:output1) { + REPCommand m = new REPCommand(c); + m.setEID(REP.MERGE_EID.id); + m.setSEQID(editor.seq()); + sentMergedList.add(m); + editor.send(m); + } + return true; + } + public REPCommand prev() { return sentCmds.poll(); } @@ -146,7 +169,7 @@ public void transReceiveCmd(Forwarder nextEditor,REPCommand cmd){ assert (cmd.eid != eid); // nop command の挿入は Editor 側で行って、こちら側ではやらない - unMergedCmds.push(cmd); + unMergedCmds.add(cmd); nextEditor.send(cmd); } @@ -154,32 +177,21 @@ eid = _eid; } - public Stack<REPCommand> getList() { - return unMergedCmds; - } - - public LinkedList<REPCommand> getSentCmds() { - return sentCmds; - } - - public void setUndoCommand(REPCommand command) { - undoReplaceList.add(command); - } - public boolean checkMergeConflict(REPCommand command) { - // sentMergedList.remove(); + REPCommand prev = sentMergedList.remove(); + assert (prev.seq==command.seq); if(mergeAgainList.size() > 0){ mergeAgainList.add(command); - if(sentMergedList.size() == 0){ - return true; - } + return true; } - + if(sentMergedList.size()==0) { + merge_mode=false; + } return false; } - public LinkedList<REPCommand> getMergeAgain() { + public void getMergeAgain(Editor editor) { LinkedList<REPCommand> returnCommand = new LinkedList<REPCommand>(); for(int i = 0; i < mergeAgainList.size(); i++){ //eid = REP.MEGE_EID @@ -197,8 +209,7 @@ } } mergeAgainList.clear(); - sentMergedList = returnCommand; - return returnCommand; + optimizedSend(editor, returnCommand); } public boolean isFinished() { @@ -217,13 +228,8 @@ } public void mergeAck() { - } - public void endMerge() { - if(isFinished()) - merge_mode = false; - }