[RJ-Server] Improve RJ-Com
diff --git a/core/org.eclipse.statet.rj.client/src/org/eclipse/statet/rj/server/client/AbstractRJComClient.java b/core/org.eclipse.statet.rj.client/src/org/eclipse/statet/rj/server/client/AbstractRJComClient.java
index 0c517bf..09916c8 100644
--- a/core/org.eclipse.statet.rj.client/src/org/eclipse/statet/rj/server/client/AbstractRJComClient.java
+++ b/core/org.eclipse.statet.rj.client/src/org/eclipse/statet/rj/server/client/AbstractRJComClient.java
@@ -946,7 +946,8 @@
 								sendItem= this.consoleReadCallback;
 							}
 						default:
-							while ((sendItem= getC2SCmds()) == null
+							while (!this.closed
+									&& (sendItem= getC2SCmds()) == null
 									&& (loopReadCallbackIgnore || this.consoleReadCallback != null)
 									&& (this.dataLevelRequest <= loopDataLevelIgnore
 											|| this.dataLevelRequest == this.dataLevelAnswer
diff --git a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/DataCmdItem.java b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/DataCmdItem.java
index 6a9ac28..7ece4a5 100644
--- a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/DataCmdItem.java
+++ b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/DataCmdItem.java
@@ -50,9 +50,9 @@
 		private final boolean reqRData;
 		private final boolean reqTargetExpr;
 		
-		private Operation(final String name, final int op,
+		private Operation(final int op, final String name,
 				final byte source, final byte target, final boolean returnData) {
-			this.op= (byte) op;
+			this.op= (byte)op;
 			this.name= name;
 			this.source= source;
 			this.target= target;
@@ -72,33 +72,40 @@
 	}
 	
 	
-	public static final Operation EVAL_EXPR_VOID= new Operation("EVAL_EXPR_VOID", 1, //$NON-NLS-1$
-			Operation.EXPR, Operation.NONE, false);
-	public static final Operation EVAL_FCALL_VOID= new Operation("EVAL_FCALL_VOID", 2, //$NON-NLS-1$
-			Operation.FCALL, Operation.NONE, false);
+	public static final byte EVAL_EXPR_VOID_OP=             0x01;
+	public static final Operation EVAL_EXPR_VOID=           new Operation(EVAL_EXPR_VOID_OP, "EVAL_EXPR_VOID", //$NON-NLS-1$
+			Operation.EXPR, Operation.NONE, false );
+	public static final byte EVAL_FCALL_VOID_OP=            0x02;
+	public static final Operation EVAL_FCALL_VOID=          new Operation(EVAL_FCALL_VOID_OP, "EVAL_FCALL_VOID", //$NON-NLS-1$
+			Operation.FCALL, Operation.NONE, false );
 	
-	public static final Operation EVAL_EXPR_DATA= new Operation("EVAL_EXPR_DATA", 3, //$NON-NLS-1$
-			Operation.EXPR, Operation.NONE, true);
-	public static final Operation EVAL_FCALL_DATA= new Operation("EVAL_FCALL_DATA", 4, //$NON-NLS-1$
-			Operation.FCALL, Operation.NONE, true);
-	public static final Operation RESOLVE_DATA= new Operation("RESOLVE_DATA", 5, // EVAL_REF_DATA //$NON-NLS-1$
-			Operation.POINTER, Operation.NONE, true);
+	public static final byte EVAL_EXPR_DATA_OP=             0x03;
+	public static final Operation EVAL_EXPR_DATA=           new Operation(EVAL_EXPR_DATA_OP, "EVAL_EXPR_DATA", //$NON-NLS-1$
+			Operation.EXPR, Operation.NONE, true );
+	public static final byte EVAL_FCALL_DATA_OP=            0x04;
+	public static final Operation EVAL_FCALL_DATA=          new Operation(EVAL_FCALL_DATA_OP, "EVAL_FCALL_DATA", //$NON-NLS-1$
+			Operation.FCALL, Operation.NONE, true );
+	public static final byte RESOLVE_DATA_OP=               0x05;
+	public static final Operation RESOLVE_DATA=             new Operation(RESOLVE_DATA_OP, "RESOLVE_DATA", // EVAL_REF_DATA //$NON-NLS-1$
+			Operation.POINTER, Operation.NONE, true );
 	
-	public static final Operation ASSIGN_DATA= new Operation("ASSIGN_DATA", 6, //$NON-NLS-1$
-			Operation.RDATA, Operation.EXPR, false);
-	public static final Operation ASSIGN_FCALL= new Operation("ASSIGN_FCALL", 7, //$NON-NLS-1$
-			Operation.FCALL, Operation.EXPR, false);
+	public static final byte ASSIGN_DATA_OP=                0x06;
+	public static final Operation ASSIGN_DATA=              new Operation(ASSIGN_DATA_OP, "ASSIGN_DATA", //$NON-NLS-1$
+			Operation.RDATA, Operation.EXPR, false );
+	public static final byte ASSIGN_FCALL_OP=               0x07;
+	public static final Operation ASSIGN_FCALL=             new Operation(ASSIGN_FCALL_OP, "ASSIGN_FCALL", //$NON-NLS-1$
+			Operation.FCALL, Operation.EXPR, false );
 	
-	public static final int FIND_DATA_OP= 8;
-	public static final Operation FIND_DATA= new Operation("FIND_DATA", FIND_DATA_OP, //$NON-NLS-1$
-			Operation.EXPR, Operation.NONE, true);
+	public static final byte FIND_DATA_OP=                  0x08;
+	public static final Operation FIND_DATA=                new Operation(FIND_DATA_OP, "FIND_DATA", //$NON-NLS-1$
+			Operation.EXPR, Operation.NONE, true );
 	
-	public static final int EVAL_NAMESPACE_DATA_OP= 9;
-	public static final Operation EVAL_NAMESPACE_DATA= new Operation("EVAL_NAMESPACE_DATA", EVAL_NAMESPACE_DATA_OP, //$NON-NLS-1$
-			Operation.EXPR, Operation.NONE, true);
-	public static final int EVAL_NAMESPACE_EXPORTS_DATA_OP= 10;
-	public static final Operation EVAL_NAMESPACE_EXPORTS_DATA= new Operation("EVAL_NAMESPACE_EXPORTS_DATA", EVAL_NAMESPACE_EXPORTS_DATA_OP, //$NON-NLS-1$
-			Operation.EXPR, Operation.NONE, true);
+	public static final byte EVAL_NAMESPACE_DATA_OP=        0x09;
+	public static final Operation EVAL_NAMESPACE_DATA=      new Operation(EVAL_NAMESPACE_DATA_OP, "EVAL_NAMESPACE_DATA", //$NON-NLS-1$
+			Operation.EXPR, Operation.NONE, true );
+	public static final byte EVAL_NAMESPACE_EXPORTS_DATA_OP= 0x0A;
+	public static final Operation EVAL_NAMESPACE_EXPORTS_DATA= new Operation(EVAL_NAMESPACE_EXPORTS_DATA_OP, "EVAL_NAMESPACE_EXPORTS_DATA", //$NON-NLS-1$
+			Operation.EXPR, Operation.NONE, true );
 	
 	
 	private static final Operation[] OPERATIONS= new Operation[11];
@@ -395,37 +402,37 @@
 	
 	@Override
 	public boolean testEquals(final MainCmdItem other) {
-		if (!(other instanceof DataCmdItem)) {
-			return false;
+		if (other instanceof DataCmdItem) {
+			final DataCmdItem otherItem= (DataCmdItem) other;
+			if (getOp() != otherItem.getOp()) {
+				return false;
+			}
+			if (this.options != otherItem.options) {
+				return false;
+			}
+			if (!((this.sourceExpr != null) ?
+					this.sourceExpr.equals(otherItem.sourceExpr) :
+					null == otherItem.sourceExpr )) {
+				return false;
+			}
+			if (!((this.rdata != null) ?
+					this.rdata.equals(otherItem.rdata) :
+					null == otherItem.rdata )) {
+				return false;
+			}
+			if (!((this.targetExpr != null) ?
+					this.targetExpr.equals(otherItem.targetExpr) :
+					null == otherItem.targetExpr )) {
+				return false;
+			}
+			if (!((this.rho != null) ?
+					this.rho.equals(otherItem.rho) :
+					null == otherItem.rho )) {
+				return false;
+			}
+			return true;
 		}
-		final DataCmdItem otherItem= (DataCmdItem) other;
-		if (getOp() != otherItem.getOp()) {
-			return false;
-		}
-		if (this.options != otherItem.options) {
-			return false;
-		}
-		if (!((this.sourceExpr != null) ?
-				this.sourceExpr.equals(otherItem.sourceExpr) :
-				null == otherItem.sourceExpr )) {
-			return false;
-		}
-		if (!((this.rdata != null) ?
-				this.rdata.equals(otherItem.rdata) :
-				null == otherItem.rdata )) {
-			return false;
-		}
-		if (!((this.targetExpr != null) ?
-				this.targetExpr.equals(otherItem.targetExpr) :
-				null == otherItem.targetExpr )) {
-			return false;
-		}
-		if (!((this.rho != null) ?
-				this.rho.equals(otherItem.rho) :
-				null == otherItem.rho )) {
-			return false;
-		}
-		return true;
+		return false;
 	}
 	
 	@Override
diff --git a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/DbgCmdItem.java b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/DbgCmdItem.java
index 387ef34..4b02742 100644
--- a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/DbgCmdItem.java
+++ b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/DbgCmdItem.java
@@ -62,8 +62,10 @@
 	public static final byte OP_RESET_FILTER_STATE=         0032;
 	public static final byte OP_UPDATE_TP_STATES=           0034;
 	
+	// --
 	public static final byte OP_C2S_S2C=                    0040;
 	
+	// -- S2C sync
 	public static final byte OP_NOTIFY_TP_EVENTS=           0x41;
 	
 	
diff --git a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdC2SList.java b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdC2SList.java
index 3c45eb0..51eb004 100644
--- a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdC2SList.java
+++ b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdC2SList.java
@@ -19,18 +19,22 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
 /**
  * Client-to-Server list with {@link MainCmdItem}s.
  */
+@NonNullByDefault
 public final class MainCmdC2SList implements RjsComObject, Externalizable {
 	
 	
-	private final RJIO privateIO;
+	private final @Nullable RJIO privateIO;
 	
-	private MainCmdItem first;
+	private @Nullable MainCmdItem first;
 	
 	
 	public MainCmdC2SList(final RJIO io) {
@@ -73,88 +77,59 @@
 	@Override
 	public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
 		final RJIO io= RJIO.get(in);
-		final int check= io.readCheck1();
-		
-		{	// first
-			final byte type= in.readByte();
-			switch (type) {
-			case MainCmdItem.T_NONE:
-				this.first= null;
-				io.readCheck2(check);
-				io.disconnect(in);
-				return;
-			case MainCmdItem.T_CONSOLE_READ_ITEM:
-				this.first= new ConsoleReadCmdItem(io);
-				break;
-			case MainCmdItem.T_CONSOLE_WRITE_ITEM:
-				this.first= new ConsoleWriteCmdItem(io);
-				break;
-			case MainCmdItem.T_MESSAGE_ITEM:
-				this.first= new ConsoleMessageCmdItem(io);
-				break;
-			case MainCmdItem.T_EXT_CLIENT_ITEM:
-				this.first= new ExtClientCmdItem(io);
-				break;
-			case MainCmdItem.T_GRAPH_ITEM:
-				this.first= new GDCmdItem.Answer(io);
-				break;
-			case MainCmdItem.T_MAIN_CTRL_ITEM:
-				this.first= new MainCtrlCmdItem(io);
-				break;
-			case MainCmdItem.T_DATA_ITEM:
-				this.first= new DataCmdItem(io);
-				break;
-			case MainCmdItem.T_GRAPHICS_OP_ITEM:
-				this.first= new GraOpCmdItem(io);
-				break;
-			case MainCmdItem.T_DBG_ITEM:
-				this.first= new DbgCmdItem(io);
-				break;
-			default:
-				io.disconnect(in);
-				throw new ClassNotFoundException("Unknown cmdtype id: "+type);
+		try {
+			final int check= io.readCheck1();
+			
+			MainCmdItem item;
+			{	// first
+				final byte cmdType= in.readByte();
+				if (cmdType == MainCmdItem.T_NONE) {
+					this.first= null;
+					io.readCheck2(check);
+					return;
+				}
+				else {
+					this.first= item= readItem(cmdType, io);
+				}
+			}
+			while (true) {
+				final byte cmdType= in.readByte();
+				if (cmdType == MainCmdItem.T_NONE) {
+					io.readCheck2(check);
+					return;
+				}
+				else {
+					item= item.next= readItem(cmdType, io);
+				}
 			}
 		}
-		
-		MainCmdItem item= this.first;
-		while (true) {
-			final byte type= in.readByte();
-			switch (type) {
-			case MainCmdItem.T_NONE:
-				io.readCheck2(check);
-				io.disconnect(in);
-				return;
-			case MainCmdItem.T_CONSOLE_READ_ITEM:
-				item= item.next= new ConsoleReadCmdItem(io);
-				continue;
-			case MainCmdItem.T_CONSOLE_WRITE_ITEM:
-				item= item.next= new ConsoleWriteCmdItem(io);
-				continue;
-			case MainCmdItem.T_MESSAGE_ITEM:
-				item= item.next= new ConsoleMessageCmdItem(io);
-				continue;
-			case MainCmdItem.T_EXT_CLIENT_ITEM:
-				item= item.next= new ExtClientCmdItem(io);
-				continue;
-			case MainCmdItem.T_GRAPH_ITEM:
-				item= item.next= new GDCmdItem.Answer(io);
-				continue;
-			case MainCmdItem.T_MAIN_CTRL_ITEM:
-				this.first= new MainCtrlCmdItem(io);
-				break;
-			case MainCmdItem.T_DATA_ITEM:
-				item= item.next= new DataCmdItem(io);
-				continue;
-			case MainCmdItem.T_GRAPHICS_OP_ITEM:
-				item= item.next= new GraOpCmdItem(io);
-				continue;
-			case MainCmdItem.T_DBG_ITEM:
-				item= item.next= new DbgCmdItem(io);
-				continue;
-			default:
-				io.disconnect(in);
-				throw new ClassNotFoundException("Unknown cmdtype id: "+type);
-			}
+		finally {
+			io.disconnect(in);
+		}
+	}
+	
+	private MainCmdItem readItem(final byte cmdType, final RJIO io) throws IOException, ClassNotFoundException {
+		switch (cmdType) {
+		case MainCmdItem.T_CONSOLE_READ_ITEM:
+			return new ConsoleReadCmdItem(io);
+		case MainCmdItem.T_CONSOLE_WRITE_ITEM:
+			return new ConsoleWriteCmdItem(io);
+		case MainCmdItem.T_MESSAGE_ITEM:
+			return new ConsoleMessageCmdItem(io);
+		case MainCmdItem.T_EXT_CLIENT_ITEM:
+			return new ExtClientCmdItem(io);
+		case MainCmdItem.T_GRAPH_ITEM:
+			return new GDCmdItem.Answer(io);
+		case MainCmdItem.T_MAIN_CTRL_ITEM:
+			return new MainCtrlCmdItem(io);
+		case MainCmdItem.T_DATA_ITEM:
+			return new DataCmdItem(io);
+		case MainCmdItem.T_GRAPHICS_OP_ITEM:
+			return new GraOpCmdItem(io);
+		case MainCmdItem.T_DBG_ITEM:
+			return new DbgCmdItem(io);
+		default:
+			throw new ClassNotFoundException("Unknown cmdtype id: " + cmdType);
 		}
 	}
 	
@@ -173,7 +148,7 @@
 		return RjsComObject.T_MAIN_LIST;
 	}
 	
-	public MainCmdItem getItems() {
+	public @Nullable MainCmdItem getItems() {
 		return this.first;
 	}
 	
diff --git a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdItem.java b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdItem.java
index f9a8c65..34dc8e0 100644
--- a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdItem.java
+++ b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdItem.java
@@ -28,28 +28,28 @@
 	/**
 	 * {@link ConsoleReadCmdItem}
 	 */
-	public static final byte T_CONSOLE_READ_ITEM=          0x01;
+	public static final byte T_CONSOLE_READ_ITEM=           0x01;
 	
 	/**
 	 * {@link ConsoleWriteCmdItem}
 	 */
-	public static final byte T_CONSOLE_WRITE_ITEM=         0x02;
+	public static final byte T_CONSOLE_WRITE_ITEM=          0x02;
 	
 	
 	/**
 	 * {@link ConsoleMessageCmdItem}
 	 */
-	public static final byte T_MESSAGE_ITEM=               0x04;
+	public static final byte T_MESSAGE_ITEM=                0x04;
 	
 	/**
 	 * {@link ExtClientCmdItem}
 	 */
-	public static final byte T_EXT_CLIENT_ITEM=            0x05;
+	public static final byte T_EXT_CLIENT_ITEM=             0x05;
 	
 	/**
 	 * {@link GDCmdItem}
 	 */
-	public static final byte T_GRAPH_ITEM=                 0x07;
+	public static final byte T_GRAPH_ITEM=                  0x07;
 	
 	/**
 	 * T_id <  => initiated by server
@@ -65,23 +65,23 @@
 	/**
 	 * {@link DataCmdItem}
 	 */
-	public static final byte T_DATA_ITEM=                  0x11;
+	public static final byte T_DATA_ITEM=                   0x11;
 	
 	/**
 	 * {@link GraOpCmdItem}
 	 */
-	public static final byte T_GRAPHICS_OP_ITEM=           0x12;
+	public static final byte T_GRAPHICS_OP_ITEM=            0x12;
 	
 	/**
 	 * {@link DbgCmdItem}
 	 */
-	public static final byte T_DBG_ITEM=                   0x14;
+	public static final byte T_DBG_ITEM=                    0x14;
 	
 	
 	/**
 	 * Inside server only
 	 */
-	public static final byte T_SRV_ITEM=                   0x20;
+	public static final byte T_SRV_ITEM=                    0x20;
 	
 	
 	protected static final int OM_STATUS=                  0x00f00000; // 0xf << OS_STATUS
diff --git a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdS2CList.java b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdS2CList.java
index 30f68cb..12e6b5c 100644
--- a/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdS2CList.java
+++ b/core/org.eclipse.statet.rj.server/src/org/eclipse/statet/rj/server/MainCmdS2CList.java
@@ -19,12 +19,16 @@
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
 
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
 import org.eclipse.statet.rj.data.RJIO;
 
 
 /**
  * Server-to-Client list with {@link MainCmdItem}s.
  */
+@NonNullByDefault
 public final class MainCmdS2CList implements RjsComObject, Externalizable {
 	
 	
@@ -35,7 +39,7 @@
 	
 	private boolean isBusy;
 	
-	private MainCmdItem first;
+	private @Nullable MainCmdItem first;
 	
 	
 	public MainCmdS2CList(final MainCmdItem first, final boolean isBusy) {
@@ -84,81 +88,57 @@
 		this.isBusy= in.readBoolean();
 		
 		final RJIO io= RJIO.get(in);
-		final int check= io.readCheck1();
-		
-		{	// first
-			final byte type= in.readByte();
-			switch (type) {
-			case MainCmdItem.T_NONE:
-				this.first= null;
-				io.readCheck2(check);
-				io.disconnect(in);
-				return;
-			case MainCmdItem.T_CONSOLE_READ_ITEM:
-				this.first= new ConsoleReadCmdItem(io);
-				break;
-			case MainCmdItem.T_CONSOLE_WRITE_ITEM:
-				this.first= new ConsoleWriteCmdItem(io);
-				break;
-			case MainCmdItem.T_MESSAGE_ITEM:
-				this.first= new ConsoleMessageCmdItem(io);
-				break;
-			case MainCmdItem.T_EXT_CLIENT_ITEM:
-				this.first= new ExtClientCmdItem(io);
-				break;
-			case MainCmdItem.T_MAIN_CTRL_ITEM:
-				this.first= new MainCtrlCmdItem(io);
-				break;
-			case MainCmdItem.T_DATA_ITEM:
-				this.first= new DataCmdItem(io);
-				break;
-			case MainCmdItem.T_GRAPHICS_OP_ITEM:
-				this.first= new GraOpCmdItem(io);
-				break;
-			case MainCmdItem.T_DBG_ITEM:
-				this.first= new DbgCmdItem(io);
-				break;
-			default:
-				throw new ClassNotFoundException("Unknown cmdtype id: "+type);
+		try {
+			final int check= io.readCheck1();
+			
+			MainCmdItem item;
+			{	// first
+				final byte cmdType= in.readByte();
+				if (cmdType == MainCmdItem.T_NONE) {
+					this.first= null;
+					io.readCheck2(check);
+					return;
+				}
+				else {
+					this.first= item= readItem(cmdType, io);
+				}
+			}
+			while (true) {
+				final byte cmdType= in.readByte();
+				if (cmdType == MainCmdItem.T_NONE) {
+					io.readCheck2(check);
+					return;
+				}
+				else {
+					item= item.next= readItem(cmdType, io);
+				}
 			}
 		}
-		
-		MainCmdItem item= this.first;
-		while (true) {
-			final byte type= in.readByte();
-			switch (type) {
-			case MainCmdItem.T_NONE:
-				io.readCheck2(check);
-				io.disconnect(in);
-				return;
-			case MainCmdItem.T_CONSOLE_READ_ITEM:
-				item= item.next= new ConsoleReadCmdItem(io);
-				continue;
-			case MainCmdItem.T_CONSOLE_WRITE_ITEM:
-				item= item.next= new ConsoleWriteCmdItem(io);
-				continue;
-			case MainCmdItem.T_MESSAGE_ITEM:
-				item= item.next= new ConsoleMessageCmdItem(io);
-				continue;
-			case MainCmdItem.T_EXT_CLIENT_ITEM:
-				item= item.next= new ExtClientCmdItem(io);
-				continue;
-			case MainCmdItem.T_MAIN_CTRL_ITEM:
-				this.first= new MainCtrlCmdItem(io);
-				break;
-			case MainCmdItem.T_DATA_ITEM:
-				item= item.next= new DataCmdItem(io);
-				continue;
-			case MainCmdItem.T_GRAPHICS_OP_ITEM:
-				item= item.next= new GraOpCmdItem(io);
-				continue;
-			case MainCmdItem.T_DBG_ITEM:
-				item= item.next= new DbgCmdItem(io);
-				continue;
-			default:
-				io.disconnect(in);
-				throw new ClassNotFoundException("Unknown cmdtype id: "+type);
-			}
+		finally {
+			io.disconnect(in);
+		}
+	}
+	
+	private MainCmdItem readItem(final byte cmdType, final RJIO io) throws IOException, ClassNotFoundException {
+		switch (cmdType) {
+		case MainCmdItem.T_CONSOLE_READ_ITEM:
+			return new ConsoleReadCmdItem(io);
+		case MainCmdItem.T_CONSOLE_WRITE_ITEM:
+			return new ConsoleWriteCmdItem(io);
+		case MainCmdItem.T_MESSAGE_ITEM:
+			return new ConsoleMessageCmdItem(io);
+		case MainCmdItem.T_EXT_CLIENT_ITEM:
+			return new ExtClientCmdItem(io);
+		case MainCmdItem.T_MAIN_CTRL_ITEM:
+			return new MainCtrlCmdItem(io);
+		case MainCmdItem.T_DATA_ITEM:
+			return new DataCmdItem(io);
+		case MainCmdItem.T_GRAPHICS_OP_ITEM:
+			return new GraOpCmdItem(io);
+		case MainCmdItem.T_DBG_ITEM:
+			return new DbgCmdItem(io);
+		default:
+			throw new ClassNotFoundException("Unknown cmdtype id: " + cmdType);
 		}
 	}
 	
@@ -229,20 +209,22 @@
 		final StringBuilder sb= new StringBuilder(128);
 		sb.append("MainCmdS2CList (isBusy=");
 		sb.append(this.isBusy);
-		sb.append(')');
-		if (this.first != null) {
-			sb.append(':');
+		sb.append("):");
+		if (this.first == null) {
+			sb.append("\n<ITEM />");
 		}
-		MainCmdItem item= this.first;
-		int i= 0;
-		while (item != null) {
-			sb.append("\n<ITEM i=\"");
-			sb.append(i);
-			sb.append("\">\n");
-			sb.append(item.toString());
-			sb.append("\n</ITEM>");
-			item= item.next;
-			i++;
+		else {
+			MainCmdItem item= this.first;
+			int i= 0;
+			while (item != null) {
+				sb.append("\n<ITEM i=\"");
+				sb.append(i);
+				sb.append("\">\n");
+				sb.append(item.toString());
+				sb.append("\n</ITEM>");
+				item= item.next;
+				i++;
+			}
 		}
 		return sb.toString();
 	}