changeset 372:e16b6326fdac

*** empty log message ***
author kono
date Wed, 22 Oct 2008 00:42:47 +0900
parents 97aa54c9afe6
children ab4405cd3351
files rep/Forwarder.java rep/REP.java rep/Session.java rep/SessionManager.java
diffstat 4 files changed, 92 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/rep/Forwarder.java	Tue Oct 21 22:50:57 2008 +0900
+++ b/rep/Forwarder.java	Wed Oct 22 00:42:47 2008 +0900
@@ -81,7 +81,7 @@
 		
 		Session s = manager.getSession(command.sid);
 		if (s==null) throw new IOException();
-		Forwarder editor = s.getFirstForwarder();
+		Forwarder editor = s.getFirstForwarder(channel);
 		if (editor==null) throw new IOException();
 		editor.manage(command);
 	}
--- a/rep/REP.java	Tue Oct 21 22:50:57 2008 +0900
+++ b/rep/REP.java	Wed Oct 22 00:42:47 2008 +0900
@@ -13,7 +13,8 @@
 	 SMCMD_PUT		( 45),
 	 SMCMD_PUT_ACK	( 46),
 	 SMCMD_SELECT	( 47),
-	 SMCMD_SELECT_ACK	( 48),
+	 SMCMD_SELECT_ACK	( 48), 
+	 SMCMD_SELECT0(49),
 	 SMCMD_QUIT		( 53),
 	 SMCMD_QUIT_ACK	( 54),
 	 SMCMD_SM_JOIN   ( 62),
--- a/rep/Session.java	Tue Oct 21 22:50:57 2008 +0900
+++ b/rep/Session.java	Wed Oct 22 00:42:47 2008 +0900
@@ -39,6 +39,9 @@
 		}
 	}
 	
+	/*
+	 * どこにlocal editorを入れても良いのだが、まとめた方が良いか?
+	 */
 	public void addForwarder(Forwarder forwarder) {
 		// add a forwarder and connect this to the session 
 		forwarder.setSID(sessionID);
@@ -125,9 +128,6 @@
 	}
 
 	
-	Forwarder getNextEditor(Forwarder editor) {
-		return editor.getNextForwarder();
-	}
 	
 	public void closeSession() {
 		Forwarder first = firstForwarder;
@@ -136,10 +136,10 @@
 			first.send(command);
 	}
 	
-
-	
-	public Forwarder getFirstForwarder() {
-		return firstForwarder;
+	public Forwarder getFirstForwarder(REPSocketChannel<REPCommand> channel) {
+		Forwarder f = firstForwarder;
+		while(f.next!=null && f.channel!=channel) f = f.next;
+		return f.next;
 	}
 
 
@@ -179,6 +179,7 @@
 	public void setFirstForwarder(Forwarder f) {
 		f.setSID(sessionID);
 		put(f.eid,f);
+		f.setNext(f);
 		firstForwarder = last = f;
 	}
 
--- a/rep/SessionManager.java	Tue Oct 21 22:50:57 2008 +0900
+++ b/rep/SessionManager.java	Wed Oct 22 00:42:47 2008 +0900
@@ -392,7 +392,23 @@
 		// assert(getSMID(editor.eid)==smList.sessionManagerID());
 		// assert(editor.channel!=null);
 		editor.setSID(sid); // mark as selected
-		selectSession(sid, session, editor.getEID(), editor);
+		selectSession0(sid, session, editor.getEID(), editor);
+	}
+
+	private void selectSession0(int sid, Session session, int eid, Editor editor) {
+		if (editor.isDirect()&&editor.getEID()==eid) {
+			selectSession(sid, session, editor.getEID(), editor);
+		} else {
+			// we don't have this editor, search the editor first.
+			Forwarder next = routingTable.toSessionManager(getSMID(eid));
+			// pass the select command to the next path.
+			REPCommand command = new REPCommand();
+			command.setCMD(REP.SMCMD_SELECT0);
+			command.setSID(sid);
+			command.setEID(eid);
+			command.setString(editor.getHost());
+			next.send(command);
+		}
 	}
 
 	/*
@@ -400,7 +416,7 @@
 	 *    called from GUI or incoming SMCMD_SELECT command.
 	 */
 	private void selectSession(int sid, Session session, int eid, Forwarder editor) {
-		if(session.hasOwner() && editor.channel!=null){
+		if(session.hasOwner()){
 			// we have selected session.
 			REPCommand sendCommand = new REPCommand();
 			if (editor.isDirect()&&editor.getEID()==eid) {
@@ -413,45 +429,42 @@
 				// SELECT_ACK is sent to the session ring to
 				// find out the joined editor.
 				sendCommand.setCMD(REP.SMCMD_SELECT_ACK);
-				// Do not directly addForwarder(forwarder). It may be
-				// shared among sessions.
-				Forwarder f = new Editor(this, false, makeID(editorList.newEid()));
-				f.setChannel(editor.channel); // incoming channel
-				f.setHost(myHost);
-				f.setSID(sid);
-				session.addForwarder(f); // f.next is set up here.
 			}
 			sendCommand.setSID(sid);
 			sendCommand.string = session.getName();
 			sendCommand.setEID(eid);
 			editor.send(sendCommand);
 		}else {
-			Forwarder next;
-			if (editor.channel==null) {
-				// we don't have this editor, search the editor first.
-				next = routingTable.toSessionManager(getSMID(eid));
-			} else {
-				// session searching continue...
-				next = routingTable.toSessionManager(getSMID(sid));
-				// create dummy editor for this session
-				Forwarder f = new Editor(this, false, makeID(editorList.newEid()));
-				f.setChannel(next.channel); // incoming channel
-				f.setNext(f);
-				f.setHost(myHost);
-				f.setSID(sid);
-				session.setFirstForwarder(f);
-				session.addForwarder(editor);
-			}
-			// pass the select command to the next path.
-			REPCommand command = new REPCommand();
-			command.setCMD(REP.SMCMD_SELECT);
-			command.setSID(sid);
-			command.setEID(eid);
-			command.setString(editor.getHost());
-			next.send(command);
+			forwardSelect(sid, session, eid, editor);
 		}
 	}
 
+	private void forwardSelect(int sid, Session session, int eid,
+			Forwarder editor) {
+		Forwarder next;
+		// session searching continue...
+		next = routingTable.toSessionManager(getSMID(sid));
+		// make a forwarding channel here
+		Forwarder f = createSessionDispatcher(sid, next);
+		session.setFirstForwarder(f);
+		session.addForwarder(editor);
+		// pass the select command to the next path.
+		REPCommand command = new REPCommand();
+		command.setCMD(REP.SMCMD_SELECT);
+		command.setSID(sid);
+		command.setEID(eid);
+		command.setString(editor.getHost());
+		next.send(command);
+	}
+
+	private Forwarder createSessionDispatcher(int sid, Forwarder editor) {
+		Forwarder f = new Editor(this, false, makeID(editorList.newEid()));
+		f.setChannel(editor.channel); // incoming channel
+		f.setHost(myHost);
+		f.setSID(sid);
+		return f;
+	}
+
 	/*
 	 * Create and send UPDATE command.
 	 */
@@ -635,13 +648,31 @@
 		}
 		break;
 
