source: SRUClient/trunk/src/main/java/eu/clarin/sru/client/SRUExplainRecordDataParser.java @ 2936

Last change on this file since 2936 was 2936, checked in by oschonef, 11 years ago
  • add preliminary Zeerex record parser and Zeerex record data object (used in explain, still disabled)
  • make non-strict mode more forgiving
  • (preliminary) add version attribute to parse() method of record data parsers
  • Property svn:eol-style set to native
File size: 6.7 KB
Line 
1/**
2 * This software is copyright (c) 2011-2013 by
3 *  - Institut fuer Deutsche Sprache (http://www.ids-mannheim.de)
4 * This is free software. You can redistribute it
5 * and/or modify it under the terms described in
6 * the GNU General Public License v3 of which you
7 * should have received a copy. Otherwise you can download
8 * it from
9 *
10 *   http://www.gnu.org/licenses/gpl-3.0.txt
11 *
12 * @copyright Institut fuer Deutsche Sprache (http://www.ids-mannheim.de)
13 *
14 * @license http://www.gnu.org/licenses/gpl-3.0.txt
15 *  GNU General Public License v3
16 */
17package eu.clarin.sru.client;
18
19import java.util.HashSet;
20import java.util.Set;
21
22import javax.xml.stream.XMLStreamException;
23import javax.xml.stream.XMLStreamReader;
24
25import org.slf4j.Logger;
26import org.slf4j.LoggerFactory;
27
28import eu.clarin.sru.client.SRUExplainRecordData.ServerInfo;
29
30
31/**
32 * This class implements a (partial) record data parser for SRU explain record
33 * data conforming to the ZEEREX schema
34 */
35public class SRUExplainRecordDataParser implements SRURecordDataParser {
36    private static final String ZEEREX_NS = SRUExplainRecordData.RECORD_SCHEMA;
37    private static final String VERSION_1_1     = "1.1";
38    private static final String VERSION_1_2     = "1.2";
39    private static final String TRANSPORT_HTTP  = "http";
40    private static final String TRANSPORT_HTTPS = "https";
41    private static final Logger logger =
42            LoggerFactory.getLogger(SRUExplainRecordDataParser.class);
43
44    @Override
45    public String getRecordSchema() {
46        return SRUExplainRecordData.RECORD_SCHEMA;
47    }
48
49
50    @Override
51    public SRURecordData parse(XMLStreamReader reader, SRUVersion version)
52            throws XMLStreamException, SRUClientException {
53        logger.debug("parsing explain record data for version {}", version);
54
55        // explain
56        XmlStreamReaderUtils.readStart(reader, ZEEREX_NS, "explain", true);
57
58        // explain/serverInfo
59        ServerInfo serverInfo = parseServerInfo(reader);
60
61        // explain/databaseInfo
62        if (XmlStreamReaderUtils.readStart(reader, ZEEREX_NS, "databaseInfo", false)) {
63            logger.debug("databaseInfo");
64            XmlStreamReaderUtils.readEnd(reader, ZEEREX_NS, "databaseInfo", true);
65        }
66
67        // explain/metaInfo
68        if (XmlStreamReaderUtils.readStart(reader, ZEEREX_NS, "metaInfo", false)) {
69            logger.debug("metaInfo");
70            XmlStreamReaderUtils.readEnd(reader, ZEEREX_NS, "metaInfo", true);
71        }
72
73        // explain/indexInfo
74        while (XmlStreamReaderUtils.readStart(reader, ZEEREX_NS, "indexInfo", false)) {
75            logger.debug("indexInfo");
76            for (;;) {
77                /*
78                 * FIXME: SRU 2.0 has *either* <set> or <index>
79                 * check with SRU 1.2 ...
80                 */
81                if (XmlStreamReaderUtils.readStart(reader, ZEEREX_NS, "set", false, true)) {
82                    logger.debug("set");
83                    // FIXME: read attributes
84                    XmlStreamReaderUtils.consumeStart(reader);
85
86                    XmlStreamReaderUtils.readEnd(reader, ZEEREX_NS, "set", true);
87                } else if (XmlStreamReaderUtils.readStart(reader, ZEEREX_NS, "index", false, true)) {
88                    logger.debug("index");
89                    // FIXME: read attributes
90                    XmlStreamReaderUtils.consumeStart(reader);
91                    XmlStreamReaderUtils.readEnd(reader, ZEEREX_NS, "index", true);
92                } else {
93                    break;
94                }
95            }
96            XmlStreamReaderUtils.readEnd(reader, ZEEREX_NS, "indexInfo", true);
97        } // while
98
99        XmlStreamReaderUtils.readEnd(reader, ZEEREX_NS, "explain", true);
100        return new SRUExplainRecordData(serverInfo);
101    }
102
103
104    private static ServerInfo parseServerInfo(XMLStreamReader reader)
105            throws XMLStreamException, SRUClientException {
106        XmlStreamReaderUtils.readStart(reader, ZEEREX_NS,
107                "serverInfo", true, true);
108        String protocol = XmlStreamReaderUtils.readAttributeValue(reader,
109                null, "protocol");
110
111        SRUVersion version = SRUVersion.VERSION_1_2;
112        String s = XmlStreamReaderUtils.readAttributeValue(reader, null,
113                "version");
114        if (s != null) {
115            if (VERSION_1_1.equals(s)) {
116                version = SRUVersion.VERSION_1_1;
117            } else if (VERSION_1_2.equals(s)) {
118                version = SRUVersion.VERSION_1_2;
119            } else {
120                throw new SRUClientException(
121                        "invalid or unsupported version: " + s);
122            }
123        }
124
125        Set<String> transports = new HashSet<String>();
126        s = XmlStreamReaderUtils.readAttributeValue(reader,
127                null, "transport");
128        if (s != null) {
129            for (String i : s.split("\\s+")) {
130                String t = null;
131                if (TRANSPORT_HTTP.equalsIgnoreCase(i)) {
132                    t = TRANSPORT_HTTP;
133                } else if (TRANSPORT_HTTPS.equalsIgnoreCase(i)) {
134                    t = TRANSPORT_HTTPS;
135                } else {
136                    throw new SRUClientException("invalid transport: " + i);
137                }
138                if (t != null) {
139                    if (!transports.contains(t)) {
140                        transports.add(t);
141                    } else {
142                        // FIXME: error message
143                        logger.warn("transport  {} was already listed", s);
144                    }
145                }
146
147            } // for
148        } else {
149            transports.add(TRANSPORT_HTTP);
150        }
151        XmlStreamReaderUtils.consumeStart(reader);
152
153        String host = XmlStreamReaderUtils.readContent(reader, ZEEREX_NS,
154                "host", true);
155        int port = XmlStreamReaderUtils.readContent(reader, ZEEREX_NS,
156                "port", true, -1);
157        if ((port < 0) || (port > 65535)) {
158            // FIXME: error message
159            throw new SRUClientException("invalid port number (" + port + ")");
160        }
161        String database = XmlStreamReaderUtils.readContent(reader, ZEEREX_NS,
162                "database", true);
163        if (XmlStreamReaderUtils.readStart(reader, ZEEREX_NS,
164                "authentication", false)) {
165            XmlStreamReaderUtils.readEnd(reader, ZEEREX_NS,
166                    "authentication", true);
167        }
168        XmlStreamReaderUtils.readEnd(reader, ZEEREX_NS, "serverInfo", true);
169        logger.debug(
170                "serverInfo: host={}, port={}, database={}, version={}, protocol={}, transport={}",
171                new Object[] { host, port, database, version, protocol,
172                        transports });
173        return new ServerInfo(host, port, database, protocol, version,
174                transports);
175    }
176
177} // class SRUExplainRecordDataParser
Note: See TracBrowser for help on using the repository browser.