comparison src/de/mpiwg/anteater/species/scientific/impl/GNRDNameFinder.java @ 0:036535fcd179

anteater
author jdamerow
date Fri, 14 Sep 2012 10:30:43 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:036535fcd179
1 package de.mpiwg.anteater.species.scientific.impl;
2
3 import java.net.URI;
4
5 import javax.ws.rs.core.MediaType;
6 import javax.ws.rs.core.MultivaluedMap;
7 import javax.ws.rs.core.UriBuilder;
8
9 import com.sun.jersey.api.client.Client;
10 import com.sun.jersey.api.client.WebResource;
11 import com.sun.jersey.api.client.config.ClientConfig;
12 import com.sun.jersey.api.client.config.DefaultClientConfig;
13 import com.sun.jersey.core.util.MultivaluedMapImpl;
14
15 import de.mpiwg.anteater.logging.IAnteaterLogger;
16 import de.mpiwg.anteater.species.scientific.IScientificNamesFinder;
17 import de.mpiwg.anteater.xml.INameFinderParser;
18 import de.mpiwg.anteater.xml.impl.GNRDXMLParser;
19
20 public class GNRDNameFinder implements IScientificNamesFinder {
21
22 public static final String STATUS_WAITING = "303";
23 public static final String STATUS_DONE = "200";
24
25 public final static String COMPONENT_NAME = GNRDNameFinder.class.getSimpleName();
26
27 private IAnteaterLogger logger;
28
29 public GNRDNameFinder(IAnteaterLogger logger) {
30 this.logger = logger;
31 }
32
33 @Override
34 public String findScientificNames(String text) {
35 logger.logMessage(COMPONENT_NAME, "Asking GNRD service for names...");
36
37 ClientConfig config = new DefaultClientConfig();
38 Client client = Client.create(config);
39 WebResource service = client.resource(getBaseURI());
40
41 Client clientPollCall = Client.create(config);
42 WebResource pollService = null;
43
44 MultivaluedMap<String, String> values = new MultivaluedMapImpl();
45 values.add("text", text);
46
47 String result = service.accept(MediaType.TEXT_XML).post(String.class, values);
48
49 while (true) {
50 INameFinderParser parser = new GNRDXMLParser(result);
51 String status = parser.getStatus();
52 logger.logMessage(COMPONENT_NAME, "Polling URL: " + parser.getTokenURL());
53 logger.logMessageWithoutNewLine(COMPONENT_NAME, "Polling for results...");
54
55 if (status.trim().equals(STATUS_WAITING)) {
56 logger.logMessage("waiting 10 seconds before retry.");
57 // wait 2 sec before polling
58 try {
59 Thread.sleep(10000);
60 } catch (InterruptedException e) {
61 // TODO Auto-generated catch block
62 e.printStackTrace();
63 }
64
65 if (pollService == null) {
66 String pollURL = parser.getTokenURL();
67 pollService = clientPollCall.resource(createBaseURI(pollURL));
68 }
69
70 result = pollService.accept(MediaType.TEXT_XML).get(String.class);
71 }
72 else {
73 logger.logMessage("results received.");
74 break;
75 }
76 }
77
78 if (result == null || result.trim().isEmpty())
79 return null;
80
81 return result;
82 }
83
84 protected URI getBaseURI() {
85 return UriBuilder.fromUri("http://gnrd.globalnames.org/")
86 .path("name_finder.xml").build();
87 }
88
89 public URI createBaseURI(String uri) {
90 return UriBuilder.fromUri(uri).build();
91 }
92 }