source: SRUClient/tags/SRUClient-0.9.5/src/main/java/eu/clarin/sru/client/fcs/DataViewParserGenericDOM.java @ 6079

Last change on this file since 6079 was 6079, checked in by Oliver Schonefeld, 9 years ago
  • tag version 0.9.5
File size: 4.6 KB
Line 
1/**
2 * This software is copyright (c) 2012-2014 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 javax.xml.parsers.DocumentBuilder;
20import javax.xml.parsers.DocumentBuilderFactory;
21import javax.xml.parsers.ParserConfigurationException;
22import javax.xml.stream.XMLStreamException;
23import javax.xml.stream.XMLStreamReader;
24import javax.xml.transform.Transformer;
25import javax.xml.transform.TransformerConfigurationException;
26import javax.xml.transform.TransformerException;
27import javax.xml.transform.TransformerFactory;
28import javax.xml.transform.dom.DOMResult;
29import javax.xml.transform.stax.StAXSource;
30
31import org.w3c.dom.Document;
32import org.w3c.dom.NodeList;
33
34import eu.clarin.sru.client.SRUClientException;
35
36
37/**
38 * An implementation of a Data View parser that stores the content of a Data
39 * View in DOM representation.
40 *
41 * @see DataViewGenericDOM
42 */
43public class DataViewParserGenericDOM implements DataViewParser {
44    private static class TransformHelper {
45        private final DocumentBuilder builder;
46        private final Transformer transformer;
47
48
49        private TransformHelper(DocumentBuilder builder,
50                Transformer transformer) {
51            if (builder == null) {
52                throw new NullPointerException("builder == null");
53            }
54            this.builder = builder;
55            if (transformer == null) {
56                throw new NullPointerException("transformer == null");
57            }
58            this.transformer = transformer;
59        }
60
61
62        private Document transform(XMLStreamReader reader)
63                throws XMLStreamException, TransformerException {
64            // parse STAX to DOM fragment
65            Document document = builder.newDocument();
66            DOMResult result = new DOMResult(document);
67            transformer.transform(new StAXSource(reader), result);
68            return document;
69        }
70
71
72        private void reset() {
73            builder.reset();
74            transformer.reset();
75        }
76    } // private class TransformHelper
77    private final ThreadLocal<TransformHelper> transformHelper;
78
79    public DataViewParserGenericDOM() {
80        final DocumentBuilderFactory builderFactory =
81                DocumentBuilderFactory.newInstance();
82        final TransformerFactory transformerFactory =
83                TransformerFactory.newInstance();
84        this.transformHelper = new ThreadLocal<TransformHelper>() {
85            @Override
86            protected TransformHelper initialValue() {
87                try {
88                    return new TransformHelper(builderFactory.newDocumentBuilder(),
89                                   transformerFactory.newTransformer());
90                } catch (TransformerConfigurationException e) {
91                    throw new InternalError("unexpected error creating new transformer");
92                } catch (ParserConfigurationException e) {
93                    throw new InternalError("unexpected error creating new document builder");
94                }
95            }
96        };
97
98
99    }
100
101
102    @Override
103    public boolean acceptType(String type) {
104        return true;
105    }
106
107
108    @Override
109    public int getPriority() {
110        return Integer.MIN_VALUE;
111    }
112
113
114    @Override
115    public DataView parse(XMLStreamReader reader, String type, String pid,
116            String ref) throws XMLStreamException, SRUClientException {
117        final TransformHelper helper = transformHelper.get();
118        try {
119            final Document document = helper.transform(reader);
120            final NodeList children = document.getChildNodes();
121            if ((children != null) && (children.getLength() > 0)) {
122                return new DataViewGenericDOM(type, pid, ref, document);
123            } else {
124                throw new SRUClientException("element <DataView> does not "
125                        + "contain any nested elements");
126            }
127        } catch (TransformerException e) {
128            throw new SRUClientException("error while parsing dataview", e);
129        } finally {
130            helper.reset();
131        }
132    }
133
134} // class DataViewParserGenericDOM
Note: See TracBrowser for help on using the repository browser.