view rep/FirstConnector.java @ 355:98607350f7d1

*** empty log message ***
author kono
date Fri, 17 Oct 2008 22:11:34 +0900
parents
children 034acadc0cdc
line wrap: on
line source

package rep;

import java.io.IOException;

import rep.channel.REPSelectionKey;
import rep.channel.REPSocketChannel;

public class FirstConnector extends Forwarder {

	public FirstConnector(SessionManager manager) {
		super(manager);
	}
	
	public void cancel(REPSocketChannel<REPCommand> socketChannel) {
		manager.remove(socketChannel);
	}

	public void handle(REPSelectionKey<REPCommand> key) throws Exception {
		/*
		 * 接続要求は、EditorかSlave Editorで、
		 *    join, put, sm_join
		 * が来る。それ以外はエラー。master もありか?
		 *      sm_join_ack
		 */
		Forwarder fw;
		REPSocketChannel<REPCommand> channel = key.channel1();
		REPCommand command = channel.read();
		SessionManager.logger.writeLog("FirstConnector: command = " + command);
		switch(command.cmd) {
		case SMCMD_JOIN: 
		{
			//どのSessionにも属さないエディタをリストに追加
			//エディタとchannelは1対1 (ではない)
			//エディタが新しくputする場合は新しくソケットを作る
			//   1対1でない場合は、multiplexerを挿めば良い
			// ここのeditorList はsessionのとは別物
			Editor editor = new Editor(manager,-1,channel);
			editor.setHost(manager.myHost);
			manager.editorList.add(editor);
			fw = editor;
			break;
		}
		case SMCMD_PUT:
		{
			// put の場合でも、eid は、masterまで聞きにいく必要が
			// ある。
			Editor editor = new Editor(manager,0,channel);
			editor.setHost(manager.myHost);
			manager.editorList.add(editor);
			fw = editor;
			break;
		}
		case SMCMD_SM_JOIN:
		{
			fw = new Forwarder(manager);
			manager.smList.addWaitingSessionManager(fw, command);
			break;
		}
		case SMCMD_SM_JOIN_ACK:
			manager.setSessionManagerID(command.sid);
			fw = new Forwarder(manager);
			break;
		default: throw new IOException();
		}
		//myHost を設定。
		//立ち上げ時にやるとlocalhostしか取れない
		if(manager.myHost == null) manager.setMyHostName(getLocalHostName());

		fw.setMode(command.cmd);
		manager.registerChannel(channel, fw);
		manager.sessionManage(fw, command);
	
	}

}