# HG changeset patch
# User pin
# Date 1219458496 -32400
# Node ID 6326e5ea4595bea966f60f29af003837f651897a
# Parent 09ad66f62f4ad507a9f3e320f1b77f20b1103109
*** empty log message ***
diff -r 09ad66f62f4a -r 6326e5ea4595 bin/remoteeditor/network/REP.class
Binary file bin/remoteeditor/network/REP.class has changed
diff -r 09ad66f62f4a -r 6326e5ea4595 src/pathfinder/mergetest/ChannelSimulator.java
--- a/src/pathfinder/mergetest/ChannelSimulator.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/pathfinder/mergetest/ChannelSimulator.java Sat Aug 23 11:28:16 2008 +0900
@@ -1,11 +1,14 @@
package pathfinder.mergetest;
import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
public class ChannelSimulator
{
private BlockingQueue
qread;
private BlockingQueue
qwrite;
private NetworkSimulator
ns;
+ private BlockingQueue> connectQueue =
+ new LinkedBlockingQueue>();
public ChannelSimulator(NetworkSimulator _ns, BlockingQueue
_a, BlockingQueue
_b){
ns = _ns;
@@ -68,6 +71,25 @@
public ChannelSimulator
getServerChannel() {
return new ChannelSimulator
(ns, qwrite, qread);
}
+
+ public void connect(ChannelSimulator
c){
+ synchronized(ns){
+ connectQueue.add(c);
+ ns.notifyAll();
+ }
+ }
+
+ public ChannelSimulator
accept() {
+ return connectQueue.remove();
+ }
+
+ public boolean isAcceptable() {
+ return !connectQueue.isEmpty();
+ }
+
+ public boolean isReadable() {
+ return !qread.isEmpty();
+ }
}
diff -r 09ad66f62f4a -r 6326e5ea4595 src/pathfinder/mergetest/EditorSimulator.java
--- a/src/pathfinder/mergetest/EditorSimulator.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/pathfinder/mergetest/EditorSimulator.java Sat Aug 23 11:28:16 2008 +0900
@@ -12,18 +12,18 @@
//private boolean isOwner;
protected NetworkSimulator ns;
protected ChannelSimulator cs;
- protected Queue CmdList;
+ //protected Queue CmdList;
private TranslaterImp1 translater;
protected Text text;
protected boolean running=true;
- public EditorSimulator(int _eid, NetworkSimulator _ns, Queue q, String _name) {
+ public EditorSimulator(int _eid, NetworkSimulator _ns, String[] strings, String _name) {
super(_name);
eid = _eid;
ns = _ns;
- CmdList = q;
+
translater = new TranslaterImp1(_eid);
- text = new Text();
+ text = new Text(strings);
cs = ns.connect();
}
@@ -83,8 +83,8 @@
}
protected void sendOneCommand(REPCommand cmd) {
- REPCommand[] cmds;
- if (cmd==null) cmd = CmdList.poll();
+ REPCommand cmds;
+ //if (cmd==null) cmd = CmdList.poll();
if (cmd==null) return;
//cmd.eid = eid;
@@ -92,34 +92,25 @@
cmd.setString("inserted by Editor"+cmd.eid+":"+cmd.seq);
//if (isOwner) cmd.setThroughMaster(true);
- for (int i=0; i ns;
- private ChannelSimulator cs;
- private TranslaterImp1 translater;
- private Text text;
- private boolean running=true;
- private User user;
-
- public EditorSimulatorAsync(int _eid, NetworkSimulator _ns, Queue q, String _name) {
- super(_eid, _ns, q, _name);
- eid = _eid;
- ns = _ns;
- cs = ns.connect();
- translater = new TranslaterImp1(_eid);
- text = new Text();
- user = new User(translater, text, q, cs);
- }
-
- public void run(){
- System.out.println("Editor"+eid+" start.");
- user.start();
-
- // MainLoop,
- while(running){
- REPCommand cmd = cs.read();
- REPCommand[] cmds;
-
- //終了条件
- if (cmd.eid==eid && cmd.cmd==REP.SMCMD_QUIT){
- System.out.println("\tEditor"+eid+" catch QUIT command emited by itself.");
- cmds = translater.catchOwnCommand(cmd);
- for (int i=0; i CmdList;
- private TranslaterImp1 translater;
- private Text text;
- private ChannelSimulator cs;
-
- public User(TranslaterImp1 _translater, Text _text, Queue q, ChannelSimulator _cs){
- translater = _translater;
- text = _text;
- CmdList = q;
- cs = _cs;
- }
-
- public void run(){
- System.out.println("Editor"+eid+"'s writer thread start.");
- while ( !CmdList.isEmpty() ){
- sendOneCommand();
- }
- sendQuitCommand();
- System.out.println("Editor"+eid+"'s writer thread finish.");
- }
-
- private void sendOneCommand() {
- REPCommand[] cmds;
- REPCommand cmd = CmdList.poll();
- cmd.eid = eid;
- cmds = translater.transSendCmd(cmd);
- cmd.setString("this is inserted or replaced by Editor"+cmd.eid+":"+cmd.seq);
-
- if (isOwner) cmd.setThroughMaster(true);
- for (int i=0; i _ns, Queue q, String _name) {
- super(_eid, _ns, q, _name);
+ public EditorSimulatorWithoutMerger(int _eid, NetworkSimulator _ns, String[] strings, String _name) {
+ super(_eid, _ns, strings, _name);
}
public void run(){
@@ -43,12 +43,14 @@
continue;
}
- if(lock) continue;
- sendOneCommand(cmd);
+ //if(lock) continue;
+ String replacedText = text.edit(cmd);
+ sendOneCommand(cmd, replacedText);
}else if(cmd.eid == -2){
// Merged Commands.
- text.edit(cmd);
+ String replacedText = text.edit(cmd);
+ sendOneCommand(cmd, replacedText);
/* 終了条件 */
if (cmd.cmd==REP.SMCMD_QUIT){
@@ -88,40 +90,42 @@
lock = b;
}
- protected void sendOneCommand(REPCommand cmd){
-
- if (cmd==null) cmd = CmdList.poll();
+ protected void sendOneCommand(REPCommand cmd, String replacedText){
+
if (cmd==null) return;
cmd.eid = eid;
cmd.seq = seq++;
if(cmd.cmd == REP.REPCMD_INSERT){
- cmd.setString("inserted by Editor"+cmd.eid+":"+cmd.seq);
+ //cmd.setString("inserted by Editor"+cmd.eid+":"+cmd.seq);
cs.write(cmd);
}else if(cmd.cmd == REP.REPCMD_DELETE){
- String line = text.get(cmd.lineno);
- cmd.setString(line);
+ ///String line = text.get(cmd.lineno);
+ //cmd.setString(line);
+ cmd.setString(replacedText);
cs.write(cmd);
}else if(cmd.cmd == REP.REPCMD_REPLACE){
- REPCommand undoCmd = new REPCommand(REP.SMCMD_UNDO_REPLACE, 0, eid, seq-1, cmd.lineno, 0, "");
- undoCmd.setString(text.get(cmd.lineno));
- cs.write(undoCmd);
+ REPCommand deleteCmd = new REPCommand(REP.REPCMD_DELETE, 0, eid, seq-1, cmd.lineno, 0, "");
+ //undoCmd.setString(text.get(cmd.lineno));
+ deleteCmd.setString(replacedText);
+ cs.write(deleteCmd);
- cmd.setString("replaced by Editor"+cmd.eid+":"+cmd.seq);
+ //cmd.setString("replaced by Editor"+cmd.eid+":"+cmd.seq);
+ cmd.setCMD(REP.REPCMD_INSERT);
cs.write(cmd);
}else if(cmd.cmd == REP.SMCMD_QUIT){
- cmd.setString("sent by Editor"+cmd.eid+":"+cmd.seq);
+ //cmd.setString("sent by Editor"+cmd.eid+":"+cmd.seq);
cs.write(cmd);
}
- text.edit(cmd);
+ //text.edit(cmd);
- Thread.yield();
+ //Thread.yield();
}
}
diff -r 09ad66f62f4a -r 6326e5ea4595 src/pathfinder/mergetest/SelectionKeySimulator.java
--- a/src/pathfinder/mergetest/SelectionKeySimulator.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/pathfinder/mergetest/SelectionKeySimulator.java Sat Aug 23 11:28:16 2008 +0900
@@ -11,13 +11,12 @@
}
public boolean isAcceptable() {
- // TODO Auto-generated method stub
- return false;
+
+ return channel.isAcceptable();
}
public boolean isReadable() {
- // TODO Auto-generated method stub
- return true;
+ return channel.isReadable();
}
public ChannelSimulator channel() {
diff -r 09ad66f62f4a -r 6326e5ea4595 src/pathfinder/mergetest/SelectorSimulator.java
--- a/src/pathfinder/mergetest/SelectorSimulator.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/pathfinder/mergetest/SelectorSimulator.java Sat Aug 23 11:28:16 2008 +0900
@@ -20,23 +20,25 @@
synchronized(ns){
boolean empty = false;
- for(SelectionKeySimulator
key : keyList){
- ChannelSimulator
channel = key.channel();
- if(channel.readQisEmpty()){
- empty = true;
- }else{
- empty = false;
- //selectedKeys = key;
- selectedKeys.add(key);
- break;
+ while(empty){
+ for(SelectionKeySimulator
key : keyList){
+ ChannelSimulator
channel = key.channel();
+ if(channel.readQisEmpty()){
+ empty = true;
+ }else{
+ empty = false;
+ //selectedKeys = key;
+ selectedKeys.add(key);
+ break;
+ }
}
- }
-
- try {
- if(empty) ns.wait();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+
+ try {
+ if(empty) ns.wait();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ //e.printStackTrace();
+ }
}
}
return selectedKeys.size();
diff -r 09ad66f62f4a -r 6326e5ea4595 src/pathfinder/mergetest/SessionManagerSimulatorWithMerger.java
--- a/src/pathfinder/mergetest/SessionManagerSimulatorWithMerger.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/pathfinder/mergetest/SessionManagerSimulatorWithMerger.java Sat Aug 23 11:28:16 2008 +0900
@@ -1,6 +1,7 @@
package pathfinder.mergetest;
import java.util.ArrayList;
+import java.util.LinkedList;
import java.util.List;
import remoteeditor.command.REPCommand;
import remoteeditor.network.REP;
@@ -10,9 +11,10 @@
private List editorList;
private SelectorSimulator selector;
- private List> sentList;
+ //private List> sentList;
private List> editorList2;
private int countQuit;
+ private int startQuit2;
public SessionManagerSimulatorWithMerger(NetworkSimulator _ns) {
super(_ns);
@@ -25,7 +27,6 @@
public SessionManagerSimulatorWithMerger(NetworkSimulator
_ns, int max_client, int max_packet) {
super(_ns, max_client, max_packet);
editorList = new ArrayList();
- sentList = new ArrayList>();
selector = new SelectorSimulator(_ns);
editorList2 = new ArrayList>();
}
@@ -35,7 +36,6 @@
while((cs=ns.accept())!=null){
csList.add(cs);
editorList.add(new TranslaterImp1(editorList.size()));
- sentList.add(new ArrayList());
editorList2.add(new EditorObject(editorList2.size(), cs, new TranslaterImp1(editorList2.size())));
registerChannel (selector, cs, SelectionKeySimulator.OP_READ);
}
@@ -60,8 +60,8 @@
if(key.isAcceptable()){
ChannelSimulator
channel = key.channel();
+ channel = channel.accept();
selector.register(channel);
- channel = null;
}else if(key.isReadable()){
ChannelSimulator
channel = key.channel();
@@ -80,24 +80,21 @@
// コマンドの処理
int eid = getEID(channel);
- int neid = (eid+1)%editorList2.size();
+ int neid = getNextEID(eid);
EditorObject editor = getEditor(eid);
EditorObject nextEditor = getEditor(neid);
//editor.receive(command);
switch(command.cmd){
-
+ case REP.SMCMD_QUIT_2:
+ quit2(nextEditor, command, 0);
+ break;
+
case REP.SMCMD_QUIT:
quit(nextEditor, command);
break;
-
- case REP.SMCMD_UNDO_REPLACE:
- for(TranslaterImp1 trans : editorList){
- trans.setUndoCommand(command);
- }
- break;
-
+
default:
translate(eid, neid, command);
//REPCommand sendCommand = editor.receive(command);
@@ -106,22 +103,32 @@
}
+ private int getNextEID(int eid) {
+ return (eid+1)%editorList2.size();
+ }
+
private void quit(EditorObject nextEditor, REPCommand command) {
- if(countQuit > editorList2.size()*2){
- REPCommand quitCommand = new REPCommand(command);
- quitCommand.eid = -2;
- for(EditorObject editor : editorList2){
- editor.send(quitCommand);
- }
- }else{
- nextEditor.send(command);
+ if(command.eid == nextEditor.eid){
+ //quitコマンドが一周してきた
+ command.setCMD(REP.SMCMD_QUIT_2);
}
- countQuit++;
+ nextEditor.send(command);
+ }
+
+ private void quit2(EditorObject nextEditor, REPCommand command, int fromPort) {
+
+ if(command.eid == nextEditor.eid){
+ //quitコマンドが一周してきた
+ command.setCMD(REP.SMCMD_QUIT_2);
+ }
+ nextEditor.send(command);
+ if(startQuit2 == -1) startQuit2 = fromPort;
+ else if(startQuit2 == nextEditor.eid) quitSessionManager();
}
- private void checkQuit(ChannelSimulator
channel, REPCommand command) {
-
+ private void quitSessionManager() {
+ running = false;
}
private void translate(int eid, int neid, REPCommand command) {
@@ -136,50 +143,32 @@
if(command.eid == eid){
if(checkOwnCommand(command)){
- //エディタからの編集コマンドが他の全てのエディタを通って戻ってきた場合
- if(command.cmd == REP.SMCMD_QUIT){
- //QUITコマンドの場合
- REPCommand tmp = new REPCommand(command);
- tmp.eid = -2;
- //quitCommand = tmp;
- channel.write(pack(tmp));
- }else{
//エディタからの編集コマンドが戻ってきた場合、マージしてエディタへ反映
- REPCommand[] cmds = editorList.get(eid).catchOwnCommand(command);
- for(REPCommand cmd : cmds){
- REPCommand tmp2 = new REPCommand(cmd);
- tmp2.eid = -2;
- channel.write(pack(tmp2));
- }
+ REPCommand[] cmds = editorList.get(eid).catchOwnCommand(command);
+ for(REPCommand cmd : cmds){
+ REPCommand tmp2 = new REPCommand(cmd);
+ tmp2.eid = REP.SMCMD_MERGE_EID;
+ channel.write(pack(tmp2));
}
}else{
- if(command.cmd == REP.SMCMD_QUIT){
- //エディタからのQUITコマンド
- sentList.get(eid).add(command);
- nextChannel.write(pack(command));
- }else{
+
//エディタからの新たな編集コマンド
- sentList.get(eid).add(command);
editorList.get(eid).transSendCmd(command);
nextChannel.write(pack(command));
- }
+
}
- }else if(command.eid == -2){
-// if(mergedList.get(eid).size() == 0){
-// if(quitCommand != null) channel.write(pack(quitCommand));
-// }
+ }else if(command.eid == REP.SMCMD_MERGE_EID){
+ //マージのときにエディタとの間に衝突がないか確認
+ editorList.get(eid).checkMergeConflict();
}else{
- if(command.cmd == REP.SMCMD_QUIT){
- //QUITコマンドはマージャへ追加せずそのまま次のエディタへ送信する
- nextChannel.write(pack(command));
- }else{
+
//他のエディタからのコマンドはマージャへ追加しを次のエディタへ送信する
- REPCommand[] cmds = editorList.get(eid).transReceiveCmd(command);
- for(REPCommand cmd : cmds){
- nextChannel.write(pack(cmd));
- }
+ REPCommand[] cmds = editorList.get(eid).transReceiveCmd(command);
+ for(REPCommand cmd : cmds){
+ nextChannel.write(pack(cmd));
}
+
}
}
@@ -193,12 +182,6 @@
return null;
}
- private EditorObject getEditor(ChannelSimulator
channel){
- int eid = getEID(channel);
- EditorObject editor = getEditor(eid);
- return editor;
- }
-
private int getEID(ChannelSimulator
channel) {
int eid = 0;
for(EditorObject editor : editorList2){
@@ -210,9 +193,8 @@
}
private ChannelSimulator
getChannel(int eid) {
- // TODO Auto-generated method stub
ChannelSimulator
channel = null;
- for(EditorObject editor : editorList2){
+ for(EditorObject
editor : editorList2){
if(editor.getEID() == eid){
channel = editor.getChannel();
}
@@ -223,10 +205,10 @@
private boolean checkOwnCommand(REPCommand command) {
// TODO Auto-generated method stub
boolean ownCommand = false;
- if(sentList.get(command.eid).size() > 0){
- if(sentList.get(command.eid).get(0).seq == command.seq){
+ LinkedList sentCommand = editorList.get(command.eid).getSentCmds();
+ if(sentCommand.size() > 0){
+ if(sentCommand.get(0).seq == command.seq){
ownCommand = true;
- sentList.get(command.eid).remove(0);
}
}
return ownCommand;
diff -r 09ad66f62f4a -r 6326e5ea4595 src/pathfinder/mergetest/TestMerger.java
--- a/src/pathfinder/mergetest/TestMerger.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/pathfinder/mergetest/TestMerger.java Sat Aug 23 11:28:16 2008 +0900
@@ -73,7 +73,7 @@
ns.setLogLevel(ll);
/* create UsersSimulator. */
- users = new UsersSimulator(ns, ne, np*ne);
+ //users = new UsersSimulator(ns, ne, np*ne);
/* create ne Editors and np commands. */
for (int i=0; i ns=null;
protected LinkedList editors;
protected SessionManagerSimulatorWithMerger sema;
- protected UsersSimulator users;
+ protected LinkedList users = new LinkedList();
+
+ static private String[] text0 = {
+ "aaa", "bbb", "ccc", "ddd", "eee",
+ "fff", "ggg", "hhh", "iii", "jjj",
+ "kkk", "lll", "mmm", "nnn", "ooo",
+ "ppp", "qqq", "rrr", "sss", "ttt",
+ "uuu", "vvv", "www", "xxx", "yyy", "zzz"
+ };
public TestMerger2(){
editors = new LinkedList();
@@ -46,8 +54,16 @@
/* start SessionManager if it exist. */
if (sema!=null) sema.init();
if (sema!=null) sema.start();
- users.init();
- users.start();
+
+ for(UsersSimulator u: users){
+ u.start();
+ }
+ for(UsersSimulator u: users){
+ try {
+ u.join();
+ } catch (InterruptedException e) { }
+ }
+
/* wait Editors finish. */
for (EditorSimulatorWithoutMerger ee: editors){
@@ -58,9 +74,26 @@
}
}
/* inform SessionManager to finish. */
- if (sema!=null) sema.finish();
+ if (sema!=null) {
+ sema.finish();
+ try {
+ sema.join();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
}
+ LinkedList userCommand(int eid){
+ LinkedList cmds = new LinkedList();
+ 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"));
+ return cmds;
+ }
+
protected void init(boolean sm, int ne, int np, int ll){
/* create NetworkSimulator, and SessionManager if it's required. */
if (sm){
@@ -73,11 +106,14 @@
ns.setLogLevel(ll);
/* create UsersSimulator. */
- users = new UsersSimulator(ns, ne, np*ne);
+ for(int i = 0; i < ne; i++){
+ ChannelSimulator channel = ns.getAcceptedSession(i);
+ users.add(new UsersSimulator(channel, userCommand(i)));
+ }
/* create ne Editors and np commands. */
for (int i=0; i cmds = new LinkedList();
+ //LinkedList cmds = new LinkedList();
// 各エディタが送信するコマンド列を生成
/* create command list. */
@@ -93,7 +129,7 @@
*/
/* create a Editor, and pass command list to it. */
- EditorSimulatorWithoutMerger ee = new EditorSimulatorWithoutMerger(i, ns, cmds, "Editor"+i);
+ EditorSimulatorWithoutMerger ee = new EditorSimulatorWithoutMerger(i, ns, i==0?text0:null, "Editor"+i);
if(i==0) ee.setOwner(true);
editors.add(ee);
}
diff -r 09ad66f62f4a -r 6326e5ea4595 src/pathfinder/mergetest/Text.java
--- a/src/pathfinder/mergetest/Text.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/pathfinder/mergetest/Text.java Sat Aug 23 11:28:16 2008 +0900
@@ -7,43 +7,38 @@
import remoteeditor.network.REP;
public class Text {
- static private String[] text0 = {
- "aaa", "bbb", "ccc", "ddd", "eee",
- "fff", "ggg", "hhh", "iii", "jjj",
- "kkk", "lll", "mmm", "nnn", "ooo",
- "ppp", "qqq", "rrr", "sss", "ttt",
- "uuu", "vvv", "www", "xxx", "yyy", "zzz"
- };
+
LinkedList strList;
- public Text(){
- this(Text.text0);
- }
public Text(String[] _strings){
strList = new LinkedList(Arrays.asList(_strings));
}
- synchronized public void insert(int i, String str){
+ public String insert(int i, String str){
assert 0 ns;
- private int N_client;
- private int N_packet;
- private ArrayList> channelList;
- private int nextChannelIndex;
+ private ChannelSimulator cs;
+ private LinkedList cmds;
- public UsersSimulator(NetworkSimulator _ns, int max_client, int max_packet){
- ns = _ns;
- N_client = max_client;
- N_packet = max_packet;
- channelList = new ArrayList>();
+ public UsersSimulator(ChannelSimulator _cs, LinkedList _cmds){
+ cs = _cs;
+ cmds = _cmds;
}
public void run(){
- int i=0;
-
ns.writeLog("UsersSimulator start.", 1);
- while( i++0){
REPCommand cmd0 = createCmd();
- ChannelSimulator cs = channelList.get(nextChannelIndex);
cs.write(cmd0);
-
- nextChannelIndex++;
- if (nextChannelIndex>=channelList.size()) nextChannelIndex=0;
- }
-
- // Quitコマンドを送るエディタはeid=0のエディタのみ
-// ChannelSimulator channel = channelList.get(0);
-// REPCommand qCommand = createQuitCmd();
-// channel.write(qCommand);
-
- /* send quitPacket to all editors. */
- synchronized (ns){
- // for ( ChannelSimulator cs : channelList){
- ChannelSimulator cs = channelList.get(0);
- REPCommand cmd0 = createQuitCmd();
- cs.write(cmd0);
- // }
}
ns.writeLog("UsersSimulator finish.", 1);
}
private REPCommand createCmd(){
- String str = new String("this text was created by Control thread.");
- //REPCommand cmd = new REPCommand(REP.REPCMD_INSERT, 0, -1, 0, 10, str.length(), str);
- REPCommand cmd = new REPCommand(REP.REPCMD_REPLACE, 0, -1, 0, 10, str.length(), str);
+ REPCommand cmd = cmds.remove(0);
return cmd;
}
- private REPCommand createQuitCmd(){
- String str = new String("this text was created by Control thread.");
- REPCommand cmd = new REPCommand(REP.SMCMD_QUIT, 0, -1, 0, 10, str.length(), str);
- return cmd;
- }
+
public void init(){
- getAllChannelSimulators();
- }
-
- private void getAllChannelSimulators(){
- while (channelList.size() cs;
- cs = ns.getAcceptedSession( channelList.size() );
- if (cs==null) continue;
- channelList.add( cs );
- }
}
}
diff -r 09ad66f62f4a -r 6326e5ea4595 src/remoteeditor/network/REP.java
--- a/src/remoteeditor/network/REP.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/remoteeditor/network/REP.java Sat Aug 23 11:28:16 2008 +0900
@@ -41,6 +41,8 @@
public static final int SMCMD_START_MERGE = 75;
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 SMCMD_START_MERGE = 73;
//public static final int SMCMD_START_MERGE_ACK = 74;
diff -r 09ad66f62f4a -r 6326e5ea4595 src/sample/merge/Merger.java
--- a/src/sample/merge/Merger.java Fri Aug 22 15:48:52 2008 +0900
+++ b/src/sample/merge/Merger.java Sat Aug 23 11:28:16 2008 +0900
@@ -47,13 +47,13 @@
}
public void CommandSend(REPCommand cmd){
- REPCommand[] cmds;
+ REPCommand cmds;
cmd.eid = eid;
cmds = translater.transSendCmd(cmd);
- for (int i=0; i{
- private ArrayList sortCmds(ArrayList cmds) {
- ArrayList sortedCmds = new ArrayList();
+ public int compare(REPCommand o1, REPCommand o2) {
+
+ if ( o2.lineno > o1.lineno ) return 1;
+ else if ( o2.lineno < o1.lineno
+ || o2.eid > o1.eid )
+ /* deleteとinsertの場合などはeidによらず、順序を強制する必要があるかも */
+ return -1;
+
+ return 1;
+ }
+
+ }
+
+ private Collection sortCmds(ArrayList cmds) {
+ TreeSet sortedCmds1 = new TreeSet(new REPCommandComparator());
int top;
int prevEid=-1;
int i,j;
- /*
- * EID,SEQの低い順に、各EID毎に1個だけ選択しsortedCmdsに格納
- * cmdsにはまだデータが残る
- */
while ( -1 != (top=getPrecedence(cmds, prevEid+1)) ){
//while ( -1 != (top=getPrecedence(cmds, prevEid)) ){
REPCommand tmp = cmds.remove(top);
- sortedCmds.add(tmp);
+ sortedCmds1.add(tmp);
prevEid = tmp.eid;
}
-
+
+ if(false){
+ ArrayList sortedCmds = new ArrayList();
/* lineno の大きい順にソート */
for (i=0; i