view rep/Session.java @ 300:8f6b7a1890b2

*** empty log message ***
author kono
date Wed, 01 Oct 2008 16:20:04 +0900
parents c3969dd625b2
children 20fb70068089
line wrap: on
line source

package rep;

import java.util.Iterator;
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 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);
		editor.setSID(sessionID);
		editorList.add(editor);
	}
	
	public boolean deleteEditor(REPSocketChannel<REPCommand> channel) {
		boolean flag = false;

	    for (Iterator<Editor> it = editorList.iterator();it.hasNext(); ) {
	        Editor e = it.next();
			if (e.getChannel()==channel) {
				it.remove(); // to avoid concurrent modification
				flag = true;
			}
		}
		return flag;
	}
	
	public void setSID(int sid) {
		sessionID = sid;
	}
	
	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;		
	}
	public void closeSession() {
		REPCommand command = new REPCommand();
		command.setCMD(REP.REPCMD_CLOSE);
		for(Editor editor : editorList){
			command.setEID(editor.getEID());
			editor.send(command);
		}
	}
	public void sendToNextEditor(REPSocketChannel<REPCommand>channel,REPCommand command) {
		Editor next = getNextEditor(getEditor(channel));
		next.send(command);
	}
}