/*******************************************************************************
 * Copyright (c) 2000, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jesper Steen Møller <jesper@selskabet.org> - Bug 430839
 *******************************************************************************/
package org.eclipse.jdi.internal.jdwp;

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

/**
 * This class implements the corresponding Java Debug Wire Protocol (JDWP)
 * packet declared by the JDWP specification.
 *
 */
public class JdwpCommandPacket extends JdwpPacket {
	/** Command Sets. */
	public static final int CSET_VIRTUAL_MACHINE = 1;
	public static final int CSET_REFERENCE_TYPE = 2;
	public static final int CSET_CLASS_TYPE = 3;
	public static final int CSET_ARRAY_TYPE = 4;
	public static final int CSET_INTERFACE_TYPE = 5;
	public static final int CSET_METHOD = 6;
	public static final int CSET_FIELD = 8;
	public static final int CSET_OBJECT_REFERENCE = 9;
	public static final int CSET_STRING_REFERENCE = 10;
	public static final int CSET_THREAD_REFERENCE = 11;
	public static final int CSET_THREAD_GROUP_REFERENCE = 12;
	public static final int CSET_ARRAY_REFERENCE = 13;
	public static final int CSET_CLASS_LOADER_REFERENCE = 14;
	public static final int CSET_EVENT_REQUEST = 15;
	public static final int CSET_STACK_FRAME = 16;
	public static final int CSET_CLASS_OBJECT_REFERENCE = 17;
	public static final int CSET_EVENT = 64;
	public static final int CSET_HOT_CODE_REPLACEMENT = 128;

	/** Commands VirtualMachine. */
	public static final int VM_VERSION = 1 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_CLASSES_BY_SIGNATURE = 2 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_ALL_CLASSES = 3 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_ALL_THREADS = 4 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_TOP_LEVEL_THREAD_GROUPS = 5 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_DISPOSE = 6 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_ID_SIZES = 7 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_SUSPEND = 8 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_RESUME = 9 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_EXIT = 10 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_CREATE_STRING = 11 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_CAPABILITIES = 12 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_CLASS_PATHS = 13 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_DISPOSE_OBJECTS = 14 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_HOLD_EVENTS = 15 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_RELEASE_EVENTS = 16 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_CAPABILITIES_NEW = 17 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_REDEFINE_CLASSES = 18 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_SET_DEFAULT_STRATUM = 19 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_ALL_CLASSES_WITH_GENERIC = 20 + (CSET_VIRTUAL_MACHINE << 8);
	public static final int VM_INSTANCE_COUNTS = 21 + (CSET_VIRTUAL_MACHINE << 8);

	/** Commands ReferenceType. */
	public static final int RT_SIGNATURE = 1 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_CLASS_LOADER = 2 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_MODIFIERS = 3 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_FIELDS = 4 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_METHODS = 5 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_GET_VALUES = 6 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_SOURCE_FILE = 7 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_NESTED_TYPES = 8 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_STATUS = 9 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_INTERFACES = 10 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_CLASS_OBJECT = 11 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_SOURCE_DEBUG_EXTENSION = 12 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_SIGNATURE_WITH_GENERIC = 13 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_FIELDS_WITH_GENERIC = 14 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_METHODS_WITH_GENERIC = 15 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_INSTANCES = 16 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_CLASS_VERSION = 17 + (CSET_REFERENCE_TYPE << 8);
	public static final int RT_CONSTANT_POOL = 18 + (CSET_REFERENCE_TYPE << 8);

	/** Commands ClassType. */
	public static final int CT_SUPERCLASS = 1 + (CSET_CLASS_TYPE << 8);
	public static final int CT_SET_VALUES = 2 + (CSET_CLASS_TYPE << 8);
	public static final int CT_INVOKE_METHOD = 3 + (CSET_CLASS_TYPE << 8);
	public static final int CT_NEW_INSTANCE = 4 + (CSET_CLASS_TYPE << 8);

	/** Commands InterfaceType. */
	public static final int IT_INVOKE_METHOD = 1 + (CSET_INTERFACE_TYPE << 8);

	/** Commands ArrayType. */
	public static final int AT_NEW_INSTANCE = 1 + (CSET_ARRAY_TYPE << 8);

