KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > lobobrowser > html > test > SimpleHtmlRendererContext


1 /*
2     GNU LESSER GENERAL PUBLIC LICENSE
3     Copyright (C) 2006 The Lobo Project
4
5     This library is free software; you can redistribute it and/or
6     modify it under the terms of the GNU Lesser General Public
7     License as published by the Free Software Foundation; either
8     version 2.1 of the License, or (at your option) any later version.
9
10     This library is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13     Lesser General Public License for more details.
14
15     You should have received a copy of the GNU Lesser General Public
16     License along with this library; if not, write to the Free Software
17     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19     Contact info: xamjadmin@users.sourceforge.net
20 */

21 /*
22  * Created on Oct 22, 2005
23  */

24 package org.lobobrowser.html.test;
25
26 import java.io.*;
27 import java.net.HttpURLConnection JavaDoc;
28 import java.net.URL JavaDoc;
29 import java.net.URLConnection JavaDoc;
30 import java.util.*;
31
32 import javax.swing.JOptionPane JavaDoc;
33
34 import org.lobobrowser.html.*;
35 import org.lobobrowser.html.domimpl.*;
36 import org.lobobrowser.html.gui.HtmlPanel;
37 import org.lobobrowser.html.parser.DocumentBuilderImpl;
38 import org.lobobrowser.html.parser.InputSourceImpl;
39 import org.lobobrowser.util.io.*;
40 import org.w3c.dom.html2.*;
41
42 import java.util.logging.*;
43
44 /**
45  * The <code>SimpleHtmlRendererContext</code> class implements
46  * the {@link org.lobobrowser.html.HtmlRendererContext} interface.
47  * Note that this class provides simple implementations
48  * of most methods, which should be overridden to provide
49  * real-world functionality.
50  */

