DocWriter.java Source code

Java tutorial

Introduction

Here is the source code for DocWriter.java

Source

/**
 * Copyright (c) 2006-2010 Richard Rodgers
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

//package com.monad.homerun.util;

import java.io.IOException;
import java.io.Writer;

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * DocWriter has a static method for writing XML documents with a writer
 */
public class DocWriter {
    // indentation constant: 2 spaces
    private static final String SINGLE_INDENT = " ";

    public static void writeNodeToStream(Node node, Writer out) throws IOException {
        serializeNode(node, out, "");
        out.write('\n');
        out.flush();
    }

    /**
     * Writes a document to a stream
     * 
     * @param doc
     *        the XML docuument to write
     * @param out
     *        the output stream to write to
     * @throws IOException
     */
    public static void writeDocToStream(Document doc, Writer out) throws IOException {
        serializeNode(doc, out, "");
        out.write('\n');
        out.flush();
    }

    private static void serializeNode(Node node, Writer out, String indent) throws IOException {
        switch (node.getNodeType()) {
        case Node.DOCUMENT_NODE:
            out.write("<?xml version=\"1.0\"?>" + '\n');
            writeNode(((Document) node).getDocumentElement(), out, indent);
            break;
        case Node.ELEMENT_NODE:
            writeNode(node, out, indent);
            break;
        case Node.TEXT_NODE:
            out.write(node.getNodeValue());
            break;
        case Node.COMMENT_NODE:
            out.write( /*indent + */ "<!--" + node.getNodeValue() + "-->");
            break;
        default:
            System.out.println("Got node: " + node.getNodeName());
            break;
        }
    }

    private static void writeNode(Node node, Writer out, String indent) throws IOException {
        out.write(nodeWithAttrs(node, indent));
        NodeList kids = node.getChildNodes();
        if (kids != null) {
            if ((kids.item(0) != null) && (kids.item(0).getNodeType() == Node.ELEMENT_NODE)) {
                out.write('\n');
            }
            for (int i = 0; i < kids.getLength(); i++) {
                serializeNode(kids.item(i), out, indent + SINGLE_INDENT);
            }
            /* RLR - bug in indent logic - seems to work OK without
               if ( ( kids.item( 0 ) != null ) &&
             ( kids.item( kids.getLength()-1).getNodeType() == Node.ELEMENT_NODE ) )
               {
            out.write( indent );
               }
               */
        }
        if (node.hasChildNodes()) {
            /* indent bug - leave out
            if ( kids.item( 0 ) != null && kids.item( 0 ).getNodeType() == Node.ELEMENT_NODE )
            {
               out.write( indent );
            }
            */
            out.write("</" + node.getNodeName() + ">");
        }
    }

    private static String nodeWithAttrs(Node node, String indent) {
        StringBuffer sb = new StringBuffer();
        // indent bug - leave out
        //sb.append( indent );
        sb.append("<");
        sb.append(node.getNodeName());

        NamedNodeMap attrs = node.getAttributes();
        for (int i = 0; i < attrs.getLength(); i++) {
            sb.append(" ");
            Node attrNode = attrs.item(i);
            sb.append(attrNode.getNodeName());
            sb.append("=\"");
            sb.append(attrNode.getNodeValue());
            sb.append("\"");
        }

        if (!node.hasChildNodes()) {
            sb.append("/>");
        } else {
            sb.append(">");
        }

        return sb.toString();
    }
}