	/** Commands Method. */
	public static final int M_LINE_TABLE = 1 + (CSET_METHOD << 8);
	public static final int M_VARIABLE_TABLE = 2 + (CSET_METHOD << 8);
	public static final int M_BYTECODES = 3 + (CSET_METHOD << 8);
	public static final int M_OBSOLETE = 4 + (CSET_METHOD << 8);
	public static final int M_VARIABLE_TABLE_WITH_GENERIC = 5 + (CSET_METHOD << 8);

	/** Commands ObjectReference. */
	public static final int OR_REFERENCE_TYPE = 1 + (CSET_OBJECT_REFERENCE << 8);
	public static final int OR_GET_VALUES = 2 + (CSET_OBJECT_REFERENCE << 8);
	public static final int OR_SET_VALUES = 3 + (CSET_OBJECT_REFERENCE << 8);
	public static final int OR_MONITOR_INFO = 5 + (CSET_OBJECT_REFERENCE << 8);
	public static final int OR_INVOKE_METHOD = 6 + (CSET_OBJECT_REFERENCE << 8);
	public static final int OR_DISABLE_COLLECTION = 7 + (CSET_OBJECT_REFERENCE << 8);
	public static final int OR_ENABLE_COLLECTION = 8 + (CSET_OBJECT_REFERENCE << 8);
	public static final int OR_IS_COLLECTED = 9 + (CSET_OBJECT_REFERENCE << 8);
	public static final int OR_REFERRING_OBJECTS = 10 + (CSET_OBJECT_REFERENCE << 8);

	/** Commands StringReference. */
	public static final int SR_VALUE = 1 + (CSET_STRING_REFERENCE << 8);

	/** Commands ThreadReference. */
	public static final int TR_NAME = 1 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_SUSPEND = 2 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_RESUME = 3 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_STATUS = 4 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_THREAD_GROUP = 5 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_FRAMES = 6 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_FRAME_COUNT = 7 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_OWNED_MONITORS = 8 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_CURRENT_CONTENDED_MONITOR = 9 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_STOP = 10 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_INTERRUPT = 11 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_SUSPEND_COUNT = 12 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_OWNED_MONITOR_STACK_DEPTH = 13 + (CSET_THREAD_REFERENCE << 8);
	public static final int TR_FORCE_EARLY_RETURN = 14 + (CSET_THREAD_REFERENCE << 8);

	/** Commands ThreadGroupReference. */
	public static final int TGR_NAME = 1 + (CSET_THREAD_GROUP_REFERENCE << 8);
	public static final int TGR_PARENT = 2 + (CSET_THREAD_GROUP_REFERENCE << 8);
	public static final int TGR_CHILDREN = 3 + (CSET_THREAD_GROUP_REFERENCE << 8);

	/** Commands ArrayReference. */
	public static final int AR_LENGTH = 1 + (CSET_ARRAY_REFERENCE << 8);
	public static final int AR_GET_VALUES = 2 + (CSET_ARRAY_REFERENCE << 8);
	public static final int AR_SET_VALUES = 3 + (CSET_ARRAY_REFERENCE << 8);

	/** Commands ClassLoaderReference. */
	public static final int CLR_VISIBLE_CLASSES = 1 + (CSET_CLASS_LOADER_REFERENCE << 8);

	/** Commands EventRequest. */
	public static final int ER_SET = 1 + (CSET_EVENT_REQUEST << 8);
	public static final int ER_CLEAR = 2 + (CSET_EVENT_REQUEST << 8);
	public static final int ER_CLEAR_ALL_BREAKPOINTS = 3 + (CSET_EVENT_REQUEST << 8);

	/** Commands StackFrame. */
	public static final int SF_GET_VALUES = 1 + (CSET_STACK_FRAME << 8);
	public static final int SF_SET_VALUES = 2 + (CSET_STACK_FRAME << 8);
	public static final int SF_THIS_OBJECT = 3 + (CSET_STACK_FRAME << 8);
	public static final int SF_POP_FRAME = 4 + (CSET_STACK_FRAME << 8);

	/** Commands ClassObjectReference. */
	public static final int COR_REFLECTED_TYPE = 1 + (CSET_CLASS_OBJECT_REFERENCE << 8);

