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);