Mercurial > hg > RemoteEditor > Eclipse
changeset 21:8b58e6bb09c1
*** empty log message ***
author | pin |
---|---|
date | Tue, 14 Nov 2006 03:59:38 +0900 |
parents | e5472194938a |
children | 988d3c25ff91 |
files | bin/remoteeditor/MyDialog.class bin/remoteeditor/editors/RemoteEditor$1.class bin/remoteeditor/editors/RemoteEditor.class bin/remoteeditor/network/REP.class src/remoteeditor/MyDialog.java src/remoteeditor/editors/RemoteEditor.java src/remoteeditor/network/REP.java src/sample/merge/Merge.java src/sample/merge/MergeSample.java src/sample/merge/Rep_Cmd.java src/sample/merge/Translate.java |
diffstat | 11 files changed, 202 insertions(+), 182 deletions(-) [+] |
line wrap: on
line diff
--- a/src/remoteeditor/MyDialog.java Tue Oct 31 19:01:04 2006 +0900 +++ b/src/remoteeditor/MyDialog.java Tue Nov 14 03:59:38 2006 +0900 @@ -13,7 +13,6 @@ public MyDialog(Shell parentShell) { super(parentShell); - // TODO Auto-generated constructor stub } protected Point getInitialSize() {
--- a/src/remoteeditor/editors/RemoteEditor.java Tue Oct 31 19:01:04 2006 +0900 +++ b/src/remoteeditor/editors/RemoteEditor.java Tue Nov 14 03:59:38 2006 +0900 @@ -1,7 +1,5 @@ package remoteeditor.editors; -import java.io.IOException; - import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.ITextListener; @@ -19,12 +17,10 @@ private ISourceViewer viewer; private IDocument document; - REP rep; + int numberOfLinesOld; - private int textOffset; - - public RemoteEditor() throws Exception { + public RemoteEditor() { super(); rep = new REP(); @@ -46,9 +42,9 @@ public void textChanged(TextEvent event) { String replacedText = event.getReplacedText(); String inputText = event.getText(); - + // ページ先頭からの文字数(改行を含む)による座標 - textOffset = event.getOffset(); + int textOffset = event.getOffset(); System.out.println("replace = " + replacedText); System.out.println("input = " + inputText + " : " + inputText.length()); @@ -56,59 +52,55 @@ int line = 0; int offset; int length = 0; + int cmd = 0; + int numberOfLinesNew = 0; String lineText = null; try { line = document.getNumberOfLines(0, textOffset); // lineno を取得してます。 offset = document.getLineOffset(line-1); length = document.getLineLength(line-1); lineText = document.get(offset, length); + numberOfLinesNew = document.getNumberOfLines(); } catch (BadLocationException e1) { e1.printStackTrace(); } - if(inputText.contains("\n")){ - try { - rep.insert(line+1, length, "\n"); //insert, delete, replace を 行数で判断 - } catch (Exception e) { - e.printStackTrace(); - } - }else if(inputText.length() != 0){ - try { - rep.replace(line, length, lineText); - } catch (IOException e) { - e.printStackTrace(); + if(numberOfLinesNew > numberOfLinesOld){ + //insert, delete, replace を 行数で判断 + cmd = REP.REP_INSERT_CMD; + }else if(numberOfLinesNew == numberOfLinesOld){ + cmd = REP.REP_REPLACE_CMD; + }else { + cmd = REP.REP_DELETE_CMD; + } + rep.sendCmd(cmd, line, length, lineText); + numberOfLinesOld = numberOfLinesNew; + System.out.println("numberOfLinesOld : " + numberOfLinesOld + "," + "numberOfLinesNew : " + numberOfLinesNew); + } + + void replaceInsertDelete(int kindOfCmd, int lineNo, int LineLength, String text) throws BadLocationException{ + final int offset = document.getLineOffset(lineNo); + final String changedText = text; + final int replaceLength = document.getLineLength(lineNo); + + viewer.getTextWidget().getDisplay().syncExec(new Runnable() { + public void run() { + try { + document.replace(offset, replaceLength, changedText); + } catch (BadLocationException e) { + e.printStackTrace(); + } } - }else if(!replacedText.equals("\n")){ - try { - rep.replace(line, length, lineText); - } catch (IOException e) { - e.printStackTrace(); - } - }else { - try { - rep.delete(line+1, length, "\n"); - } catch (IOException e) { - e.printStackTrace(); - } + }); + } + + public void packetReceived(final RSocketEvent evt) { + final int lineNo = evt.getLineNo(); + final int Linelength = evt.getLength(); + final String text = evt.getText(); + try { + replaceInsertDelete(evt.getCmd(), lineNo, Linelength, text); + } catch (BadLocationException e) { + e.printStackTrace(); } } - - public void packetReceived(RSocketEvent evt) { - final int offset = evt.getLineNo(); - final int length = evt.getLength(); - final String text = evt.getText(); - System.out.println(offset + " : " + length); - if(evt.getCmd() == REP.REP_INSERT_CMD){ - viewer.getTextWidget().getDisplay().syncExec(new Runnable() { - public void run() { - try { - document.replace(offset, 0, text); - } catch (BadLocationException e) { - e.printStackTrace(); - } - } - }); - } - } - - }
--- a/src/remoteeditor/network/REP.java Tue Oct 31 19:01:04 2006 +0900 +++ b/src/remoteeditor/network/REP.java Tue Nov 14 03:59:38 2006 +0900 @@ -12,6 +12,7 @@ import org.eclipse.swt.widgets.Shell; import sample.merge.Rep_Cmd; +import sample.merge.Translate; @@ -40,8 +41,7 @@ public static final int REP_QUIT_CMD = 53; public static final int REP_QUIT_ACK_CMD = 54; - //ByteBuffer buffer = ByteBuffer.allocateDirect(1024); - //ByteBuffer read_buffer = ByteBuffer.allocateDirect(1024); + static final int HEADER_SIZE = 24; String string; public RSocketListener socketListener; @@ -51,7 +51,7 @@ List <Rep_Cmd> othersCmdList = new LinkedList<Rep_Cmd>(); private String filename; - public REP() throws Exception { + public REP() { String host = "localhost"; int port = 8765; @@ -70,13 +70,18 @@ InetSocketAddress addr = new InetSocketAddress(host, port); - sc = SocketChannel.open(); + try { + sc = SocketChannel.open(); + sc.configureBlocking(true); sc.connect(addr); while(!sc.finishConnect()){ System.out.println("afro"); } join(); + } catch (IOException e) { + e.printStackTrace(); + } dialog = new InputDialog(shell, "repput", "read packet:" + cmd +", "+ sid +", "+ eid +", "+ seqid +", "+ lineno +", "+ textsiz +", "+ string, "hugo", null); if(dialog.open() == Window.OK){ @@ -94,20 +99,20 @@ } } - public void join() throws IOException{ - sc.write(pack( REP_JOIN_CMD, sid, eid, seqid, lineno, "afro")); + public void join() { + rWrite(pack( REP_JOIN_CMD, sid, eid, seqid, lineno, "afro")); unpack(); System.out.println("read packet:" + cmd +", "+ sid +", "+ eid +", "+ seqid +", "+ lineno +", "+ textsiz +", "+ string); } - public void put() throws Exception { - sc.write(pack(REP_PUT_CMD, sid, eid, seqid, lineno, filename)); + public void put() { + rWrite(pack(REP_PUT_CMD, sid, eid, seqid, lineno, filename)); unpack(); System.out.println("read packet:" + cmd +", "+ sid +", "+ eid +", "+ seqid +", "+ lineno +", "+ textsiz +", "+ string); } - public void select() throws Exception { - sc.write(pack(REP_SELECT_CMD, sid, eid, seqid, lineno, "afro")); + public void select() { + rWrite(pack(REP_SELECT_CMD, sid, eid, seqid, lineno, "afro")); unpack(); System.out.println("read packet:" + cmd +", "+ sid +", "+ eid +", "+ seqid +", "+ lineno +", "+ textsiz +", "+ string); } @@ -118,7 +123,6 @@ try { sc.write(pack(cmd, sid, eid, seqid, lineno, text)); } catch (IOException e1) { - // TODO Auto-generated catch block e1.printStackTrace(); } try { @@ -169,16 +173,16 @@ buffer.flip(); // limit = current position, position = 0 return buffer; } - - - static final int HEADER_SIZE = 24; - //ByteBuffer header = ByteBuffer.allocateDirect(HEADER_SIZE); - public void unpack() throws IOException{ + public void unpack() { ByteBuffer header = ByteBuffer.allocateDirect(HEADER_SIZE); - long len; + long len = 0; header.clear(); - len = sc.read(header); // limit = read length + try { + len = sc.read(header); + } catch (IOException e1) { + e1.printStackTrace(); + } // limit = read length if (len !=HEADER_SIZE) { System.out.println("てす"); // this can't happen @@ -199,7 +203,11 @@ ByteBuffer textBuffer = ByteBuffer.allocateDirect(textsiz*2); //buffer.limit(textsiz*2); //buffer.rewind(); - len = sc.read(textBuffer); // limit = read length + try { + len = sc.read(textBuffer); + } catch (IOException e1) { + e1.printStackTrace(); + } // limit = read length if (len !=HEADER_SIZE) { // this can't happen } @@ -223,18 +231,26 @@ public void run() { while(sc.isConnected()){ - - try { unpack(); - } catch (IOException e) { - e.printStackTrace(); - } System.out.println("read packet:" + cmd +", "+ sid +", "+ eid +", "+ seqid +", "+ lineno +", "+ textsiz +", "+ string); - //socketListener.packetReceived(new RSocketEvent(cmd, sid, eid, seqid, lineno, textsiz, string)); // + socketListener.packetReceived(new RSocketEvent(cmd, sid, eid, seqid, lineno, textsiz, string)); // } } - + public void rRead(ByteBuffer buffer){ + try { + sc.read(buffer); + } catch (IOException e) { + e.printStackTrace(); + } + } + public void rWrite(ByteBuffer buffer){ + try { + sc.write(buffer); + } catch (IOException e) { + e.printStackTrace(); + } + } public void dispose() { try { sc.close(); @@ -243,4 +259,17 @@ } } + public void sendCmd(int cmd2, int line, int length, String lineText) { + cmd = REP_INSERT_CMD; + rWrite(pack(cmd2, sid, eid, seqid+1, line, lineText)); + try { + myCmdList.add(new Rep_Cmd(cmd2, sid, eid, seqid, line, length, lineText)); + System.out.println("myCmdList : " + myCmdList.toString()); + System.out.println("othersCmdList : " + othersCmdList.toString()); + new Translate(myCmdList, othersCmdList); + } catch (Exception e) { + e.printStackTrace(); + } + } + }
--- a/src/sample/merge/Merge.java Tue Oct 31 19:01:04 2006 +0900 +++ b/src/sample/merge/Merge.java Tue Nov 14 03:59:38 2006 +0900 @@ -19,7 +19,7 @@ tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 12, 5, "test3")); tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 15, 5, "test4")); System.out.println("TokenList : " + tokenCmdList.toString()); - new MergeSample(userCmdList, tokenCmdList); + new Translate(userCmdList, tokenCmdList); System.out.println(); System.out.println("NewUserList : " + userCmdList.toString()); System.out.println("NewTokenList : " + tokenCmdList.toString()); @@ -34,7 +34,7 @@ tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 5, 5, "test3")); tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 15, 5, "test4")); System.out.println("TokenList : " + tokenCmdList.toString()); - new MergeSample(userCmdList, tokenCmdList); + new Translate(userCmdList, tokenCmdList); System.out.println(); System.out.println("NewUserList : " + userCmdList.toString()); System.out.println("NewTokenList : " + tokenCmdList.toString()); @@ -48,7 +48,7 @@ System.out.println("UserList : " + userCmdList.toString()); tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 10, 5, "test3")); System.out.println("TokenList : " + tokenCmdList.toString()); - new MergeSample(userCmdList, tokenCmdList); + new Translate(userCmdList, tokenCmdList); System.out.println(); System.out.println("NewUserList : " + userCmdList.toString()); System.out.println("NewTokenList : " + tokenCmdList.toString()); @@ -62,7 +62,7 @@ System.out.println("UserList : " + userCmdList.toString()); tokenCmdList.add(new Rep_Cmd(REP.REP_INSERT_CMD, 1, 2, 0, 10, 5, "test3")); System.out.println("TokenList : " + tokenCmdList.toString()); - new MergeSample(userCmdList, tokenCmdList); + new Translate(userCmdList, tokenCmdList); System.out.println(); System.out.println("NewUserList : " + userCmdList.toString()); System.out.println("NewTokenList : " + tokenCmdList.toString()); @@ -76,7 +76,7 @@ System.out.println("UserList : " + userCmdList.toString()); tokenCmdList.add(new Rep_Cmd(REP.REP_REPLACE_CMD, 1, 2, 0, 10, 5, "test3")); System.out.println("TokenList : " + tokenCmdList.toString()); - new MergeSample(userCmdList, tokenCmdList); + new Translate(userCmdList, tokenCmdList); System.out.println(); System.out.println("NewUserList : " + userCmdList.toString()); System.out.println("NewTokenList : " + tokenCmdList.toString());
--- a/src/sample/merge/MergeSample.java Tue Oct 31 19:01:04 2006 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -package sample.merge; - -import java.util.Iterator; -import java.util.List; - -import remoteeditor.network.REP; - -public class MergeSample { - List <Rep_Cmd> userList; - List <Rep_Cmd> tokenList; - private int REP_IGNORE = -1; - public MergeSample(List<Rep_Cmd> userList, List<Rep_Cmd> tokenList){ - this.userList = userList; - this.tokenList = tokenList; - merge(); - } - - - void merge(){ - Rep_Cmd h_pricmd; - Rep_Cmd l_pricmd; -// Iterator userListIterator = userList.iterator(); -// while(userListIterator.hasNext()){ - for(Rep_Cmd userCmd:userList){ - //Iterator tokenListIterator = tokenList.iterator(); - //Rep_Cmd userCmd = (Rep_Cmd)userListIterator.next(); - if(userCmd.stat == REP_IGNORE) continue; /* 削除される(予定)のREPコマンドの比較は無視 */ - //while(tokenListIterator.hasNext()){ - for(Rep_Cmd tokenCmd:tokenList){ -// Rep_Cmd tokenCmd =(Rep_Cmd)tokenListIterator.next(); - if(tokenCmd.stat == REP_IGNORE) continue; /* 削除される(予定)のREPコマンドの比較は無視 */ - if(userCmd.stat == REP_IGNORE) break; - if(userCmd.lineno < tokenCmd.lineno) { /* UsersLineNumber < TokensLineNumber */ - if(userCmd.cmd == REP.REP_INSERT_CMD){ - tokenCmd.lineno++; - }else if(userCmd.cmd == REP.REP_DELETE_CMD){ - tokenCmd.lineno--; - } - }else if(userCmd.lineno > tokenCmd.lineno){ /* UsersLineNumber > TokensLineNumber */ - if(tokenCmd.cmd == REP.REP_INSERT_CMD){ - userCmd.lineno++; - }else if(tokenCmd.cmd == REP.REP_DELETE_CMD){ - userCmd.lineno--; - } - }else if(userCmd.lineno == tokenCmd.lineno){ /* UsersLineNumber == TokensLineNumber */ - /* - * 行番号が重なるとREPコマンドの競合が起こるので、 - * どちらかが譲らないといけない。 - * uid が小さい方を優先(h_pricmdに)し、 - * uid が大きい方(l_pricmd)を変更する。 - */ - if(userCmd.eid < tokenCmd.eid){ - h_pricmd = userCmd; - l_pricmd = tokenCmd; - }else { - h_pricmd = tokenCmd; - l_pricmd = userCmd; - } - if(h_pricmd.cmd == REP.REP_INSERT_CMD){ - l_pricmd.lineno++; - }else if(l_pricmd.cmd == REP.REP_REPLACE_CMD){ - if(l_pricmd.cmd == REP.REP_INSERT_CMD){ - /* h_pricmd が優先され,l_pricmd は削除(無視に)する */ - l_pricmd.stat = REP_IGNORE; - }else if(l_pricmd.cmd == REP.REP_DELETE_CMD){ - /* - * l_pricmd 側ではすでにdeleteされているので、 - * h_pricmd を REP_REPLACE_CMD -> REP_INSERT_CMD へ変更。 - */ - h_pricmd.cmd = REP.REP_INSERT_CMD; - l_pricmd.stat = REP_IGNORE; - } - }else if(h_pricmd.cmd == REP.REP_DELETE_CMD){ - if (l_pricmd.cmd == REP.REP_INSERT_CMD) { - h_pricmd.lineno++; - } else if(l_pricmd.cmd == REP.REP_REPLACE_CMD){ - /* - * h_pricmd 側ではすでにdeleteされているので、 - * l_pricmd 側を REP_REPLACE_CMD -> REP_INSERT_CMD へ変更。 - */ - l_pricmd.cmd = REP.REP_INSERT_CMD; - h_pricmd.stat= REP_IGNORE; - } else { /* l_pricmd->cmd == REP_DELETE_LINE_CMD */ - /* - * 相手と削除する行が重なるので、 - * 両方のコマンドを無視にする。 - * 相手先ではすでにこの行は削除されている。 - */ - h_pricmd.stat = REP_IGNORE; - l_pricmd.stat = REP_IGNORE; - break; - } - } - } - } - } - } -}
--- a/src/sample/merge/Rep_Cmd.java Tue Oct 31 19:01:04 2006 +0900 +++ b/src/sample/merge/Rep_Cmd.java Tue Nov 14 03:59:38 2006 +0900 @@ -27,7 +27,7 @@ cmdString[6] = "REP_INSERT_CMD"; cmdString[9] = "REP_DELETE_CMD"; cmdString[13] = "REP_REPLACE_CMD"; - String repCmdString = new String(cmdString[cmd] + "," + sid + "," + eid + "," + seq + "," + lineno + "," + textsiz + "," + string); + String repCmdString = new String(cmd + "," + sid + "," + eid + "," + seq + "," + lineno + "," + textsiz + "," + string); return repCmdString; }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sample/merge/Translate.java Tue Nov 14 03:59:38 2006 +0900 @@ -0,0 +1,98 @@ +package sample.merge; + +import java.util.List; + +import remoteeditor.network.REP; + +public class Translate { + List <Rep_Cmd> userList; + List <Rep_Cmd> tokenList; + private int REP_IGNORE = -1; + public Translate(List<Rep_Cmd> userList, List<Rep_Cmd> tokenList){ + this.userList = userList; + this.tokenList = tokenList; + merge(); + } + + + void merge(){ + Rep_Cmd h_pricmd; + Rep_Cmd l_pricmd; +// Iterator userListIterator = userList.iterator(); +// while(userListIterator.hasNext()){ + for(Rep_Cmd userCmd:userList){ + //Iterator tokenListIterator = tokenList.iterator(); + //Rep_Cmd userCmd = (Rep_Cmd)userListIterator.next(); + if(userCmd.stat == REP_IGNORE) continue; /* 削除される(予定)のREPコマンドの比較は無視 */ + //while(tokenListIterator.hasNext()){ + for(Rep_Cmd tokenCmd:tokenList){ + if(userCmd.toString().equals(tokenCmd.toString())) tokenList.remove(tokenCmd); +// Rep_Cmd tokenCmd =(Rep_Cmd)tokenListIterator.next(); + if(tokenCmd.stat == REP_IGNORE) continue; /* 削除される(予定)のREPコマンドの比較は無視 */ + if(userCmd.stat == REP_IGNORE) break; + if(userCmd.lineno < tokenCmd.lineno) { /* UsersLineNumber < TokensLineNumber */ + if(userCmd.cmd == REP.REP_INSERT_CMD){ + tokenCmd.lineno++; + }else if(userCmd.cmd == REP.REP_DELETE_CMD){ + tokenCmd.lineno--; + } + }else if(userCmd.lineno > tokenCmd.lineno){ /* UsersLineNumber > TokensLineNumber */ + if(tokenCmd.cmd == REP.REP_INSERT_CMD){ + userCmd.lineno++; + }else if(tokenCmd.cmd == REP.REP_DELETE_CMD){ + userCmd.lineno--; + } + }else if(userCmd.lineno == tokenCmd.lineno){ /* UsersLineNumber == TokensLineNumber */ + /* + * 行番号が重なるとREPコマンドの競合が起こるので、 + * どちらかが譲らないといけない。 + * uid が小さい方を優先(h_pricmdに)し、 + * uid が大きい方(l_pricmd)を変更する。 + */ + if(userCmd.eid < tokenCmd.eid){ + h_pricmd = userCmd; + l_pricmd = tokenCmd; + }else { + h_pricmd = tokenCmd; + l_pricmd = userCmd; + } + if(h_pricmd.cmd == REP.REP_INSERT_CMD){ + l_pricmd.lineno++; + }else if(l_pricmd.cmd == REP.REP_REPLACE_CMD){ + if(l_pricmd.cmd == REP.REP_INSERT_CMD){ + /* h_pricmd が優先され,l_pricmd は削除(無視に)する */ + l_pricmd.stat = REP_IGNORE; + }else if(l_pricmd.cmd == REP.REP_DELETE_CMD){ + /* + * l_pricmd 側ではすでにdeleteされているので、 + * h_pricmd を REP_REPLACE_CMD -> REP_INSERT_CMD へ変更。 + */ + h_pricmd.cmd = REP.REP_INSERT_CMD; + l_pricmd.stat = REP_IGNORE; + } + }else if(h_pricmd.cmd == REP.REP_DELETE_CMD){ + if (l_pricmd.cmd == REP.REP_INSERT_CMD) { + h_pricmd.lineno++; + } else if(l_pricmd.cmd == REP.REP_REPLACE_CMD){ + /* + * h_pricmd 側ではすでにdeleteされているので、 + * l_pricmd 側を REP_REPLACE_CMD -> REP_INSERT_CMD へ変更。 + */ + l_pricmd.cmd = REP.REP_INSERT_CMD; + h_pricmd.stat= REP_IGNORE; + } else { /* l_pricmd->cmd == REP_DELETE_LINE_CMD */ + /* + * 相手と削除する行が重なるので、 + * 両方のコマンドを無視にする。 + * 相手先ではすでにこの行は削除されている。 + */ + h_pricmd.stat = REP_IGNORE; + l_pricmd.stat = REP_IGNORE; + break; + } + } + } + } + } + } +}