1 22 23 package org.meshcms.util; 24 25 import java.io.*; 26 import org.xml.sax.*; 27 import org.xml.sax.helpers.*; 28 import javax.xml.transform.*; 29 import javax.xml.transform.stream.*; 30 import javax.xml.transform.sax.*; 31 32 public class XHTMLFastBuilder extends XHTMLTagStack { 33 TransformerHandler hd; 34 AttributesImpl atts; 35 String nextTag; 36 37 public XHTMLFastBuilder(Writer out, String charset) throws TransformerConfigurationException { 38 StreamResult streamResult = new StreamResult(out); 39 SAXTransformerFactory tf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); 40 hd = tf.newTransformerHandler(); 41 Transformer serializer = hd.getTransformer(); 42 configureTransformer(serializer, charset); 43 hd.setResult(streamResult); 44 45 try { 46 hd.startDocument(); 47 } catch (SAXException ex) { 48 manageSAXExceptions(ex); 49 } 50 51 atts = new AttributesImpl(); 52 } 53 54 private void openPendingTag() { 55 if (nextTag != null) { 56 try { 57 hd.startElement("", "", nextTag, atts); 58 } catch (SAXException ex) { 59 manageSAXExceptions(ex); 60 } 61 62 atts.clear(); 63 nextTag = null; 64 } 65 } 66 67 public String getCurrentTagName() { 68 return tagStack.empty() ? null : (String ) tagStack.peek(); 69 } 70 71 public XHTMLTagStack openTag(String tagName) { 72 openPendingTag(); 73 nextTag = tagName; 74 tagStack.push(tagName); 75 return this; 76 } 77 78 public XHTMLTagStack setAttribute(String name, String value) { 79 atts.addAttribute("", "", name, "CDATA", value); 80 return this; 81 } 82 83 public XHTMLTagStack addText(String textData) { 84 openPendingTag(); 85 86 try { 87 hd.characters(textData.toCharArray(), 0, textData.length()); 88 } catch (SAXException ex) { 89 manageSAXExceptions(ex); 90 } 91 92 return this; 93 } 94 95 public XHTMLTagStack addCDATA(String textData) { 96 openPendingTag(); 97 98 try { 99 hd.startCDATA(); 100 addText(textData); 101 hd.endCDATA(); 102 } catch (SAXException ex) { 103 manageSAXExceptions(ex); 104 } 105 106 return this; 107 } 108 109 protected void performCloseTag() { 110 openPendingTag(); 111 112 try { 113 hd.endElement("", "", (String ) tagStack.pop()); 114 } catch (SAXException ex) { 115 manageSAXExceptions(ex); 116 } 117 } 118 119 public void flush() { 120 try { 121 hd.endDocument(); 122 } catch (SAXException ex) { 123 manageSAXExceptions(ex); 124 } 125 } 126 127 private void manageSAXExceptions(SAXException ex) { 128 ex.printStackTrace(); 129 } 130 131 public static void main(String [] args) throws Exception { 132 XHTMLFastBuilder doc = new XHTMLFastBuilder(new PrintWriter(System.out), "UTF-8"); 133 doc.test(); 134 doc.flush(); 135 } 136 } 137 | Popular Tags |