	/** Commands Event. */
	public static final int E_COMPOSITE = 100 + (CSET_EVENT << 8);

	/** Commands Hot Code Replacement (OTI specific). */
	public static final int HCR_CLASSES_HAVE_CHANGED = 1 + (CSET_HOT_CODE_REPLACEMENT << 8);
	public static final int HCR_GET_CLASS_VERSION = 2 + (CSET_HOT_CODE_REPLACEMENT << 8);
	public static final int HCR_DO_RETURN = 3 + (CSET_HOT_CODE_REPLACEMENT << 8);
	public static final int HCR_REENTER_ON_EXIT = 4 + (CSET_HOT_CODE_REPLACEMENT << 8);
	public static final int HCR_CAPABILITIES = 5 + (CSET_HOT_CODE_REPLACEMENT << 8);

	/** Mapping of command codes to strings. */
	private static Map<Integer, String> fgCommandMap = null;

	/** Next id to be assigned. */
	private static int fgNextId = 1;
	/**
	 * Command, note that this field is 256 * JDWP CommandSet (unsigned) + JDWP
	 * Command.
	 */
	private int fCommand;

	/**
	 * Creates new JdwpCommandPacket.
	 */
	protected JdwpCommandPacket() {
	}

	/**
	 * Creates new JdwpCommandPacket.
	 */
	public JdwpCommandPacket(int command) {
		setCommand(command);
		setId(getNewId());
	}

	/**
	 * @return Returns unique id for command packet.
	 */
	public static synchronized int getNewId() {
		return fgNextId++;
	}

	/**
	 * @return Returns JDWP command set of packet.
	 */
	public byte getCommandSet() {
		return (byte) (fCommand >>> 8);
	}

	/**
	 * @return Returns 256 * JDWP CommandSet (unsigned) + JDWP Command.
	 */
	public int getCommand() {
		return fCommand;
	}

	/**
	 * Assigns command (256 * JDWP CommandSet (unsigned) + JDWP Command)
	 */
	public void setCommand(int command) {
		fCommand = command;
	}

	/**
	 * Reads header fields that are specific for this type of packet.
	 */
	@Override
	protected int readSpecificHeaderFields(byte[] bytes, int index) {
		byte commandSet = bytes[index];
		fCommand = bytes[index + 1] + (commandSet << 8);
		return 2;
	}

	/**
	 * Writes header fields that are specific for this type of packet.
	 */
	@Override
	protected int writeSpecificHeaderFields(byte[] bytes, int index)
			throws IOException {
		bytes[index] = getCommandSet();
		bytes[index + 1] = (byte) fCommand;
		return 2;
	}

	/**
	 * Retrieves constant mappings.
	 */
	public static void getConstantMaps() {
		if (fgCommandMap != null) {
			return;
		}

		Field[] fields = JdwpCommandPacket.class.getDeclaredFields();

		// First get the set names.
		Map<Integer, String> setNames = new HashMap<>(fields.length);
		for (Field field : fields) {
			if ((field.getModifiers() & Modifier.PUBLIC) == 0
					|| (field.getModifiers() & Modifier.STATIC) == 0
					|| (field.getModifiers() & Modifier.FINAL) == 0)
				continue;

			try {
				String name = field.getName();
				// If it is not a set, continue.
				if (!name.startsWith("CSET_")) {//$NON-NLS-1$
					continue;
				}
				int value = field.getInt(null);
				setNames.put(Integer.valueOf(value), removePrefix(name));
			} catch (IllegalAccessException e) {
				// Will not occur for own class.
			} catch (IllegalArgumentException e) {
				// Should not occur.
				// We should take care that all public static final constants
				// in this class are numbers that are convertible to int.
			}
		}

		// Get the commands.
		fgCommandMap = new HashMap<>();
		for (Field field : fields) {
			if ((field.getModifiers() & Modifier.PUBLIC) == 0
					|| (field.getModifiers() & Modifier.STATIC) == 0
					|| (field.getModifiers() & Modifier.FINAL) == 0) {
				continue;
			}

			try {
				String name = field.getName();

				// If it is a set, continue.
				if (name.startsWith("CSET_")) { //$NON-NLS-1$
					continue;
				}
				Integer val = (Integer) field.get(null);
				int value = val.intValue();
				int set = value >>> 8;
				String setName = setNames.get(Integer.valueOf(set));
				String entryName = setName + " - " + removePrefix(name); //$NON-NLS-1$

				fgCommandMap.put(val, entryName);

			} catch (IllegalAccessException e) {
				// Will not occur for own class.
			}
		}
	}

