X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSequenceFetcher.java;h=f545e70a29b7c99c0aee46a6d34a8339383b2364;hb=d156987a513b1da92fd6fbf7678b4a8e7ffc8d08;hp=0f3e2f4ac9624bc141b0238500626d3806d98a1a;hpb=0305216f7e9413a20bcca8acba1c8cece34d2cf4;p=jalview.git diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index 0f3e2f4..f545e70 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -26,8 +26,10 @@ import jalview.datamodel.AlignmentI; import jalview.datamodel.DBRefEntry; import jalview.datamodel.SequenceFeature; 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; @@ -43,6 +45,7 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -50,7 +53,6 @@ import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JInternalFrame; import javax.swing.JLabel; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; @@ -77,6 +79,8 @@ public class SequenceFetcher extends JPanel implements Runnable JButton close = new JButton(); + JButton back = new JButton(); + JPanel jPanel1 = new JPanel(); JTextArea textArea = new JTextArea(); @@ -115,8 +119,6 @@ public class SequenceFetcher extends JPanel implements Runnable private static Thread initingThread = null; - int debounceTrap = 0; - public JTextArea getTextArea() { return textArea; @@ -137,11 +139,10 @@ public class SequenceFetcher extends JPanel implements Runnable { if (guiWindow != null) { - guiWindow - .setProgressBar( - MessageManager - .getString("status.waiting_sequence_database_fetchers_init"), - Thread.currentThread().hashCode()); + guiWindow.setProgressBar( + MessageManager.getString( + "status.waiting_sequence_database_fetchers_init"), + Thread.currentThread().hashCode()); } // initting happening on another thread - so wait around to see if it // finishes. @@ -158,19 +159,17 @@ public class SequenceFetcher extends JPanel implements Runnable } if (guiWindow != null) { - guiWindow - .setProgressBar( - MessageManager - .getString("status.waiting_sequence_database_fetchers_init"), - Thread.currentThread().hashCode()); + guiWindow.setProgressBar( + MessageManager.getString( + "status.waiting_sequence_database_fetchers_init"), + Thread.currentThread().hashCode()); } } - if (sfetch == null - || dasRegistry != Cache.getDasSourceRegistry() + if (sfetch == null || dasRegistry != Cache.getDasSourceRegistry() || lastDasSourceRegistry != (Cache.getDasSourceRegistry() - .getDasRegistryURL() + Cache - .getDasSourceRegistry().getLocalSourceString()) - .hashCode()) + .getDasRegistryURL() + + Cache.getDasSourceRegistry().getLocalSourceString()) + .hashCode()) { _initingFetcher = true; initingThread = Thread.currentThread(); @@ -179,8 +178,9 @@ public class SequenceFetcher extends JPanel implements Runnable */ if (guiWindow != null) { - guiWindow.setProgressBar(MessageManager - .getString("status.init_sequence_database_fetchers"), + guiWindow.setProgressBar( + MessageManager.getString( + "status.init_sequence_database_fetchers"), Thread.currentThread().hashCode()); } dasRegistry = Cache.getDasSourceRegistry(); @@ -191,8 +191,8 @@ public class SequenceFetcher extends JPanel implements Runnable { guiWindow.setProgressBar(null, Thread.currentThread().hashCode()); } - lastDasSourceRegistry = (dasRegistry.getDasRegistryURL() + dasRegistry - .getLocalSourceString()).hashCode(); + lastDasSourceRegistry = (dasRegistry.getDasRegistryURL() + + dasRegistry.getLocalSourceString()).hashCode(); sfetch = sf; _initingFetcher = false; initingThread = null; @@ -202,8 +202,19 @@ public class SequenceFetcher extends JPanel implements Runnable private IProgressIndicator progressIndicator; + private volatile boolean _isConstructing = false; + + private List newAlframes = null; + public SequenceFetcher(IProgressIndicator guiIndic) { + this(guiIndic, null, null); + } + + public SequenceFetcher(IProgressIndicator guiIndic, + final String selectedDb, final String queryString) + { + this._isConstructing = true; this.progressIndicator = guiIndic; final SequenceFetcher us = this; // launch initialiser thread @@ -215,7 +226,8 @@ public class SequenceFetcher extends JPanel implements Runnable { if (getSequenceFetcherSingleton(progressIndicator) != null) { - us.initGui(progressIndicator); + us.initGui(progressIndicator, selectedDb, queryString); + us._isConstructing = false; } else { @@ -224,14 +236,12 @@ public class SequenceFetcher extends JPanel implements Runnable @Override public void run() { - JOptionPane - .showInternalMessageDialog( - Desktop.desktop, - MessageManager - .getString("warn.couldnt_create_sequence_fetcher_client"), - MessageManager - .getString("label.couldnt_create_sequence_fetcher"), - JOptionPane.ERROR_MESSAGE); + JvOptionPane.showInternalMessageDialog(Desktop.desktop, + MessageManager.getString( + "warn.couldnt_create_sequence_fetcher_client"), + MessageManager.getString( + "label.couldnt_create_sequence_fetcher"), + JvOptionPane.ERROR_MESSAGE); } }); @@ -242,6 +252,32 @@ public class SequenceFetcher extends JPanel implements Runnable sf.start(); } + /** + * blocking call which creates a new sequence fetcher panel, configures it and + * presses the OK button with the given database and query. + * + * @param database + * @param query + */ + public static List fetchAndShow(String database, String query) + { + final SequenceFetcher sf = new SequenceFetcher(Desktop.instance, + database, query); + while (sf._isConstructing) + { + try + { + Thread.sleep(50); + } catch (Exception q) + { + return Collections.emptyList(); + } + } + sf.newAlframes = new ArrayList<>(); + sf.run(); + return sf.newAlframes; + } + private class DatabaseAuthority extends DefaultMutableTreeNode { @@ -253,11 +289,58 @@ public class SequenceFetcher extends JPanel implements Runnable }; /** + * initialise the database and query for this fetcher panel + * + * @param selectedDb + * - string that should correspond to a sequence fetcher + * @param queryString + * - string that will be entered in the query dialog + * @return true if UI was configured with valid database and query string + */ + protected boolean setInitialQuery(String selectedDb, String queryString) + { + if (selectedDb == null || selectedDb.trim().length() == 0) + { + return false; + } + try + { + List sp = sfetch.getSourceProxy(selectedDb); + for (DbSourceProxy sourcep : sp) + { + if (sourcep.getTier() == 0) + { + database.selection = Arrays + .asList(new DbSourceProxy[] + { sourcep }); + break; + } + } + if (database.selection == null || database.selection.size() == 0) + { + System.err.println( + "Ignoring fetch parameter db='" + selectedDb + "'"); + return false; + } + textArea.setText(queryString); + } catch (Exception q) + { + System.err.println("Ignoring fetch parameter db='" + selectedDb + + "' and query='" + queryString + "'"); + return false; + } + return true; + } + + /** * called by thread spawned by constructor * * @param guiWindow + * @param queryString + * @param selectedDb */ - private void initGui(IProgressIndicator guiWindow) + private void initGui(IProgressIndicator guiWindow, String selectedDb, + String queryString) { this.guiWindow = guiWindow; if (guiWindow instanceof AlignFrame) @@ -268,7 +351,16 @@ public class SequenceFetcher extends JPanel implements Runnable try { jbInit(); + /* + * configure the UI with any query parameters we were called with + */ + if (!setInitialQuery(selectedDb, queryString)) + { + /* + * none provided, so show the database chooser + */ database.waitForInput(); + } } catch (Exception ex) { ex.printStackTrace(); @@ -288,11 +380,21 @@ public class SequenceFetcher extends JPanel implements Runnable private String getFrameTitle() { - return ((alignFrame == null) ? MessageManager - .getString("label.new_sequence_fetcher") : MessageManager - .getString("label.additional_sequence_fetcher")); + return ((alignFrame == null) + ? MessageManager.getString("label.new_sequence_fetcher") + : MessageManager + .getString("label.additional_sequence_fetcher")); } + GFTSPanel parentFTSframe = null; + /** + * change the buttons so they fit with the FTS panel. + */ + public void embedWithFTSPanel(GFTSPanel toClose) + { + back.setVisible(true); + parentFTSframe = toClose; + } private void jbInit() throws Exception { this.setLayout(borderLayout2); @@ -307,8 +409,8 @@ public class SequenceFetcher extends JPanel implements Runnable replacePunctuation.setHorizontalAlignment(SwingConstants.CENTER); replacePunctuation .setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); - replacePunctuation.setText(MessageManager - .getString("label.replace_commas_semicolons")); + replacePunctuation.setText( + MessageManager.getString("label.replace_commas_semicolons")); ok.setText(MessageManager.getString("action.ok")); ok.addActionListener(new ActionListener() { @@ -337,7 +439,7 @@ public class SequenceFetcher extends JPanel implements Runnable example_actionPerformed(); } }); - close.setText(MessageManager.getString("action.close")); + close.setText(MessageManager.getString("action.cancel")); close.addActionListener(new ActionListener() { @Override @@ -346,6 +448,17 @@ public class SequenceFetcher extends JPanel implements Runnable close_actionPerformed(e); } }); + back.setText(MessageManager.getString("action.back")); + back.addActionListener(new ActionListener() + { + @Override + public void actionPerformed(ActionEvent e) + { + parentFTSframe.btn_back_ActionPerformed(); + } + }); + // back not visible unless embedded + back.setVisible(false); textArea.setFont(JvSwingUtils.getLabelFont()); textArea.setLineWrap(true); textArea.addKeyListener(new KeyAdapter() @@ -361,11 +474,11 @@ public class SequenceFetcher extends JPanel implements Runnable }); jPanel3.setLayout(borderLayout1); borderLayout1.setVgap(5); - jPanel1.add(ok); + jPanel1.add(back); jPanel1.add(example); jPanel1.add(clear); + jPanel1.add(ok); jPanel1.add(close); - jPanel3.add(jPanel2, java.awt.BorderLayout.CENTER); jPanel2.setLayout(borderLayout3); databaseButt = /*database.getDatabaseSelectorButton(); final JButton viewdbs =*/new JButton( @@ -386,7 +499,6 @@ public class SequenceFetcher extends JPanel implements Runnable @Override public void actionPerformed(ActionEvent e) { - debounceTrap++; String currentSelection = database.getSelectedItem(); if (currentSelection == null) { @@ -395,13 +507,11 @@ public class SequenceFetcher extends JPanel implements Runnable showPanel(); - if (currentSelection.equalsIgnoreCase("pdb") - && (database.action == KeyEvent.VK_ENTER || ((debounceTrap % 2) == 0))) + if ("pdb".equalsIgnoreCase(currentSelection)) { pdbSourceAction(); } - else if (currentSelection.equalsIgnoreCase("uniprot") - && (database.action == KeyEvent.VK_ENTER || ((debounceTrap % 2) == 0))) + else if ("uniprot".equalsIgnoreCase(currentSelection)) { uniprotSourceAction(); } @@ -441,6 +551,7 @@ public class SequenceFetcher extends JPanel implements Runnable new UniprotFTSPanel(this); frame.dispose(); } + private void otherSourceAction() { try @@ -450,8 +561,9 @@ public class SequenceFetcher extends JPanel implements Runnable + database.getSelectedSources().size() + " others)" : "")); String eq = database.getExampleQueries(); - dbeg.setText(MessageManager.formatMessage( - "label.example_query_param", new String[] { eq })); + dbeg.setText(MessageManager.formatMessage("label.example_query_param", + new String[] + { eq })); boolean enablePunct = !(eq != null && eq.indexOf(",") > -1); for (DbSourceProxy dbs : database.getSelectedSources()) { @@ -494,6 +606,10 @@ public class SequenceFetcher extends JPanel implements Runnable try { frame.setClosed(true); + if (parentFTSframe!=null) + { + parentFTSframe.btn_cancel_ActionPerformed(); + } } catch (Exception ex) { } @@ -506,7 +622,7 @@ public class SequenceFetcher extends JPanel implements Runnable textArea.setEnabled(false); ok.setEnabled(false); close.setEnabled(false); - + back.setEnabled(false); Thread worker = new Thread(this); worker.start(); } @@ -518,6 +634,7 @@ public class SequenceFetcher extends JPanel implements Runnable textArea.setEnabled(true); ok.setEnabled(true); close.setEnabled(true); + back.setEnabled(parentFTSframe != null); } @Override @@ -533,7 +650,7 @@ public class SequenceFetcher extends JPanel implements Runnable if (replacePunctuation.isEnabled() && replacePunctuation.isSelected()) { empty = new com.stevesoft.pat.Regex( - // replace commas and spaces with a semicolon + // replace commas and spaces with a semicolon "(\\s|[,; ])+", ";"); } else @@ -543,8 +660,8 @@ public class SequenceFetcher extends JPanel implements Runnable } textArea.setText(empty.replaceAll(textArea.getText())); // see if there's anthing to search with - if (!new com.stevesoft.pat.Regex("[A-Za-z0-9_.]").search(textArea - .getText())) + if (!new com.stevesoft.pat.Regex("[A-Za-z0-9_.]") + .search(textArea.getText())) { error += "Please enter a (semi-colon separated list of) database id(s)"; } @@ -557,15 +674,15 @@ public class SequenceFetcher extends JPanel implements Runnable // TODO: Refactor to GUI independent code and write tests. // indicate if successive sources should be merged into one alignment. boolean addToLast = false; - List aresultq = new ArrayList(); - List presultTitle = new ArrayList(); - List presult = new ArrayList(); - List aresult = new ArrayList(); + List aresultq = new ArrayList<>(); + List presultTitle = new ArrayList<>(); + List presult = new ArrayList<>(); + List aresult = new ArrayList<>(); Iterator proxies = database.getSelectedSources() .iterator(); String[] qries; - List nextFetch = Arrays.asList(qries = textArea.getText() - .split(";")); + List nextFetch = Arrays + .asList(qries = textArea.getText().split(";")); Iterator en = Arrays.asList(new String[0]).iterator(); int nqueries = qries.length; @@ -578,20 +695,18 @@ public class SequenceFetcher extends JPanel implements Runnable nqueries = nextFetch.size(); // save the remaining queries in the original array qries = nextFetch.toArray(new String[nqueries]); - nextFetch = new ArrayList(); + nextFetch = new ArrayList<>(); } DbSourceProxy proxy = proxies.next(); try { // update status - guiWindow - .setProgressBar(MessageManager.formatMessage( - "status.fetching_sequence_queries_from", - new String[] { - Integer.valueOf(nqueries).toString(), - proxy.getDbName() }), Thread.currentThread() - .hashCode()); + guiWindow.setProgressBar(MessageManager.formatMessage( + "status.fetching_sequence_queries_from", new String[] + { Integer.valueOf(nqueries).toString(), + proxy.getDbName() }), + Thread.currentThread().hashCode()); if (proxy.getMaximumQueryCount() == 1) { /* @@ -615,8 +730,8 @@ public class SequenceFetcher extends JPanel implements Runnable } } catch (Exception e) { - showErrorMessage("Error retrieving " + textArea.getText() - + " from " + database.getSelectedItem()); + showErrorMessage("Error retrieving " + textArea.getText() + " from " + + database.getSelectedItem()); // error // +="Couldn't retrieve sequences from "+database.getSelectedItem(); System.err.println("Retrieval failed for source ='" @@ -626,9 +741,7 @@ public class SequenceFetcher extends JPanel implements Runnable } catch (OutOfMemoryError e) { showErrorMessage("Out of Memory when retrieving " - + textArea.getText() - + " from " - + database.getSelectedItem() + + textArea.getText() + " from " + database.getSelectedItem() + "\nPlease see the Jalview FAQ for instructions for increasing the memory available to Jalview.\n"); e.printStackTrace(); } catch (Error e) @@ -656,8 +769,8 @@ public class SequenceFetcher extends JPanel implements Runnable while (aresult.size() > 0) { presult.add(aresult.remove(0)); - presultTitle.add(aresultq.remove(0) + " " - + getDefaultRetrievalTitle()); + presultTitle.add( + aresultq.remove(0) + " " + getDefaultRetrievalTitle()); } } else @@ -685,15 +798,17 @@ public class SequenceFetcher extends JPanel implements Runnable presultTitle.add(titl); } } - guiWindow.setProgressBar(MessageManager - .getString("status.finshed_querying"), Thread.currentThread() - .hashCode()); + guiWindow.setProgressBar( + MessageManager.getString("status.finshed_querying"), + Thread.currentThread().hashCode()); } - guiWindow.setProgressBar( - (presult.size() > 0) ? MessageManager - .getString("status.parsing_results") : MessageManager - .getString("status.processing"), Thread.currentThread() - .hashCode()); + guiWindow + .setProgressBar( + (presult.size() > 0) + ? MessageManager + .getString("status.parsing_results") + : MessageManager.getString("status.processing"), + Thread.currentThread().hashCode()); // process results while (presult.size() > 0) { @@ -706,8 +821,9 @@ public class SequenceFetcher extends JPanel implements Runnable { StringBuffer sb = new StringBuffer(); sb.append("Didn't retrieve the following " - + (nextFetch.size() == 1 ? "query" : nextFetch.size() - + " queries") + ": \n"); + + (nextFetch.size() == 1 ? "query" + : nextFetch.size() + " queries") + + ": \n"); int l = sb.length(), lr = 0; for (String s : nextFetch) { @@ -742,11 +858,10 @@ public class SequenceFetcher extends JPanel implements Runnable */ void fetchMultipleAccessions(DbSourceProxy proxy, Iterator accessions, List aresultq, - List aresult, List nextFetch) - throws Exception + List aresult, List nextFetch) throws Exception { StringBuilder multiacc = new StringBuilder(); - List tosend = new ArrayList(); + List tosend = new ArrayList<>(); while (accessions.hasNext()) { String nel = accessions.next(); @@ -818,8 +933,9 @@ public class SequenceFetcher extends JPanel implements Runnable indres = proxy.getSequenceRecords(accession); } catch (OutOfMemoryError oome) { - new OOMWarning("fetching " + accession + " from " - + proxy.getDbName(), oome, this); + new OOMWarning( + "fetching " + accession + " from " + proxy.getDbName(), + oome, this); } if (indres != null) { @@ -829,9 +945,8 @@ public class SequenceFetcher extends JPanel implements Runnable } } catch (Exception e) { - Cache.log.info( - "Error retrieving " + accession - + " from " + proxy.getDbName(), e); + Cache.log.info("Error retrieving " + accession + " from " + + proxy.getDbName(), e); } return success; } @@ -890,7 +1005,7 @@ public class SequenceFetcher extends JPanel implements Runnable } AlignmentI parseResult(AlignmentI al, String title, - String currentFileFormat, + FileFormatI currentFileFormat, FeatureSettingsModelI preferredFeatureColours) { @@ -918,15 +1033,11 @@ public class SequenceFetcher extends JPanel implements Runnable { for (SequenceI sq : alsqs) { - if ((sfs = sq.getSequenceFeatures()) != null) + if (sq.getFeatures().hasFeatures()) { - if (sfs.length > 0) - { - af.setShowSeqFeatures(true); - break; - } + af.setShowSeqFeatures(true); + break; } - } } @@ -938,7 +1049,10 @@ public class SequenceFetcher extends JPanel implements Runnable { af.hideFeatureColumns(SequenceOntologyI.EXON, false); } - + if (newAlframes != null) + { + newAlframes.add(af); + } Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT); @@ -947,8 +1061,7 @@ public class SequenceFetcher extends JPanel implements Runnable try { - af.setMaximum(Cache.getDefault("SHOW_FULLSCREEN", - false)); + af.setMaximum(Cache.getDefault("SHOW_FULLSCREEN", false)); } catch (Exception ex) { } @@ -969,9 +1082,9 @@ public class SequenceFetcher extends JPanel implements Runnable @Override public void run() { - JOptionPane.showInternalMessageDialog(Desktop.desktop, error, + JvOptionPane.showInternalMessageDialog(Desktop.desktop, error, MessageManager.getString("label.error_retrieving_data"), - JOptionPane.WARNING_MESSAGE); + JvOptionPane.WARNING_MESSAGE); } }); } @@ -1003,4 +1116,9 @@ public class SequenceFetcher extends JPanel implements Runnable { frame.setVisible(false); } + + public void setDatabaseChooserVisible(boolean b) + { + databaseButt.setVisible(b); + } }