source: SRUClient/trunk/src/main/java/eu/clarin/sru/client/fcs/ClarinFCSRecordParser.java @ 2467

Last change on this file since 2467 was 2467, checked in by oschonef, 11 years ago
  • (re-factor) rename package from "eu.clarin.sru.fcs" to "eu.clarin.sru.client.fcs"

HEADS UP: This breaks existing code! Please update your sources accordingly.

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