|
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.actions;
import com.sun.jdi.IncompatibleThreadStateException;
import com.sun.jdi.ThreadReference;
import com.sun.jdi.VMDisconnectedException;
import com.sun.jdi.event.Event;
import com.sun.jdi.event.LocatableEvent;
import com.sun.jdi.request.StepRequest;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.*;
import org.netbeans.api.debugger.ActionsManager;
import org.netbeans.api.debugger.DebuggerManager;
import org.netbeans.spi.debugger.ContextProvider;
import org.netbeans.spi.debugger.ActionsProvider;
import org.netbeans.api.debugger.jpda.JPDADebugger;
import org.netbeans.api.debugger.jpda.JPDAThread;
import org.netbeans.api.debugger.jpda.SmartSteppingFilter;
import org.netbeans.modules.debugger.jpda.SourcePath;
import org.netbeans.modules.debugger.jpda.JPDADebuggerImpl;
import org.netbeans.modules.debugger.jpda.models.JPDAThreadImpl;
import org.netbeans.modules.debugger.jpda.util.Executor;
import org.netbeans.spi.debugger.jpda.SourcePathProvider;
/**
* Implements non visual part of stepping through code in JPDA debugger.
* It supports standart debugging actions StepInto, Over, Out, RunToCursor,
* and Go. And advanced "smart tracing" action.
*
* @author Jan Jancura
*/
public class StepIntoActionProvider extends JPDADebuggerActionProvider
implements Executor, PropertyChangeListener {
public static final String SS_STEP_OUT = "SS_ACTION_STEPOUT";
private static boolean ssverbose =
System.getProperty ("netbeans.debugger.smartstepping") != null;
private StepRequest stepRequest;
private ThreadReference tr;
private String position;
private ContextProvider lookupProvider;
private boolean smartSteppingStepOut;
public StepIntoActionProvider (ContextProvider lookupProvider) {
super (
(JPDADebuggerImpl) lookupProvider.lookupFirst
(null, JPDADebugger.class)
);
this.lookupProvider = lookupProvider;
getSmartSteppingFilterImpl ().addPropertyChangeListener (this);
SourcePath ec = (SourcePath) lookupProvider.
lookupFirst (null, SourcePath.class);
ec.addPropertyChangeListener (this);
for (Iterator i = lookupProvider.lookup(null, Properties.class).iterator(); i.hasNext(); ) {
if (((Properties) i.next()).containsKey(SS_STEP_OUT)) {
smartSteppingStepOut = true;
}
}
}
// ActionProviderSupport ...................................................
public Set getActions () {
return new HashSet (Arrays.asList (new Object[] {
ActionsManager.ACTION_STEP_INTO,
}));
}
public void doAction (Object action) {
synchronized (getDebuggerImpl ().LOCK) {
if (ssverbose)
System.out.println("\nSS: STEP INTO !!! *************");
setStepRequest ();
try {
getDebuggerImpl ().resume ();
} catch (VMDisconnectedException e) {
}
}
}
protected void checkEnabled (int debuggerState) {
Iterator i = getActions ().iterator ();
while (i.hasNext ())
setEnabled (
i.next (),
(debuggerState == JPDADebugger.STATE_STOPPED) &&
(getDebuggerImpl ().getCurrentThread () != null)
);
}
public void propertyChange (PropertyChangeEvent ev) {
if (ev.getPropertyName () == SmartSteppingFilter.PROP_EXCLUSION_PATTERNS) {
if (ev.getOldValue () != null) {
// remove some patterns
if (ssverbose) {
System.out.println("\nSS: exclusion patterns removed");
}
removeStepRequests ();
} else {
if (ssverbose) {
if (stepRequest == null)
System.out.println("SS: exclusion patterns has been added");
else
System.out.println("\nSS: add exclusion patterns:");
}
addPatternsToRequest ((String[])
((Set) ev.getNewValue ()).toArray (
new String [((Set) ev.getNewValue ()).size()]
)
);
}
} else
if (ev.getPropertyName () == SourcePathProvider.PROP_SOURCE_ROOTS) {
if (ssverbose)
System.out.println("\nSS: source roots changed");
removeStepRequests ();
} else
super.propertyChange (ev);
}
// Executor ................................................................
/**
* Executes all step actions and smart stepping.
*
* Should be called from Operator only.
*/
public boolean exec (Event event) {
stepRequest.disable ();
LocatableEvent le = (LocatableEvent) event;
String np = le.location ().declaringType ().name () + ":" +
le.location ().lineNumber (null);
ThreadReference tr = le.thread ();
JPDAThread t = getDebuggerImpl ().getThread (tr);
boolean stop = (!np.equals (position)) &&
getCompoundSmartSteppingListener ().stopHere
(lookupProvider, t, getSmartSteppingFilterImpl ());
if (stop) {
removeStepRequests ();
getDebuggerImpl ().setStoppedState (tr);
} else {
if (ssverbose)
System.out.println("SS: => do next step!");
if (smartSteppingStepOut)
getStepActionProvider().doAction(ActionsManager.ACTION_STEP_OUT);
else
if (stepRequest != null)
stepRequest.enable ();
else
setStepRequest ();
}
if (ssverbose)
if (stop) {
System.out.println("SS FINISH IN CLASS " +
t.getClassName () + " ********\n"
);
}
return !stop;
}
private StepActionProvider stepActionProvider;
private StepActionProvider getStepActionProvider () {
if (stepActionProvider == null) {
List l = lookupProvider.lookup (null, ActionsProvider.class);
int i, k = l.size ();
for (i = 0; i < k; i++)
if (l.get (i) instanceof StepActionProvider)
stepActionProvider = (StepActionProvider) l.get (i);
}
return stepActionProvider;
}
// other methods ...........................................................
void removeStepRequests () {
super.removeStepRequests ();
stepRequest = null;
if (ssverbose)
System.out.println("SS: remove all patterns");
}
private void setStepRequest () {
removeStepRequests ();
ThreadReference tr = ((JPDAThreadImpl) getDebuggerImpl ().
getCurrentThread ()).getThreadReference ();
stepRequest = getDebuggerImpl ().getVirtualMachine ().
eventRequestManager ().createStepRequest (
tr,
StepRequest.STEP_LINE,
StepRequest.STEP_INTO
);
getDebuggerImpl ().getOperator ().register (stepRequest, this);
stepRequest.setSuspendPolicy (getDebuggerImpl ().getSuspend ());
if (ssverbose)
System.out.println("SS: set patterns:");
addPatternsToRequest (
getSmartSteppingFilterImpl ().getExclusionPatterns ()
);
stepRequest.enable ();
}
private SmartSteppingFilterImpl smartSteppingFilterImpl;
private SmartSteppingFilterImpl getSmartSteppingFilterImpl () {
if (smartSteppingFilterImpl == null)
smartSteppingFilterImpl = (SmartSteppingFilterImpl) lookupProvider.
lookupFirst (null, SmartSteppingFilter.class);
return smartSteppingFilterImpl;
}
private CompoundSmartSteppingListener compoundSmartSteppingListener;
private CompoundSmartSteppingListener getCompoundSmartSteppingListener () {
if (compoundSmartSteppingListener == null)
compoundSmartSteppingListener = (CompoundSmartSteppingListener)
lookupProvider.lookupFirst (null, CompoundSmartSteppingListener.class);
return compoundSmartSteppingListener;
}
private void addPatternsToRequest (String[] patterns) {
if (stepRequest == null) return;
int i, k = patterns.length;
for (i = 0; i < k; i++) {
stepRequest.addClassExclusionFilter (patterns [i]);
if (ssverbose)
System.out.println("SS: " + patterns [i]);
}
}
}
|
| ... 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.