changeset 213:4d9b32666ed2

*** empty log message ***
author pin
date Sat, 30 Aug 2008 17:56:06 +0900
parents e8f716498caf
children ed43dc6ccb07
files rep/Editor.java rep/REPActionListener.java rep/RPanel.java rep/SessionManager.java rep/handler/REPHandler.java rep/handler/REPHandlerDoWaiting.java rep/handler/REPHandlerImpl.java rep/handler/REPHandlerInMerge.java rep/translater/Translater.java rep/translater/TranslaterImp1.java test/sematest/TestSessionManager.java
diffstat 11 files changed, 46 insertions(+), 38 deletions(-) [+]
line wrap: on
line diff
--- a/rep/Editor.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/Editor.java	Sat Aug 30 17:56:06 2008 +0900
@@ -1,5 +1,6 @@
 package rep;
 
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -13,6 +14,7 @@
 	private String file;
 	private TranslaterImp1 translater;
 	private List<REPCommand> sentList;
+	private List<REPCommand> sentMergedList;
 	
 	public Editor(){
 		setHostAndPort(myChannel);
@@ -41,7 +43,10 @@
 			if(checkReturnedCommand(command)){
 				//エディタからのコマンドが元のエディタに戻ってきた
 				//マージして送信
-				REPCommand[] cmds = translater.catchOwnCommand(command);
+				ArrayList<REPCommand> cmds = translater.catchOwnCommand(command);
+				//optimizer
+				//マージ中のエディタからの割り込み検知に使う
+				sentMergedList.addAll(cmds);
 				sendMergedCommand(cmds);
 				return null;
 			}else{
@@ -55,6 +60,7 @@
 			if(translater.checkMergeConflict(command)){
 				//マージ中にエディタからの割り込みがあった場合
 				LinkedList<REPCommand> mergeAgainList = translater.getMergeAgain();
+				//optimizer
 				for(REPCommand againCommand: mergeAgainList){
 					myChannel.write(againCommand);
 				}
@@ -69,9 +75,8 @@
 		return list;
 	}
 	
-	private void sendMergedCommand(REPCommand[] cmds) {
-		for(int i = 0; i < cmds.length; i++){
-			REPCommand mergeCommand = cmds[i];
+	private void sendMergedCommand(ArrayList<REPCommand> cmds) {
+		for(REPCommand mergeCommand : cmds){
 			mergeCommand.setEID(REP.MERGE_EID);
 			myChannel.write(mergeCommand);
 		}
--- a/rep/REPActionListener.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/REPActionListener.java	Sat Aug 30 17:56:06 2008 +0900
@@ -4,6 +4,6 @@
 
 public interface REPActionListener<P> {
 	
-	public void ActionOccured(REPActionEvent<P> event);
+	public void selectOccured(REPActionEvent<P> event);
 
 }
--- a/rep/RPanel.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/RPanel.java	Sat Aug 30 17:56:06 2008 +0900
@@ -108,7 +108,7 @@
 			actionListener.ActionOccured(new REPActionEvent((EditorPlus) comboEditor.getSelectedItem(),
 					(SessionPlus)comboSession.getSelectedItem()));
 			*/
-			actionListener.ActionOccured(new REPActionEvent<REPCommand>((EditorPlus<REPCommand>) e_list.get(editor_table.getSelectedRow()),
+			actionListener.selectOccured(new REPActionEvent<REPCommand>((EditorPlus<REPCommand>) e_list.get(editor_table.getSelectedRow()),
 					(SessionPlus)s_list.get(session_table.getSelectedRow()), listener));
 		}
 	}
--- a/rep/SessionManager.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/SessionManager.java	Sat Aug 30 17:56:06 2008 +0900
@@ -95,7 +95,7 @@
 				}
 				continue;
 			}
-			System.out.println("selected number : " + selector.select());
+			selector.select();
 			select();
 		}
 	}
@@ -360,7 +360,8 @@
 		}
 			break;
 
-		default:
+		case REP.REPCMD_DELETE:
+		case REP.REPCMD_INSERT:
 		{
 			//sid から Session を取得
 			Session session = getSession(receivedCommand.sid);
@@ -380,6 +381,11 @@
 			}
 		}
 		break;
+		
+		default:
+			assert(false);
+			break;
+			
 		}
 	}
 
@@ -530,19 +536,20 @@
 		selector.wakeup();
 	}
 
