JAL-3851 Some streamlining of caching/removing from cache. 'Highlighting' in InputAli...
authorBen Soares <b.soares@dundee.ac.uk>
Tue, 29 Mar 2022 12:11:37 +0000 (13:11 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Tue, 29 Mar 2022 12:11:37 +0000 (13:11 +0100)
src/jalview/gui/AlignFrame.java
src/jalview/gui/CutAndPasteTransfer.java
src/jalview/gui/SeqPanel.java
src/jalview/httpserver/AbstractRequestHandler.java
src/jalview/rest/AbstractEndpoint.java
src/jalview/rest/AbstractEndpointAsync.java
src/jalview/rest/FetchSequencesEndpoint.java
src/jalview/rest/GetCrossReferencesEndpoint.java
src/jalview/rest/HighlightSequenceEndpoint.java
src/jalview/rest/InputAlignmentEndpoint.java
src/jalview/structure/StructureSelectionManager.java

index 237e0c6..4601b8c 100644 (file)
@@ -4434,6 +4434,8 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
    */
   public boolean canShowProducts()
   {
+    if (viewport == null)
+      return false;
     SequenceI[] seqs = viewport.getAlignment().getSequencesArray();
     AlignmentI dataset = viewport.getAlignment().getDataset();
 
@@ -5983,6 +5985,13 @@ public class AlignFrame extends GAlignFrame implements DropTargetListener,
       alignFrameMap = new HashMap<>();
     alignFrameMap.put(id, this);
   }
+
+  public static void removeFromAlignFrameCache(String id)
+  {
+    if (alignFrameMap == null)
+      return;
+    alignFrameMap.remove(id);
+  }
 }
 
 class PrintThread extends Thread
index 091b7dd..92aa628 100644 (file)
@@ -222,6 +222,12 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
 
   public void ok_actionPerformed(ActionEvent e, Map<String, String> options)
   {
+    ok_actionPerformed(e, options, null);
+  }
+
+  public void ok_actionPerformed(ActionEvent e, Map<String, String> options,
+          String restCacheId)
+  {
     String text = getText();
     if (text.trim().length() < 1)
     {
@@ -352,6 +358,12 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer
         } catch (Exception ex)
         {
         }
+
+        // cache for future REST calls
+        if (restCacheId != null)
+        {
+          af.cacheAlignFrameFromRestId(restCacheId);
+        }
       }
     }
     else
index 54e3db7..bdf837b 100644 (file)
@@ -1281,7 +1281,8 @@ public class SeqPanel extends JPanel
    * @return sequence position of residue at column, or adjacent residue if at a
    *         gap
    */
