/** * */ package querqy.rewrite.commonrules; import java.io.BufferedReader; import java.io.IOException; import java.io.Reader; import querqy.parser.QuerqyParserFactory; import querqy.rewrite.commonrules.model.Input; import querqy.rewrite.commonrules.model.Instruction; import querqy.rewrite.commonrules.model.Instructions; import querqy.rewrite.commonrules.model.RulesCollection; import querqy.rewrite.commonrules.model.RulesCollectionBuilder; import querqy.rewrite.commonrules.model.TrieMapRulesCollectionBuilder; /** * This parser reads a set of rules in the Common Rules format and creates a {@link RulesCollection}. * * @author rene * */ public class SimpleCommonRulesParser { static final String EMPTY = "".intern(); static final String ARROW_OP = "=>"; final BufferedReader reader; final QuerqyParserFactory querqyParserFactory; int lineNumber = 0; final RulesCollectionBuilder builder; Input input = null; Instructions instructions = null; public SimpleCommonRulesParser(Reader in, QuerqyParserFactory querqyParserFactory, boolean ignoreCase) { this.reader = new BufferedReader(in); this.querqyParserFactory = querqyParserFactory; builder = new TrieMapRulesCollectionBuilder(ignoreCase); // instructions = new Instructions(); } public RulesCollection parse() throws IOException, RuleParseException { try { lineNumber = 0; String line; while ((line = reader.readLine()) != null) { lineNumber++; nextLine(line); } putRule(); return builder.build(); } finally { try { reader.close(); } catch (Exception e) { // TODO: log } } } public void putRule() throws RuleParseException { if (input != null) { if (instructions.isEmpty()) { throw new RuleParseException(lineNumber, "Instruction expected"); } builder.addRule(input, instructions); input = null; // instructions = new Instructions(); } } public void nextLine(String line) throws RuleParseException { line = stripLine(line); if (line.length() > 0) { Object lineObject = LineParser.parse(line, input, querqyParserFactory); if (lineObject instanceof Input) { putRule(); input = (Input) lineObject; instructions = new Instructions(); } else if (lineObject instanceof ValidationError) { throw new RuleParseException(lineNumber, ((ValidationError) lineObject).getMessage()); } else { instructions.add((Instruction) lineObject); } } } public String stripLine(String line) { line = line.trim(); if (line.length() > 0) { int pos = line.indexOf('#'); if (pos == 0) { return EMPTY; } if (pos > 0) { line = line.substring(0, pos); } } return line; } }