JAL-2885 uniprot now https, uniprot/ensembl/pfam/xfam configurable
[jalview.git] / src / jalview / fts / service / uniprot / UniProtFTSRestClient.java
index 0447715..262ed86 100644 (file)
@@ -21,6 +21,7 @@
 
 package jalview.fts.service.uniprot;
 
+import jalview.bin.Cache;
 import jalview.fts.api.FTSData;
 import jalview.fts.api.FTSDataColumnI;
 import jalview.fts.api.FTSRestClientI;
@@ -44,9 +45,18 @@ import com.sun.jersey.api.client.config.DefaultClientConfig;
 
 public class UniProtFTSRestClient extends FTSRestClient
 {
+  private static final String DEFAULT_UNIPROT_DOMAIN = "https://www.uniprot.org";
+
   private static FTSRestClientI instance = null;
 
-  public static final String UNIPROT_SEARCH_ENDPOINT = "http://www.uniprot.org/uniprot/?";
+  public final String uniprotSearchEndpoint;
+
+  public UniProtFTSRestClient()
+  {
+    super();
+    uniprotSearchEndpoint = Cache.getDefault("UNIPROT_DOMAIN",
+            DEFAULT_UNIPROT_DOMAIN) + "/uniprot/?";
+  }
 
   @Override
   public FTSRestResponse executeRequest(FTSRestRequest uniportRestRequest)
@@ -57,35 +67,39 @@ public class UniProtFTSRestClient extends FTSRestClient
       ClientConfig clientConfig = new DefaultClientConfig();
       Client client = Client.create(clientConfig);
 
-      String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(uniportRestRequest
-              .getWantedFields());
-      int responseSize = (uniportRestRequest.getResponseSize() == 0) ? getDefaultResponsePageSize()
+      String wantedFields = getDataColumnsFieldsAsCommaDelimitedString(
+              uniportRestRequest.getWantedFields());
+      int responseSize = (uniportRestRequest.getResponseSize() == 0)
+              ? getDefaultResponsePageSize()
               : uniportRestRequest.getResponseSize();
 
       int offSet = uniportRestRequest.getOffSet();
+      String query;
+      if (isAdvancedQuery(uniportRestRequest.getSearchTerm()))
+      {
+        query = uniportRestRequest.getSearchTerm();
+      }
+      else
+      {
+        query = uniportRestRequest.getFieldToSearchBy()
+                .equalsIgnoreCase("Search All")
+                        ? uniportRestRequest.getSearchTerm()
+                                + " or mnemonic:"
+                                + 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)
+      webResource = client.resource(uniprotSearchEndpoint)
               .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);
+      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
@@ -99,8 +113,8 @@ public class UniProtFTSRestClient extends FTSRestClient
         throw new Exception(errorMessage);
 
       }
-      int xTotalResults = Integer.valueOf(clientResponse.getHeaders()
-              .get("X-Total-Results").get(0));
+      int xTotalResults = Integer.valueOf(
+              clientResponse.getHeaders().get("X-Total-Results").get(0));
       clientResponse = null;
       client = null;
       return parseUniprotResponse(uniProtTabDelimittedResponseString,
@@ -111,9 +125,8 @@ public class UniProtFTSRestClient extends FTSRestClient
       if (exceptionMsg.contains("SocketException"))
       {
         // No internet connection
-        throw new Exception(
-                MessageManager
-                        .getString("exception.unable_to_detect_internet_connection"));
+        throw new Exception(MessageManager.getString(
+                "exception.unable_to_detect_internet_connection"));
       }
       else if (exceptionMsg.contains("UnknownHostException"))
       {
@@ -128,6 +141,17 @@ public class UniProtFTSRestClient extends FTSRestClient
     }
   }
 
+  public boolean isAdvancedQuery(String query)
+  {
+    if (query.contains(" AND ") || query.contains(" OR ")
+            || query.contains(" NOT ") || query.contains(" ! ")
+            || query.contains(" || ") || query.contains(" && ")
+            || query.contains(":") || query.contains("-"))
+    {
+      return true;
+    }
+    return false;
+  }
 
   public FTSRestResponse parseUniprotResponse(
           String uniProtTabDelimittedResponseString,
@@ -144,15 +168,15 @@ public class UniProtFTSRestClient extends FTSRestClient
     String[] foundDataRow = uniProtTabDelimittedResponseString.split("\n");
     if (foundDataRow != null && foundDataRow.length > 0)
     {
-      result = new ArrayList<FTSData>();
-      String titleRow = getDataColumnsFieldsAsTabDelimitedString(uniprotRestRequest
-              .getWantedFields());
-      // System.out.println(">>>>Title row : " + titleRow);
+      result = new ArrayList<>();
+      boolean firstRow = true;
       for (String dataRow : foundDataRow)
       {
-        if (dataRow.equalsIgnoreCase(titleRow))
+        // The first data row is usually the header data. This should be
+        // filtered out from the rest of the data See: JAL-2485
+        if (firstRow)
         {
-          // System.out.println(">>>>>>>>>> matched!!!");
+          firstRow = false;
           continue;
         }
         // System.out.println(dataRow);
@@ -226,14 +250,17 @@ public class UniProtFTSRestClient extends FTSRestClient
         {
           try
           {
-            summaryRowData[colCounter++] = (field.getDataColumnClass() == Integer.class) ? Integer
-                    .valueOf(fieldData)
-                    : (field.getDataColumnClass() == Double.class) ? Double
-                            .valueOf(fieldData) : fieldData;
+            summaryRowData[colCounter++] = (field.getDataType()
+                    .getDataTypeClass() == Integer.class)
+                            ? Integer.valueOf(fieldData.replace(",", ""))
+                            : (field.getDataType()
+                                    .getDataTypeClass() == Double.class)
+                                            ? Double.valueOf(fieldData)
+                                            : fieldData;
           } catch (Exception e)
           {
             e.printStackTrace();
-              System.out.println("offending value:" + fieldData);
+            System.out.println("offending value:" + fieldData);
           }
         }
       } catch (Exception e)
@@ -292,7 +319,6 @@ public class UniProtFTSRestClient extends FTSRestClient
     };
   }
 
-
   public static FTSRestClientI getInstance()
   {
     if (instance == null)