+		case SMCMD_SELECT0:
+			/*
+			 * finding joining editor, do not make the path.
+			 */
+			Forwarder editor  = editorList.get(command.eid);
+			if (editor==null|| !editor.isDirect()) {
+				Forwarder next = routingTable.toSessionManager(getSMID(command.eid));
+				next.send(command);
+				break;
+			}
+			// we've found the editor, fall thru.
 		case SMCMD_SELECT:
 		{
+			/*
+			 * finding active session ring from joined editor. 
+			 */
 			Session session = sessionList.get(command.sid);
 			if (session==null) {
 				session = new Session(command.sid, command.string,null);
 				sessionList.put(command.sid,session);
 			}
+			// Do not directly addForwarder(forwarder). It may be
+			// shared among sessions.
+			Forwarder f = createSessionDispatcher(command.sid, forwarder);
+			session.addForwarder(f); // f.next is set up here.
 			selectSession(command.sid, session, command.eid, forwarder);
 		}
 			break;
@@ -649,18 +680,7 @@
 		{
 			// Sessionが見つかったので、select したeditorに教える。
 			Session session = sessionList.get(command.sid);
-			Forwarder next = session.getNextEditor(forwarder);
-			if (next==null) next = session.getFirstForwarder();
-			if (next.getEID()==command.eid) {
-				// select したeditor を見つける
-				command.cmd=REP.SMCMD_JOIN_ACK;
-				next.send(command);
-			} else if (next.isDirect()) {
-				// 
-				next.manage(command);
-			} else {
-				next.send(command);
-			}
+			searchSelectedEditor(command,session.getFirstForwarder(forwarder.channel)); 
 		}
 			break;
 			
@@ -731,6 +751,23 @@
 		return true;
 	}
 
+	/*
+	 * 指定されたeditorがlocalにあるかどうかを調べる。なければ、他に送る。戻って何回も探すことが
+	 * あり得るので、よろしくない。
+	 */
+	private void searchSelectedEditor(REPCommand command, Forwarder editor) {
+		for(;editor.isDirect();editor = editor.getNextForwarder()) {
+			if (editor.getEID()==command.eid) {
+				// select したeditor を見つけた
+				command.cmd=REP.SMCMD_JOIN_ACK;
+				editor.send(command);
+				return;
+			}
+		}
+		// ここにはありませんでした。
+		editor.send(command);
+	}
+
 
 	/**
      * UPDATE/UPDATE_ACKにより送られてきたSessionの情報を追加する