Coverage Report - yarfraw.utils.DOMSerializer
 
Classes in this File Line Coverage Branch Coverage Complexity
DOMSerializer
50% 
79% 
4.25
 
 1  
 package yarfraw.utils;
 2  
 
 3  
 
 4  
 import java.io.File;
 5  
 import java.io.FileWriter;
 6  
 import java.io.IOException;
 7  
 import java.io.OutputStream;
 8  
 import java.io.OutputStreamWriter;
 9  
 import java.io.Writer;
 10  
 
 11  
   // DOM imports
 12  
 import org.w3c.dom.Document;
 13  
 import org.w3c.dom.DocumentType;
 14  
 import org.w3c.dom.NamedNodeMap;
 15  
 import org.w3c.dom.Node;
 16  
 import org.w3c.dom.NodeList;
 17  
 
 18  6
 public class DOMSerializer {
 19  
 
 20  
       /** Indentation to use (default is no indentation) */
 21  6
   private String indent = "";
 22  
   
 23  
   /** Line separator to use (default is for Windows) */
 24  6
   private String lineSeparator = "\n";
 25  
   
 26  
   /** Encoding for output (default is UTF-Cool */
 27  6
   private String encoding = "UTF8";
 28  
   
 29  
   public void setLineSeparator(String lineSeparator) {
 30  0
       this.lineSeparator = lineSeparator;
 31  0
   }
 32  
   
 33  
   public void setEncoding(String encoding) {
 34  0
       this.encoding = encoding;
 35  0
   }
 36  
   
 37  
   public void setIndent(int numSpaces) {
 38  0
       StringBuffer buffer = new StringBuffer();
 39  0
       for (int i = 0; i < numSpaces; i++)
 40  0
           buffer.append(" ");
 41  0
       this.indent = buffer.toString();
 42  0
   }
 43  
   
 44  
   public void serialize(Document doc, OutputStream out) throws IOException {
 45  0
       Writer writer = new OutputStreamWriter(out, encoding);
 46  0
       serialize(doc, writer);
 47  0
   }
 48  
   
 49  
   public void serialize(Document doc, File file) throws IOException {
 50  0
       Writer writer = new FileWriter(file);
 51  0
       serialize(doc, writer);
 52  0
   }
 53  
   
 54  
   public void serialize(Document doc, Writer writer) throws IOException {
 55  
       // Start serialization recursion with no indenting
 56  3
     serializeNode(doc, writer, "");
 57  3
       writer.flush();
 58  3
   }
 59  
   
 60  
   public void serializeNode(Node node, Writer writer, String indentLevel)
 61  
           throws IOException {
 62  
       // Determine action based on node type
 63  117
     switch (node.getNodeType()) {
 64  
     case Node.DOCUMENT_NODE:
 65  3
         Document doc = (Document) node;
 66  
         /**
 67  
          * DOM Level 2 code writer.write("<?xml version=\"1.0\"
 68  
          * encoding=\"UTF-8\"?>");
 69  
          */
 70  3
         writer.write("<?xml version=\"");
 71  3
         writer.write(doc.getXmlVersion());
 72  3
         writer.write("\" encoding=\"UTF-8\" standalone=\"");
 73  3
         if (doc.getXmlStandalone())
 74  0
             writer.write("yes");
 75  
         else
 76  3
             writer.write("no");
 77  3
         writer.write("\"");
 78  3
         writer.write("?>");
 79  3
         writer.write(lineSeparator);
 80  
   
 81  
         // recurse on each top-level node
 82  3
         NodeList nodes = node.getChildNodes();
 83  3
         if (nodes != null)
 84  6
             for (int i = 0; i < nodes.getLength(); i++)
 85  3
                 serializeNode(nodes.item(i), writer, "");
 86  
         break;
 87  
     case Node.ELEMENT_NODE:
 88  63
         String name = node.getNodeName();
 89  63
         writer.write(indentLevel + "<" + name);
 90  63
         NamedNodeMap attributes = node.getAttributes();
 91  87
         for (int i = 0; i < attributes.getLength(); i++) {
 92  24
             Node current = attributes.item(i);
 93  24
             writer.write(" " + current.getNodeName() + "=\"");
 94  24
             print(writer, current.getNodeValue());
 95  24
             writer.write("\"");
 96  
         }
 97  63
         writer.write(">");
 98  
   
 99  
         // recurse on each child
 100  63
         NodeList children = node.getChildNodes();
 101  63
         if (children != null) {
 102  63
             if ((children.item(0) != null)
 103  
                     && (children.item(0).getNodeType() == Node.ELEMENT_NODE))
 104  12
                 writer.write(lineSeparator);
 105  
   
 106  168
             for (int i = 0; i < children.getLength(); i++)
 107  105
                 serializeNode(children.item(i), writer, indentLevel
 108  
                         + indent);
 109  
   
 110  63
             if ((children.item(0) != null)
 111  
                     && (children.item(children.getLength() - 1)
 112  
                             .getNodeType() == Node.ELEMENT_NODE))
 113  12
                 writer.write(indentLevel);
 114  
         }
 115  
   
 116  63
         writer.write("</" + name + ">");
 117  63
         writer.write(lineSeparator);
 118  63
         break;
 119  
     case Node.TEXT_NODE:
 120  51
         print(writer, node.getNodeValue());
 121  51
         break;
 122  
     case Node.CDATA_SECTION_NODE:
 123  0
         writer.write("<![CDATA[");
 124  0
         print(writer, node.getNodeValue());
 125  0
         writer.write("]]>");
 126  0
         break;
 127  
     case Node.COMMENT_NODE:
 128  0
         writer.write(indentLevel + "<!-- " + node.getNodeValue() + " -->");
 129  0
         writer.write(lineSeparator);
 130  0
         break;
 131  
     case Node.PROCESSING_INSTRUCTION_NODE:
 132  0
         writer.write("<?" + node.getNodeName() + " " + node.getNodeValue()
 133  
                 + "?>");
 134  0
         writer.write(lineSeparator);
 135  0
         break;
 136  
     case Node.ENTITY_REFERENCE_NODE:
 137  0
         writer.write("&" + node.getNodeName( ) + ";");
 138  0
         break;
 139  
     case Node.DOCUMENT_TYPE_NODE:
 140  0
         DocumentType docType = (DocumentType) node;
 141  0
         String publicId = docType.getPublicId();
 142  0
         String systemId = docType.getSystemId();
 143  0
         String internalSubset = docType.getInternalSubset();
 144  0
         writer.write("<!DOCTYPE " + docType.getName());
 145  0
         if (publicId != null)
 146  0
             writer.write(" PUBLIC \"" + publicId + "\" ");
 147  
         else
 148  0
             writer.write(" SYSTEM ");
 149  0
         writer.write("\"" + systemId + "\"");
 150  0
         if (internalSubset != null)
 151  0
             writer.write(" [" + internalSubset + "]");
 152  0
         writer.write(">");
 153  0
           writer.write(lineSeparator);
 154  
           break;
 155  
       }
 156  117
   }
 157  
   
 158  
   private void print(Writer writer, String s) throws IOException {
 159  
   
 160  75
       if (s == null)
 161  0
           return;
 162  16221
       for (int i = 0, len = s.length(); i < len; i++) {
 163  16146
           char c = s.charAt(i);
 164  16146
           switch (c) {
 165  
           case '<':
 166  0
             writer.write("&lt;");
 167  0
             break;
 168  
         case '>':
 169  0
             writer.write("&gt;");
 170  0
             break;
 171  
         case '&':
 172  0
             writer.write("&amp;");
 173  0
             break;
 174  
         case '\r':
 175  0
             writer.write("&#xD;");
 176  0
                   break;
 177  
               default:
 178  16146
                   writer.write(c);
 179  
               }
 180  
           }
 181  75
       }
 182  
 
 183  
 }
 184  
 /* From the book: Hardcore Java
 185  
 * Title: Java and XML
 186  
 * Third Edition: December 2006
 187  
 * ISBN 10: 0-596-10149-X
 188  
 * ISBN 13: 9780596101497
 189  
 * http://www.oreilly.com/
 190  
 * Java Code Example at http://www.JavaFAQ.nu
 191  
 */