JAL-1668 First version JAL-1668
[jalview.git] / src / jalview / ws / dbsources / PDBRestClient.java
index 0c41d61..bdc507f 100644 (file)
@@ -1,11 +1,14 @@
 package jalview.ws.dbsources;
 
-import jalview.ws.uimodel.PDBSearchResultPojo;
+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.swing.DefaultListModel;
 import javax.ws.rs.core.MediaType;
 
 import org.json.simple.JSONArray;
@@ -24,23 +27,44 @@ public class PDBRestClient
 {
   private String pdbSearchEndpoint = "http://wwwdev.ebi.ac.uk/pdbe/search/pdb/select?";
 
-
   public static void main(String[] args)
   {
-    new PDBRestClient().searchResult("pfam_name", "Lipoc*");
+    PDBSearchRequest request = new PDBSearchRequest();
+    request.setAllowEmptySeq(false);
+    request.setResponseSize(100);
+    request.setSearchTarget("pfam_name");
+    request.setSearchTerm("Lipoc*");
+    List<PDBDocField> wantedFields = new ArrayList<PDBDocField>();
+    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);
   }
 
-  private String executeRestSearch(String qParam,
-          String searchTerm)
+  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("rows", "100")
-            .queryParam("q", qParam + ":" + searchTerm);
+            .queryParam("wt", "json").queryParam("fl", wantedFields)
+            .queryParam("rows", responseSize)
+            .queryParam("q", query);
     ClientResponse clientResponse = webResource.accept(
             MediaType.APPLICATION_JSON).get(ClientResponse.class);
 
@@ -50,20 +74,20 @@ public class PDBRestClient
       throw new RuntimeException("Failed : HTTP error code : "
               + clientResponse.getStatus());
     }
-    return responseString;
+    // System.out.println("--------------> " + responseString);
+    return parseResponse(responseString, request.getWantedFields());
   }
 
-  public PDBSearchResultPojo searchResult(String qParam,
-          String searchTerm)
+  private PDBSearchResponse parseResponse(String jsonResponse,
+          List<PDBDocField> wantedFields)
   {
-    String jsonResponseString = executeRestSearch(qParam, searchTerm);
-    PDBSearchResultPojo searchResult = new PDBSearchResultPojo();
-    DefaultListModel<PDBSummaryListModel> result = null;
+    PDBSearchResponse searchResult = new PDBSearchResponse();
+    List<PDBSummaryListModel> result = null;
     try
     {
       JSONParser jsonParser = new JSONParser();
       JSONObject jsonObj = (JSONObject) jsonParser
-              .parse(jsonResponseString);
+.parse(jsonResponse);
 
       JSONObject pdbResponse = (JSONObject) jsonObj.get("response");
       String queryTime = ((JSONObject) jsonObj.get("responseHeader")).get(
@@ -72,18 +96,18 @@ public class PDBRestClient
               .valueOf(pdbResponse.get("numFound").toString());
       if (numFound > 0)
       {
-        result = new DefaultListModel<PDBSummaryListModel>();
+        result = new ArrayList<PDBSummaryListModel>();
         JSONArray docs = (JSONArray) pdbResponse.get("docs");
         for (Iterator<JSONObject> docIter = docs.iterator(); docIter
                 .hasNext();)
         {
           JSONObject doc = docIter.next();
-          if (doc.get("molecule_sequence") != null)
-          {
-            result.addElement(new PDBSummaryListModel(doc));
-          }
+          // if (doc.get("molecule_sequence") != null)
+          // {
+          result.add(new PDBSummaryListModel(doc, wantedFields));
+          // }
         }
-        searchResult.setItemFound(numFound);
+        searchResult.setItemsFound(numFound);
         searchResult.setResponseTime(queryTime);
         searchResult.setSearchSummary(result);
       }
@@ -95,4 +119,21 @@ public class PDBRestClient
     return searchResult;
   }
 
+  private String getFieldsAsCommaDelimitedString(List<PDBDocField> 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;
+  }
+
+
 }