changeset 361:65c6d12a5835

*** empty log message ***
author kono
date Sun, 19 Oct 2008 22:50:20 +0900
parents b25f832f875d
children f0bd158dace6
files Todo rep/EditorList.java rep/Forwarder.java rep/Session.java rep/SessionManager.java
diffstat 5 files changed, 100 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/Todo	Sun Oct 19 20:30:52 2008 +0900
+++ b/Todo	Sun Oct 19 22:50:20 2008 +0900
@@ -1,6 +1,21 @@
+Sun Oct 19 21:23:27 JST 2008
+
+Todo: dispatch先のEditorの作成 (kono)
+
+Session は select 時に、channelを持つeditorが登録される。
+外から来た場合は、新しくeditor を作って、それをsession
+に登録する必要がある。SessionManagerの入口のforwarderを
+session に登録してしまうと、Sessionが一つの時にしか動かない。
+
+put_ack は、putの時にすぐに出してしまって構わない。select_ack
+が廻るので、その時にput_ackを出しても良いが...
+
+Todo: (kono)
+複数のsessionのテストを作成する
+
 Sat Oct 18 20:03:10 JST 2008
 
-Note: Routing Table (kono)
+Todo: Routing Table (kono)
 
 Routing Table (Session, Editor)を作るには、上下双方向の通信が必要。
 SessionID を master が作ると、一旦、multi cast した後、もう一度、
@@ -25,10 +40,11 @@
 update は、木をさかのぼりrouting tableを構築する。
 これで上方向のroutingは確定する。update_ackにより、
 下方向のsesionn routing tableが確定する。
+    Done: Sun Oct 19 21:29:08 JST 2008
 
 Wed Oct 15 13:33:58 JST 2008
 
-Note: (kono)
+Todo: (kono)
 
 Session List を渡すタイミング
 
@@ -56,19 +72,27 @@
 に接続される場合があるってことか。ってことは、やっぱり、
 session manager id を配布するべきだってことね。で、
 SMの名前はあくまでも補助的に使う。
+    Done: Sun Oct 19 21:29:08 JST 2008
 
+Todo: (kono)
 UPDATEの情報によって削除も行なう。delete entry が必要。
 
+Todo: (kono)
 Routing Table
     <eid, channel>
     <sid, channel>
 null は、local。channel==parent なら、自分の下にはいない。
+    Done: Sun Oct 19 21:29:08 JST 2008
 
 Tue Oct 14 06:02:37 JST 2008
 
 Todo: (kono)
 取りあえず、sm_join()からか。次は、join(),put()。そして、
-update()。select()。最後に、gather()。
+update()。select()。
+    Done: Sun Oct 19 21:29:08 JST 2008
+
+Todo: (kono)
+最後に、gather()。
 
 Todo: (kono)
 Select用に、routing tableが必要らしい。session ringへの
@@ -82,6 +106,7 @@
 host_aからのsm_joinを受け取ったら、sm_join(host_a)を親に送る。
 host_aがsm_join(host_a)を受け取ったら、それはloop。親がsm_join
 を受け取れば、そこからsm_join_ackを流して終了。
+    Done: Sun Oct 19 21:29:08 JST 2008
 
 Note: (kono)
 複数のsession managerにsm_joinする場合もある。その場合は、
@@ -149,13 +174,19 @@
 Todo: (kono)
 PUT の時に、master session managerまで行って、session番号を確定する
 必要がある。それまでは、PUT_ACKを出してはならない。
+    Done: Sun Oct 19 21:29:08 JST 2008 
+	session manager IDを使ってuniqueにしたので、不要になった。
+	即座に PUT_ACKを出して構わない。
 
 Todo: (kono)
 SM_JOIN時にmaster session managerを決定するプロトコルを実装する必要が
 ある。たぶん、UPDATEだと思うが...
+    Done: Sun Oct 19 21:29:08 JST 2008 
+	木の根をmasterとして、変更しない。
 
 Todo: (kono)
 外から、きたSession Listを、ただしく自分に反映する。
