JAL-1668 First version JAL-1668
[jalview.git] / src / jalview / ws / dbsources / PDBRestClient.java
1 package jalview.ws.dbsources;
2
3 import jalview.ws.uimodel.PDBSearchRequest;
4 import jalview.ws.uimodel.PDBSearchResponse;
5 import jalview.ws.uimodel.PDBSummaryListModel;
6 import jalview.ws.uimodel.PDBSummaryListModel.PDBDocField;
7
8 import java.util.ArrayList;
9 import java.util.Iterator;
10 import java.util.List;
11
12 import javax.ws.rs.core.MediaType;
13
14 import org.json.simple.JSONArray;
15 import org.json.simple.JSONObject;
16 import org.json.simple.parser.JSONParser;
17 import org.json.simple.parser.ParseException;
18
19 import com.sun.jersey.api.client.Client;
20 import com.sun.jersey.api.client.ClientResponse;
21 import com.sun.jersey.api.client.WebResource;
22 import com.sun.jersey.api.client.config.ClientConfig;
23 import com.sun.jersey.api.client.config.DefaultClientConfig;
24 import com.sun.jersey.api.json.JSONConfiguration;
25
26 public class PDBRestClient
27 {
28   private String pdbSearchEndpoint = "http://wwwdev.ebi.ac.uk/pdbe/search/pdb/select?";
29
30   public static void main(String[] args)
31   {
32     PDBSearchRequest request = new PDBSearchRequest();
33     request.setAllowEmptySeq(false);
34     request.setResponseSize(100);
35     request.setSearchTarget("pfam_name");
36     request.setSearchTerm("Lipoc*");
37     List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
38     wantedFields.add(PDBDocField.MOLECULE_TYPE);
39     wantedFields.add(PDBDocField.PDB_ID);
40     wantedFields.add(PDBDocField.GENUS);
41     wantedFields.add(PDBDocField.GENE_NAME);
42     wantedFields.add(PDBDocField.TITLE);
43     request.setWantedFields(wantedFields);
44     new PDBRestClient().executeRequest(request);
45   }
46
47   public PDBSearchResponse executeRequest(PDBSearchRequest request)
48   {
49     ClientConfig clientConfig = new DefaultClientConfig();
50     clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
51             Boolean.TRUE);
52     Client client = Client.create(clientConfig);
53
54     String query = request.getSearchTarget()
55             + request.getSearchTerm()
56             + ((request.isAllowEmptySeq()) ? ""
57                     : " AND molecule_sequence:['' TO *]");
58
59     String wantedFields = getFieldsAsCommaDelimitedString(request
60             .getWantedFields());
61
62     String responseSize = (request.getResponseSize() == 0) ? "200" : String
63             .valueOf(request.getResponseSize());
64     WebResource webResource = client.resource(pdbSearchEndpoint)
65             .queryParam("wt", "json").queryParam("fl", wantedFields)
66             .queryParam("rows", responseSize)
67             .queryParam("q", query);
68     ClientResponse clientResponse = webResource.accept(
69             MediaType.APPLICATION_JSON).get(ClientResponse.class);
70
71     String responseString = clientResponse.getEntity(String.class);
72     if (clientResponse.getStatus() != 200)
73     {
74       throw new RuntimeException("Failed : HTTP error code : "
75               + clientResponse.getStatus());
76     }
77     // System.out.println("--------------> " + responseString);
78     return parseResponse(responseString, request.getWantedFields());
79   }
80
81   private PDBSearchResponse parseResponse(String jsonResponse,
82           List<PDBDocField> wantedFields)
83   {
84     PDBSearchResponse searchResult = new PDBSearchResponse();
85     List<PDBSummaryListModel> result = null;
86     try
87     {
88       JSONParser jsonParser = new JSONParser();
89       JSONObject jsonObj = (JSONObject) jsonParser
90 .parse(jsonResponse);
91
92       JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
93       String queryTime = ((JSONObject) jsonObj.get("responseHeader")).get(
94               "QTime").toString();
95       int numFound = Integer
96               .valueOf(pdbResponse.get("numFound").toString());
97       if (numFound > 0)
98       {
99         result = new ArrayList<PDBSummaryListModel>();
100         JSONArray docs = (JSONArray) pdbResponse.get("docs");
101         for (Iterator<JSONObject> docIter = docs.iterator(); docIter
102                 .hasNext();)
103         {
104           JSONObject doc = docIter.next();
105           // if (doc.get("molecule_sequence") != null)
106           // {
107           result.add(new PDBSummaryListModel(doc, wantedFields));
108           // }
109         }
110         searchResult.setItemsFound(numFound);
111         searchResult.setResponseTime(queryTime);
112         searchResult.setSearchSummary(result);
113       }
114     } catch (ParseException e)
115     {
116       e.printStackTrace();
117     }
118
119     return searchResult;
120   }
121
122   private String getFieldsAsCommaDelimitedString(List<PDBDocField> fields)
123   {
124     String result = "";
125     if (fields != null && !fields.isEmpty())
126     {
127       StringBuilder returnedFields = new StringBuilder();
128       for (PDBDocField field : fields)
129       {
130         returnedFields.append(",").append(field.getCode());
131       }
132       returnedFields.deleteCharAt(0);
133       result = returnedFields.toString();
134     }
135     return result;
136   }
137
138
139 }