1 19 20 package org.netbeans.modules.web.debug.watchesfiltering; 21 22 import java.beans.PropertyChangeEvent ; 23 import java.beans.PropertyChangeListener ; 24 import java.lang.ref.WeakReference ; 25 import org.netbeans.spi.viewmodel.TreeModelFilter; 26 import org.netbeans.spi.viewmodel.TreeModel; 27 import org.netbeans.spi.viewmodel.UnknownTypeException; 28 import org.netbeans.spi.viewmodel.ModelListener; 29 import org.netbeans.spi.debugger.ContextProvider; 30 import org.netbeans.api.debugger.Watch; 31 import org.netbeans.api.debugger.DebuggerManager; 32 import org.netbeans.api.debugger.jpda.JPDADebugger; 33 34 import java.util.*; 35 36 41 public class JspWatchesTreeFilter implements TreeModelFilter { 42 43 private final JPDADebugger debugger; 44 private final Map<Watch, JspElWatch> watch2JspElWatch = new HashMap<Watch, JspElWatch>(); 45 private DebuggerListener listener; 46 47 public JspWatchesTreeFilter(ContextProvider lookupProvider) { 48 debugger = (JPDADebugger) lookupProvider.lookupFirst(null, JPDADebugger.class); 49 } 50 51 public Object getRoot(TreeModel original) { 52 return original.getRoot(); 53 } 54 55 public Object [] getChildren(TreeModel original, Object parent, int from, int to) throws UnknownTypeException { 56 if (parent == original.getRoot()) { 57 Watch [] allWatches = DebuggerManager.getDebuggerManager().getWatches(); 58 Object [] result = original.getChildren(parent, from, to); 59 60 Object [] ch = new Object [result.length]; 63 System.arraycopy(result, 0, ch, 0, result.length); 64 65 synchronized (watch2JspElWatch) { 66 67 for (int i = from; i < allWatches.length; i++) { 68 Watch w = allWatches[i]; 69 String expression = w.getExpression(); 70 if (isJSPexpression(expression)) { 71 JspElWatch jw = (JspElWatch) watch2JspElWatch.get(w); 72 if (jw == null ) { 73 jw = new JspElWatch(w, debugger); 74 watch2JspElWatch.put(w, jw); 75 } 76 ch[i - from] = jw; 77 } 78 } 79 } 80 81 if (listener == null) { 82 listener = new DebuggerListener(this, debugger); 83 } 84 85 return ch; 86 } else { 87 return original.getChildren(parent, from, to); 88 } 89 } 90 91 public int getChildrenCount(TreeModel original, Object node) throws UnknownTypeException { 92 if (node == original.getRoot() && listener == null) { 93 listener = new DebuggerListener(this, debugger); 94 } 95 return original.getChildrenCount(node); 96 } 97 98 public boolean isLeaf(TreeModel original, Object node) throws UnknownTypeException { 99 if (node instanceof JspElWatch) return true; 100 return original.isLeaf(node); 101 } 102 103 private boolean isJSPexpression(String expression) { 104 return expression.startsWith("${") && expression.endsWith("}"); } 106 107 public void addModelListener(ModelListener l) { 108 } 109 110 public void removeModelListener(ModelListener l) { 111 } 112 113 void fireTreeChanged() { 114 synchronized (watch2JspElWatch) { 115 for (JspElWatch jspElWatch : watch2JspElWatch.values()) { 116 jspElWatch.setUnevaluated(); 117 } 118 } 119 } 120 121 private static class DebuggerListener implements PropertyChangeListener { 122 123 WeakReference <JspWatchesTreeFilter> jspWatchesFilterRef; 124 WeakReference <JPDADebugger> debuggerRef; 125 126 DebuggerListener(JspWatchesTreeFilter jspWatchesFilter, JPDADebugger debugger) { 127 jspWatchesFilterRef = new WeakReference <JspWatchesTreeFilter>(jspWatchesFilter); 128 debuggerRef = new WeakReference <JPDADebugger>(debugger); 129 debugger.addPropertyChangeListener(this); 130 } 131 132 public void propertyChange (PropertyChangeEvent evt) { 133 134 if (debuggerRef.get().getState() == JPDADebugger.STATE_DISCONNECTED) { 135 destroy(); 136 return; 137 } 138 if (debuggerRef.get().getState() == JPDADebugger.STATE_RUNNING) { 139 return; 140 } 141 142 final JspWatchesTreeFilter jspWatchesFilter = getJspWatchesFilter(); 143 if (jspWatchesFilter != null) { 144 jspWatchesFilter.fireTreeChanged(); 145 } 146 } 147 148 private JspWatchesTreeFilter getJspWatchesFilter() { 149 JspWatchesTreeFilter jspWatchesFilter = jspWatchesFilterRef.get(); 150 if (jspWatchesFilter == null) { 151 destroy(); 152 } 153 return jspWatchesFilter; 154 } 155 156 private void destroy() { 157 JPDADebugger debugger = debuggerRef.get(); 158 if (debugger != null) { 159 debugger.removePropertyChangeListener(this); 160 } 161 } 162 163 } 164 165 } 166 | Popular Tags |