/*******************************************************************************
 * Copyright (c) 2000, 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Keith Seitz - Bug 165988
 *******************************************************************************/
package org.eclipse.jdi.internal.spy;

import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.UTFDataFormatException;
import java.util.Arrays;

import com.ibm.icu.text.MessageFormat;

/**
 * The <code>VerbosePacketWriter</code> is responsible for writing out
 * JdwpPacket data in human readable form.
 */
public class VerbosePacketStream extends PrintStream {
	/** Tag Constants. */
	// public static final byte NULL_TAG = 91; // Used for tagged null values.
	public static final byte ARRAY_TAG = 91; // '[' - an array object (objectID
												// size).
	public static final byte BYTE_TAG = 66; // 'B' - a byte value (1 byte).
	public static final byte CHAR_TAG = 67; // 'C' - a character value (2
											// bytes).
	public static final byte OBJECT_TAG = 76; // 'L' - an object (objectID
												// size).
	public static final byte FLOAT_TAG = 70; // 'F' - a float value (4 bytes).
	public static final byte DOUBLE_TAG = 68; // 'D' - a double value (8 bytes).
	public static final byte INT_TAG = 73; // 'I' - an int value (4 bytes).
	public static final byte LONG_TAG = 74; // 'J' - a long value (8 bytes).
	public static final byte SHORT_TAG = 83; // 'S' - a short value (2 bytes).
	public static final byte VOID_TAG = 86; // 'V' - a void value (no bytes).
	public static final byte BOOLEAN_TAG = 90; // 'Z' - a boolean value (1
												// byte).
	public static final byte STRING_TAG = 115; // 's' - a String object
												// (objectID size).
	public static final byte THREAD_TAG = 116; // 't' - a Thread object
												// (objectID size).
	public static final byte THREAD_GROUP_TAG = 103; // 'g' - a ThreadGroup
														// object (objectID
														// size).
	public static final byte CLASS_LOADER_TAG = 108; // 'l' - a ClassLoader
														// object (objectID
														// size).
	public static final byte CLASS_OBJECT_TAG = 99; // 'c' - a class object
													// object (objectID size).

	/** TypeTag Constants. */
	public static final byte TYPE_TAG_CLASS = 1; // ReferenceType is a class.
	public static final byte TYPE_TAG_INTERFACE = 2; // ReferenceType is an
														// interface.
	public static final byte TYPE_TAG_ARRAY = 3; // ReferenceType is an array.

	/** ClassStatus Constants. */
	public static final int JDWP_CLASS_STATUS_VERIFIED = 1;
	public static final int JDWP_CLASS_STATUS_PREPARED = 2;
	public static final int JDWP_CLASS_STATUS_INITIALIZED = 4;
	public static final int JDWP_CLASS_STATUS_ERROR = 8;

	/** access_flags Constants */
	public static final int ACC_PUBLIC = 0x0001;
	public static final int ACC_PRIVATE = 0x0002;
	public static final int ACC_PROTECTED = 0x0004;
	public static final int ACC_STATIC = 0x0008;
	public static final int ACC_FINAL = 0x0010;
	public static final int ACC_SUPER = 0x0020;
	public static final int ACC_VOLATILE = 0x0040;
	public static final int ACC_TRANSIENT = 0x0080;
	public static final int ACC_NATIVE = 0x0100;
	public static final int ACC_INTERFACE = 0x0200;
	public static final int ACC_ABSTRACT = 0x0400;
	public static final int ACC_STRICT = 0x0800;
	public static final int ACC_ENUM = 0x0100;
	public static final int ACC_VARARGS = 0x0080;
	public static final int ACC_BRIDGE = 0x0040;
	public static final int ACC_SYNTHETIC = 0x1000;
	public static final int ACC_SYNCHRONIZED = 0x0020;

	public static final int ACC_EXT_SYNTHETIC = 0xf0000000;

	/** Invoke options constants */
	public static final int INVOKE_SINGLE_THREADED = 0x01;
	public static final int INVOKE_NONVIRTUAL = 0x02;

	/** ThreadStatus Constants */
	public static final int THREAD_STATUS_ZOMBIE = 0;
	public static final int THREAD_STATUS_RUNNING = 1;
	public static final int THREAD_STATUS_SLEEPING = 2;
	public static final int THREAD_STATUS_MONITOR = 3;
	public static final int THREAD_STATUS_WAIT = 4;

	/** EventKind Constants */
	public static final int EVENTKIND_SINGLE_STEP = 1;
	public static final int EVENTKIND_BREAKPOINT = 2;
	public static final int EVENTKIND_FRAME_POP = 3;
	public static final int EVENTKIND_EXCEPTION = 4;
	public static final int EVENTKIND_USER_DEFINED = 5;
	public static final int EVENTKIND_THREAD_START = 6;
	public static final int EVENTKIND_THREAD_END = 7;
	public static final int EVENTKIND_THREAD_DEATH = EVENTKIND_THREAD_END;
	public static final int EVENTKIND_CLASS_PREPARE = 8;
	public static final int EVENTKIND_CLASS_UNLOAD = 9;
	public static final int EVENTKIND_CLASS_LOAD = 10;
	public static final int EVENTKIND_FIELD_ACCESS = 20;
	public static final int EVENTKIND_FIELD_MODIFICATION = 21;
	public static final int EVENTKIND_EXCEPTION_CATCH = 30;
	public static final int EVENTKIND_METHOD_ENTRY = 40;
	public static final int EVENTKIND_METHOD_EXIT = 41;
	public static final int EVENTKIND_VM_INIT = 90;
	public static final int EVENTKIND_VM_START = EVENTKIND_VM_INIT;
	public static final int EVENTKIND_VM_DEATH = 99;
	public static final int EVENTKIND_VM_DISCONNECTED = 100;

	/** SuspendStatus Constants */
	public static final int SUSPEND_STATUS_SUSPENDED = 0x01;

	/** SuspendPolicy Constants */
	public static final int SUSPENDPOLICY_NONE = 0;
	public static final int SUSPENDPOLICY_EVENT_THREAD = 1;
	public static final int SUSPENDPOLICY_ALL = 2;

	/** StepDepth Constants */
	public static final int STEPDEPTH_INTO = 0;
	public static final int STEPDEPTH_OVER = 1;
	public static final int STEPDEPTH_OUT = 2;

	/** StepSize Constants */
	public static final int STEPSIZE_MIN = 0;
	public static final int STEPSIZE_LINE = 1;

	private static final byte[] padding;
	static {
		padding = new byte[256];
		Arrays.fill(padding, (byte) ' ');
	}

	private static final String shift = new String(padding, 0, 32);

	public VerbosePacketStream(OutputStream out) {
		super(out);
	}

	private static final byte[] zeros;
	static {
		zeros = new byte[16];
		Arrays.fill(zeros, (byte) '0');
	}

	public synchronized void print(JdwpPacket packet, boolean fromVM)
			throws IOException {
		try {
			printHeader(packet, fromVM);
			printData(packet);
			println();
		} catch (UnableToParseDataException e) {
			println("\n" + e.getMessage() + ':'); //$NON-NLS-1$
			printDescription("Remaining data:"); //$NON-NLS-1$
			byte[] data = e.getRemainingData();
			if (data == null) {
				printHex(packet.data());
			} else {
				printHex(e.getRemainingData());
			}
			println();
		}
	}

	protected void printHeader(JdwpPacket packet, boolean fromVM)
			throws UnableToParseDataException {
		if (fromVM) {
			println("From VM"); //$NON-NLS-1$
		} else {
			println("From Debugger"); //$NON-NLS-1$
		}

		printDescription("Packet ID:"); //$NON-NLS-1$
		printHex(packet.getId());
		println();

		printDescription("Length:"); //$NON-NLS-1$
		print(packet.getLength());
		println();

		printDescription("Flags:"); //$NON-NLS-1$
		byte flags = packet.getFlags();
		printHex(flags);
		if ((flags & JdwpPacket.FLAG_REPLY_PACKET) != 0) {
			print(MessageFormat
					.format(" (REPLY to {0})", new Object[] { JdwpCommandPacket.commandMap().get(new Integer(TcpipSpy.getCommand(packet))) })); //$NON-NLS-1$
		} else {
			print(" (COMMAND)"); //$NON-NLS-1$
		}
		println();

		printSpecificHeaderFields(packet);
	}

	protected void printSpecificHeaderFields(JdwpPacket packet) {
		if (packet instanceof JdwpReplyPacket) {
			printError((JdwpReplyPacket) packet);
		} else if (packet instanceof JdwpCommandPacket) {
			printCommand((JdwpCommandPacket) packet);
		}
	}

	protected void printCommand(JdwpCommandPacket commandPacket) {
		printDescription("Command set:"); //$NON-NLS-1$
		int commandAndSet = commandPacket.getCommand();
		byte set = (byte) (commandAndSet >> 8);
		byte command = (byte) commandAndSet;
		printHex(set);
		printParanthetical(set);
		println();
		printDescription("Command:"); //$NON-NLS-1$
		printHex(command);
		printParanthetical(command);
		print(" ("); //$NON-NLS-1$
		print(JdwpCommandPacket.commandMap().get(new Integer(commandAndSet)));
		println(')');
	}

	protected void printError(JdwpReplyPacket reply) {
		int error = reply.errorCode();

		printDescription("Error:"); //$NON-NLS-1$
		printHex(error);
		if (error != 0) {
			print(" ("); //$NON-NLS-1$
			print(JdwpReplyPacket.errorMap().get(new Integer(error)));
			print(')');
		}
		println();
	}

	protected void printData(JdwpPacket packet) throws IOException,
			UnableToParseDataException {
		if ((packet.getFlags() & JdwpPacket.FLAG_REPLY_PACKET) != 0) {
			printReplyData((JdwpReplyPacket) packet);
		} else {
			printCommandData((JdwpCommandPacket) packet);
		}
	}

