|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.debugger.jpda.breakpoints;
import com.sun.jdi.AbsentInformationException;
import com.sun.jdi.Field;
import com.sun.jdi.Location;
import com.sun.jdi.ReferenceType;
import com.sun.jdi.VMDisconnectedException;
import com.sun.jdi.ClassNotPreparedException;
import com.sun.jdi.event.BreakpointEvent;
import com.sun.jdi.event.LocatableEvent;
import com.sun.jdi.event.Event;
import com.sun.jdi.request.BreakpointRequest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.netbeans.api.debugger.jpda.ClassLoadUnloadBreakpoint;
import org.netbeans.api.debugger.jpda.JPDABreakpoint;
import org.netbeans.api.debugger.jpda.LineBreakpoint;
import org.netbeans.modules.debugger.jpda.SourcePath;
import org.netbeans.modules.debugger.jpda.JPDADebuggerImpl;
import org.netbeans.modules.debugger.jpda.util.Executor;
/**
* Implementation of breakpoint on method.
*
* @author Jan Jancura
*/
public class LineBreakpointImpl extends ClassBasedBreakpoint {
private static boolean verbose =
System.getProperty ("netbeans.debugger.breakpoints") != null;
private LineBreakpoint breakpoint;
private SourcePath engineContext;
private int lineNumber;
public LineBreakpointImpl (
LineBreakpoint breakpoint,
JPDADebuggerImpl debugger,
SourcePath engineContext
) {
super (breakpoint, debugger);
this.breakpoint = breakpoint;
this.engineContext = engineContext;
lineNumber = breakpoint.getLineNumber ();
set ();
}
void fixed () {
if (verbose)
System.out.println ("B fix breakpoint impl: " + this);
lineNumber = breakpoint.getLineNumber ();
super.fixed ();
}
protected void setRequests () {
String className = engineContext.getRelativePath (
breakpoint.getURL (),
'.', false
);
if (className == null) {
//HACK: for JSPs.
//PENDING
className = breakpoint.getURL ();
setClassRequests (
new String[] {
className
},
new String [0],
ClassLoadUnloadBreakpoint.TYPE_CLASS_LOADED
);
checkLoadedClasses (className, true);
} else {
setClassRequests (
new String[] {
className,
className + ".*", // innerclasses
className + "$*", // innerclasses
},
new String [0],
ClassLoadUnloadBreakpoint.TYPE_CLASS_LOADED
);
checkLoadedClasses (className, false);
}
}
protected void classLoaded (ReferenceType referenceType) {
if (verbose)
System.out.println ("B class loaded: " + referenceType);
Location location = getLocation (
referenceType,
breakpoint.getStratum (),
breakpoint.getSourceName (),
lineNumber
);
if (location == null) return;
try {
BreakpointRequest br = getEventRequestManager ().
createBreakpointRequest (location);
addEventRequest (br);
} catch (VMDisconnectedException e) {
}
}
public boolean exec (Event event) {
if (event instanceof BreakpointEvent)
return perform (
breakpoint.getCondition (),
((BreakpointEvent) event).thread (),
((LocatableEvent) event).location ().declaringType (),
null
);
return super.exec (event);
}
private static Location getLocation (
ReferenceType referenceType,
String stratum,
String sourceName,
int lineNumber
) {
try {
List list = new ArrayList (referenceType.locationsOfLine (
stratum,
sourceName,
lineNumber
));
if (verbose)
System.out.println ("B get location: referenceType=" +
referenceType + " stratum=" + stratum +
" source name=" + sourceName + " lineNumber " + lineNumber +
" (#" + list.size () + ")");
if (!list.isEmpty ()) return (Location) list.get (0);
// add lines from innerclasses
Iterator i = referenceType.nestedTypes ().iterator ();
while (i.hasNext ()) {
ReferenceType rt = (ReferenceType) i.next ();
list = rt.locationsOfLine (
stratum,
sourceName,
lineNumber
);
if (verbose)
System.out.println ("B get location2: referenceType=" +
referenceType + " stratum=" + stratum +
" source name=" + sourceName + " lineNumber" + lineNumber +
":= " + list.size ());
if (!list.isEmpty ()) return (Location) list.get (0);
}
} catch (AbsentInformationException ex) {
// we are not able to create breakpoint in this situation.
// should we write some message?!?
} catch (ClassNotPreparedException ex) {
// should not occurre. VirtualMachine.allClasses () returns prepared
// classes only. But...
ex.printStackTrace ();
}
return null;
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.