package jalview.gbtest; import java.io.IOException; import java.io.PrintWriter; import java.net.BindException; import java.net.URI; import java.util.HashMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jalview.analysis.SeqsetUtils; import jalview.bin.Cache; import jalview.datamodel.AlignmentI; import jalview.datamodel.SearchResults; import jalview.datamodel.SequenceI; import jalview.gui.AlignFrame; import jalview.gui.Desktop; import jalview.gui.SeqPanel; import jalview.gui.SequenceFetcher; import jalview.httpserver.AbstractRequestHandler; import jalview.structure.SelectionSource; import jalview.structure.VamsasSource; import jalview.util.DBRefUtils; public class TestListener extends AbstractRequestHandler implements SelectionSource, VamsasSource { private String MY_PATH = "TEST"; private static String viewgene = "viewgene"; private static String highlight = "highlight"; private HashMap threadMap = new HashMap<>(); private HashMap alignFrames = new HashMap<>(); /** * Constructor that registers this as an Http request handler on path * /chimeraN, where N is incremented for each instance. Call getUri to get the * resulting URI for this handler. * * @param chimeraBinding * @throws BindException * if no free port can be assigned */ public TestListener() throws BindException { setPath(MY_PATH); registerHandler(); } @Override protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException { dumpRequest(request); try // debugging try -- remove later! { URI reqUri = URI.create(request.getRequestURI()); Cache.warn("*** request.getRequestURI()=" + request.getRequestURI()); Cache.warn("*** reqUri=" + reqUri.toASCIIString()); Cache.warn( "*** request.getContextPath()=" + request.getContextPath()); Cache.warn("*** request.getPathInfo()=" + request.getPathInfo()); String pathInfo = request.getPathInfo(); Cache.warn("*** pathInfo=" + pathInfo); if (pathInfo.startsWith("/" + viewgene + "/")) { String temp = pathInfo.substring(viewgene.length() + 2); String ensemblId = temp.indexOf("/") > -1 ? temp.substring(0, temp.indexOf("/")) : temp; Cache.warn("*** temp=" + temp); Cache.warn("*** ensemblId=" + ensemblId); // Check whether this ensembl search has already been started // and hasn't finished. StringBuilder idSB = new StringBuilder(); // Commenting out HttpSession -- there's no SessionManager (causes // Exception) // HttpSession session = request.getSession(true); // idSB.append(session == null ? "NOSESSION" : session.getId()); idSB.append(MY_PATH); idSB.append("::"); // idSB.append(viewgene); // idSB.append("::"); idSB.append(ensemblId); String id = request.getParameter("id") == null ? idSB.toString() : request.getParameter("id"); Thread worker = threadMap.get(id); if (worker == null) { String db = DBRefUtils.getCanonicalName("ensembl"); Desktop desktop = Desktop.instance; SequenceFetcher sf = new SequenceFetcher(desktop, db, ensemblId); sf.closeDialog(true); sf.saveAlignFrame(id, alignFrames); worker = sf.ok_actionPerformed(true); threadMap.put(id, worker); } AlignFrame af = alignFrames.get(id); PrintWriter pw = response.getWriter(); pw.println("id=" + id); pw.println("state=" + worker.getState().toString()); pw.println("alignframe=" + (af == null ? null : af.getTitle())); if (af != null) { } } else if (pathInfo.startsWith("/" + highlight + "/")) { String temp = pathInfo.substring(highlight.length() + 2); String id = temp.indexOf("/") > -1 ? temp.substring(0, temp.indexOf("/")) : temp; AlignFrame af = alignFrames.get(id); Cache.warn("*** temp=" + temp); Cache.warn("*** id=" + id); PrintWriter pw = response.getWriter(); pw.println("id=" + id); pw.println("state=" + threadMap.get(id).getState().toString()); pw.println("alignframe=" + (af == null ? null : af.getTitle())); if (af == null) { pw.println("error=alignframe not ready"); return; } String startS = request.getParameter("start"); String endS = request.getParameter("end"); int start = 0; int end = -1; if (startS != null || endS != null) { try { start = Integer.parseInt(startS); end = Integer.parseInt(endS); } catch (NumberFormatException e) { Cache.warn(Cache.getStackTraceString(e)); pw.println("error=couldn't parse start and end"); return; } } pw.println("start=" + start); pw.println("end=" + end); SeqPanel seqPanel = af.alignPanel.getSeqPanel(); SequenceI[] seqs = af.getViewport().getSequenceSelection(); SequenceI seq = seqs.length > 0 ? seqs[0] : null; SearchResults sr = new SearchResults(); sr.addResult(seq, start, end); seqPanel.highlightSequence(sr); } else if (pathInfo.startsWith("/ensembl/")) { String temp = pathInfo.substring("/ensembl/".length()); String id = temp.indexOf("/") > -1 ? temp.substring(0, temp.indexOf("/")) : temp; // id is an ensembl gene ID - we look through our alignFrames to find a sequence SequenceI ensDatasetSeq = null; AlignFrame af=null; // ideally Desktop.getDataSets() to find all datasets with this one.. for (AlignFrame _af: alignFrames.values()) { AlignmentI ds = _af.getCurrentView().getAlignment().getDataset(); if ((ensDatasetSeq = ds.findName(id)) !=null) { af = _af; break; } } if (ensDatasetSeq!=null) { Cache.warn("*** temp=" + temp); Cache.warn("*** id=" + id); PrintWriter pw = response.getWriter(); pw.println("id=" + id); pw.println("alignframe=" + (af == null ? null : af.getTitle())); if (af == null) { pw.println("error=alignframe not ready"); return; } String startS = request.getParameter("start"); String endS = request.getParameter("end"); int start = 0; int end = -1; if (startS != null || endS != null) { try { if (startS!=null) { start = Integer.parseInt(startS); } if (endS!=null) { end = Integer.parseInt(endS); } } catch (NumberFormatException e) { Cache.warn(Cache.getStackTraceString(e)); pw.println("error=couldn't parse start and end"); return; } } pw.println("start=" + start); pw.println("end=" + end); // highlight start for now af.getCurrentView().getStructureSelectionManager().mouseOverVamsasSequence(ensDatasetSeq, start, this); } } } catch (Exception e) { Cache.warn(Cache.getStackTraceString(e)); } } /** * Returns a display name for this service */ @Override public String getName() { return "TestListener"; } }