51 public class SimpleHtmlRendererContext implements HtmlRendererContext {
52     private static final Logger logger = Logger.getLogger(SimpleHtmlRendererContext.class.getName());
53     private static final Set mediaNames = new HashSet();
54     
55     private final HtmlPanel htmlPanel;
56     private final HtmlRendererContext parentRcontext;
57
58     static {
59         // Media names claimed by this context.
60
Set mn = mediaNames;
61         mn.add("screen");
62         mn.add("tv");
63         mn.add("tty");
64         mn.add("all");
65     }
66     
67     /**
68      * Constructs a SimpleHtmlRendererContext.
69      * @param contextComponent The component that will render HTML.
70      */

71     public SimpleHtmlRendererContext(HtmlPanel contextComponent) {
72         super();
73         this.htmlPanel = contextComponent;
74         this.parentRcontext = null;
75     }
76     
77     /**
78      * Constructs a simple <code>HtmlRendererContext</code> without
79      * a parent. This constructor should not be used to create
80      * the context of a frame with a parent.
81      * @param contextComponent
82      * @param pcontext
83      * @deprecated HtmlParserContext is no longer used in this class.
84      */

85     public SimpleHtmlRendererContext(HtmlPanel contextComponent, HtmlParserContext pcontext) {
86         this(contextComponent, pcontext, null);
87     }
88
89     /**
90      * Constructs a SimpleHtmlRendererContext.
91      * @param contextComponent The component that will render HTML.
92      * @param pcontext A parser context.
93      * @param parentRcontext The parent's renderer context. This is <code>null</code> for the root renderer context.
94      * Normally ony frame renderer contexts would have parents.
95      * @deprecated HtmlParserContext is no longer used in this class.
96      */

97     public SimpleHtmlRendererContext(HtmlPanel contextComponent, HtmlParserContext pcontext, HtmlRendererContext parentRcontext) {
98         super();
99         this.htmlPanel = contextComponent;
100         this.parentRcontext = parentRcontext;
101     }
102     
103     /**
104      * Constructs a SimpleHtmlRendererContext.
105      * @param contextComponent The component that will render HTML.
106      * @param parentRcontext The parent's renderer context. This is <code>null</code> for the root renderer context.
107      * Normally ony frame renderer contexts would have parents.
108      */

109     public SimpleHtmlRendererContext(HtmlPanel contextComponent, HtmlRendererContext parentRcontext) {
110         super();
111         this.htmlPanel = contextComponent;
112         this.parentRcontext = parentRcontext;
113     }
114
115     private volatile String JavaDoc sourceCode;
116     
117     public String JavaDoc getSourceCode() {
118         return this.sourceCode;
119     }
120
121     public HTMLCollection getFrames() {
122         Object JavaDoc rootNode = this.htmlPanel.getRootNode();
123         if(rootNode instanceof HTMLDocumentImpl) {
124             return ((HTMLDocumentImpl) rootNode).getFrames();
125         }
126         else {
127             return null;
128         }
129     }
130
131     /**
132      * This method is called by the local navigate() implementation
133      * and creates a {@link SimpleHtmlParserContext}.
134      * Override this method if you need to use the local navigate()
135      * implementation with an overridden parser context.
136      */

137     protected HtmlParserContext createParserContext(java.net.URL JavaDoc url) {
138         return new SimpleHtmlParserContext();
139     }
140     
141     /**
142      * Implements reload as navigation to current URL.
143      * Override to implement a more robust reloading
144      * mechanism.
145      */

146     public void reload() {
147         HTMLDocumentImpl document = (HTMLDocumentImpl) this.htmlPanel.getRootNode();
148         if(document != null) {
149             try {
150                 URL JavaDoc url = new URL JavaDoc(document.getDocumentURI());
151                 this.navigate(url, null);
152             } catch(java.net.MalformedURLException JavaDoc throwable) {
153                 this.warn("reload(): Malformed URL", throwable);
154             }
155         }
156     }
157     
158     /**
159      * Implements simple navigation with incremental
160      * rendering, and target processing, including
161      * frame lookup. Should be overridden to allow for
162      * more robust browser navigation.
163      * <p>
164      * <b>Notes:</b>
165      * <ul>
166      * <li>Encoding ISO-8859-1 assumed always.
167      * <li>Caching is not implemented.
168      * <li>Cookies are not implemented.
169      * <li>Incremental rendering is not optimized for
170      * ignorable document change notifications.
171      * <li>Other HTTP features are not implemented.
172      * </ul>
173      */

174     public void navigate(final URL JavaDoc href, String JavaDoc target) {
175         // This method implements simple incremental rendering.
176
if(target != null) {
177             HtmlRendererContext topCtx = this.getTop();
178             HTMLCollection frames = topCtx.getFrames();
179             if(frames != null) {
180                 org.w3c.dom.Node JavaDoc frame = frames.namedItem(target);
181                 if(frame instanceof FrameNode) {
182                     BrowserFrame bframe = ((FrameNode) frame).getBrowserFrame();
183                     if(bframe == null) {
184                         throw new IllegalStateException JavaDoc("Frame node without a BrowserFrame instance: " + frame);
185                     }
186                     if(bframe.getHtmlRendererContext() != this) {
187                         bframe.loadURL(href);
188                         return;
189                     }
190                 }
191             }
192             target = target.trim().toLowerCase();
193             if("_top".equals(target)) {
194                 this.getTop().navigate(href, null);
195                 return;
196             }
197             else if ("_parent".equals(target)) {
198                 HtmlRendererContext parent = this.getParent();
199                 if(parent != null) {
200                     parent.navigate(href, null);
201                     return;
202                 }
203             }
204             else if("_blank".equals(target)) {
205                 this.open(href.toExternalForm(), "cobra.blank", "", false);
206                 return;
207             }
208             else {
209                 // fall through
210
}
211         }
212         
213         URL JavaDoc urlForLoading;
214         if(href.getProtocol().equals("file")) {
215             // Remove query so it works.
216
try {
217                 urlForLoading = new URL JavaDoc(href.getProtocol(), href.getHost(), href.getPort(), href.getPath());
218             } catch(java.net.MalformedURLException JavaDoc throwable) {
219                 this.warn("malformed", throwable);
220                 urlForLoading = href;
221             }
222         }
223         else {
224             urlForLoading = href;
225         }
226         final URL JavaDoc finalURLForLoading = urlForLoading;
227         // Make request asynchronously.
228
new Thread JavaDoc() {
229             public void run() {
230                 try {
231                     URL JavaDoc uri = href;
232                     logger.info("process(): Loading URI=[" + uri + "].");
233                     long time0 = System.currentTimeMillis();
234                     // Using potentially different URL for loading.
235
URLConnection JavaDoc connection = finalURLForLoading.openConnection();
236                     connection.setRequestProperty("User-Agent", getUserAgentContext().getUserAgent());
237                     connection.setRequestProperty("Cookie", "");
238                     if (connection instanceof HttpURLConnection JavaDoc) {
239                         HttpURLConnection JavaDoc hc = (HttpURLConnection JavaDoc) connection;
240                         hc.setInstanceFollowRedirects(true);
241                         int responseCode = hc.getResponseCode();
242                         logger.info("process(): HTTP response code: "
243                                 + responseCode);
244                     }
245                     InputStream in = connection.getInputStream();
246                     try {
247                         SimpleHtmlRendererContext.this.sourceCode = null;
248                         long time1 = System.currentTimeMillis();
249                         RecordedInputStream rin = new RecordedInputStream(in);
250                         InputStream bin = new BufferedInputStream(rin, 8192);
251                         HtmlParserContext pcontext = createParserContext(uri);
252                         DocumentBuilderImpl builder = new DocumentBuilderImpl(
253                                 pcontext, SimpleHtmlRendererContext.this);
254                         String JavaDoc actualURI = uri.toExternalForm();
255                         // Only create document, don't parse.
256
HTMLDocumentImpl document = (HTMLDocumentImpl) builder
257                         .createDocument(new InputSourceImpl(bin, actualURI,
258                         "ISO-8859-1"));
259                         // Set document in HtmlPanel. Safe to call outside GUI thread.
260
SimpleHtmlRendererContext.this.htmlPanel.setDocument(document, SimpleHtmlRendererContext.this);
261                         // Now start loading.
262
document.load();
263                         long time2 = System.currentTimeMillis();
264                         logger.info("Parsed URI=[" + uri + "]: Parse elapsed: "
265                                 + (time2 - time1) + " ms. Connection elapsed: "
266                                 + (time1 - time0) + " ms.");
267                         SimpleHtmlRendererContext.this.sourceCode = rin.getString("ISO-8859-1");
268                     } finally {
269                         in.close();
270                     }
271                 } catch (Exception JavaDoc err) {
272                     SimpleHtmlRendererContext.this.error(
273                             "navigate(): Error loading or parsing request.",
274                             err);
275                 }
276             }
277         }.start();
278     }
279     
280     /* (non-Javadoc)
281      * @see org.xamjwg.html.HtmlContext#submitForm(java.lang.String, java.lang.String, java.lang.String, java.lang.String, org.xamjwg.html.FormInput[])
282      */

283     public void submitForm(String JavaDoc method, java.net.URL JavaDoc action, String JavaDoc target, String JavaDoc enctype, FormInput[] formInputs) {
284         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
285         String JavaDoc lineBreak = System.getProperty("line.separator");
286         if(formInputs != null) {
287             for(int i = 0; i < formInputs.length; i++) {
288                 sb.append("INPUT: " + formInputs[i].toString());
289                 sb.append(lineBreak);
290             }
291         }
292         this.warn("submitForm(): Not overridden; method=" + method + "; action=" + action + "; target=" + target + "; enctype=" + enctype + lineBreak + sb);
293     }
294
295     // Methods useful to Window below:
296

297     public void alert(String JavaDoc message) {
298         JOptionPane.showMessageDialog(this.htmlPanel, message);
299     }
300     
301     public void back() {
302         this.warn("back(): Not overridden");
303     }
304     
305     public void blur() {
306         this.warn("back(): Not overridden");
307     }
308
309     public void close() {
310         this.warn("close(): Not overridden");
311     }
312     
313     public boolean confirm(String JavaDoc message) {
314         int retValue = JOptionPane.showConfirmDialog(htmlPanel, message, "Confirm", JOptionPane.YES_NO_OPTION);
315         return retValue == JOptionPane.YES_OPTION;
316     }
317         
318     public void focus() {
319         this.warn("focus(): Not overridden");
320     }
321     
322     public HtmlRendererContext open(String JavaDoc url, String JavaDoc windowName, String JavaDoc windowFeatures, boolean replace) {
323         this.warn("open(): Not overridden");
324         return null;
325     }
326
327     public HtmlRendererContext open(java.net.URL JavaDoc url, String JavaDoc windowName, String JavaDoc windowFeatures, boolean replace) {
328         this.warn("open(): Not overridden");
329         return null;
330     }
331
332     public String JavaDoc prompt(String JavaDoc message, String JavaDoc inputDefault) {
333         return JOptionPane.showInputDialog(htmlPanel, message);
334     }
335
336     public void scroll(int x, int y) {
337         this.warn("scroll(): Not overridden");
338     }
339     
340     public boolean isClosed() {
341         this.warn("isClosed(): Not overridden");
342         return false;
343     }
344     
345     public String JavaDoc getDefaultStatus() {
346         this.warn("getDefaultStatus(): Not overridden");
347         return "";
348     }
349         
350     public int getLength() {
351         this.warn("getLength(): Not overridden");
352         return 0;
353     }
354     
355     public String JavaDoc getName() {
356         this.warn("getName(): Not overridden");
357         return "";
358     }
359     
360     public HtmlRendererContext getParent() {
361         return this.parentRcontext;
362     }
363
364     private volatile HtmlRendererContext opener;
365     
366     public HtmlRendererContext getOpener() {
367         return this.opener;
368     }
369     
370     public void setOpener(HtmlRendererContext opener) {
371         this.opener = opener;
372     }
373     
374     public String JavaDoc getStatus() {
375         this.warn("getStatus(): Not overridden");
376         return "";
377     }
378     
379     public void setStatus(String JavaDoc message) {
380         this.warn("setStatus(): Not overridden");
381     }
382     
383     public HtmlRendererContext getTop() {
384         HtmlRendererContext ancestor = this.parentRcontext;
385         if(ancestor == null) {
386             return this;
387         }
388         return ancestor.getTop();
389     }
390     
391     /* (non-Javadoc)
392      * @see org.xamjwg.html.HtmlContext#createBrowserFrame()
393      */

394     public BrowserFrame createBrowserFrame() {
395         return new SimpleBrowserFrame(this);
396     }
397     
398     public void warn(String JavaDoc message, Throwable JavaDoc throwable) {
399         if(logger.isLoggable(Level.WARNING)) {
400             logger.log(Level.WARNING, message, throwable);
401         }
402     }
403     
404     public void error(String JavaDoc message, Throwable JavaDoc throwable) {
405         if(logger.isLoggable(Level.SEVERE)) {
406             logger.log(Level.SEVERE, message, throwable);
407         }
408     }
409     
410     public void warn(String JavaDoc message) {
411         if(logger.isLoggable(Level.WARNING)) {
412             logger.log(Level.WARNING, message);
413         }
414     }
415     
416     public void error(String JavaDoc message) {
417         if(logger.isLoggable(Level.SEVERE)) {
418             logger.log(Level.SEVERE, message);
419         }
420     }
421
422     public HtmlObject getHtmlObject(HTMLElement element) {
423         HtmlObject result;
424         if("OBJECT".equalsIgnoreCase(element.getTagName())) {
425             result = null;
426         }
427         else {
428             result = new SimpleHtmlObject(element);
429         }
430         this.warn("getHtmlObject(): Not overridden; returning " + result + " for " + element + ".");
431         return result;
432     }
433
434     public void setDefaultStatus(String JavaDoc message) {
435         this.warn("setDefaultStatus(): Not overridden.");
436     }
437
438     private UserAgentContext bcontext = null;
439     
440     public UserAgentContext getUserAgentContext() {
441         this.warn("getUserAgentContext(): Not overridden; returning simple one.");
442         synchronized(this) {
443             if(this.bcontext == null) {
444                 this.bcontext = new SimpleUserAgentContext();
445             }
446             return this.bcontext;
447         }
448     }
449     
450     /**
451      * Should be overridden to return true if the link
452      * has been visited.
453      */

454     public boolean isVisitedLink(HTMLLinkElement link) {
455         //TODO
456
return false;
457     }
458
459     public boolean isMedia(String JavaDoc mediaName) {
460         return mediaNames.contains(mediaName.toLowerCase());
461     }
462 }
463
Popular Tags