/*
 * 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;
    }
}
