package org.basex.api.xqj;
import static org.basex.core.Text.*;
import static org.basex.util.Token.*;
import java.io.IOException;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.basex.build.Builder;
import org.basex.build.Parser;
import org.basex.util.Atts;
import org.basex.util.Util;
/**
* This class parses an XML document via a conventional SAX parser.
* Would be the easiest solution, but some large file cannot be parsed
* with the default parser.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
final class XMLStreamWrapper extends Parser {
/** Element counter. */
private int nodes;
/** XML stream reader. */
private final XMLStreamReader reader;
/**
* Constructor.
* @param sr stream reader
*/
XMLStreamWrapper(final XMLStreamReader sr) {
super("");
reader = sr;
}
@Override
public void parse(final Builder builder) throws IOException {
try {
builder.startDoc(token(src.name()));
while(reader.hasNext()) {
final int kind = reader.next();
switch(kind) {
case XMLStreamConstants.START_ELEMENT:
final int as = reader.getAttributeCount();
final Atts att = new Atts();
for(int a = 0; a < as; ++a) {
att.add(token(reader.getAttributeLocalName(a)),
token(reader.getAttributeValue(a)));
}
builder.startElem(token(reader.getLocalName()), att);
++nodes;
break;
case XMLStreamConstants.END_ELEMENT:
builder.endElem();
break;
case XMLStreamConstants.CHARACTERS:
builder.text(token(reader.getText()));
++nodes;
break;
case XMLStreamConstants.PROCESSING_INSTRUCTION:
builder.pi(token(reader.getPITarget() + ' ' + reader.getPIData()));
++nodes;
break;
case XMLStreamConstants.COMMENT:
builder.comment(token(reader.getText()));
++nodes;
break;
case XMLStreamConstants.END_DOCUMENT:
break;
default:
throw new IOException("Unknown node kind " + kind);
}
}
builder.endDoc();
} catch(final IOException ex) {
Util.stack(ex);
throw ex;
} catch(final XMLStreamException ex) {
final IOException ioe = new IOException(ex.getMessage());
ioe.setStackTrace(ex.getStackTrace());
throw ioe;
}
}
@Override
public String det() {
return Util.info(NODES_PARSED_X, src.name(), nodes);
}
}