source: SRUClient/trunk/src/main/java/eu/clarin/sru/client/fcs/ClarinFCSRecordParser.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
File size: 6.0 KB
Line 
1/**
2 * This software is copyright (c) 2012-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.fcs;
18
19import java.util.LinkedList;
20import java.util.List;
21
22import javax.xml.stream.XMLStreamException;
23import javax.xml.stream.XMLStreamReader;
24import org.slf4j.Logger;
25import org.slf4j.LoggerFactory;
26import eu.clarin.sru.client.SRUClientException;
27import eu.clarin.sru.client.SRURecordData;
28import eu.clarin.sru.client.SRURecordDataParser;
29import eu.clarin.sru.client.SRUVersion;
30import eu.clarin.sru.client.XmlStreamReaderUtils;
31
32
33/**
34 * A record parse to parse records conforming to CLARIN-FCS specification.
35 */
36public class ClarinFCSRecordParser implements SRURecordDataParser {
37    private static final Logger logger =
38            LoggerFactory.getLogger(ClarinFCSRecordParser.class);
39    private static final String FCS_NS =
40            ClarinFCSRecordData.RECORD_SCHEMA;
41    // TODO: make this configurable
42    private final DataViewParser[] parsers = new DataViewParser[] {
43            new DataViewParserGenericDOM(),
44//            new DataViewParserGenericString(),
45            new DataViewParserKWIC()
46    };
47
48
49    @Override
50    public String getRecordSchema() {
51        return ClarinFCSRecordData.RECORD_SCHEMA;
52    }
53
54
55    @Override
56    public SRURecordData parse(XMLStreamReader reader, SRUVersion version)
57            throws XMLStreamException, SRUClientException {
58        logger.debug("parsing CLARIN-FCS record");
59
60        // Resource
61        XmlStreamReaderUtils.readStart(reader, FCS_NS, "Resource", true, true);
62        String pid = XmlStreamReaderUtils.readAttributeValue(reader, null, "pid");
63        String ref = XmlStreamReaderUtils.readAttributeValue(reader, null, "ref");
64        XmlStreamReaderUtils.consumeStart(reader);
65
66        // Resource/Resource (optional)
67        if (XmlStreamReaderUtils.readStart(reader, FCS_NS, "Resource", false)) {
68            logger.info("skipping nested <Resource> element");
69            XmlStreamReaderUtils.readEnd(reader, FCS_NS, "Resource", true);
70        }
71
72        // Resource/DataView
73        final List<DataView> dataviews = parseDataViews(reader);
74
75        // Resource/ResourceFragment
76        final List<Resource.ResourceFragment> resourceFragments =
77                parseResourceFragments(reader);
78
79        XmlStreamReaderUtils.readEnd(reader, FCS_NS, "Resource", true);
80
81        return new ClarinFCSRecordData(pid, ref, dataviews, resourceFragments);
82    }
83
84
85    private List<DataView> parseDataViews(XMLStreamReader reader)
86            throws XMLStreamException, SRUClientException {
87        List<DataView> dataviews = null;
88
89        while (XmlStreamReaderUtils.readStart(reader, FCS_NS, "DataView", false, true)) {
90            String pid = XmlStreamReaderUtils.readAttributeValue(reader, null, "pid");
91            String ref = XmlStreamReaderUtils.readAttributeValue(reader, null, "ref");
92            String type = XmlStreamReaderUtils.readAttributeValue(reader, null, "type");
93            if ((type == null) || type.isEmpty()) {
94                throw new SRUClientException("element <DataView> needs a "
95                        + "non-empty 'type' attribute");
96            }
97
98            // consume start element and get rid of any whitespace
99            XmlStreamReaderUtils.consumeStart(reader);
100            XmlStreamReaderUtils.consumeWhitespace(reader);
101
102            logger.debug("processing <DataView> of type = {}", type);
103
104            DataViewParser parser = null;
105            for (int i = 0; i < parsers.length; i++) {
106                if (parsers[i].acceptType(type) &&
107                        ((parser == null) ||
108                         (parser.getPriority() < parsers[i].getPriority()))) {
109                    parser = parsers[i];
110                }
111            }
112
113            DataView dataview = null;
114            if (parser != null) {
115                dataview = parser.parse(reader, type, pid, ref);
116            } else {
117                logger.warn("no parser found for <DataView> of type = {}", type);
118            }
119
120            XmlStreamReaderUtils.readEnd(reader, FCS_NS, "DataView", true);
121
122            if (dataview != null) {
123                if (dataviews == null) {
124                    dataviews = new LinkedList<DataView>();
125                }
126                dataviews.add(dataview);
127            } else {
128                logger.warn("skipped <DataView> of type = {}", type);
129            }
130        } // while
131        return dataviews;
132    }
133
134
135    private List<Resource.ResourceFragment> parseResourceFragments(
136            XMLStreamReader reader) throws XMLStreamException,
137            SRUClientException {
138        List<Resource.ResourceFragment> resourceFragments = null;
139        while (XmlStreamReaderUtils.readStart(reader, FCS_NS, "ResourceFragment", false, true)) {
140            logger.debug("found ResourceFragment");
141            String pid = XmlStreamReaderUtils.readAttributeValue(reader, null, "pid");
142            String ref = XmlStreamReaderUtils.readAttributeValue(reader, null, "ref");
143            XmlStreamReaderUtils.consumeStart(reader);
144            final List<DataView> dataviews = parseDataViews(reader);
145            XmlStreamReaderUtils.readEnd(reader, FCS_NS, "ResourceFragment", true);
146
147            if (resourceFragments == null) {
148                resourceFragments = new LinkedList<Resource.ResourceFragment>();
149            }
150            resourceFragments.add(new Resource.ResourceFragment(pid, ref, dataviews));
151        } // while
152        return resourceFragments;
153    }
154
155} // class ClarinFCSRecordParser
Note: See TracBrowser for help on using the repository browser.