view rep/Session.java @ 241:1e5bf172b4d6

*** empty log message ***
author kono
date Sun, 31 Aug 2008 20:41:34 +0900
parents cbd67817e9cd
children 9e36fd27e2b6
line wrap: on
line source

package rep;

import java.util.LinkedList;
import java.util.List;

import rep.channel.REPSocketChannel;

public class Session {
	private Editor masterEditor;
	private int sessionID;
	private String sessionName;
	private LinkedList<Editor> editorList = new LinkedList<Editor>();
	private LinkedList<REPNode> routingTable = new LinkedList<REPNode>();
	private boolean isOwner = false;
	
	public Session(int sid, String name, Editor editor) {
		this(sid, editor);
		sessionName = name;
	}
	public Session(Editor editor) {
		masterEditor = editor;
		this.sessionID = 0;
		this.sessionName = editor.getName();
	}

	public Session(int sid, Editor editor) {
		sessionID = sid;
		masterEditor = editor;
		editorList.add(editor);
	}
	public void addEditor(int editorID, REPSocketChannel<REPCommand> channel) {
		editorList.add(new Editor(editorID, channel));
	}
	public LinkedList<Editor> getEditorList() {
		if(editorList == null) System.out.println("null!");  
		return editorList;
	}
	public String toString(){
		return sessionName;
	}
	public int getSID() {
		return sessionID;
	}
	public Editor getOwner() {
		return masterEditor;
	}
	public String getName() {
		return sessionName;
	}
	public void addEditor(Editor editor) {
		int eid = editorList.size();
		editor.setEID(eid);
		editorList.add(editor);
	}
	public void setSID(int sid) {
		sessionID = sid;
	}
	public void addToRoutingTable(Editor editor) {
		routingTable.add(new REPNode(editor));
	}
	public boolean hasOwner() {
		return isOwner;
	}
	public void hasOwner(boolean b) {
		isOwner = true;
	}
	public void sendToEditor(REPCommand repCmd) {
		for(Editor editor : editorList){
			editor.getChannel().write(repCmd);
		}
	}
	public Editor getEditor(REPSocketChannel<REPCommand> channel) {
		for(Editor editor : editorList){
			if(editor.getChannel() == channel) return editor;
		}
		return null;
	}
	public void translate(REPSocketChannel<REPCommand> channel, REPCommand command) {
		Editor editor = getEditor(channel);
		List<REPCommand> commandList = editor.translate(command);
		Editor nextEditor = getNextEditor(editor);
		
		for(REPCommand cmd: commandList){
			nextEditor.send(cmd);
		}
	}
	private Editor getNextEditor(Editor editor) {
		int eid = editor.getEID();
		int neid = (eid+1)%editorList.size();
		Editor nextEditor = editorList.get(neid);
		return nextEditor;
	}
	public Editor getPrevEditor(Editor editor) {
		int eid = editor.getEID();
		int peid = (eid + editorList.size() - 1)%editorList.size();
		Editor prevEditor = editorList.get(peid);
		return prevEditor;		
	}
}