Project

General

Profile

Download (10.5 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 GBIFBetaBackboneClient extends AggregateChecklistClient<RestClient> {
29

    
30
    /**
31
     *
32
     */
33
    private static final HttpHost HTTP_HOST = new HttpHost("ecat-dev.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://ecat-dev.gbif.org/";
37
    public static final String DATA_AGR_URL = "http://data.gbif.org/tutorial/datauseagreement";
38

    
39
    public static final EnumSet<SearchMode> SEARCH_MODES = EnumSet.of(SearchMode.scientificNameExact);
40

    
41

    
42
    public GBIFBetaBackboneClient() {
43
        super();
44
    }
45

    
46
    public GBIFBetaBackboneClient(String checklistInfoJson) throws DRFChecklistException {
47
        super(checklistInfoJson);
48
    }
49

    
50

    
51
    /**
52
     * {@inheritDoc}
53
     */
54
    @Override
55
    public void initQueryClient() {
56
        queryClient = new RestClient(HTTP_HOST);
57

    
58
    }
59

    
60
    @Override
61
    public ServiceProviderInfo buildServiceProviderInfo()  {
62
        ServiceProviderInfo checklistInfo = new ServiceProviderInfo(ID,LABEL,URL,DATA_AGR_URL, getSearchModes());
63

    
64
        URIBuilder uriBuilder = new URIBuilder();
65
        uriBuilder.setScheme("http");
66
        uriBuilder.setHost(HTTP_HOST.getHostName());
67
        uriBuilder.setPath("/ws/checklist");
68
        URI uri;
69

    
70
        try {
71
            uri = uriBuilder.build();
72
            System.out.println("buildChecklistMap");
73
            String responseBody = queryClient.get(uri);
74

    
75
            JSONObject jsonResponse = JSONUtils.parseJsonToObject(responseBody);
76
            JSONArray data = (JSONArray) jsonResponse.get("data");
77
            Iterator<JSONObject> itrResults = data.iterator();
78
            while(itrResults.hasNext()) {
79
                JSONObject result = itrResults.next();
80
                String key = ((Long)result.get("datasetID")).toString();
81
                String title = (String)result.get("title");
82
                String url =  "http://ecat-dev.gbif.org/checklist/" + key;
83
                checklistInfo.addSubChecklist(new ServiceProviderInfo(key, title,  url, DATA_AGR_URL, getSearchModes()));
84
            }
85

    
86
        } catch (URISyntaxException e) {
87
            // TODO Auto-generated catch block
88
            e.printStackTrace();
89
        } catch (DRFChecklistException e) {
90
            // TODO Auto-generated catch block
91
            e.printStackTrace();
92
        }
93
        return checklistInfo;
94
    }
95

    
96

    
97

    
98
    @Override
99
    public void resolveScientificNamesExact(TnrMsg tnrMsg) throws DRFChecklistException {
100

    
101
        Query query = singleQueryFrom(tnrMsg);
102

    
103
        Iterator<ServiceProviderInfo> itrKeys = getServiceProviderInfo().getSubChecklists().iterator();
104
        //http://ecat-dev.gbif.org/ws/usage/?rkey={datasetID}&q={sciName}&pagesize=100&searchType=canonical
105
        while(itrKeys.hasNext()) {
106
            ServiceProviderInfo checklistInfo = itrKeys.next();
107
            //if(checklistInfo.getUse()) {
108
                Map<String, String> paramMap = new HashMap<String, String>();
109
                paramMap.put("rKey", checklistInfo.getId());
110
                paramMap.put("pageSize", "100");
111
                paramMap.put("searchType", "canonical");
112

    
113
                URI namesUri = queryClient.buildUriFromQuery(query,
114
                        "/ws/usage",
115
                        "q",
116
                        paramMap);
117

    
118
                String responseBody = queryClient.get(namesUri);
119

    
120
                updateQueryWithResponse(query,responseBody, paramMap, checklistInfo);
121
            //}
122
        }
123
    }
124

    
125
    private void updateQueryWithResponse(Query query,
126
            String response,
127
            Map<String, String> paramMap,
128
            ServiceProviderInfo checklistInfo) throws DRFChecklistException {
129

    
130

    
131
        JSONObject jsonResponse = JSONUtils.parseJsonToObject(response);
132
        JSONArray dataArray = (JSONArray)jsonResponse.get("data");
133
        Iterator<JSONObject> itrNameMsgs = dataArray.iterator();
134

    
135
        String taxonId = null;
136
        while (itrNameMsgs.hasNext()) {
137
            JSONObject data = itrNameMsgs.next();
138
            Boolean isSynonym = (Boolean)data.get("isSynonym");
139
            String taxonomicStatus = (String)data.get("taxonomicStatus");
140
            String rank = (String)data.get("rank");
141
            if(rank == null || isSynonym == null){
142
                continue;
143
            }
144
            if(!isSynonym.booleanValue() ||  (taxonomicStatus != null && taxonomicStatus.equals("Accepted"))) {
145
                Number taxonIDNumber = (Number)data.get("taxonID");
146
                taxonId = taxonIDNumber.toString();
147
            }
148
            if(isSynonym.booleanValue()) {
149
                Number taxonIDNumber = (Number)data.get("higherTaxonID");
150
                taxonId = taxonIDNumber.toString();
151

    
152
            }
153

    
154
            Response tnrResponse = TnrMsgUtils.tnrResponseFor(checklistInfo);
155

    
156
            URI taxonUri = queryClient.buildUriFromQuery(query, "/ws/usage/" + taxonId, null);
157
            String responseBody = queryClient.get(taxonUri);
158

    
159
            JSONObject res = JSONUtils.parseJsonToObject(responseBody);
160
            JSONObject jsonAccName = (JSONObject)res.get("data");
161
            Taxon accName = generateAccName(jsonAccName);
162
            tnrResponse.setTaxon(accName);
163
            if(query != null) {
164
                query.getResponse().add(tnrResponse);
165
            }
166
            JSONArray synonyms = (JSONArray) jsonAccName.get("synonyms");
167

    
168
            if(synonyms != null) {
169
                Iterator iterator = synonyms.iterator();
170
                System.out.println("Synonms");
171
                String synTaxonId = null;
172
                while (iterator.hasNext()) {
173
                    JSONObject syn = (JSONObject)iterator.next();
174
                    Number synIdNumber = (Number) syn.get("taxonID");
175
                    synTaxonId = String.valueOf(synIdNumber);
176

    
177
                    URI synonymsUri = queryClient.buildUriFromQuery(query, "/ws/usage/" + synTaxonId, null);
178
                    String synResponse = queryClient.get(synonymsUri);
179

    
180
                    JSONObject synonym = JSONUtils.parseJsonToObject(synResponse);
181
                    generateSynonyms((JSONObject)synonym.get("data"), tnrResponse);
182

    
183
                }
184
            }
185
        }
186
    }
187

    
188
    private Taxon generateAccName(JSONObject taxon) {
189
        Taxon accTaxon = new Taxon();
190
        TaxonName taxonName = new TaxonName();
191

    
192
        String resName = (String) taxon.get("scientificName");
193
        taxonName.setFullName(resName);
194

    
195
        taxonName.setCanonicalName((String) taxon.get("canonicalName"));
196

    
197
        taxonName.setRank((String) taxon.get("rank"));
198

    
199
        accTaxon.setTaxonName(taxonName);
200
        accTaxon.setTaxonomicStatus((String)taxon.get("taxonomicStatus"));
201
        accTaxon.setAccordingTo((String)taxon.get("accordingTo"));
202

    
203
        //FIXME : To fill in
204
        String sourceUrl = "";
205
        Number datasetIDNumber = (Number)taxon.get("datasetID");
206
        String sourceDatasetID = datasetIDNumber.toString();
207

    
208
        String sourceDatasetName = (String)taxon.get("datasetName");
209
        String sourceName = ""; // TODO
210

    
211
        Source source = new Source();
212
        source.setIdentifier(sourceDatasetID);
213
        source.setDatasetName(sourceDatasetName);
214
        source.setName(sourceName);
215
        source.setUrl(sourceUrl);
216
        accTaxon.getSources().add(source);
217

    
218
        Classification c = new Classification();
219
        c.setKingdom((String) taxon.get("kingdom"));
220
        c.setPhylum((String) taxon.get("phylum"));
221
        c.setClazz((String) taxon.get("class"));
222
        c.setOrder((String) taxon.get("order"));
223
        c.setFamily((String) taxon.get("family"));
224
        c.setGenus((String) taxon.get("genus"));
225
        accTaxon.setClassification(c);
226

    
227
        return accTaxon;
228
    }
229

    
230
    private void generateSynonyms(JSONObject synonym, Response tnrResponse) {
231
        Synonym syn = new Synonym();
232

    
233
        TaxonName taxonName = new TaxonName();
234

    
235
        String resName = (String) synonym.get("scientificName");
236
        taxonName.setFullName(resName);
237

    
238
        taxonName.setCanonicalName((String) synonym.get("canonicalName"));
239

    
240
        taxonName.setRank((String) synonym.get("rank"));
241

    
242
        syn.setTaxonName(taxonName);
243
        syn.setTaxonomicStatus((String) synonym.get("taxonomicStatus"));
244
        syn.setAccordingTo((String) synonym.get("accordingTo"));
245

    
246
        //FIXME : To fill in
247
        String sourceUrl = "";
248
        Number datasetIDNumber = (Number) synonym.get("datasetID");
249
        String sourceDatasetID = datasetIDNumber.toString();
250

    
251
        String sourceDatasetName = (String) synonym.get("datasetName");
252
        String sourceName = (String) synonym.get("accordingTo");		;
253

    
254
        Source source = new Source();
255
        source.setIdentifier(sourceDatasetID);
256
        source.setDatasetName(sourceDatasetName);
257
        source.setName(sourceName);
258
        source.setUrl(sourceUrl);
259
        syn.getSources().add(source);
260

    
261
        tnrResponse.getSynonym().add(syn);
262
    }
263

    
264
    @Override
265
    public void resolveScientificNamesLike(TnrMsg tnrMsg) throws DRFChecklistException {
266
        // TODO Auto-generated method stub
267

    
268
    }
269

    
270
    @Override
271
    public void resolveVernacularNamesExact(TnrMsg tnrMsg) throws DRFChecklistException {
272
        // TODO Auto-generated method stub
273

    
274
    }
275

    
276
    @Override
277
    public EnumSet<SearchMode> getSearchModes() {
278
        return SEARCH_MODES;
279
    }
280

    
281
    @Override
282
    public void resolveVernacularNamesLike(TnrMsg tnrMsg) throws DRFChecklistException {
283
        // TODO Auto-generated method stub
284

    
285
    }
286

    
287
    @Override
288
    public boolean isSupportedIdentifier(String value) {
289
        return value != null;
290
    }
291

    
292
    @Override
293
    public void findByIdentifier(TnrMsg tnrMsg) throws DRFChecklistException {
294
        // TODO Auto-generated method stub
295

    
296
    }
297

    
298

    
299
}
300

    
(7-7/12)