0N/A/*
2362N/A * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
4378N/A/*
4378N/A * This source code is provided to illustrate the usage of a given feature
4378N/A * or technique and has been deliberately simplified. Additional steps
4378N/A * required for a production-quality application, such as security checks,
4378N/A * input validation and proper error handling, might not be present in
4378N/A * this sample code.
4378N/A */
4378N/A
4378N/A
0N/Apackage com.sun.tools.example.debug.bdi;
0N/A
0N/Aimport com.sun.jdi.*;
0N/Aimport com.sun.jdi.request.EventRequest;
0N/A
0N/Aabstract public class EventRequestSpec {
0N/A
0N/A static final int STATUS_UNRESOLVED = 1;
0N/A static final int STATUS_RESOLVED = 2;
0N/A static final int STATUS_ERROR = 3;
0N/A
0N/A static final Object specPropertyKey = "spec";
0N/A
0N/A final EventRequestSpecList specs;
0N/A final ReferenceTypeSpec refSpec;
0N/A EventRequest request = null;
0N/A
0N/A int status = STATUS_UNRESOLVED;
0N/A
0N/A EventRequestSpec(EventRequestSpecList specs, ReferenceTypeSpec refSpec) {
0N/A this.specs = specs;
0N/A this.refSpec = refSpec;
0N/A }
0N/A
0N/A void setRequest(EventRequest request) {
0N/A this.request = request;
0N/A request.putProperty(specPropertyKey, this);
0N/A request.enable();
0N/A }
0N/A
0N/A /**
0N/A * The 'refType' is known to match.
0N/A */
0N/A abstract void resolve(ReferenceType refType) throws Exception;
0N/A
0N/A abstract void notifySet(SpecListener listener, SpecEvent evt);
0N/A abstract void notifyDeferred(SpecListener listener, SpecEvent evt);
0N/A abstract void notifyResolved(SpecListener listener, SpecEvent evt);
0N/A abstract void notifyDeleted(SpecListener listener, SpecEvent evt);
0N/A abstract void notifyError(SpecListener listener, SpecErrorEvent evt);
0N/A
0N/A /**
0N/A * The 'refType' is known to match.
0N/A */
0N/A void resolveNotify(ReferenceType refType) {
0N/A try {
0N/A resolve(refType);
0N/A status = STATUS_RESOLVED;
0N/A specs.notifyResolved(this);
0N/A } catch(Exception exc) {
0N/A status = STATUS_ERROR;
0N/A specs.notifyError(this, exc);
0N/A }
0N/A }
0N/A
0N/A /**
0N/A * See if 'refType' matches and resolve.
0N/A */
0N/A void attemptResolve(ReferenceType refType) {
0N/A if (!isResolved() && refSpec.matches(refType)) {
0N/A resolveNotify(refType);
0N/A }
0N/A }
0N/A
0N/A void attemptImmediateResolve(VirtualMachine vm) {
0N/A // try to resolve immediately
28N/A for (ReferenceType refType : vm.allClasses()) {
0N/A if (refSpec.matches(refType)) {
0N/A try {
0N/A resolve(refType);
0N/A status = STATUS_RESOLVED;
0N/A specs.notifySet(this);
0N/A } catch(Exception exc) {
0N/A status = STATUS_ERROR;
0N/A specs.notifyError(this, exc);
0N/A }
0N/A return;
0N/A }
0N/A }
0N/A specs.notifyDeferred(this);
0N/A }
0N/A
0N/A public EventRequest getEventRequest() {
0N/A return request;
0N/A }
0N/A
0N/A /**
0N/A * @return true if this spec has been resolved.
0N/A */
0N/A public boolean isResolved() {
0N/A return status == STATUS_RESOLVED;
0N/A }
0N/A
0N/A /**
0N/A * @return true if this spec has not yet been resolved.
0N/A */
0N/A public boolean isUnresolved() {
0N/A return status == STATUS_UNRESOLVED;
0N/A }
0N/A
0N/A /**
0N/A * @return true if this spec is unresolvable due to error.
0N/A */
0N/A public boolean isErroneous() {
0N/A return status == STATUS_ERROR;
0N/A }
0N/A
0N/A public String getStatusString() {
0N/A switch (status) {
0N/A case STATUS_RESOLVED:
0N/A return "resolved";
0N/A case STATUS_UNRESOLVED:
0N/A return "deferred";
0N/A case STATUS_ERROR:
0N/A return "erroneous";
0N/A }
0N/A return "unknown";
0N/A }
0N/A
0N/A boolean isJavaIdentifier(String s) {
0N/A return Utils.isJavaIdentifier(s);
0N/A }
0N/A
0N/A public String errorMessageFor(Exception e) {
0N/A if (e instanceof IllegalArgumentException) {
0N/A return ("Invalid command syntax");
0N/A } else if (e instanceof RuntimeException) {
0N/A // A runtime exception that we were not expecting
0N/A throw (RuntimeException)e;
0N/A } else {
0N/A return ("Internal error; unable to set" + this);
0N/A }
0N/A }
0N/A}