Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights 
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  *
  * 1. Redistributions of source code must retain the above copyright
  *    notice, this list of conditions and the following disclaimer. 
  *
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in
  *    the documentation and/or other materials provided with the
  *    distribution.
  *
  * 3. The end-user documentation included with the redistribution, if
  *    any, must include the following acknowlegement:  
  *       "This product includes software developed by the 
  *        Apache Software Foundation (http://www.apache.org/)."
  *    Alternately, this acknowlegement may appear in the software itself,
  *    if and wherever such third-party acknowlegements normally appear.
  *
  * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
  *    Foundation" must not be used to endorse or promote products derived
  *    from this software without prior written permission. For written 
  *    permission, please contact apache@apache.org.
  *
  * 5. Products derived from this software may not be called "Apache"
  *    nor may "Apache" appear in their names without prior written
  *    permission of the Apache Group.
  *
  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * ====================================================================
  *
  * This software consists of voluntary contributions made by many
  * individuals on behalf of the Apache Software Foundation.  For more
  * information on the Apache Software Foundation, please see
  * <http://www.apache.org/>.
  */
 package org.jboss.ws.common;
 
 import static org.jboss.ws.common.Messages.MESSAGES;
 
 import java.io.Writer;
 import java.util.Map;
 
Traverse a DOM tree in order to print a document that is parsed.

Author(s):
Andy Clark, IBM
Thomas.Diesler@jboss.org
 
 public class DOMWriter
 {
    // Print writer
    private PrintWriter out;
    // True, if canonical output
    private boolean canonical;
    // True, if pretty printing should be used
    private boolean prettyprint;
    // True, if the XML declaration should be written
    private boolean writeXMLDeclaration;
    // True, if whitespace should be ignored
    private boolean ignoreWhitespace;
    // Explicit character set encoding
    private String charsetName;
    // indent for the pretty printer
    private int prettyIndent;
    // True, if the XML declaration has been written
    private boolean wroteXMLDeclaration;
   // The node that started the write
   private Node rootNode;
   // True if we want namespace completion
   private boolean completeNamespaces = true;
   // The current default namespace
   public DOMWriter(Writer w)
   {
      this. = new PrintWriter(w);
   }
   public DOMWriter(Writer wString charsetName)
   {
      this. = new PrintWriter(w);
      this. = charsetName;
      this. = true;
   }
   public DOMWriter(OutputStream stream)
   {
      try
      {
         this. = new PrintWriter(new OutputStreamWriter(stream"UTF-8"));
      }
      catch (UnsupportedEncodingException e)
      {
         // ignore, UTF-8 should be available
      }
   }
   public DOMWriter(OutputStream streamString charsetName)
   {
      try
      {
         this. = new PrintWriter(new OutputStreamWriter(streamcharsetName));
         this. = charsetName;
         this. = true;
      }
      catch (UnsupportedEncodingException e)
      {
         throw new IllegalArgumentException(e);
      }
   }

   
Print a node with explicit prettyprinting. The defaults for all other DOMWriter properties apply.
   public static String printNode(Node nodeboolean prettyprint)
   {
      StringWriter strw = new StringWriter();
      new DOMWriter(strw).setPrettyprint(prettyprint).print(node);
      return strw.toString();
   }
   public boolean isCanonical()
   {
      return ;
   }

   
Set wheter entities should appear in their canonical form. The default is false.
   public DOMWriter setCanonical(boolean canonical)
   {
      this. = canonical;
      return this;
   }
   public boolean isIgnoreWhitespace()
   {
      return ;
   }

   
Set whether whitespace should be ignored. The default is false.
   public DOMWriter setIgnoreWhitespace(boolean ignoreWhitespace)
   {
      this. = ignoreWhitespace;
      return this;
   }
   
   
Set wheter subelements should have their namespaces completed. Setting this to false may lead to invalid XML fragments. The default is true.
   public DOMWriter setCompleteNamespaces(boolean complete)
   {
      this. = complete;
      return this;
   }
   public boolean isPrettyprint()
   {
      return ;
   }

   
Set wheter element should be indented. The default is false.
   public DOMWriter setPrettyprint(boolean prettyprint)
   {
      this. = prettyprint;
      return this;
   }
   public boolean isWriteXMLDeclaration()
   {
      return ;
   }

   
Set wheter the XML declaration should be written. The default is false.
   public DOMWriter setWriteXMLDeclaration(boolean flag)
   {
      this. = flag;
      return this;
   }
   public void print(Node node)
   {
      if ( && )
      
       = node;
      printInternal(nodefalse);
   }
   private void printInternal(Node nodeboolean indentEndMarker)
   {
      // is there anything to do?
      if (node == null)
      {
         return;
      }
      // JBAS-2117 - Don't skip the DOCUMENT_NODE
      // if (node instanceof Document) node = ((Document)node).getDocumentElement();
      if ( == false &&  == true &&  == false)
      {
         .print("<?xml version='1.0'");
         if ( != null)
            .print(" encoding='" +  + "'");
         .print("?>");
         if ()
            .println();
          = true;
      }
      int type = node.getNodeType();
      boolean hasChildNodes = node.getChildNodes().getLength() > 0;
      String nodeName = node.getNodeName();
      switch (type)
      {
         // print document
         case .:
         {
            NodeList children = node.getChildNodes();
            int len = children.getLength();
            for (int iChild = 0; iChild < leniChild++)
            {
               printInternal(children.item(iChild), false);
            }
            .flush();
            break;
         }
            // print element with attributes
         case .:
         {
            Element element = (Element)node;
            if ()
            {
               for (int i = 0; i < i++)
               {
                  .print(' ');
               }
               ++;
            }
            .print('<');
            .print(nodeName);
            Map<StringStringnsMap = new HashMap<StringString>();
            String elPrefix = node.getPrefix();
            String elNamespaceURI = node.getNamespaceURI();
            if (elPrefix != null)
            {
               String nsURI = getNamespaceURI(elPrefixelement);
               nsMap.put(elPrefixnsURI);
            }
            Attr attrs[] = sortAttributes(node.getAttributes());
            for (int i = 0; i < attrs.lengthi++)
            {
               Attr attr = attrs[i];
               String atPrefix = attr.getPrefix();
               String atName = attr.getNodeName();
               String atValue = normalize(attr.getNodeValue(), );
               if (atName.equals("xmlns"))
                   = atValue;
               if (atPrefix != null && !atPrefix.equals("xmlns") && !atPrefix.equals("xml"))
               {
                  String nsURI = getNamespaceURI(atPrefixelement);
                  nsMap.put(atPrefixnsURI);
                  // xsi:type='ns1:SubType', xsi:type='xsd:string'
                  if (atName.equals(atPrefix + ":type") && atValue.indexOf(":") > 0)
                  {
                     // xsi defined on the envelope
                     if (nsURI == null)
                        nsURI = getNamespaceURI(atPrefixelementnull);
                     if ("http://www.w3.org/2001/XMLSchema-instance".equals(nsURI))
                     {
                        String typePrefix = atValue.substring(0, atValue.indexOf(":"));
                        String typeURI = getNamespaceURI(typePrefixelement);
                        nsMap.put(typePrefixtypeURI);
                     }
                  }
               }
               .print(" " + atName + "='" + atValue + "'");
            }
            // Add namespace declaration for prefixes 
            // that are defined further up the tree
            if ()
            {
               for (Entry<StringStringe : nsMap.entrySet()) {
                  String prefix = e.getKey();
                  String nsURI = e.getValue();
                  if (nsURI == null)
                  {
                     nsURI = getNamespaceURI(prefixelementnull);
                     .print(" xmlns:" + prefix + "='" + nsURI + "'");
                  }
               }
            }
            // The SAX ContentHandler will by default not add the namespace declaration 
            // <Hello xmlns='http://somens'>World</Hello>
            if (elPrefix == null && elNamespaceURI != null)
            {
               String defaultNamespace = element.getAttribute("xmlns");
               if (defaultNamespace.length() == 0 && !elNamespaceURI.equals())
               {
                  .print(" xmlns='" + elNamespaceURI + "'");
                   = elNamespaceURI;
               }
            }
            if (hasChildNodes)
            {
               .print('>');
            }
            // Find out if the end marker is indented
            indentEndMarker = isEndMarkerIndented(node);
            if (indentEndMarker)
            {
               .print('\n');
            }
            NodeList childNodes = node.getChildNodes();
            int len = childNodes.getLength();
            for (int i = 0; i < leni++)
            {
               Node childNode = childNodes.item(i);
               printInternal(childNodefalse);
            }
            break;
         }
            // handle entity reference nodes
         case .:
         {
            if ()
            {
               NodeList children = node.getChildNodes();
               if (children != null)
               {
                  int len = children.getLength();
                  for (int i = 0; i < leni++)
                  {
                     printInternal(children.item(i), false);
                  }
               }
            }
            else
            {
               .print('&');
               .print(nodeName);
               .print(';');
            }
            break;
         }
            // print cdata sections
         case .:
         {
            if ()
            {
               .print(normalize(node.getNodeValue(), ));
            }
            else
            {
               .print("<![CDATA[");
               .print(node.getNodeValue());
               .print("]]>");
            }
            break;
         }
            // print text
         case .:
         {
            String text = normalize(node.getNodeValue(), );
            if (text.trim().length() > 0)
            {
               .print(text);
            }
            else if ( == false &&  == false)
            {
               .print(text);
            }
            break;
         }
            // print processing instruction
         case .:
         {
            .print("<?");
            .print(nodeName);
            String data = node.getNodeValue();
            if (data != null && data.length() > 0)
            {
               .print(' ');
               .print(data);
            }
            .print("?>");
            break;
         }
            // print comment
         case .:
         {
            for (int i = 0; i < i++)
            {
               .print(' ');
            }
            .print("<!--");
            String data = node.getNodeValue();
            if (data != null)
            {
               .print(data);
            }
            .print("-->");
            if ()
            {
               .print('\n');
            }
            break;
         }
      }
      if (type == .)
      {
         if ()
            --;
         if (hasChildNodes == false)
         {
            .print("/>");
         }
         else
         {
            if (indentEndMarker)
            {
               for (int i = 0; i < i++)
               {
                  .print(' ');
               }
            }
            .print("</");
            .print(nodeName);
            .print('>');
         }
         if ( > 0)
         {
            .print('\n');
         }
      }
      .flush();
   }
   private String getNamespaceURI(String prefixElement elementNode stopNode)
   {
      Node parent = element.getParentNode();
      String nsURI = element.getAttribute("xmlns:" + prefix);
      if (nsURI.length() == 0 && element != stopNode && parent instanceof Element)
         return getNamespaceURI(prefix, (Element)parentstopNode);
      return (nsURI.length() > 0 ? nsURI : null);
   }
   private boolean isEndMarkerIndented(Node node)
   {
      if ()
      {
         NodeList childNodes = node.getChildNodes();
         int len = childNodes.getLength();
         for (int i = 0; i < leni++)
         {
            Node children = childNodes.item(i);
            if (children.getNodeType() == .)
            {
               return true;
            }
         }
      }
      return false;
   }

   
Returns a sorted list of attributes.
   private Attr[] sortAttributes(NamedNodeMap attrs)
   {
      int len = (attrs != null) ? attrs.getLength() : 0;
      Attr array[] = new Attr[len];
      for (int i = 0; i < leni++)
      {
         array[i] = (Attr)attrs.item(i);
      }
      for (int i = 0; i < len - 1; i++)
      {
         String name = array[i].getNodeName();
         int index = i;
         for (int j = i + 1; j < lenj++)
         {
            String curName = array[j].getNodeName();
            if (curName.compareTo(name) < 0)
            {
               name = curName;
               index = j;
            }
         }
         if (index != i)
         {
            Attr temp = array[i];
            array[i] = array[index];
            array[index] = temp;
         }
      }
      return (array);
   }
   
   
Normalizes the given string.
   public static String normalize(String sboolean canonical)
   {
      return Normalizer.normalize(scanonical);
   }
New to GrepCode? Check out our FAQ X