	/**
	 * @return Returns a map with string representations of error codes.
	 */
	public static Map<Integer, String> commandMap() {
		getConstantMaps();
		return fgCommandMap;
	}

	/**
	 * @return Returns string without XXX_ prefix.
	 */
	public static String removePrefix(String str) {
		int i = str.indexOf('_');
		if (i < 0) {
			return str;
		}
		return str.substring(i + 1);
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		StringBuilder buffer = new StringBuilder();
		buffer.append('[');
		buffer.append(getId());
		buffer.append("] "); //$NON-NLS-1$
		switch (getCommand()) {

		/** Commands VirtualMachine. */
		case VM_VERSION:
			buffer.append("VM_VERSION"); //$NON-NLS-1$
			break;
		case VM_CLASSES_BY_SIGNATURE:
			buffer.append("VM_CLASSES_BY_SIGNATURE"); //$NON-NLS-1$
			break;
		case VM_ALL_CLASSES:
			buffer.append("VM_ALL_CLASSES"); //$NON-NLS-1$
			break;
		case VM_ALL_THREADS:
			buffer.append("VM_ALL_THREADS"); //$NON-NLS-1$
			break;
		case VM_TOP_LEVEL_THREAD_GROUPS:
			buffer.append("VM_TOP_LEVEL_THREAD_GROUPS"); //$NON-NLS-1$
			break;
		case VM_DISPOSE:
			buffer.append("VM_DISPOSE"); //$NON-NLS-1$
			break;
		case VM_ID_SIZES:
			buffer.append("VM_ID_SIZES"); //$NON-NLS-1$
			break;
		case VM_SUSPEND:
			buffer.append("VM_SUSPEND"); //$NON-NLS-1$
			break;
		case VM_RESUME:
			buffer.append("VM_RESUME"); //$NON-NLS-1$
			break;
		case VM_EXIT:
			buffer.append("VM_EXIT"); //$NON-NLS-1$
			break;
		case VM_CREATE_STRING:
			buffer.append("VM_CREATE_STRING"); //$NON-NLS-1$
			break;
		case VM_CAPABILITIES:
			buffer.append("VM_CAPABILITIES"); //$NON-NLS-1$
			break;
		case VM_CLASS_PATHS:
			buffer.append("VM_CLASS_PATHS"); //$NON-NLS-1$
			break;
		case VM_DISPOSE_OBJECTS:
			buffer.append("VM_DISPOSE_OBJECTS"); //$NON-NLS-1$
			break;
		case VM_HOLD_EVENTS:
			buffer.append("VM_HOLD_EVENTS"); //$NON-NLS-1$
			break;
		case VM_RELEASE_EVENTS:
			buffer.append("VM_RELEASE_EVENTS"); //$NON-NLS-1$
			break;
		case VM_CAPABILITIES_NEW:
			buffer.append("VM_CAPABILITIES_NEW"); //$NON-NLS-1$
			break;
		case VM_REDEFINE_CLASSES:
			buffer.append("VM_REDEFINE_CLASSES"); //$NON-NLS-1$
			break;
		case VM_SET_DEFAULT_STRATUM:
			buffer.append("VM_SET_DEFAULT_STRATUM"); //$NON-NLS-1$
			break;
		case VM_ALL_CLASSES_WITH_GENERIC:
			buffer.append("VM_ALL_CLASSES_WITH_GENERIC"); //$NON-NLS-1$
			break;

		/** Commands ReferenceType. */
		case RT_SIGNATURE:
			buffer.append("RT_SIGNATURE"); //$NON-NLS-1$
			break;
		case RT_CLASS_LOADER:
			buffer.append("RT_CLASS_LOADER"); //$NON-NLS-1$
			break;
		case RT_MODIFIERS:
			buffer.append("RT_MODIFIERS"); //$NON-NLS-1$
			break;
		case RT_FIELDS:
			buffer.append("RT_FIELDS"); //$NON-NLS-1$
			break;
		case RT_METHODS:
			buffer.append("RT_METHODS"); //$NON-NLS-1$
			break;
		case RT_GET_VALUES:
			buffer.append("RT_GET_VALUES"); //$NON-NLS-1$
			break;
		case RT_SOURCE_FILE:
			buffer.append("RT_SOURCE_FILE"); //$NON-NLS-1$
			break;
		case RT_NESTED_TYPES:
			buffer.append("RT_NESTED_TYPES"); //$NON-NLS-1$
			break;
		case RT_STATUS:
			buffer.append("RT_STATUS"); //$NON-NLS-1$
			break;
		case RT_INTERFACES:
			buffer.append("RT_INTERFACES"); //$NON-NLS-1$
			break;
		case RT_CLASS_OBJECT:
			buffer.append("RT_CLASS_OBJECT"); //$NON-NLS-1$
			break;
		case RT_SOURCE_DEBUG_EXTENSION:
			buffer.append("RT_SOURCE_DEBUG_EXTENSION"); //$NON-NLS-1$
			break;
		case RT_SIGNATURE_WITH_GENERIC:
			buffer.append("RT_SIGNATURE_WITH_GENERIC"); //$NON-NLS-1$
			break;
		case RT_FIELDS_WITH_GENERIC:
			buffer.append("RT_FIELDS_WITH_GENERIC"); //$NON-NLS-1$
			break;
		case RT_METHODS_WITH_GENERIC:
			buffer.append("RT_METHODS_WITH_GENERIC"); //$NON-NLS-1$
			break;

		/** Commands ClassType. */
		case CT_SUPERCLASS:
			buffer.append("CT_SUPERCLASS"); //$NON-NLS-1$
			break;
		case CT_SET_VALUES:
			buffer.append("CT_SET_VALUES"); //$NON-NLS-1$
			break;
		case CT_INVOKE_METHOD:
			buffer.append("CT_INVOKE_METHOD"); //$NON-NLS-1$
			break;
		case CT_NEW_INSTANCE:
			buffer.append("CT_NEW_INSTANCE"); //$NON-NLS-1$
			break;

		/** Commands ArrayType. */
		case AT_NEW_INSTANCE:
			buffer.append("AT_NEW_INSTANCE"); //$NON-NLS-1$
			break;

		/** Commands Method. */
		case M_LINE_TABLE:
			buffer.append("M_LINE_TABLE"); //$NON-NLS-1$
			break;
		case M_VARIABLE_TABLE:
			buffer.append("M_VARIABLE_TABLE"); //$NON-NLS-1$
			break;
		case M_BYTECODES:
			buffer.append("M_BYTECODES"); //$NON-NLS-1$
			break;
		case M_OBSOLETE:
			buffer.append("M_OBSOLETE"); //$NON-NLS-1$
			break;
		case M_VARIABLE_TABLE_WITH_GENERIC:
			buffer.append("M_VARIABLE_TABLE_WITH_GENERIC"); //$NON-NLS-1$
			break;

		/** Commands ObjectReference. */
		case OR_REFERENCE_TYPE:
			buffer.append("OR_REFERENCE_TYPE"); //$NON-NLS-1$
			break;
		case OR_GET_VALUES:
			buffer.append("OR_GET_VALUES"); //$NON-NLS-1$
			break;
		case OR_SET_VALUES:
			buffer.append("OR_SET_VALUES"); //$NON-NLS-1$
			break;
		case OR_MONITOR_INFO:
			buffer.append("OR_MONITOR_INFO"); //$NON-NLS-1$
			break;
		case OR_INVOKE_METHOD:
			buffer.append("OR_INVOKE_METHOD"); //$NON-NLS-1$
			break;
		case OR_DISABLE_COLLECTION:
			buffer.append("OR_DISABLE_COLLECTION"); //$NON-NLS-1$
			break;
		case OR_ENABLE_COLLECTION:
			buffer.append("OR_ENABLE_COLLECTION"); //$NON-NLS-1$
			break;
		case OR_IS_COLLECTED:
			buffer.append("OR_IS_COLLECTED"); //$NON-NLS-1$
			break;

		/** Commands StringReference. */
		case SR_VALUE:
			buffer.append("SR_VALUE"); //$NON-NLS-1$
			break;

		/** Commands ThreadReference. */
		case TR_NAME:
			buffer.append("TR_NAME"); //$NON-NLS-1$
			break;
		case TR_SUSPEND:
			buffer.append("TR_SUSPEND"); //$NON-NLS-1$
			break;
		case TR_RESUME:
			buffer.append("TR_RESUME"); //$NON-NLS-1$
			break;
		case TR_STATUS:
			buffer.append("TR_STATUS"); //$NON-NLS-1$
			break;
		case TR_THREAD_GROUP:
			buffer.append("TR_THREAD_GROUP"); //$NON-NLS-1$
			break;
		case TR_FRAMES:
			buffer.append("TR_FRAMES"); //$NON-NLS-1$
			break;
		case TR_FRAME_COUNT:
			buffer.append("TR_FRAME_COUNT"); //$NON-NLS-1$
			break;
		case TR_OWNED_MONITORS:
			buffer.append("TR_OWNED_MONITORS"); //$NON-NLS-1$
			break;
		case TR_CURRENT_CONTENDED_MONITOR:
			buffer.append("TR_CURRENT_CONTENDED_MONITOR"); //$NON-NLS-1$
			break;
		case TR_STOP:
			buffer.append("TR_STOP"); //$NON-NLS-1$
			break;
		case TR_INTERRUPT:
			buffer.append("TR_INTERRUPT"); //$NON-NLS-1$
			break;
		case TR_SUSPEND_COUNT:
			buffer.append("TR_SUSPEND_COUNT"); //$NON-NLS-1$
			break;

		/** Commands ThreadGroupReference. */
		case TGR_NAME:
			buffer.append("TGR_NAME"); //$NON-NLS-1$
			break;
		case TGR_PARENT:
			buffer.append("TGR_PARENT"); //$NON-NLS-1$
			break;
		case TGR_CHILDREN:
			buffer.append("TGR_CHILDREN"); //$NON-NLS-1$
			break;

		/** Commands ArrayReference. */
		case AR_LENGTH:
			buffer.append("AR_LENGTH"); //$NON-NLS-1$
			break;
		case AR_GET_VALUES:
			buffer.append("AR_GET_VALUES"); //$NON-NLS-1$
			break;
		case AR_SET_VALUES:
			buffer.append("AR_SET_VALUES"); //$NON-NLS-1$
			break;

		/** Commands ClassLoaderReference. */
		case CLR_VISIBLE_CLASSES:
			buffer.append("CLR_VISIBLE_CLASSES"); //$NON-NLS-1$
			break;

		/** Commands EventRequest. */
		case ER_SET:
			buffer.append("ER_SET"); //$NON-NLS-1$
			break;
		case ER_CLEAR:
			buffer.append("ER_CLEAR"); //$NON-NLS-1$
			break;
		case ER_CLEAR_ALL_BREAKPOINTS:
			buffer.append("ER_CLEAR_ALL_BREAKPOINTS"); //$NON-NLS-1$
			break;

		/** Commands StackFrame. */
		case SF_GET_VALUES:
			buffer.append("SF_GET_VALUES"); //$NON-NLS-1$
			break;
		case SF_SET_VALUES:
			buffer.append("SF_SET_VALUES"); //$NON-NLS-1$
			break;
		case SF_THIS_OBJECT:
			buffer.append("SF_THIS_OBJECT"); //$NON-NLS-1$
			break;
		case SF_POP_FRAME:
			buffer.append("SF_POP_FRAME"); //$NON-NLS-1$
			break;

		/** Commands ClassObjectReference. */
		case COR_REFLECTED_TYPE:
			buffer.append("COR_REFLECTED_TYPE"); //$NON-NLS-1$
			break;

		/** Commands Event. */
		case E_COMPOSITE:
			buffer.append("E_COMPOSITE"); //$NON-NLS-1$
			break;

		default:
			buffer.append("UNKNOWN COMMAND: "); //$NON-NLS-1$
			buffer.append(getCommand());
			break;
		}
		return buffer.toString();
	}
}
