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