view rep/handler/Dispatcher.java @ 382:4b87f89b3afd

REP Session Manager (Java version) new structure
author one@firefly.cr.ie.u-ryukyu.ac.jp
date Mon, 10 Nov 2008 22:07:45 +0900
parents
children bcdf5476b8e4
line wrap: on
line source

package rep.handler;

import java.io.IOException;

import rep.REPCommand;
import rep.Session;
import rep.SessionManager;
import rep.channel.REPSelectionKey;
import rep.channel.REPSocketChannel;

/**
 * @author kono
 *    Handle SessionManager incoming Channel
 *    SessionManager Command and Multiplexed Editor Command come here.
 *    Dispatch Editor command according to the session and the channel.
 */
public class Dispatcher extends Forwarder {

	public Dispatcher(SessionManager manager) {
		super(manager);
	}

	public void setQuit2(REPCommand cmd) {
		send(cmd);
	}

	public boolean manage(REPCommand command) {
		next.send(command);
		return true;
	}

	public String toString(){
		return ("Dispatcher:" + channel);
	}
	

	public void handle(REPSelectionKey<REPCommand> key) throws IOException {
		/*
		 * SessionManagerから来たコマンドは、Editor関係のコマンドは、
		 * sessionとeidを判定して、そのeditorにforwardしてやれば良い。
		 * 残りは、manager.manage() で処理する。
		 */
		REPSocketChannel<REPCommand> channel = key.channel1();
		REPCommand command = channel.read();
		SessionManager.logger.writeLog("REPHandlerImpl.handle() : command = " + command);
		if (manager.sessionManage(this, command)) return;
		
		distpatchToEditor(channel, command);
	}

	private void distpatchToEditor(REPSocketChannel<REPCommand> channel,
			REPCommand command) throws IOException {
		Session s = manager.getSession(command.sid);
		if (s==null) throw new IOException();
		REPNode f = s.getForwarder(channel);
		if (f==null) throw new IOException();
		if (!f.isDirect()) {
			// another forwarder, pass it to the next session manager
			f.send(command); 
			return;
		}
		/*
		 * local editor case. 
		 */
		Editor editor = (Editor)f;
		editor.forwardedCommandManage(command, this);
	}


	public void setNext(REPNode f) {
		next = f;
	}

	public boolean isMerging() {
		return false;
	}
}