From: Ben Soares Date: Tue, 29 Mar 2022 12:11:37 +0000 (+0100) Subject: JAL-3851 Some streamlining of caching/removing from cache. 'Highlighting' in InputAli... X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=commitdiff_plain;h=50668ec2086983585ec0c78438532db49ebeb5a0 JAL-3851 Some streamlining of caching/removing from cache. 'Highlighting' in InputAlignment endpoint windows --- diff --git a/src/jalview/gui/AlignFrame.java b/src/jalview/gui/AlignFrame.java index 237e0c6..4601b8c 100644 --- a/src/jalview/gui/AlignFrame.java +++ b/src/jalview/gui/AlignFrame.java @@ -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 diff --git a/src/jalview/gui/CutAndPasteTransfer.java b/src/jalview/gui/CutAndPasteTransfer.java index 091b7dd..92aa628 100644 --- a/src/jalview/gui/CutAndPasteTransfer.java +++ b/src/jalview/gui/CutAndPasteTransfer.java @@ -222,6 +222,12 @@ public class CutAndPasteTransfer extends GCutAndPasteTransfer public void ok_actionPerformed(ActionEvent e, Map options) { + ok_actionPerformed(e, options, null); + } + + public void ok_actionPerformed(ActionEvent e, Map 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 diff --git a/src/jalview/gui/SeqPanel.java b/src/jalview/gui/SeqPanel.java index 54e3db7..bdf837b 100644 --- a/src/jalview/gui/SeqPanel.java +++ b/src/jalview/gui/SeqPanel.java @@ -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); diff --git a/src/jalview/httpserver/AbstractRequestHandler.java b/src/jalview/httpserver/AbstractRequestHandler.java index f8c5441..bcee1c7 100644 --- a/src/jalview/httpserver/AbstractRequestHandler.java +++ b/src/jalview/httpserver/AbstractRequestHandler.java @@ -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) { /* diff --git a/src/jalview/rest/AbstractEndpoint.java b/src/jalview/rest/AbstractEndpoint.java index 332365b..3910cfb 100644 --- a/src/jalview/rest/AbstractEndpoint.java +++ b/src/jalview/rest/AbstractEndpoint.java @@ -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); diff --git a/src/jalview/rest/AbstractEndpointAsync.java b/src/jalview/rest/AbstractEndpointAsync.java index fe10d1d..bfd7be4 100644 --- a/src/jalview/rest/AbstractEndpointAsync.java +++ b/src/jalview/rest/AbstractEndpointAsync.java @@ -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 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) diff --git a/src/jalview/rest/FetchSequencesEndpoint.java b/src/jalview/rest/FetchSequencesEndpoint.java index e3161cf..7fb6c29 100644 --- a/src/jalview/rest/FetchSequencesEndpoint.java +++ b/src/jalview/rest/FetchSequencesEndpoint.java @@ -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 aps = (List) af diff --git a/src/jalview/rest/GetCrossReferencesEndpoint.java b/src/jalview/rest/GetCrossReferencesEndpoint.java index 611c2a3..8195fdb 100644 --- a/src/jalview/rest/GetCrossReferencesEndpoint.java +++ b/src/jalview/rest/GetCrossReferencesEndpoint.java @@ -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"); diff --git a/src/jalview/rest/HighlightSequenceEndpoint.java b/src/jalview/rest/HighlightSequenceEndpoint.java index 144995a..58dfbe8 100644 --- a/src/jalview/rest/HighlightSequenceEndpoint.java +++ b/src/jalview/rest/HighlightSequenceEndpoint.java @@ -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); } } diff --git a/src/jalview/rest/InputAlignmentEndpoint.java b/src/jalview/rest/InputAlignmentEndpoint.java index 246f511..5e7491f 100644 --- a/src/jalview/rest/InputAlignmentEndpoint.java +++ b/src/jalview/rest/InputAlignmentEndpoint.java @@ -147,7 +147,7 @@ public class InputAlignmentEndpoint extends AbstractEndpointAsync Map options = getOptions(request); - cap.ok_actionPerformed(null, options); + cap.ok_actionPerformed(null, options, getId()); cap.cancel_actionPerformed(null); } else if (fileString != null) diff --git a/src/jalview/structure/StructureSelectionManager.java b/src/jalview/structure/StructureSelectionManager.java index 5cf6385..94de133 100644 --- a/src/jalview/structure/StructureSelectionManager.java +++ b/src/jalview/structure/StructureSelectionManager.java @@ -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 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)