1 /*
2  * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 
27 /*
28  * The Original Code is HAT. The Initial Developer of the
29  * Original Code is Bill Foote, with contributions from others
30  * at JavaSoft/Sun.
31  */
32 
33 package com.sun.tools.hat.internal.server;
34 
35 import java.io.PrintWriter;
36 
37 import com.sun.tools.hat.internal.model.*;
38 import com.sun.tools.hat.internal.util.Misc;
39 import java.io.StringWriter;
40 
41 import java.net.URLEncoder;
42 import java.io.UnsupportedEncodingException;
43 
44 /**
45  *
46  * @author      Bill Foote
47  */
48 
49 
50 abstract class QueryHandler {
51 
52     protected String urlStart;
53     protected String query;
54     protected PrintWriter out;
55     protected Snapshot snapshot;
56 
run()57     abstract void run();
58 
59 
setUrlStart(String s)60     void setUrlStart(String s) {
61         urlStart = s;
62     }
63 
setQuery(String s)64     void setQuery(String s) {
65         query = s;
66     }
67 
setOutput(PrintWriter o)68     void setOutput(PrintWriter o) {
69         this.out = o;
70     }
71 
setSnapshot(Snapshot ss)72     void setSnapshot(Snapshot ss) {
73         this.snapshot = ss;
74     }
75 
encodeForURL(String s)76     protected String encodeForURL(String s) {
77         try {
78             s = URLEncoder.encode(s, "UTF-8");
79         } catch (UnsupportedEncodingException ex) {
80             // Should never happen
81             ex.printStackTrace();
82         }
83         return s;
84     }
85 
startHtml(String title)86     protected void startHtml(String title) {
87         out.print("<html><title>");
88         print(title);
89         out.println("</title>");
90         out.println("<body bgcolor=\"#ffffff\"><center><h1>");
91         print(title);
92         out.println("</h1></center>");
93     }
94 
endHtml()95     protected void endHtml() {
96         out.println("</body></html>");
97     }
98 
error(String msg)99     protected void error(String msg) {
100         println(msg);
101     }
102 
printAnchorStart()103     protected void printAnchorStart() {
104         out.print("<a href=\"");
105         out.print(urlStart);
106     }
107 
printThingAnchorTag(long id)108     protected void printThingAnchorTag(long id) {
109         printAnchorStart();
110         out.print("object/");
111         printHex(id);
112         out.print("\">");
113     }
114 
printObject(JavaObject obj)115     protected void printObject(JavaObject obj) {
116         printThing(obj);
117     }
118 
printThing(JavaThing thing)119     protected void printThing(JavaThing thing) {
120         if (thing == null) {
121             out.print("null");
122             return;
123         }
124         if (thing instanceof JavaHeapObject) {
125             JavaHeapObject ho = (JavaHeapObject) thing;
126             long id = ho.getId();
127             if (id != -1L) {
128                 if (ho.isNew())
129                 out.println("<strong>");
130                 printThingAnchorTag(id);
131             }
132             print(thing.toString());
133             if (id != -1) {
134                 if (ho.isNew())
135                     out.println("[new]</strong>");
136                 out.print(" (" + ho.getSize() + " bytes)");
137                 out.println("</a>");
138             }
139         } else {
140             print(thing.toString());
141         }
142     }
143 
printRoot(Root root)144     protected void printRoot(Root root) {
145         StackTrace st = root.getStackTrace();
146         boolean traceAvailable = (st != null) && (st.getFrames().length != 0);
147         if (traceAvailable) {
148             printAnchorStart();
149             out.print("rootStack/");
150             printHex(root.getIndex());
151             out.print("\">");
152         }
153         print(root.getDescription());
154         if (traceAvailable) {
155             out.print("</a>");
156         }
157     }
158 
printClass(JavaClass clazz)159     protected void printClass(JavaClass clazz) {
160         if (clazz == null) {
161             out.println("null");
162             return;
163         }
164         printAnchorStart();
165         out.print("class/");
166         print(encodeForURL(clazz));
167         out.print("\">");
168         print(clazz.toString());
169         out.println("</a>");
170     }
171 
encodeForURL(JavaClass clazz)172     protected String encodeForURL(JavaClass clazz) {
173         if (clazz.getId() == -1) {
174             return encodeForURL(clazz.getName());
175         } else {
176             return clazz.getIdString();
177         }
178     }
179 
printField(JavaField field)180     protected void printField(JavaField field) {
181         print(field.getName() + " (" + field.getSignature() + ")");
182     }
183 
printStatic(JavaStatic member)184     protected void printStatic(JavaStatic member) {
185         JavaField f = member.getField();
186         printField(f);
187         out.print(" : ");
188         if (f.hasId()) {
189             JavaThing t = member.getValue();
190             printThing(t);
191         } else {
192             print(member.getValue().toString());
193         }
194     }
195 
printStackTrace(StackTrace trace)196     protected void printStackTrace(StackTrace trace) {
197         StackFrame[] frames = trace.getFrames();
198         for (int i = 0; i < frames.length; i++) {
199             StackFrame f = frames[i];
200             String clazz = f.getClassName();
201             out.print("<font color=purple>");
202             print(clazz);
203             out.print("</font>");
204             print("." + f.getMethodName() + "(" + f.getMethodSignature() + ")");
205             out.print(" <bold>:</bold> ");
206             print(f.getSourceFileName() + " line " + f.getLineNumber());
207             out.println("<br>");
208         }
209     }
210 
printException(Throwable t)211     protected void printException(Throwable t) {
212         println(t.getMessage());
213         out.println("<pre>");
214         StringWriter sw = new StringWriter();
215         t.printStackTrace(new PrintWriter(sw));
216         print(sw.toString());
217         out.println("</pre>");
218     }
219 
printHex(long addr)220     protected void printHex(long addr) {
221         if (snapshot.getIdentifierSize() == 4) {
222             out.print(Misc.toHex((int)addr));
223         } else {
224             out.print(Misc.toHex(addr));
225         }
226     }
227 
parseHex(String value)228     protected long parseHex(String value) {
229         return Misc.parseHex(value);
230     }
231 
print(String str)232     protected void print(String str) {
233         out.print(Misc.encodeHtml(str));
234     }
235 
println(String str)236     protected void println(String str) {
237         out.println(Misc.encodeHtml(str));
238     }
239 }
240