package org.basex.api.jaxp;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.sax.SAXSource;
import org.basex.api.dom.BXDoc;
import org.basex.api.dom.BXDomImpl;
import org.basex.build.MemBuilder;
import org.basex.build.xml.SAXWrapper;
import org.basex.core.Context;
import org.basex.data.Data;
import org.basex.query.item.DBNode;
import org.basex.util.Util;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
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;
/**
* This class provides a document builder.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
final class BXDocBuilder extends DocumentBuilder {
/** Database context. */
private final Context ctx = new Context();
/** Parser instance. */
private final SAXParserFactory factory;
/** Parser instance. */
private final XMLReader parser;
/**
* Constructor.
* @throws SAXException exception
* @throws ParserConfigurationException exception
*/
BXDocBuilder() throws SAXException, ParserConfigurationException {
factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);
parser = factory.newSAXParser().getXMLReader();
}
@Override
public DOMImplementation getDOMImplementation() {
return BXDomImpl.get();
}
@Override
public boolean isNamespaceAware() {
return factory.isNamespaceAware();
}
@Override
public boolean isValidating() {
return factory.isValidating();
}
@Override
public Document newDocument() {
Util.notimplemented();
return null;
}
@Override
public Document parse(final InputSource is) throws IOException {
final String id = is.getSystemId();
final SAXSource ss = new SAXSource(parser, is);
final SAXWrapper sw = new SAXWrapper(ss, ctx.prop);
final Data data = MemBuilder.build(id == null ? "" : id, sw, ctx.prop);
return new BXDoc(new DBNode(data, 0));
}
@Override
public void setEntityResolver(final EntityResolver er) {
parser.setEntityResolver(er);
}
@Override
public void setErrorHandler(final ErrorHandler eh) {
parser.setErrorHandler(eh);
}
}