Project

General

Profile

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

    
3

    
4
import java.net.URI;
5
import java.net.URISyntaxException;
6
import java.util.EnumSet;
7
import java.util.HashMap;
8
import java.util.Iterator;
9
import java.util.Map;
10

    
11
import org.apache.http.HttpHost;
12
import org.apache.http.client.utils.URIBuilder;
13
import org.cybertaxonomy.utis.client.ServiceProviderInfo;
14
import org.cybertaxonomy.utis.query.RestClient;
15
import org.cybertaxonomy.utis.tnr.msg.Classification;
16
import org.cybertaxonomy.utis.tnr.msg.Query;
17
import org.cybertaxonomy.utis.tnr.msg.Response;
18
import org.cybertaxonomy.utis.tnr.msg.Source;
19
import org.cybertaxonomy.utis.tnr.msg.Synonym;
20
import org.cybertaxonomy.utis.tnr.msg.Taxon;
21
import org.cybertaxonomy.utis.tnr.msg.TaxonName;
22
import org.cybertaxonomy.utis.tnr.msg.TnrMsg;
23
import org.cybertaxonomy.utis.utils.JSONUtils;
24
import org.cybertaxonomy.utis.utils.TnrMsgUtils;
25
import org.json.simple.JSONArray;
26
import org.json.simple.JSONObject;
27

    
28
public class GBIFBackboneClient extends AggregateChecklistClient<RestClient> {
29

    
30
    /**
31
     *
32
     */
33
    private static final HttpHost HTTP_HOST = new HttpHost("api.gbif.org",80);
34
    public static final String ID = "gbif";
35
    public static final String LABEL = "GBIF Checklist Bank";
36
    public static final String URL = "http://uat.gbif.org/developer/species";
37
    public static final String DATA_AGR_URL = "http://data.gbif.org/tutorial/datauseagreement";
38
    private static final String MAX_PAGING_LIMIT = "1000";
39
    private static final String VERSION = "v1";
40
    public static final ServiceProviderInfo CINFO = new ServiceProviderInfo(ID,LABEL,ServiceProviderInfo.DEFAULT_SEARCH_MODE,URL,DATA_AGR_URL, VERSION);
41

    
42
    public static final EnumSet<SearchMode> SEARCH_MODES = EnumSet.of(SearchMode.scientificNameExact);
43

    
44
    public GBIFBackboneClient() {
45
        super();
46
    }
47

    
48
    public GBIFBackboneClient(String checklistInfoJson) throws DRFChecklistException {
49
        super(checklistInfoJson);
50
    }
51

    
52
    public GBIFBackboneClient(ServiceProviderInfo spInfo) throws DRFChecklistException {
53
        super(spInfo);
54
    }
55

    
56
    @Override
57
    public void initQueryClient() {
58
        queryClient = new RestClient(HTTP_HOST);
59
    }
60

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

    
69
    @Override
70
    public ServiceProviderInfo buildServiceProviderInfo() {
71
        ServiceProviderInfo checklistInfo = CINFO;
72
        int offset = 0;
73

    
74
        URIBuilder uriBuilder = new URIBuilder();
75
        uriBuilder.setScheme("http");
76
        uriBuilder.setHost(HTTP_HOST.getHostName());
77
        uriBuilder.setPath("/" + checklistInfo.getVersion() + "/dataset/search");
78
        uriBuilder.setParameter("type", "CHECKLIST");
79
        uriBuilder.setParameter("limit", MAX_PAGING_LIMIT);
80
        uriBuilder.setParameter("offset", "0");
81
        URI uri;
82
        boolean endOfRecords = false;
83
        try {
84
            do {
85
                uriBuilder.setParameter("offset", Integer.toString(offset));
86
                uri = uriBuilder.build();
87
                logger.debug("building Checklist Map");
88
                String responseBody = queryClient.get(uri);
89

    
90
                JSONObject jsonResponse = JSONUtils.parseJsonToObject(responseBody);
91
                JSONArray results = (JSONArray) jsonResponse.get("results");
92
                Iterator<JSONObject> itrResults = results.iterator();
93
                while(itrResults.hasNext()) {
94
                    JSONObject result = itrResults.next();
95
                    String key = (String)result.get("key");
96
                    String title = (String)result.get("title");
97

    
98
                    String url =  "http://uat.gbif.org/dataset/" + key;
99
                    checklistInfo.addSubChecklist(new ServiceProviderInfo(key, title,  url, DATA_AGR_URL, getSearchModes()));
100
                }
101

    
102
                endOfRecords = (Boolean) jsonResponse.get("endOfRecords");
103

    
104
                offset = offset + Integer.parseInt(MAX_PAGING_LIMIT);
105
            } while(!endOfRecords);
106
        } catch (URISyntaxException e) {
107
            // TODO Auto-generated catch block
108
            e.printStackTrace();
109
            // FIXME : We should process the exceptions and if we can't do nothing with them pass to the next level
110
        } catch (DRFChecklistException e) {
111
            // TODO Auto-generated catch block
112
            e.printStackTrace();
113
            // FIXME : We should process the exceptions and if we can't do nothing with them pass to the next level
114
        }
115

    
116
        return checklistInfo;
117
    }
118

    
119

    
120

    
121
    @Override
122
    public void resolveScientificNamesExact(TnrMsg tnrMsg) throws DRFChecklistException {
123

    
124
        Query query = singleQueryFrom(tnrMsg);
125

    
126
        Iterator<ServiceProviderInfo> itrKeys = getServiceProviderInfo().getSubChecklists().iterator();
127
        //http://api.gbif.org/name_usage?q=Abies%20alba&datasetKey=fab88965-e69d-4491-a04d-e3198b626e52
128
        while(itrKeys.hasNext()) {
129
            ServiceProviderInfo checklistInfo = itrKeys.next();
130
            Map<String, String> paramMap = new HashMap<String, String>();
131
            paramMap.put("datasetKey", checklistInfo.getId());
132
            paramMap.put("limit", MAX_PAGING_LIMIT);
133

    
134
            URI namesUri = queryClient.buildUriFromQuery(query, "/" + CINFO.getVersion() + "/species",	"name", paramMap);
135

    
136
            String responseBody = queryClient.get(namesUri);
137

    
138
            updateQueryWithResponse(query,responseBody, paramMap, checklistInfo);
139
        }
140
    }
141

    
142
    private void updateQueryWithResponse(Query query ,
143
            String response,
144
            Map<String, String> paramMap,
145
            ServiceProviderInfo ci) throws DRFChecklistException {
146

    
147
        JSONObject jsonResponse = JSONUtils.parseJsonToObject(response);
148
        JSONArray results = (JSONArray) jsonResponse.get("results");
149

    
150
        if(results != null) {
151
            String accTaxonId = "";
152
            Iterator<JSONObject> resIterator = results.iterator();
153
            while (resIterator.hasNext()) {
154
                JSONObject res = resIterator.next();
155
                Number acceptedKey = (Number)res.get("acceptedKey");
156
                boolean synonym = (Boolean)res.get("synonym");
157

    
158
                Response tnrResponse = TnrMsgUtils.tnrResponseFor(ci);
159

    
160
                // case when accepted name
161
                if(!synonym && (acceptedKey == null)) {
162
                    Long key = (Long)res.get("key");
163
                    accTaxonId = key.toString();
164

    
165
                    Taxon accName = generateAccName(res);
166
                    tnrResponse.setTaxon(accName);
167

    
168
                } else
169
                // case when synonym
170
                if(synonym && (acceptedKey != null)) {
171
                    Long key = (Long)res.get("acceptedKey");
172
                    accTaxonId = key.toString();
173

    
174
                    URI taxonUri = queryClient.buildUriFromQuery(query, "/" + CINFO.getVersion() + "/species/" + accTaxonId, null);
175
                    String responseBody = queryClient.get(taxonUri);
176

    
177
                    JSONObject taxon = JSONUtils.parseJsonToObject(responseBody);
178
                    Taxon accName = generateAccName(taxon);
179
                    tnrResponse.setTaxon(accName);
180

    
181
                } else {
182
                    throw new DRFChecklistException("Name is neither accepted nor a synonym");
183
                }
184

    
185

    
186
                if(query != null) {
187
                    query.getResponse().add(tnrResponse);
188
                }
189
                int offset = 0;
190
                paramMap.put("limit", MAX_PAGING_LIMIT);
191

    
192
                boolean endOfRecords = false;
193

    
194
                do {
195
                    paramMap.put("offset", Integer.toString(offset));
196

    
197
                    URI synonymsUri = queryClient.buildUriFromQuery(query, "/" + CINFO.getVersion() + "/species/" + accTaxonId + "/synonyms", paramMap);
198
                    String synResponse = queryClient.get(synonymsUri);
199

    
200
                    JSONObject pagedSynonyms = JSONUtils.parseJsonToObject(synResponse);
201
                    generateSynonyms(pagedSynonyms, tnrResponse);
202

    
203
                    endOfRecords = (Boolean) pagedSynonyms.get("endOfRecords");
204

    
205
                    offset = offset + Integer.parseInt(MAX_PAGING_LIMIT);
206
                } while(!endOfRecords);
207
            }
208
        }
209
    }
210

    
211
    private Taxon generateAccName(JSONObject taxon) {
212
        Taxon accTaxon = new Taxon();
213
        TaxonName taxonName = new TaxonName();
214

    
215
        String resName = (String) taxon.get("scientificName");
216
        taxonName.setFullName(resName);
217

    
218
        taxonName.setCanonicalName((String) taxon.get("canonicalName"));
219

    
220
        taxonName.setRank((String) taxon.get("rank"));
221

    
222
        taxonName.setAuthorship((String) taxon.get("authorship"));
223

    
224
        accTaxon.setTaxonName(taxonName);
225
        accTaxon.setTaxonomicStatus((String)taxon.get("taxonomicStatus"));
226
        accTaxon.setAccordingTo((String) taxon.get("accordingTo"));
227

    
228
        Long key = (Long)taxon.get("key");
229
        String taxonId = key.toString();
230
        accTaxon.setUrl("http://uat.gbif.org/species/" + taxonId);
231

    
232

    
233
        //FIXME : To fill in
234
        String sourceUrl = "http://uat.gbif.org/species/" + taxonId;
235
        String sourceDatasetID = "";
236
        String sourceDatasetName = "";
237
        String sourceName = "";
238

    
239
        Source source = new Source();
240
        source.setIdentifier(sourceDatasetID);
241
        source.setDatasetName(sourceDatasetName);
242
        source.setName(sourceName);
243
        source.setUrl(sourceUrl);
244
        accTaxon.getSources().add(source);
245

    
246
        Classification c = new Classification();
247
        c.setKingdom((String) taxon.get("kingdom"));
248
        c.setPhylum((String) taxon.get("phylum"));
249
        c.setClazz((String) taxon.get("clazz"));
250
        c.setOrder((String) taxon.get("order"));
251
        c.setFamily((String) taxon.get("family"));
252
        c.setGenus((String) taxon.get("genus"));
253
        accTaxon.setClassification(c);
254

    
255
        return accTaxon;
256
    }
257

    
258
    private void generateSynonyms(JSONObject pagedSynonyms, Response tnrResponse) {
259

    
260

    
261
        JSONArray synonyms = (JSONArray)pagedSynonyms.get("results");
262
        Iterator<JSONObject> itrSynonyms = synonyms.iterator();
263
        while(itrSynonyms.hasNext()) {
264
            Synonym synonym = new Synonym();
265
            JSONObject synonymjs = itrSynonyms.next();
266
            TaxonName taxonName = new TaxonName();
267

    
268
            String resName = (String) synonymjs.get("scientificName");
269
            taxonName.setFullName(resName);
270

    
271
            taxonName.setCanonicalName((String) synonymjs.get("canonicalName"));
272

    
273
            taxonName.setRank((String) synonymjs.get("rank"));
274
            taxonName.setAuthorship((String) synonymjs.get("authorship"));
275

    
276
            synonym.setTaxonName(taxonName);
277
            synonym.setTaxonomicStatus((String)synonymjs.get("taxonomicStatus"));
278
            synonym.setAccordingTo((String) synonymjs.get("accordingTo"));
279

    
280
            Long key = (Long)synonymjs.get("key");
281
            String synId = key.toString();
282
            synonym.setUrl("http://uat.gbif.org/species/" + synId);
283

    
284
            //FIXME : To fill in
285
            String sourceUrl = "http://uat.gbif.org/species/" + synId;
286
            String sourceDatasetID =  "";
287
            String sourceDatasetName = "";
288
            String sourceName = "";
289

    
290
            Source source = new Source();
291
            source.setIdentifier(sourceDatasetID);
292
            source.setDatasetName(sourceDatasetName);
293
            source.setName(sourceName);
294
            source.setUrl(sourceUrl);
295
            synonym.getSources().add(source);
296

    
297
            tnrResponse.getSynonym().add(synonym);
298
        }
299
    }
300

    
301
    private String getDatasetNameById(String datasetKey) throws DRFChecklistException {
302
        try{
303
            //Add a comment to this line
304
            URIBuilder uriBuilder = new URIBuilder();
305
            uriBuilder.setScheme("http");
306
            uriBuilder.setHost(HTTP_HOST.getHostName());
307
            uriBuilder.setPath("/" + CINFO.getVersion() + "/dataset/" + datasetKey);
308

    
309
            URI uri = uriBuilder.build();
310
            String responseBody = queryClient.get(uri);
311

    
312
            JSONObject datasetInfo = JSONUtils.parseJsonToObject(responseBody);
313

    
314
            return  (String) datasetInfo.get("title");
315
        }
316
        catch(URISyntaxException e){
317
            throw new DRFChecklistException(e);
318
        }
319
    }
320

    
321
    @Override
322
    public void resolveScientificNamesLike(TnrMsg tnrMsg) throws DRFChecklistException {
323
        // TODO Auto-generated method stub
324

    
325
    }
326

    
327
    @Override
328
    public void resolveVernacularNamesExact(TnrMsg tnrMsg) throws DRFChecklistException {
329
        // TODO Auto-generated method stub
330

    
331
    }
332

    
333
    @Override
334
    public EnumSet<SearchMode> getSearchModes() {
335
        return SEARCH_MODES;
336
    }
337

    
338
    @Override
339
    public void resolveVernacularNamesLike(TnrMsg tnrMsg) throws DRFChecklistException {
340
        // TODO Auto-generated method stub
341

    
342
    }
343

    
344
    @Override
345
    public boolean isSupportedIdentifier(String value) {
346
        return value != null;
347
    }
348

    
349
    @Override
350
    public void findByIdentifier(TnrMsg tnrMsg) throws DRFChecklistException {
351
        // TODO Auto-generated method stub
352

    
353
    }
354

    
355

    
356
}
(6-6/13)