	private void printCommandData(JdwpCommandPacket command)
			throws IOException, UnableToParseDataException {
		byte[] data = command.data();
		if (data == null)
			return;
		DataInputStream in = new DataInputStream(new ByteArrayInputStream(data));
		int commandId = command.getCommand();
		switch (commandId) {
		/** Commands VirtualMachine. */
		case JdwpCommandPacket.VM_VERSION:
			// no data
			break;
		case JdwpCommandPacket.VM_CLASSES_BY_SIGNATURE:
			printVmClassesBySignatureCommand(in);
			break;
		case JdwpCommandPacket.VM_ALL_CLASSES:
			// no data
			break;
		case JdwpCommandPacket.VM_ALL_THREADS:
			// no data
			break;
		case JdwpCommandPacket.VM_TOP_LEVEL_THREAD_GROUPS:
			// no data
			break;
		case JdwpCommandPacket.VM_DISPOSE:
			// no data
			break;
		case JdwpCommandPacket.VM_ID_SIZES:
			// no data
			break;
		case JdwpCommandPacket.VM_SUSPEND:
			// no data
			break;
		case JdwpCommandPacket.VM_RESUME:
			// no data
			break;
		case JdwpCommandPacket.VM_EXIT:
			printVmExitCommand(in);
			break;
		case JdwpCommandPacket.VM_CREATE_STRING:
			printVmCreateStringCommand(in);
			break;
		case JdwpCommandPacket.VM_CAPABILITIES:
			// no data
			break;
		case JdwpCommandPacket.VM_CLASS_PATHS:
			// no data
			break;
		case JdwpCommandPacket.VM_DISPOSE_OBJECTS:
			printVmDisposeObjectsCommand(in);
			break;
		case JdwpCommandPacket.VM_HOLD_EVENTS:
			// no data
			break;
		case JdwpCommandPacket.VM_RELEASE_EVENTS:
			// no data
			break;
		case JdwpCommandPacket.VM_CAPABILITIES_NEW:
			// no data
			break;
		case JdwpCommandPacket.VM_REDEFINE_CLASSES:
			printVmRedefineClassCommand(in);
			break;
		case JdwpCommandPacket.VM_SET_DEFAULT_STRATUM:
			printVmSetDefaultStratumCommand(in);
			break;
		case JdwpCommandPacket.VM_ALL_CLASSES_WITH_GENERIC:
			// no data
			break;

		/** Commands ReferenceType. */
		case JdwpCommandPacket.RT_SIGNATURE:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_CLASS_LOADER:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_MODIFIERS:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_FIELDS:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_METHODS:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_GET_VALUES:
			printRtGetValuesCommand(in);
			break;
		case JdwpCommandPacket.RT_SOURCE_FILE:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_NESTED_TYPES:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_STATUS:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_INTERFACES:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_CLASS_OBJECT:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_SOURCE_DEBUG_EXTENSION:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_SIGNATURE_WITH_GENERIC:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_FIELDS_WITH_GENERIC:
			printRtDefaultCommand(in);
			break;
		case JdwpCommandPacket.RT_METHODS_WITH_GENERIC:
			printRtDefaultCommand(in);
			break;

		/** Commands ClassType. */
		case JdwpCommandPacket.CT_SUPERCLASS:
			printCtSuperclassCommand(in);
			break;
		case JdwpCommandPacket.CT_SET_VALUES:
			printCtSetValuesCommand(in);
			break;
		case JdwpCommandPacket.CT_INVOKE_METHOD:
			printCtInvokeMethodCommand(in);
			break;
		case JdwpCommandPacket.CT_NEW_INSTANCE:
			printCtNewInstanceCommand(in);
			break;

		/** Commands ArrayType. */
		case JdwpCommandPacket.AT_NEW_INSTANCE:
			printAtNewInstanceCommand(in);
			break;

		/** Commands Method. */
		case JdwpCommandPacket.M_LINE_TABLE:
			printMDefaultCommand(in);
			break;
		case JdwpCommandPacket.M_VARIABLE_TABLE:
			printMDefaultCommand(in);
			break;
		case JdwpCommandPacket.M_BYTECODES:
			printMDefaultCommand(in);
			break;
		case JdwpCommandPacket.M_IS_OBSOLETE:
			printMDefaultCommand(in);
			break;
		case JdwpCommandPacket.M_VARIABLE_TABLE_WITH_GENERIC:
			printMDefaultCommand(in);
			break;

		/** Commands ObjectReference. */
		case JdwpCommandPacket.OR_REFERENCE_TYPE:
			printOrDefaultCommand(in);
			break;
		case JdwpCommandPacket.OR_GET_VALUES:
			printOrGetValuesCommand(in);
			break;
		case JdwpCommandPacket.OR_SET_VALUES:
			printOrSetValuesCommand(in);
			break;
		case JdwpCommandPacket.OR_MONITOR_INFO:
			printOrDefaultCommand(in);
			break;
		case JdwpCommandPacket.OR_INVOKE_METHOD:
			printOrInvokeMethodCommand(in);
			break;
		case JdwpCommandPacket.OR_DISABLE_COLLECTION:
			printOrDefaultCommand(in);
			break;
		case JdwpCommandPacket.OR_ENABLE_COLLECTION:
			printOrDefaultCommand(in);
			break;
		case JdwpCommandPacket.OR_IS_COLLECTED:
			printOrDefaultCommand(in);
			break;

		/** Commands StringReference. */
		case JdwpCommandPacket.SR_VALUE:
			printSrValueCommand(in);
			break;

		/** Commands ThreadReference. */
		case JdwpCommandPacket.TR_NAME:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_SUSPEND:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_RESUME:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_STATUS:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_THREAD_GROUP:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_FRAMES:
			printTrFramesCommand(in);
			break;
		case JdwpCommandPacket.TR_FRAME_COUNT:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_OWNED_MONITORS:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_CURRENT_CONTENDED_MONITOR:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_STOP:
			printTrStopCommand(in);
			break;
		case JdwpCommandPacket.TR_INTERRUPT:
			printTrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TR_SUSPEND_COUNT:
			printTrDefaultCommand(in);
			break;
		/*
		 * no more in the jdwp spec case JdwpCommandPacket.TR_POP_TOP_FRAME:
		 * break;
		 */

		/** Commands ThreadGroupReference. */
		case JdwpCommandPacket.TGR_NAME:
			printTgrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TGR_PARENT:
			printTgrDefaultCommand(in);
			break;
		case JdwpCommandPacket.TGR_CHILDREN:
			printTgrDefaultCommand(in);
			break;

		/** Commands ArrayReference. */
		case JdwpCommandPacket.AR_LENGTH:
			printArLengthCommand(in);
			break;
		case JdwpCommandPacket.AR_GET_VALUES:
			printArGetValuesCommand(in);
			break;
		case JdwpCommandPacket.AR_SET_VALUES:
			printArSetValuesCommand(in);
			break;

		/** Commands ClassLoaderReference. */
		case JdwpCommandPacket.CLR_VISIBLE_CLASSES:
			printClrVisibleClassesCommand(in);
			break;

		/** Commands EventRequest. */
		case JdwpCommandPacket.ER_SET:
			printErSetCommand(in);
			break;
		case JdwpCommandPacket.ER_CLEAR:
			printErClearCommand(in);
			break;
		case JdwpCommandPacket.ER_CLEAR_ALL_BREAKPOINTS:
			// no data
			break;

		/** Commands StackFrame. */
		case JdwpCommandPacket.SF_GET_VALUES:
			printSfGetValuesCommand(in);
			break;
		case JdwpCommandPacket.SF_SET_VALUES:
			printSfSetValuesCommand(in);
			break;
		case JdwpCommandPacket.SF_THIS_OBJECT:
			printSfDefaultCommand(in);
			break;
		case JdwpCommandPacket.SF_POP_FRAME:
			printSfDefaultCommand(in);
			break;

		/** Commands ClassObjectReference. */
		case JdwpCommandPacket.COR_REFLECTED_TYPE:
			printCorReflectedTypeCommand(in);
			break;

		/** Commands Event. */
		case JdwpCommandPacket.E_COMPOSITE:
			printECompositeCommand(in);
			break;

		/** Commands Hot Code Replacement (OTI specific). */
		case JdwpCommandPacket.HCR_CLASSES_HAVE_CHANGED:
		case JdwpCommandPacket.HCR_GET_CLASS_VERSION:
		case JdwpCommandPacket.HCR_DO_RETURN:
		case JdwpCommandPacket.HCR_REENTER_ON_EXIT:
		case JdwpCommandPacket.HCR_CAPABILITIES:
			throw new UnableToParseDataException(
					"NOT MANAGED COMMAND", remainderData(in)); //$NON-NLS-1$

		default:
			int cset = commandId >> 8;
			int cmd = commandId & 0xFF;
			println(MessageFormat
					.format("Unknown command : {0} {1}", new Object[] { "" + cset, "" + cmd })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
			break;
		}
	}

	private void printReplyData(JdwpReplyPacket reply) throws IOException,
			UnableToParseDataException {
		byte[] data = reply.data();
		if (data == null)
			return;
		DataInputStream in = new DataInputStream(new ByteArrayInputStream(data));
		JdwpCommandPacket command = TcpipSpy.getCommand(reply.getId());
		int commandId = command.getCommand();
		switch (commandId) {
		/** Commands VirtualMachine. */
		case JdwpCommandPacket.VM_VERSION:
			printVmVersionReply(in);
			break;
		case JdwpCommandPacket.VM_CLASSES_BY_SIGNATURE:
			printVmClassesBySignatureReply(in);
			break;
		case JdwpCommandPacket.VM_ALL_CLASSES:
			printVmAllClassesReply(in);
			break;
		case JdwpCommandPacket.VM_ALL_THREADS:
			printVmAllThreadsReply(in);
			break;
		case JdwpCommandPacket.VM_TOP_LEVEL_THREAD_GROUPS:
			printVmTopLevelThreadGroupReply(in);
			break;
		case JdwpCommandPacket.VM_DISPOSE:
			// no data
			break;
		case JdwpCommandPacket.VM_ID_SIZES:
			printVmIdSizesReply(in);
			break;
		case JdwpCommandPacket.VM_SUSPEND:
			// no data
			break;
		case JdwpCommandPacket.VM_RESUME:
			// no data
			break;
		case JdwpCommandPacket.VM_EXIT:
			// no data
			break;
		case JdwpCommandPacket.VM_CREATE_STRING:
			printVmCreateStringReply(in);
			break;
		case JdwpCommandPacket.VM_CAPABILITIES:
			printVmCapabilitiesReply(in);
			break;
		case JdwpCommandPacket.VM_CLASS_PATHS:
			printVmClassPathsReply(in);
			break;
		case JdwpCommandPacket.VM_DISPOSE_OBJECTS:
			// no data
			break;
		case JdwpCommandPacket.VM_HOLD_EVENTS:
			// no data
			break;
		case JdwpCommandPacket.VM_RELEASE_EVENTS:
			// no data
			break;
		case JdwpCommandPacket.VM_CAPABILITIES_NEW:
			printVmCapabilitiesNewReply(in);
			break;
		case JdwpCommandPacket.VM_REDEFINE_CLASSES:
			// no data
			break;
		case JdwpCommandPacket.VM_SET_DEFAULT_STRATUM:
			// no data
			break;
		case JdwpCommandPacket.VM_ALL_CLASSES_WITH_GENERIC:
			printVmAllClassesWithGenericReply(in);
			break;

		/** Commands ReferenceType. */
		case JdwpCommandPacket.RT_SIGNATURE:
			printRtSignatureReply(in);
			break;
		case JdwpCommandPacket.RT_CLASS_LOADER:
			printRtClassLoaderReply(in);
			break;
		case JdwpCommandPacket.RT_MODIFIERS:
			printRtModifiersReply(in);
			break;
		case JdwpCommandPacket.RT_FIELDS:
			printRtFieldsReply(in);
			break;
		case JdwpCommandPacket.RT_METHODS:
			printRtMethodsReply(in);
			break;
		case JdwpCommandPacket.RT_GET_VALUES:
			printRtGetValuesReply(in);
			break;
		case JdwpCommandPacket.RT_SOURCE_FILE:
			printRtSourceFileReply(in);
			break;
		case JdwpCommandPacket.RT_NESTED_TYPES:
			printRtNestedTypesReply(in);
			break;
		case JdwpCommandPacket.RT_STATUS:
			printRtStatusReply(in);
			break;
		case JdwpCommandPacket.RT_INTERFACES:
			printRtInterfacesReply(in);
			break;
		case JdwpCommandPacket.RT_CLASS_OBJECT:
			printRtClassObjectReply(in);
			break;
		case JdwpCommandPacket.RT_SOURCE_DEBUG_EXTENSION:
			printRtSourceDebugExtensionReply(in);
			break;
		case JdwpCommandPacket.RT_SIGNATURE_WITH_GENERIC:
			printRtSignatureWithGenericReply(in);
			break;
		case JdwpCommandPacket.RT_FIELDS_WITH_GENERIC:
			printRtFieldsWithGenericReply(in);
			break;
		case JdwpCommandPacket.RT_METHODS_WITH_GENERIC:
			printRtMethodsWithGenericReply(in);
			break;

		/** Commands ClassType. */
		case JdwpCommandPacket.CT_SUPERCLASS:
			printCtSuperclassReply(in);
			break;
		case JdwpCommandPacket.CT_SET_VALUES:
			// no data
			break;
		case JdwpCommandPacket.CT_INVOKE_METHOD:
			printCtInvokeMethodReply(in);
			break;
		case JdwpCommandPacket.CT_NEW_INSTANCE:
			printCtNewInstanceReply(in);
			break;

		/** Commands ArrayType. */
		case JdwpCommandPacket.AT_NEW_INSTANCE:
			printAtNewInstanceReply(in);
			break;

		/** Commands Method. */
		case JdwpCommandPacket.M_LINE_TABLE:
			printMLineTableReply(in);
			break;
		case JdwpCommandPacket.M_VARIABLE_TABLE:
			printMVariableTableReply(in);
			break;
		case JdwpCommandPacket.M_BYTECODES:
			printMBytecodesReply(in);
			break;
		case JdwpCommandPacket.M_IS_OBSOLETE:
			printMIsObsoleteReply(in);
			break;
		case JdwpCommandPacket.M_VARIABLE_TABLE_WITH_GENERIC:
			printMVariableTableWithGenericReply(in);
			break;

		/** Commands ObjectReference. */
		case JdwpCommandPacket.OR_REFERENCE_TYPE:
			printOrReferenceTypeReply(in);
			break;
		case JdwpCommandPacket.OR_GET_VALUES:
			printOrGetValuesReply(in);
			break;
		case JdwpCommandPacket.OR_SET_VALUES:
			// no data
			break;
		case JdwpCommandPacket.OR_MONITOR_INFO:
			printOrMonitorInfoReply(in);
			break;
		case JdwpCommandPacket.OR_INVOKE_METHOD:
			printOrInvokeMethodReply(in);
			break;
		case JdwpCommandPacket.OR_DISABLE_COLLECTION:
			// no data
			break;
		case JdwpCommandPacket.OR_ENABLE_COLLECTION:
			// no data
			break;
		case JdwpCommandPacket.OR_IS_COLLECTED:
			printOrIsCollectedReply(in);
			break;

		/** Commands StringReference. */
		case JdwpCommandPacket.SR_VALUE:
			printSrValueReply(in);
			break;

		/** Commands ThreadReference. */
		case JdwpCommandPacket.TR_NAME:
			printTrNameReply(in);
			break;
		case JdwpCommandPacket.TR_SUSPEND:
			// no data
			break;
		case JdwpCommandPacket.TR_RESUME:
			// no data
			break;
		case JdwpCommandPacket.TR_STATUS:
			printTrStatusReply(in);
			break;
		case JdwpCommandPacket.TR_THREAD_GROUP:
			printTrThreadGroupReply(in);
			break;
		case JdwpCommandPacket.TR_FRAMES:
			printTrFramesReply(in);
			break;
		case JdwpCommandPacket.TR_FRAME_COUNT:
			printTrFrameCountReply(in);
			break;
		case JdwpCommandPacket.TR_OWNED_MONITORS:
			printTrOwnedMonitorsReply(in);
			break;
		case JdwpCommandPacket.TR_CURRENT_CONTENDED_MONITOR:
			printTrCurrentContendedMonitorReply(in);
			break;
		case JdwpCommandPacket.TR_STOP:
			// no data
			break;
		case JdwpCommandPacket.TR_INTERRUPT:
			// no data
			break;
		case JdwpCommandPacket.TR_SUSPEND_COUNT:
			printTrSuspendCountReply(in);
			break;
		/*
		 * no more in the jdwp spec case JdwpCommandPacket.TR_POP_TOP_FRAME:
		 * break;
		 */
		/** Commands ThreadGroupReference. */
		case JdwpCommandPacket.TGR_NAME:
			printTgrNameReply(in);
			break;
		case JdwpCommandPacket.TGR_PARENT:
			printTgrParentReply(in);
			break;
		case JdwpCommandPacket.TGR_CHILDREN:
			printTgrChildrenReply(in);
			break;

		/** Commands ArrayReference. */
		case JdwpCommandPacket.AR_LENGTH:
			printArLengthReply(in);
			break;
		case JdwpCommandPacket.AR_GET_VALUES:
			printArGetValuesReply(in);
			break;
		case JdwpCommandPacket.AR_SET_VALUES:
			// no data
			break;

		/** Commands ClassLoaderReference. */
		case JdwpCommandPacket.CLR_VISIBLE_CLASSES:
			printClrVisibleClassesReply(in);
			break;

		/** Commands EventRequest. */
		case JdwpCommandPacket.ER_SET:
			printErSetReply(in);
			break;
		case JdwpCommandPacket.ER_CLEAR:
			// no data
			break;
		case JdwpCommandPacket.ER_CLEAR_ALL_BREAKPOINTS:
			// no data
			break;

		/** Commands StackFrame. */
		case JdwpCommandPacket.SF_GET_VALUES:
			printSfGetValuesReply(in);
			break;
		case JdwpCommandPacket.SF_SET_VALUES:
			// no data
			break;
		case JdwpCommandPacket.SF_THIS_OBJECT:
			printSfThisObjectReply(in);
			break;
		case JdwpCommandPacket.SF_POP_FRAME:
			// no data
			break;

		/** Commands ClassObjectReference. */
		case JdwpCommandPacket.COR_REFLECTED_TYPE:
			printCorReflectedTypeReply(in);
			break;

		/** Commands Event. */
		/*
		 * no reply case JdwpCommandPacket.E_COMPOSITE: break;
		 */

		/** Commands Hot Code Replacement (OTI specific). */
		case JdwpCommandPacket.HCR_CLASSES_HAVE_CHANGED:
		case JdwpCommandPacket.HCR_GET_CLASS_VERSION:
		case JdwpCommandPacket.HCR_DO_RETURN:
		case JdwpCommandPacket.HCR_REENTER_ON_EXIT:
		case JdwpCommandPacket.HCR_CAPABILITIES:
			throw new UnableToParseDataException(
					"NOT MANAGED COMMAND", remainderData(in)); //$NON-NLS-1$

		default:
			int cset = commandId >> 8;
			int cmd = commandId & 0xFF;
			println(MessageFormat
					.format("Unknown command : {0} {1}", new Object[] { "" + cset, "" + cmd })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
			break;
		}
	}

	private void printRefTypeTag(byte refTypeTag) {
		printDescription("Type tag:"); //$NON-NLS-1$
		printRefTypeTagValue(refTypeTag);
		println();
	}

	private void printRefTypeTagValue(byte refTypeTag) {
		printHex(refTypeTag);
		print(" ("); //$NON-NLS-1$
		switch (refTypeTag) {
		case TYPE_TAG_CLASS:
			print("CLASS"); //$NON-NLS-1$
			break;
		case TYPE_TAG_INTERFACE:
			print("INTERFACE"); //$NON-NLS-1$
			break;
		case TYPE_TAG_ARRAY:
			print("ARRAY"); //$NON-NLS-1$
			break;
		default:
			print("unknown"); //$NON-NLS-1$
		}
		print(')');
	}

	private void printClassStatus(int status) {
		printDescription("Status:"); //$NON-NLS-1$
		printHex(status);
		print(" ("); //$NON-NLS-1$
		boolean spaceNeeded = false;
		if ((status & JDWP_CLASS_STATUS_VERIFIED) != 0) {
			print("VERIFIED"); //$NON-NLS-1$
			spaceNeeded = true;
		}
		if ((status & JDWP_CLASS_STATUS_PREPARED) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("PREPARED"); //$NON-NLS-1$
		}
		if ((status & JDWP_CLASS_STATUS_INITIALIZED) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("INITIALIZED"); //$NON-NLS-1$
		}
		if ((status & JDWP_CLASS_STATUS_ERROR) != 0) {
			if (spaceNeeded) {
				print(' ');
			}
			print("unknown"); //$NON-NLS-1$
		}
		println(')');
	}

	private void printClassModifiers(int modifiers) {
		printDescription("Modifiers:"); //$NON-NLS-1$
		printHex(modifiers);
		print(" ("); //$NON-NLS-1$
		boolean spaceNeeded = false;
		if ((modifiers & ACC_PUBLIC) != 0) {
			print("PUBLIC"); //$NON-NLS-1$
			spaceNeeded = true;
		}
		if ((modifiers & ACC_PRIVATE) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("PRIVATE"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_PROTECTED) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("PROTECTED"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_STATIC) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("STATIC"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_FINAL) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("FINAL"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_SUPER) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("SUPER"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_INTERFACE) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("INTERFACE"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_ABSTRACT) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("ABSTRACT"); //$NON-NLS-1$
		}
		if ((modifiers & (ACC_EXT_SYNTHETIC | ACC_SYNTHETIC)) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("SYNTHETIC"); //$NON-NLS-1$
		}
		println(')');
	}

	private void printMethodModifiers(int modifiers) {
		printDescription("Modifiers:"); //$NON-NLS-1$
		printHex(modifiers);
		print(" ("); //$NON-NLS-1$
		boolean spaceNeeded = false;
		if ((modifiers & ACC_PUBLIC) != 0) {
			print("PUBLIC"); //$NON-NLS-1$
			spaceNeeded = true;
		}
		if ((modifiers & ACC_PRIVATE) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("PRIVATE"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_PROTECTED) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("PROTECTED"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_STATIC) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("STATIC"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_FINAL) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("FINAL"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_SYNCHRONIZED) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("SYNCHRONIZED"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_BRIDGE) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("BRIDGE"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_VARARGS) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("VARARGS"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_NATIVE) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("NATIVE"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_ABSTRACT) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("ABSTRACT"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_STRICT) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("STRICT"); //$NON-NLS-1$
		}
		if ((modifiers & (ACC_EXT_SYNTHETIC | ACC_SYNTHETIC)) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("SYNTHETIC"); //$NON-NLS-1$
		}
		println(')');
	}

	private void printFieldModifiers(int modifiers) {
		printDescription("Modifiers:"); //$NON-NLS-1$
		printHex(modifiers);
		print(" ("); //$NON-NLS-1$
		boolean spaceNeeded = false;
		if ((modifiers & ACC_PUBLIC) != 0) {
			print("PUBLIC"); //$NON-NLS-1$
			spaceNeeded = true;
		}
		if ((modifiers & ACC_PRIVATE) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("PRIVATE"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_PROTECTED) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("PROTECTED"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_STATIC) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("STATIC"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_FINAL) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("FINAL"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_VOLATILE) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("VOLATILE"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_TRANSIENT) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("TRANSIENT"); //$NON-NLS-1$
		}
		if ((modifiers & ACC_ENUM) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("ENUM"); //$NON-NLS-1$
		}
		if ((modifiers & (ACC_EXT_SYNTHETIC | ACC_SYNTHETIC)) != 0) {
			if (spaceNeeded) {
				print(' ');
			} else {
				spaceNeeded = true;
			}
			print("SYNTHETIC"); //$NON-NLS-1$
		}
		println(')');
	}

	private void printInvocationOptions(int invocationOptions) {
		printDescription("Invocation Options:"); //$NON-NLS-1$
		printHex(invocationOptions);
		print(" ("); //$NON-NLS-1$
		boolean spaceNeeded = false;
		if ((invocationOptions & INVOKE_SINGLE_THREADED) != 0) {
			print("SINGLE_THREADED"); //$NON-NLS-1$
			spaceNeeded = true;
		}
		if ((invocationOptions & INVOKE_NONVIRTUAL) != 0) {
			if (spaceNeeded) {
				print(' ');
			}
			print("NONVIRTUAL"); //$NON-NLS-1$
		}
		println(')');
	}

	private void printThreadStatus(int threadStatus) {
		printDescription("Thread status:"); //$NON-NLS-1$
		printHex(threadStatus);
		print(" ("); //$NON-NLS-1$
		switch (threadStatus) {
		case THREAD_STATUS_ZOMBIE:
			print("ZOMBIE"); //$NON-NLS-1$
			break;
		case THREAD_STATUS_RUNNING:
			print("RUNNING"); //$NON-NLS-1$
			break;
		case THREAD_STATUS_SLEEPING:
			print("SLEEPING"); //$NON-NLS-1$
			break;
		case THREAD_STATUS_MONITOR:
			print("MONITOR"); //$NON-NLS-1$
			break;
		case THREAD_STATUS_WAIT:
			print("WAIT"); //$NON-NLS-1$
			break;
		default:
			print("unknown"); //$NON-NLS-1$
			break;
		}
		println(')');
	}

	private void printSuspendStatus(int suspendStatus) {
		printDescription("Suspend status:"); //$NON-NLS-1$
		printHex(suspendStatus);
		print(" ("); //$NON-NLS-1$
		if ((suspendStatus & SUSPEND_STATUS_SUSPENDED) != 0) {
			print("SUSPENDED"); //$NON-NLS-1$
		}
		println(')');
	}

	private void printEventKind(byte eventKind) {
		printDescription("Event kind:"); //$NON-NLS-1$
		printHex(eventKind);
		print(" ("); //$NON-NLS-1$
		switch (eventKind) {
		case EVENTKIND_SINGLE_STEP:
			print("SINGLE_STEP"); //$NON-NLS-1$
			break;
		case EVENTKIND_BREAKPOINT:
			print("BREAKPOINT"); //$NON-NLS-1$
			break;
		case EVENTKIND_FRAME_POP:
			print("FRAME_POP"); //$NON-NLS-1$
			break;
		case EVENTKIND_EXCEPTION:
			print("EXCEPTION"); //$NON-NLS-1$
			break;
		case EVENTKIND_USER_DEFINED:
			print("USER_DEFINED"); //$NON-NLS-1$
			break;
		case EVENTKIND_THREAD_START:
			print("THREAD_START"); //$NON-NLS-1$
			break;
		case EVENTKIND_THREAD_END:
			print("THREAD_END"); //$NON-NLS-1$
			break;
		case EVENTKIND_CLASS_PREPARE:
			print("CLASS_PREPARE"); //$NON-NLS-1$
			break;
		case EVENTKIND_CLASS_UNLOAD:
			print("CLASS_UNLOAD"); //$NON-NLS-1$
			break;
		case EVENTKIND_CLASS_LOAD:
			print("CLASS_LOAD"); //$NON-NLS-1$
			break;
		case EVENTKIND_FIELD_ACCESS:
			print("FIELD_ACCESS"); //$NON-NLS-1$
			break;
		case EVENTKIND_FIELD_MODIFICATION:
			print("FIELD_MODIFICATION"); //$NON-NLS-1$
			break;
		case EVENTKIND_EXCEPTION_CATCH:
			print("EXCEPTION_CATCH"); //$NON-NLS-1$
			break;
		case EVENTKIND_METHOD_ENTRY:
			print("METHOD_ENTRY"); //$NON-NLS-1$
			break;
		case EVENTKIND_METHOD_EXIT:
			print("METHOD_EXIT"); //$NON-NLS-1$
			break;
		case EVENTKIND_VM_INIT:
			print("VM_INIT"); //$NON-NLS-1$
			break;
		case EVENTKIND_VM_DEATH:
			print("VM_DEATH"); //$NON-NLS-1$
			break;
		case EVENTKIND_VM_DISCONNECTED:
			print("VM_DISCONNECTED"); //$NON-NLS-1$
			break;
		default:
			print("unknown"); //$NON-NLS-1$
			break;
		}
		println(')');
	}

	private void printSuspendPolicy(byte suspendPolicy) {
		printDescription("Suspend policy:"); //$NON-NLS-1$
		printHex(suspendPolicy);
		print(" ("); //$NON-NLS-1$
		switch (suspendPolicy) {
		case SUSPENDPOLICY_NONE:
			print("NONE"); //$NON-NLS-1$
			break;
		case SUSPENDPOLICY_EVENT_THREAD:
			print("EVENT_THREAD"); //$NON-NLS-1$
			break;
		case SUSPENDPOLICY_ALL:
			print("ALL"); //$NON-NLS-1$
			break;
		default:
			print("unknown"); //$NON-NLS-1$
			break;
		}
		println(')');
	}

	private void printStepDepth(int setDepth) {
		printDescription("Step depth:"); //$NON-NLS-1$
		printHex(setDepth);
		print(" ("); //$NON-NLS-1$
		switch (setDepth) {
		case STEPDEPTH_INTO:
			print("INTO"); //$NON-NLS-1$
			break;
		case STEPDEPTH_OVER:
			print("OVER"); //$NON-NLS-1$
			break;
		case STEPDEPTH_OUT:
			print("OUT"); //$NON-NLS-1$
			break;
		default:
			print("unknown"); //$NON-NLS-1$
			break;
		}
		println(')');
	}

	private void printStepSize(int setSize) {
		printDescription("Step size:"); //$NON-NLS-1$
		printHex(setSize);
		print(" ("); //$NON-NLS-1$
		switch (setSize) {
		case STEPSIZE_MIN:
			print("MIN"); //$NON-NLS-1$
			break;
		case STEPSIZE_LINE:
			print("LINE"); //$NON-NLS-1$
			break;
		default:
			print("unknown"); //$NON-NLS-1$
			break;
		}
		println(')');
	}

	private void printVmVersionReply(DataInputStream in) throws IOException {
		String description = readString(in);
		int jdwpMajor = in.readInt();
		int jdwpMinor = in.readInt();
		String vmVersion = readString(in);
		String vmName = readString(in);

		println("VM Description:", description); //$NON-NLS-1$
		println("JDWP Major Version:", jdwpMajor); //$NON-NLS-1$
		println("JDWP Minor Version:", jdwpMinor); //$NON-NLS-1$
		println("VM Version:", vmVersion); //$NON-NLS-1$
		println("VM Name:", vmName); //$NON-NLS-1$
	}

	private void printVmClassesBySignatureCommand(DataInputStream in)
			throws IOException {
		String signature = readString(in);
		println("Class signature:", signature); //$NON-NLS-1$
	}

	private void printVmClassesBySignatureReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int classesCount = in.readInt();
		println("Classes count:", classesCount); //$NON-NLS-1$
		for (int i = 0; i < classesCount; i++) {
			byte refTypeTag = in.readByte();
			long typeId = readReferenceTypeID(in);
			int status = in.readInt();
			printRefTypeTag(refTypeTag);
			printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
			printClassStatus(status);
		}
	}

	private void printVmAllClassesReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int classesCount = in.readInt();
		println("Classes count:", classesCount); //$NON-NLS-1$
		for (int i = 0; i < classesCount; i++) {
			byte refTypeTag = in.readByte();
			long typeId = readReferenceTypeID(in);
			String signature = readString(in);
			int status = in.readInt();
			printRefTypeTag(refTypeTag);
			printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
			println("Class signature:", signature); //$NON-NLS-1$
			printClassStatus(status);
		}
	}