-	public void ActionOccured(REPActionEvent event) {
-		//selectSession(event);
+	public void selectOccured(REPActionEvent event) {
 		try {
 			waitingQueue.put(event);
 		} catch (InterruptedException e) {
 			e.printStackTrace();
 		}
+		selector.wakeup();
 	}
 
 	public void selectSession(REPActionEvent event) {
 		REPSocketChannel<REPCommand> channel = event.getEditorChannel();
 		int sid = event.getSID();
 		Session session = getSession(sid);
+		selector.wakeup();
 		if(session.hasOwner()){
 			Editor editor = new Editor(channel);
 			session.addEditor(new Editor(channel));
--- a/rep/handler/REPHandler.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/handler/REPHandler.java	Sat Aug 30 17:56:06 2008 +0900
@@ -3,7 +3,10 @@
 import java.io.IOException;
 import java.nio.channels.SelectionKey;
 
+import rep.REPCommand;
+import rep.channel.REPSelectionKey;
+
 public interface REPHandler {
-	void handle(SelectionKey key)throws IOException;
+	void handle(REPSelectionKey<REPCommand> key)throws IOException;
 
 }
--- a/rep/handler/REPHandlerDoWaiting.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/handler/REPHandlerDoWaiting.java	Sat Aug 30 17:56:06 2008 +0900
@@ -1,24 +1,16 @@
 package rep.handler;
 
-import java.nio.channels.SelectionKey;
-
+import java.io.IOException;
+import rep.REPCommand;
 import rep.SessionManager;
-import rep.channel.SelectionKeySimulator;
+import rep.channel.REPSelectionKey;
 
 public class REPHandlerDoWaiting implements REPHandler {
 	
-	private SessionManager manager;
-
 	public REPHandlerDoWaiting(SessionManager manager) {
-		this.manager = manager;
 	}
 
-	public void handle(SelectionKeySimulator key) {
-		//session.doWaiting();
-	}
-
-	public void handle(SelectionKey key) {
-		// TODO Auto-generated method stub
+	public void handle(REPSelectionKey<REPCommand> key) throws IOException {
 		
 	}
 
--- a/rep/handler/REPHandlerImpl.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/handler/REPHandlerImpl.java	Sat Aug 30 17:56:06 2008 +0900
@@ -1,10 +1,10 @@
 package rep.handler;
 
 import java.io.IOException;
-import java.nio.channels.SelectionKey;
-
 import rep.REPCommand;
+import rep.REPCommandPacker;
 import rep.SessionManager;
+import rep.channel.REPSelectionKey;
 import rep.channel.REPSocketChannel;
 
 public class REPHandlerImpl implements REPHandler {
@@ -17,8 +17,8 @@
 	}
 
 	@SuppressWarnings("unchecked")
-	public void handle(SelectionKey key) throws IOException {
-		REPSocketChannel<REPCommand> channel = (REPSocketChannel<REPCommand>) key.channel();
+	public void handle(REPSelectionKey<REPCommand> key) throws IOException {
+		REPSocketChannel<REPCommand> channel = (REPSocketChannel<REPCommand>) key.accept(new REPCommandPacker());
 		REPCommand command = channel.read();
 
 		manager.manage(channel, command);
--- a/rep/handler/REPHandlerInMerge.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/handler/REPHandlerInMerge.java	Sat Aug 30 17:56:06 2008 +0900
@@ -5,8 +5,10 @@
 
 import rep.Editor;
 import rep.REPCommand;
+import rep.REPCommandPacker;
 import rep.SessionManager;
 import rep.channel.ChannelSimulator;
+import rep.channel.REPSelectionKey;
 import rep.channel.REPSocketChannel;
 import rep.channel.SelectionKeySimulator;
 
@@ -24,9 +26,9 @@
 		this.sid = sid;
 	}
 
-	public void handle(SelectionKey key) {
+	public void handle(REPSelectionKey<REPCommand> key) throws IOException {
 		//マージ中のエディタの前のエディタのコマンドをWaitingListに追加する
-		REPSocketChannel<REPCommand> channel = (REPSocketChannel<REPCommand>) key.channel();
+		REPSocketChannel<REPCommand> channel = (REPSocketChannel<REPCommand>) key.accept(new REPCommandPacker());
 		REPCommand command = null;
 		
 		try {
--- a/rep/translater/Translater.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/translater/Translater.java	Sat Aug 30 17:56:06 2008 +0900
@@ -1,5 +1,7 @@
 package rep.translater;
 
+import java.util.ArrayList;
+
 import rep.REPCommand;
 
 public interface Translater {
@@ -16,7 +18,7 @@
 	 * but in this case, you can use also transReceiveCmd()
 	 * @param command which the editor sent.
 	 */
-	abstract public REPCommand[] catchOwnCommand(REPCommand cmd);
+	abstract public ArrayList<REPCommand> catchOwnCommand(REPCommand cmd);
 	
 	/**
 	 * Translate Command cmd that was received from SeMa.
--- a/rep/translater/TranslaterImp1.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/rep/translater/TranslaterImp1.java	Sat Aug 30 17:56:06 2008 +0900
@@ -45,7 +45,7 @@
 		unMergedCmds.push(cmd);
 		
 		//マージ中にユーザから割り込みがあった場合
-		if(sentMergedList.size() > 0){
+		if(isMerging()){
 			mergeAgainList.add(cmd);
 		}
 		
@@ -55,7 +55,7 @@
 	 * Dequeue command cmd that was returned.
 	 * @param cmd
 	 */
-	synchronized public REPCommand[] catchOwnCommand(REPCommand cmd){
+	public ArrayList<REPCommand> catchOwnCommand(REPCommand cmd){
 		ArrayList<REPCommand> returnCmds = new ArrayList<REPCommand>();
 		ArrayList<REPCommand> cmds = new ArrayList<REPCommand>();
 		// ringである以上、戻ってきたコマンドは確実にキューsentCmdsの先頭にある事を期待している
@@ -80,10 +80,7 @@
 			unMergedCmds.push( cmds.get(i));
 		}
 		
-		//マージ中のエディタからの割り込み検知に使う
-		sentMergedList.addAll(returnCmds);
-		
-		return returnCmds.toArray(new REPCommand[0]);
+		return returnCmds;
 	}
 
 	private REPCommand createUndo(REPCommand cmd){
--- a/test/sematest/TestSessionManager.java	Sat Aug 30 15:49:42 2008 +0900
+++ b/test/sematest/TestSessionManager.java	Sat Aug 30 17:56:06 2008 +0900
@@ -19,7 +19,7 @@
 	}
 
 	public static void main(String[] args){
-		REPServerSocketChannel.isSimulation = true;
+		REPServerSocketChannel.isSimulation = false;
 		TestSessionManager test = new TestSessionManager(1, 0, 2);
 		logger.setLogLevel(5);
 		test.startTest();
@@ -27,7 +27,7 @@
 
 	private void startTest() {
 		String host = "localhost";
-		int masterPort = 11000;
+		int masterPort = 8766;
 		String[] strs ={String.valueOf(masterPort), String.valueOf(masterPort)};
 		
 		startSessionManager(strs);