0
|
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 }
|