	private void printVmAllThreadsReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int threadsCount = in.readInt();
		println("Threads count:", threadsCount); //$NON-NLS-1$
		for (int i = 0; i < threadsCount; i++) {
			long threadId = readObjectID(in);
			printlnObjectId("Thread id:", threadId); //$NON-NLS-1$
		}
	}

	private void printVmTopLevelThreadGroupReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int groupsCount = in.readInt();
		println("Threads count:", groupsCount); //$NON-NLS-1$
		for (int i = 0; i < groupsCount; i++) {
			long threadGroupId = readObjectID(in);
			printlnObjectId("Thread id:", threadGroupId); //$NON-NLS-1$
		}
	}

	private void printVmIdSizesReply(DataInputStream in) throws IOException {
		int fieldIDSize = in.readInt();
		int methodIDSize = in.readInt();
		int objectIDSize = in.readInt();
		int referenceTypeIDSize = in.readInt();
		int frameIDSize = in.readInt();
		println("Field ID size:", fieldIDSize); //$NON-NLS-1$
		println("Method ID size:", methodIDSize); //$NON-NLS-1$
		println("Object ID size:", objectIDSize); //$NON-NLS-1$
		println("Reference type ID size:", referenceTypeIDSize); //$NON-NLS-1$
		println("Frame ID size:", frameIDSize); //$NON-NLS-1$
		TcpipSpy.setFieldIDSize(fieldIDSize);
		TcpipSpy.setMethodIDSize(methodIDSize);
		TcpipSpy.setObjectIDSize(objectIDSize);
		TcpipSpy.setReferenceTypeIDSize(referenceTypeIDSize);
		TcpipSpy.setFrameIDSize(frameIDSize);
		TcpipSpy.setHasSizes(true);
	}

	private void printVmExitCommand(DataInputStream in) throws IOException {
		int exitCode = in.readInt();
		println("Exit code:", exitCode); //$NON-NLS-1$
	}

	private void printVmCreateStringCommand(DataInputStream in)
			throws IOException {
		String string = readString(in);
		println("String:", string); //$NON-NLS-1$
	}

	private void printVmCreateStringReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long stringId = readObjectID(in);
		printlnObjectId("String id:", stringId); //$NON-NLS-1$
	}

	private void printVmCapabilitiesReply(DataInputStream in)
			throws IOException {
		boolean canWatchFieldModification = in.readBoolean();
		boolean canWatchFieldAccess = in.readBoolean();
		boolean canGetBytecodes = in.readBoolean();
		boolean canGetSyntheticAttribute = in.readBoolean();
		boolean canGetOwnedMonitorInfo = in.readBoolean();
		boolean canGetCurrentContendedMonitor = in.readBoolean();
		boolean canGetMonitorInfo = in.readBoolean();
		println("Can watch field modification:", canWatchFieldModification); //$NON-NLS-1$
		println("can watch field access:", canWatchFieldAccess); //$NON-NLS-1$
		println("Can get bytecodes:", canGetBytecodes); //$NON-NLS-1$
		println("Can get synthetic attribute:", canGetSyntheticAttribute); //$NON-NLS-1$
		println("Can get owned monitor info:", canGetOwnedMonitorInfo); //$NON-NLS-1$
		println("Can get currently contended monitor:", canGetCurrentContendedMonitor); //$NON-NLS-1$
		println("Can get monitor info:", canGetMonitorInfo); //$NON-NLS-1$
	}

	private void printVmClassPathsReply(DataInputStream in) throws IOException {
		String baseDir = readString(in);
		println("Base directory:", baseDir); //$NON-NLS-1$
		int classpathCount = in.readInt();
		println("Classpaths count:", classpathCount); //$NON-NLS-1$
		for (int i = 0; i < classpathCount; i++) {
			String path = readString(in);
			println("Classpath:", path); //$NON-NLS-1$
		}
		int bootclasspathCount = in.readInt();
		println("Bootclasspaths count:", bootclasspathCount); //$NON-NLS-1$
		for (int i = 0; i < bootclasspathCount; i++) {
			String path = readString(in);
			println("Bootclasspath:", path); //$NON-NLS-1$
		}
	}

	private void printVmDisposeObjectsCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int requestsCount = in.readInt();
		println("Requests Count:", requestsCount); //$NON-NLS-1$
		for (int i = 0; i < requestsCount; i++) {
			long objectId = readObjectID(in);
			int refsCounts = in.readInt();
			printlnObjectId("Object id:", objectId); //$NON-NLS-1$
			println("References count:", refsCounts); //$NON-NLS-1$
		}
	}

	private void printVmCapabilitiesNewReply(DataInputStream in)
			throws IOException {
		printVmCapabilitiesReply(in);
		boolean canRedefineClasses = in.readBoolean();
		boolean canAddMethod = in.readBoolean();
		boolean canUnrestrictedlyRedefineClasses = in.readBoolean();
		boolean canPopFrames = in.readBoolean();
		boolean canUseInstanceFilters = in.readBoolean();
		boolean canGetSourceDebugExtension = in.readBoolean();
		boolean canRequestVMDeathEvent = in.readBoolean();
		boolean canSetDefaultStratum = in.readBoolean();
		boolean reserved16 = in.readBoolean();
		boolean reserved17 = in.readBoolean();
		boolean reserved18 = in.readBoolean();
		boolean reserved19 = in.readBoolean();
		boolean reserved20 = in.readBoolean();
		boolean reserved21 = in.readBoolean();
		boolean reserved22 = in.readBoolean();
		boolean reserved23 = in.readBoolean();
		boolean reserved24 = in.readBoolean();
		boolean reserved25 = in.readBoolean();
		boolean reserved26 = in.readBoolean();
		boolean reserved27 = in.readBoolean();
		boolean reserved28 = in.readBoolean();
		boolean reserved29 = in.readBoolean();
		boolean reserved30 = in.readBoolean();
		boolean reserved31 = in.readBoolean();
		boolean reserved32 = in.readBoolean();
		println("Can redefine classes:", canRedefineClasses); //$NON-NLS-1$
		println("Can add method:", canAddMethod); //$NON-NLS-1$
		println("Can unrestrictedly rd. classes:", canUnrestrictedlyRedefineClasses); //$NON-NLS-1$
		println("Can pop frames:", canPopFrames); //$NON-NLS-1$
		println("Can use instance filters:", canUseInstanceFilters); //$NON-NLS-1$
		println("Can get source debug extension:", canGetSourceDebugExtension); //$NON-NLS-1$
		println("Can request VMDeath event:", canRequestVMDeathEvent); //$NON-NLS-1$
		println("Can set default stratum:", canSetDefaultStratum); //$NON-NLS-1$
		println("Reserved:", reserved16); //$NON-NLS-1$
		println("Reserved:", reserved17); //$NON-NLS-1$
		println("Reserved:", reserved18); //$NON-NLS-1$
		println("Reserved:", reserved19); //$NON-NLS-1$
		println("Reserved:", reserved20); //$NON-NLS-1$
		println("Reserved:", reserved21); //$NON-NLS-1$
		println("Reserved:", reserved22); //$NON-NLS-1$
		println("Reserved:", reserved23); //$NON-NLS-1$
		println("Reserved:", reserved24); //$NON-NLS-1$
		println("Reserved:", reserved25); //$NON-NLS-1$
		println("Reserved:", reserved26); //$NON-NLS-1$
		println("Reserved:", reserved27); //$NON-NLS-1$
		println("Reserved:", reserved28); //$NON-NLS-1$
		println("Reserved:", reserved29); //$NON-NLS-1$
		println("Reserved:", reserved30); //$NON-NLS-1$
		println("Reserved:", reserved31); //$NON-NLS-1$
		println("Reserved:", reserved32); //$NON-NLS-1$
	}

	private void printVmRedefineClassCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int typesCount = in.readInt();
		println("Types count:", typesCount); //$NON-NLS-1$
		for (int i = 0; i < typesCount; i++) {
			long typeId = readReferenceTypeID(in);
			int classfileLength = in.readInt();
			printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
			println("Classfile length:", classfileLength); //$NON-NLS-1$
			while ((classfileLength -= in.skipBytes(classfileLength)) != 0) {
			}
			printDescription("Class bytes:"); //$NON-NLS-1$
			println("skipped"); //$NON-NLS-1$
		}
	}

	private void printVmSetDefaultStratumCommand(DataInputStream in)
			throws IOException {
		String stratumId = readString(in);
		println("Stratum id:", stratumId); //$NON-NLS-1$
	}

	private void printVmAllClassesWithGenericReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int classesCount = in.readInt();
		println("Classes count:", classesCount); //$NON-NLS-1$
		for (int i = 0; i < classesCount; i++) {
			byte refTypeTag = in.readByte();
			long typeId = readReferenceTypeID(in);
			String signature = readString(in);
			String genericSignature = readString(in);
			int status = in.readInt();
			printRefTypeTag(refTypeTag);
			printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
			println("Class signature:", signature); //$NON-NLS-1$
			println("Generic class signature:", genericSignature); //$NON-NLS-1$
			printClassStatus(status);
		}
	}

	private void printRtDefaultCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long typeId = readReferenceTypeID(in);
		printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
	}

	private void printRtSignatureReply(DataInputStream in) throws IOException {
		String signature = readString(in);
		println("Signature:", signature); //$NON-NLS-1$
	}

	private void printRtClassLoaderReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long classLoaderId = readObjectID(in);
		printlnObjectId("ClassLoader id:", classLoaderId); //$NON-NLS-1$
	}

	private void printRtModifiersReply(DataInputStream in) throws IOException {
		int modifiers = in.readInt();
		printClassModifiers(modifiers);
	}

	private void printRtFieldsReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int fieldsCount = in.readInt();
		println("Fields count:", fieldsCount); //$NON-NLS-1$
		for (int i = 0; i < fieldsCount; i++) {
			long fieldId = readFieldID(in);
			String name = readString(in);
			String signature = readString(in);
			int modifiers = in.readInt();
			printlnFieldId("Field id:", fieldId); //$NON-NLS-1$
			println("Name:", name); //$NON-NLS-1$
			println("Signature:", signature); //$NON-NLS-1$
			printFieldModifiers(modifiers);
		}
	}

	private void printRtMethodsReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int methodsCount = in.readInt();
		println("Methods count:", methodsCount); //$NON-NLS-1$
		for (int i = 0; i < methodsCount; i++) {
			long methodId = readMethodID(in);
			String name = readString(in);
			String signature = readString(in);
			int modifiers = in.readInt();
			printlnMethodId("Method id:", methodId); //$NON-NLS-1$
			println("Name:", name); //$NON-NLS-1$
			println("Signature:", signature); //$NON-NLS-1$
			printMethodModifiers(modifiers);
		}
	}

	private void printRtGetValuesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long typeId = readReferenceTypeID(in);
		int fieldsCount = in.readInt();
		printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
		println("Fields count:", fieldsCount); //$NON-NLS-1$
		for (int i = 0; i < fieldsCount; i++) {
			long fieldId = readFieldID(in);
			printlnFieldId("Field id:", fieldId); //$NON-NLS-1$
		}
	}

	private void printRtGetValuesReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int valuesCount = in.readInt();
		println("Values count:", valuesCount); //$NON-NLS-1$
		for (int i = 0; i < valuesCount; i++) {
			readAndPrintlnTaggedValue("Value:", in); //$NON-NLS-1$
		}
	}

	private void printRtSourceFileReply(DataInputStream in) throws IOException {
		String sourceFile = readString(in);
		println("Source file:", sourceFile); //$NON-NLS-1$
	}

	private void printRtNestedTypesReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int typesCount = in.readInt();
		println("Types count:", typesCount); //$NON-NLS-1$
		for (int i = 0; i < typesCount; i++) {
			byte typeTag = in.readByte();
			long typeId = readReferenceTypeID(in);
			printRefTypeTag(typeTag);
			printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
		}
	}

	private void printRtStatusReply(DataInputStream in) throws IOException {
		int status = in.readInt();
		printClassStatus(status);
	}

	private void printRtInterfacesReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int interfacesCount = in.readInt();
		println("Interfaces count:", interfacesCount); //$NON-NLS-1$
		for (int i = 0; i < interfacesCount; i++) {
			long interfaceId = readReferenceTypeID(in);
			printlnReferenceTypeId("Interface type id:", interfaceId); //$NON-NLS-1$
		}
	}

	private void printRtClassObjectReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long classObjectId = readObjectID(in);
		printlnObjectId("Class object id:", classObjectId); //$NON-NLS-1$
	}

	private void printRtSourceDebugExtensionReply(DataInputStream in)
			throws IOException {
		String extension = readString(in);
		println("Extension:", extension); //$NON-NLS-1$
	}

	private void printRtSignatureWithGenericReply(DataInputStream in)
			throws IOException {
		String signature = readString(in);
		String genericSignature = readString(in);
		println("Signature:", signature); //$NON-NLS-1$
		println("Generic signature:", genericSignature); //$NON-NLS-1$
	}

	private void printRtFieldsWithGenericReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int fieldsCount = in.readInt();
		println("Fields count:", fieldsCount); //$NON-NLS-1$
		for (int i = 0; i < fieldsCount; i++) {
			long fieldId = readFieldID(in);
			String name = readString(in);
			String signature = readString(in);
			String genericSignature = readString(in);
			int modifiers = in.readInt();
			printlnFieldId("Field id:", fieldId); //$NON-NLS-1$
			println("Name:", name); //$NON-NLS-1$
			println("Signature:", signature); //$NON-NLS-1$
			println("Generic signature:", genericSignature); //$NON-NLS-1$
			printFieldModifiers(modifiers);
		}
	}

	private void printRtMethodsWithGenericReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int methodsCount = in.readInt();
		println("Methods count:", methodsCount); //$NON-NLS-1$
		for (int i = 0; i < methodsCount; i++) {
			long methodId = readMethodID(in);
			String name = readString(in);
			String genericSignature = readString(in);
			int modifiers = in.readInt();
			printlnMethodId("Method id:", methodId); //$NON-NLS-1$
			println("Name:", name); //$NON-NLS-1$
			// println(TcpIpSpyMessages.VerbosePacketStream_Signature__106,
			// signature);
			println("Generic signature:", genericSignature); //$NON-NLS-1$
			printMethodModifiers(modifiers);
		}
	}

	private void printCtSuperclassCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long classTypeId = readReferenceTypeID(in);
		printlnReferenceTypeId("Class type id:", classTypeId); //$NON-NLS-1$
	}

	private void printCtSuperclassReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long superclassTypeId = readReferenceTypeID(in);
		printlnReferenceTypeId("Superclass type id:", superclassTypeId); //$NON-NLS-1$
	}

	private void printCtSetValuesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long classTypeId = readReferenceTypeID(in);
		int fieldsCount = in.readInt();
		printlnReferenceTypeId("Class type id:", classTypeId); //$NON-NLS-1$
		println("Fields count:", fieldsCount); //$NON-NLS-1$
		throw new UnableToParseDataException(
				"List of values: NOT MANAGED", remainderData(in)); //$NON-NLS-1$
	}

	private void printCtInvokeMethodCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long classTypeId = readReferenceTypeID(in);
		long threadId = readObjectID(in);
		long methodId = readMethodID(in);
		int argumentsCount = in.readInt();
		printlnReferenceTypeId("Class type id:", classTypeId); //$NON-NLS-1$
		printlnObjectId("Thread id:", threadId); //$NON-NLS-1$
		printlnMethodId("Method id:", methodId); //$NON-NLS-1$
		println("Arguments count:", argumentsCount); //$NON-NLS-1$
		for (int i = 0; i < argumentsCount; i++) {
			readAndPrintlnTaggedValue("Argument:", in); //$NON-NLS-1$
		}
		int invocationOptions = in.readInt();
		printInvocationOptions(invocationOptions);
	}

	private void printCtInvokeMethodReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		readAndPrintlnTaggedValue("Return value:", in); //$NON-NLS-1$
		byte signatureByte = in.readByte();
		long exception = readObjectID(in);
		printlnTaggedObjectId("Exception object id:", exception, signatureByte); //$NON-NLS-1$
	}

	private void printCtNewInstanceCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		printCtInvokeMethodCommand(in);
	}

	private void printCtNewInstanceReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		byte objectSignatureByte = in.readByte();
		long newObjectId = readObjectID(in);
		byte exceptionSignatureByte = in.readByte();
		long exception = readObjectID(in);
		printlnTaggedObjectId(
				"New object id:", newObjectId, objectSignatureByte); //$NON-NLS-1$
		printlnTaggedObjectId(
				"Exception object id:", exception, exceptionSignatureByte); //$NON-NLS-1$
	}

	private void printAtNewInstanceCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long arrayTypeId = readReferenceTypeID(in);
		int length = in.readInt();
		printlnReferenceTypeId("Array type id:", arrayTypeId); //$NON-NLS-1$
		println("Length:", length); //$NON-NLS-1$
	}

	private void printAtNewInstanceReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		byte signatureByte = in.readByte();
		long newArrayId = readObjectID(in);
		printlnTaggedObjectId("New array id:", newArrayId, signatureByte); //$NON-NLS-1$
	}

	private void printMDefaultCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long classTypeId = readReferenceTypeID(in);
		long methodId = readMethodID(in);
		printlnReferenceTypeId("Class type id:", classTypeId); //$NON-NLS-1$
		printlnMethodId("Method id:", methodId); //$NON-NLS-1$
	}

	private void printMLineTableReply(DataInputStream in) throws IOException {
		long start = in.readLong();
		long end = in.readLong();
		int lines = in.readInt();
		println("Lowest valid code index:", start); //$NON-NLS-1$
		println("Highest valid code index:", end); //$NON-NLS-1$
		println("Number of lines:", lines); //$NON-NLS-1$
		for (int i = 0; i < lines; i++) {
			long lineCodeIndex = in.readLong();
			int lineNumber = in.readInt();
			println("Line code Index:", lineCodeIndex); //$NON-NLS-1$
			println("Line number:", lineNumber); //$NON-NLS-1$
		}
	}

	private void printMVariableTableReply(DataInputStream in)
			throws IOException {
		int slotsUsedByArgs = in.readInt();
		int variablesCount = in.readInt();
		println("Nb of slots used by all args:", slotsUsedByArgs); //$NON-NLS-1$
		println("Nb of variables:", variablesCount); //$NON-NLS-1$
		for (int i = 0; i < variablesCount; i++) {
			long codeIndex = in.readLong();
			String name = readString(in);
			String signature = readString(in);
			int length = in.readInt();
			int slotId = in.readInt();
			println("First code index:", codeIndex); //$NON-NLS-1$
			println("Variable name:", name); //$NON-NLS-1$
			println("Variable type signature:", signature); //$NON-NLS-1$
			println("Code index length:", length); //$NON-NLS-1$
			println("Slot id:", slotId); //$NON-NLS-1$
		}
	}

	private void printMBytecodesReply(DataInputStream in) throws IOException {
		int bytes = in.readInt();
		println("Nb of bytes:", bytes); //$NON-NLS-1$
		while ((bytes -= in.skipBytes(bytes)) != 0) {
		}
		printDescription("Method bytes:"); //$NON-NLS-1$
		println("skipped"); //$NON-NLS-1$
	}

	private void printMIsObsoleteReply(DataInputStream in) throws IOException {
		boolean isObsolete = in.readBoolean();
		println("Is obsolete:", isObsolete); //$NON-NLS-1$
	}

	private void printMVariableTableWithGenericReply(DataInputStream in)
			throws IOException {
		int slotsUsedByArgs = in.readInt();
		int variablesCount = in.readInt();
		println("Nb of slots used by all args:", slotsUsedByArgs); //$NON-NLS-1$
		println("Nb of variables:", variablesCount); //$NON-NLS-1$
		for (int i = 0; i < variablesCount; i++) {
			long codeIndex = in.readLong();
			String name = readString(in);
			String signature = readString(in);
			String genericSignature = readString(in);
			int length = in.readInt();
			int slotId = in.readInt();
			println("First code index:", codeIndex); //$NON-NLS-1$
			println("Variable name:", name); //$NON-NLS-1$
			println("Variable type signature:", signature); //$NON-NLS-1$
			println("Var. type generic signature:", genericSignature); //$NON-NLS-1$
			println("Code index length:", length); //$NON-NLS-1$
			println("Slot id:", slotId); //$NON-NLS-1$
		}
	}

	private void printOrDefaultCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long objectId = readObjectID(in);
		println("Object id:", objectId); //$NON-NLS-1$
	}

	private void printOrReferenceTypeReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		byte refTypeTag = in.readByte();
		long typeId = readReferenceTypeID(in);
		printRefTypeTag(refTypeTag);
		printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
	}

	private void printOrGetValuesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long objectId = readObjectID(in);
		int fieldsCount = in.readInt();
		println("Object id:", objectId); //$NON-NLS-1$
		println("Fields count:", fieldsCount); //$NON-NLS-1$
		for (int i = 0; i < fieldsCount; i++) {
			long fieldId = readFieldID(in);
			println("Field id:", fieldId); //$NON-NLS-1$
		}
	}

	private void printOrGetValuesReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int valuesCount = in.readInt();
		println("Values count:", valuesCount); //$NON-NLS-1$
		for (int i = 0; i < valuesCount; i++) {
			readAndPrintlnTaggedValue("Value:", in); //$NON-NLS-1$
		}
	}

	private void printOrSetValuesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long objectId = readObjectID(in);
		int fieldsCount = in.readInt();
		println("Object id:", objectId); //$NON-NLS-1$
		println("Fields count:", fieldsCount); //$NON-NLS-1$
		throw new UnableToParseDataException(
				"List of values: NOT MANAGED", remainderData(in)); //$NON-NLS-1$
	}

	private void printOrMonitorInfoReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long ownerThreadId = readObjectID(in);
		int entryCount = in.readInt();
		int waiters = in.readInt();
		printlnObjectId("Owner thread id:", ownerThreadId); //$NON-NLS-1$
		println("Entry count:", entryCount); //$NON-NLS-1$
		println("Nb of waiters:", waiters); //$NON-NLS-1$
		long waiterThreadId;
		for (int i = 0; i < waiters; i++) {
			waiterThreadId = readObjectID(in);
			printlnObjectId("Waiting thread id:", waiterThreadId); //$NON-NLS-1$
		}
	}

	private void printOrInvokeMethodCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long objectId = readObjectID(in);
		long threadId = readObjectID(in);
		long classTypeId = readReferenceTypeID(in);
		long methodId = readMethodID(in);
		int argsCount = in.readInt();
		printlnObjectId("Object id:", objectId); //$NON-NLS-1$
		printlnObjectId("Thread id:", threadId); //$NON-NLS-1$
		printlnReferenceTypeId("Class type id:", classTypeId); //$NON-NLS-1$
		printlnMethodId("Method id:", methodId); //$NON-NLS-1$
		println("Arguments count:", argsCount); //$NON-NLS-1$
		for (int i = 0; i < argsCount; i++) {
			readAndPrintlnTaggedValue("Argument:", in); //$NON-NLS-1$
		}
		int invocationOption = in.readInt();
		printInvocationOptions(invocationOption);
	}

	private void printOrInvokeMethodReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		readAndPrintlnTaggedValue("Return value:", in); //$NON-NLS-1$
		byte signatureByte = in.readByte();
		long exception = readObjectID(in);
		printlnTaggedObjectId("Exception object id:", exception, signatureByte); //$NON-NLS-1$
	}

	private void printOrIsCollectedReply(DataInputStream in) throws IOException {
		boolean isCollected = in.readBoolean();
		println("Is collected:", isCollected); //$NON-NLS-1$
	}

	private void printSrValueCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long stringObjectId = readObjectID(in);
		printlnObjectId("String object id:", stringObjectId); //$NON-NLS-1$
	}

	private void printSrValueReply(DataInputStream in) throws IOException {
		String value = readString(in);
		println("Value:", value); //$NON-NLS-1$
	}

	private void printTrDefaultCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long threadId = readObjectID(in);
		printlnObjectId("Thread id:", threadId); //$NON-NLS-1$
	}

	private void printTrNameReply(DataInputStream in) throws IOException {
		String threadName = readString(in);
		println("Name:", threadName); //$NON-NLS-1$
	}

	private void printTrStatusReply(DataInputStream in) throws IOException {
		int threadStatus = in.readInt();
		int suspendStatus = in.readInt();
		printThreadStatus(threadStatus);
		printSuspendStatus(suspendStatus);
	}

	private void printTrThreadGroupReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long threadGroupId = readObjectID(in);
		printlnObjectId("Thread group id:", threadGroupId); //$NON-NLS-1$
	}

	private void printTrFramesCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long threadId = readObjectID(in);
		int startFrame = in.readInt();
		int length = in.readInt();
		printlnObjectId("Thread id:", threadId); //$NON-NLS-1$
		println("First frame:", startFrame); //$NON-NLS-1$
		println("Number of frame:", length); //$NON-NLS-1$
	}

	private void printTrFramesReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int framesCount = in.readInt();
		println("Frames count:", framesCount); //$NON-NLS-1$
		for (int i = 0; i < framesCount; i++) {
			long frameId = readFrameID(in);
			printlnFrameId("Frame id:", frameId); //$NON-NLS-1$
			readAndPrintLocation(in);
		}
	}

	private void printTrFrameCountReply(DataInputStream in) throws IOException {
		int framesCount = in.readInt();
		println("Frames count:", framesCount); //$NON-NLS-1$
	}

	private void printTrOwnedMonitorsReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int monitorsCount = in.readInt();
		println("Monitors count:", monitorsCount); //$NON-NLS-1$
		for (int i = 0; i < monitorsCount; i++) {
			byte signatureByte = in.readByte();
			long monitorObjectId = readObjectID(in);
			printlnTaggedObjectId(
					"Monitor object id:", monitorObjectId, signatureByte); //$NON-NLS-1$
		}
	}

	private void printTrCurrentContendedMonitorReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		byte signatureByte = in.readByte();
		long monitorObjectId = readObjectID(in);
		printlnTaggedObjectId(
				"Monitor object id:", monitorObjectId, signatureByte); //$NON-NLS-1$
	}

	private void printTrStopCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long threadId = readObjectID(in);
		long exceptionObjectId = readObjectID(in);
		printlnObjectId("Thread id:", threadId); //$NON-NLS-1$
		printlnObjectId("Exception object id:", exceptionObjectId); //$NON-NLS-1$
	}

	private void printTrSuspendCountReply(DataInputStream in)
			throws IOException {
		int suspendCount = in.readInt();
		println("Suspend count:", suspendCount); //$NON-NLS-1$
	}

	private void printTgrDefaultCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long threadGroupId = readObjectID(in);
		printlnObjectId("Thread group id:", threadGroupId); //$NON-NLS-1$
	}

	private void printTgrNameReply(DataInputStream in) throws IOException {
		String name = readString(in);
		println("Name:", name); //$NON-NLS-1$
	}

	private void printTgrParentReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long parentThreadGroupId = readObjectID(in);
		printlnObjectId("Parent thread group id:", parentThreadGroupId); //$NON-NLS-1$
	}

	private void printTgrChildrenReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int childThreadsCount = in.readInt();
		println("Child threads count:", childThreadsCount); //$NON-NLS-1$
		for (int i = 0; i < childThreadsCount; i++) {
			long childThreadId = readObjectID(in);
			printlnObjectId("Child thread id:", childThreadId); //$NON-NLS-1$
		}
		int childGroupThreadsCount = in.readInt();
		println("Child group threads count:", childGroupThreadsCount); //$NON-NLS-1$
		for (int i = 0; i < childGroupThreadsCount; i++) {
			long childGroupThreadId = readObjectID(in);
			printlnObjectId("Child group thread id:", childGroupThreadId); //$NON-NLS-1$
		}
	}

	private void printArLengthCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long arrayObjectId = readObjectID(in);
		printlnObjectId("Array object id:", arrayObjectId); //$NON-NLS-1$
	}

	private void printArLengthReply(DataInputStream in) throws IOException {
		int length = in.readInt();
		println("Length:", length); //$NON-NLS-1$
	}

	private void printArGetValuesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long arrayObjectId = readObjectID(in);
		int firstIndex = in.readInt();
		int length = in.readInt();
		printlnObjectId("Array object id:", arrayObjectId); //$NON-NLS-1$
		println("First index:", firstIndex); //$NON-NLS-1$
		println("Length:", length); //$NON-NLS-1$
	}

	private void printArGetValuesReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		readAndPrintArrayRegion(in);
	}

	private void printArSetValuesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long arrayObjectId = readObjectID(in);
		int firstIndex = in.readInt();
		int length = in.readInt();
		printlnObjectId("Array object id:", arrayObjectId); //$NON-NLS-1$
		println("First index:", firstIndex); //$NON-NLS-1$
		println("Length:", length); //$NON-NLS-1$
		throw new UnableToParseDataException(
				"List of values: NOT MANAGED", remainderData(in)); //$NON-NLS-1$
	}

	private void printClrVisibleClassesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long classLoaderObjectId = readObjectID(in);
		printlnObjectId("Class loader object id:", classLoaderObjectId); //$NON-NLS-1$
	}

	private void printClrVisibleClassesReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		int classesCount = in.readInt();
		println("Classes count:", classesCount); //$NON-NLS-1$
		for (int i = 0; i < classesCount; i++) {
			byte refTypeTag = in.readByte();
			long typeId = readReferenceTypeID(in);
			printRefTypeTag(refTypeTag);
			printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
		}
	}

	private void printErSetCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		byte eventKind = in.readByte();
		byte suspendPolicy = in.readByte();
		int modifiersCount = in.readInt();
		printEventKind(eventKind);
		printSuspendPolicy(suspendPolicy);
		println("Modifiers count:", modifiersCount); //$NON-NLS-1$
		for (int i = 0; i < modifiersCount; i++) {
			byte modKind = in.readByte();
			printDescription("Modifier kind:"); //$NON-NLS-1$
			printHex(modKind);
			switch (modKind) {
			case 1: // count
				println(" (Count)"); //$NON-NLS-1$
				int count = in.readInt();
				println("Count:", count); //$NON-NLS-1$
				break;
			case 2: // conditional
				println(" (Conditional)"); //$NON-NLS-1$
				int exprId = in.readInt();
				println("Expression id:", exprId); //$NON-NLS-1$
				break;
			case 3: // thread only
				println(" (ThreadOnly)"); //$NON-NLS-1$
				long threadId = readObjectID(in);
				printlnObjectId("Thread id:", threadId); //$NON-NLS-1$
				break;
			case 4: // class only
				println(" (ClassOnly)"); //$NON-NLS-1$
				long classId = readReferenceTypeID(in);
				printlnReferenceTypeId("Class type id:", classId); //$NON-NLS-1$
				break;
			case 5: // class match
				println(" (ClassMatch)"); //$NON-NLS-1$
				String classPatern = readString(in);
				println("Class pattern:", classPatern); //$NON-NLS-1$
				break;
			case 6: // class exclude
				println(" (ClassExclude)"); //$NON-NLS-1$
				classPatern = readString(in);
				println("Class pattern:", classPatern); //$NON-NLS-1$
				break;
			case 7: // location only
				println(" (LocationOnly)"); //$NON-NLS-1$
				readAndPrintLocation(in);
				break;
			case 8: // exception only
				println(" (ExceptionOnly)"); //$NON-NLS-1$
				long typeId = readReferenceTypeID(in);
				boolean caught = in.readBoolean();
				boolean uncaught = in.readBoolean();
				printlnReferenceTypeId("Exception type id:", typeId); //$NON-NLS-1$
				println("Caught:", caught); //$NON-NLS-1$
				println("Uncaught:", uncaught); //$NON-NLS-1$
				break;
			case 9: // field only
				println(" (FieldOnly)"); //$NON-NLS-1$
				long declaringTypeId = readReferenceTypeID(in);
				long fieldId = readFieldID(in);
				printlnReferenceTypeId("Declaring type id:", declaringTypeId); //$NON-NLS-1$
				printlnFieldId("Field id:", fieldId); //$NON-NLS-1$
				break;
			case 10: // step
				println(" (Step)"); //$NON-NLS-1$
				threadId = readObjectID(in);
				int stepSize = in.readInt();
				int stepDepth = in.readInt();
				printlnObjectId("Thread id:", threadId); //$NON-NLS-1$
				printStepSize(stepSize);
				printStepDepth(stepDepth);
				break;
			case 11: // instance only
				println(" (InstanceOnly)"); //$NON-NLS-1$
				long objectId = readObjectID(in);
				printlnObjectId("Object id:", objectId); //$NON-NLS-1$
				break;
			}
		}
	}

	private void printErSetReply(DataInputStream in) throws IOException {
		int requestId = in.readInt();
		println("Request id:", requestId); //$NON-NLS-1$
	}

	private void printErClearCommand(DataInputStream in) throws IOException {
		byte eventKind = in.readByte();
		int requestId = in.readInt();
		printEventKind(eventKind);
		println("Request id:", requestId); //$NON-NLS-1$
	}

	private void printSfDefaultCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		long threadId = readObjectID(in);
		long frameId = readFrameID(in);
		printlnObjectId("Thread object id:", threadId); //$NON-NLS-1$
		printlnFrameId("Frame id:", frameId); //$NON-NLS-1$
	}

	private void printSfGetValuesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long threadId = readObjectID(in);
		long frameId = readFrameID(in);
		int slotsCount = in.readInt();
		printlnObjectId("Thread object id:", threadId); //$NON-NLS-1$
		printlnFrameId("Frame id:", frameId); //$NON-NLS-1$
		println("Slots count:", slotsCount); //$NON-NLS-1$
		for (int i = 0; i < slotsCount; i++) {
			int slotIndex = in.readInt();
			byte signatureTag = in.readByte();
			println("Slot index:", slotIndex); //$NON-NLS-1$
			printDescription("Signature tag:"); //$NON-NLS-1$
			printSignatureByte(signatureTag, true);
			println();
		}
	}

	private void printSfGetValuesReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		int valuesCount = in.readInt();
		println("Values count:", valuesCount); //$NON-NLS-1$
		for (int i = 0; i < valuesCount; i++) {
			readAndPrintlnTaggedValue("Value:", in); //$NON-NLS-1$
		}
	}

	private void printSfSetValuesCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long threadId = readObjectID(in);
		long frameId = readFrameID(in);
		int slotsCount = in.readInt();
		printlnObjectId("Thread object id:", threadId); //$NON-NLS-1$
		printlnFrameId("Frame id:", frameId); //$NON-NLS-1$
		println("Slots count:", slotsCount); //$NON-NLS-1$
		for (int i = 0; i < slotsCount; i++) {
			int slotIndex = in.readInt();
			println("Slot index:", slotIndex); //$NON-NLS-1$
			readAndPrintlnTaggedValue("Values:", in); //$NON-NLS-1$
		}
	}

	private void printSfThisObjectReply(DataInputStream in) throws IOException,
			UnableToParseDataException {
		byte signatureByte = in.readByte();
		long objectId = readObjectID(in);
		printlnTaggedObjectId("'this' object id:", objectId, signatureByte); //$NON-NLS-1$
	}

	private void printCorReflectedTypeCommand(DataInputStream in)
			throws IOException, UnableToParseDataException {
		long classObjectId = readObjectID(in);
		printlnObjectId("Class object id:", classObjectId); //$NON-NLS-1$
	}

	private void printCorReflectedTypeReply(DataInputStream in)
			throws IOException, UnableToParseDataException {
		byte refTypeTag = in.readByte();
		long typeId = readReferenceTypeID(in);
		printRefTypeTag(refTypeTag);
		printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
	}

	private void printECompositeCommand(DataInputStream in) throws IOException,
			UnableToParseDataException {
		byte suspendPolicy = in.readByte();
		int eventsCount = in.readInt();
		printSuspendPolicy(suspendPolicy);
		println("Events count:", eventsCount); //$NON-NLS-1$
		for (int i = 0; i < eventsCount; i++) {
			byte eventKind = in.readByte();
			int requestId = in.readInt();
			printEventKind(eventKind);
			println("Request id:", requestId); //$NON-NLS-1$
			switch (eventKind) {
			case EVENTKIND_VM_START:
				long threadId = readObjectID(in);
				printlnObjectId("Initial thread object id:", threadId); //$NON-NLS-1$
				break;
			case EVENTKIND_SINGLE_STEP:
			case EVENTKIND_BREAKPOINT:
			case EVENTKIND_METHOD_ENTRY:
			case EVENTKIND_METHOD_EXIT:
				threadId = readObjectID(in);
				printlnObjectId("Thread object id:", threadId); //$NON-NLS-1$
				readAndPrintLocation(in);
				break;
			case EVENTKIND_EXCEPTION:
				threadId = readObjectID(in);
				readAndPrintLocation(in);
				byte signatureByte = in.readByte();
				long objectId = readObjectID(in);
				printlnTaggedObjectId(
						"Exception object id:", objectId, signatureByte); //$NON-NLS-1$
				readAndPrintLocation(in);
				break;
			case EVENTKIND_THREAD_START:
			case EVENTKIND_THREAD_DEATH:
				threadId = readObjectID(in);
				printlnObjectId("Thread object id:", threadId); //$NON-NLS-1$
				break;
			case EVENTKIND_CLASS_PREPARE:
				threadId = readObjectID(in);
				byte refTypeTag = in.readByte();
				long typeId = readReferenceTypeID(in);
				String typeSignature = readString(in);
				int status = in.readInt();
				printlnObjectId("Thread object id:", threadId); //$NON-NLS-1$
				printRefTypeTag(refTypeTag);
				printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
				println("Type signature:", typeSignature); //$NON-NLS-1$
				println("Status:", status); //$NON-NLS-1$
				break;
			case EVENTKIND_CLASS_UNLOAD:
				typeSignature = readString(in);
				println("Type signature:", typeSignature); //$NON-NLS-1$
				break;
			case EVENTKIND_FIELD_ACCESS:
				threadId = readObjectID(in);
				printlnObjectId("Thread object id:", threadId); //$NON-NLS-1$
				readAndPrintLocation(in);
				refTypeTag = in.readByte();
				typeId = readReferenceTypeID(in);
				long fieldId = readFieldID(in);
				signatureByte = in.readByte();
				objectId = readObjectID(in);
				printRefTypeTag(refTypeTag);
				printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
				printlnFieldId("Field id:", fieldId); //$NON-NLS-1$
				printlnTaggedObjectId("Object id:", objectId, signatureByte); //$NON-NLS-1$
				break;
			case EVENTKIND_FIELD_MODIFICATION:
				threadId = readObjectID(in);
				printlnObjectId("Thread object id:", threadId); //$NON-NLS-1$
				readAndPrintLocation(in);
				refTypeTag = in.readByte();
				typeId = readReferenceTypeID(in);
				fieldId = readFieldID(in);
				signatureByte = in.readByte();
				objectId = readObjectID(in);
				printRefTypeTag(refTypeTag);
				printlnReferenceTypeId("Type id:", typeId); //$NON-NLS-1$
				printlnFieldId("Field id:", fieldId); //$NON-NLS-1$
				printlnTaggedObjectId("Object id:", objectId, signatureByte); //$NON-NLS-1$
				readAndPrintlnTaggedValue("Value:", in); //$NON-NLS-1$
				break;
			case EVENTKIND_VM_DEATH:
				break;
			}
		}
	}

	/**
	 * Reads String from Jdwp stream. Read a UTF where length has 4 bytes, and
	 * not just 2. This code was based on the OTI Retysin source for readUTF.
	 */
	private static String readString(DataInputStream in) throws IOException {
		int utfSize = in.readInt();
		byte utfBytes[] = new byte[utfSize];
		in.readFully(utfBytes);
		/* Guess at buffer size */
		StringBuffer strBuffer = new StringBuffer(utfSize / 3 * 2);
		for (int i = 0; i < utfSize;) {
			int a = utfBytes[i] & 0xFF;
			if ((a >> 4) < 12) {
				strBuffer.append((char) a);
				i++;
			} else {
				int b = utfBytes[i + 1] & 0xFF;
				if ((a >> 4) < 14) {
					if ((b & 0xBF) == 0) {
						throw new UTFDataFormatException(
								"Second byte input does not match UTF Specification"); //$NON-NLS-1$
					}
					strBuffer.append((char) (((a & 0x1F) << 6) | (b & 0x3F)));
					i += 2;
				} else {
					int c = utfBytes[i + 2] & 0xFF;
					if ((a & 0xEF) > 0) {
						if (((b & 0xBF) == 0) || ((c & 0xBF) == 0)) {
							throw new UTFDataFormatException(
									"Second or third byte input does not mach UTF Specification_"); //$NON-NLS-1$
						}
						strBuffer.append((char) (((a & 0x0F) << 12)
								| ((b & 0x3F) << 6) | (c & 0x3F)));
						i += 3;
					} else {
						throw new UTFDataFormatException(
								"Input does not match UTF Specification"); //$NON-NLS-1$
					}
				}
			}
		}
		return strBuffer.toString();
	}

	private byte[] remainderData(DataInputStream in) throws IOException {
		byte[] buffer = new byte[100];
		byte[] res = new byte[0], newRes;
		int resLength = 0, length;
		while ((length = in.read(buffer)) != -1) {
			newRes = new byte[resLength + length];
			System.arraycopy(res, 0, newRes, 0, resLength);
			System.arraycopy(buffer, 0, newRes, resLength, length);
			res = newRes;
			resLength += length;
		}
		return res;
	}

	private long readObjectID(DataInputStream in) throws IOException,
			UnableToParseDataException {
		if (!TcpipSpy.hasSizes()) {
			throw new UnableToParseDataException(
					"Unable to parse remaining data", remainderData(in)); //$NON-NLS-1$
		}
		return readID(in, TcpipSpy.getObjectIDSize());
	}

	private long readReferenceTypeID(DataInputStream in) throws IOException,
			UnableToParseDataException {
		if (!TcpipSpy.hasSizes()) {
			throw new UnableToParseDataException(
					"Unable to parse remaining data", remainderData(in)); //$NON-NLS-1$
		}
		return readID(in, TcpipSpy.getReferenceTypeIDSize());
	}

	private long readFieldID(DataInputStream in) throws IOException,
			UnableToParseDataException {
		if (!TcpipSpy.hasSizes()) {
			throw new UnableToParseDataException(
					"Unable to parse remaining data", remainderData(in)); //$NON-NLS-1$
		}
		return readID(in, TcpipSpy.getFieldIDSize());
	}

	private long readMethodID(DataInputStream in) throws IOException,
			UnableToParseDataException {
		if (!TcpipSpy.hasSizes()) {
			throw new UnableToParseDataException(
					"Unable to parse remaining data", remainderData(in)); //$NON-NLS-1$
		}
		return readID(in, TcpipSpy.getMethodIDSize());
	}

	private long readFrameID(DataInputStream in) throws IOException,
			UnableToParseDataException {
		if (!TcpipSpy.hasSizes()) {
			throw new UnableToParseDataException(
					"Unable to parse remaining data", remainderData(in)); //$NON-NLS-1$
		}
		return readID(in, TcpipSpy.getFrameIDSize());
	}

	private long readID(DataInputStream in, int size) throws IOException {
		long id = 0;
		for (int i = 0; i < size; i++) {
			int b = in.readUnsignedByte(); // Note that the byte must be treated
											// as unsigned.
			id = id << 8 | b;
		}
		return id;
	}

	private void readAndPrintlnTaggedValue(String description,
			DataInputStream in) throws IOException, UnableToParseDataException {
		byte tag = in.readByte();
		readAndPrintlnUntaggedValue(description, in, tag, true);
	}

	private void readAndPrintlnUntaggedValue(String description,
			DataInputStream in, byte tag, boolean printTagValue)
			throws IOException, UnableToParseDataException {
		printDescription(description);
		int size;
		boolean isId = false;
		switch (tag) {
		case VOID_TAG:
			printSignatureByte(tag, printTagValue);
			println();
			return;
		case BOOLEAN_TAG:
			if (printTagValue) {
				printSignatureByte(tag, true);
				print(' ');
				println(in.readBoolean());
			} else {
				println(in.readBoolean());
				print(' ');
				printSignatureByte(tag, false);
			}
			return;
		case BYTE_TAG:
			size = 1;
			break;
		case CHAR_TAG:
		case SHORT_TAG:
			size = 2;
			break;
		case INT_TAG:
		case FLOAT_TAG:
			size = 4;
			break;
		case DOUBLE_TAG:
		case LONG_TAG:
			size = 8;
			break;
		case ARRAY_TAG:
		case OBJECT_TAG:
		case STRING_TAG:
		case THREAD_TAG:
		case THREAD_GROUP_TAG:
		case CLASS_LOADER_TAG:
		case CLASS_OBJECT_TAG:
			if (!TcpipSpy.hasSizes()) {
				throw new UnableToParseDataException(
						"Unable to parse remaining data", remainderData(in)); //$NON-NLS-1$
			}
			size = TcpipSpy.getObjectIDSize();
			isId = true;
			break;
		default:
			size = 0;
			break;
		}

		long value = readID(in, size);
		if (printTagValue) {
			printSignatureByte(tag, true);
			print(' ');
		}
		printHex(value, size);
		if (isId) {
			printParanthetical(value);
		} else {
			switch (tag) {
			case BYTE_TAG:
				printParanthetical((byte) value);
				break;
			case CHAR_TAG:
				printParanthetical((char) value);
				break;
			case SHORT_TAG:
				printParanthetical((short) value);
				break;
			case INT_TAG:
				printParanthetical((int) value);
				break;
			case FLOAT_TAG:
				printParanthetical(Float.intBitsToFloat((int) value));
				break;
			case DOUBLE_TAG:
				printParanthetical(Double.longBitsToDouble(value));
				break;
			case LONG_TAG:
				printParanthetical(value);
				break;
			}
		}
		if (!printTagValue) {
			print(' ');
			printSignatureByte(tag, false);
		}
		println();
	}

	private void printSignatureByte(byte signatureByte, boolean printValue) {
		String type;
		switch (signatureByte) {
		case VOID_TAG:
			type = "void"; //$NON-NLS-1$
			break;
		case BOOLEAN_TAG:
			type = "boolean"; //$NON-NLS-1$
			break;
		case BYTE_TAG:
			type = "byte"; //$NON-NLS-1$
			break;
		case CHAR_TAG:
			type = "char"; //$NON-NLS-1$
			break;
		case SHORT_TAG:
			type = "short"; //$NON-NLS-1$
			break;
		case INT_TAG:
			type = "int"; //$NON-NLS-1$
			break;
		case FLOAT_TAG:
			type = "float"; //$NON-NLS-1$
			break;
		case DOUBLE_TAG:
			type = "double"; //$NON-NLS-1$
			break;
		case LONG_TAG:
			type = "long"; //$NON-NLS-1$
			break;
		case ARRAY_TAG:
			type = "array id"; //$NON-NLS-1$
			break;
		case OBJECT_TAG:
			type = "object id"; //$NON-NLS-1$
			break;
		case STRING_TAG:
			type = "string id"; //$NON-NLS-1$
			break;
		case THREAD_TAG:
			type = "thread id"; //$NON-NLS-1$
			break;
		case THREAD_GROUP_TAG:
			type = "thread group id"; //$NON-NLS-1$
			break;
		case CLASS_LOADER_TAG:
			type = "class loader id"; //$NON-NLS-1$
			break;
		case CLASS_OBJECT_TAG:
			type = "class object id"; //$NON-NLS-1$
			break;
		default:
			type = "unknown"; //$NON-NLS-1$
			break;
		}
		if (printValue) {
			printHex(signatureByte);
			print(" ("); //$NON-NLS-1$
			print(signatureByte);
			print(" - "); //$NON-NLS-1$
		} else {
			print(" ("); //$NON-NLS-1$
		}
		print(type + ')');
	}

	private void readAndPrintLocation(DataInputStream in) throws IOException,
			UnableToParseDataException {
		byte typeTag = in.readByte();
		long classId = readReferenceTypeID(in);
		long methodId = readMethodID(in);
		long index = in.readLong();
		printlnReferenceTypeIdWithTypeTag(
				"Location: class id:", classId, typeTag); //$NON-NLS-1$
		printlnMethodId("          method id:", methodId); //$NON-NLS-1$
		println("          index:", index); //$NON-NLS-1$
	}

	private void readAndPrintArrayRegion(DataInputStream in)
			throws IOException, UnableToParseDataException {
		byte signatureByte = in.readByte();
		int valuesCount = in.readInt();
		printDescription("Signature byte:"); //$NON-NLS-1$
		printSignatureByte(signatureByte, true);
		println();
		println("Values count:", valuesCount); //$NON-NLS-1$
		switch (signatureByte) {
		case ARRAY_TAG:
		case OBJECT_TAG:
		case STRING_TAG:
		case THREAD_TAG:
		case THREAD_GROUP_TAG:
		case CLASS_LOADER_TAG:
		case CLASS_OBJECT_TAG:
			for (int i = 0; i < valuesCount; i++) {
				readAndPrintlnTaggedValue("Value", in); //$NON-NLS-1$
			}
			break;
		default:
			for (int i = 0; i < valuesCount; i++) {
				readAndPrintlnUntaggedValue("Value", in, signatureByte, false); //$NON-NLS-1$
			}
			break;
		}
	}

	protected void println(String description, int value) {
		printDescription(description);
		printHex(value);
		printParanthetical(value);
		println();
	}

	protected void println(String description, long value) {
		printDescription(description);
		printHex(value);
		printParanthetical(value);
		println();
	}

	protected void println(String description, String value) {
		printDescription(description);
		print('\"');
		StringBuffer val = new StringBuffer();
		int pos = 0, lastPos = 0;
		while ((pos = value.indexOf('\n', lastPos)) != -1) {
			pos++;
			val.append(value.substring(lastPos, pos));
			val.append(shift);
			lastPos = pos;
		}
		val.append(value.substring(lastPos, value.length()));
		print(val);
		println('"');
	}

	protected void println(String description, boolean value) {
		printDescription(description);
		println(value);
	}

	protected void printlnReferenceTypeId(String description, long value) {
		println(description, value, TcpipSpy.getReferenceTypeIDSize());
	}

	protected void printlnReferenceTypeIdWithTypeTag(String description,
			long value, byte typeTag) {
		printDescription(description);
		printRefTypeTagValue(typeTag);
		print(" - "); //$NON-NLS-1$
		printHex(value, TcpipSpy.getReferenceTypeIDSize());
		printParanthetical(value);
		println();
	}

	protected void printlnObjectId(String description, long value) {
		printDescription(description);
		printHex(value, TcpipSpy.getObjectIDSize());
		if (value == 0) {
			println(" (NULL)"); //$NON-NLS-1$
		} else {
			printParanthetical(value);
			println();
		}
	}

	protected void printlnTaggedObjectId(String description, long value,
			byte signatureByte) {
		printDescription(description);
		printSignatureByte(signatureByte, true);
		print(' ');
		printHex(value, TcpipSpy.getReferenceTypeIDSize());
		if (value == 0) {
			println(" (NULL)"); //$NON-NLS-1$
		} else {
			printParanthetical(value);
			println();
		}
	}

	protected void printlnFieldId(String description, long value) {
		println(description, value, TcpipSpy.getFieldIDSize());
	}

	protected void printlnMethodId(String description, long value) {
		println(description, value, TcpipSpy.getMethodIDSize());
	}

	protected void printlnFrameId(String description, long value) {
		println(description, value, TcpipSpy.getFrameIDSize());
	}

	protected void println(String description, long value, int size) {
		printDescription(description);
		printHex(value, size);
		printParanthetical(value);
		println();
	}

	protected void printDescription(String description) {
		// current max length = 36 (+2 pad)
		int width = 38 - description.length();
		print(description);
		write(padding, 0, width);
	}

	protected void printHexString(String hex, int width) {
		width -= hex.length();
		print("0x"); //$NON-NLS-1$
		write(zeros, 0, width);
		print(hex);
	}

	protected void printHex(long l, int byteNumber) {
		printHexString(Long.toHexString(l).toUpperCase(), byteNumber * 2);
	}

	protected void printHex(byte b) {
		printHexString(Integer.toHexString(b & 0xFF).toUpperCase(), 2);
	}

	protected void printHex(int i) {
		printHexString(Integer.toHexString(i).toUpperCase(), 8);
	}

	protected void printHex(long l) {
		printHexString(Long.toHexString(l).toUpperCase(), 16);
	}

	protected void printHex(byte[] b) {
		if (b == null) {
			println("NULL"); //$NON-NLS-1$
			return;
		}
		int i, length;
		for (i = 0, length = b.length; i < length; i++) {
			String hexa = Integer.toHexString(b[i]).toUpperCase();
			if (hexa.length() == 1) {
				print('0');
			}
			print(hexa);
			if ((i % 32) == 0 && i != 0) {
				println();
				print(shift);
			} else {
				print(' ');
			}
		}
		println();
	}

	protected void printParanthetical(byte i) {
		print(" ("); //$NON-NLS-1$
		print(i);
		print(')');
	}

	protected void printParanthetical(char i) {
		print(" ("); //$NON-NLS-1$
		print(i);
		print(')');
	}

	protected void printParanthetical(short i) {
		print(" ("); //$NON-NLS-1$
		print(i);
		print(')');
	}

	protected void printParanthetical(int i) {
		print(" ("); //$NON-NLS-1$
		print(i);
		print(')');
	}

	protected void printParanthetical(long l) {
		print(" ("); //$NON-NLS-1$
		print(l);
		print(')');
	}

	protected void printParanthetical(float f) {
		print(" ("); //$NON-NLS-1$
		print(f);
		print(')');
	}

	protected void printParanthetical(double d) {
		print(" ("); //$NON-NLS-1$
		print(d);
		print(')');
	}

	protected void printParanthetical(String s) {
		print(" ("); //$NON-NLS-1$
		print(s);
		print(')');
	}

}
