|
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.Location;
import com.sun.jdi.StackFrame;
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.event.MethodEntryEvent;
import com.sun.jdi.event.StepEvent;
import com.sun.jdi.request.EventRequest;
import com.sun.jdi.request.EventRequestManager;
import com.sun.jdi.request.InvalidRequestStateException;
import com.sun.jdi.request.MethodEntryRequest;
import com.sun.jdi.request.MethodExitRequest;
import com.sun.jdi.request.StepRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.netbeans.api.debugger.ActionsManager;
import org.netbeans.api.debugger.DebuggerEngine;
import org.netbeans.api.debugger.DebuggerManager;
import org.netbeans.spi.debugger.ContextProvider;
import org.netbeans.api.debugger.Session;
import org.netbeans.api.debugger.jpda.JPDADebugger;
import org.netbeans.api.debugger.jpda.JPDAThread;
import org.netbeans.api.debugger.jpda.SmartSteppingFilter;
import org.netbeans.spi.debugger.jpda.SmartSteppingCallback;
import org.netbeans.spi.viewmodel.TreeModel;
import org.netbeans.spi.viewmodel.UnknownTypeException;
import org.netbeans.modules.debugger.jpda.JPDADebuggerImpl;
import org.netbeans.modules.debugger.jpda.models.JPDAThreadImpl;
import org.netbeans.modules.debugger.jpda.models.ThreadsTreeModel;
import org.netbeans.modules.debugger.jpda.util.Executor;
import org.netbeans.spi.debugger.ActionsProvider;
/**
* 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 StepActionProvider extends JPDADebuggerActionProvider
implements Executor {
private StepRequest stepRequest;
private ContextProvider lookupProvider;
private static boolean ssverbose =
System.getProperty ("netbeans.debugger.smartstepping") != null;
private static boolean verbose =
System.getProperty ("netbeans.debugger.jdievents") != null;
private static int getJDIAction (Object action) {
if (action == ActionsManager.ACTION_STEP_OUT)
return StepRequest.STEP_OUT;
if (action == ActionsManager.ACTION_STEP_OVER)
return StepRequest.STEP_OVER;
throw new IllegalArgumentException ();
}
public StepActionProvider (ContextProvider lookupProvider) {
super (
(JPDADebuggerImpl) lookupProvider.lookupFirst
(null, JPDADebugger.class)
);
this.lookupProvider = lookupProvider;
}
// ActionProviderSupport ...................................................
public Set getActions () {
return new HashSet (Arrays.asList (new Object[] {
ActionsManager.ACTION_STEP_OUT,
ActionsManager.ACTION_STEP_OVER
}));
}
public void doAction (Object action) {
synchronized (getDebuggerImpl ().LOCK) {
// 1) remove old request
removeStepRequests ();
try {
// 2) init info about current state
ThreadReference tr = ((JPDAThreadImpl) getDebuggerImpl ().
getCurrentThread ()).getThreadReference ();
StackFrame sf = tr.frame (0);
Location l = sf.location ();
// 3) create new step request
stepRequest = getDebuggerImpl ().getVirtualMachine ().
eventRequestManager ().createStepRequest (
tr,
StepRequest.STEP_LINE,
getJDIAction (action)
);
stepRequest.addCountFilter (1);
getDebuggerImpl ().getOperator ().register (stepRequest, this);
stepRequest.setSuspendPolicy (getDebuggerImpl ().getSuspend ());
stepRequest.enable ();
if (verbose)
System.out.println("JDI Request: " + stepRequest);
// 4) resume JVM
getDebuggerImpl ().resume ();
} catch (IncompatibleThreadStateException e) {
e.printStackTrace ();
} catch (VMDisconnectedException e) {
}
}
}
protected void checkEnabled (int debuggerState) {
Iterator i = getActions ().iterator ();
while (i.hasNext ())
setEnabled (
i.next (),
(debuggerState == getDebuggerImpl ().STATE_STOPPED) &&
(getDebuggerImpl ().getCurrentThread () != null)
);
}
// Executor ................................................................
/**
* Executes all step actions and smart stepping.
*
* Should be called from Operator only.
*/
public boolean exec (Event ev) {
// TODO: fetch current engine from the Event
synchronized (getDebuggerImpl ().LOCK) {
// 1) remove step request
removeStepRequests ();
// 2) init info about current state
LocatableEvent event = (LocatableEvent) ev;
String className = event.location ().declaringType ().name ();
ThreadReference tr = event.thread ();
JPDAThread t = getDebuggerImpl ().getThread (tr);
// 3) stop execution here?
boolean fsh = getSmartSteppingFilterImpl ().stopHere (className);
if (ssverbose)
System.out.println("SS SmartSteppingFilter.stopHere (" +
className + ") ? " + fsh
);
if ( fsh &&
getCompoundSmartSteppingListener ().stopHere
(lookupProvider, t, getSmartSteppingFilterImpl ())
) {
// YES!
getDebuggerImpl ().setStoppedState (tr);
return false; // do not resume
}
// do not stop here -> start smart stepping!
if (ssverbose)
System.out.println("\nSS: SMART STEPPING START! ********** ");
boolean stepInto = ((StepRequest) ev.request ()).depth () ==
StepRequest.STEP_INTO;
getStepIntoActionProvider ().doAction
(ActionsManager.ACTION_STEP_INTO);
return true; // resume
}
}
private StepIntoActionProvider stepIntoActionProvider;
private StepIntoActionProvider getStepIntoActionProvider () {
if (stepIntoActionProvider == null) {
List l = lookupProvider.lookup (null, ActionsProvider.class);
int i, k = l.size ();
for (i = 0; i < k; i++)
if (l.get (i) instanceof StepIntoActionProvider)
stepIntoActionProvider = (StepIntoActionProvider) l.get (i);
}
return stepIntoActionProvider;
}
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;
}
}
|
| ... 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.