Changeset 6858 for FCSSimpleEndpoint
- Timestamp:
- 11/30/15 16:13:27 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
FCSSimpleEndpoint/trunk/src/main/java/eu/clarin/sru/server/fcs/FCSQueryParser.java
r6856 r6858 1 1 package eu.clarin.sru.server.fcs; 2 2 3 import java. io.ByteArrayInputStream;3 import java.util.ArrayList; 4 4 import java.util.Arrays; 5 5 import java.util.Collections; … … 8 8 9 9 import org.antlr.v4.runtime.ANTLRInputStream; 10 import org.antlr.v4.runtime.BaseErrorListener; 10 11 import org.antlr.v4.runtime.CommonTokenStream; 12 import org.antlr.v4.runtime.RecognitionException; 13 import org.antlr.v4.runtime.Recognizer; 11 14 import org.antlr.v4.runtime.tree.ParseTree; 12 15 import eu.clarin.sru.fcs.qlparser.FCSLexer; … … 57 60 public SRUQuery<ParseTree> parseQuery(SRUVersion version, 58 61 Map<String, String> parameters, SRUDiagnosticList diagnostics) { 62 FCSQuery result = null; 59 63 60 64 final String rawQuery = parameters.get(PARAM_QUERY); … … 65 69 } 66 70 71 ParseErrorListener errorListener = new ParseErrorListener(); 67 72 try { 68 ANTLRInputStream input = new ANTLRInputStream( 69 new ByteArrayInputStream( 70 rawQuery.getBytes("UTF-8"))); 73 ANTLRInputStream input = new ANTLRInputStream(rawQuery); 71 74 FCSLexer lexer = new FCSLexer(input); 72 75 CommonTokenStream tokens = new CommonTokenStream(lexer); 73 76 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 } 75 111 } 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."); 78 114 } 79 return null;115 return result; 80 116 } 81 117 … … 84 120 private final FCSParser parser; 85 121 86 private FCSQuery(String rawQuery, FCSParser parser, ParseTree parsedQuery) { 122 private FCSQuery(String rawQuery, 123 FCSParser parser, 124 ParseTree parsedQuery) { 87 125 super(rawQuery, parsedQuery); 88 126 this.parser = parser; … … 107 145 } 108 146 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 109 173 } // class FCSQueryParser
Note: See TracChangeset
for help on using the changeset viewer.