JAL-1667 PDBe Search Interface implementation
[jalview.git] / src / jalview / ws / dbsources / PDBRestClient.java
1 package jalview.ws.dbsources;
2
3 import jalview.ws.uimodel.PDBSearchResultPojo;
4 import jalview.ws.uimodel.PDBSummaryListModel;
5
6 import java.util.Iterator;
7
8 import javax.swing.DefaultListModel;
9 import javax.ws.rs.core.MediaType;
10
11 import org.json.simple.JSONArray;
12 import org.json.simple.JSONObject;
13 import org.json.simple.parser.JSONParser;
14 import org.json.simple.parser.ParseException;
15
16 import com.sun.jersey.api.client.Client;
17 import com.sun.jersey.api.client.ClientResponse;
18 import com.sun.jersey.api.client.WebResource;
19 import com.sun.jersey.api.client.config.ClientConfig;
20 import com.sun.jersey.api.client.config.DefaultClientConfig;
21 import com.sun.jersey.api.json.JSONConfiguration;
22
23 public class PDBRestClient
24 {
25   private String pdbSearchEndpoint = "http://wwwdev.ebi.ac.uk/pdbe/search/pdb/select?";
26
27
28   public static void main(String[] args)
29   {
30     new PDBRestClient().searchResult("pfam_name", "Lipoc*");
31   }
32
33   private String executeRestSearch(String qParam,
34           String searchTerm)
35   {
36     ClientConfig clientConfig = new DefaultClientConfig();
37     clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
38             Boolean.TRUE);
39     Client client = Client.create(clientConfig);
40     WebResource webResource = client.resource(pdbSearchEndpoint)
41             .queryParam("wt", "json")
42             .queryParam("q", qParam + ":" + searchTerm);
43     ClientResponse clientResponse = webResource.accept(
44             MediaType.APPLICATION_JSON).get(ClientResponse.class);
45
46     String responseString = clientResponse.getEntity(String.class);
47     if (clientResponse.getStatus() != 200)
48     {
49       throw new RuntimeException("Failed : HTTP error code : "
50               + clientResponse.getStatus());
51     }
52     return responseString;
53   }
54
55   public PDBSearchResultPojo searchResult(String qParam,
56           String searchTerm)
57   {
58     String jsonResponseString = executeRestSearch(qParam, searchTerm);
59     PDBSearchResultPojo searchResult = new PDBSearchResultPojo();
60     DefaultListModel<PDBSummaryListModel> result = null;
61     try
62     {
63       JSONParser jsonParser = new JSONParser();
64       JSONObject jsonObj = (JSONObject) jsonParser
65               .parse(jsonResponseString);
66
67       JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
68       String queryTime = ((JSONObject) jsonObj.get("responseHeader")).get(
69               "QTime").toString();
70       int numFound = Integer
71               .valueOf(pdbResponse.get("numFound").toString());
72       if (numFound > 0)
73       {
74         result = new DefaultListModel<PDBSummaryListModel>();
75         JSONArray docs = (JSONArray) pdbResponse.get("docs");
76         for (Iterator<JSONObject> docIter = docs.iterator(); docIter
77                 .hasNext();)
78         {
79           JSONObject doc = docIter.next();
80           if (doc.get("molecule_sequence") != null)
81           {
82             result.addElement(new PDBSummaryListModel(doc));
83           }
84         }
85         searchResult.setItemFound(numFound);
86         searchResult.setResponseTime(queryTime);
87         searchResult.setSearchSummary(result);
88       }
89     } catch (ParseException e)
90     {
91       e.printStackTrace();
92     }
93
94     return searchResult;
95   }
96
97 }