JAL-4114 formatting
[jalview.git] / src / jalview / fts / service / threedbeacons / TDBeaconsFTSRestClient.java
index a57cf3b..b686c95 100644 (file)
@@ -1,3 +1,23 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.fts.service.threedbeacons;
 
 import java.net.URI;
@@ -6,7 +26,6 @@ import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 
 import javax.ws.rs.core.MediaType;
 
@@ -22,11 +41,10 @@ import jalview.fts.api.FTSData;
 import jalview.fts.api.FTSDataColumnI;
 import jalview.fts.api.FTSRestClientI;
 import jalview.fts.api.StructureFTSRestClientI;
+import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
 import jalview.fts.core.FTSRestClient;
 import jalview.fts.core.FTSRestRequest;
 import jalview.fts.core.FTSRestResponse;
-import jalview.fts.core.FTSDataColumnPreferences.PreferenceSource;
-import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.util.JSONUtils;
 import jalview.util.MessageManager;
 import jalview.util.Platform;
@@ -34,9 +52,19 @@ import jalview.util.Platform;
 public class TDBeaconsFTSRestClient extends FTSRestClient
         implements StructureFTSRestClientI
 {
-  private static final String DEFAULT_THREEDBEACONS_DOMAIN = "https://wwwdev.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons/api/uniprot/summary/";
+  /**
+   * production server URI
+   */
+  private static String TDB_PROD_API = "https://www.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons/api/uniprot/summary/";
+
+  /**
+   * dev server URI
+   */
+  private static String TDB_DEV_API = "https://wwwdev.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons/api/uniprot/summary/";
+
+  private static String DEFAULT_THREEDBEACONS_DOMAIN = TDB_PROD_API;
 
-  private static FTSRestClientI instance = null;
+  public static FTSRestClientI instance = null;
 
   protected TDBeaconsFTSRestClient()
   {
@@ -68,15 +96,24 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
         client = Client.create(new DefaultClientConfig());
         clientResponseClass = ClientResponse.class;
       }
+
       WebResource webResource;
-      webResource = client.resource(DEFAULT_THREEDBEACONS_DOMAIN)
-              .path(query);
+      webResource = client.resource(DEFAULT_THREEDBEACONS_DOMAIN + query);
+
       URI uri = webResource.getURI();
       System.out.println(uri.toString());
 
       // Execute the REST request
-      ClientResponse clientResponse = webResource
-              .accept(MediaType.APPLICATION_JSON).get(clientResponseClass);
+      ClientResponse clientResponse;
+      if (isMocked())
+      {
+        clientResponse = null;
+      }
+      else
+      {
+        clientResponse = webResource.accept(MediaType.APPLICATION_JSON)
+                .get(clientResponseClass);
+      }
 
       // Get the JSON string from the response object or directly from the
       // client (JavaScript)
@@ -84,7 +121,9 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
       String responseString = null;
 
       // Check the response status and report exception if one occurs
-      int responseStatus = clientResponse.getStatus();
+      int responseStatus = isMocked()
+              ? (mockQueries.containsKey(query) ? 200 : 404)
+              : clientResponse.getStatus();
       switch (responseStatus)
       {
       // if success
@@ -95,11 +134,14 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
         }
         else
         {
-          responseString = clientResponse.getEntity(String.class);
+          responseString = isMocked() ? mockQueries.get(query)
+                  : clientResponse.getEntity(String.class);
         }
         break;
       case 400:
         throw new Exception(parseJsonExceptionString(responseString));
+      case 404:
+        return emptyTDBeaconsJsonResponse();
       default:
         throw new Exception(
                 getMessageByHTTPStatusCode(responseStatus, "3DBeacons"));
@@ -110,26 +152,38 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
     } 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"))