+    Done: Sun Oct 19 21:29:08 JST 2008 
 
 Todo: (kono)
 test.ServerSample.java はあるが、ClientSample.java がない。
@@ -167,6 +198,8 @@
 
 Todo:
 END_MERGEが繰り返し出てしまう(kono)
+    Done: Sun Oct 19 21:29:08 JST 2008 
+	直ったかな?
 
 Sat Oct 11 22:28:49 JST 2008
 
@@ -187,6 +220,9 @@
 Fri Oct 10 15:24:42 JST 2008
 sid は大域的にuniqueにする必要がある。UPDATEで新しくsessionを作ったことを
 通知して、Masterが新しいsidを決定し、UPDATE_ACKで他のSessionManagerに知らせる(kono)
+    Done: Sun Oct 19 21:29:08 JST 2008 
+	put時に、そのsession managerでsession manager idを使って、
+	uniqueなsidを作成する。put/join/ackで他のSessionManagerに知らせる。
 
 Mon Oct  6 16:39:57 JST 2008
 
--- a/rep/EditorList.java	Sun Oct 19 20:30:52 2008 +0900
+++ b/rep/EditorList.java	Sun Oct 19 22:50:20 2008 +0900
@@ -9,39 +9,17 @@
 	 */
 	private static final long serialVersionUID = 1L;
 	private int eid_root=0;
-	private HashMap<Integer,Editor> waiting= new HashMap<Integer,Editor>();
-
-
-	public void addWaitingEditor(Editor fw) {
-		waiting.put(fw.getEID(),fw);
-	}
 	
 	public void add(Editor fw) {
 		put(fw.getEID(),fw);
 	}
 
-	public void assignSessionManagerIDtoWaitingSM(int eid) {
-		// 待っていたEditorを登録する。
-		// に登録する。この後、EditorのPUT/JOINに従って、ACKを送り、EID
-		// を確定する。
-		Editor waiter;
-		if ((waiter=waiting.remove(eid))!=null) {
-			put(eid,waiter);
-			return;
-		}
-		assert false;
-	}
-
 
 	public int newEid() {
 		return ++eid_root;
 	}
 
 
-	public boolean waiting(Editor editor) {
-		return waiting.containsKey(editor.getEID());
-	}
-
 
 	public boolean hasEid(int eid) {
 		return containsKey(eid);
--- a/rep/Forwarder.java	Sun Oct 19 20:30:52 2008 +0900
+++ b/rep/Forwarder.java	Sun Oct 19 22:50:20 2008 +0900
@@ -77,6 +77,7 @@
 		REPCommand command = channel.read();
 		SessionManager.logger.writeLog("REPHandlerImpl.handle() : command = " + command);
 		if (manager.sessionManage(this, command)) return;
+		
 		Session s = manager.getSession(command.sid);
 		Forwarder editor = s.getFirstForwarder();
 		if (editor!=null) {
--- a/rep/Session.java	Sun Oct 19 20:30:52 2008 +0900
+++ b/rep/Session.java	Sun Oct 19 22:50:20 2008 +0900
@@ -173,4 +173,12 @@
 		sessionName = string;
 	}
 
+
+	public void setFirstForwarder(Forwarder f) {
+		put(f.eid,f);
+		firstForwarder = last = f;
+	}
+
+
+
 }
--- a/rep/SessionManager.java	Sun Oct 19 20:30:52 2008 +0900
+++ b/rep/SessionManager.java	Sun Oct 19 22:50:20 2008 +0900
@@ -323,6 +323,11 @@
 		
 	}
 	
+	/* 
+	 * Select Session from Manager button
+	 *    selected editor is joined editor directly connected to this session
+	 *    manager.
+	 */
 	public void selectSession(SelectButtonEvent event) throws IOException {
 		int sid = event.getSID();
 		Session session = sessionList.get(sid);
@@ -337,29 +342,43 @@
 		selectSession(sid, session, editor.getEID(), editor);
 	}
 
