19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one
39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file
49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information
59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file
69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the  "License");
79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License.
89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at
99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software
139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and
169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License.
179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/*
199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id:  $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xml.serializer.dom3;
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.FileOutputStream;
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.OutputStream;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.StringWriter;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.UnsupportedEncodingException;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.Writer;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.net.HttpURLConnection;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.net.URL;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.net.URLConnection;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.security.AccessController;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.security.PrivilegedAction;
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Properties;
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.StringTokenizer;
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.DOM3Serializer;
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.Encodings;
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.OutputPropertiesFactory;
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.Serializer;
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.SerializerFactory;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.utils.MsgKey;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.utils.SystemIDResolver;
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.utils.Utils;
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.DOMConfiguration;
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.DOMError;
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.DOMErrorHandler;
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.DOMException;
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.DOMStringList;
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Document;
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node;
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.ls.LSException;
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.ls.LSOutput;
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.ls.LSSerializer;
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.ls.LSSerializerFilter;
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Implemenatation of DOM Level 3 org.w3c.ls.LSSerializer and
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * org.w3c.dom.ls.DOMConfiguration.  Serialization is achieved by delegating
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * serialization calls to <CODE>org.apache.xml.serializer.ToStream</CODE> or
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * one of its derived classes depending on the serialization method, while walking
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the DOM in DOM3TreeWalker.
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @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>
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#DOMConfiguration">org.w3c.dom.DOMConfiguration</a>
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @version $Id:
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage internal
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonfinal public class LSSerializerImpl implements DOMConfiguration, LSSerializer {
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // The default end-of-line character sequence used in serialization.
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private static final String DEFAULT_END_OF_LINE;
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static {
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String lineSeparator = (String) AccessController.doPrivileged(new PrivilegedAction() {
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            public Object run() {
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                try {
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    return System.getProperty("line.separator");
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                catch (SecurityException ex) {}
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return null;
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        });
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // The DOM Level 3 Load and Save specification requires that implementations choose a default
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // sequence which matches one allowed by XML 1.0 (or XML 1.1). If the value of "line.separator"
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // isn't one of the XML 1.0 end-of-line sequences then we select "\n" as the default value.
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        DEFAULT_END_OF_LINE = lineSeparator != null &&
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            (lineSeparator.equals("\r\n") || lineSeparator.equals("\r")) ? lineSeparator : "\n";
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /** private data members */
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Serializer fXMLSerializer = null;
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Tracks DOMConfiguration features.
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected int fFeatures = 0;
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Common DOM serializer
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private  DOM3Serializer fDOMSerializer = null;
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // A filter set on the LSSerializer
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private LSSerializerFilter fSerializerFilter = null;
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Stores the nodeArg parameter to speed up multiple writes of the same node.
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Node fVisitedNode = null;
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // The end-of-line character sequence used in serialization. "\n" is whats used on the web.
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String fEndOfLine = DEFAULT_END_OF_LINE;
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // The DOMErrorhandler.
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private DOMErrorHandler fDOMErrorHandler = null;
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // The Configuration parameter to pass to the Underlying serilaizer.
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private Properties fDOMConfigProperties = null;
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // The encoding to use during serialization.
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String fEncoding;
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // DOM Level 3 DOM Configuration parameter names
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter canonical-form, true [optional] - NOT SUPPORTED
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int CANONICAL = 0x1 << 0;
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter cdata-sections, true [required] (default)
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int CDATA = 0x1 << 1;
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter check-character-normalization, true [optional] - NOT SUPPORTED
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int CHARNORMALIZE = 0x1 << 2;
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter comments, true [required] (default)
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int COMMENTS = 0x1 << 3;
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter datatype-normalization, true [optional] - NOT SUPPORTED
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int DTNORMALIZE = 0x1 << 4;
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter element-content-whitespace, true [required] (default) - value - false [optional] NOT SUPPORTED
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int ELEM_CONTENT_WHITESPACE = 0x1 << 5;
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter entities, true [required] (default)
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int ENTITIES = 0x1 << 6;
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter infoset, true [required] (default), false has no effect --> True has no effect for the serializer
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int INFOSET = 0x1 << 7;
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter namespaces, true [required] (default)
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int NAMESPACES = 0x1 << 8;
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter namespace-declarations, true [required] (default)
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int NAMESPACEDECLS = 0x1 << 9;
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter normalize-characters, true [optional] - NOT SUPPORTED
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int NORMALIZECHARS = 0x1 << 10;
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter split-cdata-sections, true [required] (default)
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int SPLITCDATA = 0x1 << 11;
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter validate, true [optional] - NOT SUPPORTED
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int VALIDATE = 0x1 << 12;
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter validate-if-schema, true [optional] - NOT SUPPORTED
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int SCHEMAVALIDATE = 0x1 << 13;
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter split-cdata-sections, true [required] (default)
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int WELLFORMED = 0x1 << 14;
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter discard-default-content, true [required] (default)
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Not sure how this will be used in level 2 Documents
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int DISCARDDEFAULT = 0x1 << 15;
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter format-pretty-print, true [optional]
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int PRETTY_PRINT = 0x1 << 16;
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter ignore-unknown-character-denormalizations, true [required] (default)
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // We currently do not support XML 1.1 character normalization
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int IGNORE_CHAR_DENORMALIZE = 0x1 << 17;
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Parameter discard-default-content, true [required] (default)
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private final static int XMLDECL = 0x1 << 18;
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Recognized parameters for which atleast one value can be set
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private String fRecognizedParameters [] = {
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_CANONICAL_FORM,
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_CDATA_SECTIONS,
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_COMMENTS,
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_DATATYPE_NORMALIZATION,
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_ENTITIES,
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_INFOSET,
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_NAMESPACES,
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_NAMESPACE_DECLARATIONS,
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            //DOMConstants.DOM_NORMALIZE_CHARACTERS,
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_SPLIT_CDATA,
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_VALIDATE,
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_VALIDATE_IF_SCHEMA,
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_WELLFORMED,
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_FORMAT_PRETTY_PRINT,
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS,
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_XMLDECL,
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            DOMConstants.DOM_ERROR_HANDLER
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    };
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Constructor:  Creates a LSSerializerImpl object.  The underlying
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * XML 1.0 or XML 1.1 org.apache.xml.serializer.Serializer object is
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * created and initialized the first time any of the write methods are
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * invoked to serialize the Node.  Subsequent write methods on the same
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * LSSerializerImpl object will use the previously created Serializer object.
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public LSSerializerImpl () {
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // set default parameters
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= CDATA;
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= COMMENTS;
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= ELEM_CONTENT_WHITESPACE;
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= ENTITIES;
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= NAMESPACES;
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= NAMESPACEDECLS;
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= SPLITCDATA;
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= WELLFORMED;
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= DISCARDDEFAULT;
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fFeatures |= XMLDECL;
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // New OutputFormat properties
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties = new Properties();
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Initialize properties to be passed on the underlying serializer
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        initializeSerializerProps();
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Create the underlying serializer.
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Properties  configProps = OutputPropertiesFactory.getDefaultMethodProperties("xml");
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // change xml version from 1.0 to 1.1
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //configProps.setProperty("version", "1.1");
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Get a serializer that seriailizes according the the properties,
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // which in this case is to xml
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fXMLSerializer = SerializerFactory.getSerializer(configProps);
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Initialize Serializer
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Initializes the underlying serializer's configuration depending on the
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * default DOMConfiguration parameters. This method must be called before a
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * node is to be serialized.
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @xsl.usage internal
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void initializeSerializerProps () {
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // canonical-form
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_DEFAULT_FALSE);
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // cdata-sections
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_DEFAULT_TRUE);
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // "check-character-normalization"
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION,
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.DOM3_DEFAULT_FALSE);
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // comments
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // datatype-normalization
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_DATATYPE_NORMALIZATION,
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.DOM3_DEFAULT_FALSE);
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // element-content-whitespace
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.DOM3_DEFAULT_TRUE);
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // entities
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // preserve entities
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_TRUE);
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // error-handler
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Should we set our default ErrorHandler
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /*
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * if (fDOMConfig.getParameter(Constants.DOM_ERROR_HANDLER) != null) {
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * fDOMErrorHandler =
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         * (DOMErrorHandler)fDOMConfig.getParameter(Constants.DOM_ERROR_HANDLER); }
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson         */
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // infoset
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ((fFeatures & INFOSET) != 0) {
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_DEFAULT_TRUE);
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    DOMConstants.DOM3_DEFAULT_TRUE);
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_DEFAULT_TRUE);
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE,
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    DOMConstants.DOM3_DEFAULT_TRUE);
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // preserve entities
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_DEFAULT_FALSE);
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_CDATA_SECTIONS,
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    DOMConstants.DOM3_DEFAULT_FALSE);
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_VALIDATE_IF_SCHEMA,
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    DOMConstants.DOM3_DEFAULT_FALSE);
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    + DOMConstants.DOM_DATATYPE_NORMALIZATION,
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    DOMConstants.DOM3_DEFAULT_FALSE);
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // namespaces
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_DEFAULT_TRUE);
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // namespace-declarations
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_NAMESPACE_DECLARATIONS,
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.DOM3_DEFAULT_TRUE);
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // normalize-characters
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        /*
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_NORMALIZE_CHARACTERS,
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.DOM3_DEFAULT_FALSE);
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        */
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // split-cdata-sections
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_DEFAULT_TRUE);
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // validate
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_VALIDATE, DOMConstants.DOM3_DEFAULT_FALSE);
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // validate-if-schema
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_VALIDATE_IF_SCHEMA,
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.DOM3_DEFAULT_FALSE);
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // well-formed
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_DEFAULT_TRUE);
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // pretty-print
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.S_XSL_OUTPUT_INDENT,
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.DOM3_DEFAULT_TRUE);
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, Integer.toString(3));
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // discard-default-content
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT,
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                DOMConstants.DOM3_DEFAULT_TRUE);
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // xml-declaration
3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "no");
3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // DOMConfiguraiton implementation
3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Checks if setting a parameter to a specific value is supported.
3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.DOMConfiguration#canSetParameter(java.lang.String, java.lang.Object)
3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name A String containing the DOMConfiguration parameter name.
3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value An Object specifying the value of the corresponding parameter.
3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean canSetParameter(String name, Object value) {
3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (value instanceof Boolean){
3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ( name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)
3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)
3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)
3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)
3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)
3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)
3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)
3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)
4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)
4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)
4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)
4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)){
4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // both values supported
4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return true;
4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)
4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    ) {
4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // true is not supported
4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return !((Boolean)value).booleanValue();
4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // false is not supported
4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return ((Boolean)value).booleanValue();
4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER) &&
4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                value == null || value instanceof DOMErrorHandler){
4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return true;
4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return false;
4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method returns the value of a parameter if known.
4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.DOMConfiguration#getParameter(java.lang.String)
4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name A String containing the DOMConfiguration parameter name
4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *             whose value is to be returned.
4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return Object The value of the parameter if known.
4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public Object getParameter(String name) throws DOMException {
4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)) {
4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & COMMENTS) != 0) ? Boolean.TRUE : Boolean.FALSE;
4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)) {
4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & CDATA) != 0) ? Boolean.TRUE : Boolean.FALSE;
4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)) {
4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & ENTITIES) != 0) ? Boolean.TRUE : Boolean.FALSE;
4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)) {
4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & NAMESPACES) != 0) ? Boolean.TRUE : Boolean.FALSE;
4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)) {
4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & NAMESPACEDECLS) != 0) ? Boolean.TRUE : Boolean.FALSE;
4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)) {
4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & SPLITCDATA) != 0) ? Boolean.TRUE : Boolean.FALSE;
4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)) {
4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & WELLFORMED) != 0) ? Boolean.TRUE : Boolean.FALSE;
4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }  else if (name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)) {
4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & DISCARDDEFAULT) != 0) ? Boolean.TRUE : Boolean.FALSE;
4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & PRETTY_PRINT) != 0) ? Boolean.TRUE : Boolean.FALSE;
4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)) {
4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & XMLDECL) != 0) ? Boolean.TRUE : Boolean.FALSE;
4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)) {
4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & ELEM_CONTENT_WHITESPACE) != 0) ? Boolean.TRUE : Boolean.FALSE;
4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return ((fFeatures & PRETTY_PRINT) != 0) ? Boolean.TRUE : Boolean.FALSE;
4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return Boolean.TRUE;
4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return Boolean.FALSE;
4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)){
4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ((fFeatures & ENTITIES) == 0 &&
4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    (fFeatures & CDATA) == 0 &&
4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    (fFeatures & ELEM_CONTENT_WHITESPACE) != 0 &&
4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    (fFeatures & NAMESPACES) != 0 &&
4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    (fFeatures & NAMESPACEDECLS) != 0 &&
4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    (fFeatures & WELLFORMED) != 0 &&
4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    (fFeatures & COMMENTS) != 0) {
4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return Boolean.TRUE;
4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return Boolean.FALSE;
4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER)) {
4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return fDOMErrorHandler;
4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (
4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION)
4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return null;
4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Here we have to add the Xalan specific DOM Message Formatter
4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String msg = Utils.messages.createMessage(
4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    MsgKey.ER_FEATURE_NOT_FOUND,
4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    new Object[] { name });
4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method returns a of the parameters supported by this DOMConfiguration object
4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * and for which at least one value can be set by the application
5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.DOMConfiguration#getParameterNames()
5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return DOMStringList A list of DOMConfiguration parameters recognized
5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *                       by the serializer
5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DOMStringList getParameterNames() {
5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return new DOMStringListImpl(fRecognizedParameters);
5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method sets the value of the named parameter.
5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.DOMConfiguration#setParameter(java.lang.String, java.lang.Object)
5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param name A String containing the DOMConfiguration parameter name.
5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param value An Object contaiing the parameters value to set.
5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setParameter(String name, Object value) throws DOMException {
5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If the value is a boolean
5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (value instanceof Boolean) {
5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            boolean state = ((Boolean) value).booleanValue();
5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS)) {
5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | COMMENTS : fFeatures
5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~COMMENTS;
5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // comments
5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_FALSE);
5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS)) {
5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures =  state ? fFeatures | CDATA : fFeatures
5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~CDATA;
5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // cdata-sections
5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES)) {
5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | ENTITIES : fFeatures
5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~ENTITIES;
5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // entities
5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(
5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            DOMConstants.S_XERCES_PROPERTIES_NS
5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_TRUE);
5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(
5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            DOMConstants.S_XERCES_PROPERTIES_NS
5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES)) {
5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | NAMESPACES : fFeatures
5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~NAMESPACES;
5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // namespaces
5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE);
5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_FALSE);
5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name
5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    .equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS)) {
5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | NAMESPACEDECLS
5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        : fFeatures & ~NAMESPACEDECLS;
5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // namespace-declarations
5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA)) {
5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | SPLITCDATA : fFeatures
5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~SPLITCDATA;
5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // split-cdata-sections
5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_EXPLICIT_TRUE);
5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_SPLIT_CDATA, DOMConstants.DOM3_EXPLICIT_FALSE);
5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED)) {
5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | WELLFORMED : fFeatures
5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~WELLFORMED;
5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // well-formed
6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_FALSE);
6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name
6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    .equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT)) {
6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | DISCARDDEFAULT
6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        : fFeatures & ~DISCARDDEFAULT;
6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // discard-default-content
6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT, DOMConstants.DOM3_EXPLICIT_TRUE);
6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_DISCARD_DEFAULT_CONTENT, DOMConstants.DOM3_EXPLICIT_FALSE);
6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT)) {
6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | PRETTY_PRINT : fFeatures
6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~PRETTY_PRINT;
6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // format-pretty-print
6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_FORMAT_PRETTY_PRINT, DOMConstants.DOM3_EXPLICIT_TRUE);
6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                else {
6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_FORMAT_PRETTY_PRINT, DOMConstants.DOM3_EXPLICIT_FALSE);
6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL)) {
6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | XMLDECL : fFeatures
6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~XMLDECL;
6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "no");
6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL, "yes");
6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE)) {
6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fFeatures = state ? fFeatures | ELEM_CONTENT_WHITESPACE : fFeatures
6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        & ~ELEM_CONTENT_WHITESPACE;
6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // element-content-whitespace
6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_FALSE);
6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS)) {
6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // false is not supported
6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (!state) {
6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // Here we have to add the Xalan specific DOM Message Formatter
6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    String msg = Utils.messages.createMessage(
6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            MsgKey.ER_FEATURE_NOT_SUPPORTED,
6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            new Object[] { name });
6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)
6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)
6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)
6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION)
6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)
6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // || name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)
6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    ) {
6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // true is not supported
6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    String msg = Utils.messages.createMessage(
6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            MsgKey.ER_FEATURE_NOT_SUPPORTED,
6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            new Object[] { name });
6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM)) {
6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                + DOMConstants.DOM_CANONICAL_FORM, DOMConstants.DOM3_EXPLICIT_FALSE);
6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                + DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);
6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE)) {
6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                + DOMConstants.DOM_VALIDATE, DOMConstants.DOM3_EXPLICIT_FALSE);
6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA)) {
6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        fDOMConfigProperties.setProperty(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION
6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                + DOMConstants.DOM_CHECK_CHAR_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } else if (name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION)) {
6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                + DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } /* else if (name.equalsIgnoreCase(DOMConstants.DOM_NORMALIZE_CHARACTERS)) {
6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                + DOMConstants.DOM_NORMALIZE_CHARACTERS, DOMConstants.DOM3_EXPLICIT_FALSE);
6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } */
6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else if (name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)) {
6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // infoset
6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (state) {
6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures &= ~ENTITIES;
7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures &= ~CDATA;
7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures &= ~SCHEMAVALIDATE;
7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures &= ~DTNORMALIZE;
7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures |= NAMESPACES;
7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures |= NAMESPACEDECLS;
7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures |= WELLFORMED;
7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures |= ELEM_CONTENT_WHITESPACE;
7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fFeatures |= COMMENTS;
7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_NAMESPACES, DOMConstants.DOM3_EXPLICIT_TRUE);
7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_NAMESPACE_DECLARATIONS, DOMConstants.DOM3_EXPLICIT_TRUE);
7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_COMMENTS, DOMConstants.DOM3_EXPLICIT_TRUE);
7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE, DOMConstants.DOM3_EXPLICIT_TRUE);
7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_WELLFORMED, DOMConstants.DOM3_EXPLICIT_TRUE);
7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS
7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_ENTITIES, DOMConstants.DOM3_EXPLICIT_FALSE);
7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_CDATA_SECTIONS, DOMConstants.DOM3_EXPLICIT_FALSE);
7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_VALIDATE_IF_SCHEMA, DOMConstants.DOM3_EXPLICIT_FALSE);
7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMConfigProperties.setProperty(DOMConstants.S_DOM3_PROPERTIES_NS
7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            + DOMConstants.DOM_DATATYPE_NORMALIZATION, DOMConstants.DOM3_EXPLICIT_FALSE);
7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // If this is a non-boolean parameter a type mismatch should be thrown.
7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER) ||
7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION) ||
7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    String msg = Utils.messages.createMessage(
7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            MsgKey.ER_TYPE_MISMATCH_ERR,
7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            new Object[] { name });
7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Parameter is not recognized
7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String msg = Utils.messages.createMessage(
7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        MsgKey.ER_FEATURE_NOT_FOUND,
7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        new Object[] { name });
7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } // If the parameter value is not a boolean
7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else if (name.equalsIgnoreCase(DOMConstants.DOM_ERROR_HANDLER)) {
7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (value == null || value instanceof DOMErrorHandler) {
7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMErrorHandler = (DOMErrorHandler)value;
7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String msg = Utils.messages.createMessage(
7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        MsgKey.ER_TYPE_MISMATCH_ERR,
7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        new Object[] { name });
7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else if (
7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_LOCATION)
7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                || name.equalsIgnoreCase(DOMConstants.DOM_SCHEMA_TYPE)) {
7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (value != null) {
7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (!(value instanceof String)) {
7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    String msg = Utils.messages.createMessage(
7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            MsgKey.ER_TYPE_MISMATCH_ERR,
7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            new Object[] { name });
7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String msg = Utils.messages.createMessage(
7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        MsgKey.ER_FEATURE_NOT_SUPPORTED,
7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        new Object[] { name });
7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new DOMException(DOMException.NOT_SUPPORTED_ERR, msg);
7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } else {
7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // If this is a boolean parameter a type mismatch should be thrown.
7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (name.equalsIgnoreCase(DOMConstants.DOM_COMMENTS) ||
7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_CDATA_SECTIONS) ||
7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_ENTITIES) ||
7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACES) ||
7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_NAMESPACE_DECLARATIONS) ||
7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_SPLIT_CDATA) ||
7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_WELLFORMED) ||
7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_DISCARD_DEFAULT_CONTENT) ||
7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_FORMAT_PRETTY_PRINT) ||
7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_XMLDECL) ||
7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_ELEMENT_CONTENT_WHITESPACE) ||
7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_IGNORE_UNKNOWN_CHARACTER_DENORMALIZATIONS) ||
7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_CANONICAL_FORM) ||
7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE_IF_SCHEMA) ||
7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_VALIDATE) ||
7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_CHECK_CHAR_NORMALIZATION) ||
7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_DATATYPE_NORMALIZATION) ||
7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    name.equalsIgnoreCase(DOMConstants.DOM_INFOSET)) {
7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String msg = Utils.messages.createMessage(
7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        MsgKey.ER_TYPE_MISMATCH_ERR,
7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        new Object[] { name });
7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new DOMException(DOMException.TYPE_MISMATCH_ERR, msg);
7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Parameter is not recognized
8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String msg = Utils.messages.createMessage(
8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    MsgKey.ER_FEATURE_NOT_FOUND,
8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    new Object[] { name });
8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new DOMException(DOMException.NOT_FOUND_ERR, msg);
8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // DOMConfiguraiton implementation
8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the DOMConfiguration of the LSSerializer.
8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.ls.LSSerializer#getDomConfig()
8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A DOMConfiguration object.
8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DOMConfiguration getDomConfig() {
8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (DOMConfiguration)this;
8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the DOMConfiguration of the LSSerializer.
8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.ls.LSSerializer#getFilter()
8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A LSSerializerFilter object.
8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public LSSerializerFilter getFilter() {
8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return fSerializerFilter;
8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns the End-Of-Line sequence of characters to be used in the XML
8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * being serialized.  If none is set a default "\n" is returned.
8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.ls.LSSerializer#getNewLine()
8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A String containing the end-of-line character sequence  used in
8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * serialization.
8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String getNewLine() {
8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return fEndOfLine;
8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Set a LSSerilizerFilter on the LSSerializer.  When set, the filter is
8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * called before each node is serialized which depending on its implemention
8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * determines if the node is to be serialized or not.
8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.ls.LSSerializer#setFilter
8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param filter A LSSerializerFilter to be applied to the stream to serialize.
8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setFilter(LSSerializerFilter filter) {
8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fSerializerFilter = filter;
8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Sets the End-Of-Line sequence of characters to be used in the XML
8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * being serialized.  Setting this attribute to null will reset its
8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * value to the default value i.e. "\n".
8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.ls.LSSerializer#setNewLine
8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param newLine a String that is the end-of-line character sequence to be used in
8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * serialization.
8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public void setNewLine(String newLine) {
8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fEndOfLine = (newLine != null) ? newLine : DEFAULT_END_OF_LINE;
8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Serializes the specified node to the specified LSOutput and returns true if the Node
8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was successfully serialized.
8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.ls.LSSerializer#write(org.w3c.dom.Node, org.w3c.dom.ls.LSOutput)
8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeArg The Node to serialize.
8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the
8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * LSSerializer was unable to serialize the node.
8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean write(Node nodeArg, LSOutput destination) throws LSException {
8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If the destination is null
8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (destination == null) {
8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String msg = Utils.messages
8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            .createMessage(
8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    MsgKey.ER_NO_OUTPUT_SPECIFIED,
8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    null);
8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMErrorHandler != null) {
8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMErrorHandler.handleError(new DOMErrorImpl(
8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMError.SEVERITY_FATAL_ERROR, msg,
8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        MsgKey.ER_NO_OUTPUT_SPECIFIED));
8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw new LSException(LSException.SERIALIZE_ERR, msg);
9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If nodeArg is null, return false.  Should we throw and LSException instead?
9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeArg == null ) {
9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return false;
9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Obtain a reference to the serializer to use
9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Serializer serializer = getXMLSerializer(xmlVersion);
9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Serializer serializer = fXMLSerializer;
9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        serializer.reset();
9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If the node has not been seen
9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if ( nodeArg != fVisitedNode) {
9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Determine the XML Document version of the Node
9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String xmlVersion = getXMLVersion(nodeArg);
9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Determine the encoding: 1.LSOutput.encoding, 2.Document.inputEncoding, 3.Document.xmlEncoding.
9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fEncoding = destination.getEncoding();
9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fEncoding == null ) {
9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            	fEncoding = getInputEncoding(nodeArg);
9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            	fEncoding = fEncoding != null ? fEncoding : getXMLEncoding(nodeArg) == null? "UTF-8": getXMLEncoding(nodeArg);
9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // If the encoding is not recognized throw an exception.
9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Note: The serializer defaults to UTF-8 when created
9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (!Encodings.isRecognizedEncoding(fEncoding)) {
9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String msg = Utils.messages
9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                .createMessage(
9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        MsgKey.ER_UNSUPPORTED_ENCODING,
9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        null);
9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (fDOMErrorHandler != null) {
9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMErrorHandler.handleError(new DOMErrorImpl(
9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            DOMError.SEVERITY_FATAL_ERROR, msg,
9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            MsgKey.ER_UNSUPPORTED_ENCODING));
9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new LSException(LSException.SERIALIZE_ERR, msg);
9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            serializer.getOutputFormat().setProperty("version", xmlVersion);
9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the output encoding and xml version properties
9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, fEncoding);
9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // If the node to be serialized is not a Document, Element, or Entity
9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // node
9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // then the XML declaration, or text declaration, should be never be
9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // serialized.
9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ( (nodeArg.getNodeType() != Node.DOCUMENT_NODE
9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && ((fFeatures & XMLDECL) != 0)) {
9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMConfigProperties.setProperty(
9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMConstants.DOM3_DEFAULT_FALSE);
9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fVisitedNode = nodeArg;
9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Update the serializer properties
9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //
9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // The LSSerializer will use the LSOutput object to determine
9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // where to serialize the output to in the following order the
9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // first one that is not null and not an empty string will be
9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // used: 1.LSOutput.characterStream, 2.LSOutput.byteStream,
9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // 3. LSOutput.systemId
9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // 1.LSOutput.characterStream
9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            Writer writer = destination.getCharacterStream();
9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (writer == null ) {
9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // 2.LSOutput.byteStream
9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                OutputStream outputStream = destination.getByteStream();
9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if ( outputStream == null) {
9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // 3. LSOutput.systemId
9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    String uri = destination.getSystemId();
9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (uri == null) {
9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        String msg = Utils.messages
9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        .createMessage(
9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                MsgKey.ER_NO_OUTPUT_SPECIFIED,
9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                null);
9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        if (fDOMErrorHandler != null) {
9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            fDOMErrorHandler.handleError(new DOMErrorImpl(
9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                    DOMError.SEVERITY_FATAL_ERROR, msg,
9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                    MsgKey.ER_NO_OUTPUT_SPECIFIED));
9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        }
9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        throw new LSException(LSException.SERIALIZE_ERR, msg);
9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    } else {
9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // Expand the System Id and obtain an absolute URI for it.
9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        String absoluteURI = SystemIDResolver.getAbsoluteURI(uri);
9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        URL url = new URL(absoluteURI);
9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        OutputStream urlOutStream = null;
10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        String protocol = url.getProtocol();
10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        String host = url.getHost();
10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // For file protocols, there is no need to use a URL to get its
10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // corresponding OutputStream
10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // Scheme names consist of a sequence of characters. The lower case
10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // letters "a"--"z", digits, and the characters plus ("+"), period
10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // ("."), and hyphen ("-") are allowed. For resiliency, programs
10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // interpreting URLs should treat upper case letters as equivalent to
10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // lower case in scheme names (e.g., allow "HTTP" as well as "http").
10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        if (protocol.equalsIgnoreCase("file")
10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                && (host == null || host.length() == 0 || host.equals("localhost"))) {
10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // do we also need to check for host.equals(hostname)
10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            urlOutStream = new FileOutputStream(getPathWithoutEscapes(url.getPath()));
10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        } else {
10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // This should support URL's whose schemes are mentioned in
10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // RFC1738 other than file
10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            URLConnection urlCon = url.openConnection();
10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            urlCon.setDoInput(false);
10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            urlCon.setDoOutput(true);
10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            urlCon.setUseCaches(false);
10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            urlCon.setAllowUserInteraction(false);
10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            // When writing to a HTTP URI, a HTTP PUT is performed.
10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            if (urlCon instanceof HttpURLConnection) {
10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                HttpURLConnection httpCon = (HttpURLConnection) urlCon;
10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                httpCon.setRequestMethod("PUT");
10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            }
10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            urlOutStream = urlCon.getOutputStream();
10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        }
10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        // set the OutputStream to that obtained from the systemId
10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        serializer.setOutputStream(urlOutStream);
10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // 2.LSOutput.byteStream
10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    serializer.setOutputStream(outputStream);
10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // 1.LSOutput.characterStream
10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                serializer.setWriter(writer);
10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // The associated media type by default is set to text/xml on
10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // org.apache.xml.serializer.SerializerBase.
10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Get a reference to the serializer then lets you serilize a DOM
10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Use this hack till Xalan support JAXP1.3
10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMSerializer == null) {
10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson               fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the error handler on the DOM3Serializer interface implementation
10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMErrorHandler != null) {
10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the filter on the DOM3Serializer interface implementation
10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fSerializerFilter != null) {
10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMSerializer.setNodeFilter(fSerializerFilter);
10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the NewLine character to be used
10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Serializer your DOM, where node is an org.w3c.dom.Node
10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Assuming that Xalan's serializer can serialize any type of DOM node
10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMSerializer.serializeDOM3(nodeArg);
10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch( UnsupportedEncodingException ue) {
10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String msg = Utils.messages
10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            .createMessage(
10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    MsgKey.ER_UNSUPPORTED_ENCODING,
10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    null);
10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMErrorHandler != null) {
10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMErrorHandler.handleError(new DOMErrorImpl(
10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMError.SEVERITY_FATAL_ERROR, msg,
10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        MsgKey.ER_UNSUPPORTED_ENCODING, ue));
10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw (LSException) createLSException(LSException.SERIALIZE_ERR, ue).fillInStackTrace();
10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (LSException lse) {
10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Rethrow LSException.
10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw lse;
10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (RuntimeException e) {
10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }  catch (Exception e) {
10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMErrorHandler != null) {
10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMErrorHandler.handleError(new DOMErrorImpl(
10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        null, e));
10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Serializes the specified node and returns a String with the serialized
11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * data to the caller.
11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.ls.LSSerializer#writeToString(org.w3c.dom.Node)
11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeArg The Node to serialize.
11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the
11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * LSSerializer was unable to serialize the node.
11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public String writeToString(Node nodeArg) throws DOMException, LSException {
11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // return null is nodeArg is null.  Should an Exception be thrown instead?
11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeArg == null) {
11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return null;
11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Should we reset the serializer configuration before each write operation?
11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Obtain a reference to the serializer to use
11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Serializer serializer = fXMLSerializer;
11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        serializer.reset();
11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeArg != fVisitedNode){
11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Determine the XML Document version of the Node
11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String xmlVersion = getXMLVersion(nodeArg);
11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            serializer.getOutputFormat().setProperty("version", xmlVersion);
11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the output encoding and xml version properties
11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, "UTF-16");
11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // If the node to be serialized is not a Document, Element, or Entity
11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // node
11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // then the XML declaration, or text declaration, should be never be
11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // serialized.
11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if  ((nodeArg.getNodeType() != Node.DOCUMENT_NODE
11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && ((fFeatures & XMLDECL) != 0)) {
11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMConfigProperties.setProperty(
11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMConstants.DOM3_DEFAULT_FALSE);
11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fVisitedNode = nodeArg;
11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Update the serializer properties
11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // StringWriter to Output to
11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        StringWriter output = new StringWriter();
11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //
11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the Serializer's Writer to a StringWriter
11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            serializer.setWriter(output);
11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Get a reference to the serializer then lets you serilize a DOM
11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Use this hack till Xalan support JAXP1.3
11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMSerializer == null) {
11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the error handler on the DOM3Serializer interface implementation
11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMErrorHandler != null) {
11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the filter on the DOM3Serializer interface implementation
11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fSerializerFilter != null) {
11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMSerializer.setNodeFilter(fSerializerFilter);
11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the NewLine character to be used
11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Serializer your DOM, where node is an org.w3c.dom.Node
11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMSerializer.serializeDOM3(nodeArg);
11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (LSException lse) {
11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Rethrow LSException.
11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw lse;
11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (RuntimeException e) {
11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }  catch (Exception e) {
11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMErrorHandler != null) {
11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMErrorHandler.handleError(new DOMErrorImpl(
11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        null, e));
11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // return the serialized string
11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return output.toString();
11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Serializes the specified node to the specified URI and returns true if the Node
11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * was successfully serialized.
12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @see org.w3c.dom.ls.LSSerializer#writeToURI(org.w3c.dom.Node, String)
12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @since DOM Level 3
12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param nodeArg The Node to serialize.
12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws org.w3c.dom.ls.LSException SERIALIZE_ERR: Raised if the
12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * LSSerializer was unable to serialize the node.
12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public boolean writeToURI(Node nodeArg, String uri) throws LSException {
12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If nodeArg is null, return false.  Should we throw and LSException instead?
12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeArg == null ) {
12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return false;
12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Obtain a reference to the serializer to use
12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Serializer serializer = fXMLSerializer;
12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        serializer.reset();
12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeArg != fVisitedNode) {
12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Determine the XML Document version of the Node
12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            String xmlVersion = getXMLVersion(nodeArg);
12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Determine the encoding: 1.LSOutput.encoding,
12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // 2.Document.inputEncoding, 3.Document.xmlEncoding.
12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fEncoding = getInputEncoding(nodeArg);
12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fEncoding == null ) {
12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            	fEncoding = fEncoding != null ? fEncoding : getXMLEncoding(nodeArg) == null? "UTF-8": getXMLEncoding(nodeArg);
12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            serializer.getOutputFormat().setProperty("version", xmlVersion);
12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the output encoding and xml version properties
12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_XERCES_PROPERTIES_NS + DOMConstants.S_XML_VERSION, xmlVersion);
12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMConfigProperties.setProperty(DOMConstants.S_XSL_OUTPUT_ENCODING, fEncoding);
12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // If the node to be serialized is not a Document, Element, or Entity
12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // node
12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // then the XML declaration, or text declaration, should be never be
12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // serialized.
12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if ( (nodeArg.getNodeType() != Node.DOCUMENT_NODE
12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || nodeArg.getNodeType() != Node.ELEMENT_NODE
12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    || nodeArg.getNodeType() != Node.ENTITY_NODE)
12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    && ((fFeatures & XMLDECL) != 0))  {
12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMConfigProperties.setProperty(
12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMConstants.S_XSL_OUTPUT_OMIT_XML_DECL,
12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMConstants.DOM3_DEFAULT_FALSE);
12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fVisitedNode = nodeArg;
12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Update the serializer properties
12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        fXMLSerializer.setOutputFormat(fDOMConfigProperties);
12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        //
12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try {
12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // If the specified encoding is not supported an
12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // "unsupported-encoding" fatal error is raised. ??
12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (uri == null) {
12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String msg = Utils.messages.createMessage(
12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        MsgKey.ER_NO_OUTPUT_SPECIFIED, null);
12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (fDOMErrorHandler != null) {
12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    fDOMErrorHandler.handleError(new DOMErrorImpl(
12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            DOMError.SEVERITY_FATAL_ERROR, msg,
12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            MsgKey.ER_NO_OUTPUT_SPECIFIED));
12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new LSException(LSException.SERIALIZE_ERR, msg);
12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // REVISIT: Can this be used to get an absolute expanded URI
12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String absoluteURI = SystemIDResolver.getAbsoluteURI(uri);
12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                URL url = new URL(absoluteURI);
12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                OutputStream urlOutStream = null;
12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String protocol = url.getProtocol();
12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String host = url.getHost();
12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // For file protocols, there is no need to use a URL to get its
12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // corresponding OutputStream
12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // Scheme names consist of a sequence of characters. The lower
12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // case letters "a"--"z", digits, and the characters plus ("+"),
12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // period ("."), and hyphen ("-") are allowed. For resiliency,
12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // programs interpreting URLs should treat upper case letters as
12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // equivalent to lower case in scheme names
12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // (e.g., allow "HTTP" as well as "http").
12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (protocol.equalsIgnoreCase("file")
12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        && (host == null || host.length() == 0 || host
12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                .equals("localhost"))) {
12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // do we also need to check for host.equals(hostname)
12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    urlOutStream = new FileOutputStream(getPathWithoutEscapes(url.getPath()));
12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                } else {
12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // This should support URL's whose schemes are mentioned in
12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // RFC1738 other than file
12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    URLConnection urlCon = url.openConnection();
12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    urlCon.setDoInput(false);
12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    urlCon.setDoOutput(true);
12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    urlCon.setUseCaches(false);
13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    urlCon.setAllowUserInteraction(false);
13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // When writing to a HTTP URI, a HTTP PUT is performed.
13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    if (urlCon instanceof HttpURLConnection) {
13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        HttpURLConnection httpCon = (HttpURLConnection) urlCon;
13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        httpCon.setRequestMethod("PUT");
13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    }
13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    urlOutStream = urlCon.getOutputStream();
13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // set the OutputStream to that obtained from the systemId
13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                serializer.setOutputStream(urlOutStream);
13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Get a reference to the serializer then lets you serilize a DOM
13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Use this hack till Xalan support JAXP1.3
13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMSerializer == null) {
13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMSerializer = (DOM3Serializer)serializer.asDOM3Serializer();
13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the error handler on the DOM3Serializer interface implementation
13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMErrorHandler != null) {
13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMSerializer.setErrorHandler(fDOMErrorHandler);
13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the filter on the DOM3Serializer interface implementation
13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fSerializerFilter != null) {
13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMSerializer.setNodeFilter(fSerializerFilter);
13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Set the NewLine character to be used
13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMSerializer.setNewLine(fEndOfLine.toCharArray());
13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Serializer your DOM, where node is an org.w3c.dom.Node
13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Assuming that Xalan's serializer can serialize any type of DOM
13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // node
13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            fDOMSerializer.serializeDOM3(nodeArg);
13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (LSException lse) {
13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Rethrow LSException.
13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw lse;
13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        } catch (RuntimeException e) {
13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }  catch (Exception e) {
13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (fDOMErrorHandler != null) {
13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fDOMErrorHandler.handleError(new DOMErrorImpl(
13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        DOMError.SEVERITY_FATAL_ERROR, e.getMessage(),
13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        null, e));
13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throw (LSException) createLSException(LSException.SERIALIZE_ERR, e).fillInStackTrace();
13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return true;
13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Implementaion methods
13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ************************************************************************
13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Determines the XML Version of the Document Node to serialize.  If the Document Node
13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is not a DOM Level 3 Node, then the default version returned is 1.0.
13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param  nodeArg The Node to serialize
13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A String containing the version pseudo-attribute of the XMLDecl.
13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws Throwable if the DOM implementation does not implement Document.getXmlVersion()
13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //protected String getXMLVersion(Node nodeArg) throws Throwable {
13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String getXMLVersion(Node nodeArg) {
13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Document doc = null;
13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Determine the XML Version of the document
13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeArg != null) {
13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // The Document node is the Node argument
13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                doc = (Document)nodeArg;
13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // The Document node is the Node argument's ownerDocument
13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                doc = nodeArg.getOwnerDocument();
13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Determine the DOM Version.
13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return doc.getXmlVersion();
13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // The version will be treated as "1.0" which may result in
13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // an ill-formed document being serialized.
13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // If nodeArg does not have an ownerDocument, treat this as XML 1.0
13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return "1.0";
13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Determines the XML Encoding of the Document Node to serialize.  If the Document Node
13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is not a DOM Level 3 Node, then the default encoding "UTF-8" is returned.
13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param  nodeArg The Node to serialize
13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A String containing the encoding pseudo-attribute of the XMLDecl.
13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @throws Throwable if the DOM implementation does not implement Document.getXmlEncoding()
14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String getXMLEncoding(Node nodeArg) {
14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Document doc = null;
14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Determine the XML Encoding of the document
14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeArg != null) {
14069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
14079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // The Document node is the Node argument
14089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                doc = (Document)nodeArg;
14099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
14109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // The Document node is the Node argument's ownerDocument
14119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                doc = nodeArg.getOwnerDocument();
14129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Determine the XML Version.
14159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
14169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return doc.getXmlEncoding();
14179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // The default encoding is UTF-8 except for the writeToString method
14209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return "UTF-8";
14219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Determines the Input Encoding of the Document Node to serialize.  If the Document Node
14259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * is not a DOM Level 3 Node, then null is returned.
14269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @param  nodeArg The Node to serialize
14289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return A String containing the input encoding.
14299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    protected String getInputEncoding(Node nodeArg)  {
14319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        Document doc = null;
14329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Determine the Input Encoding of the document
14349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (nodeArg != null) {
14359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (nodeArg.getNodeType() == Node.DOCUMENT_NODE) {
14369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // The Document node is the Node argument
14379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                doc = (Document)nodeArg;
14389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            } else {
14399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                // The Document node is the Node argument's ownerDocument
14409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                doc = nodeArg.getOwnerDocument();
14419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Determine the DOM Version.
14449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (doc != null && doc.getImplementation().hasFeature("Core","3.0")) {
14459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                return doc.getInputEncoding();
14469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // The default encoding returned is null
14499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return null;
14509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * This method returns the LSSerializer's error handler.
14549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     *
14559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * @return Returns the fDOMErrorHandler.
14569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    public DOMErrorHandler getErrorHandler() {
14589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return fDOMErrorHandler;
14599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Replaces all escape sequences in the given path with their literal characters.
14639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private static String getPathWithoutEscapes(String origPath) {
14659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (origPath != null && origPath.length() != 0 && origPath.indexOf('%') != -1) {
14669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Locate the escape characters
14679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            StringTokenizer tokenizer = new StringTokenizer(origPath, "%");
14689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            StringBuffer result = new StringBuffer(origPath.length());
14699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            int size = tokenizer.countTokens();
14709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            result.append(tokenizer.nextToken());
14719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            for(int i = 1; i < size; ++i) {
14729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                String token = tokenizer.nextToken();
14739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                if (token.length() >= 2 && isHexDigit(token.charAt(0)) &&
14749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                        isHexDigit(token.charAt(1))) {
14759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    // Decode the 2 digit hexadecimal number following % in '%nn'
14769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    result.append((char)Integer.valueOf(token.substring(0, 2), 16).intValue());
14779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                    token = token.substring(2);
14789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                }
14799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                result.append(token);
14809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
14819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            return result.toString();
14829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
14839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return origPath;
14849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Returns true if the given character is a valid hex character.
14889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private static boolean isHexDigit(char c) {
14909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return (c >= '0' && c <= '9' ||
14919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                c >= 'a' && c <= 'f' ||
14929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                c >= 'A' && c <= 'F');
14939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
14949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
14959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
14969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Creates an LSException. On J2SE 1.4 and above the cause for the exception will be set.
14979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
14989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    private static LSException createLSException(short code, Throwable cause) {
14999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        LSException lse = new LSException(code, cause != null ? cause.getMessage() : null);
15009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (cause != null && ThrowableMethods.fgThrowableMethodsAvailable) {
15019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try {
15029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                ThrowableMethods.fgThrowableInitCauseMethod.invoke(lse, new Object [] {cause});
15039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
15049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Something went wrong. There's not much we can do about it.
15059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch (Exception e) {}
15069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
15079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return lse;
15089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    /**
15119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     * Holder of methods from java.lang.Throwable.
15129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson     */
15139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static class ThrowableMethods {
15149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Method: java.lang.Throwable.initCause(java.lang.Throwable)
15169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        private static java.lang.reflect.Method fgThrowableInitCauseMethod = null;
15179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Flag indicating whether or not Throwable methods available.
15199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        private static boolean fgThrowableMethodsAvailable = false;
15209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        private ThrowableMethods() {}
15229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
15239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Attempt to get methods for java.lang.Throwable on class initialization.
15249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        static {
15259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            try {
15269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fgThrowableInitCauseMethod = Throwable.class.getMethod("initCause", new Class [] {Throwable.class});
15279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fgThrowableMethodsAvailable = true;
15289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
15299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // ClassNotFoundException, NoSuchMethodException or SecurityException
15309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            // Whatever the case, we cannot use java.lang.Throwable.initCause(java.lang.Throwable).
15319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            catch (Exception exc) {
15329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fgThrowableInitCauseMethod = null;
15339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                fgThrowableMethodsAvailable = false;
15349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
15359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
15369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
15379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
1538