|
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.ObjectCollectedException;
import com.sun.jdi.ThreadGroupReference;
import com.sun.jdi.ThreadReference;
import com.sun.jdi.VMDisconnectedException;
import com.sun.jdi.VirtualMachine;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
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.ComputingException;
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;
/**
* Basic simple model for ThreadGroupReferences and ThreadReferences.
* Listens on JPDADebugger state and updates all hierarchy.
*
* @author Jan Jancura
*/
public class BasicThreadsTreeModel implements TreeModel {
private static boolean verbose =
(System.getProperty ("netbeans.debugger.viewrefresh") != null) &&
(System.getProperty ("netbeans.debugger.viewrefresh").indexOf ('t') >= 0);
private JPDADebuggerImpl debugger;
private Listener listener;
private Vector listeners = new Vector ();
public BasicThreadsTreeModel (ContextProvider lookupProvider) {
debugger = (JPDADebuggerImpl) lookupProvider.
lookupFirst (null, JPDADebugger.class);
}
public Object getRoot () {
return ROOT;
}
public Object[] getChildren (Object o, int from, int to)
throws UnknownTypeException {
try {
if (o.equals (ROOT)) {
VirtualMachine vm = debugger.getVirtualMachine ();
List ts = new ArrayList ();
if (vm != null)
ts = vm.topLevelThreadGroups ();
ts = ts.subList (from, to);
return ts.toArray (new Object [ts.size ()]);
} else
if (o instanceof ThreadGroupReference) {
ThreadGroupReference tgr = (ThreadGroupReference) o;
List l = new ArrayList (tgr.threadGroups ());
l.addAll (tgr.threads ());
l = l.subList (from, to);
Object[] os = new Object [l.size ()];
return l.toArray (os);
} else
throw new UnknownTypeException (o);
} catch (VMDisconnectedException ex) {
return new Object [0];
}
}
/**
* 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 {
try {
if (node.equals (ROOT)) {
VirtualMachine vm = debugger.getVirtualMachine ();
if (vm != null)
return vm.topLevelThreadGroups ().size ();
return 0;
} else
if (node instanceof ThreadGroupReference) {
ThreadGroupReference tgr = (ThreadGroupReference) node;
return tgr.threadGroups ().size () + tgr.threads ().size ();
} else
throw new UnknownTypeException (node);
} catch (VMDisconnectedException ex) {
return 0;
}
}
public boolean isLeaf (Object o) throws UnknownTypeException {
if (o instanceof ThreadReference) return true;
if (o instanceof ThreadGroupReference) return false;
if (o == ROOT) return false;
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 state property and updates all threads hierarchy.
*/
private static class Listener implements PropertyChangeListener {
private JPDADebugger debugger;
private WeakReference model;
private Listener (
BasicThreadsTreeModel tm,
JPDADebugger debugger
) {
this.debugger = debugger;
model = new WeakReference (tm);
debugger.addPropertyChangeListener (this);
}
private BasicThreadsTreeModel getModel () {
BasicThreadsTreeModel tm = (BasicThreadsTreeModel) 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("TTM 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_STATE) &&
(debugger.getState () == debugger.STATE_STOPPED)
) {
final BasicThreadsTreeModel tm = getModel ();
if (tm == null) return;
if (task != null) {
// cancel old task
task.cancel ();
if (verbose)
System.out.println("TTM cancel old task " + task);
task = null;
}
task = RequestProcessor.getDefault ().post (new Runnable () {
public void run () {
if (verbose)
System.out.println("TTM do task " + task);
tm.fireTreeChanged ();
}
}, 500);
if (verbose)
System.out.println("TTM create task " + task);
} else
if ( (e.getPropertyName () == debugger.PROP_STATE) &&
(debugger.getState () == debugger.STATE_RUNNING)
) {
final BasicThreadsTreeModel tm = getModel ();
if (tm == null) return;
if (task != null) {
// cancel old task
task.cancel ();
if (verbose)
if (verbose)
System.out.println("TTM cancel old R task " + task);
task = null;
}
task = RequestProcessor.getDefault ().post (new Runnable () {
public void run () {
if (verbose)
System.out.println("TTM do R task " + task);
tm.fireTreeChanged ();
if ( (task != null) &&
(debugger.getState () == debugger.STATE_RUNNING)
)
task.schedule (2000);
}
}, 2000);
if (verbose)
System.out.println("TTM create R task " + task);
}
}
}
}
|
| ... 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.