Project

General

Profile

Download (10.6 KB) Statistics
| Branch: | Tag: | Revision:
1
package org.bgbm.biovel.drf.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.bgbm.biovel.drf.client.ServiceProviderInfo;
14
import org.bgbm.biovel.drf.query.RestClient;
15
import org.bgbm.biovel.drf.tnr.msg.Classification;
16
import org.bgbm.biovel.drf.tnr.msg.Query;
17
import org.bgbm.biovel.drf.tnr.msg.Response;
18
import org.bgbm.biovel.drf.tnr.msg.Source;
19
import org.bgbm.biovel.drf.tnr.msg.Synonym;
20
import org.bgbm.biovel.drf.tnr.msg.Taxon;
21
import org.bgbm.biovel.drf.tnr.msg.TaxonName;
22
import org.bgbm.biovel.drf.tnr.msg.TnrMsg;
23
import org.bgbm.biovel.drf.utils.JSONUtils;
24
import org.bgbm.biovel.drf.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.processRESTService(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.processRESTService(namesUri);
119

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

    
125
    @Override
126
    public int getMaxPageSize() {
127
        return 10;
128
    }
129

    
130
    private void updateQueryWithResponse(Query query,
131
            String response,
132
            Map<String, String> paramMap,
133
            ServiceProviderInfo checklistInfo) throws DRFChecklistException {
134

    
135

    
136
        JSONObject jsonResponse = JSONUtils.parseJsonToObject(response);
137
        JSONArray dataArray = (JSONArray)jsonResponse.get("data");
138
        Iterator<JSONObject> itrNameMsgs = dataArray.iterator();
139

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

    
157
            }
158

    
159
            Response tnrResponse = TnrMsgUtils.tnrResponseFor(checklistInfo);
160

    
161
            URI taxonUri = queryClient.buildUriFromQuery(query, "/ws/usage/" + taxonId, null);
162
            String responseBody = queryClient.processRESTService(taxonUri);
163

    
164
            JSONObject res = JSONUtils.parseJsonToObject(responseBody);
165
            JSONObject jsonAccName = (JSONObject)res.get("data");
166
            Taxon accName = generateAccName(jsonAccName);
167
            tnrResponse.setTaxon(accName);
168
            if(query != null) {
169
                query.getResponse().add(tnrResponse);
170
            }
171
            JSONArray synonyms = (JSONArray) jsonAccName.get("synonyms");
172

    
173
            if(synonyms != null) {
174
                Iterator iterator = synonyms.iterator();
175
                System.out.println("Synonms");
176
                String synTaxonId = null;
177
                while (iterator.hasNext()) {
178
                    JSONObject syn = (JSONObject)iterator.next();
179
                    Number synIdNumber = (Number) syn.get("taxonID");
180
                    synTaxonId = String.valueOf(synIdNumber);
181

    
182
                    URI synonymsUri = queryClient.buildUriFromQuery(query, "/ws/usage/" + synTaxonId, null);
183
                    String synResponse = queryClient.processRESTService(synonymsUri);
184

    
185
                    JSONObject synonym = JSONUtils.parseJsonToObject(synResponse);
186
                    generateSynonyms((JSONObject)synonym.get("data"), tnrResponse);
187

    
188
                }
189
            }
190
        }
191
    }
192

    
193
    private Taxon generateAccName(JSONObject taxon) {
194
        Taxon accTaxon = new Taxon();
195
        TaxonName taxonName = new TaxonName();
196

    
197
        String resName = (String) taxon.get("scientificName");
198
        taxonName.setFullName(resName);
199

    
200
        taxonName.setCanonicalName((String) taxon.get("canonicalName"));
201

    
202
        taxonName.setRank((String) taxon.get("rank"));
203

    
204
        accTaxon.setTaxonName(taxonName);
205
        accTaxon.setTaxonomicStatus((String)taxon.get("taxonomicStatus"));
206
        accTaxon.setAccordingTo((String)taxon.get("accordingTo"));
207

    
208
        //FIXME : To fill in
209
        String sourceUrl = "";
210
        Number datasetIDNumber = (Number)taxon.get("datasetID");
211
        String sourceDatasetID = datasetIDNumber.toString();
212

    
213
        String sourceDatasetName = (String)taxon.get("datasetName");
214
        String sourceName = ""; // TODO
215

    
216
        Source source = new Source();
217
        source.setIdentifier(sourceDatasetID);
218
        source.setDatasetName(sourceDatasetName);
219
        source.setName(sourceName);
220
        source.setUrl(sourceUrl);
221
        accTaxon.getSources().add(source);
222

    
223
        Classification c = new Classification();
224
        c.setKingdom((String) taxon.get("kingdom"));
225
        c.setPhylum((String) taxon.get("phylum"));
226
        c.setClazz((String) taxon.get("class"));
227
        c.setOrder((String) taxon.get("order"));
228
        c.setFamily((String) taxon.get("family"));
229
        c.setGenus((String) taxon.get("genus"));
230
        accTaxon.setClassification(c);
231

    
232
        return accTaxon;
233
    }
234

    
235
    private void generateSynonyms(JSONObject synonym, Response tnrResponse) {
236
        Synonym syn = new Synonym();
237

    
238
        TaxonName taxonName = new TaxonName();
239

    
240
        String resName = (String) synonym.get("scientificName");
241
        taxonName.setFullName(resName);
242

    
243
        taxonName.setCanonicalName((String) synonym.get("canonicalName"));
244

    
245
        taxonName.setRank((String) synonym.get("rank"));
246

    
247
        syn.setTaxonName(taxonName);
248
        syn.setTaxonomicStatus((String) synonym.get("taxonomicStatus"));
249
        syn.setAccordingTo((String) synonym.get("accordingTo"));
250

    
251
        //FIXME : To fill in
252
        String sourceUrl = "";
253
        Number datasetIDNumber = (Number) synonym.get("datasetID");
254
        String sourceDatasetID = datasetIDNumber.toString();
255

    
256
        String sourceDatasetName = (String) synonym.get("datasetName");
257
        String sourceName = (String) synonym.get("accordingTo");		;
258

    
259
        Source source = new Source();
260
        source.setIdentifier(sourceDatasetID);
261
        source.setDatasetName(sourceDatasetName);
262
        source.setName(sourceName);
263
        source.setUrl(sourceUrl);
264
        syn.getSources().add(source);
265

    
266
        tnrResponse.getSynonym().add(syn);
267
    }
268

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

    
273
    }
274

    
275
    @Override
276
    public void resolveVernacularNamesExact(TnrMsg tnrMsg) throws DRFChecklistException {
277
        // TODO Auto-generated method stub
278

    
279
    }
280

    
281
    @Override
282
    public EnumSet<SearchMode> getSearchModes() {
283
        return SEARCH_MODES;
284
    }
285

    
286
    @Override
287
    public void resolveVernacularNamesLike(TnrMsg tnrMsg) throws DRFChecklistException {
288
        // TODO Auto-generated method stub
289

    
290
    }
291

    
292
    @Override
293
    public boolean isSupportedIdentifier(String value) {
294
        return value != null;
295
    }
296

    
297
    @Override
298
    public void findByIdentifier(TnrMsg tnrMsg) throws DRFChecklistException {
299
        // TODO Auto-generated method stub
300

    
301
    }
302

    
303

    
304
}
305

    
(6-6/12)