You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mr...@apache.org on 2011/12/29 05:13:09 UTC

svn commit: r1225426 [12/19] - in /xalan/java/trunk/src: ./ org/apache/xalan/ org/apache/xalan/res/ org/apache/xalan/xsltc/compiler/util/ org/apache/xalan/xsltc/dom/ org/apache/xalan/xsltc/runtime/ org/apache/xml/dtm/ org/apache/xml/res/ org/apache/xml...

Modified: xalan/java/trunk/src/org/apache/xml/serializer/dom3/LSSerializerImpl.java
URL: http://svn.apache.org/viewvc/xalan/java/trunk/src/org/apache/xml/serializer/dom3/LSSerializerImpl.java?rev=1225426&r1=1225425&r2=1225426&view=diff
==============================================================================
--- xalan/java/trunk/src/org/apache/xml/serializer/dom3/LSSerializerImpl.java (original)
+++ xalan/java/trunk/src/org/apache/xml/serializer/dom3/LSSerializerImpl.java Thu Dec 29 04:13:08 2011
@@ -1,1537 +1,1537 @@
-/*
- * 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.FileOutputStream;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import org.apache.xml.serializer.DOM3Serializer;
-import org.apache.xml.serializer.Encodings;
-import org.apache.xml.serializer.OutputPropertiesFactory;
-import org.apache.xml.serializer.Serializer;
-import org.apache.xml.serializer.SerializerFactory;
-import org.apache.xml.serializer.utils.MsgKey;
-import org.apache.xml.serializer.utils.SystemIDResolver;
-import org.apache.xml.serializer.utils.Utils;
-import org.w3c.dom.DOMConfiguration;
-import org.w3c.dom.DOMError;
-import org.w3c.dom.DOMErrorHandler;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.DOMStringList;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.ls.LSException;
-import org.w3c.dom.ls.LSOutput;
-import org.w3c.dom.ls.LSSerializer;
-import org.w3c.dom.ls.LSSerializerFilter;
-
-/**
- * Implemenatation of DOM Level 3 org.w3c.ls.LSSerializer and 
- * org.w3c.dom.ls.DOMConfiguration.  Serialization is achieved by delegating 
- * serialization calls to <CODE>org.apache.xml.serializer.ToStream</CODE> or 
- * one of its derived classes depending on the serialization method, while walking
- * the DOM in DOM3TreeWalker.  
- * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer">org.w3c.dom.ls.LSSerializer</a>
- * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">org.w3c.dom.DOMConfiguration</a>
- *  
- * @version $Id:  
- * 
- * @xsl.usage internal 
- */
-final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
-    
-    // The default end-of-line character sequence used in serialization.
-    private static final String DEFAULT_END_OF_LINE;
-    static {
-        String lineSeparator = (String) AccessController.doPrivileged(new PrivilegedAction() {
-            public Object run() {
-                try {
-                    return System.getProperty("line.separator");
-                }
-                catch (SecurityException ex) {}
-                return null;
-            }
-        });
-        // The DOM Level 3 Load and Save specification requires that implementations choose a default
-        // sequence which matches one allowed by XML 1.0 (or XML 1.1). If the value of "line.separator" 
-        // isn't one of the XML 1.0 end-of-line sequences then we select "\n" as the default value.
-        DEFAULT_END_OF_LINE = lineSeparator != null && 
-            (lineSeparator.equals("\r\n") || lineSeparator.equals("\r")) ? lineSeparator : "\n";
-    }
-    
-    /** private data members */
-    private Serializer fXMLSerializer = null;
-    
-    // Tracks DOMConfiguration features. 
-    protected int fFeatures = 0;
-    
-    // Common DOM serializer
-    private  DOM3Serializer fDOMSerializer = null;
-    
-    // A filter set on the LSSerializer
-    private LSSerializerFilter fSerializerFilter = null;  
-    
-    // Stores the nodeArg parameter to speed up multiple writes of the same node.
-    private Node fVisitedNode = null;
-    
-    // The end-of-line character sequence used in serialization. "\n" is whats used on the web.
-    private String fEndOfLine = DEFAULT_END_OF_LINE;
-    
-    // The DOMErrorhandler.
-    private DOMErrorHandler fDOMErrorHandler = null;
-    
-    // The Configuration parameter to pass to the Underlying serilaizer.
-    private Properties fDOMConfigProperties = null;
-    
-    // The encoding to use during serialization.
-    private String fEncoding; 
-	
-    // ************************************************************************
-    // DOM Level 3 DOM Configuration parameter names
-    // ************************************************************************    
-    // Parameter canonical-form, true [optional] - NOT SUPPORTED 
-    private final static int CANONICAL = 0x1 << 0;
-    
-    // Parameter cdata-sections, true [required] (default)
-    private final static int CDATA = 0x1 << 1;
-    
-    // Parameter check-character-normalization, true [optional] - NOT SUPPORTED 
-    private final static int CHARNORMALIZE = 0x1 << 2;
-    
-    // Parameter comments, true [required] (default)
-    private final static int COMMENTS = 0x1 << 3;
-    
-    // Parameter datatype-normalization, true [optional] - NOT SUPPORTED
-    private final static int DTNORMALIZE = 0x1 << 4;    
-    
-    // Parameter element-content-whitespace, true [required] (default) - value - false [optional] NOT SUPPORTED
-    private final static int ELEM_CONTENT_WHITESPACE = 0x1 << 5;
-    
-    // Parameter entities, true [required] (default)
-    private final static int ENTITIES = 0x1 << 6;
-    
-    // Parameter infoset, true [required] (default), false has no effect --> True has no effect for the serializer
-    private final static int INFOSET = 0x1 << 7;
-    
-    // Parameter namespaces, true [required] (default)
-    private final static int NAMESPACES = 0x1 << 8;
-    
-    // Parameter namespace-declarations, true [required] (default)
-    private final static int NAMESPACEDECLS = 0x1 << 9;
-    
-    // Parameter normalize-characters, true [optional] - NOT SUPPORTED
-    private final static int NORMALIZECHARS = 0x1 << 10;
-    
-    // Parameter split-cdata-sections, true [required] (default)
-    private final static int SPLITCDATA = 0x1 << 11;   
-    
-    // Parameter validate, true [optional] - NOT SUPPORTED
-    private final static int VALIDATE = 0x1 << 12;   
-    
-    // Parameter validate-if-schema, true [optional] - NOT SUPPORTED
-    private final static int SCHEMAVALIDATE = 0x1 << 13;
-    
-    // Parameter split-cdata-sections, true [required] (default)
-    private final static int WELLFORMED = 0x1 << 14;   
-    
-    // Parameter discard-default-content, true [required] (default)
-    // Not sure how this will be used in level 2 Documents
-    private final static int DISCARDDEFAULT = 0x1 << 15;       
-    
-    // Parameter format-pretty-print, true [optional] 
-    private final static int PRETTY_PRINT = 0x1 << 16;
-    
-    // Parameter ignore-unknown-character-denormalizations, true [required] (default)
-    // We currently do not support XML 1.1 character normalization
-    private final static int IGNORE_CHAR_DENORMALIZE = 0x1 << 17;
-    
-    // Parameter discard-default-content, true [required] (default)
-    private final static int XMLDECL = 0x1 << 18;    
-    // ************************************************************************
-    
-    // Recognized parameters for which atleast one value can be set
-    private String fRecognizedParameters [] = {
-            DOMConstants.DOM_CANONICAL_FORM,
-            DOMConstants.DOM_CDATA_SECTIONS,
-            DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
-            DOMConstants.DOM_COMMENTS,
-            DOMConstants.DOM_DATATYPE_NORMALIZATION,
-            DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
-            DOMConstants.DOM_ENTITIES,
-            DOMConstants.DOM_INFOSET,
-            DOMConstants.DOM_NAMESPACES,
-            DOMConstants.DOM_NAMESPACE_DECLARATIONS,
-            //DOMConstants.DOM_NORMALIZE_CHARACTERS,
-            DOMConstants.DOM_SPLIT_CDATA,
-            DOMConstants.DOM_VALIDATE,
-            DOMConstants.DOM_VALIDATE_IF_SCHEMA,
-            DOMConstants.DOM_WELLFORMED,
-            DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
-            DOMConstants.DOM_FORMAT_PRETTY_PRINT,
-            DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS,
-            DOMConstants.DOM_XMLDECL,
-            DOMConstants.DOM_ERROR_HANDLER
-    };
-    
-    
-    /**
-     * Constructor:  Creates a LSSerializerImpl object.  The underlying
-     * XML 1.0 or XML 1.1 org.apache.xml.serializer.Serializer object is
-     * created and initialized the first time any of the write methods are  
-     * invoked to serialize the Node.  Subsequent write methods on the same
-     * LSSerializerImpl object will use the previously created Serializer object.
-     */
-    public LSSerializerImpl () {
-        // set default parameters
-        fFeatures |= CDATA;
-        fFeatures |= COMMENTS;
-        fFeatures |= ELEM_CONTENT_WHITESPACE;
-        fFeatures |= ENTITIES;
-        fFeatures |= NAMESPACES;
-        fFeatures |= NAMESPACEDECLS;
-        fFeatures |= SPLITCDATA;
-        fFeatures |= WELLFORMED;
-        fFeatures |= DISCARDDEFAULT;
-        fFeatures |= XMLDECL;
-        
-        // New OutputFormat properties
-        fDOMConfigProperties = new Properties();
-        
-        // Initialize properties to be passed on the underlying serializer
-        initializeSerializerProps();
-        
-        // Create the underlying serializer.
-        Properties  configProps = OutputPropertiesFactory.getDefaultMethodProperties("xml");
-        
-        // change xml version from 1.0 to 1.1
-        //configProps.setProperty("version", "1.1");
-        
-        // Get a serializer that seriailizes according the the properties,
-        // which in this case is to xml
-        fXMLSerializer = SerializerFactory.getSerializer(configProps);
-        
-        // Initialize Serializer
-        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
-    }
-    
-    /**
-     * Initializes the underlying serializer's configuration depending on the
-     * default DOMConfiguration parameters. This method must be called before a
-     * node is to be serialized.
-     * 
-     * @xsl.usage internal
-     */
-    public void initializeSerializerProps () {
-        // canonical-form
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // cdata-sections
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // "check-character-normalization"
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
-                DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // comments
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // datatype-normalization
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_DATATYPE_NORMALIZATION,
-                DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // element-content-whitespace
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
-                DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // entities
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
-        // preserve entities
-        fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
-                + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
-
-        // error-handler
-        // Should we set our default ErrorHandler
-        /*
-         * if (fDOMConfig.getParameter(Constants.DOM_ERROR_HANDLER) != null) {
-         * fDOMErrorHandler =
-         * (DOMErrorHandler)fDOMConfig.getParameter(Constants.DOM_ERROR_HANDLER); }
-         */
-        
-        // infoset
-        if ((fFeatures & INFOSET) != 0) {
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
-                    DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
-                    DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
-            // preserve entities
-            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
-                    + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_CDATA_SECTIONS,
-                    DOMConstants.DOM3_DEFAULT_FALSE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_VALIDATE_IF_SCHEMA,
-                    DOMConstants.DOM3_DEFAULT_FALSE);
-            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                    + DOMConstants.DOM_DATATYPE_NORMALIZATION,
-                    DOMConstants.DOM3_DEFAULT_FALSE);
-        }
-        
-        // namespaces
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // namespace-declarations
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
-                DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // normalize-characters
-        /*
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_NORMALIZE_CHARACTERS,
-                DOMConstants.DOM3_DEFAULT_FALSE);
-        */
-        
-        // split-cdata-sections
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // validate
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_VALIDATE, DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // validate-if-schema
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_VALIDATE_IF_SCHEMA,
-                DOMConstants.DOM3_DEFAULT_FALSE);
-        
-        // well-formed
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // pretty-print
-        fDOMConfigProperties.setProperty(
-                DOMConstants.S_XSL_OUTPUT_INDENT,
-                DOMConstants.DOM3_DEFAULT_TRUE);
-        fDOMConfigProperties.setProperty(
-                OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, Integer.toString(3));
-        
-        // 
-        
-        // discard-default-content
-        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
-                + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
-                DOMConstants.DOM3_DEFAULT_TRUE);
-        
-        // xml-declaration
-        fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "no");
-        
-    }    
-    
-    // ************************************************************************
-    // DOMConfiguraiton implementation
-    // ************************************************************************
-    
-    /** 
-     * Checks if setting a parameter to a specific value is supported.    
-     *  
-     * @see org.w3c.dom.DOMConfiguration#canSetParameter(java.lang.String, java.lang.Object)
-     * @since DOM Level 3
-     * @param name A String containing the DOMConfiguration parameter name.
-     * @param value An Object specifying the value of the corresponding parameter. 
-     */
-    public boolean canSetParameter(String name, Object value) {
-        if (value instanceof Boolean){
-            if ( name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)    
-                    || name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)    
-                    || name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)                
-                    || name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)){
-                // both values supported
-                return true;
-            }
-            else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
-                    // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
-                    ) {
-                // true is not supported
-                return !((Boolean)value).booleanValue();
-            }
-            else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
-                // false is not supported
-                return ((Boolean)value).booleanValue();
-            }
-        }
-        else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER) &&
-                value == null || value instanceof DOMErrorHandler){
-            return true;
-        }
-        return false;
-    }
-    /**
-     * This method returns the value of a parameter if known.
-     * 
-     * @see org.w3c.dom.DOMConfiguration#getParameter(java.lang.String)
-     * 
-     * @param name A String containing the DOMConfiguration parameter name 
-     *             whose value is to be returned.
-     * @return Object The value of the parameter if known. 
-     */
-    public Object getParameter(String name) throws DOMException {
-        if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)) {
-            return ((fFeatures & COMMENTS) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)) {
-            return ((fFeatures & CDATA) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)) {
-            return ((fFeatures & ENTITIES) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)) {
-            return ((fFeatures & NAMESPACES) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)) {
-            return ((fFeatures & NAMESPACEDECLS) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)) {
-            return ((fFeatures & SPLITCDATA) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)) {
-            return ((fFeatures & WELLFORMED) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        }  else if (name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)) {
-            return ((fFeatures & DISCARDDEFAULT) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
-            return ((fFeatures & PRETTY_PRINT) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)) {
-            return ((fFeatures & XMLDECL) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)) {
-            return ((fFeatures & ELEM_CONTENT_WHITESPACE) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
-            return ((fFeatures & PRETTY_PRINT) != 0) ? Boolean.TRUE : Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
-            return Boolean.TRUE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
-                || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
-                || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION) 
-                // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)                
-                || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
-                || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
-            return Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)){
-            if ((fFeatures & ENTITIES) == 0 &&
-                    (fFeatures & CDATA) == 0 &&
-                    (fFeatures & ELEM_CONTENT_WHITESPACE) != 0 &&
-                    (fFeatures & NAMESPACES) != 0 &&
-                    (fFeatures & NAMESPACEDECLS) != 0 &&
-                    (fFeatures & WELLFORMED) != 0 &&
-                    (fFeatures & COMMENTS) != 0) {
-                return Boolean.TRUE;
-            }                 
-            return Boolean.FALSE;
-        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER)) {
-            return fDOMErrorHandler;
-        } else if (
-                name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION)
-                || name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
-            return null;
-        } else {
-            // Here we have to add the Xalan specific DOM Message Formatter
-            String msg = Utils.messages.createMessage(
-                    MsgKey.ER_FEATURE_NOT_FOUND,
-                    new Object[] { name });
-            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
-        }
-    }
-    
-    /**
-     * This method returns a of the parameters supported by this DOMConfiguration object 
-     * and for which at least one value can be set by the application
-     * 
-     * @see org.w3c.dom.DOMConfiguration#getParameterNames()
-     * 
-     * @return DOMStringList A list of DOMConfiguration parameters recognized
-     *                       by the serializer
-     */
-    public DOMStringList getParameterNames() {
-        return new DOMStringListImpl(fRecognizedParameters);
-    }
-    
-    /**
-     * This method sets the value of the named parameter.
-     *   
-     * @see org.w3c.dom.DOMConfiguration#setParameter(java.lang.String, java.lang.Object)
-     * 
-     * @param name A String containing the DOMConfiguration parameter name.
-     * @param value An Object contaiing the parameters value to set.
-     */
-    public void setParameter(String name, Object value) throws DOMException {
-        // If the value is a boolean
-        if (value instanceof Boolean) {
-            boolean state = ((Boolean) value).booleanValue();
-            
-            if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)) {
-                fFeatures = state ? fFeatures | COMMENTS : fFeatures
-                        & ~COMMENTS;
-                // comments
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }                
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)) {
-                fFeatures =  state ? fFeatures | CDATA : fFeatures
-                        & ~CDATA;
-                // cdata-sections
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)) {
-                fFeatures = state ? fFeatures | ENTITIES : fFeatures
-                        & ~ENTITIES;
-                // entities
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    fDOMConfigProperties.setProperty(
-                            DOMConstants.S_XERCES_PROPERTIES_NS
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    fDOMConfigProperties.setProperty(
-                            DOMConstants.S_XERCES_PROPERTIES_NS
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)) {
-                fFeatures = state ? fFeatures | NAMESPACES : fFeatures
-                        & ~NAMESPACES;
-                // namespaces
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                }       
-            } else if (name
-                    .equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)) {
-                fFeatures = state ? fFeatures | NAMESPACEDECLS
-                        : fFeatures & ~NAMESPACEDECLS;
-                // namespace-declarations
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                } 
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)) {
-                fFeatures = state ? fFeatures | SPLITCDATA : fFeatures
-                        & ~SPLITCDATA;
-                // split-cdata-sections
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                }  
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)) {
-                fFeatures = state ? fFeatures | WELLFORMED : fFeatures
-                        & ~WELLFORMED;
-                // well-formed
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                }                  
-            } else if (name
-                    .equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)) {
-                fFeatures = state ? fFeatures | DISCARDDEFAULT
-                        : fFeatures & ~DISCARDDEFAULT;
-                // discard-default-content
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT, DOMConstants.DOM3_EXPLICIT_FALSE); 
-                }                    
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
-                fFeatures = state ? fFeatures | PRETTY_PRINT : fFeatures
-                        & ~PRETTY_PRINT;
-                // format-pretty-print
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_FORMAT_PRETTY_PRINT, DOMConstants.DOM3_EXPLICIT_TRUE);
-                }
-                else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_FORMAT_PRETTY_PRINT, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)) {
-                fFeatures = state ? fFeatures | XMLDECL : fFeatures
-                        & ~XMLDECL;
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "no");
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "yes"); 
-                }       
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)) {
-                fFeatures = state ? fFeatures | ELEM_CONTENT_WHITESPACE : fFeatures
-                        & ~ELEM_CONTENT_WHITESPACE;
-                // element-content-whitespace
-                if (state) {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }            
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
-                // false is not supported
-                if (!state) {
-                    // Here we have to add the Xalan specific DOM Message Formatter
-                    String msg = Utils.messages.createMessage(
-                            MsgKey.ER_FEATURE_NOT_SUPPORTED,
-                            new Object[] { name });
-                    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
-                } else {
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
-                    || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
-                    // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
-                    ) {
-                // true is not supported
-                if (state) {
-                    String msg = Utils.messages.createMessage(
-                            MsgKey.ER_FEATURE_NOT_SUPPORTED,
-                            new Object[] { name });
-                    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
-                } else {
-                    if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_VALIDATE, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION 
-                                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } /* else if (name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)) {
-                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                                + DOMConstants.DOM_NORMALIZE_CHARACTERS, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    } */
-                }
-            } else if (name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)) {
-                // infoset
-                if (state) {
-                    fFeatures &= ~ENTITIES;
-                    fFeatures &= ~CDATA;
-                    fFeatures &= ~SCHEMAVALIDATE;
-                    fFeatures &= ~DTNORMALIZE;
-                    fFeatures |= NAMESPACES;
-                    fFeatures |= NAMESPACEDECLS;
-                    fFeatures |= WELLFORMED;
-                    fFeatures |= ELEM_CONTENT_WHITESPACE;
-                    fFeatures |= COMMENTS;
-                    
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE); 
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
-                    
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
-                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);            
-                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS 
-                            + DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
-                }
-            } else {
-                // If this is a non-boolean parameter a type mismatch should be thrown.
-                if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
-                    String msg = Utils.messages.createMessage(
-                            MsgKey.ER_TYPE_MISMATCH_ERR,
-                            new Object[] { name });
-                    throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
-                }
-                
-                // Parameter is not recognized
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_FEATURE_NOT_FOUND,
-                        new Object[] { name });
-                throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
-            }
-        } // If the parameter value is not a boolean 
-        else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER)) {
-            if (value == null || value instanceof DOMErrorHandler) {
-                fDOMErrorHandler = (DOMErrorHandler)value;
-            } else {
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_TYPE_MISMATCH_ERR,
-                        new Object[] { name });
-                throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
-            }
-        } else if (
-                name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION)
-                || name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
-            if (value != null) {
-                if (!(value instanceof String)) {
-                    String msg = Utils.messages.createMessage(
-                            MsgKey.ER_TYPE_MISMATCH_ERR,
-                            new Object[] { name });
-                    throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
-                }
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_FEATURE_NOT_SUPPORTED,
-                        new Object[] { name });
-                throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
-            }
-        } else {
-            // If this is a boolean parameter a type mismatch should be thrown.
-            if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION) ||
-                    name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)) {
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_TYPE_MISMATCH_ERR,
-                        new Object[] { name });
-                throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
-            }
-            
-            // Parameter is not recognized
-            String msg = Utils.messages.createMessage(
-                    MsgKey.ER_FEATURE_NOT_FOUND,
-                    new Object[] { name });
-            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
-        }
-    }
-    // ************************************************************************
-    
-    
-    // ************************************************************************
-    // DOMConfiguraiton implementation
-    // ************************************************************************
-    
-    /** 
-     * Returns the DOMConfiguration of the LSSerializer.
-     *  
-     * @see org.w3c.dom.ls.LSSerializer#getDomConfig()
-     * @since DOM Level 3
-     * @return A DOMConfiguration object.
-     */
-    public DOMConfiguration getDomConfig() {
-        return (DOMConfiguration)this;
-    }
-    
-    /** 
-     * Returns the DOMConfiguration of the LSSerializer.
-     *  
-     * @see org.w3c.dom.ls.LSSerializer#getFilter()
-     * @since DOM Level 3
-     * @return A LSSerializerFilter object.
-     */
-    public LSSerializerFilter getFilter() {
-        return fSerializerFilter;
-    }
-    
-    /** 
-     * Returns the End-Of-Line sequence of characters to be used in the XML 
-     * being serialized.  If none is set a default "\n" is returned.
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#getNewLine()
-     * @since DOM Level 3
-     * @return A String containing the end-of-line character sequence  used in 
-     * serialization.
-     */
-    public String getNewLine() {
-        return fEndOfLine;
-    }
-    
-    /** 
-     * Set a LSSerilizerFilter on the LSSerializer.  When set, the filter is
-     * called before each node is serialized which depending on its implemention
-     * determines if the node is to be serialized or not.    
-     *  
-     * @see org.w3c.dom.ls.LSSerializer#setFilter
-     * @since DOM Level 3
-     * @param filter A LSSerializerFilter to be applied to the stream to serialize.
-     */
-    public void setFilter(LSSerializerFilter filter) {
-        fSerializerFilter = filter;
-    }
-    
-    /** 
-     * Sets the End-Of-Line sequence of characters to be used in the XML 
-     * being serialized.  Setting this attribute to null will reset its 
-     * value to the default value i.e. "\n".
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#setNewLine
-     * @since DOM Level 3
-     * @param newLine a String that is the end-of-line character sequence to be used in 
-     * serialization.
-     */
-    public void setNewLine(String newLine) {
-        fEndOfLine = (newLine != null) ? newLine : DEFAULT_END_OF_LINE;
-    }
-    
-    /** 
-     * Serializes the specified node to the specified LSOutput and returns true if the Node 
-     * was successfully serialized. 
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#write(org.w3c.dom.Node, org.w3c.dom.ls.LSOutput)
-     * @since DOM Level 3
-     * @param nodeArg The Node to serialize.
-     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
-     * LSSerializer was unable to serialize the node.
-     *      
-     */
-    public boolean write(Node nodeArg, LSOutput destination) throws LSException {
-        // If the destination is null
-        if (destination == null) {
-            String msg = Utils.messages
-            .createMessage(
-                    MsgKey.ER_NO_OUTPUT_SPECIFIED,
-                    null);
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, msg,
-                        MsgKey.ER_NO_OUTPUT_SPECIFIED));
-            }
-            throw new LSException(LSException.SERIALIZE_ERR, msg);
-        } 
-        
-        // If nodeArg is null, return false.  Should we throw and LSException instead?
-        if (nodeArg == null ) {
-            return false;
-        }
-
-        // Obtain a reference to the serializer to use
-        // Serializer serializer = getXMLSerializer(xmlVersion);
-        Serializer serializer = fXMLSerializer;
-        serializer.reset();
-        
-        // If the node has not been seen
-        if ( nodeArg != fVisitedNode) {
-            // Determine the XML Document version of the Node 
-            String xmlVersion = getXMLVersion(nodeArg);
-            
-            // Determine the encoding: 1.LSOutput.encoding, 2.Document.inputEncoding, 3.Document.xmlEncoding. 
-            fEncoding = destination.getEncoding();
-            if (fEncoding == null ) {
-            	fEncoding = getInputEncoding(nodeArg);
-            	fEncoding = fEncoding != null ? fEncoding : getXMLEncoding(nodeArg) == null? "UTF-8": getXMLEncoding(nodeArg);
-            }
-
-            // If the encoding is not recognized throw an exception.
-            // Note: The serializer defaults to UTF-8 when created
-            if (!Encodings.isRecognizedEncoding(fEncoding)) {
-                String msg = Utils.messages
-                .createMessage(
-                        MsgKey.ER_UNSUPPORTED_ENCODING,
-                        null);
-                if (fDOMErrorHandler != null) {
-                    fDOMErrorHandler.handleError(new DOMErrorImpl(
-                            DOMError.SEVERITY_FATAL_ERROR, msg,
-                            MsgKey.ER_UNSUPPORTED_ENCODING));
-                }
-                throw new LSException(LSException.SERIALIZE_ERR, msg);            	
-            }
-            
-            serializer.getOutputFormat().setProperty("version", xmlVersion);
-
-            // Set the output encoding and xml version properties
-            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
-            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, fEncoding);
-            
-            // If the node to be serialized is not a Document, Element, or Entity
-            // node
-            // then the XML declaration, or text declaration, should be never be
-            // serialized.
-            if ( (nodeArg.getNodeType() != Node.DOCUMENT_NODE
-                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
-                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
-                    && ((fFeatures & XMLDECL) != 0)) {
-                fDOMConfigProperties.setProperty(
-                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
-                        DOMConstants.DOM3_DEFAULT_FALSE);
-            }
-
-            fVisitedNode = nodeArg;
-        } 
-        
-        // Update the serializer properties
-        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
-        
-        // 
-        try {
-            
-            // The LSSerializer will use the LSOutput object to determine 
-            // where to serialize the output to in the following order the  
-            // first one that is not null and not an empty string will be    
-            // used: 1.LSOutput.characterStream, 2.LSOutput.byteStream,   
-            // 3. LSOutput.systemId 
-            // 1.LSOutput.characterStream
-            Writer writer = destination.getCharacterStream();
-            if (writer == null ) {
-                
-                // 2.LSOutput.byteStream
-                OutputStream outputStream = destination.getByteStream();
-                if ( outputStream == null) {
-                    
-                    // 3. LSOutput.systemId
-                    String uri = destination.getSystemId();
-                    if (uri == null) {
-                        String msg = Utils.messages
-                        .createMessage(
-                                MsgKey.ER_NO_OUTPUT_SPECIFIED,
-                                null);
-                        if (fDOMErrorHandler != null) {
-                            fDOMErrorHandler.handleError(new DOMErrorImpl(
-                                    DOMError.SEVERITY_FATAL_ERROR, msg,
-                                    MsgKey.ER_NO_OUTPUT_SPECIFIED));
-                        }
-                        throw new LSException(LSException.SERIALIZE_ERR, msg);
-                        
-                    } else {
-                        // Expand the System Id and obtain an absolute URI for it.
-                        String absoluteURI = SystemIDResolver.getAbsoluteURI(uri);
-                        
-                        URL url = new URL(absoluteURI);
-                        OutputStream urlOutStream = null;
-                        String protocol = url.getProtocol();
-                        String host = url.getHost();
-                        
-                        // For file protocols, there is no need to use a URL to get its
-                        // corresponding OutputStream
-                        
-                        // Scheme names consist of a sequence of characters. The lower case
-                        // letters "a"--"z", digits, and the characters plus ("+"), period
-                        // ("."), and hyphen ("-") are allowed. For resiliency, programs
-                        // interpreting URLs should treat upper case letters as equivalent to
-                        // lower case in scheme names (e.g., allow "HTTP" as well as "http").
-                        if (protocol.equalsIgnoreCase("file") 
-                                && (host == null || host.length() == 0 || host.equals("localhost"))) {
-                            // do we also need to check for host.equals(hostname)
-                            urlOutStream = new FileOutputStream(getPathWithoutEscapes(url.getPath()));
-                           
-                        } else {
-                            // This should support URL's whose schemes are mentioned in 
-                            // RFC1738 other than file
-                            
-                            URLConnection urlCon = url.openConnection();
-                            urlCon.setDoInput(false);
-                            urlCon.setDoOutput(true);
-                            urlCon.setUseCaches(false); 
-                            urlCon.setAllowUserInteraction(false);
-                            
-                            // When writing to a HTTP URI, a HTTP PUT is performed.
-                            if (urlCon instanceof HttpURLConnection) {
-                                HttpURLConnection httpCon = (HttpURLConnection) urlCon;
-                                httpCon.setRequestMethod("PUT");
-                            }
-                            urlOutStream = urlCon.getOutputStream();
-                        }
-                        // set the OutputStream to that obtained from the systemId
-                        serializer.setOutputStream(urlOutStream);
-                    }
-                } else {
-                    // 2.LSOutput.byteStream
-                    serializer.setOutputStream(outputStream);     
-                }
-            } else {
-                // 1.LSOutput.characterStream
-                serializer.setWriter(writer);
-            }
-            
-            // The associated media type by default is set to text/xml on 
-            // org.apache.xml.serializer.SerializerBase.  
-            
-            // Get a reference to the serializer then lets you serilize a DOM
-            // Use this hack till Xalan support JAXP1.3
-            if (fDOMSerializer == null) {
-               fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
-            } 
-            
-            // Set the error handler on the DOM3Serializer interface implementation
-            if (fDOMErrorHandler != null) {
-                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
-            }
-            
-            // Set the filter on the DOM3Serializer interface implementation
-            if (fSerializerFilter != null) {
-                fDOMSerializer.setNodeFilter(fSerializerFilter);
-            }
-            
-            // Set the NewLine character to be used
-            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
-            
-            // Serializer your DOM, where node is an org.w3c.dom.Node
-            // Assuming that Xalan's serializer can serialize any type of DOM node
-            fDOMSerializer.serializeDOM3(nodeArg);
-            
-        } catch( UnsupportedEncodingException ue) {
-            
-            String msg = Utils.messages
-            .createMessage(
-                    MsgKey.ER_UNSUPPORTED_ENCODING,
-                    null);
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, msg,
-                        MsgKey.ER_UNSUPPORTED_ENCODING, ue));
-            }
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, ue).fillInStackTrace();
-        } catch (LSException lse) {
-            // Rethrow LSException.
-            throw lse;
-        } catch (RuntimeException e) {
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }  catch (Exception e) {
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
-                        null, e));
-            }
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }        
-        return true;
-    }
-    
-    /** 
-     * Serializes the specified node and returns a String with the serialized
-     * data to the caller.  
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#writeToString(org.w3c.dom.Node)
-     * @since DOM Level 3
-     * @param nodeArg The Node to serialize.
-     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
-     * LSSerializer was unable to serialize the node.
-     *      
-     */
-    public String writeToString(Node nodeArg) throws DOMException, LSException {
-        // return null is nodeArg is null.  Should an Exception be thrown instead?
-        if (nodeArg == null) {
-            return null;
-        }
-
-        // Should we reset the serializer configuration before each write operation?
-        // Obtain a reference to the serializer to use
-        Serializer serializer = fXMLSerializer;
-        serializer.reset();
-        
-        if (nodeArg != fVisitedNode){
-            // Determine the XML Document version of the Node 
-            String xmlVersion = getXMLVersion(nodeArg);
-            
-            serializer.getOutputFormat().setProperty("version", xmlVersion);
-            
-            // Set the output encoding and xml version properties
-            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
-            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, "UTF-16");
-            
-            // If the node to be serialized is not a Document, Element, or Entity
-            // node
-            // then the XML declaration, or text declaration, should be never be
-            // serialized.
-            if  ((nodeArg.getNodeType() != Node.DOCUMENT_NODE
-                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
-                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
-                    && ((fFeatures & XMLDECL) != 0)) {
-                fDOMConfigProperties.setProperty(
-                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
-                        DOMConstants.DOM3_DEFAULT_FALSE);
-            }            
-
-            fVisitedNode = nodeArg;       
-        } 
-        // Update the serializer properties
-        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
-        
-        // StringWriter to Output to
-        StringWriter output = new StringWriter();
-        
-        // 
-        try {
-            
-            // Set the Serializer's Writer to a StringWriter
-            serializer.setWriter(output);
-            
-            // Get a reference to the serializer then lets you serilize a DOM
-            // Use this hack till Xalan support JAXP1.3
-            if (fDOMSerializer == null) {
-                fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
-            } 
-                        
-            // Set the error handler on the DOM3Serializer interface implementation
-            if (fDOMErrorHandler != null) {
-                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
-            }
-            
-            // Set the filter on the DOM3Serializer interface implementation
-            if (fSerializerFilter != null) {
-                fDOMSerializer.setNodeFilter(fSerializerFilter);
-            }
-            
-            // Set the NewLine character to be used
-            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
-            
-            // Serializer your DOM, where node is an org.w3c.dom.Node
-            fDOMSerializer.serializeDOM3(nodeArg);
-        } catch (LSException lse) {
-            // Rethrow LSException.
-            throw lse;
-        } catch (RuntimeException e) {
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }  catch (Exception e) {
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
-                        null, e));
-            }
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }        
-        
-        // return the serialized string
-        return output.toString();
-    }
-    
-    /** 
-     * Serializes the specified node to the specified URI and returns true if the Node 
-     * was successfully serialized. 
-     * 
-     * @see org.w3c.dom.ls.LSSerializer#writeToURI(org.w3c.dom.Node, String)
-     * @since DOM Level 3
-     * @param nodeArg The Node to serialize.
-     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the 
-     * LSSerializer was unable to serialize the node.
-     *      
-     */
-    public boolean writeToURI(Node nodeArg, String uri) throws LSException {
-        // If nodeArg is null, return false.  Should we throw and LSException instead?
-        if (nodeArg == null ) {
-            return false;
-        }
-
-        // Obtain a reference to the serializer to use
-        Serializer serializer = fXMLSerializer;
-        serializer.reset();
-        
-        if (nodeArg != fVisitedNode) {
-            // Determine the XML Document version of the Node 
-            String xmlVersion = getXMLVersion(nodeArg);
-            
-            // Determine the encoding: 1.LSOutput.encoding,
-            // 2.Document.inputEncoding, 3.Document.xmlEncoding.
-            fEncoding = getInputEncoding(nodeArg);
-            if (fEncoding == null ) {
-            	fEncoding = fEncoding != null ? fEncoding : getXMLEncoding(nodeArg) == null? "UTF-8": getXMLEncoding(nodeArg);
-            }
-            
-            serializer.getOutputFormat().setProperty("version", xmlVersion);
-            
-            // Set the output encoding and xml version properties
-            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
-            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, fEncoding);
-            
-            // If the node to be serialized is not a Document, Element, or Entity
-            // node
-            // then the XML declaration, or text declaration, should be never be
-            // serialized.
-            if ( (nodeArg.getNodeType() != Node.DOCUMENT_NODE
-                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
-                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
-                    && ((fFeatures & XMLDECL) != 0))  {
-                fDOMConfigProperties.setProperty(
-                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
-                        DOMConstants.DOM3_DEFAULT_FALSE);
-            }
-       
-            fVisitedNode = nodeArg;
-        } 
-        
-        // Update the serializer properties
-        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
-        
-        // 
-        try {
-            // If the specified encoding is not supported an
-            // "unsupported-encoding" fatal error is raised. ??
-            if (uri == null) {
-                String msg = Utils.messages.createMessage(
-                        MsgKey.ER_NO_OUTPUT_SPECIFIED, null);
-                if (fDOMErrorHandler != null) {
-                    fDOMErrorHandler.handleError(new DOMErrorImpl(
-                            DOMError.SEVERITY_FATAL_ERROR, msg,
-                            MsgKey.ER_NO_OUTPUT_SPECIFIED));
-                }
-                throw new LSException(LSException.SERIALIZE_ERR, msg);
-                
-            } else {
-                // REVISIT: Can this be used to get an absolute expanded URI
-                String absoluteURI = SystemIDResolver.getAbsoluteURI(uri);
-                
-                URL url = new URL(absoluteURI);
-                OutputStream urlOutStream = null;
-                String protocol = url.getProtocol();
-                String host = url.getHost();
-                
-                // For file protocols, there is no need to use a URL to get its
-                // corresponding OutputStream
-                
-                // Scheme names consist of a sequence of characters. The lower 
-                // case letters "a"--"z", digits, and the characters plus ("+"), 
-                // period ("."), and hyphen ("-") are allowed. For resiliency, 
-                // programs interpreting URLs should treat upper case letters as
-                // equivalent to lower case in scheme names 
-                // (e.g., allow "HTTP" as well as "http").
-                if (protocol.equalsIgnoreCase("file")
-                        && (host == null || host.length() == 0 || host
-                                .equals("localhost"))) {
-                    // do we also need to check for host.equals(hostname)
-                    urlOutStream = new FileOutputStream(getPathWithoutEscapes(url.getPath()));
-                    
-                } else {
-                    // This should support URL's whose schemes are mentioned in
-                    // RFC1738 other than file
-                    
-                    URLConnection urlCon = url.openConnection();
-                    urlCon.setDoInput(false);
-                    urlCon.setDoOutput(true);
-                    urlCon.setUseCaches(false);
-                    urlCon.setAllowUserInteraction(false);
-                    
-                    // When writing to a HTTP URI, a HTTP PUT is performed.
-                    if (urlCon instanceof HttpURLConnection) {
-                        HttpURLConnection httpCon = (HttpURLConnection) urlCon;
-                        httpCon.setRequestMethod("PUT");
-                    }
-                    urlOutStream = urlCon.getOutputStream();
-                }
-                // set the OutputStream to that obtained from the systemId
-                serializer.setOutputStream(urlOutStream);
-            }
-            
-            // Get a reference to the serializer then lets you serilize a DOM
-            // Use this hack till Xalan support JAXP1.3
-            if (fDOMSerializer == null) {
-                fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
-            } 
-            
-            // Set the error handler on the DOM3Serializer interface implementation
-            if (fDOMErrorHandler != null) {
-                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
-            }
-            
-            // Set the filter on the DOM3Serializer interface implementation
-            if (fSerializerFilter != null) {
-                fDOMSerializer.setNodeFilter(fSerializerFilter);
-            }
-            
-            // Set the NewLine character to be used
-            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
-            
-            // Serializer your DOM, where node is an org.w3c.dom.Node
-            // Assuming that Xalan's serializer can serialize any type of DOM
-            // node
-            fDOMSerializer.serializeDOM3(nodeArg);
-            
-        } catch (LSException lse) {
-            // Rethrow LSException.
-            throw lse;
-        } catch (RuntimeException e) {
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }  catch (Exception e) {
-            if (fDOMErrorHandler != null) {
-                fDOMErrorHandler.handleError(new DOMErrorImpl(
-                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
-                        null, e));
-            }
-            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
-        }        
-        
-        return true;
-    }
-    // ************************************************************************
-    
-    
-    // ************************************************************************
-    // Implementaion methods
-    // ************************************************************************
-    
-    /** 
-     * Determines the XML Version of the Document Node to serialize.  If the Document Node
-     * is not a DOM Level 3 Node, then the default version returned is 1.0.
-     * 
-     * @param  nodeArg The Node to serialize
-     * @return A String containing the version pseudo-attribute of the XMLDecl.  
-     * @throws Throwable if the DOM implementation does not implement Document.getXmlVersion()      
-     */
-    //protected String getXMLVersion(Node nodeArg) throws Throwable {
-    protected String getXMLVersion(Node nodeArg) {
-        Document doc = null;
-        
-        // Determine the XML Version of the document
-        if (nodeArg != null) {
-            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
-                // The Document node is the Node argument
-                doc = (Document)nodeArg;
-            } else { 
-                // The Document node is the Node argument's ownerDocument
-                doc = nodeArg.getOwnerDocument();
-            }
-            
-            // Determine the DOM Version.
-            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
-                return doc.getXmlVersion();
-            }
-        } 
-        // The version will be treated as "1.0" which may result in
-        // an ill-formed document being serialized.
-        // If nodeArg does not have an ownerDocument, treat this as XML 1.0
-        return "1.0";
-    }
-    
-    /** 
-     * Determines the XML Encoding of the Document Node to serialize.  If the Document Node
-     * is not a DOM Level 3 Node, then the default encoding "UTF-8" is returned.
-     * 
-     * @param  nodeArg The Node to serialize
-     * @return A String containing the encoding pseudo-attribute of the XMLDecl.  
-     * @throws Throwable if the DOM implementation does not implement Document.getXmlEncoding()     
-     */
-    protected String getXMLEncoding(Node nodeArg) {
-        Document doc = null;
-        
-        // Determine the XML Encoding of the document
-        if (nodeArg != null) {
-            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
-                // The Document node is the Node argument
-                doc = (Document)nodeArg;
-            } else { 
-                // The Document node is the Node argument's ownerDocument
-                doc = nodeArg.getOwnerDocument();
-            }
-            
-            // Determine the XML Version. 
-            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
-                return doc.getXmlEncoding();
-            }
-        } 
-        // The default encoding is UTF-8 except for the writeToString method
-        return "UTF-8";
-    }
-    
-    /** 
-     * Determines the Input Encoding of the Document Node to serialize.  If the Document Node
-     * is not a DOM Level 3 Node, then null is returned.
-     * 
-     * @param  nodeArg The Node to serialize
-     * @return A String containing the input encoding.  
-     */
-    protected String getInputEncoding(Node nodeArg)  {
-        Document doc = null;
-        
-        // Determine the Input Encoding of the document
-        if (nodeArg != null) {
-            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
-                // The Document node is the Node argument
-                doc = (Document)nodeArg;
-            } else { 
-                // The Document node is the Node argument's ownerDocument
-                doc = nodeArg.getOwnerDocument();
-            }
-            
-            // Determine the DOM Version.
-            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
-                return doc.getInputEncoding();
-            }
-        } 
-        // The default encoding returned is null
-        return null;
-    }
-    
-    /**
-     * This method returns the LSSerializer's error handler.
-     * 
-     * @return Returns the fDOMErrorHandler.
-     */
-    public DOMErrorHandler getErrorHandler() {
-        return fDOMErrorHandler;
-    }
-    
-    /**
-     * Replaces all escape sequences in the given path with their literal characters.
-     */
-    private static String getPathWithoutEscapes(String origPath) {
-        if (origPath != null && origPath.length() != 0 && origPath.indexOf('%') != -1) {
-            // Locate the escape characters
-            StringTokenizer tokenizer = new StringTokenizer(origPath, "%");
-            StringBuffer result = new StringBuffer(origPath.length());
-            int size = tokenizer.countTokens();
-            result.append(tokenizer.nextToken());
-            for(int i = 1; i < size; ++i) {
-                String token = tokenizer.nextToken();
-                if (token.length() >= 2 && isHexDigit(token.charAt(0)) && 
-                        isHexDigit(token.charAt(1))) {
-                    // Decode the 2 digit hexadecimal number following % in '%nn'
-                    result.append((char)Integer.valueOf(token.substring(0, 2), 16).intValue());
-                    token = token.substring(2);
-                }
-                result.append(token);
-            }
-            return result.toString();
-        }
-        return origPath;
-    }
-
-    /** 
-     * Returns true if the given character is a valid hex character.
-     */
-    private static boolean isHexDigit(char c) {
-        return (c >= '0' && c <= '9' || 
-                c >= 'a' && c <= 'f' || 
-                c >= 'A' && c <= 'F');
-    }
-    
-    /**
-     * Creates an LSException. On J2SE 1.4 and above the cause for the exception will be set.
-     */
-    private static LSException createLSException(short code, Throwable cause) {
-        LSException lse = new LSException(code, cause != null ? cause.getMessage() : null);
-        if (cause != null && ThrowableMethods.fgThrowableMethodsAvailable) {
-            try {
-                ThrowableMethods.fgThrowableInitCauseMethod.invoke(lse, new Object [] {cause});
-            }
-            // Something went wrong. There's not much we can do about it.
-            catch (Exception e) {}
-        }
-        return lse;
-    }
-    
-    /**
-     * Holder of methods from java.lang.Throwable.
-     */
-    static class ThrowableMethods {
-        
-        // Method: java.lang.Throwable.initCause(java.lang.Throwable)
-        private static java.lang.reflect.Method fgThrowableInitCauseMethod = null;
-        
-        // Flag indicating whether or not Throwable methods available.
-        private static boolean fgThrowableMethodsAvailable = false;
-        
-        private ThrowableMethods() {}
-        
-        // Attempt to get methods for java.lang.Throwable on class initialization.
-        static {
-            try {
-                fgThrowableInitCauseMethod = Throwable.class.getMethod("initCause", new Class [] {Throwable.class});
-                fgThrowableMethodsAvailable = true;
-            }
-            // ClassNotFoundException, NoSuchMethodException or SecurityException
-            // Whatever the case, we cannot use java.lang.Throwable.initCause(java.lang.Throwable).
-            catch (Exception exc) {
-                fgThrowableInitCauseMethod = null;
-                fgThrowableMethodsAvailable = false;
-            }
-        }
-    }
-}
+/*
+ * 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.FileOutputStream;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.apache.xml.serializer.DOM3Serializer;
+import org.apache.xml.serializer.Encodings;
+import org.apache.xml.serializer.OutputPropertiesFactory;
+import org.apache.xml.serializer.Serializer;
+import org.apache.xml.serializer.SerializerFactory;
+import org.apache.xml.serializer.utils.MsgKey;
+import org.apache.xml.serializer.utils.SystemIDResolver;
+import org.apache.xml.serializer.utils.Utils;
+import org.w3c.dom.DOMConfiguration;
+import org.w3c.dom.DOMError;
+import org.w3c.dom.DOMErrorHandler;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.DOMStringList;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.ls.LSException;
+import org.w3c.dom.ls.LSOutput;
+import org.w3c.dom.ls.LSSerializer;
+import org.w3c.dom.ls.LSSerializerFilter;
+
+/**
+ * Implemenatation of DOM Level 3 org.w3c.ls.LSSerializer and 
+ * org.w3c.dom.ls.DOMConfiguration.  Serialization is achieved by delegating 
+ * serialization calls to <CODE>org.apache.xml.serializer.ToStream</CODE> or 
+ * one of its derived classes depending on the serialization method, while walking
+ * the DOM in DOM3TreeWalker.  
+ * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSSerializer">org.w3c.dom.ls.LSSerializer</a>
+ * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">org.w3c.dom.DOMConfiguration</a>
+ *  
+ * @version $Id:  
+ * 
+ * @xsl.usage internal 
+ */
+final public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
+    
+    // The default end-of-line character sequence used in serialization.
+    private static final String DEFAULT_END_OF_LINE;
+    static {
+        String lineSeparator = (String) AccessController.doPrivileged(new PrivilegedAction() {
+            public Object run() {
+                try {
+                    return System.getProperty("line.separator");
+                }
+                catch (SecurityException ex) {}
+                return null;
+            }
+        });
+        // The DOM Level 3 Load and Save specification requires that implementations choose a default
+        // sequence which matches one allowed by XML 1.0 (or XML 1.1). If the value of "line.separator" 
+        // isn't one of the XML 1.0 end-of-line sequences then we select "\n" as the default value.
+        DEFAULT_END_OF_LINE = lineSeparator != null && 
+            (lineSeparator.equals("\r\n") || lineSeparator.equals("\r")) ? lineSeparator : "\n";
+    }
+    
+    /** private data members */
+    private Serializer fXMLSerializer = null;
+    
+    // Tracks DOMConfiguration features. 
+    protected int fFeatures = 0;
+    
+    // Common DOM serializer
+    private  DOM3Serializer fDOMSerializer = null;
+    
+    // A filter set on the LSSerializer
+    private LSSerializerFilter fSerializerFilter = null;  
+    
+    // Stores the nodeArg parameter to speed up multiple writes of the same node.
+    private Node fVisitedNode = null;
+    
+    // The end-of-line character sequence used in serialization. "\n" is whats used on the web.
+    private String fEndOfLine = DEFAULT_END_OF_LINE;
+    
+    // The DOMErrorhandler.
+    private DOMErrorHandler fDOMErrorHandler = null;
+    
+    // The Configuration parameter to pass to the Underlying serilaizer.
+    private Properties fDOMConfigProperties = null;
+    
+    // The encoding to use during serialization.
+    private String fEncoding; 
+	
+    // ************************************************************************
+    // DOM Level 3 DOM Configuration parameter names
+    // ************************************************************************    
+    // Parameter canonical-form, true [optional] - NOT SUPPORTED 
+    private final static int CANONICAL = 0x1 << 0;
+    
+    // Parameter cdata-sections, true [required] (default)
+    private final static int CDATA = 0x1 << 1;
+    
+    // Parameter check-character-normalization, true [optional] - NOT SUPPORTED 
+    private final static int CHARNORMALIZE = 0x1 << 2;
+    
+    // Parameter comments, true [required] (default)
+    private final static int COMMENTS = 0x1 << 3;
+    
+    // Parameter datatype-normalization, true [optional] - NOT SUPPORTED
+    private final static int DTNORMALIZE = 0x1 << 4;    
+    
+    // Parameter element-content-whitespace, true [required] (default) - value - false [optional] NOT SUPPORTED
+    private final static int ELEM_CONTENT_WHITESPACE = 0x1 << 5;
+    
+    // Parameter entities, true [required] (default)
+    private final static int ENTITIES = 0x1 << 6;
+    
+    // Parameter infoset, true [required] (default), false has no effect --> True has no effect for the serializer
+    private final static int INFOSET = 0x1 << 7;
+    
+    // Parameter namespaces, true [required] (default)
+    private final static int NAMESPACES = 0x1 << 8;
+    
+    // Parameter namespace-declarations, true [required] (default)
+    private final static int NAMESPACEDECLS = 0x1 << 9;
+    
+    // Parameter normalize-characters, true [optional] - NOT SUPPORTED
+    private final static int NORMALIZECHARS = 0x1 << 10;
+    
+    // Parameter split-cdata-sections, true [required] (default)
+    private final static int SPLITCDATA = 0x1 << 11;   
+    
+    // Parameter validate, true [optional] - NOT SUPPORTED
+    private final static int VALIDATE = 0x1 << 12;   
+    
+    // Parameter validate-if-schema, true [optional] - NOT SUPPORTED
+    private final static int SCHEMAVALIDATE = 0x1 << 13;
+    
+    // Parameter split-cdata-sections, true [required] (default)
+    private final static int WELLFORMED = 0x1 << 14;   
+    
+    // Parameter discard-default-content, true [required] (default)
+    // Not sure how this will be used in level 2 Documents
+    private final static int DISCARDDEFAULT = 0x1 << 15;       
+    
+    // Parameter format-pretty-print, true [optional] 
+    private final static int PRETTY_PRINT = 0x1 << 16;
+    
+    // Parameter ignore-unknown-character-denormalizations, true [required] (default)
+    // We currently do not support XML 1.1 character normalization
+    private final static int IGNORE_CHAR_DENORMALIZE = 0x1 << 17;
+    
+    // Parameter discard-default-content, true [required] (default)
+    private final static int XMLDECL = 0x1 << 18;    
+    // ************************************************************************
+    
+    // Recognized parameters for which atleast one value can be set
+    private String fRecognizedParameters [] = {
+            DOMConstants.DOM_CANONICAL_FORM,
+            DOMConstants.DOM_CDATA_SECTIONS,
+            DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
+            DOMConstants.DOM_COMMENTS,
+            DOMConstants.DOM_DATATYPE_NORMALIZATION,
+            DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
+            DOMConstants.DOM_ENTITIES,
+            DOMConstants.DOM_INFOSET,
+            DOMConstants.DOM_NAMESPACES,
+            DOMConstants.DOM_NAMESPACE_DECLARATIONS,
+            //DOMConstants.DOM_NORMALIZE_CHARACTERS,
+            DOMConstants.DOM_SPLIT_CDATA,
+            DOMConstants.DOM_VALIDATE,
+            DOMConstants.DOM_VALIDATE_IF_SCHEMA,
+            DOMConstants.DOM_WELLFORMED,
+            DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
+            DOMConstants.DOM_FORMAT_PRETTY_PRINT,
+            DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS,
+            DOMConstants.DOM_XMLDECL,
+            DOMConstants.DOM_ERROR_HANDLER
+    };
+    
+    
+    /**
+     * Constructor:  Creates a LSSerializerImpl object.  The underlying
+     * XML 1.0 or XML 1.1 org.apache.xml.serializer.Serializer object is
+     * created and initialized the first time any of the write methods are  
+     * invoked to serialize the Node.  Subsequent write methods on the same
+     * LSSerializerImpl object will use the previously created Serializer object.
+     */
+    public LSSerializerImpl () {
+        // set default parameters
+        fFeatures |= CDATA;
+        fFeatures |= COMMENTS;
+        fFeatures |= ELEM_CONTENT_WHITESPACE;
+        fFeatures |= ENTITIES;
+        fFeatures |= NAMESPACES;
+        fFeatures |= NAMESPACEDECLS;
+        fFeatures |= SPLITCDATA;
+        fFeatures |= WELLFORMED;
+        fFeatures |= DISCARDDEFAULT;
+        fFeatures |= XMLDECL;
+        
+        // New OutputFormat properties
+        fDOMConfigProperties = new Properties();
+        
+        // Initialize properties to be passed on the underlying serializer
+        initializeSerializerProps();
+        
+        // Create the underlying serializer.
+        Properties  configProps = OutputPropertiesFactory.getDefaultMethodProperties("xml");
+        
+        // change xml version from 1.0 to 1.1
+        //configProps.setProperty("version", "1.1");
+        
+        // Get a serializer that seriailizes according the the properties,
+        // which in this case is to xml
+        fXMLSerializer = SerializerFactory.getSerializer(configProps);
+        
+        // Initialize Serializer
+        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
+    }
+    
+    /**
+     * Initializes the underlying serializer's configuration depending on the
+     * default DOMConfiguration parameters. This method must be called before a
+     * node is to be serialized.
+     * 
+     * @xsl.usage internal
+     */
+    public void initializeSerializerProps () {
+        // canonical-form
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_DEFAULT_FALSE);
+        
+        // cdata-sections
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // "check-character-normalization"
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
+                DOMConstants.DOM3_DEFAULT_FALSE);
+        
+        // comments
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
+        
+        // datatype-normalization
+        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
+                + DOMConstants.DOM_DATATYPE_NORMALIZATION,
+                DOMConstants.DOM3_DEFAULT_FALSE);
+        
+        // element-content-whitespace

[... 1262 lines stripped ...]


---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org