code: /*
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements. See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership. The ASF licenses this file
   * to you 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.
   */
  /*
   * $Id$
   */
  
  package org.apache.xml.serializer.dom3;
  
  import java.io.IOException;
  
  import org.apache.xml.serializer.DOM3Serializer;
  import org.apache.xml.serializer.SerializationHandler;
  import org.apache.xml.serializer.utils.WrappedRuntimeException;
  import org.w3c.dom.DOMErrorHandler;
  import org.w3c.dom.Node;
  import org.w3c.dom.ls.LSSerializerFilter;
  
  /**
   * This class implements the DOM3Serializer interface.
   * 
   * @xsl.usage internal
   */
  public final class DOM3SerializerImpl implements DOM3Serializer {
  
      /**
       * Private class members
       */
      // The DOMErrorHandler
      private DOMErrorHandler fErrorHandler;
  
      // A LSSerializerFilter
      private LSSerializerFilter fSerializerFilter;
  
      // A LSSerializerFilter
      private String fNewLine;
  
      // A SerializationHandler ex. an instance of ToXMLStream
      private SerializationHandler fSerializationHandler;
  
      /**
       * Constructor
       * 
       * @param handler An instance of the SerializationHandler interface. 
       */
      public DOM3SerializerImpl(SerializationHandler handler) {
          fSerializationHandler = handler;
      }
  
      // Public memebers
  
      /**
       * Returns a DOMErrorHandler set on the DOM Level 3 Serializer.
       * 
       * This interface is a public API.
       *
       * @return A Level 3 DOMErrorHandler
       */
      public DOMErrorHandler getErrorHandler() {
          return fErrorHandler;
      }
  
      /**
       * Returns a LSSerializerFilter set on the DOM Level 3 Serializer to filter nodes
       * during serialization.
       * 
       * This interface is a public API.
       *
       * @return The Level 3 LSSerializerFilter
       */
      public LSSerializerFilter getNodeFilter() {
          return fSerializerFilter;
      }
      
      /**
       * Gets the end-of-line sequence of characters to be used during serialization.
       */
      public char[] getNewLine() {
          return (fNewLine != null) ? fNewLine.toCharArray() : null;
      }
  
      /**
       * Serializes the Level 3 DOM node by creating an instance of DOM3TreeWalker
       * which traverses the DOM tree and invokes handler events to serialize
       * the DOM NOde. Throws an exception only if an I/O exception occured
       * while serializing.
       * This interface is a public API.
       *
       * @param node the Level 3 DOM node to serialize
       * @throws IOException if an I/O exception occured while serializing
       */
      public void serializeDOM3(Node node) throws IOException {
          try {
              DOM3TreeWalker walker = new DOM3TreeWalker(fSerializationHandler,
                      fErrorHandler, fSerializerFilter, fNewLine);
  
              walker.traverse(node);
          } catch (org.xml.sax.SAXException se) {
              throw new WrappedRuntimeException(se);
          }
      }
  
      /**
       * Sets a DOMErrorHandler on the DOM Level 3 Serializer.
       * 
       * This interface is a public API.
       *
       * @param handler the Level 3 DOMErrorHandler
       */
      public void setErrorHandler(DOMErrorHandler handler) {
          fErrorHandler = handler;
      }
  
      /**
       * Sets a LSSerializerFilter on the DOM Level 3 Serializer to filter nodes
       * during serialization.
       * 
       * This interface is a public API.
       *
       * @param filter the Level 3 LSSerializerFilter
       */
      public void setNodeFilter(LSSerializerFilter filter) {
          fSerializerFilter = filter;
      }
  
      /**
       * Sets a SerializationHandler on the DOM Serializer.
       * 
       * This interface is a public API.
       *
       * @param handler An instance of SerializationHandler
       */
      public void setSerializationHandler(SerializationHandler handler) {
          fSerializationHandler = handler;
      }
  
      /**
       * Sets the end-of-line sequence of characters to be used during serialization.
       * @param newLine The end-of-line sequence of characters to be used during serialization.
       */
      public void setNewLine(char[] newLine) {
          fNewLine = (newLine != null) ? new String(newLine) : null;
      }
  }
  