package org.basex.io.serial;
import static org.basex.data.DataText.*;
import static org.basex.util.Token.*;
import java.io.IOException;
import org.basex.core.BaseXException;
import org.basex.data.Result;
import org.basex.query.item.Item;
import org.basex.util.Util;
import org.xml.sax.ContentHandler;
import org.xml.sax.DTDHandler;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.helpers.AttributesImpl;
/**
* This class serializes data via SAX.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class SAXSerializer extends Serializer implements XMLReader {
/** Content handler reference. */
private ContentHandler content;
/** Lexical handler reference. */
private LexicalHandler lexical;
/** Content handler reference. */
private final Result result;
/** Caches attributes. */
private AttributesImpl atts;
/**
* Constructor.
* @param res result
*/
public SAXSerializer(final Result res) {
result = res;
}
@Override
public ContentHandler getContentHandler() {
return content;
}
@Override
public DTDHandler getDTDHandler() {
return null;
}
@Override
public EntityResolver getEntityResolver() {
return null;
}
@Override
public ErrorHandler getErrorHandler() {
return null;
}
@Override
public boolean getFeature(final String name) {
return false;
}
@Override
public Object getProperty(final String name) {
return null;
}
@Override
public void parse(final InputSource input) throws SAXException {
parse("");
}
@Override
public void parse(final String id) throws SAXException {
try {
// execute query
content.startDocument();
result.serialize(this);
content.endDocument();
} catch(final Exception ex) {
throw new SAXException(ex);
}
}
@Override
public void setContentHandler(final ContentHandler c) {
content = c;
}
/**
* Sets the lexical handler for reacting on comments.
* @param l handler
*/
public void setLexicalHandler(final LexicalHandler l) {
lexical = l;
}
@Override
public void setDTDHandler(final DTDHandler h) {
Util.notimplemented();
}
@Override
public void setEntityResolver(final EntityResolver resolver) {
Util.notimplemented();
}
@Override
public void setErrorHandler(final ErrorHandler h) {
Util.notimplemented();
}
@Override
public void setFeature(final String name, final boolean value) {
Util.notimplemented();
}
@Override
public void setProperty(final String name, final Object value) {
Util.notimplemented();
}
@Override
public void openResult() throws IOException {
openElement(T_RESULT);
}
@Override
public void closeResult() throws IOException {
closeElement();
}
@Override
public void attribute(final byte[] n, final byte[] v) {
final String an = string(n);
atts.addAttribute("", an, an, "", string(v));
}
@Override
protected void startOpen(final byte[] t) {
atts = new AttributesImpl();
}
@Override
protected void finishOpen() throws IOException {
try {
content.startElement("", string(tag), string(tag), atts);
} catch(final SAXException ex) {
throw new BaseXException(ex);
}
}
@Override
protected void finishEmpty() throws IOException {
finishOpen();
finishClose();
}
@Override
protected void finishClose() throws IOException {
try {
content.endElement("", string(tag), string(tag));
} catch(final SAXException ex) {
throw new BaseXException(ex);
}
}
@Override
public void finishText(final byte[] b) throws IOException {
final char[] c = string(b).toCharArray();
try {
content.characters(c, 0, c.length);
} catch(final SAXException ex) {
throw new BaseXException(ex);
}
}
@Override
public void finishComment(final byte[] t) throws IOException {
try {
final char[] c = string(t).toCharArray();
if(lexical != null) lexical.comment(c, 0, t.length);
} catch(final SAXException ex) {
throw new BaseXException(ex);
}
}
@Override
public void finishPi(final byte[] n, final byte[] v) throws IOException {
try {
content.processingInstruction(string(n), string(v));
} catch(final SAXException ex) {
throw new BaseXException(ex);
}
}
@Override
public void finishItem(final Item b) throws IOException {
throw new BaseXException("Items cannot be serialized");
}
}