source: FCSSimpleEndpoint/trunk/src/main/java/eu/clarin/sru/server/fcs/FCSQueryParser.java @ 6850

Last change on this file since 6850 was 6850, checked in by Oliver Schonefeld, 9 years ago
  • add constants for FCS queryType
  • "export" some SRU queryType constants as FCS prefixed constants
  • Property svn:eol-style set to native
File size: 2.8 KB
Line 
1package eu.clarin.sru.server.fcs;
2
3import java.io.ByteArrayInputStream;
4import java.util.Arrays;
5import java.util.Collections;
6import java.util.List;
7import java.util.Map;
8
9import org.antlr.v4.runtime.ANTLRInputStream;
10import org.antlr.v4.runtime.CommonTokenStream;
11import org.antlr.v4.runtime.tree.ParseTree;
12import eu.clarin.sru.fcs.qlparser.FCSLexer;
13import eu.clarin.sru.fcs.qlparser.FCSParser;
14import eu.clarin.sru.server.SRUConstants;
15import eu.clarin.sru.server.SRUDiagnosticList;
16import eu.clarin.sru.server.SRUQuery;
17import eu.clarin.sru.server.SRUQueryBase;
18import eu.clarin.sru.server.SRUQueryParser;
19import eu.clarin.sru.server.SRUVersion;
20
21public class FCSQueryParser implements SRUQueryParser<ParseTree> {
22    private static final String PARAM_QUERY = "query";
23    private static final List<String> QUERY_PARAMETER_NAMES =
24            Collections.unmodifiableList(Arrays.asList(PARAM_QUERY));
25
26    @Override
27    public String getQueryType() {
28        return Constants.FCS_QUERY_TYPE_FCS;
29    }
30
31
32    @Override
33    public boolean supportsVersion(SRUVersion version) {
34        if (version == null) {
35            throw new NullPointerException("version == null");
36        }
37        /*
38         * CQL is supported by all SRU versions ...
39         */
40        return version.compareTo(SRUVersion.VERSION_2_0) >= 0;
41    }
42
43
44    @Override
45    public String getQueryTypeDefintion() {
46        return null;
47    }
48
49
50    @Override
51    public List<String> getQueryParameterNames() {
52        return QUERY_PARAMETER_NAMES;
53    }
54
55
56    @Override
57    public SRUQuery<ParseTree> parseQuery(SRUVersion version,
58            Map<String, String> parameters, SRUDiagnosticList diagnostics) {
59
60        final String rawQuery = parameters.get(PARAM_QUERY);
61        if (rawQuery == null) {
62            diagnostics.addDiagnostic(SRUConstants.SRU_GENERAL_SYSTEM_ERROR,
63                    null, "no query passed to query parser");
64            return null;
65        }
66
67        try {
68            ANTLRInputStream input = new ANTLRInputStream(
69                    new ByteArrayInputStream(
70                            rawQuery.getBytes("UTF-8")));
71            FCSLexer lexer = new FCSLexer(input);
72            CommonTokenStream tokens = new CommonTokenStream(lexer);
73            FCSParser parser = new FCSParser(tokens);
74            return new FCSQuery(rawQuery, parser.query());
75        } catch (Exception e) {
76            diagnostics.addDiagnostic(SRUConstants.SRU_QUERY_SYNTAX_ERROR,
77                    null, "error parsing query");
78        }
79        return null;
80    }
81
82
83    public static final class FCSQuery extends SRUQueryBase<ParseTree> {
84
85
86        private FCSQuery(String rawQuery, ParseTree parsedQuery) {
87            super(rawQuery, parsedQuery);
88        }
89
90
91        @Override
92        public String getQueryType() {
93            return Constants.FCS_QUERY_TYPE_FCS;
94        }
95    }
96
97} // class FCSQueryParser
Note: See TracBrowser for help on using the repository browser.