package jalview.rest; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jalview.api.AlignmentViewPanel; import jalview.bin.Console; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.structure.StructureSelectionManager; public class HighlightSequenceEndpoint extends AbstractEndpoint { public HighlightSequenceEndpoint(API api) { super(api, path, name, parameters, description); } protected static final String path = "highlightsequence"; private static final String name = "Highlight sequence position"; private static final String parameters = "/"; private static final String description = "Highlight the specified sequences at the specified position"; public void processEndpoint(HttpServletRequest request, HttpServletResponse response) { if (!checkParameters(request, response, 2)) { return; } String[] parameters = getEndpointPathParameters(request); String posString = parameters[1]; int pos = -1; try { pos = Integer.parseInt(posString); } catch (NumberFormatException e) { returnError(request, response, "Could not parse postition integer " + posString); } String sequenceNames = parameters[0] == null ? "*0" : parameters[0]; Console.debug("Looking for sequence '" + sequenceNames + "'"); int sequenceNum = -1; if (sequenceNames.startsWith("*")) { try { sequenceNum = Integer.parseInt(sequenceNames.substring(1)); } catch (NumberFormatException e) { Console.debug("Could not parse sequence number '" + sequenceNames + "'. Will use as identifier.", e); } } Map ssmMap = new HashMap<>(); AlignFrame[] alignFrames = getAlignFrames(request, true); if (alignFrames == null) { returnError(request, response, "Could not find AlignFrame for '" + getRequestUrl(request) + "'"); return; } for (int i = 0; i < alignFrames.length; i++) { AlignFrame af = alignFrames[i]; List aps = (List) af .getAlignPanels(); for (AlignmentViewPanel ap : aps) { StructureSelectionManager ssm = ap.getStructureSelectionManager(); AlignmentI al = ap.getAlignment(); List seqs = (List) al.getSequences(); if (0 <= sequenceNum && sequenceNum < seqs.size()) { try { SequenceI seqN = seqs.get(sequenceNum); Console.debug("Found sequence " + seqN.getName() + ":" + seqN.getDisplayId(false)); ssmMap.put(seqN, ssm); } catch (IndexOutOfBoundsException e) { Console.debug("Sequence index number too large: " + sequenceNum, e); } } else { // search for sequence names for (SequenceI seq : seqs) { if (sequenceNames.equals(seq.getName())) { ssmMap.put(seq, ssm); Console.debug("Found sequence '" + seq.getName()); } } } } } // highlight for (SequenceI seq : ssmMap.keySet()) { StructureSelectionManager ssm = ssmMap.get(seq); if (ssm == null) { continue; } Console.debug("Highlighting sequence '" + seq.getName() + "' at position " + pos); ssm.mouseOverSequence(seq, pos, -1, null, true); } } }