|
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.ObjectReference; import com.sun.jdi.PrimitiveValue; import com.sun.jdi.Value; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; import java.util.*; import org.netbeans.api.debugger.DebuggerEngine; import org.netbeans.api.debugger.Watch; import org.netbeans.api.debugger.DebuggerManager; import org.netbeans.api.debugger.DebuggerManagerAdapter; import org.netbeans.api.debugger.DebuggerManagerListener; import org.netbeans.api.debugger.jpda.InvalidExpressionException; import org.netbeans.spi.debugger.ContextProvider; import org.netbeans.api.debugger.jpda.JPDADebugger; import org.netbeans.api.debugger.jpda.JPDAWatch; 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.netbeans.modules.debugger.jpda.expr.Expression; import org.netbeans.modules.debugger.jpda.expr.ParseException; import org.openide.util.RequestProcessor; /** * @author Jan Jancura */ public class WatchesModel implements TreeModel { private static boolean verbose = (System.getProperty ("netbeans.debugger.viewrefresh") != null) && (System.getProperty ("netbeans.debugger.viewrefresh").indexOf ('w') >= 0); private static boolean USE_CACHE = false; private JPDADebuggerImpl debugger; private Listener listener; private Vector listeners = new Vector (); private ContextProvider lookupProvider; // Watch to Expression or Exception private WeakHashMap watchToExpression = new WeakHashMap(); public WatchesModel (ContextProvider lookupProvider) { debugger = (JPDADebuggerImpl) lookupProvider. lookupFirst (null, JPDADebugger.class); this.lookupProvider = lookupProvider; } /** * * @return threads contained in this group of threads */ public Object getRoot () { return ROOT; } /** * * @return watches contained in this group of watches */ public Object[] getChildren (Object parent, int from, int to) throws UnknownTypeException, NoInformationException { if (parent == ROOT) { // 1) ger Watches Watch[] ws = DebuggerManager.getDebuggerManager (). getWatches (); Watch[] fws = new Watch [to - from]; System.arraycopy (ws, from, fws, 0, to - from); // 2) create JPDAWatches for Watches int i, k = fws.length; JPDAWatch[] jws = new JPDAWatch [k]; for (i = 0; i < k; i++) { // 2.1) get Expression Object expression = watchToExpression.get ( fws [i].getExpression () ); // expression contains Expression or Exception if (expression == null) { try { expression = Expression.parse ( fws [i].getExpression (), Expression.LANGUAGE_JAVA_1_5 ); } catch (ParseException e) { expression = e; } watchToExpression.put ( fws [i].getExpression (), expression ); } // 2.2) create a new JPDAWatch if (expression instanceof Exception) jws [i] = new JPDAWatchImpl (this, fws [i], (Exception) expression); else jws [i] = evaluate (fws [i], (Expression) expression); } if (listener == null) listener = new Listener (this, debugger); return jws; } if (parent instanceof JPDAWatchImpl) { return getLocalsTreeModel ().getChildren (parent, from, to); } return getLocalsTreeModel ().getChildren (parent, from, to); } /** * 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 == ROOT) { if (listener == null) listener = new Listener (this, debugger); return DebuggerManager.getDebuggerManager ().getWatches ().length; } if (node instanceof JPDAWatchImpl) { return getLocalsTreeModel ().getChildrenCount (node); } return getLocalsTreeModel ().getChildrenCount (node); } public boolean isLeaf (Object node) throws UnknownTypeException { if (node == ROOT) return false; if (node instanceof JPDAWatchImpl) return ((JPDAWatchImpl) node).isPrimitive (); return getLocalsTreeModel ().isLeaf (node); } public void addTreeModelListener (TreeModelListener l) { listeners.add (l); } public void removeTreeModelListener (TreeModelListener l) { listeners.remove (l); } void fireTreeChanged () { Vector v = (Vector) listeners.clone (); int i, k = v.size (); for (i = 0; i < k; i++) ((TreeModelListener) v.get (i)).treeChanged (); } void fireNodeChanged (JPDAWatch w) { Vector v = (Vector) listeners.clone (); int i, k = v.size (); for (i = 0; i < k; i++) ((TreeModelListener) v.get (i)).treeNodeChanged (w); } // other methods ........................................................... JPDADebuggerImpl getDebugger () { return debugger; } private LocalsTreeModel localsTreeModel; LocalsTreeModel getLocalsTreeModel () { if (localsTreeModel == null) localsTreeModel = (LocalsTreeModel) lookupProvider. lookupFirst ("LocalsView", TreeModel.class); return localsTreeModel; } JPDAWatch evaluate (Watch w, Expression expr) { try { Value v = debugger.evaluateIn (expr); if (v instanceof ObjectReference) return new JPDAObjectWatchImpl (this, w, (ObjectReference) v); return new JPDAWatchImpl (this, w, v); } catch (InvalidExpressionException e) { return new JPDAWatchImpl (this, w, e); } } /* JPDAWatch evaluate (Watch w) { Value v = null; String exception = null; try { v = debugger.evaluateIn (w.getExpression ()); } catch (InvalidExpressionException e) { e.printStackTrace (); exception = e.getMessage (); } JPDAWatch wi; if (exception != null) wi = new JPDAWatchImpl (this, w, exception); else if (v instanceof ObjectReference) wi = new JPDAObjectWatchImpl (this, w, (ObjectReference) v); else wi = new JPDAWatchImpl (this, w, v); return wi; } */ // innerclasses ............................................................ private static class Listener extends DebuggerManagerAdapter implements PropertyChangeListener { private WeakReference model; private WeakReference debugger; private Listener ( WatchesModel tm, JPDADebuggerImpl debugger ) { model = new WeakReference (tm); this.debugger = new WeakReference (debugger); DebuggerManager.getDebuggerManager ().addDebuggerListener ( DebuggerManager.PROP_WATCHES, this ); debugger.addPropertyChangeListener (this); Watch[] ws = DebuggerManager.getDebuggerManager (). getWatches (); int i, k = ws.length; for (i = 0; i < k; i++) ws [i].addPropertyChangeListener (this); } private WatchesModel getModel () { WatchesModel m = (WatchesModel) model.get (); if (m == null) destroy (); return m; } public void watchAdded (Watch watch) { WatchesModel m = getModel (); if (m == null) return; watch.addPropertyChangeListener (this); m.fireTreeChanged (); } public void watchRemoved (Watch watch) { WatchesModel m = getModel (); if (m == null) return; watch.removePropertyChangeListener (this); m.fireTreeChanged (); } // currently waiting / running refresh task // there is at most one private RequestProcessor.Task task; public void propertyChange (PropertyChangeEvent evt) { final WatchesModel m = getModel (); if (m == null) return; if (m.debugger.getState () == JPDADebugger.STATE_DISCONNECTED) { destroy (); return; } if (evt.getSource () instanceof Watch) { m.fireTreeChanged (); } if (task != null) { // cancel old task task.cancel (); if (verbose) System.out.println("WM cancel old task " + task); task = null; } task = RequestProcessor.getDefault ().post (new Runnable () { public void run () { if (verbose) System.out.println("WM do task " + task); m.fireTreeChanged (); } }, 500); if (verbose) System.out.println("WM create task " + task); } private void destroy () { DebuggerManager.getDebuggerManager ().removeDebuggerListener ( DebuggerManager.PROP_WATCHES, this ); JPDADebugger d = (JPDADebugger) debugger.get (); if (d != null) d.removePropertyChangeListener (this); Watch[] ws = DebuggerManager.getDebuggerManager (). getWatches (); int i, k = ws.length; for (i = 0; i < k; i++) ws [i].removePropertyChangeListener (this); if (task != null) { // cancel old task task.cancel (); if (verbose) System.out.println("WM cancel old 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.