/*
 * Copyright (c) 2016, 2017, 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;

import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.ext.LexicalHandler;

This class is used to provide a base behavior to be inherited by other To...SAXHandler serializers. This class is not a public API.
@xsl.usageinternal
@LastModified: Oct 2017
/** * This class is used to provide a base behavior to be inherited * by other To...SAXHandler serializers. * * This class is not a public API. * * @xsl.usage internal * @LastModified: Oct 2017 */
public abstract class ToSAXHandler extends SerializerBase { public ToSAXHandler() { } public ToSAXHandler(ContentHandler hdlr, LexicalHandler lex, String encoding) { setContentHandler(hdlr); setLexHandler(lex); setEncoding(encoding); } public ToSAXHandler(ContentHandler handler, String encoding) { setContentHandler(handler); setEncoding(encoding); }
Underlying SAX handler. Taken from XSLTC
/** * Underlying SAX handler. Taken from XSLTC */
protected ContentHandler m_saxHandler;
Underlying LexicalHandler. Taken from XSLTC
/** * Underlying LexicalHandler. Taken from XSLTC */
protected LexicalHandler m_lexHandler;
A startPrefixMapping() call on a ToSAXHandler will pass that call on to the wrapped ContentHandler, but should we also mirror these calls with matching attributes, if so this field is true. For example if this field is true then a call such as startPrefixMapping("prefix1","uri1") will also cause the additional internally generated attribute xmlns:prefix1="uri1" to be effectively added to the attributes passed to the wrapped ContentHandler.
/** * A startPrefixMapping() call on a ToSAXHandler will pass that call * on to the wrapped ContentHandler, but should we also mirror these calls * with matching attributes, if so this field is true. * For example if this field is true then a call such as * startPrefixMapping("prefix1","uri1") will also cause the additional * internally generated attribute xmlns:prefix1="uri1" to be effectively added * to the attributes passed to the wrapped ContentHandler. */
private boolean m_shouldGenerateNSAttribute = true;
If this is true, then the content handler wrapped by this serializer implements the TransformState interface which will give the content handler access to the state of the transform.
/** If this is true, then the content handler wrapped by this * serializer implements the TransformState interface which * will give the content handler access to the state of * the transform. */
protected TransformStateSetter m_state = null;
Pass callback to the SAX Handler
/** * Pass callback to the SAX Handler */
protected void startDocumentInternal() throws SAXException { if (m_needToCallStartDocument) { super.startDocumentInternal(); m_saxHandler.startDocument(); m_needToCallStartDocument = false; } }
Do nothing.
See Also:
  • startDTD.startDTD(String, String, String)
/** * Do nothing. * @see org.xml.sax.ext.LexicalHandler#startDTD(String, String, String) */
public void startDTD(String arg0, String arg1, String arg2) throws SAXException { // do nothing for now }
Receive notification of character data.
Params:
  • chars – The string of characters to process.
Throws:
See Also:
/** * Receive notification of character data. * * @param chars The string of characters to process. * * @throws org.xml.sax.SAXException * * @see ExtendedContentHandler#characters(String) */
public void characters(String chars) throws SAXException { final int len = (chars == null) ? 0 : chars.length(); if (len > m_charsBuff.length) { m_charsBuff = new char[len * 2 + 1]; } if (len > 0) { chars.getChars(0, len, m_charsBuff, 0); } characters(m_charsBuff, 0, len); }
Receive notification of a comment.
See Also:
  • comment.comment(String)
/** * Receive notification of a comment. * * @see ExtendedLexicalHandler#comment(String) */
public void comment(String comment) throws SAXException { flushPending(); // Ignore if a lexical handler has not been set if (m_lexHandler != null) { final int len = comment.length(); if (len > m_charsBuff.length) { m_charsBuff = new char[len*2 + 1]; } comment.getChars(0,len, m_charsBuff, 0); m_lexHandler.comment(m_charsBuff, 0, len); // time to fire off comment event if (m_tracer != null) super.fireCommentEvent(m_charsBuff, 0, len); } }
Do nothing as this is an abstract class. All subclasses will need to define their behavior if it is different.
See Also:
  • processingInstruction.processingInstruction(String, String)
/** * Do nothing as this is an abstract class. All subclasses will need to * define their behavior if it is different. * @see org.xml.sax.ContentHandler#processingInstruction(String, String) */
public void processingInstruction(String target, String data) throws SAXException { // Redefined in SAXXMLOutput } protected void closeStartTag() throws SAXException { } protected void closeCDATA() throws SAXException { // Redefined in SAXXMLOutput }
Receive notification of the beginning of an element, although this is a SAX method additional namespace or attribute information can occur before or after this call, that is associated with this element.
Throws:
  • SAXException – Any SAX exception, possibly wrapping another exception.
  • SAXException
See Also:
/** * Receive notification of the beginning of an element, although this is a * SAX method additional namespace or attribute information can occur before * or after this call, that is associated with this element. * * @throws org.xml.sax.SAXException Any SAX exception, possibly * wrapping another exception. * @see org.xml.sax.ContentHandler#startElement * @see org.xml.sax.ContentHandler#endElement * @see org.xml.sax.AttributeList * * @throws org.xml.sax.SAXException * * @see org.xml.sax.ContentHandler#startElement(String,String,String,Attributes) */
public void startElement(String arg0, String arg1, String arg2, Attributes arg3) throws SAXException { if (m_state != null) { m_state.resetState(getTransformer()); } // fire off the start element event if (m_tracer != null) super.fireStartElem(arg2); }
Sets the LexicalHandler.
Params:
  • _lexHandler – The LexicalHandler to set
/** * Sets the LexicalHandler. * @param _lexHandler The LexicalHandler to set */
public void setLexHandler(LexicalHandler _lexHandler) { this.m_lexHandler = _lexHandler; }
Sets the SAX ContentHandler.
Params:
  • _saxHandler – The ContentHandler to set
/** * Sets the SAX ContentHandler. * @param _saxHandler The ContentHandler to set */
public void setContentHandler(ContentHandler _saxHandler) { this.m_saxHandler = _saxHandler; if (m_lexHandler == null && _saxHandler instanceof LexicalHandler) { // we are not overwriting an existing LexicalHandler, and _saxHandler // is also implements LexicalHandler, so lets use it m_lexHandler = (LexicalHandler) _saxHandler; } }
Does nothing. The setting of CDATA section elements has an impact on stream serializers.
See Also:
  • SerializationHandler#setCdataSectionElements(java.util.List)
/** * Does nothing. The setting of CDATA section elements has an impact on * stream serializers. * @see SerializationHandler#setCdataSectionElements(java.util.List<String>) */
public void setCdataSectionElements(List<String> URI_and_localNames) { // do nothing }
Set whether or not namespace declarations (e.g. xmlns:foo) should appear as attributes of elements
Params:
  • doOutputNSAttr – whether or not namespace declarations should appear as attributes
/** Set whether or not namespace declarations (e.g. * xmlns:foo) should appear as attributes of * elements * @param doOutputNSAttr whether or not namespace declarations * should appear as attributes */
public void setShouldOutputNSAttr(boolean doOutputNSAttr) { m_shouldGenerateNSAttribute = doOutputNSAttr; }
Returns true if namespace declarations from calls such as startPrefixMapping("prefix1","uri1") should also be mirrored with self generated additional attributes of elements that declare the namespace, for example the attribute xmlns:prefix1="uri1"
/** * Returns true if namespace declarations from calls such as * startPrefixMapping("prefix1","uri1") should * also be mirrored with self generated additional attributes of elements * that declare the namespace, for example the attribute xmlns:prefix1="uri1" */
boolean getShouldOutputNSAttr() { return m_shouldGenerateNSAttribute; }
This method flushes any pending events, which can be startDocument() closing the opening tag of an element, or closing an open CDATA section.
/** * This method flushes any pending events, which can be startDocument() * closing the opening tag of an element, or closing an open CDATA section. */
public void flushPending() throws SAXException { if (m_needToCallStartDocument) { startDocumentInternal(); m_needToCallStartDocument = false; } if (m_elemContext.m_startTagOpen) { closeStartTag(); m_elemContext.m_startTagOpen = false; } if (m_cdataTagOpen) { closeCDATA(); m_cdataTagOpen = false; } }
Pass in a reference to a TransformState object, which can be used during SAX ContentHandler events to obtain information about he state of the transformation. This method will be called before each startDocument event.
Params:
  • ts – A reference to a TransformState object
/** * Pass in a reference to a TransformState object, which * can be used during SAX ContentHandler events to obtain * information about he state of the transformation. This * method will be called before each startDocument event. * * @param ts A reference to a TransformState object */
public void setTransformState(TransformStateSetter ts) { this.m_state = ts; }
Receives notification that an element starts, but attributes are not fully known yet.
Params:
  • uri – the URI of the namespace of the element (optional)
  • localName – the element name, but without prefix (optional)
  • qName – the element name, with prefix, if any (required)
See Also:
/** * Receives notification that an element starts, but attributes are not * fully known yet. * * @param uri the URI of the namespace of the element (optional) * @param localName the element name, but without prefix (optional) * @param qName the element name, with prefix, if any (required) * * @see ExtendedContentHandler#startElement(String, String, String) */
public void startElement(String uri, String localName, String qName) throws SAXException { if (m_state != null) { m_state.resetState(getTransformer()); } // fire off the start element event if (m_tracer != null) super.fireStartElem(qName); }
An element starts, but attributes are not fully known yet.
Params:
  • qName – the element name, with prefix (if any).
See Also:
/** * An element starts, but attributes are not fully known yet. * * @param qName the element name, with prefix (if any). * @see ExtendedContentHandler#startElement(String) */
public void startElement(String qName) throws SAXException { if (m_state != null) { m_state.resetState(getTransformer()); } // fire off the start element event if (m_tracer != null) super.fireStartElem(qName); }
This method gets the node's value as a String and uses that String as if it were an input character notification.
Params:
  • node – the Node to serialize
Throws:
/** * This method gets the node's value as a String and uses that String as if * it were an input character notification. * @param node the Node to serialize * @throws org.xml.sax.SAXException */
public void characters(org.w3c.dom.Node node) throws org.xml.sax.SAXException { // remember the current node if (m_state != null) { m_state.setCurrentNode(node); } // Get the node's value as a String and use that String as if // it were an input character notification. String data = node.getNodeValue(); if (data != null) { this.characters(data); } }
See Also:
  • fatalError.fatalError(SAXParseException)
/** * @see org.xml.sax.ErrorHandler#fatalError(SAXParseException) */
public void fatalError(SAXParseException exc) throws SAXException { super.fatalError(exc); m_needToCallStartDocument = false; if (m_saxHandler instanceof ErrorHandler) { ((ErrorHandler)m_saxHandler).fatalError(exc); } }
See Also:
  • error.error(SAXParseException)
/** * @see org.xml.sax.ErrorHandler#error(SAXParseException) */
public void error(SAXParseException exc) throws SAXException { super.error(exc); if (m_saxHandler instanceof ErrorHandler) ((ErrorHandler)m_saxHandler).error(exc); }
See Also:
  • warning.warning(SAXParseException)
/** * @see org.xml.sax.ErrorHandler#warning(SAXParseException) */
public void warning(SAXParseException exc) throws SAXException { super.warning(exc); if (m_saxHandler instanceof ErrorHandler) ((ErrorHandler)m_saxHandler).warning(exc); }
Try's to reset the super class and reset this class for re-use, so that you don't need to create a new serializer (mostly for performance reasons).
See Also:
Returns:true if the class was successfuly reset.
/** * Try's to reset the super class and reset this class for * re-use, so that you don't need to create a new serializer * (mostly for performance reasons). * * @return true if the class was successfuly reset. * @see Serializer#reset() */
public boolean reset() { boolean wasReset = false; if (super.reset()) { resetToSAXHandler(); wasReset = true; } return wasReset; }
Reset all of the fields owned by ToSAXHandler class
/** * Reset all of the fields owned by ToSAXHandler class * */
private void resetToSAXHandler() { this.m_lexHandler = null; this.m_saxHandler = null; this.m_state = null; this.m_shouldGenerateNSAttribute = false; }
Add a unique attribute
/** * Add a unique attribute */
public void addUniqueAttribute(String qName, String value, int flags) throws SAXException { addAttribute(qName, value); } }