|
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.models; import com.sun.jdi.IncompatibleThreadStateException; import com.sun.jdi.InvalidStackFrameException; import com.sun.jdi.Location; import com.sun.jdi.StackFrame; import com.sun.jdi.ThreadReference; import com.sun.jdi.VMDisconnectedException; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.Integer; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Vector; import java.util.WeakHashMap; import org.netbeans.api.debugger.DebuggerEngine; import org.netbeans.spi.debugger.ContextProvider; import org.netbeans.api.debugger.jpda.JPDADebugger; import org.netbeans.spi.viewmodel.NoInformationException; import org.netbeans.spi.viewmodel.TreeModel; import org.netbeans.spi.viewmodel.TreeModelListener; import org.netbeans.spi.viewmodel.UnknownTypeException; import org.netbeans.modules.debugger.jpda.JPDADebuggerImpl; import org.openide.util.RequestProcessor; /** * @author Jan Jancura */ public class BasicCallStackTreeModel implements TreeModel { private static boolean verbose = (System.getProperty ("netbeans.debugger.viewrefresh") != null) && (System.getProperty ("netbeans.debugger.viewrefresh").indexOf ('c') >= 0); private JPDADebuggerImpl debugger; private Listener listener; private Vector listeners = new Vector (); public BasicCallStackTreeModel (ContextProvider lookupProvider) { debugger = (JPDADebuggerImpl) lookupProvider. lookupFirst (null, JPDADebugger.class); } public Object getRoot () { return ROOT; } public Object[] getChildren (Object o, int from, int to) throws NoInformationException, UnknownTypeException { if ( o.equals (ROOT) || (o instanceof ThreadReference) ) { // 1) get ThreadReference ThreadReference threadRef = null; if (o.equals (ROOT)) { JPDAThreadImpl ti = (JPDAThreadImpl) debugger. getCurrentThread (); if (ti != null) threadRef = ti.getThreadReference (); } else threadRef = (ThreadReference) o; if (threadRef == null) throw new NoInformationException ("No current thread"); // 2) get StackFrames for this ThreadReference try { List l = threadRef.frames (from, to - from); StackFrame[] callStack = new StackFrame [l.size ()]; return (StackFrame []) l.toArray (callStack); } catch (IncompatibleThreadStateException ex) { throw new NoInformationException ("Thread is running"); } catch (VMDisconnectedException ex) { return new StackFrame [0]; } } else throw new UnknownTypeException (o); } /** * Returns number of children for given node. * * @param node the parent node * @throws UnknownTypeException if this TreeModel implementation is not * able to resolve children for given node type * * @return true if node is leaf */ public int getChildrenCount (Object node) throws UnknownTypeException, NoInformationException { if ( node.equals (ROOT) || (node instanceof ThreadReference) ) { // 1) get ThreadReference ThreadReference threadRef = null; if (node.equals (ROOT)) { JPDAThreadImpl ti = (JPDAThreadImpl) debugger. getCurrentThread (); if (ti != null) threadRef = ti.getThreadReference (); } else threadRef = (ThreadReference) node; if (threadRef == null) throw new NoInformationException ("No current thread"); // 2) get StackFrames count for this ThreadReference try { return threadRef.frameCount (); } catch (IncompatibleThreadStateException ex) { throw new NoInformationException ("Thread is running"); } catch (VMDisconnectedException ex) { return 0; } } else throw new UnknownTypeException (node); } public boolean isLeaf (Object o) throws UnknownTypeException { if (o.equals (ROOT)) return false; if (o instanceof StackFrame) return true; throw new UnknownTypeException (o); } public void addTreeModelListener (TreeModelListener l) { listeners.add (l); if (listener == null) { listener = new Listener (this, debugger); } } public void removeTreeModelListener (TreeModelListener l) { listeners.remove (l); if (listeners.size () == 0) { listener.destroy (); listener = null; } } public void fireTreeChanged () { Vector v = (Vector) listeners.clone (); int i, k = v.size (); for (i = 0; i < k; i++) ((TreeModelListener) v.get (i)).treeChanged (); } /** * Listens on JPDADebugger on PROP_STATE */ private static class Listener implements PropertyChangeListener { private JPDADebugger debugger; private WeakReference model; private Listener ( BasicCallStackTreeModel tm, JPDADebugger debugger ) { this.debugger = debugger; model = new WeakReference (tm); debugger.addPropertyChangeListener (this); } private BasicCallStackTreeModel getModel () { BasicCallStackTreeModel tm = (BasicCallStackTreeModel) model.get (); if (tm == null) { destroy (); } return tm; } void destroy () { debugger.removePropertyChangeListener (this); if (task != null) { // cancel old task task.cancel (); if (verbose) System.out.println("CSTM cancel old task " + task); task = null; } } // currently waiting / running refresh task // there is at most one private RequestProcessor.Task task; public void propertyChange (PropertyChangeEvent e) { if ( ( (e.getPropertyName () == debugger.PROP_CURRENT_THREAD) || (e.getPropertyName () == debugger.PROP_STATE) ) && (debugger.getState () == debugger.STATE_STOPPED) ) { final BasicCallStackTreeModel tm = getModel (); if (tm == null) return; if (task != null) { // cancel old task task.cancel (); if (verbose) System.out.println("CSTM cancel old task " + task); task = null; } task = RequestProcessor.getDefault ().post (new Runnable () { public void run () { if (debugger.getState () != debugger.STATE_STOPPED) { if (verbose) System.out.println("CSTM cancel started task " + task); return; } if (verbose) System.out.println("CSTM do task " + task); tm.fireTreeChanged (); } }, 500); if (verbose) System.out.println("CSTM create task " + task); } else if ( (e.getPropertyName () == debugger.PROP_STATE) && (debugger.getState () != debugger.STATE_STOPPED) && (task != null) ) { // debugger has been resumed // =>> cancel task task.cancel (); if (verbose) System.out.println("CSTM cancel task " + task); task = 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.