-
+	/*
+	 * Select Session Protocol handler
+	 */
 	private void selectSession(int sid, Session session, int eid, Forwarder editor) {
 		if(session.hasOwner()){
-			session.addForwarder(editor);
 			REPCommand sendCommand = new REPCommand();
 			if (editor.isDirect()&&editor.getEID()==eid) {
+				session.addForwarder(editor);
 				sendUpdate(session.getSID());
 				sendCommand.setCMD(REP.SMCMD_JOIN_ACK);
 			} else {
 				// SELECT_ACK is sent to the session ring to
 				// find out 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);
 			}
 			sendCommand.setEID(editor.getEID());
 			sendCommand.setSID(sid);
-			sendCommand.string = "";
+			sendCommand.string = session.getName();
 			editor.send(sendCommand);
 		}else {
-			session.addForwarder(editor);
-			editor.setHost(myHost);
-			editor.setSID(sid);
+			// session searching 
 			Forwarder next = routingTable.toSession(sid);
 			
+			Forwarder f = new Editor(this, false, makeID(editorList.newEid()));
+			f.setChannel(editor.channel); // incoming channel
+			f.setNext(next);
+			f.setHost(myHost);
+			f.setSID(sid);
+			session.setFirstForwarder(f);
+			
 			REPCommand command = new REPCommand();
 			command.setCMD(REP.SMCMD_SELECT);
 			command.setSID(sid);
@@ -489,8 +508,8 @@
 	
 		break;
 	
+		case SMCMD_PUT_ACK:
 		case SMCMD_JOIN_ACK:
-		case SMCMD_PUT_ACK:
 			registEditor(forwarder,command);
 			updateGUI();
 			break;
@@ -508,6 +527,15 @@
 			} else {
 				routingTable.add(forwarder,getSMID(command.eid),command.sid);
 				smList.sendToMaster(command);
+				// registEditor will be done by SMCMD_PUT_ACK
+			}
+			if (forwarder.isDirect()) {
+				// send put_ack to the editor now.
+				command.setCMD(REP.SMCMD_PUT_ACK);
+				command.string = command.string;
+				command.setEID(command.eid);
+				command.setSID(command.sid);
+				forwarder.send(command);
 			}
 			updateGUI();
 	
@@ -515,10 +543,20 @@
 		break;
 
 		case SMCMD_SELECT:
+		{
+			Session session = sessionList.get(command.sid);
+			if (session==null) {
+				sessionList.put(command.sid,
+						new Session(command.sid, command.string,null));
+			}
+			selectSession(command.sid, session, command.eid, forwarder);
+		}
+			break;
 		case SMCMD_SELECT_ACK:
 		{
 			Session session = sessionList.get(command.sid);
-			selectSession(command.sid, session, command.eid, forwarder);
+			selectSession(command.sid, session, command.eid, 
+					session.getFirstForwarder());
 		}
 			break;
 			
@@ -610,21 +648,23 @@
 		return newid+smList.sessionManagerID()*MAXID;
 	}
 
-	private int getSessionID(int id) {
-		return id%MAXID;
-	}
 	
 	private int getSMID(int id) {
 		return id/MAXID;
 	}
 
 
+	/**
+	 * Register Editor to our editorList. No connection is made.
+	 * @param forwarder     Editor to be add
+	 * @param command
+	 */
 	private void registEditor(Forwarder forwarder,REPCommand command) {
 		// make ack for PUT/JOIN. Do not send this to the editor,
 		// before select. After select, ack is sent to the editor. 
 		routingTable.add(forwarder,getSMID(command.eid),command.sid);
 		Editor editor;
-		if (getSessionID(command.sid)==smList.sessionManagerID()
+		if (getSMID(command.sid)==smList.sessionManagerID()
 				&& forwarder.isDirect()) {
 			// direct link だった
 			editor = (Editor)forwarder;