+      if (exceptionMsg != null)
       {
-        // The server is unreachable
-        throw new Exception(MessageManager.formatMessage(
-                "exception.fts_server_unreachable", "3DB Hub"));
-      }
-      else
-      {
-        throw e;
+        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 is unreachable
+          throw new Exception(MessageManager.formatMessage(
+                  "exception.fts_server_unreachable", "3DB Hub"));
+        }
       }
+      throw e;
+
     }
 
   }
 
+  /**
+   * returns response for when the 3D-Beacons service doesn't have a record for
+   * the given query - in 2.11.2 this triggers a failover to the PDBe FTS
+   * 
+   * @return null
+   */
+  private FTSRestResponse emptyTDBeaconsJsonResponse()
+  {
+    return null;
+  }
+
   public String setSearchTerm(String term)
   {
     return term;
@@ -187,11 +241,10 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
     return searchResult;
   }
 
-  private static FTSData getFTSData(Map<String, Object> tdbJsonStructure,
+  private static FTSData getFTSData(
+          Map<String, Object> tdbJsonStructureSummary,
           FTSRestRequest tdbRequest)
   {
-    // TODO: consider reusing PDBFTSRestClient.getFTSData ?
-
     String primaryKey = null;
     Object[] summaryRowData;
 
@@ -201,14 +254,14 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
     SequenceI associatedSeq = tdbRequest.getAssociatedSequence();
     int colCounter = 0;
     summaryRowData = new Object[(associatedSeq != null)
-                                ? displayFields.size() + 1
-                                : displayFields.size()];
-                        if (associatedSeq != null)
-                        {
-                          associatedSequence = associatedSeq;
-                          summaryRowData[0] = associatedSequence;
-                          colCounter = 1;
-                        }
+            ? displayFields.size() + 1
+            : displayFields.size()];
+    if (associatedSeq != null)
+    {
+      associatedSequence = associatedSeq;
+      summaryRowData[0] = associatedSequence;
+      colCounter = 1;
+    }
 
     for (FTSDataColumnI field : displayFields)
     {
@@ -246,52 +299,7 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
     final String primaryKey1 = primaryKey;
     final Object[] summaryRowData1 = summaryRowData;
 
-    return new FTSData()
-    {
-
-      @Override
-      public Object[] getSummaryData()
-      {
-        return summaryRowData1;
-      }
-
-      @Override
-      public Object getPrimaryKey()
-      {
-        return primaryKey1;
-      }
-
-      /**
-       * Returns a string representation of this object;
-       */
-      @Override
-      public String toString()
-      {
-        StringBuilder summaryFieldValues = new StringBuilder();
-        for (Object summaryField : summaryRowData1)
-        {
-          summaryFieldValues.append(
-                  summaryField == null ? " " : summaryField.toString())
-                  .append("\t");
-        }
-        return summaryFieldValues.toString();
-      }
-
-      /**
-       * Returns hash code value for this object
-       */
-      @Override
-      public int hashCode()
-      {
-        return Objects.hash(primaryKey1, this.toString());
-      }
-
-      @Override
-      public boolean equals(Object that)
-      {
-        return this.toString().equals(that.toString());
-      }
-    };
+    return new TDB_FTSData(primaryKey, tdbJsonStructure, summaryRowData1);
   }
 
   // private static FTSData getFTSData(Map<String, Object> doc,
@@ -332,6 +340,7 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
 
   private Collection<FTSDataColumnI> allDefaultDisplayedStructureDataColumns;
 
+  @Override
   public Collection<FTSDataColumnI> getAllDefaultDisplayedStructureDataColumns()
   {
     if (allDefaultDisplayedStructureDataColumns == null
@@ -357,8 +366,8 @@ public class TDBeaconsFTSRestClient extends FTSRestClient
       columnNames = new String[] { "", "Display", "Group" };
       break;
     case PREFERENCES:
-      columnNames = new String[] { "3DB Beacons Field", "Show in search summary",
-          "Show in structure summary" };
+      columnNames = new String[] { "3DB Beacons Field",
+          "Show in search summary", "Show in structure summary" };
       break;
     default:
       break;