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.bin.Cache;
+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;
private String MY_PATH = "TEST";
+ private static String viewgene = "viewgene";
+
+ private static String highlight = "highlight";
+
+ private HashMap<String, Thread> threadMap = new HashMap<>();
+
+ private HashMap<String, AlignFrame> 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
{
dumpRequest(request);
- 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);
- String viewgene = "viewgene";
- if (pathInfo.startsWith("/" + viewgene + "/"))
+ try // debugging try -- remove later!
{
-
- 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);
-
- String db = DBRefUtils.getCanonicalName("ensembl");
- Desktop desktop = Desktop.instance;
- SequenceFetcher sf = new SequenceFetcher(desktop, db, ensemblId);
- sf.ok_actionPerformed();
-
+ 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);
+ }
+ } catch (Exception e)
+ {
+ Cache.warn(Cache.getStackTraceString(e));
}
}
*/
package jalview.gui;
-import jalview.api.FeatureSettingsModelI;
-import jalview.bin.Cache;
-import jalview.datamodel.AlignmentI;
-import jalview.datamodel.DBRefEntry;
-import jalview.datamodel.SequenceI;
-import jalview.fts.core.GFTSPanel;
-import jalview.fts.service.pdb.PDBFTSPanel;
-import jalview.fts.service.uniprot.UniprotFTSPanel;
-import jalview.io.FileFormatI;
-import jalview.io.gff.SequenceOntologyI;
-import jalview.util.DBRefUtils;
-import jalview.util.MessageManager;
-import jalview.util.Platform;
-import jalview.ws.seqfetcher.DbSourceProxy;
-
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JTextArea;
import javax.swing.SwingConstants;
+import jalview.api.FeatureSettingsModelI;
+import jalview.bin.Cache;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.DBRefEntry;
+import jalview.datamodel.SequenceI;
+import jalview.fts.core.GFTSPanel;
+import jalview.fts.service.pdb.PDBFTSPanel;
+import jalview.fts.service.uniprot.UniprotFTSPanel;
+import jalview.io.FileFormatI;
+import jalview.io.gff.SequenceOntologyI;
+import jalview.util.DBRefUtils;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
+import jalview.ws.seqfetcher.DbSourceProxy;
+
/**
* A panel where the use may choose a database source, and enter one or more
* accessions, to retrieve entries from the database.
volatile boolean _isConstructing = false;
+ private boolean closeDialog = false;
+
+ // set to true to close the fetch sequence dialog window after completion
+ public void closeDialog(boolean c)
+ {
+ closeDialog = c;
+ }
+
/**
* Returns the shared instance of the SequenceFetcher client
*
frame = new JInternalFrame();
frame.setContentPane(this);
- Desktop.addInternalFrame(frame, getFrameTitle(), true, 400,
- Platform.isAMacAndNotJS() ? 240 : 180);
+ Desktop.addInternalFrame(frame, getFrameTitle(), true, 400,
+ Platform.isAMacAndNotJS() ? 240 : 180);
}
private String getFrameTitle()
*/
public void ok_actionPerformed()
{
+ ok_actionPerformed(false);
+ }
+
+ public Thread ok_actionPerformed(boolean returnThread)
+ {
/*
* tidy inputs and check there is something to search for
*/
text = text.replace(",", ";");
}
text = text.replaceAll("(\\s|[; ])+", ";");
- if (!t0.equals(text))
+ if (!t0.equals(text))
{
- textArea.setText(text);
+ textArea.setText(text);
}
if (text.isEmpty())
{
showErrorMessage(
"Please enter a (semi-colon separated list of) database id(s)");
resetDialog();
- return;
+ return null;
}
if (database.getSelectedIndex() == 0)
{
// todo i18n
showErrorMessage("Please choose a database");
resetDialog();
- return;
+ return null;
}
exampleBtn.setEnabled(false);
Thread worker = new Thread(this);
worker.start();
+ return returnThread ? worker : null;
}
private void resetDialog()
showErrorMessage(sb.toString());
}
resetDialog();
+ if (closeDialog)
+ {
+ close_actionPerformed(null);
+ }
+ }
+
+ // ability to access the alignframe created/used in run+parseResult
+ private boolean saveAlignFrame = false;
+
+ private String savedAlignFrameId = null;
+
+ private Map savedAlignFrames = null;
+
+ public void saveAlignFrame(String id, Map map)
+ {
+ saveAlignFrame = true;
+ savedAlignFrameId = id;
+ savedAlignFrames = map;
+ }
+
+ public void resetSavedAlignFrames()
+ {
+ saveAlignFrame = false;
+ savedAlignFrameId = null;
+ savedAlignFrames = null;
}
/**
for (String q : queries)
{
- // BH 2019.01.25 dbr is never used.
-// DBRefEntry dbr = new DBRefEntry();
-// dbr.setSource(proxy.getDbSource());
-// dbr.setVersion(null);
+ // BH 2019.01.25 dbr is never used.
+ // DBRefEntry dbr = new DBRefEntry();
+ // dbr.setSource(proxy.getDbSource());
+ // dbr.setVersion(null);
String accId = proxy.getAccessionIdFromQuery(q);
-// dbr.setAccessionId(accId);
+ // dbr.setAccessionId(accId);
boolean rfound = false;
for (int r = 0, nr = rs.length; r < nr; r++)
{
{
AlignFrame af = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH,
AlignFrame.DEFAULT_HEIGHT);
+ if (saveAlignFrame && savedAlignFrames != null)
+ {
+ savedAlignFrames.put(savedAlignFrameId, af);
+ }
if (currentFileFormat != null)
{
af.currentFileFormat = currentFileFormat;
}
else
{
+ if (saveAlignFrame && savedAlignFrames != null)
+ {
+ savedAlignFrames.put(savedAlignFrameId, alignFrame);
+ }
alignFrame.viewport.addAlignment(al, title);
}
}