-  int setStatusMessage(SequenceI sequence, final int column, int seqIndex)
+  public int setStatusMessage(SequenceI sequence, final int column,
+          int seqIndex)
   {
     char sequenceChar = sequence.getCharAt(column);
     int pos = sequence.findPosition(column);
index f8c5441..bcee1c7 100644 (file)
@@ -64,6 +64,9 @@ public abstract class AbstractRequestHandler extends AbstractHandler
     {
       // dumpRequest(request); // debug
       processRequest(request, response);
+    } catch (Exception e)
+    {
+      Console.debug("Exception.", e);
     } catch (Throwable t)
     {
       /*
index 332365b..3910cfb 100644 (file)
@@ -292,12 +292,17 @@ public abstract class AbstractEndpoint implements EndpointI
     }
   }
 
-  protected AlignFrame getAlignFrameFromId(HttpServletRequest request)
+  protected AlignFrame getAlignFrameUsingId(HttpServletRequest request)
   {
-    return getAlignFrameFromId(request, "fromId");
+    return getAlignFrameUsingFromId(request, getId(request));
   }
 
-  protected AlignFrame getAlignFrameFromId(HttpServletRequest request,
+  protected AlignFrame getAlignFrameUsingFromId(HttpServletRequest request)
+  {
+    return getAlignFrameUsingFromId(request, "fromId");
+  }
+
+  protected AlignFrame getAlignFrameUsingFromId(HttpServletRequest request,
           String idParam)
   {
     AlignFrame[] afs = getAlignFrames(request, idParam, false);
index fe10d1d..bfd7be4 100644 (file)
@@ -10,6 +10,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import jalview.bin.Console;
+import jalview.gui.AlignFrame;
 import jalview.rest.RestHandler.Status;
 
 public abstract class AbstractEndpointAsync extends AbstractEndpoint
@@ -32,6 +33,20 @@ public abstract class AbstractEndpointAsync extends AbstractEndpoint
 
   private Status tempStatus = null;
 
+  protected void removeFromCaches(HttpServletRequest request)
+  {
+    removeFromCaches(getId(request));
+  }
+
+  protected void removeFromCaches(String id)
+  {
+    CompletableFuture cf = cfMap.get(id);
+    if (cf == null || cf.isDone())
+      cfMap.remove(id);
+    AlignFrame.removeFromAlignFrameCache(id);
+    API.getStatusMap().remove(getId());
+  }
+
   protected void setCompletableFuture(CompletableFuture<Void> cf)
   {
     this.cf = cf;
@@ -104,8 +119,26 @@ public abstract class AbstractEndpointAsync extends AbstractEndpoint
     // subclass method
     initialise(request, response);
 
+    Console.debug("**** STATUS=" + getStatus());
     if (checkStatus(request, response, Status.STARTED))
     {
+      /*
+      // double check alignframe
+      Console.debug("**** STATUS2=" + getStatus());
+      if (getStatus().compareTo(Status.IN_PROGRESS) > 0
+              && getAlignFrameUsingId(request) == null)
+      {
+        Console.debug("**** STATUS3=" + getStatus());
+        // delete key from cache
+        Console.debug("Cannot find cached AlignFrame for '" + getId()
+                + "', deleting key from cache");
+        removeFromCaches(getId());
+        this.changeStatus(null);
+        this.setCompletableFuture(null);
+      }
+      else
+      {
+      */
       String alreadyFinishedString = null;
       if (getStatus() == Status.FINISHED)
       {
@@ -113,6 +146,9 @@ public abstract class AbstractEndpointAsync extends AbstractEndpoint
       }
       returnStatus(request, response, alreadyFinishedString);
       return;
+      /*
+      }
+      */
     }
 
     if (getCompletableFuture() == null)
index e3161cf..7fb6c29 100644 (file)
@@ -74,7 +74,7 @@ public class FetchSequencesEndpoint extends AbstractEndpointAsync
   protected String finishedResponseString(HttpServletRequest request,
           HttpServletResponse response)
   {
-    AlignFrame af = getAlignFrameFromId(request, "id");
+    AlignFrame af = getAlignFrameUsingId(request);
     if (af == null)
       return null;
     List<AlignmentViewPanel> aps = (List<AlignmentViewPanel>) af
index 611c2a3..8195fdb 100644 (file)
@@ -53,7 +53,7 @@ public class GetCrossReferencesEndpoint extends AbstractEndpointAsync
       return;
     }
 
-    af = getAlignFrameFromId(request);
+    af = getAlignFrameUsingFromId(request);
     if (af == null)
     {
       returnError(request, response, "Could not find results");
index 144995a..58dfbe8 100644 (file)
@@ -69,7 +69,8 @@ public class HighlightSequenceEndpoint extends AbstractEndpoint
     AlignFrame[] alignFrames = getAlignFrames(request, true);
     if (alignFrames == null)
     {
-      returnError(request, response, "could not find results");
+      returnError(request, response, "Could not find AlignFrame for '"
+              + getRequestUrl(request) + "'");
       return;
     }
     for (int i = 0; i < alignFrames.length; i++)
@@ -87,6 +88,8 @@ public class HighlightSequenceEndpoint extends AbstractEndpoint
           try
           {
             SequenceI seqN = seqs.get(sequenceNum);
+            Console.debug("Found sequence " + seqN.getName() + ":"
+                    + seqN.getDisplayId(false));
             ssmMap.put(seqN, ssm);
           } catch (IndexOutOfBoundsException e)
           {
@@ -118,7 +121,7 @@ public class HighlightSequenceEndpoint extends AbstractEndpoint
       }
       Console.debug("Highlighting sequence '" + seq.getName()
               + "' at position " + pos);
-      ssm.mouseOverSequence(seq, pos, -1, null);
+      ssm.mouseOverSequence(seq, pos, -1, null, true);
     }
 
   }
index 246f511..5e7491f 100644 (file)
@@ -147,7 +147,7 @@ public class InputAlignmentEndpoint extends AbstractEndpointAsync
 
       Map<String, String> options = getOptions(request);
 
-      cap.ok_actionPerformed(null, options);
+      cap.ok_actionPerformed(null, options, getId());
       cap.cancel_actionPerformed(null);
     }
     else if (fileString != null)
