1 package jalview.ws.dbsources;
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;
8 import java.util.ArrayList;
9 import java.util.Iterator;
10 import java.util.List;
12 import javax.ws.rs.core.MediaType;
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;
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;
26 public class PDBRestClient
28 private String pdbSearchEndpoint = "http://wwwdev.ebi.ac.uk/pdbe/search/pdb/select?";
30 public static void main(String[] args)
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);
47 public PDBSearchResponse executeRequest(PDBSearchRequest request)
49 ClientConfig clientConfig = new DefaultClientConfig();
50 clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,
52 Client client = Client.create(clientConfig);
54 String query = request.getSearchTarget()
55 + request.getSearchTerm()
56 + ((request.isAllowEmptySeq()) ? ""
57 : " AND molecule_sequence:['' TO *]");
59 String wantedFields = getFieldsAsCommaDelimitedString(request
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);
71 String responseString = clientResponse.getEntity(String.class);
72 if (clientResponse.getStatus() != 200)
74 throw new RuntimeException("Failed : HTTP error code : "
75 + clientResponse.getStatus());
77 // System.out.println("--------------> " + responseString);
78 return parseResponse(responseString, request.getWantedFields());
81 private PDBSearchResponse parseResponse(String jsonResponse,
82 List<PDBDocField> wantedFields)
84 PDBSearchResponse searchResult = new PDBSearchResponse();
85 List<PDBSummaryListModel> result = null;
88 JSONParser jsonParser = new JSONParser();
89 JSONObject jsonObj = (JSONObject) jsonParser
92 JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
93 String queryTime = ((JSONObject) jsonObj.get("responseHeader")).get(
95 int numFound = Integer
96 .valueOf(pdbResponse.get("numFound").toString());
99 result = new ArrayList<PDBSummaryListModel>();
100 JSONArray docs = (JSONArray) pdbResponse.get("docs");
101 for (Iterator<JSONObject> docIter = docs.iterator(); docIter
104 JSONObject doc = docIter.next();
105 // if (doc.get("molecule_sequence") != null)
107 result.add(new PDBSummaryListModel(doc, wantedFields));
110 searchResult.setItemsFound(numFound);
111 searchResult.setResponseTime(queryTime);
112 searchResult.setSearchSummary(result);
114 } catch (ParseException e)
122 private String getFieldsAsCommaDelimitedString(List<PDBDocField> fields)
125 if (fields != null && !fields.isEmpty())
127 StringBuilder returnedFields = new StringBuilder();
128 for (PDBDocField field : fields)
130 returnedFields.append(",").append(field.getCode());
132 returnedFields.deleteCharAt(0);
133 result = returnedFields.toString();