JAL-3746 apply copyright to source
[jalview.git] / src / jalview / fts / service / threedbeacons / TDBeaconsFTSPanel.java
index 0d79d9b..6ca3ca2 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.io.BufferedReader;
@@ -10,9 +30,13 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 
+import javax.swing.SwingUtilities;
+
 import org.json.JSONArray;
 import org.json.JSONObject;
 
+import jalview.bin.Console;
+import jalview.datamodel.AlignmentI;
 import jalview.fts.api.FTSDataColumnI;
 import jalview.fts.api.FTSRestClientI;
 import jalview.fts.core.FTSRestRequest;
@@ -20,11 +44,16 @@ import jalview.fts.core.FTSRestResponse;
 import jalview.fts.core.GFTSPanel;
 import jalview.fts.service.pdb.PDBFTSRestClient;
 import jalview.gui.SequenceFetcher;
+import jalview.io.DataSourceType;
+import jalview.io.FileFormat;
+import jalview.io.FileFormatI;
+import jalview.io.FileLoader;
+import jalview.io.FormatAdapter;
 import jalview.util.MessageManager;
 
 @SuppressWarnings("serial")
 public class TDBeaconsFTSPanel extends GFTSPanel
-{       
+{
   private static String defaultFTSFrameTitle = MessageManager
           .getString("label.pdb_sequence_fetcher");
 
@@ -33,81 +62,19 @@ public class TDBeaconsFTSPanel extends GFTSPanel
   private static final String THREEDB_FTS_CACHE_KEY = "CACHE.THREEDB_FTS";
 
   private static final String THREEDB_AUTOSEARCH = "FTS.THREEDB.AUTOSEARCH";
-  
+
   private static HttpURLConnection connection;
-  
+
   public TDBeaconsFTSPanel(SequenceFetcher fetcher)
   {
-    super(fetcher);
-    pageLimit = TDBeaconsFTSRestClient.getInstance().getDefaultResponsePageSize();
+    // no ID retrieval option for TD Beacons just now
+    super(null);
+    pageLimit = TDBeaconsFTSRestClient.getInstance()
+            .getDefaultResponsePageSize();
     this.seqFetcher = fetcher;
     this.progressIndicator = (fetcher == null) ? null
             : fetcher.getProgressIndicator();
   }
-  
-  public int TDBeaconsFTSPanel2(String result)
-  {
-    int seqlength = executeParse(result);
-    return seqlength;
-  }
-  
-  public static int executeParse(String query) {
-    BufferedReader reader;
-    String line;
-    StringBuffer responseContent = new StringBuffer();
-    try {
-      URL url = new URL("https://wwwdev.ebi.ac.uk/pdbe/pdbe-kb/3dbeacons-hub-api/uniprot/summary/" + query + ".json");
-      connection = (HttpURLConnection) url.openConnection();
-      connection.setRequestMethod("GET");
-      connection.setConnectTimeout(5000); // <=>5seconds
-      connection.setReadTimeout(5000);
-      // Status check up, 200 = connection succesful
-      int status = connection.getResponseCode();
-      // System.out.println(status);
-
-      if (status > 299) {
-              reader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));
-              while ((line = reader.readLine()) != null) {
-                      responseContent.append(line);
-              }
-              reader.close();
-      } else {
-              reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
-              while ((line = reader.readLine()) != null) {
-                      responseContent.append(line);
-              }
-              reader.close();
-      }
-      //System.out.println(responseContent.toString());
-      int seq = parse(responseContent.toString());
-      return seq;
-
-      } catch (MalformedURLException e) {
-        e.printStackTrace();
-      } catch (IOException e) {
-        e.printStackTrace();
-      } finally {
-      connection.disconnect();
-      }
-      return (Integer) null;
-      
-  }
-  
-  public static int parse(String jsonString) {
-    JSONObject entry = new JSONObject(jsonString);
-    System.out.println(entry);
-    int length = entry.getJSONObject("uniprot_entry").getInt("sequence_length");
-    String  ac = entry.getJSONObject("uniprot_entry").getString("ac");
-    
-    JSONArray structures = entry.getJSONArray("structures");
-    for (int i=0 ; i < structures.length() ; i++) {
-            String id = structures.getJSONObject(i).getString("model_identifier");
-            System.out.println("identifier num " + i + " : " + id);
-    }
-    System.out.println("length : " + length + "; access name : " + ac);
-    return length;
-    
-}
 
   @Override
   public void searchAction(boolean isFreshSearch)
