Changeset 6858 for FCSSimpleEndpoint


Ignore:
Timestamp:
11/30/15 16:13:27 (8 years ago)
Author:
Oliver Schonefeld
Message:
  • check for parsing errors (oops)
  • collect parsing errors and add appropriate FCS diagnostics
File:
1 edited

Legend:

Unmodified
Added
Removed
  • FCSSimpleEndpoint/trunk/src/main/java/eu/clarin/sru/server/fcs/FCSQueryParser.java

    r6856 r6858  
    11package eu.clarin.sru.server.fcs;
    22
    3 import java.io.ByteArrayInputStream;
     3import java.util.ArrayList;
    44import java.util.Arrays;
    55import java.util.Collections;
     
    88
    99import org.antlr.v4.runtime.ANTLRInputStream;
     10import org.antlr.v4.runtime.BaseErrorListener;
    1011import org.antlr.v4.runtime.CommonTokenStream;
     12import org.antlr.v4.runtime.RecognitionException;
     13import org.antlr.v4.runtime.Recognizer;
    1114import org.antlr.v4.runtime.tree.ParseTree;
    1215import eu.clarin.sru.fcs.qlparser.FCSLexer;
     
    5760    public SRUQuery<ParseTree> parseQuery(SRUVersion version,
    5861            Map<String, String> parameters, SRUDiagnosticList diagnostics) {
     62        FCSQuery result = null;
    5963
    6064        final String rawQuery = parameters.get(PARAM_QUERY);
     
    6569        }
    6670
     71        ParseErrorListener errorListener = new ParseErrorListener();
    6772        try {
    68             ANTLRInputStream input = new ANTLRInputStream(
    69                     new ByteArrayInputStream(
    70                             rawQuery.getBytes("UTF-8")));
     73            ANTLRInputStream input = new ANTLRInputStream(rawQuery);
    7174            FCSLexer lexer = new FCSLexer(input);
    7275            CommonTokenStream tokens = new CommonTokenStream(lexer);
    7376            FCSParser parser = new FCSParser(tokens);
    74             return new FCSQuery(rawQuery, parser, parser.query());
     77            /*
     78             * clear (possible) default error listeners and set our own!
     79             */
     80            lexer.removeErrorListeners();
     81            lexer.addErrorListener(errorListener);
     82            parser.removeErrorListeners();
     83            parser.addErrorListener(errorListener);
     84
     85            /*
     86             * other Lexer/Parser configuration ...
     87             */
     88            parser.setTrimParseTree(true);
     89
     90            /*
     91             * commence parsing ...
     92             */
     93            ParseTree tree = parser.query();
     94
     95            if (!errorListener.hasErrors() &&
     96                    (parser.getNumberOfSyntaxErrors() == 0)) {
     97                result = new FCSQuery(rawQuery, parser, tree);
     98            } else {
     99                if (errorListener.hasErrors()) {
     100                    for (String error : errorListener.getErrors()) {
     101                        diagnostics.addDiagnostic(
     102                                Constants.FCS_DIAGNOSTIC_GENERAL_QUERY_SYNTAX_ERROR,
     103                                null, error);
     104                    }
     105                } else {
     106                    diagnostics.addDiagnostic(
     107                            Constants.FCS_DIAGNOSTIC_GENERAL_QUERY_SYNTAX_ERROR,
     108                            null, "Query could not be parsed.");
     109                }
     110            }
    75111        } catch (Exception e) {
    76             diagnostics.addDiagnostic(SRUConstants.SRU_QUERY_SYNTAX_ERROR,
    77                     null, "error parsing query");
     112            diagnostics.addDiagnostic(SRUConstants.SRU_GENERAL_SYSTEM_ERROR,
     113                    null, "Unexpected error while parsing query.");
    78114        }
    79         return null;
     115        return result;
    80116    }
    81117
     
    84120        private final FCSParser parser;
    85121
    86         private FCSQuery(String rawQuery, FCSParser parser, ParseTree parsedQuery) {
     122        private FCSQuery(String rawQuery,
     123                FCSParser parser,
     124                ParseTree parsedQuery) {
    87125            super(rawQuery, parsedQuery);
    88126            this.parser = parser;
     
    107145    }
    108146
     147
     148    private static final class ParseErrorListener extends BaseErrorListener {
     149        private List<String> errors = null;
     150
     151
     152        @Override
     153        public void syntaxError(Recognizer<?, ?> recognizer,
     154                Object offendingSymbol, int line, int charPositionInLine,
     155                String msg, RecognitionException e) {
     156            if (errors == null) {
     157                errors = new ArrayList<String>();
     158            }
     159            errors.add(msg);
     160        }
     161
     162
     163        public boolean hasErrors() {
     164            return (errors != null) && !errors.isEmpty();
     165        }
     166
     167
     168        public List<String> getErrors() {
     169            return errors;
     170        }
     171    }
     172
    109173} // class FCSQueryParser
Note: See TracChangeset for help on using the changeset viewer.