1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.jetspeed.rewriter.html;
18
19 import java.io.IOException;
20 import java.io.Reader;
21 import java.io.Writer;
22 import java.util.Enumeration;
23
24 import javax.swing.text.MutableAttributeSet;
25 import javax.swing.text.html.HTML;
26 import javax.swing.text.html.HTMLEditorKit;
27
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.apache.jetspeed.rewriter.ParserAdaptor;
31 import org.apache.jetspeed.rewriter.Rewriter;
32 import org.apache.jetspeed.rewriter.RewriterException;
33
34 /***
35 * HTML Parser Adaptor for the Swing 'HotJava' parser.
36 *
37 * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
38 * @version $Id: SwingParserAdaptor.java 516448 2007-03-09 16:25:47Z ate $
39 */
40 public class SwingParserAdaptor implements ParserAdaptor
41 {
42 protected final static Log log = LogFactory.getLog(SwingParserAdaptor.class);
43
44 private SwingParserAdaptor.Callback callback = null;
45 private String lineSeparator;
46 private boolean skippingImplied = false;
47 private Rewriter rewriter;
48
49
50
51
52
53
54
55
56 public SwingParserAdaptor()
57 {
58 lineSeparator = System.getProperty("line.separator", "\r\n");
59 }
60
61
62
63
64
65
66
67
68
69
70
71 public void rewrite(Rewriter rewriter, Reader reader, Writer writer)
72 throws RewriterException
73 {
74 try
75 {
76 this.rewriter = rewriter;
77 HTMLEditorKit.Parser parser = new SwingParserAdaptor.ParserGetter().getParser();
78 callback = new SwingParserAdaptor.Callback(writer);
79 parser.parse(reader, callback, true);
80 }
81 catch (Exception e)
82 {
83 e.printStackTrace();
84 throw new RewriterException(e);
85 }
86 }
87
88 public void parse(Rewriter rewriter, Reader reader)
89 throws RewriterException
90 {
91 try
92 {
93 this.rewriter = rewriter;
94 HTMLEditorKit.Parser parser = new SwingParserAdaptor.ParserGetter().getParser();
95 callback = new SwingParserAdaptor.Callback(null);
96 parser.parse(reader, callback, true);
97 }
98 catch (Exception e)
99 {
100 e.printStackTrace();
101 throw new RewriterException(e);
102 }
103 }
104
105
106
107
108
109 class ParserGetter extends HTMLEditorKit
110 {
111
112 public HTMLEditorKit.Parser getParser()
113 {
114 return super.getParser();
115 }
116 }
117
118
119
120
121
122
123 class Callback extends HTMLEditorKit.ParserCallback
124 {
125
126
127 private boolean inForm = false;
128 private boolean inScript = false;
129 private boolean strip = false;
130 private boolean simpleTag = false;
131 private String stripTag = null;
132 private Writer writer = null;
133
134 private Callback (Writer writer)
135 {
136 this.writer = writer;
137 }
138
139
140
141
142
143
144
145
146
147
148 public void handleText(char[] values,int param)
149 {
150 if (strip)
151 {
152 return;
153 }
154 if (values[0] == '>')
155 {
156 return;
157 }
158 if (false == rewriter.enterText(values, param))
159 {
160 return;
161 }
162
163 addToResult(values);
164 }
165
166 private void write(String text)
167 throws IOException
168 {
169 if (writer != null)
170 {
171 writer.write(text);
172 }
173 }
174
175
176
177
178
179
180
181
182
183 public void handleSimpleTag(HTML.Tag htmlTag, MutableAttributeSet attrs, int param)
184 {
185 String tag = htmlTag.toString();
186
187 if (false == rewriter.enterSimpleTagEvent(tag, new SwingAttributes(attrs)))
188 {
189 return;
190 }
191
192 if (strip)
193 {
194 return;
195 }
196
197 if (rewriter.shouldStripTag(tag))
198 {
199 return;
200 }
201
202 if (rewriter.shouldRemoveTag(tag))
203 {
204 return;
205 }
206
207 try
208 {
209 simpleTag = true;
210 appendTagToResult(htmlTag, attrs);
211 write(lineSeparator);
212
213
214
215
216
217
218
219
220 simpleTag = false;
221 String appended = rewriter.exitSimpleTagEvent(tag, new SwingAttributes(attrs));
222 if (null != appended)
223 {
224 write(appended);
225 }
226 }
227 catch (Exception e)
228 {
229 log.error("Simple tag parsing error", e);
230 }
231 }
232
233
234
235
236
237
238
239
240
241 public void handleStartTag(HTML.Tag htmlTag, MutableAttributeSet attrs, int position)
242 {
243 String tag = htmlTag.toString();
244
245 if (false == rewriter.enterStartTagEvent(tag, new SwingAttributes(attrs)))
246 {
247 return;
248 }
249
250 if (strip)
251 {
252 return;
253 }
254
255 if (rewriter.shouldStripTag(tag))
256 {
257 stripTag = tag;
258 strip = true;
259 return;
260 }
261
262 if (rewriter.shouldRemoveTag(tag))
263 {
264 return;
265 }
266
267 try
268 {
269 appendTagToResult(htmlTag, attrs);
270 formatLine(htmlTag);
271 String appended = rewriter.exitStartTagEvent(tag, new SwingAttributes(attrs));
272 if (null != appended)
273 {
274 write(appended);
275 }
276 }
277 catch (Exception e)
278 {
279 log.error("Start tag parsing error", e);
280 }
281
282 }
283
284
285
286
287
288
289
290
291
292
293 public void handleEndTag(HTML.Tag htmlTag, int position)
294 {
295 String tag = htmlTag.toString();
296 if (false == rewriter.enterEndTagEvent(tag.toString()))
297 {
298 return;
299 }
300
301 if (strip)
302 {
303 if (tag.equalsIgnoreCase(stripTag))
304 {
305 strip = false;
306 stripTag = null;
307 }
308 return;
309 }
310
311 if (rewriter.shouldRemoveTag(tag))
312 {
313 return;
314 }
315
316 try
317 {
318 addToResult("</").addToResult(tag).addToResult(">");
319
320
321 write(lineSeparator);
322
323 String appended = rewriter.exitEndTagEvent(tag);
324 if (null != appended)
325 {
326 write(appended);
327 }
328 }
329 catch (Exception e)
330 {
331 log.error("End tag parsing error", e);
332 }
333 }
334
335
336
337
338
339
340
341
342
343 public void handleError(java.lang.String str,int param)
344 {
345
346 }
347
348
349
350
351
352
353
354
355 public void handleComment(char[] values,int param)
356 {
357 if (strip || rewriter.shouldRemoveComments())
358 {
359 return;
360 }
361 addToResult("<!-- ").addToResult(values).addToResult(" -->").addToResult(lineSeparator);
362 }
363
364
365
366
367
368
369
370 public void handleEndOfLineString(java.lang.String str)
371 {
372 if (strip)
373 {
374 return;
375 }
376
377 addToResult(lineSeparator);
378 addToResult(str);
379 }
380
381
382
383
384
385
386
387
388 private void formatLine(HTML.Tag tag)
389 {
390 try
391 {
392 if (tag.isBlock() ||
393 tag.breaksFlow() ||
394 tag == HTML.Tag.FRAME ||
395 tag == HTML.Tag.FRAMESET ||
396 tag == HTML.Tag.SCRIPT)
397 {
398 write(lineSeparator);
399 }
400
401 }
402 catch (Exception e)
403 {
404 log.error("Format Line tag parsing error", e);
405 }
406
407 }
408
409
410
411
412
413
414
415
416
417
418
419 private Callback addToResult(Object txt)
420 {
421
422
423
424
425 try
426 {
427 write(txt.toString());
428 }
429 catch (Exception e)
430 {
431 System.err.println("Error parsing:" + e);
432 }
433 return this;
434 }
435
436
437
438
439
440
441
442
443
444
445 private Callback addToResult(char[] txt)
446 {
447
448
449 try
450 {
451 if (writer != null)
452 {
453 writer.write(txt);
454 }
455
456 }
457 catch (Exception e)
458 {
459 }
460 return this;
461 }
462
463
464
465
466
467
468 public void getResult()
469 {
470 try
471 {
472 if (writer != null)
473 {
474 writer.flush();
475 }
476 }
477 catch (Exception e)
478 {
479 }
480
481
482
483
484
485 }
486
487
488
489
490
491 public void flush() throws javax.swing.text.BadLocationException
492 {
493
494 }
495
496
497
498
499
500
501
502
503 private void appendTagToResult(HTML.Tag tag, MutableAttributeSet attrs)
504 {
505 convertURLS(tag, attrs);
506 Enumeration e = attrs.getAttributeNames();
507 addToResult("<").addToResult(tag);
508 while (e.hasMoreElements())
509 {
510 Object attr = e.nextElement();
511 String value = attrs.getAttribute(attr).toString();
512 addToResult(" ").addToResult(attr).addToResult("=\"").
513 addToResult(value).addToResult("\"");
514 }
515 if (simpleTag)
516 addToResult("/>");
517 else
518 addToResult(">");
519 }
520
521
522
523
524
525
526
527
528
529
530
531 private void convertURLS( HTML.Tag tag, MutableAttributeSet attrs )
532 {
533 rewriter.enterConvertTagEvent(tag.toString(), new SwingAttributes(attrs));
534
535
536
537
538
539 }
540
541
542 }
543
544 }