15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/*
25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more
35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * contributor license agreements.  See the NOTICE file distributed with
45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * this work for additional information regarding copyright ownership.
55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * (the "License"); you may not use this file except in compliance with
75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * the License.  You may obtain a copy of the License at
85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  Unless required by applicable law or agreed to in writing, software
125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  See the License for the specific language governing permissions and
165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  limitations under the License.
175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @author Vitaly A. Provodin
215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.framework.jdwp;
245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.IOException;
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.util.ArrayList;
275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.util.Iterator;
285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.util.List;
295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.Breakpoint;
315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.LogWriter;
325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestErrorException;
335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestOptions;
345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.Capabilities;
355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.Event;
375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.EventMod;
385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.Location;
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.TransportWrapper;
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.TypesLengths;
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.Frame.Variable;
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.exceptions.ReplyErrorCodeException;
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.exceptions.TimeoutException;
465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * This class provides convenient way for communicating with debuggee VM using
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP packets.
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * <p>
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Most methods can throw ReplyErrorCodeException if error occurred in execution
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * of corresponding JDWP command or TestErrorException if any other error
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * occurred.
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class VmMirror {
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /** Target VM Capabilities. */
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public Capabilities targetVMCapabilities;
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /** Transport used to sent and receive packets. */
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    private TransportWrapper connection;
625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /** PacketDispatcher thread used for asynchronous reading packets. */
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    private PacketDispatcher packetDispatcher;
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /** Test run options. */
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected TestOptions config;
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /** Log to write messages. */
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected LogWriter logWriter;
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Creates new VmMirror instance for given test run options.
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param config
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            test run options
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param logWriter
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            log writer
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public VmMirror(TestOptions config, LogWriter logWriter) {
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        connection = null;
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        this.config = config;
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        this.logWriter = logWriter;
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Checks error code of given reply packet and throws
885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * ReplyErrorCodeException if any error detected.
895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply
915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reply packet to check
925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket unchanged reply packet
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket checkReply(ReplyPacket reply) {
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (reply.getErrorCode() != JDWPConstants.Error.NONE)
965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new ReplyErrorCodeException(reply.getErrorCode());
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply;
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets breakpoint to given location.
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param typeTag
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param breakpoint
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setBreakpoint(byte typeTag, Breakpoint breakpoint) {
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setBreakpoint(typeTag, breakpoint,
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.SuspendPolicy.ALL);
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets breakpoint to given location.
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param typeTag
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param breakpoint
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param suspendPolicy
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Suspend policy for a breakpoint being created
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setBreakpoint(byte typeTag, Breakpoint breakpoint,
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            byte suspendPolicy) {
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get Class reference ID
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = getTypeID(breakpoint.className, typeTag);
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get Method reference ID
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long methodID = getMethodID(typeID, breakpoint.methodName);
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Fill location
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Location location = new Location(typeTag, typeID, methodID,
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                breakpoint.index);
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set breakpoint
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setBreakpoint(location, suspendPolicy);
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets breakpoint to given location.
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param location
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Location of breakpoint
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setBreakpoint(Location location) {
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setBreakpoint(location, JDWPConstants.SuspendPolicy.ALL);
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets breakpoint to given location
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param location
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Location of breakpoint
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param suspendPolicy
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Suspend policy for a breakpoint being created
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setBreakpoint(Location location, byte suspendPolicy) {
1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.BREAKPOINT;
1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventMod[] mods = new EventMod[1];
1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].loc = location;
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.LocationOnly;
1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set breakpoint
1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets breakpoint that triggers only on a certain occurrence to a given
1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * location
1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param typeTag
1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param breakpoint
1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param suspendPolicy
1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Suspend policy for a breakpoint being created
1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param count
1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Limit the requested event to be reported at most once after a
1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            given number of occurrences
1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setCountableBreakpoint(byte typeTag,
1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Breakpoint breakpoint, byte suspendPolicy, int count) {
1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = getTypeID(breakpoint.className, typeTag);
1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get Method reference ID
1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long methodID = getMethodID(typeID, breakpoint.methodName);
1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.BREAKPOINT;
1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod mod1 = new EventMod();
1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mod1.modKind = EventMod.ModKind.LocationOnly;
1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mod1.loc = new Location(typeTag, typeID, methodID, breakpoint.index);
1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod mod2 = new EventMod();
2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mod2.modKind = EventMod.ModKind.Count;
2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mod2.count = count;
2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { mod1, mod2 };
2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set breakpoint
2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets breakpoint at the beginning of method with name <i>methodName</i>.
2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
2155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            id of class with required method
2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodName
2175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            name of required method
2185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return requestID id of request
2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long setBreakpointAtMethodBegin(long classID, String methodName) {
2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long requestID;
2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long methodID = getMethodID(classID, methodName);
2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket lineTableReply = getLineTable(classID, methodID);
2265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (lineTableReply.getErrorCode() != JDWPConstants.Error.NONE) {
2275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(
2285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    "Command getLineTable returned error code: "
2295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + lineTableReply.getErrorCode()
2305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + " - "
2315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + JDWPConstants.Error.getName(lineTableReply
2325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                                    .getErrorCode()));
2335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        lineTableReply.getNextValueAsLong();
2365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Lowest valid code index for the method
2375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        lineTableReply.getNextValueAsLong();
2395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Highest valid code index for the method
2405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // int numberOfLines =
2425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        lineTableReply.getNextValueAsInt();
2435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long lineCodeIndex = lineTableReply.getNextValueAsLong();
2455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // set breakpoint inside checked method
2475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Location breakpointLocation = new Location(JDWPConstants.TypeTag.CLASS,
2485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                classID, methodID, lineCodeIndex);
2495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = setBreakpoint(breakpointLocation);
2515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReply(reply);
2525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        requestID = reply.getNextValueAsInt();
2545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return requestID;
2565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Waits for stop on breakpoint and gets id of thread where it stopped.
2605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
2615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param requestID
2625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            id of request for breakpoint
2635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return threadID id of thread, where we stop on breakpoint
2645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long waitForBreakpoint(long requestID) {
2665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // receive event
2675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket event = null;
2685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        event = receiveEvent();
2695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        event.getNextValueAsByte();
2715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // suspendPolicy - is not used here
2725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // int numberOfEvents =
2745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        event.getNextValueAsInt();
2755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long breakpointThreadID = 0;
2775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ParsedEvent[] eventParsed = ParsedEvent.parseEventPacket(event);
2785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (eventParsed.length != 1) {
2805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException("Received " + eventParsed.length
2815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + " events instead of 1 BREAKPOINT_EVENT");
2825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check if received event is for breakpoint
2855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (eventParsed[0].getEventKind() == JDWPConstants.EventKind.BREAKPOINT) {
2865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            breakpointThreadID = ((ParsedEvent.Event_BREAKPOINT) eventParsed[0])
2875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .getThreadID();
2885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
2905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(
2915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    "Kind of received event is not BREAKPOINT_EVENT: "
2925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + eventParsed[0].getEventKind());
2935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (eventParsed[0].getRequestID() != requestID) {
2975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(
2985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    "Received BREAKPOINT_EVENT with another requestID: "
2995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + eventParsed[0].getRequestID());
3005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
3015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return breakpointThreadID;
3035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Removes breakpoint according to specified requestID.
3075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param requestID
3095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            for given breakpoint
3105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
3115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket clearBreakpoint(int requestID) {
3135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
3155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket();
3165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command. "2" - is ID of Clear command in EventRequest Command Set
3185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
3195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommand(JDWPCommands.EventRequestCommandSet.ClearCommand);
3205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command set. "15" - is ID of EventRequest Command Set
3225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
3235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommandSet(JDWPCommands.EventRequestCommandSet.CommandSetID);
3245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set outgoing data
3265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set eventKind
3275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsByte(JDWPConstants.EventKind.BREAKPOINT);
3285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set suspendPolicy
3305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsInt(requestID);
3315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
3335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
3345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Removes all breakpoints.
3385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
3405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket ClearAllBreakpoints() {
3425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
3445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket();
3455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command. "3" - is ID of ClearAllBreakpoints command in
3475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventRequest Command Set
3485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
3495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommand(JDWPCommands.EventRequestCommandSet.ClearAllBreakpointsCommand);
3505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command set. "15" - is ID of EventRequest Command Set
3525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
3535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommandSet(JDWPCommands.EventRequestCommandSet.CommandSetID);
3545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
3565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
3575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Requests debuggee VM capabilities. Function parses reply packet of
3615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * VirtualMachine::CapabilitiesNew command, creates and fills class
3625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Capabilities with returned info.
3635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket useless, already parsed reply packet.
3655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket capabilities() {
3675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
3695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket();
3705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command. "17" - is ID of CapabilitiesNew command in
3725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // VirtualMachine Command Set
3735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
3745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommand(JDWPCommands.VirtualMachineCommandSet.CapabilitiesNewCommand);
3755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command set. "1" - is ID of VirtualMachine Command Set
3775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
3785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommandSet(JDWPCommands.VirtualMachineCommandSet.CommandSetID);
3795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
3815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket replyPacket = checkReply(performCommand(commandPacket));
3825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities = new Capabilities();
3845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set capabilities
3865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canWatchFieldModification = replyPacket
3875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
3885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canWatchFieldAccess = replyPacket
3895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
3905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetBytecodes = replyPacket
3915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
3925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetSyntheticAttribute = replyPacket
3935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
3945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetOwnedMonitorInfo = replyPacket
3955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
3965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetCurrentContendedMonitor = replyPacket
3975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
3985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetMonitorInfo = replyPacket
3995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canRedefineClasses = replyPacket
4015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canAddMethod = replyPacket.getNextValueAsBoolean();
4035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canUnrestrictedlyRedefineClasses = replyPacket
4045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canPopFrames = replyPacket.getNextValueAsBoolean();
4065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canUseInstanceFilters = replyPacket
4075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetSourceDebugExtension = replyPacket
4095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canRequestVMDeathEvent = replyPacket
4115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canSetDefaultStratum = replyPacket
4135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetInstanceInfo = replyPacket
4155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved17 = replyPacket.getNextValueAsBoolean();
4175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetMonitorFrameInfo = replyPacket
4185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canUseSourceNameFilters = replyPacket.getNextValueAsBoolean();
4205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canGetConstantPool = replyPacket
4215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.canForceEarlyReturn = replyPacket
4235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsBoolean();
4245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved22 = replyPacket.getNextValueAsBoolean();
4255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved23 = replyPacket.getNextValueAsBoolean();
4265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved24 = replyPacket.getNextValueAsBoolean();
4275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved25 = replyPacket.getNextValueAsBoolean();
4285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved26 = replyPacket.getNextValueAsBoolean();
4295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved27 = replyPacket.getNextValueAsBoolean();
4305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved28 = replyPacket.getNextValueAsBoolean();
4315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved29 = replyPacket.getNextValueAsBoolean();
4325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved30 = replyPacket.getNextValueAsBoolean();
4335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved31 = replyPacket.getNextValueAsBoolean();
4345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        targetVMCapabilities.reserved32 = replyPacket.getNextValueAsBoolean();
4355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return replyPacket;
4375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4393df0c797781000302737ead55196b6e110d8db9cSebastien Hertz    public boolean canWatchFieldModification() {
4403df0c797781000302737ead55196b6e110d8db9cSebastien Hertz        capabilities();
4413df0c797781000302737ead55196b6e110d8db9cSebastien Hertz        return targetVMCapabilities.canWatchFieldModification;
4423df0c797781000302737ead55196b6e110d8db9cSebastien Hertz    }
4433df0c797781000302737ead55196b6e110d8db9cSebastien Hertz
4443df0c797781000302737ead55196b6e110d8db9cSebastien Hertz    public boolean canWatchFieldAccess() {
4453df0c797781000302737ead55196b6e110d8db9cSebastien Hertz        capabilities();
4463df0c797781000302737ead55196b6e110d8db9cSebastien Hertz        return targetVMCapabilities.canWatchFieldAccess;
4473df0c797781000302737ead55196b6e110d8db9cSebastien Hertz    }
4483df0c797781000302737ead55196b6e110d8db9cSebastien Hertz
4493df0c797781000302737ead55196b6e110d8db9cSebastien Hertz    public boolean canUseInstanceFilters() {
4503df0c797781000302737ead55196b6e110d8db9cSebastien Hertz        capabilities();
4513df0c797781000302737ead55196b6e110d8db9cSebastien Hertz        return targetVMCapabilities.canUseInstanceFilters;
4523df0c797781000302737ead55196b6e110d8db9cSebastien Hertz    }
4533df0c797781000302737ead55196b6e110d8db9cSebastien Hertz
4545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Resumes debuggee VM.
4565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
4585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket resume() {
4605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
4615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
4625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ResumeCommand);
4635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
4655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Resumes specified thread on target Virtual Machine
4695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
4715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket resumeThread(long threadID) {
4735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
4745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
4755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.ResumeCommand);
4765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsThreadID(threadID);
4785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
4795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Suspends debuggee VM.
4835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
4855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket suspend() {
4875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
4885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
4895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.SuspendCommand);
4905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
4925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Suspends specified thread in debuggee VM.
4965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
4985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket suspendThread(long threadID) {
5005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
5015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
5025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.SuspendCommand);
5035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsThreadID(threadID);
5055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
5065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
5095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Disposes connection to debuggee VM.
5105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
5115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
5125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
5135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket dispose() {
5145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
5155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket();
5165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
5175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommand(JDWPCommands.VirtualMachineCommandSet.DisposeCommand);
5185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
5195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommandSet(JDWPCommands.VirtualMachineCommandSet.CommandSetID);
5205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
5225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
5235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
5265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Exits debuggee VM process.
5275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
5285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
5295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
5305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket exit(int exitCode) {
5315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
5325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket();
5335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
5345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommand(JDWPCommands.VirtualMachineCommandSet.ExitCommand);
5355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
5365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommandSet(JDWPCommands.VirtualMachineCommandSet.CommandSetID);
5375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsInt(exitCode);
5385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
5405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
5415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
5445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Adjusts lengths for all VM-specific types.
5455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
5465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
5475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
5485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket adjustTypeLength() {
5495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
5505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket();
5515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
5525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommand(JDWPCommands.VirtualMachineCommandSet.IDSizesCommand);
5535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
5545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommandSet(JDWPCommands.VirtualMachineCommandSet.CommandSetID);
5555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
5575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket replyPacket = checkReply(performCommand(commandPacket));
5585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get FieldIDSize from ReplyPacket
5605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.FIELD_ID, replyPacket
5615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsInt());
5625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get MethodIDSize from ReplyPacket
5645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.METHOD_ID, replyPacket
5655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsInt());
5665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get ObjectIDSize from ReplyPacket
5685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.OBJECT_ID, replyPacket
5695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsInt());
5705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get ReferenceTypeIDSize from ReplyPacket
5725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.REFERENCE_TYPE_ID, replyPacket
5735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsInt());
5745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get FrameIDSize from ReplyPacket
5765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.FRAME_ID, replyPacket
5775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getNextValueAsInt());
5785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Adjust all other types lengths
5805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.ARRAY_ID, TypesLengths
5815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getTypeLength(TypesLengths.OBJECT_ID));
5825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.STRING_ID, TypesLengths
5835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getTypeLength(TypesLengths.OBJECT_ID));
5845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.THREAD_ID, TypesLengths
5855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getTypeLength(TypesLengths.OBJECT_ID));
5865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.THREADGROUP_ID, TypesLengths
5875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getTypeLength(TypesLengths.OBJECT_ID));
5885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.LOCATION_ID, TypesLengths
5895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getTypeLength(TypesLengths.OBJECT_ID));
5905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.CLASS_ID, TypesLengths
5915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getTypeLength(TypesLengths.OBJECT_ID));
5925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.CLASSLOADER_ID, TypesLengths
5935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getTypeLength(TypesLengths.OBJECT_ID));
5945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TypesLengths.setTypeLength(TypesLengths.CLASSOBJECT_ID, TypesLengths
5955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getTypeLength(TypesLengths.OBJECT_ID));
5965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return replyPacket;
5975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets TypeID for specified type signature and type tag.
6015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param typeSignature
6035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            type signature
6045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classTypeTag
6055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            type tag
6065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received TypeID
6075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long getTypeID(String typeSignature, byte classTypeTag) {
6095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int classes = 0;
6105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte refTypeTag = 0;
6115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = -1;
6125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request referenceTypeID for exception
6145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket classReference = getClassBySignature(typeSignature);
6155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get referenceTypeID from received packet
6175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        classes = classReference.getNextValueAsInt();
6185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < classes; i++) {
6195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            refTypeTag = classReference.getNextValueAsByte();
6205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (refTypeTag == classTypeTag) {
6215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                typeID = classReference.getNextValueAsReferenceTypeID();
6225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                classReference.getNextValueAsInt();
6235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
6245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } else {
6255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                classReference.getNextValueAsReferenceTypeID();
6265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                classReference.getNextValueAsInt();
6275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                refTypeTag = 0;
6285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
6295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return typeID;
6315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets ClassID for specified class signature.
6355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature
6375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class signature
6385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received ClassID
6395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long getClassID(String classSignature) {
6415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return getTypeID(classSignature, JDWPConstants.TypeTag.CLASS);
6425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets ThreadID for specified thread name.
6465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadName
6485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            thread name
6495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received ThreadID
6505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long getThreadID(String threadName) {
6525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket request = null;
6535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long threadID = -1;
6545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long thread = -1;
6555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String name = null;
6565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int threads = -1;
6575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get All Threads IDs
6595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        request = getAllThreadID();
6605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get thread ID for threadName
6625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        threads = request.getNextValueAsInt();
6635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < threads; i++) {
6645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            thread = request.getNextValueAsThreadID();
6655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            name = getThreadName(thread);
6665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (threadName.equals(name)) {
6675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                threadID = thread;
6685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
6695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
6705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return threadID;
6735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns all running thread IDs.
6775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received reply packet
6795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket getAllThreadID() {
6815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
6825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
6835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
6845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.AllThreadsCommand);
6855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
6875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets class signature for specified class ID.
6915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
6935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class ID
6945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received class signature
6955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public String getClassSignature(long classID) {
6975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
6985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
6995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
7005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.SignatureCommand);
7015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsReferenceTypeID(classID);
7025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket replyPacket = checkReply(performCommand(commandPacket));
7035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return replyPacket.getNextValueAsString();
7045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns thread name for specified <code>threadID</code>.
7085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
7105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            thread ID
7115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return thread name
7125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public String getThreadName(long threadID) {
7145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
7155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
7165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
7175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.NameCommand);
7185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsThreadID(threadID);
7195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket replyPacket = checkReply(performCommand(commandPacket));
7205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return replyPacket.getNextValueAsString();
7215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns thread status for specified <code>threadID</code>.
7255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
7275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            thread ID
7285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return thread status
7295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public int getThreadStatus(long threadID) {
7315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
7325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
7335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.StatusCommand);
7345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsThreadID(threadID);
7355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket replyPacket = checkReply(performCommand(commandPacket));
7365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return replyPacket.getNextValueAsInt();
7375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns name of thread group for specified <code>groupID</code>
7415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param groupID
7435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            thread group ID
7445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return name of thread group
7465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public String getThreadGroupName(long groupID) {
7485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
7495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
7505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadGroupReferenceCommandSet.CommandSetID,
7515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadGroupReferenceCommandSet.NameCommand);
7525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsReferenceTypeID(groupID);
7535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket replyPacket = checkReply(performCommand(commandPacket));
7545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return replyPacket.getNextValueAsString();
7555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets InterfaceID for specified interface signature.
7595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param interfaceSignature
7615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            interface signature
7625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received ClassID
7635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long getInterfaceID(String interfaceSignature) {
7655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return getTypeID(interfaceSignature, JDWPConstants.TypeTag.INTERFACE);
7665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets ArrayID for specified array signature.
7705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param arraySignature
7725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            array signature
7735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received ArrayID
7745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long getArrayID(String arraySignature) {
7765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return getTypeID(arraySignature, JDWPConstants.TypeTag.INTERFACE);
7775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets RequestID from specified ReplyPacket.
7815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param request
7835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            ReplyPacket with RequestID
7845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received RequestID
7855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public int getRequestID(ReplyPacket request) {
7875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return request.getNextValueAsInt();
7885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns FieldID for specified class and field name.
7925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
7945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            ClassID to find field
7955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldName
7965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            field name
7975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received FieldID
7985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long getFieldID(long classID, String fieldName) {
8005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = getFieldsInClass(classID);
8015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return getFieldID(reply, fieldName);
8025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
8035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
8055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets FieldID from ReplyPacket.
8065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
8075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param request
8085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            ReplyPacket for request
8095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param field
8105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            field name to get ID for
8115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received FieldID
8125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
8135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long getFieldID(ReplyPacket request, String field) {
8145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long fieldID = -1;
8155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String fieldName;
8165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get fieldID from received packet
8175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int count = request.getNextValueAsInt();
8185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < count; i++) {
8195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fieldID = request.getNextValueAsFieldID();
8205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fieldName = request.getNextValueAsString();
8215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (field.equals(fieldName)) {
8225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                request.getNextValueAsString();
8235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                request.getNextValueAsInt();
8245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
8255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } else {
8265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                request.getNextValueAsString();
8275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                request.getNextValueAsInt();
8285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                fieldID = 0;
8295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                fieldName = null;
8305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
8315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
8325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return fieldID;
8335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
8345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
8365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets Method ID for specified class and method name.
8375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
8385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
8395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class to find method
8405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodName
8415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            method name
8425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received MethodID
8435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
8445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public long getMethodID(long classID, String methodName) {
8455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply;
8465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int declared = 0;
8475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String method = null;
8485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long methodID = -1;
8495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get Method reference ID
8515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = getMethods(classID);
8525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get methodID from received packet
8545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        declared = reply.getNextValueAsInt();
8555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < declared; i++) {
8565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            methodID = reply.getNextValueAsMethodID();
8575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            method = reply.getNextValueAsString();
8585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (methodName.equals(method)) {
8595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // If this method name is the same as requested
8605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                reply.getNextValueAsString();
8615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                reply.getNextValueAsInt();
8625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
8635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } else {
8645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // If this method name is not the requested one
8655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                reply.getNextValueAsString();
8665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                reply.getNextValueAsInt();
8675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                methodID = -1;
8685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                method = null;
8695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
8705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
8715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return methodID;
8725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
8735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
8755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns method name for specified pair of classID and methodID.
8765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
8775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
8785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID
8795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return method name
8805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
8815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public String getMethodName(long classID, long methodID) {
8825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
8835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
8845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
8855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsReferenceTypeID(classID);
8865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = performCommand(packet);
8875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int declared = reply.getNextValueAsInt();
8895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long mID;
8905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String value = null;
8915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String methodName = "";
8925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < declared; i++) {
8935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mID = reply.getNextValueAsMethodID();
8945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            methodName = reply.getNextValueAsString();
8955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsString();
8965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt();
8975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (mID == methodID) {
8985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                value = methodName;
8995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
9005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
9015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
9025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return value;
9035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
9045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
9065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets ClassPrepare event request for given class name pattern.
9075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
9085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
9095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Required class pattern. Matches are limited to exact matches
9105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            of the given class pattern and matches of patterns that begin
9115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            or end with '*'; for example, "*.Foo" or "java.*".
9125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request.
9135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
9145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setClassPrepared(String classRegexp) {
9155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
9165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.CLASS_PREPARE;
9175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
9185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventMod[] mods = new EventMod[1];
9195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
9205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].classPattern = classRegexp;
9215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassMatch;
9225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
9235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
9255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
9265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
9275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
9295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set ClassPrepare event request for given class ID.
9305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
9315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param referenceTypeID
9325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID
9335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
9345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
9355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setClassPrepared(long referenceTypeID) {
9365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
9375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.CLASS_PREPARE;
9385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
9395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventMod[] mods = new EventMod[1];
9405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
9415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].clazz = referenceTypeID;
9425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassOnly;
9435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
9445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
9465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
9475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
9485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
9505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets ClassPrepare event request for given source name pattern.
9515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
9525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param sourceNamePattern
9535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Required source name pattern. Matches are limited to exact matches
9545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            of the given source name pattern and matches of patterns that begin
9555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            or end with '*'; for example, "*.Foo" or "java.*".
9565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request.
9575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
9585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setClassPreparedForSourceNameMatch(String sourceNamePattern) {
9595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
9605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.CLASS_PREPARE;
9615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
9625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
9635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].sourceNamePattern = sourceNamePattern;
9645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.SourceNameMatch;
9655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
9665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
9685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
9695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
9705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
9725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets ClassUnload event request for given class name pattern.
9735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
9745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature
9755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class signature
9765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
9775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
9785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setClassUnload(String classRegexp) {
9795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
9805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.CLASS_UNLOAD;
9815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
9825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventMod[] mods = new EventMod[1];
9835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
9845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].classPattern = classRegexp;
9855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassMatch;
9865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
9875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
9895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
9905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
9915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
9935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set ClassUnload event request for given class ID.
9945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
9955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param referenceTypeID
9965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID
9975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
9985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
9995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setClassUnload(long referenceTypeID) {
10005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
10015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.CLASS_UNLOAD;
10025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
10035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventMod[] mods = new EventMod[1];
10045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
10055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].clazz = referenceTypeID;
10065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassOnly;
10075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
10085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
10105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
10115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
10125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
10145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets ClassLoad event request for given class signature.
10155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
10165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature
10175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class signature
10185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
10195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
10205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setClassLoad(String classSignature) {
10215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID;
10225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request referenceTypeID for class
10245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        typeID = getClassID(classSignature);
10255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set corresponding event
10275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setClassLoad(typeID);
10285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
10295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
10315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set ClassLoad event request for given class ID.
10325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
10335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param referenceTypeID
10345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID
10355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
10365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
10375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setClassLoad(long referenceTypeID) {
10385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
10395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.CLASS_LOAD;
10405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
10415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
10425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].clazz = referenceTypeID;
10435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassOnly;
10445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
10455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
10475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
10485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
10495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
10515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set MonitorContendedEnter event request for given class's reference type
10525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
10535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param referenceTypeID
10545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID
10555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
10565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
10575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorContendedEnterForClassOnly(long referenceTypeID) {
10585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
10595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_CONTENDED_ENTER;
10605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
10615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
10625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].clazz = referenceTypeID;
10635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassOnly;
10645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
10655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
10675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
10685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
10695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorContendedEnterForClassMatch(String classRegexp) {
10715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
10725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_CONTENDED_ENTER;
10735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
10745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
10755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].classPattern = classRegexp;
10765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassMatch;
10775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
10785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
10805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
10815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
10825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
10845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set MonitorContendedEntered event request for given class's reference type
10855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
10865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param referenceTypeID
10875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID
10885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
10895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
10905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorContendedEnteredForClassOnly(long referenceTypeID) {
10915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
10925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_CONTENDED_ENTERED;
10935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
10945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
10955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].clazz = referenceTypeID;
10965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassOnly;
10975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
10985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
10995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
11005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
11015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
11025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorContendedEnteredForClassMatch(String classRegexp) {
11045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
11055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_CONTENDED_ENTERED;
11065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
11075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
11085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].classPattern = classRegexp;
11095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassMatch;
11105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
11115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
11135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
11145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
11155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
11175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set MonitorWait event request for given class's reference type
11185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
11195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param referenceTypeID
11205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID
11215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
11225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
11235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorWaitForClassOnly(long referenceTypeID) {
11245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
11255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_WAIT;
11265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
11275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
11285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].clazz = referenceTypeID;
11295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassOnly;
11305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
11315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
11335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
11345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
11355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
11375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set MonitorWait event request for given given class name pattern.
11385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
11395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
11405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Required class pattern. Matches are limited to exact matches
11415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            of the given class pattern and matches of patterns that begin
11425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            or end with '*'; for example, "*.Foo" or "java.*".
11435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request.
11445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
11455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorWaitForClassMatch(String classRegexp) {
11465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
11475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_WAIT;
11485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
11495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
11505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].classPattern = classRegexp;
11515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassMatch;
11525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
11535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
11555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
11565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
11575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
11595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set MonitorWait event request for classes
11605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * whose name does not match the given restricted regular expression.
11615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
11625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
11635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Exclude class pattern. Matches are limited to exact matches
11645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            of the given class pattern and matches of patterns that begin
11655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            or end with '*'; for example, "*.Foo" or "java.*".
11665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request.
11675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
11685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorWaitForClassExclude (String classRegexp) {
11695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
11705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_WAIT;
11715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
11725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
11735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].classPattern = classRegexp;
11745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassExclude;
11755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
11765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
11785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
11795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
11805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
11825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set MonitorWaited event request for given class's reference type
11835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
11845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param referenceTypeID
11855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID
11865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
11875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
11885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorWaitedForClassOnly(long referenceTypeID) {
11895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
11905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_WAITED;
11915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
11925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
11935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].clazz = referenceTypeID;
11945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassOnly;
11955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
11965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
11975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
11985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
11995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
12005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
12025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set MonitorWaited event request for given given source name pattern.
12035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
12045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
12055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Required class pattern. Matches are limited to exact matches
12065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            of the given class pattern and matches of patterns that begin
12075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            or end with '*'; for example, "*.Foo" or "java.*".
12085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request.
12095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
12105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorWaitedForClassMatch(String classRegexp) {
12115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
12125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_WAITED;
12135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
12145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
12155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].classPattern = classRegexp;
12165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassMatch;
12175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
12185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
12205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
12215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
12225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
12245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set MonitorWaited event request for classes
12255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * whose name does not match the given restricted regular expression.
12265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
12275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
12285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Required class pattern. Matches are limited to exact matches
12295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            of the given class pattern and matches of patterns that begin
12305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            or end with '*'; for example, "*.Foo" or "java.*".
12315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request.
12325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
12335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMonitorWaitedForClassExclude (String classRegexp) {
12345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
12355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.MONITOR_WAITED;
12365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
12375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
12385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].classPattern = classRegexp;
12395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ClassExclude;
12405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
12415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
12435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
12445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
12455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
12475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Set event request for given event.
12485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
12495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param event
12505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            event to set request for
12515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request
12525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
12535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setEvent(Event event) {
12545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
12555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
12565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
12575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.SetCommand);
12585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set eventKind
12605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsByte(event.eventKind);
12615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set suspendPolicy
12625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsByte(event.suspendPolicy);
12635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set modifiers
12655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsInt(event.modifiers);
12665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < event.modifiers; i++) {
12685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            commandPacket.setNextValueAsByte(event.mods[i].modKind);
12705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
12715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            switch (event.mods[i].modKind) {
12725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.Count: {
12735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case Count
12745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsInt(event.mods[i].count);
12755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
12765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
12775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.Conditional: {
12785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case Conditional
12795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsInt(event.mods[i].exprID);
12805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
12815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
12825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.ThreadOnly: {
12835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case ThreadOnly
12845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsThreadID(event.mods[i].thread);
12855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
12865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
12875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.ClassOnly: {
12885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case ClassOnly
12895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket
12905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        .setNextValueAsReferenceTypeID(event.mods[i].clazz);
12915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
12925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
12935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.ClassMatch: {
12945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case ClassMatch
12955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsString(event.mods[i].classPattern);
12965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
12975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
12985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.ClassExclude: {
12995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case ClassExclude
13005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsString(event.mods[i].classPattern);
13015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
13025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
13035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.LocationOnly: {
13045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case LocationOnly
13055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsLocation(event.mods[i].loc);
13065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
13075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
13085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.ExceptionOnly:
13095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case ExceptionOnly
13105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket
13115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        .setNextValueAsReferenceTypeID(event.mods[i].exceptionOrNull);
13125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsBoolean(event.mods[i].caught);
13135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsBoolean(event.mods[i].uncaught);
13145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
13155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.FieldOnly: {
13165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case FieldOnly
13175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket
13185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        .setNextValueAsReferenceTypeID(event.mods[i].declaring);
13195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsFieldID(event.mods[i].fieldID);
13205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
13215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
13225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.Step: {
13235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case Step
13245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsThreadID(event.mods[i].thread);
13255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsInt(event.mods[i].size);
13265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsInt(event.mods[i].depth);
13275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
13285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
13295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.InstanceOnly: {
13305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case InstanceOnly
13315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsObjectID(event.mods[i].instance);
13325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
13335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
13345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            case EventMod.ModKind.SourceNameMatch: {
13355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // Case SourceNameMatch
13365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                commandPacket.setNextValueAsString(event.mods[i].sourceNamePattern);
13375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
13385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
13395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
13405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
13425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
13435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
13445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
13465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets method reference by signature.
13475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
13485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classReferenceTypeID
13495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID.
13505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
13515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
13525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket getMethods(long classReferenceTypeID) {
13535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
13545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket();
13555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command. "5" - is ID of Methods command in ReferenceType Command
13575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set
13585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
13595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommand(JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
13605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command set. "2" - is ID of ReferenceType Command Set
13625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
13635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommandSet(JDWPCommands.ReferenceTypeCommandSet.CommandSetID);
13645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set outgoing data
13665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set referenceTypeID
13675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsObjectID(classReferenceTypeID);
13685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
13705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
13715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
13725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
13745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets class reference by signature.
13755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
13765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature
13775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class signature.
13785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
13795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
13805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket getClassBySignature(String classSignature) {
13815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
13825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
13835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand);
13845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsString(classSignature);
13855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
13865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
13875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
13895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Gets class fields by class referenceTypeID.
13905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
13915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param referenceTypeID
13925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class referenceTypeID.
13935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
13945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
13955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket getFieldsInClass(long referenceTypeID) {
13965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket(
13975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
13985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.FieldsCommand);
13995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsReferenceTypeID(referenceTypeID);
14005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
14015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
14025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
14035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
14045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets exception event request for given exception class signature.
14055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
14065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param exceptionSignature
14075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            exception signature.
14085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param caught
14095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            is exception caught
14105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param uncaught
14115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            is exception uncaught
14125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
14135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
14145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setException(String exceptionSignature, boolean caught,
14155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            boolean uncaught) {
14165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request referenceTypeID for exception
14175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = getClassID(exceptionSignature);
14185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setException(typeID, caught, uncaught);
14195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
14205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
14215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
14225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets exception event request for given exception class ID.
14235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
14245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param exceptionID
14255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            exception referenceTypeID.
14265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param caught
14275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            is exception caught
14285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param uncaught
14295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            is exception uncaught
14305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
14315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
14325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setException(long exceptionID, boolean caught,
14335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            boolean uncaught) {
14345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
14355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.EXCEPTION;
14365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
14375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[1];
14385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0] = new EventMod();
14395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ExceptionOnly;
14405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].caught = caught;
14415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].uncaught = uncaught;
14425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].exceptionOrNull = exceptionID;
14435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
14445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
14455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
14465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
14475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
14485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
14495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets exception event request for given exception class signature.
14505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
14515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param exceptionSignature
14525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            exception signature.
14535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param caught
14545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            is exception caught
14555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param uncaught
14565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            is exception uncaught
14575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param count
14585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Limit the requested event to be reported at most once after a
14595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            given number of occurrences
14605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
14615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
14625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setCountableException(String exceptionSignature,
14635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            boolean caught, boolean uncaught, int count) {
14645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request referenceTypeID for exception
14655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long exceptionID = getClassID(exceptionSignature);
14665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.EXCEPTION;
14675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
14685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[2];
14695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0] = new EventMod();
14705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.ExceptionOnly;
14715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].caught = caught;
14725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].uncaught = uncaught;
14735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].exceptionOrNull = exceptionID;
14745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
14755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[1] = new EventMod();
14765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[1].modKind = EventMod.ModKind.Count;
14775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[1].count = count;
14785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
14795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
14805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
14815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
14825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
14835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
14845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets METHOD_ENTRY event request for specified class name pattern.
14855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
14865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
14875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class name pattern or null for no pattern
14885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
14895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
14905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
14915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMethodEntry(String classRegexp) {
14925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
14935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.METHOD_ENTRY;
14945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
14955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = null;
14965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (classRegexp == null) {
14975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[0];
14985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
14995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[1];
15005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0] = new EventMod();
15015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].modKind = EventMod.ModKind.ClassMatch;
15025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].classPattern = classRegexp;
15035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
15045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
15055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
15075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
15085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
15105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets METHOD_ENTRY event request for specified class name pattern.
15115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
15125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
15135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class name pattern or null for no pattern
15145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param count
15155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Limit the requested event to be reported at most once after a
15165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            given number of occurrences
15175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
15185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
15195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setCountableMethodEntry(String classRegexp, int count) {
15205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.METHOD_ENTRY;
15215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
15225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = null;
15235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (classRegexp == null) {
15245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[] { new EventMod() };
15255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].modKind = EventMod.ModKind.Count;
15265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].count = count;
15275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
15285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[2];
15295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0] = new EventMod();
15305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].modKind = EventMod.ModKind.ClassMatch;
15315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].classPattern = classRegexp;
15325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[1] = new EventMod();
15345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[1].modKind = EventMod.ModKind.Count;
15355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[1].count = count;
15365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
15375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
15385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
15405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
15415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
15435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets METHOD_EXIT event request for specified class name pattern.
15445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
15455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
15465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class name pattern or null for no pattern
15475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
15485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
15495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
15505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMethodExit(String classRegexp) {
15515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
15525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.METHOD_EXIT;
15535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
15545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = null;
15555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (classRegexp == null) {
15565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[0];
15575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
15585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[1];
15595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0] = new EventMod();
15605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].modKind = EventMod.ModKind.ClassMatch;
15615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].classPattern = classRegexp;
15625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
15635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
15645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
15665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
15675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
15695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets METHOD_EXIT_WITH_RETURN_VALUE event request for specified class name pattern.
15705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
15715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
15725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class name pattern or null for no pattern
15735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
15745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
15755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
15765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setMethodExitWithReturnValue(String classRegexp) {
15775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
15785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.METHOD_EXIT_WITH_RETURN_VALUE;
15795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
15805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = null;
15815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (classRegexp == null) {
15825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[0];
15835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
15845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[1];
15855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0] = new EventMod();
15865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].modKind = EventMod.ModKind.ClassMatch;
15875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].classPattern = classRegexp;
15885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
15895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
15905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
15925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
15935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
15945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
15955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets METHOD_EXIT event request for specified class name pattern.
15965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
15975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
15985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            classRegexp class name pattern or null for no pattern
15995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param count
16005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Limit the requested event to be reported at most once after a
16015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            given number of occurrences
16025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
16035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
16045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setCountableMethodExit(String classRegexp, int count) {
16055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.METHOD_EXIT;
16065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
16075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = null;
16085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (classRegexp == null) {
16095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[] { new EventMod() };
16105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].modKind = EventMod.ModKind.Count;
16115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].count = count;
16125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
16135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods = new EventMod[2];
16145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0] = new EventMod();
16155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].modKind = EventMod.ModKind.ClassMatch;
16165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[0].classPattern = classRegexp;
16175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[1] = new EventMod();
16195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[1].modKind = EventMod.ModKind.Count;
16205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[1].count = count;
16215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
16225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
16235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
16255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
16275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
16295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets field access event request for specified class signature and field
16305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * name.
16315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
16325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classTypeTag
16335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class Type Tag (class/interface/array)
16345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature
16355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class signature
16365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldName
16375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            field name
16385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket if breakpoint is set
16395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws ReplyErrorCodeException
16405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
16415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setFieldAccess(String classSignature, byte classTypeTag,
16425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String fieldName) throws ReplyErrorCodeException {
16435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket request = null;
16445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = -1;
16455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long fieldID = -1;
16465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request referenceTypeID for class
16485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        typeID = getClassID(classSignature);
16495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request fields in class
16515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        request = getFieldsInClass(typeID);
16525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get fieldID from received packet
16545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fieldID = getFieldID(request, fieldName);
16555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
16575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.FIELD_ACCESS;
16585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
16595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventMod[] mods = new EventMod[1];
16605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
16615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].fieldID = fieldID;
16625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].declaring = typeID;
16635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.FieldOnly;
16645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
16655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set exception
16675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
16685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
16695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
16715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets field modification event request for specified class signature and
16725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * field name.
16735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
16745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classTypeTag
16755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class Type Tag (class/interface/array)
16765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature
16775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class signature
16785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldName
16795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            field name
16805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
16815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws ReplyErrorCodeException
16825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
16835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setFieldModification(String classSignature,
16845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            byte classTypeTag, String fieldName) throws ReplyErrorCodeException {
16855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket request = null;
16865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = -1;
16875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long fieldID = -1;
16885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request referenceTypeID for class
16905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        typeID = getClassID(classSignature);
16915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request fields in class
16935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        request = getFieldsInClass(typeID);
16945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get fieldID from received packet
16965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fieldID = getFieldID(request, fieldName);
16975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
16985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
16995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.FIELD_MODIFICATION;
17005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
17015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventMod[] mods = new EventMod[1];
17025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
17035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].fieldID = fieldID;
17045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].declaring = typeID;
17055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.FieldOnly;
17065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
17075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
17095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
17105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
17115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
17135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets step event request for given thread name.
17145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
17155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadName
17165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            thread name
17175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param stepSize
17185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param stepDepth
17195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
17205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
17215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setStep(String threadName, int stepSize, int stepDepth) {
17225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = -1;
17235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Request referenceTypeID for class
17255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        typeID = getThreadID(threadName);
17265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
17285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.SINGLE_STEP;
17295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
17305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // EventMod[] mods = new EventMod[1];
17315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[] { new EventMod() };
17325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].thread = typeID;
17335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].modKind = EventMod.ModKind.Step;
17345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].size = stepSize;
17355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[0].depth = stepDepth;
17365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
17375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
17395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
17405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
17415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
17435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets SINGLE_STEP event request for classes whose name does not match the
17445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * given restricted regular expression
17455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
17465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classRegexp
17475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Disallowed class patterns. Matches are limited to exact
17485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            matches of the given class pattern and matches of patterns
17495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            that begin or end with '*'; for example, "*.Foo" or "java.*".
17505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param stepSize
17515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param stepDepth
17525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for setting request.
17535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
17545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setStep(String[] classRegexp, long threadID,
17555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int stepSize, int stepDepth) {
17565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
17575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.SINGLE_STEP;
17585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
17595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int modsSize = classRegexp.length + 1;
17605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[modsSize];
17615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < classRegexp.length; i++) {
17625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[i] = new EventMod();
17635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[i].classPattern = classRegexp[i];
17645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            mods[i].modKind = EventMod.ModKind.ClassExclude;
17655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
17665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int index = modsSize - 1;
17685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[index] = new EventMod();
17695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[index].modKind = EventMod.ModKind.Step;
17705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[index].thread = threadID;
17715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[index].size = stepSize;
17725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        mods[index].depth = stepDepth;
17735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
17755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event
17775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
17785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
17795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
17815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets THREAD_START event request.
17825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
17835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
17845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
17855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setThreadStart() {
17865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
17875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.THREAD_START;
17885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
17895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[0];
17905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
17915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
17935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
17945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
17955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
17965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets THREAD_END event request.
17975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
17985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
17995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
18005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket setThreadEnd() {
18015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Prepare corresponding event
18025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte eventKind = JDWPConstants.EventKind.THREAD_END;
18035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = JDWPConstants.SuspendPolicy.ALL;
18045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventMod[] mods = new EventMod[0];
18055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Event event = new Event(eventKind, suspendPolicy, mods);
18065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return setEvent(event);
18085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
18095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
18115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Clear an event request for specified request ID.
18125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
18135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param eventKind
18145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            event type to clear
18155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param requestID
18165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            request ID to clear
18175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
18185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
18195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket clearEvent(byte eventKind, int requestID) {
18205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Create new command packet
18215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket commandPacket = new CommandPacket();
18225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command. "2" - is ID of Clear command in EventRequest Command Set
18245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
18255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommand(JDWPCommands.EventRequestCommandSet.ClearCommand);
18265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set command set. "15" - is ID of EventRequest Command Set
18285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket
18295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .setCommandSet(JDWPCommands.EventRequestCommandSet.CommandSetID);
18305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set outgoing data
18325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set event type to clear
18335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsByte(eventKind);
18345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set ID of request to clear
18365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        commandPacket.setNextValueAsInt(requestID);
18375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Send packet
18395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(commandPacket));
18405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
18415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
18435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sends CommandPacket to debuggee VM and waits for ReplyPacket using
18445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * default timeout. All thrown exceptions are wrapped into
18455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * TestErrorException. Consider using checkReply() for checking error code
18465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * in reply packet.
18475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
18485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param command
18495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Command packet to be sent
18505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received ReplyPacket
18515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
18525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket performCommand(CommandPacket command)
18535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throws TestErrorException {
18545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket replyPacket = null;
18555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        try {
18565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            replyPacket = packetDispatcher.performCommand(command);
18575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } catch (IOException e) {
18585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(e);
18595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } catch (InterruptedException e) {
18605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(e);
18615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
18625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return replyPacket;
18645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
18655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
18675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sends CommandPacket to debuggee VM and waits for ReplyPacket using
18685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * specified timeout.
18695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
18705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param command
18715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Command packet to be sent
18725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param timeout
18735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Timeout in milliseconds for waiting reply packet
18745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received ReplyPacket
18755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws InterruptedException
18765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws IOException
18775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws TimeoutException
18785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
18795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket performCommand(CommandPacket command, long timeout)
18805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throws IOException, InterruptedException, TimeoutException {
18815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return packetDispatcher.performCommand(command, timeout);
18835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
18845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
18855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
18865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sends CommandPacket to debuggee VM without waiting for the reply. This
18875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * method is intended for special cases when there is need to divide
18885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * command's performing into two actions: command's sending and receiving
18895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * reply (e.g. for asynchronous JDWP commands' testing). After this method
18905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * the 'receiveReply()' method must be used latter for receiving reply for
18915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * sent command. It is NOT recommended to use this method for usual cases -
18925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * 'performCommand()' method must be used.
18935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
18945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param command
18955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Command packet to be sent
18965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return command ID of sent command
18975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws IOException
18985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *             if any connection error occurred
18995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
19005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public int sendCommand(CommandPacket command) throws IOException {
19015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return packetDispatcher.sendCommand(command);
19025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
19035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
19045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
19055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Waits for reply for command which was sent before by 'sendCommand()'
19065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * method. Default timeout is used as time limit for waiting. This method
19075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * (jointly with 'sendCommand()') is intended for special cases when there
19085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * is need to divide command's performing into two actions: command's
19095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * sending and receiving reply (e.g. for asynchronous JDWP commands'
19105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * testing). It is NOT recommended to use 'sendCommand()- receiveReply()'
19115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * pair for usual cases - 'performCommand()' method must be used.
19125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
19135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param commandId
19145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Command ID of sent before command, reply from which is
19155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            expected to be received
19165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received ReplyPacket
19175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws IOException
19185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *             if any connection error occurred
19195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws InterruptedException
19205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *             if reply packet's waiting was interrupted
19215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws TimeoutException
19225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *             if timeout exceeded
19235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
19245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket receiveReply(int commandId) throws InterruptedException,
19255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            IOException, TimeoutException {
19265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return packetDispatcher.receiveReply(commandId, config.getTimeout());
19275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
19285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
19295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
19305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Waits for reply for command which was sent before by 'sendCommand()'
19315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * method. Specified timeout is used as time limit for waiting. This method
19325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * (jointly with 'sendCommand()') is intended for special cases when there
19335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * is need to divide command's performing into two actions: command's
19345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * sending and receiving reply (e.g. for asynchronous JDWP commands'
19355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * testing). It is NOT recommended to use 'sendCommand()- receiveReply()'
19365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * pair for usual cases - 'performCommand()' method must be used.
19375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
19385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param commandId
19395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Command ID of sent before command, reply from which is
19405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            expected to be received
19415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param timeout
19425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Specified timeout in milliseconds to wait for reply
19435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received ReplyPacket
19445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws IOException
19455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *             if any connection error occurred
19465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws InterruptedException
19475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *             if reply packet's waiting was interrupted
19485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws TimeoutException
19495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *             if timeout exceeded
19505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
19515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public ReplyPacket receiveReply(int commandId, long timeout)
19525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throws InterruptedException, IOException, TimeoutException {
19535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return packetDispatcher.receiveReply(commandId, timeout);
19545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
19555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
19565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
19575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Waits for EventPacket using default timeout. All thrown exceptions are
19585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * wrapped into TestErrorException.
19595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
19605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received EventPacket
19615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
19625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public EventPacket receiveEvent() throws TestErrorException {
19635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        try {
19645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return receiveEvent(config.getTimeout());
19655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } catch (IOException e) {
19665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(e);
19675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } catch (InterruptedException e) {
19685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(e);
19695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
19705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
19715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
19725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
19735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Waits for EventPacket using specified timeout.
19745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
19755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param timeout
19765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Timeout in milliseconds to wait for event
19775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received EventPacket
19785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws IOException
19795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws InterruptedException
19805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @throws TimeoutException
19815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
19825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public EventPacket receiveEvent(long timeout) throws IOException,
19835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            InterruptedException, TimeoutException {
19845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
19855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return packetDispatcher.receiveEvent(timeout);
19865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
19875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
19885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
19895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Waits for expected event kind using default timeout. Throws
19905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * TestErrorException if received event is not of expected kind or not a
19915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * single event in the received event set.
19925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
19935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param eventKind
19945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Type of expected event -
19955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @see JDWPConstants.EventKind
19965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return received EventPacket
19975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
19985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public EventPacket receiveCertainEvent(byte eventKind)
19995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throws TestErrorException {
20005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        EventPacket eventPacket = receiveEvent();
20025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(eventPacket);
20035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (parsedEvents.length == 1
20055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                && parsedEvents[0].getEventKind() == eventKind)
20065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return eventPacket;
20075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        switch (parsedEvents.length) {
20095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        case (0):
20105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(
20115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    "Unexpected event received: zero length");
20125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        case (1):
20135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException("Unexpected event received: "
20145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + parsedEvents[0].getEventKind());
20155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        default:
20165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(
20175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    "Unexpected event received: Event was grouped in a composite event");
20185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
20195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
20205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
20225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns JDWP connection channel used by this VmMirror.
20235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
20245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return connection channel
20255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
20265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public TransportWrapper getConnection() {
20275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return connection;
20285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
20295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
20315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets established connection channel to be used with this VmMirror and
20325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * starts reading packets.
20335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
20345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param connection
20355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            connection channel to be set
20365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
20375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void setConnection(TransportWrapper connection) {
20385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        this.connection = connection;
20395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packetDispatcher = new PacketDispatcher(connection, config, logWriter);
20405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
20415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
20435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Closes connection channel used with this VmMirror and stops reading
20445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * packets.
20455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
20465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
20475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void closeConnection() throws IOException {
20485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (connection != null && connection.isOpen())
20495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            connection.close();
20505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // wait for packetDispatcher is closed
20525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (packetDispatcher != null) {
20535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            try {
20545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                packetDispatcher.join();
20555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } catch (InterruptedException e) {
20565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // do nothing but print a stack trace
20575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                e.printStackTrace();
20585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
20595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
20605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
20615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
20635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the count of frames on this thread's stack
20645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
20655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
20665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The thread object ID.
20675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The count of frames on this thread's stack
20685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
20695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final int getFrameCount(long threadID) {
20705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
20715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
20725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.FrameCountCommand);
20735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(threadID);
20745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
20755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsInt();
20765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
20775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
20795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns a list containing all frames of a certain thread
20805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
20815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
20825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            ID of the thread
20835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return A list of frames
20845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
20855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final List getAllThreadFrames(long threadID) {
20865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (!isThreadSuspended(threadID)) {
20875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return new ArrayList(0);
20885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
20895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = getThreadFrames(threadID, 0, -1);
20915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int framesCount = reply.getNextValueAsInt();
20925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (framesCount == 0) {
20935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return new ArrayList(0);
20945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
20955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
20965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ArrayList<Frame> frames = new ArrayList<Frame>(framesCount);
20975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < framesCount; i++) {
20985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Frame frame = new Frame();
20995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            frame.setThreadID(threadID);
21005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            frame.setID(reply.getNextValueAsFrameID());
21015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            frame.setLocation(reply.getNextValueAsLocation());
21025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            frames.add(frame);
21035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
21045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return frames;
21065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
21075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
21095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns a set of frames of a certain suspended thread
21105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
21115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
21125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            ID of the thread whose frames to obtain
21135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param startIndex
21145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The index of the first frame to retrieve.
21155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param length
21165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The count of frames to retrieve (-1 means all remaining).
21175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
21185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
21195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final ReplyPacket getThreadFrames(long threadID, int startIndex,
21205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int length) {
21215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
21225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
21235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.FramesCommand);
21245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(threadID);
21255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(startIndex); // start frame's index
21265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(length); // get all remaining frames;
21275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(command));
21285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
21295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
21315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns variable information for the method
21325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
21335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
21345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The class ID
21355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID
21365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The method ID
21375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return A list containing all variables (arguments and locals) declared
21385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *         within the method.
21395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
21405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final List getVariableTable(long classID, long methodID) {
21415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
21425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.MethodCommandSet.CommandSetID,
21435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.MethodCommandSet.VariableTableCommand);
21445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(classID);
21455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsMethodID(methodID);
21465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // ReplyPacket reply =
21475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // debuggeeWrapper.vmMirror.checkReply(debuggeeWrapper.vmMirror.performCommand(command));
21485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = performCommand(command);
21495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (reply.getErrorCode() == JDWPConstants.Error.ABSENT_INFORMATION
21505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                || reply.getErrorCode() == JDWPConstants.Error.NATIVE_METHOD) {
21515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return null;
21525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
21535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReply(reply);
21555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsInt(); // argCnt, is not used
21575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int slots = reply.getNextValueAsInt();
21585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (slots == 0) {
21595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return null;
21605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
21615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ArrayList<Variable> vars = new ArrayList<Variable>(slots);
21635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < slots; i++) {
21645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Variable var = new Frame().new Variable();
21655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            var.setCodeIndex(reply.getNextValueAsLong());
21665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            var.setName(reply.getNextValueAsString());
21675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            var.setSignature(reply.getNextValueAsString());
21685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            var.setLength(reply.getNextValueAsInt());
21695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            var.setSlot(reply.getNextValueAsInt());
21705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            vars.add(var);
21715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
21725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return vars;
21745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
21755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
21775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns values of local variables in a given frame
21785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
21795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param frame
21805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            Frame whose variables to get
21815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return An array of Value objects
21825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
21835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final Value[] getFrameValues(Frame frame) {
21845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
21855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StackFrameCommandSet.CommandSetID,
21865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StackFrameCommandSet.GetValuesCommand);
21875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(frame.getThreadID());
21885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsFrameID(frame.getID());
21895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int slots = frame.getVars().size();
21905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(slots);
21915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Iterator it = frame.getVars().iterator();
21925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        while (it.hasNext()) {
21935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Frame.Variable var = (Frame.Variable) it.next();
21945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsInt(var.getSlot());
21955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsByte(var.getTag());
21965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
21975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
21985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
21995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsInt(); // number of values , is not used
22005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value[] values = new Value[slots];
22015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < slots; i++) {
22025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            values[i] = reply.getNextValueAsValue();
22035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
22045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
22055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return values;
22065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
22075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
22085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
22095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the immediate superclass of a class
22105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
22115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
22125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The class ID whose superclass ID is to get
22135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The superclass ID (null if the class ID for java.lang.Object is
22145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *         specified).
22155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
22165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final long getSuperclassId(long classID) {
22175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
22185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
22195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.SuperclassCommand);
22205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsClassID(classID);
22215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
22225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsClassID();
22235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
22245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
22255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
22265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the runtime type of the object
22275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
22285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID
22295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The object ID
22305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The runtime reference type.
22315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
22325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final long getReferenceType(long objectID) {
22335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
22345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
22355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.ReferenceTypeCommand);
22365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsObjectID(objectID);
22375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
22385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsByte();
22395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsLong();
22405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
22415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
22425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
22435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the class object corresponding to this type
22445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
22455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refType
22465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The reference type ID.
22475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The class object.
22485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
22495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final long getClassObjectId(long refType) {
22505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
22515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
22525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.ClassObjectCommand);
22535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(refType);
22545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
22555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsObjectID();
22565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
22575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
22585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
22595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns line number information for the method, if present.
22605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
22615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refType
22625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The class ID
22635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID
22645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The method ID
22655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command.
22665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
22675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final ReplyPacket getLineTable(long refType, long methodID) {
22685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
22695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.MethodCommandSet.CommandSetID,
22705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.MethodCommandSet.LineTableCommand);
22715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(refType);
22725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsMethodID(methodID);
22735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // ReplyPacket reply =
22745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // debuggeeWrapper.vmMirror.checkReply(debuggeeWrapper.vmMirror.performCommand(command));
22755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // it is impossible to obtain line table information from native
22765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // methods, so reply checking is not performed
22775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = performCommand(command);
22785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (reply.getErrorCode() != JDWPConstants.Error.NONE) {
22795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (reply.getErrorCode() == JDWPConstants.Error.NATIVE_METHOD) {
22805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return reply;
22815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
22825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
22835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
22845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(reply);
22855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
22865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
22875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
22885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the value of one or more instance fields.
22895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
22905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID
22915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The object ID
22925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldIDs
22935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            IDs of fields to get
22945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return An array of Value objects representing each field's value
22955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
22965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final Value[] getObjectReferenceValues(long objectID, long[] fieldIDs) {
22975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int fieldsCount = fieldIDs.length;
22985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (fieldsCount == 0) {
22995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return null;
23005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
23015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
23035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
23045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.GetValuesCommand);
23055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(objectID);
23065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(fieldsCount);
23075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < fieldsCount; i++) {
23085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsFieldID(fieldIDs[i]);
23095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
23105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
23125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsInt(); // fields returned, is not used
23135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value[] values = new Value[fieldsCount];
23145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < fieldsCount; i++) {
23155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            values[i] = reply.getNextValueAsValue();
23165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
23175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return values;
23195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
23205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
23225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the value of one or more static fields of the reference type
23235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
23245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refTypeID
23255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The reference type ID.
23265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldIDs
23275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            IDs of fields to get
23285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return An array of Value objects representing each field's value
23295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
23305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final Value[] getReferenceTypeValues(long refTypeID, long[] fieldIDs) {
23315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int fieldsCount = fieldIDs.length;
23325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (fieldsCount == 0) {
23335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return null;
23345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
23355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
23375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
23385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.GetValuesCommand);
23395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(refTypeID);
23405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(fieldsCount);
23415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < fieldsCount; i++) {
23425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsFieldID(fieldIDs[i]);
23435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
23445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
23465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsInt(); // fields returned, is not used
23475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value[] values = new Value[fieldsCount];
23485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < fieldsCount; i++) {
23495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            values[i] = reply.getNextValueAsValue();
23505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
23515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return values;
23535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
23545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
23565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the value of the 'this' reference for this frame
23575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
23585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
23595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The frame's thread ID
23605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param frameID
23615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The frame ID.
23625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The 'this' object ID for this frame.
23635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
23645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final long getThisObject(long threadID, long frameID) {
23655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
23665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StackFrameCommandSet.CommandSetID,
23675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StackFrameCommandSet.ThisObjectCommand);
23685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(threadID);
23695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsFrameID(frameID);
23705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
23715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject taggedObject = reply.getNextValueAsTaggedObject();
23725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return taggedObject.objectID;
23735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
23745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
23765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns information for each field in a reference type including
23775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * inherited fields
23785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
23795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
23805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The reference type ID
23815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return A list of Field objects representing each field of the class
23825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
23835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final List getAllFields(long classID) {
23845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ArrayList<Field> fields = new ArrayList<Field>(0);
23855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long superID = getSuperclassId(classID);
23875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (superID != 0) {
23885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            List superClassFields = getAllFields(superID);
23895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            for (int i = 0; i < superClassFields.size(); i++) {
23905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                fields.add((Field) superClassFields.toArray()[i]);
23915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
23925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
23935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
23945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = getFieldsInClass(classID);
23955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int fieldsCount = reply.getNextValueAsInt();
23965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < fieldsCount; i++) {
23975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Field field = new Field(reply.getNextValueAsFieldID(), classID,
23985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    reply.getNextValueAsString(), reply.getNextValueAsString(),
23995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    reply.getNextValueAsInt());
24005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fields.add(field);
24015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
24025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
24035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return fields;
24045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
24055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
24065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
24075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the reference type reflected by this class object
24085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
24095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classObjectID
24105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The class object ID.
24115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
24125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
24135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final ReplyPacket getReflectedType(long classObjectID) {
24145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
24155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassObjectReferenceCommandSet.CommandSetID,
24165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassObjectReferenceCommandSet.ReflectedTypeCommand);
24175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsClassObjectID(classObjectID);
24185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(command));
24195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
24205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
24215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
24225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the JNI signature of a reference type. JNI signature formats are
24235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * described in the Java Native Interface Specification
24245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
24255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refTypeID
24265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The reference type ID.
24275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The JNI signature for the reference type.
24285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
24295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final String getReferenceTypeSignature(long refTypeID) {
24305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
24315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
24325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.SignatureCommand);
24335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(refTypeID);
24345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
24355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsString();
24365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
24375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
24385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
24395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the thread group that contains a given thread
24405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
24415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
24425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The thread object ID.
24435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The thread group ID of this thread.
24445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
24455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final long getThreadGroupID(long threadID) {
24465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
24475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
24485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.ThreadGroupCommand);
24495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(threadID);
24505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
24515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsThreadGroupID();
24525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
24535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
24545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
24555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Checks whether a given thread is suspended or not
24565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
24575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
24585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The thread object ID.
24595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return True if a given thread is suspended, false otherwise.
24605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
24615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final boolean isThreadSuspended(long threadID) {
24625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
24635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
24645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ThreadReferenceCommandSet.StatusCommand);
24655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(threadID);
24665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
24675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsInt(); // the thread's status; is not used
24685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsInt() == JDWPConstants.SuspendStatus.SUSPEND_STATUS_SUSPENDED;
24695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
24705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
24715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
24725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns JNI signature of method.
24735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
24745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
24755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The reference type ID.
24765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID
24775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The method ID.
24785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return JNI signature of method.
24795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
24805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final String getMethodSignature(long classID, long methodID) {
24815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
24825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
24835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
24845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(classID);
24855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
24865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int methods = reply.getNextValueAsInt();
24875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String value = null;
24885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < methods; i++) {
24895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long mID = reply.getNextValueAsMethodID();
24905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsString(); // name of the method; is not used
24915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String methodSign = reply.getNextValueAsString();
24925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt();
24935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (mID == methodID) {
24945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                value = methodSign;
24955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                value = value.replaceAll("/", ".");
24965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                int lastRoundBracketIndex = value.lastIndexOf(")");
24975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                value = value.substring(0, lastRoundBracketIndex + 1);
24985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
24995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
25005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
25015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return value;
25035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
25045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
25065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns the characters contained in the string
25075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
25085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID
25095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The String object ID.
25105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return A string value.
25115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
25125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final String getStringValue(long objectID) {
25135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
25145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StringReferenceCommandSet.CommandSetID,
25155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StringReferenceCommandSet.ValueCommand);
25165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsObjectID(objectID);
25175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
25185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsString();
25195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
25205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
25225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns a range of array components
25235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
25245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID
25255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The array object ID.
25265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The retrieved values.
25275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
25285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public Value[] getArrayValues(long objectID) {
25295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
25305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ArrayReferenceCommandSet.CommandSetID,
25315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ArrayReferenceCommandSet.LengthCommand);
25325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsArrayID(objectID);
25335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
25345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int length = reply.getNextValueAsInt();
25355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (length == 0) {
25375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return null;
25385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
25395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command = new CommandPacket(
25415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ArrayReferenceCommandSet.CommandSetID,
25425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ArrayReferenceCommandSet.GetValuesCommand);
25435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsArrayID(objectID);
25445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(0);
25455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(length);
25465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = checkReply(performCommand(command));
25475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ArrayRegion arrayRegion = reply.getNextValueAsArrayRegion();
25485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value[] values = new Value[length];
25505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < length; i++) {
25515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            values[i] = arrayRegion.getValue(i);
25525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
25535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return values;
25555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
25565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
25585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns a source line number according to a corresponding line code index
25595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * in a method's line table.
25605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
25615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
25625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The class object ID.
25635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID
25645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The method ID.
25655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param codeIndex
25665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The line code index.
25675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return An integer line number.
25685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
25695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final int getLineNumber(long classID, long methodID, long codeIndex) {
25705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int lineNumber = -1;
25715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = getLineTable(classID, methodID);
25725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (reply.getErrorCode() != JDWPConstants.Error.NONE) {
25735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return lineNumber;
25745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
25755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsLong(); // start line index, is not used
25775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsLong(); // end line index, is not used
25785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int lines = reply.getNextValueAsInt();
25795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < lines; i++) {
25805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long lineCodeIndex = reply.getNextValueAsLong();
25815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            lineNumber = reply.getNextValueAsInt();
25825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (lineCodeIndex == codeIndex) {
25835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
25845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
25855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (lineCodeIndex > codeIndex) {
25875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                --lineNumber;
25885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
25895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
25905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
25915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return lineNumber;
25935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
25945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
25955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
25965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns a line code index according to a corresponding line number in a
25975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * method's line table.
25985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
25995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
26005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The class object ID.
26015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID
26025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The method ID.
26035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param lineNumber
26045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            A source line number.
26055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return An integer representing the line code index.
26065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
26075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final long getLineCodeIndex(long classID, long methodID,
26085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int lineNumber) {
26095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = getLineTable(classID, methodID);
26105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (reply.getErrorCode() != JDWPConstants.Error.NONE) {
26115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return -1L;
26125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
26135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsLong(); // start line index, is not used
26155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsLong(); // end line index, is not used
26165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int lines = reply.getNextValueAsInt();
26175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < lines; i++) {
26185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long lineCodeIndex = reply.getNextValueAsLong();
26195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (lineNumber == reply.getNextValueAsInt()) {
26205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return lineCodeIndex;
26215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
26225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
26235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return -1L;
26255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
26265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
26285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns all variables which are visible within the given frame.
26295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
26305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param frame
26315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The frame whose visible local variables to retrieve.
26325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return A list of Variable objects representing each visible local
26335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *         variable within the given frame.
26345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
26355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final List getLocalVars(Frame frame) {
26365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        List vars = getVariableTable(frame.getLocation().classID, frame
26375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .getLocation().methodID);
26385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (vars == null) {
26395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return null;
26405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
26415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // All variables that are not visible from within current frame must be
26435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // removed from the list
26445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long frameCodeIndex = frame.getLocation().index;
26455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < vars.size(); i++) {
26465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Variable var = (Variable) vars.toArray()[i];
26475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long varCodeIndex = var.getCodeIndex();
26485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (varCodeIndex > frameCodeIndex
26495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    || (frameCodeIndex >= varCodeIndex + var.getLength())) {
26505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                vars.remove(i);
26515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                --i;
26525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                continue;
26535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
26545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
26555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return vars;
26575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
26585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
26605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets the value of one or more local variables
26615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
26625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param frame
26635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The frame ID.
26645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param vars
26655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            An array of Variable objects whose values to set
26665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param values
26675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            An array of Value objects to set
26685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
26695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final void setLocalVars(Frame frame, Variable[] vars, Value[] values) {
26705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (vars.length != values.length) {
26715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(
26725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    "Number of variables doesn't correspond to number of their values");
26735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
26745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
26765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StackFrameCommandSet.CommandSetID,
26775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StackFrameCommandSet.SetValuesCommand);
26785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(frame.getThreadID());
26795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsFrameID(frame.getID());
26805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(vars.length);
26815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < vars.length; i++) {
26825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsInt(vars[i].getSlot());
26835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsValue(values[i]);
26845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
26855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReply(performCommand(command));
26875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
26885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
26895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
26905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets the value of one or more instance fields
26915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
26925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID
26935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The object ID.
26945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldIDs
26955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            An array of fields IDs
26965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param values
26975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            An array of Value objects representing each value to set
26985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
26995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final void setInstanceFieldsValues(long objectID, long[] fieldIDs,
27005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Value[] values) {
27015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (fieldIDs.length != values.length) {
27025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(
27035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    "Number of fields doesn't correspond to number of their values");
27045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
27055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
27075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
27085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.SetValuesCommand);
27095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsObjectID(objectID);
27105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(fieldIDs.length);
27115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < fieldIDs.length; i++) {
27125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsFieldID(fieldIDs[i]);
27135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsUntaggedValue(values[i]);
27145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
27155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReply(performCommand(command));
27175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
27185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
27205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets a range of array components. The specified range must be within the
27215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * bounds of the array.
27225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
27235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param arrayID
27245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The array object ID.
27255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param firstIndex
27265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The first index to set.
27275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param values
27285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            An array of Value objects representing each value to set.
27295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
27305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final void setArrayValues(long arrayID, int firstIndex,
27315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Value[] values) {
27325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
27335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ArrayReferenceCommandSet.CommandSetID,
27345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ArrayReferenceCommandSet.SetValuesCommand);
27355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsArrayID(arrayID);
27365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(firstIndex);
27375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(values.length);
27385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < values.length; i++) {
27395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsUntaggedValue(values[i]);
27405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
27415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReply(performCommand(command));
27435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
27445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
27465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Sets the value of one or more static fields
27475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
27485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
27495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The class type ID.
27505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldIDs
27515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            An array of fields IDs
27525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param values
27535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            An array of Value objects representing each value to set
27545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
27555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final void setStaticFieldsValues(long classID, long[] fieldIDs,
27565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Value[] values) {
27575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (fieldIDs.length != values.length) {
27585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            throw new TestErrorException(
27595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    "Number of fields doesn't correspond to number of their values");
27605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
27615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
27635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
27645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.SetValuesCommand);
27655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsClassID(classID);
27665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(fieldIDs.length);
27675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < fieldIDs.length; i++) {
27685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsFieldID(fieldIDs[i]);
27695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsUntaggedValue(values[i]);
27705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
27715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReply(performCommand(command));
27735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
27745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
27765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Creates java String in target VM with the given value.
27775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
27785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param value
27795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The value of the string.
27805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return The string id.
27815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
27825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final long createString(String value) {
27835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
27845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
27855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CreateStringCommand);
27865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsString(value);
27875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = checkReply(performCommand(command));
27885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply.getNextValueAsStringID();
27895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
27905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
27915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
27925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Processes JDWP PopFrames command from StackFrame command set.
27935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
27945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param frame
27955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The instance of Frame.
27965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
27975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final void popFrame(Frame frame) {
27985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
27995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StackFrameCommandSet.CommandSetID,
28005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StackFrameCommandSet.PopFramesCommand);
28015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(frame.getThreadID());
28025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsFrameID(frame.getID());
28035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReply(performCommand(command));
28045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
28055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
28065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
28075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Invokes a member method of the given object.
28085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
28095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID
28105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The object ID.
28115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
28125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The thread ID.
28135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodName
28145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The name of method for the invocation.
28155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param args
28165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The arguments for the invocation.
28175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param options
28185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The invocation options.
28195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
28205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
28215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final ReplyPacket invokeInstanceMethod(long objectID, long threadID,
28225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String methodName, Value[] args, int options) {
28235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = getReferenceType(objectID);
28245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long methodID = getMethodID(classID, methodName);
28255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
28265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
28275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.InvokeMethodCommand);
28285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsObjectID(objectID);
28295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(threadID);
28305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsClassID(classID);
28315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsMethodID(methodID);
28325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(args.length);
28335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < args.length; i++) {
28345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsValue(args[i]);
28355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
28365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(options);
28375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
28385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(command));
28395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
28405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
28415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
28425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Invokes a static method of the given class.
28435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
28445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
28455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The class type ID.
28465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param threadID
28475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The thread ID.
28485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodName
28495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The name of method for the invocation.
28505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param args
28515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The arguments for the invocation.
28525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param options
28535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            The invocation options.
28545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return ReplyPacket for corresponding command
28555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
28565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public final ReplyPacket invokeStaticMethod(long classID, long threadID,
28575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String methodName, Value[] args, int options) {
28585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long methodID = getMethodID(classID, methodName);
28595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
28605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
28615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.InvokeMethodCommand);
28625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsClassID(classID);
28635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsThreadID(threadID);
28645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsMethodID(methodID);
28655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(args.length);
28665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < args.length; i++) {
28675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            command.setNextValueAsValue(args[i]);
28685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
28695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsInt(options);
28705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
28715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReply(performCommand(command));
28725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
28735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
2874