@@ -138,11 +105,12 @@ public class TDBeaconsFTSPanel extends GFTSPanel
           FTSRestRequest request = new FTSRestRequest();
           request.setAllowEmptySeq(allowEmptySequence);
           request.setResponseSize(100);
-          request.setFieldToSearchBy("(" + searchTarget + ":");
-          request.setSearchTerm(searchTerm + ")");
+          // expect it to be uniprot accesssion
+          request.setSearchTerm(searchTerm + ".json");
           request.setOffSet(offSet);
           request.setWantedFields(wantedFields);
-          FTSRestClientI tdbRestClient = TDBeaconsFTSRestClient.getInstance();
+          FTSRestClientI tdbRestClient = TDBeaconsFTSRestClient
+                  .getInstance();
           FTSRestResponse resultList;
           try
           {
@@ -175,7 +143,8 @@ public class TDBeaconsFTSPanel extends GFTSPanel
 
           if (isPaginationEnabled() && resultSetCount > 0)
           {
-            String f1 = totalNumberformatter.format(Integer.valueOf(offSet + 1));
+            String f1 = totalNumberformatter
+                    .format(Integer.valueOf(offSet + 1));
             String f2 = totalNumberformatter
                     .format(Integer.valueOf(offSet + resultSetCount));
             String f3 = totalNumberformatter
@@ -199,14 +168,14 @@ public class TDBeaconsFTSPanel extends GFTSPanel
       }
     }.start();
   }
-  
+
   @Override
   public void okAction()
   {
     // mainFrame.dispose();
     disableActionButtons();
     StringBuilder selectedIds = new StringBuilder();
-    HashSet<String> selectedIdsSet = new HashSet<>();
+    final HashSet<String> selectedIdsSet = new HashSet<>();
     int primaryKeyColIndex = 0;
     try
     {
@@ -222,12 +191,12 @@ public class TDBeaconsFTSPanel extends GFTSPanel
     {
       String idStr = getResultTable()
               .getValueAt(summaryRow, primaryKeyColIndex).toString();
-      selectedIdsSet.add(searchTerm);
+      selectedIdsSet.add(idStr);
     }
 
     for (String idStr : paginatorCart)
     {
-      selectedIdsSet.add(searchTerm);
+      selectedIdsSet.add(idStr);
     }
 
     for (String selectedId : selectedIdsSet)
@@ -235,19 +204,57 @@ public class TDBeaconsFTSPanel extends GFTSPanel
       selectedIds.append(selectedId).append(";");
     }
 
-    String ids = selectedIds.toString();
-    seqFetcher.setQuery(ids);
-    Thread worker = new Thread(seqFetcher);
-    worker.start();
+    SwingUtilities.invokeLater(new Runnable()
+    {
+      @Override
+      public void run()
+      {
+        AlignmentI allSeqs = null;
+        FormatAdapter fl = new jalview.io.FormatAdapter();
+        for (String tdbURL : selectedIdsSet)
+        {
+          try
+          {
+            // retrieve the structure via its URL
+            AlignmentI tdbAl = fl.readFile(tdbURL, DataSourceType.URL,
+                    FileFormat.MMCif);
+
+            // TODO: pad structure according to its Uniprot Start so all line up
+            // w.r.t. the Uniprot reference sequence
+            // TODO: give the structure a sensible name (not the giant URL *:o)
+            // )
+            if (tdbAl != null)
+            {
+              if (allSeqs != null)
+              {
+                allSeqs.append(tdbAl);
+              }
+              else
+              {
+                allSeqs = tdbAl;
+              }
+            }
+          } catch (Exception x)
+          {
+            Console.warn("Couldn't retrieve 3d-beacons model for uniprot id"
+                    + searchTerm + " : " + tdbURL, x);
+          }
+        }
+        seqFetcher.parseResult(allSeqs,
+                "3D-Beacons models for " + searchTerm, FileFormat.MMCif,
+                null);
+
+      }
+    });
     delayAndEnableActionButtons();
   }
-  
+
   @Override
   public FTSRestClientI getFTSRestClient()
   {
     return TDBeaconsFTSRestClient.getInstance();
   }
-  
+
   @Override
   public String getFTSFrameTitle()
   {
@@ -282,10 +289,11 @@ public class TDBeaconsFTSPanel extends GFTSPanel
   protected void showHelp()
   {
     System.out.println("No help implemented yet.");
-    
+
   }
-  
-  public static String decodeSearchTerm(String enteredText) {
+
+  public static String decodeSearchTerm(String enteredText)
+  {
     // no multiple query support yet
     return enteredText;
   }