blob: b7c51447e669b9cccd0d9da7087a55963a5dec83 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.framework.jdk.core.util.io.xml;
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.helpers.DefaultHandler;
/**
* @author Ryan D. Brooks
*
* If you want to preserve CDATA sections you need to follow this pattern:
*
* XMLReader xmlReader = XMLReaderFactory.createXMLReader();
* xmlReader.setContentHandler(this);
* xmlReader.setProperty("http://xml.org/sax/properties/lexical-handler", this); //This is the important part
*
*/
public abstract class AbstractSaxHandler extends DefaultHandler implements LexicalHandler{
// Buffer for collecting data from the "characters" SAX event.
private StringBuilder contents;
private final int maxContentLength;
protected AbstractSaxHandler() {
this(0);
}
protected AbstractSaxHandler(int maxContentLength) {
this.contents = new StringBuilder(2000);
this.maxContentLength = maxContentLength;
}
/* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (maxContentLength > 0 && contents.length() + length > maxContentLength) {
return; // don't add more characters if doing so will make the content too long
}
contents.append(ch, start, length);
}
/* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
endElementFound(uri, localName, qName);
contents.setLength(0); // efficiently reset the StringBuilder to be empty (but preserve its capacity)
}
/* (non-Javadoc)
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
startElementFound(uri, localName, qName, attributes);
contents.setLength(0); // efficiently reset the StringBuilder to be empty (but preserve its capacity)
}
public abstract void startElementFound(String uri, String localName, String qName, Attributes attributes) throws SAXException;
public abstract void endElementFound(String uri, String localName, String qName) throws SAXException;
public String getContents() {
return contents.toString();
}
public void addContentsTo(Appendable appendable) throws IOException {
appendable.append(contents);
}
/* (non-Javadoc)
* @see org.xml.sax.ext.LexicalHandler#comment(char[], int, int)
*/
public void comment(char[] ch, int start, int length) throws SAXException {
}
/* (non-Javadoc)
* @see org.xml.sax.ext.LexicalHandler#endCDATA()
*/
public void endCDATA() throws SAXException {
contents.append("]]>");
}
/* (non-Javadoc)
* @see org.xml.sax.ext.LexicalHandler#endDTD()
*/
public void endDTD() throws SAXException {
}
/* (non-Javadoc)
* @see org.xml.sax.ext.LexicalHandler#endEntity(java.lang.String)
*/
public void endEntity(String name) throws SAXException {
}
/* (non-Javadoc)
* @see org.xml.sax.ext.LexicalHandler#startCDATA()
*/
public void startCDATA() throws SAXException {
contents.append("<![CDATA[");
}
/* (non-Javadoc)
* @see org.xml.sax.ext.LexicalHandler#startDTD(java.lang.String, java.lang.String, java.lang.String)
*/
public void startDTD(String name, String publicId, String systemId)
throws SAXException {
}
/* (non-Javadoc)
* @see org.xml.sax.ext.LexicalHandler#startEntity(java.lang.String)
*/
public void startEntity(String name) throws SAXException {
}
}