changeset 298:cf9328e66d25

*** empty log message ***
author kono
date Tue, 30 Sep 2008 22:42:33 +0900
parents 9c553308b918
children d13dad30fd24
files rep/channel/SelectionKeySimulator.java rep/channel/SelectorSimulator.java test/sematest/TestEditor.java
diffstat 3 files changed, 68 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/rep/channel/SelectionKeySimulator.java	Tue Sep 30 19:16:06 2008 +0900
+++ b/rep/channel/SelectionKeySimulator.java	Tue Sep 30 22:42:33 2008 +0900
@@ -11,6 +11,7 @@
 	private SelectableChannel channel;
 	private int ready;
 	public Selector selector;
+	public boolean canceled = false;
 
 	public SelectionKeySimulator(SelectableChannel cs, int opt, Selector _selector) {
 		channel = cs;
@@ -59,10 +60,12 @@
 		return scs.accept1();
 	}
 
+	@SuppressWarnings("unchecked")
 	@Override
 	public void cancel() {
-		System.err.println("cancel is not implemented yet.");
-		//selector.
+		canceled = true;
+		SelectorSimulator s = (SelectorSimulator)selector;
+		s.deregister(channel);
 	}
 
 	@Override
@@ -78,7 +81,7 @@
 
 	@Override
 	public boolean isValid() {
-		return true;
+		return (!canceled) && channel.isOpen() && selector.isOpen();
 	}
 
 
--- a/rep/channel/SelectorSimulator.java	Tue Sep 30 19:16:06 2008 +0900
+++ b/rep/channel/SelectorSimulator.java	Tue Sep 30 22:42:33 2008 +0900
@@ -6,6 +6,7 @@
 import java.nio.channels.Selector;
 import java.nio.channels.spi.SelectorProvider;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Set;
 
 public class SelectorSimulator<P> extends REPSelector<P>{
@@ -88,6 +89,13 @@
 		return key;
 	}
 	
+	public void deregister(SelectableChannel channel) {
+		for(Iterator<SelectionKey> it = keyList.iterator();it.hasNext();) {
+			if(it.next().channel() == channel)
+				it.remove();
+		}
+	}
+	
 
 	public Set<REPSelectionKey<P>> selectedKeys1() {
 			Set<SelectionKey> keys = keyList;
@@ -115,14 +123,12 @@
 
 	@Override
 	public boolean isOpen() {
-		// TODO Auto-generated method stub
-		return false;
+		return true;
 	}
 
 	@Override
 	public Set<SelectionKey> keys() {
-		// TODO Auto-generated method stub
-		return null;
+		return keyList;
 	}
 
 	@Override
--- a/test/sematest/TestEditor.java	Tue Sep 30 19:16:06 2008 +0900
+++ b/test/sematest/TestEditor.java	Tue Sep 30 22:42:33 2008 +0900
@@ -33,6 +33,12 @@
 	boolean running = true;
 	long timeout = 1;
 	private String name;
+	private REPCommand nop = new REPCommand(REP.REPCMD_NOP,0,0,0,0,"");
+	private boolean inputLock=false;
+	public boolean detached=false;
+	public boolean master=false;
+	private int syncCounter;
+	private boolean hasInputLock=true;
 
 	static private String[] text1d = {
 		"aaa", "bbb", "ccc", "ddd", "eee",
@@ -45,14 +51,15 @@
 		this.name = name;
 		cmds = new LinkedList<REPCommand>();
 		if (master) {
+			this.master=true;
 			text = new Text(text1d);
-			cmds.add(new REPCommand(REP.SMCMD_PUT,0,0,seq++,0,name+"-file"));
+			cmds.add(new REPCommand(REP.SMCMD_PUT,0,0,0,0,name+"-file"));
 			cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"m0"));
 			cmds.add(new REPCommand(REP.REPCMD_DELETE,0,0,0,0,"m0"));
 			cmds.add(new REPCommand(REP.SMCMD_QUIT,0,0,0,0,""));
 		} else {
 			text = new Text(new String[0]);
-			cmds.add(new REPCommand(REP.SMCMD_JOIN,0,0,seq++,0,name));
+			cmds.add(new REPCommand(REP.SMCMD_JOIN,0,0,0,0,name));
 			cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"c0"));
 			cmds.add(new REPCommand(REP.REPCMD_DELETE,0,0,0,0,"c0"));
 			//cmds.add(new REPCommand(REP.SMCMD_QUIT,0,0,0,0,""));
@@ -86,7 +93,25 @@
 		REPSelector<REPCommand> selector = REPSelector.create();
 		channel.register(selector, SelectionKey.OP_READ);
 		while(running) {
-			if (selector.select(timeout)<=0) {
+			if (inputLock) {
+				// No user input during merge mode (optional)
+				if (selector.select(0)>0) {
+					handle(channel.read());
+				}
+				continue;
+			} else if (selector.select(timeout)<=0) {
+				if (syncCounter>0) {
+					if (syncCounter>text.size()) {
+						syncCounter=0;
+					} else {
+						int i=syncCounter-1;
+						REPCommand del = new REPCommand(REP.REPCMD_DELETE,sid,eid,0,i, text.get(i));
+						REPCommand ins = new REPCommand(REP.REPCMD_INSERT,sid,eid,0,i, text.get(i));
+						sendCommand(del);
+						sendCommand(ins);
+						syncCounter++;
+					}
+				}
 				userInput();
 			} else {
 				handle(channel.read());
@@ -135,20 +160,27 @@
 		case REPCMD_INSERT	:
 			text.insert(cmd.lineno, cmd.string);
 			sendCommand(cmd);
+			sendCommand(nop);
 			break;
 		case REPCMD_INSERT_ACK	:
+			assert(false);
 			break;
 		case REPCMD_DELETE	:
 			String del = text.delete(cmd.lineno);
 			cmd.setString(del);
 			sendCommand(cmd);
+			sendCommand(nop);
 			break;
 		 case REPCMD_DELETE_ACK	:
+				assert(false);
 			 break;
 		 case REPCMD_CLOSE	:
 		 case REPCMD_CLOSE_2	:
+				assert(false);
 			 break;
 		 case REPCMD_NOP		:
+			 sendCommand(cmd);
+			 sendCommand(nop);
 			 break;
 		 case SMCMD_JOIN_ACK	:
 			 sid = cmd.sid;
@@ -159,16 +191,33 @@
 			 eid = cmd.eid;
 			 break;
 		 case SMCMD_QUIT		:
+			 sendCommand(cmd);
+			 cmds.clear();
+			 break;
 		 case SMCMD_QUIT_ACK	:
+			 assert(false);
 			 break;
 		 case SMCMD_START_MERGE :
+			 // lock user input during merge (optional)
+			 inputLock = hasInputLock;
+			 cmd.cmd = REP.SMCMD_START_MERGE_ACK;
+			 sendCommand(cmd);
+			 break;
 		 case SMCMD_START_MERGE_ACK :
+			 assert(false);
 			 break;
 		 case SMCMD_END_MERGE :
+			 inputLock = false;
 			 break;
 		 case SMCMD_QUIT_2 :
+			 sendCommand(cmd);
 			 running = false;
 			 break;
+		 case SMCMD_SYNC:
+			 // start contents sync with newly joined editor
+			 cmd.cmd = REP.SMCMD_SYNC_ACK; sendCommand(cmd);
+			 syncCounter = 1;
+			 break;
 		 default:
 			 assert(false);
 		 	 break;