Project

General

Profile

Download (7.33 KB) Statistics
| Branch: | Tag: | Revision:
1
package org.cybertaxonomy.utis.checklist;
2

    
3

    
4
import java.io.IOException;
5
import java.io.StringReader;
6
import java.io.StringWriter;
7
import java.io.Writer;
8
import java.net.URI;
9
import java.util.EnumSet;
10
import java.util.HashMap;
11
import java.util.Map;
12

    
13
import javax.xml.bind.JAXBException;
14
import javax.xml.parsers.DocumentBuilder;
15
import javax.xml.parsers.DocumentBuilderFactory;
16
import javax.xml.parsers.ParserConfigurationException;
17
import javax.xml.transform.Source;
18
import javax.xml.transform.Transformer;
19
import javax.xml.transform.TransformerException;
20
import javax.xml.transform.TransformerFactory;
21
import javax.xml.transform.stream.StreamResult;
22
import javax.xml.transform.stream.StreamSource;
23
import javax.xml.xpath.XPathConstants;
24
import javax.xml.xpath.XPathExpression;
25
import javax.xml.xpath.XPathExpressionException;
26
import javax.xml.xpath.XPathFactory;
27

    
28
import org.apache.http.HttpHost;
29
import org.cybertaxonomy.utis.client.ServiceProviderInfo;
30
import org.cybertaxonomy.utis.query.RestClient;
31
import org.cybertaxonomy.utis.tnr.msg.Query;
32
import org.cybertaxonomy.utis.tnr.msg.Response;
33
import org.cybertaxonomy.utis.tnr.msg.TnrMsg;
34
import org.cybertaxonomy.utis.utils.BiovelUtils;
35
import org.cybertaxonomy.utis.utils.IdentifierUtils;
36
import org.cybertaxonomy.utis.utils.TnrMsgUtils;
37
import org.w3c.dom.Document;
38
import org.w3c.dom.Node;
39
import org.xml.sax.InputSource;
40
import org.xml.sax.SAXException;
41

    
42

    
43
public class Species2000ColClient extends BaseChecklistClient<RestClient> {
44

    
45
    /**
46
     *
47
     */
48
    private static final HttpHost HTTP_HOST = new HttpHost("www.catalogueoflife.org",80);
49
    public static final String ID = "species2000col";
50
    public static final String LABEL = "Species2000 - Catalogue Of Life";
51
    public static final String URL = "http://www.catalogueoflife.org";
52
    public static final String DATA_AGR_URL = "http://www.catalogueoflife.org/col/info/copyright";
53

    
54
    public static final EnumSet<SearchMode> SEARCH_MODES = EnumSet.of(SearchMode.scientificNameExact);
55

    
56

    
57
    public Species2000ColClient() {
58
        super();
59
    }
60

    
61
    /**
62
     * {@inheritDoc}
63
     */
64
    @Override
65
    public boolean isStatelessClient() {
66
        return true;
67
    }
68

    
69
    /**
70
     * {@inheritDoc}
71
     */
72
    @Override
73
    public void initQueryClient() {
74
        queryClient = new RestClient(HTTP_HOST);
75

    
76
    }
77

    
78
    @Override
79
    public ServiceProviderInfo buildServiceProviderInfo() {
80
        ServiceProviderInfo checklistInfo = new ServiceProviderInfo(ID,LABEL,URL,DATA_AGR_URL, getSearchModes());
81
        return checklistInfo;
82
    }
83

    
84

    
85
    @Override
86
    public void resolveScientificNamesExact(TnrMsg tnrMsg) throws DRFChecklistException {
87

    
88
        Query query = singleQueryFrom(tnrMsg);
89

    
90
        //http://www.catalogueoflife.org/col/webservice?response=full&name={sciName}
91

    
92

    
93
        Map<String, String> paramMap = new HashMap<String, String>();
94

    
95
        paramMap.put("response", "full");
96

    
97
        URI taxonUri = queryClient.buildUriFromQuery(query,
98
                "/col/webservice",
99
                "name",
100
                paramMap);
101

    
102
        String responseBody = queryClient.get(taxonUri);
103

    
104
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
105
        DocumentBuilder parser;
106
        try {
107
            parser = factory.newDocumentBuilder();
108

    
109
        Document doc = parser.parse(new InputSource(new StringReader(responseBody)));
110
        XPathExpression xp = XPathFactory.newInstance().newXPath().compile("/results/result[1]/name_status");
111
        Node nameStatusNode = (Node) xp.evaluate(doc, XPathConstants.NODE);
112

    
113
        if(nameStatusNode != null) {
114
            String nameStatus = nameStatusNode.getTextContent();
115
            if(nameStatus.equals("synonym")) {
116
                xp = XPathFactory.newInstance().newXPath().compile("/results/result[1]/accepted_name/id");
117
                Node synTaxonIdNode = (Node) xp.evaluate(doc, XPathConstants.NODE);
118

    
119
                if(synTaxonIdNode != null) {
120
                    String synTaxonId = synTaxonIdNode.getTextContent();
121
                    //http://www.catalogueoflife.org/col/webservice?response=full&id={sciId}
122
                    taxonUri = queryClient.buildUriFromQueryString(synTaxonId,
123
                            "/col/webservice",
124
                            "id",
125
                            paramMap);
126

    
127
                    responseBody = queryClient.get(taxonUri);
128
                } else {
129
                    responseBody = null;
130
                }
131
            }
132
        }
133

    
134
        updateQueryWithResponse(query, responseBody);
135

    
136
        } catch (ParserConfigurationException e) {
137
            // TODO Auto-generated catch block
138
            e.printStackTrace();
139

    
140
        } catch (SAXException e) {
141
            // TODO Auto-generated catch block
142
            e.printStackTrace();
143
        } catch (IOException e) {
144
            // TODO Auto-generated catch block
145
            e.printStackTrace();
146
        } catch (XPathExpressionException e) {
147
            // TODO Auto-generated catch block
148
            e.printStackTrace();
149
        }
150

    
151
    }
152

    
153
    private void updateQueryWithResponse(Query query, String colXMLResponse) {
154

    
155
        Source inSource = new StreamSource(new StringReader(colXMLResponse));
156
        Source xslSource = new StreamSource(new StringReader(BiovelUtils.getResourceAsString("/org/cybertaxonomy/utis/tnr/colres_to_synres.xsl","UTF-8")));
157

    
158
        // the factory pattern supports different XSLT processors
159
        // e.g. set the "javax.xml.transform.TransformerFactory" system property
160
        TransformerFactory tnfFact = TransformerFactory.newInstance();
161
        Transformer tnf;
162

    
163
        try {
164
            tnf = tnfFact.newTransformer(xslSource);
165

    
166
            Writer outputWriter = new StringWriter();
167

    
168
            tnf.transform(inSource, new StreamResult(outputWriter));
169

    
170
            String tnrResponseXML = outputWriter.toString();
171
            System.out.println(tnrResponseXML);
172
            Response tnrResponse = TnrMsgUtils.convertXMLToTnrResponse(tnrResponseXML);
173
            query.getResponse().add(tnrResponse);
174
        } catch (TransformerException e) {
175
            // TODO Auto-generated catch block
176
            e.printStackTrace();
177
        } catch (JAXBException e) {
178
            // TODO Auto-generated catch block
179
            e.printStackTrace();
180
        } catch (ParserConfigurationException e) {
181
            // TODO Auto-generated catch block
182
            e.printStackTrace();
183
        } catch (SAXException e) {
184
            // TODO Auto-generated catch block
185
            e.printStackTrace();
186
        } catch (IOException e) {
187
            // TODO Auto-generated catch block
188
            e.printStackTrace();
189
        }
190

    
191

    
192
    }
193

    
194
    @Override
195
    public void resolveScientificNamesLike(TnrMsg tnrMsg) throws DRFChecklistException {
196
        // TODO Auto-generated method stub
197

    
198
    }
199

    
200
    @Override
201
    public void resolveVernacularNamesExact(TnrMsg tnrMsg) throws DRFChecklistException {
202
        // TODO Auto-generated method stub
203

    
204
    }
205

    
206
    @Override
207
    public EnumSet<SearchMode> getSearchModes() {
208
        return SEARCH_MODES;
209
    }
210

    
211
    @Override
212
    public void resolveVernacularNamesLike(TnrMsg tnrMsg) throws DRFChecklistException {
213
        // TODO Auto-generated method stub
214

    
215
    }
216

    
217
    @Override
218
    public boolean isSupportedIdentifier(String value) {
219
        return IdentifierUtils.checkLSID(value);
220
    }
221

    
222
    @Override
223
    public void findByIdentifier(TnrMsg tnrMsg) throws DRFChecklistException {
224
        // TODO Auto-generated method stub
225

    
226
    }
227

    
228

    
229
}
230

    
231

    
(10-10/12)