JAL-1563 JAL-2091 Added generic pagination for FTS Service, pagination for PDB FTS...
[jalview.git] / src / jalview / fts / service / uniprot / UniProtFTSRestClient.java
index 0541881..8a21ffb 100644 (file)
@@ -27,6 +27,7 @@ import jalview.fts.api.FTSRestClientI;
 import jalview.fts.core.FTSRestClient;
 import jalview.fts.core.FTSRestRequest;
 import jalview.fts.core.FTSRestResponse;
+import jalview.util.MessageManager;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -49,54 +50,83 @@ public class UniProtFTSRestClient extends FTSRestClient
 
   @Override
   public FTSRestResponse executeRequest(FTSRestRequest uniportRestRequest)
+          throws Exception
   {
-    ClientConfig clientConfig = new DefaultClientConfig();
-    Client client = Client.create(clientConfig);
+    try
+    {
+      ClientConfig clientConfig = new DefaultClientConfig();
+      Client client = Client.create(clientConfig);
 
-    String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(uniportRestRequest
-            .getWantedFields());
-    int responseSize = (uniportRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize()
-            : uniportRestRequest.getResponseSize();
+      String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(uniportRestRequest
+              .getWantedFields());
+      int responseSize = (uniportRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize()
+              : uniportRestRequest.getResponseSize();
 
-    int offSet = uniportRestRequest.getOffSet();
+      int offSet = uniportRestRequest.getOffSet();
 
-    String query = uniportRestRequest.getFieldToSearchBy()
-            .equalsIgnoreCase("Search All") ? uniportRestRequest
-            .getSearchTerm()
-            : uniportRestRequest.getFieldToSearchBy() + ":"
-                    + uniportRestRequest.getSearchTerm();
+      String query = uniportRestRequest.getFieldToSearchBy()
+              .equalsIgnoreCase("Search All") ? uniportRestRequest
+              .getSearchTerm() : uniportRestRequest.getFieldToSearchBy()
+              + ":" + uniportRestRequest.getSearchTerm();
 
-    // + (uniportRestRequest.isAllowUnpublishedEntries() ? ""
-    // : " AND status:REL");
-    // System.out.println(">>>>> Query : " + query);
-    // System.out.println(">>>>> Columns : " + wantedFields);
-    // System.out.println(">>>>> Response size: " + responseSize
-    // + " offset : "
-    // + offSet);
-    WebResource webResource = null;
-    webResource = client.resource(UNIPROT_SEARCH_ENDPOINT)
-            .queryParam("format", "tab")
-            .queryParam("columns", wantedFields)
-            .queryParam("limit", String.valueOf(responseSize))
-            .queryParam("offset", String.valueOf(offSet))
-            .queryParam("sort", "score")
-            .queryParam("query", query);
-    // Execute the REST request
-    ClientResponse clientResponse = webResource
-            .accept(MediaType.TEXT_PLAIN).get(ClientResponse.class);
-    String uniProtTabDelimittedResponseString = clientResponse
-            .getEntity(String.class);
-    // Make redundant objects eligible for garbage collection to conserve
-    // memory
-    clientResponse = null;
-    client = null;
-    // System.out.println(">>>>> response : "
-    // + uniProtTabDelimittedResponseString);
-    return parseUniprotResponse(uniProtTabDelimittedResponseString,
-            uniportRestRequest);
+      // + (uniportRestRequest.isAllowUnpublishedEntries() ? ""
+      // : " AND status:REL");
+      // System.out.println(">>>>> Query : " + query);
+      // System.out.println(">>>>> Columns : " + wantedFields);
+      // System.out.println(">>>>> Response size: " + responseSize
+      // + " offset : "
+      // + offSet);
+      WebResource webResource = null;
+      webResource = client.resource(UNIPROT_SEARCH_ENDPOINT)
+              .queryParam("format", "tab")
+              .queryParam("columns", wantedFields)
+              .queryParam("limit", String.valueOf(responseSize))
+              .queryParam("offset", String.valueOf(offSet))
+              .queryParam("sort", "score").queryParam("query", query);
+      // Execute the REST request
+      ClientResponse clientResponse = webResource.accept(
+              MediaType.TEXT_PLAIN).get(ClientResponse.class);
+      String uniProtTabDelimittedResponseString = clientResponse
+              .getEntity(String.class);
+      // Make redundant objects eligible for garbage collection to conserve
+      // memory
+      // System.out.println(">>>>> response : "
+      // + uniProtTabDelimittedResponseString);
+      if (clientResponse.getStatus() != 200)
+      {
+        String errorMessage = getMessageByHTTPStatusCode(
+                clientResponse.getStatus(), "Uniprot");
+        throw new Exception(errorMessage);
 
+      }
+      clientResponse = null;
+      client = null;
+      return parseUniprotResponse(uniProtTabDelimittedResponseString,
+              uniportRestRequest);
+    } catch (Exception e)
+    {
+      String exceptionMsg = e.getMessage();
+      if (exceptionMsg.contains("SocketException"))
+      {
+        // No internet connection
+        throw new Exception(
+                MessageManager
+                        .getString("exception.unable_to_detect_internet_connection"));
+      }
+      else if (exceptionMsg.contains("UnknownHostException"))
+      {
+        // The server 'http://www.uniprot.org' is unreachable
+        throw new Exception(MessageManager.formatMessage(
+                "exception.fts_server_unreachable", "Uniprot"));
+      }
+      else
+      {
+        throw e;
+      }
+    }
   }
 
+
   public FTSRestResponse parseUniprotResponse(
           String uniProtTabDelimittedResponseString,
           FTSRestRequest uniprotRestRequest)
@@ -164,6 +194,7 @@ public class UniProtFTSRestClient extends FTSRestClient
     }
     return result;
   }
+
   public static FTSData getFTSData(String tabDelimittedDataStr,
           FTSRestRequest request)
   {
@@ -250,6 +281,12 @@ public class UniProtFTSRestClient extends FTSRestClient
       {
         return Objects.hash(primaryKey1, this.toString());
       }
+
+      @Override
+      public boolean equals(Object that)
+      {
+        return this.toString().equals(that.toString());
+      }
     };
   }