package jalview.ws.dbsources; import jalview.ws.uimodel.PDBSearchRequest; import jalview.ws.uimodel.PDBSearchResponse; import jalview.ws.uimodel.PDBSummaryListModel; import jalview.ws.uimodel.PDBSummaryListModel.PDBDocField; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.ws.rs.core.MediaType; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.json.JSONConfiguration; public class PDBRestClient { private String pdbSearchEndpoint = "http://wwwdev.ebi.ac.uk/pdbe/search/pdb/select?"; public static void main(String[] args) { PDBSearchRequest request = new PDBSearchRequest(); request.setAllowEmptySeq(false); request.setResponseSize(100); request.setSearchTarget("pfam_name"); request.setSearchTerm("Lipoc*"); List wantedFields = new ArrayList(); wantedFields.add(PDBDocField.MOLECULE_TYPE); wantedFields.add(PDBDocField.PDB_ID); wantedFields.add(PDBDocField.GENUS); wantedFields.add(PDBDocField.GENE_NAME); wantedFields.add(PDBDocField.TITLE); request.setWantedFields(wantedFields); new PDBRestClient().executeRequest(request); } public PDBSearchResponse executeRequest(PDBSearchRequest request) { ClientConfig clientConfig = new DefaultClientConfig(); clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE); Client client = Client.create(clientConfig); String query = request.getSearchTarget() + request.getSearchTerm() + ((request.isAllowEmptySeq()) ? "" : " AND molecule_sequence:['' TO *]"); String wantedFields = getFieldsAsCommaDelimitedString(request .getWantedFields()); String responseSize = (request.getResponseSize() == 0) ? "200" : String .valueOf(request.getResponseSize()); WebResource webResource = client.resource(pdbSearchEndpoint) .queryParam("wt", "json").queryParam("fl", wantedFields) .queryParam("rows", responseSize) .queryParam("q", query); ClientResponse clientResponse = webResource.accept( MediaType.APPLICATION_JSON).get(ClientResponse.class); String responseString = clientResponse.getEntity(String.class); if (clientResponse.getStatus() != 200) { throw new RuntimeException("Failed : HTTP error code : " + clientResponse.getStatus()); } // System.out.println("--------------> " + responseString); return parseResponse(responseString, request.getWantedFields()); } private PDBSearchResponse parseResponse(String jsonResponse, List wantedFields) { PDBSearchResponse searchResult = new PDBSearchResponse(); List result = null; try { JSONParser jsonParser = new JSONParser(); JSONObject jsonObj = (JSONObject) jsonParser .parse(jsonResponse); JSONObject pdbResponse = (JSONObject) jsonObj.get("response"); String queryTime = ((JSONObject) jsonObj.get("responseHeader")).get( "QTime").toString(); int numFound = Integer .valueOf(pdbResponse.get("numFound").toString()); if (numFound > 0) { result = new ArrayList(); JSONArray docs = (JSONArray) pdbResponse.get("docs"); for (Iterator docIter = docs.iterator(); docIter .hasNext();) { JSONObject doc = docIter.next(); // if (doc.get("molecule_sequence") != null) // { result.add(new PDBSummaryListModel(doc, wantedFields)); // } } searchResult.setItemsFound(numFound); searchResult.setResponseTime(queryTime); searchResult.setSearchSummary(result); } } catch (ParseException e) { e.printStackTrace(); } return searchResult; } private String getFieldsAsCommaDelimitedString(List fields) { String result = ""; if (fields != null && !fields.isEmpty()) { StringBuilder returnedFields = new StringBuilder(); for (PDBDocField field : fields) { returnedFields.append(",").append(field.getCode()); } returnedFields.deleteCharAt(0); result = returnedFields.toString(); } return result; } }