/*
 * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
 */
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the  "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sun.org.apache.xml.internal.serializer.dom3;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.Properties;

import com.sun.org.apache.xml.internal.serializer.DOM3Serializer;
import com.sun.org.apache.xml.internal.serializer.Encodings;
import com.sun.org.apache.xml.internal.serializer.Serializer;
import com.sun.org.apache.xml.internal.serializer.ToXMLStream;
import com.sun.org.apache.xml.internal.serializer.OutputPropertiesFactory;
import com.sun.org.apache.xml.internal.serializer.SerializerFactory;
import com.sun.org.apache.xml.internal.serializer.utils.MsgKey;
import com.sun.org.apache.xml.internal.serializer.utils.Utils;
import com.sun.org.apache.xml.internal.serializer.utils.SystemIDResolver;
import org.w3c.dom.DOMConfiguration;
import org.w3c.dom.DOMError;
import org.w3c.dom.DOMErrorHandler;
import org.w3c.dom.DOMException;
import org.w3c.dom.DOMStringList;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.ls.LSException;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;
import org.w3c.dom.ls.LSSerializerFilter;


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