/* * Copyright (c) 2006, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package nsk.share.jdi; import com.sun.jdi.*; import com.sun.jdi.event.*; /* * Classes included in this class represent JDI events on debugger VM's side * All this classes contain information about JDI event which should be generated during test execution, * instances of this classes should be created using instances of corresponding classes from debuggee VM */ public class DebuggerEventData { static abstract class DebugEventData { protected Class eventClass; public DebugEventData(Class eventClass) { this.eventClass = eventClass; } public boolean shouldCheckEvent(Event event) { return this.eventClass.isAssignableFrom(event.getClass()); } // is given event's data identical with data stored in this object abstract public boolean checkEvent(Event event); } /* * debug information about monitor event */ static abstract class DebugMonitorEventData extends DebugEventData { protected ObjectReference monitor; protected ThreadReference thread; public DebugMonitorEventData(Class eventClass, ObjectReference debuggeeMirror) { super(eventClass); this.eventClass = eventClass; monitor = (ObjectReference) debuggeeMirror.getValue(debuggeeMirror.referenceType().fieldByName("monitor")); thread = (ThreadReference) debuggeeMirror.getValue(debuggeeMirror.referenceType().fieldByName("thread")); } public String toString() { return eventClass.getName() + " monitor: " + monitor + " thread: " + thread; } } /* * information about MonitorContendedEnterEvent */ static class DebugMonitorEnterEventData extends DebugMonitorEventData { public DebugMonitorEnterEventData(ObjectReference debuggeeMirror) { super(MonitorContendedEnterEvent.class, debuggeeMirror); } public boolean checkEvent(Event event) { MonitorContendedEnterEvent monitorEnterEvent = (MonitorContendedEnterEvent) event; return monitorEnterEvent.monitor().equals(monitor) && monitorEnterEvent.thread().equals(thread); } } /* * information about MonitorContendedEnteredEvent */ static class DebugMonitorEnteredEventData extends DebugMonitorEventData { public DebugMonitorEnteredEventData(ObjectReference debuggeeMirror) { super(MonitorContendedEnteredEvent.class, debuggeeMirror); } public boolean checkEvent(Event event) { MonitorContendedEnteredEvent monitorEnterEvent = (MonitorContendedEnteredEvent) event; return monitorEnterEvent.monitor().equals(monitor) && monitorEnterEvent.thread().equals(thread); } } /* * information about MonitorWaitEvent */ static class DebugMonitorWaitEventData extends DebugMonitorEventData { private long timeout; public DebugMonitorWaitEventData(ObjectReference debuggeeMirror) { super(MonitorWaitEvent.class, debuggeeMirror); timeout = ((LongValue) debuggeeMirror.getValue(debuggeeMirror.referenceType().fieldByName("timeout"))).longValue(); } public boolean checkEvent(Event event) { MonitorWaitEvent monitorWaitEvent = (MonitorWaitEvent) event; return monitorWaitEvent.monitor().equals(monitor) && monitorWaitEvent.thread().equals(thread) && (monitorWaitEvent.timeout() == timeout); } public String toString() { return eventClass.getName() + " monitor: " + monitor + " thread: " + thread + " timeout: " + timeout; } } /* * information about MonitorWaitedEvent */ static class DebugMonitorWaitedEventData extends DebugMonitorEventData { private boolean timedout; public DebugMonitorWaitedEventData(ObjectReference debuggeeMirror) { super(MonitorWaitedEvent.class, debuggeeMirror); timedout = ((BooleanValue) debuggeeMirror.getValue(debuggeeMirror.referenceType().fieldByName("timedout"))).booleanValue(); } public boolean checkEvent(Event event) { MonitorWaitedEvent monitorWaitedEvent = (MonitorWaitedEvent) event; return monitorWaitedEvent.monitor().equals(monitor) && monitorWaitedEvent.thread().equals(thread) && (monitorWaitedEvent.timedout() == timedout); } public String toString() { return eventClass.getName() + " monitor: " + monitor + " thread: " + thread + " timedout: " + timedout; } } }