package org.basex.build; import java.io.*; import org.basex.build.csv.*; import org.basex.build.html.*; import org.basex.build.json.*; import org.basex.build.text.*; import org.basex.build.xml.*; import org.basex.core.*; import org.basex.core.MainOptions.MainParser; import org.basex.core.jobs.*; import org.basex.io.*; import org.basex.util.*; /** * This class defines a parser, which is used to create new databases instances. * * @author BaseX Team 2005-17, BSD License * @author Christian Gruen */ public abstract class Parser extends Job { /** Source document or {@code null}. */ public IO source; /** Attributes of currently parsed element. */ protected final Atts atts = new Atts(); /** Namespaces of currently parsed element. */ protected final Atts nsp = new Atts(); /** Main options. */ protected final MainOptions options; /** Target path (empty, or suffixed with a single slash). */ String target = ""; /** * Constructor. * @param source document source or {@code null} * @param options main options */ protected Parser(final String source, final MainOptions options) { this(source == null ? null : IO.get(source), options); } /** * Constructor. * @param source document source or {@code null} * @param options main options */ protected Parser(final IO source, final MainOptions options) { this.source = source; this.options = options; } /** * Parses all nodes and sends events to the specified builder. * @param build database builder * @throws IOException I/O exception */ public abstract void parse(Builder build) throws IOException; /** * Closes the parser. * @throws IOException I/O exception */ @SuppressWarnings("unused") public void close() throws IOException { } /** * Returns parser information. * @return info string */ public String info() { return ""; } /** * Sets the target path. * @param path target path * @return self reference */ public Parser target(final String path) { target = path.isEmpty() ? "" : (path + '/').replaceAll("//+", "/"); return this; } // STATIC METHODS =========================================================== /** * Returns a parser instance for creating empty databases. * @param options database options * @return parser */ public static Parser emptyParser(final MainOptions options) { return new Parser((IO) null, options) { @Override public void parse(final Builder build) { /* empty */ } }; } /** * Returns an XML parser instance, using the Java default parser. * @param source input source * @return xml parser */ public static SAXWrapper xmlParser(final IO source) { return new SAXWrapper(source, MainOptions.get()); } /** * Returns a parser instance, based on the current options. * @param source input source * @param options database options * @param target relative path reference * @return parser * @throws IOException I/O exception */ public static SingleParser singleParser(final IO source, final MainOptions options, final String target) throws IOException { // use file specific parser final SingleParser p; final MainParser mp = options.get(MainOptions.PARSER); switch(mp) { case HTML: p = new HtmlParser(source, options); break; case TEXT: p = new TextParser(source, options); break; case JSON: p = new JsonParser(source, options); break; case CSV: p = new CsvParser(source, options); break; default: p = options.get(MainOptions.INTPARSE) ? new XMLParser(source, options) : new SAXWrapper(source, options); break; } p.target(target); return p; } }