KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > web > debug > watchesfiltering > JspWatchesTreeFilter


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.netbeans.modules.web.debug.watchesfiltering;
21
22 import java.beans.PropertyChangeEvent JavaDoc;
23 import java.beans.PropertyChangeListener JavaDoc;
24 import java.lang.ref.WeakReference JavaDoc;
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 /**
37  * Tree model filter for JSP EL watches.
38  *
39  * @author Maros Sandor
40  */

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 JavaDoc getRoot(TreeModel original) {
52         return original.getRoot();
53     }
54
55     public Object JavaDoc[] getChildren(TreeModel original, Object JavaDoc parent, int from, int to) throws UnknownTypeException {
56         if (parent == original.getRoot()) {
57             Watch [] allWatches = DebuggerManager.getDebuggerManager().getWatches();
58             Object JavaDoc [] result = original.getChildren(parent, from, to);
59             
60             //original model returns array of JPDAWatch-es, thus we must create an Object array
61
//to allow merging with JspElWatch-es
62
Object JavaDoc[] ch = new Object JavaDoc[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 JavaDoc 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 JavaDoc 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 JavaDoc node) throws UnknownTypeException {
99         if (node instanceof JspElWatch) return true;
100         return original.isLeaf(node);
101     }
102
103     private boolean isJSPexpression(String JavaDoc expression) {
104         return expression.startsWith("${") && expression.endsWith("}"); // NOI18N
105
}
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 JavaDoc {
122         
123         WeakReference JavaDoc<JspWatchesTreeFilter> jspWatchesFilterRef;
124         WeakReference JavaDoc<JPDADebugger> debuggerRef;
125         
126         DebuggerListener(JspWatchesTreeFilter jspWatchesFilter, JPDADebugger debugger) {
127             jspWatchesFilterRef = new WeakReference JavaDoc<JspWatchesTreeFilter>(jspWatchesFilter);
128             debuggerRef = new WeakReference JavaDoc<JPDADebugger>(debugger);
129             debugger.addPropertyChangeListener(this);
130         }
131
132         public void propertyChange (PropertyChangeEvent JavaDoc 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