index 5cf6385..94de133 100644 (file)
@@ -50,6 +50,7 @@ import jalview.datamodel.SearchResultsI;
 import jalview.datamodel.SequenceI;
 import jalview.ext.jmol.JmolParser;
 import jalview.gui.IProgressIndicator;
+import jalview.gui.SeqPanel;
 import jalview.io.AppletFormatAdapter;
 import jalview.io.DataSourceType;
 import jalview.io.StructureFile;
@@ -985,6 +986,12 @@ public class StructureSelectionManager
   public void mouseOverSequence(SequenceI seq, int indexpos, int seqPos,
           VamsasSource source)
   {
+    mouseOverSequence(seq, indexpos, seqPos, source, false);
+  }
+
+  public void mouseOverSequence(SequenceI seq, int indexpos, int seqPos,
+          VamsasSource source, boolean setStatusMessage)
+  {
     boolean hasSequenceListeners = handlingVamsasMo
             || !seqmappings.isEmpty();
     SearchResultsI results = null;
@@ -992,12 +999,11 @@ public class StructureSelectionManager
     {
       seqPos = seq.findPosition(indexpos);
     }
-    
+
     // precompute so we can also relay structure highlights
     if (results == null)
     {
-      results = MappingUtils.buildSearchResults(seq, seqPos,
-              seqmappings);
+      results = MappingUtils.buildSearchResults(seq, seqPos, seqmappings);
     }
     if (handlingVamsasMo)
     {
@@ -1005,6 +1011,9 @@ public class StructureSelectionManager
 
     }
 
+    Console.debug("MOUSEOVER SEARCH RESULTS: "
+            + (results.isEmpty() ? "EMPTY" : results.getCount()));
+
     for (int i = 0; i < listeners.size(); i++)
     {
       Object listener = listeners.elementAt(i);
@@ -1019,10 +1028,10 @@ public class StructureSelectionManager
         StructureListener sl = (StructureListener) listener;
         // TODO: consider merging highlightStructure variants second call
         // functionally same as first if seq/seqPos is part of the searchResults
-        if (highlightStructure(sl, seq, seqPos)==0 && relaySeqMappings)
+        if (highlightStructure(sl, seq, seqPos) == 0 && relaySeqMappings)
         {
           // structure highlights for mapped sequences
-          highlightStructure(sl,results);
+          highlightStructure(sl, results);
         }
       }
       else
@@ -1030,6 +1039,13 @@ public class StructureSelectionManager
         if (listener instanceof SequenceListener)
         {
           final SequenceListener seqListener = (SequenceListener) listener;
+          if (setStatusMessage && seqListener instanceof SeqPanel)
+          {
+            SeqPanel sp = (SeqPanel) seqListener;
+            // THIS IS HIGHLY SUSPECT, ONLY IN FOR DEMO OF
+            // jalview.rest.HighlightSequenceEndpoint
+            sp.setStatusMessage(seq, seqPos - 1, -1);
+          }
           if (hasSequenceListeners
                   && seqListener.getVamsasSource() != source)
           {
@@ -1057,17 +1073,20 @@ public class StructureSelectionManager
   }
 
   /**
-   * highlights positions in a structure viewer corresponding to one or more positions on sequences
+   * highlights positions in a structure viewer corresponding to one or more
+   * positions on sequences
+   * 
    * @param sl
    * @param searchResults
    * @return 0 or number of structure regions highlighted
    */
-  public int highlightStructure(StructureListener sl, SearchResultsI searchResults)
+  public int highlightStructure(StructureListener sl,
+          SearchResultsI searchResults)
   {
     int atomNo;
     List<AtomSpec> atoms = new ArrayList<>();
 
-    for (SearchResultMatchI sr: searchResults.getResults())
+    for (SearchResultMatchI sr : searchResults.getResults())
     {
       SequenceI seq = sr.getSequence();
       for (StructureMapping sm : mappings)
@@ -1078,7 +1097,7 @@ public class StructureSelectionManager
                                 || sm.sequence.getDatasetSequence() == seq
                                         .getDatasetSequence())))
         {
-          for (int index=sr.getStart();index<=sr.getEnd();index++)
+          for (int index = sr.getStart(); index <= sr.getEnd(); index++)
           {
             atomNo = sm.getAtomNum(index);
 
@@ -1094,6 +1113,7 @@ public class StructureSelectionManager
     sl.highlightAtoms(atoms);
     return atoms.size();
   }
+
   /**
    * Send suitable messages to a StructureListener to highlight atoms
    * corresponding to the given sequence position(s)