X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSequenceFetcher.java;h=af4aa674e04e01e01d36fa7662b4a4d65a25d0cf;hb=ad15cff29620f960119f80176f1fd443da9f6763;hp=53f75a4d4d0016e71e2ac3794a1383d3246776d8;hpb=dbbd8851fe0e30aa9606657b5f4eb41e0db21563;p=jalview.git diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index 53f75a4..af4aa67 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -1,127 +1,206 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.gui; -import java.io.*; import java.util.*; +import java.util.List; import java.awt.*; import java.awt.event.*; import javax.swing.*; +import javax.swing.tree.DefaultMutableTreeNode; + +import com.stevesoft.pat.Regex; -import MCview.*; import jalview.datamodel.*; -import jalview.datamodel.xdb.embl.*; -import java.io.File; import jalview.io.*; -import jalview.ws.DBRefFetcher; -import jalview.ws.ebi.EBIFetchClient; -import jalview.ws.seqfetcher.ASequenceFetcher; +import jalview.util.DBRefUtils; +import jalview.util.MessageManager; +import jalview.ws.dbsources.das.api.DasSourceRegistryI; import jalview.ws.seqfetcher.DbSourceProxy; - -import java.awt.Rectangle; import java.awt.BorderLayout; -import java.awt.Dimension; -public class SequenceFetcher -extends JPanel implements Runnable +public class SequenceFetcher extends JPanel implements Runnable { - // ASequenceFetcher sfetch; + // ASequenceFetcher sfetch; JInternalFrame frame; + IProgressIndicator guiWindow; + AlignFrame alignFrame; + StringBuffer result; + final String noDbSelected = "-- Select Database --"; - Hashtable sources = new Hashtable(); - private static ASequenceFetcher sfetch=null; + + private static jalview.ws.SequenceFetcher sfetch = null; + + private static long lastDasSourceRegistry = -3; + + private static DasSourceRegistryI dasRegistry = null; + + private static boolean _initingFetcher = false; + + private static Thread initingThread = null; + + /** + * Blocking method that initialises and returns the shared instance of the + * SequenceFetcher client + * + * @param guiWindow + * - where the initialisation delay message should be shown + * @return the singleton instance of the sequence fetcher client + */ + public static jalview.ws.SequenceFetcher getSequenceFetcherSingleton( + final IProgressIndicator guiWindow) + { + if (_initingFetcher && initingThread != null && initingThread.isAlive()) + { + if (guiWindow != null) + { + 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. + while (_initingFetcher && initingThread != null + && initingThread.isAlive()) + { + try + { + Thread.sleep(10); + } catch (Exception e) + { + } + ; + } + if (guiWindow != null) + { + guiWindow.setProgressBar( + MessageManager.getString("status.waiting_sequence_database_fetchers_init"), + Thread.currentThread().hashCode()); + } + } + if (sfetch == null + || dasRegistry != jalview.bin.Cache.getDasSourceRegistry() + || lastDasSourceRegistry != (jalview.bin.Cache + .getDasSourceRegistry().getDasRegistryURL() + jalview.bin.Cache + .getDasSourceRegistry().getLocalSourceString()) + .hashCode()) + { + _initingFetcher = true; + initingThread = Thread.currentThread(); + /** + * give a visual indication that sequence fetcher construction is occuring + */ + if (guiWindow != null) + { + guiWindow.setProgressBar(MessageManager.getString("status.init_sequence_database_fetchers"), + Thread.currentThread().hashCode()); + } + dasRegistry = jalview.bin.Cache.getDasSourceRegistry(); + dasRegistry.refreshSources(); + + jalview.ws.SequenceFetcher sf = new jalview.ws.SequenceFetcher(); + if (guiWindow != null) + { + guiWindow.setProgressBar(MessageManager.getString("status.init_sequence_database_fetchers"), + Thread.currentThread().hashCode()); + } + lastDasSourceRegistry = (dasRegistry.getDasRegistryURL() + dasRegistry + .getLocalSourceString()).hashCode(); + sfetch = sf; + _initingFetcher = false; + initingThread = null; + } + return sfetch; + } + public SequenceFetcher(IProgressIndicator guiIndic) { - final IProgressIndicator guiWindow = guiIndic; - final SequenceFetcher us = this; - // launch initialiser thread - Thread sf = new Thread(new Runnable() { + final IProgressIndicator guiWindow = guiIndic; + final SequenceFetcher us = this; + // launch initialiser thread + Thread sf = new Thread(new Runnable() + { - public void run() + @Override + public void run() + { + if (getSequenceFetcherSingleton(guiWindow) != null) { - if (sfetch==null) + us.initGui(guiWindow); + } + else + { + javax.swing.SwingUtilities.invokeLater(new Runnable() { - /** - * give a visual indication that sequence fetcher construction is occuring - */ - if ( guiWindow!=null ) - { - guiWindow.setProgressBar("Initialising Sequence Database Fetchers", this.hashCode()); - } - ASequenceFetcher sf = new jalview.ws.SequenceFetcher(); - if ( guiWindow!=null ) + @Override + public void run() { - guiWindow.setProgressBar("Initialising Sequence Database Fetchers", this.hashCode()); + JOptionPane + .showInternalMessageDialog( + Desktop.desktop, + MessageManager.getString("warn.couldnt_create_sequence_fetcher_client"), + MessageManager.getString("label.couldnt_create_sequence_fetcher"), + JOptionPane.ERROR_MESSAGE); } - sfetch = sf; - - } - us.initGui(guiWindow); + }); + + // raise warning dialog } - }); - sf.start(); + } + }); + sf.start(); } + + private class DatabaseAuthority extends DefaultMutableTreeNode + { + + }; + + private class DatabaseSource extends DefaultMutableTreeNode + { + + }; + /** * called by thread spawned by constructor + * * @param guiWindow */ - private void initGui(IProgressIndicator guiWindow) { + private void initGui(IProgressIndicator guiWindow) + { this.guiWindow = guiWindow; if (guiWindow instanceof AlignFrame) { alignFrame = (AlignFrame) guiWindow; } - - database.addItem(noDbSelected); - /* - * Dynamically generated database list - * will need a translation function from - * internal source to externally distinct names. - * UNIPROT and UP_NAME are identical DB sources, - * and should be collapsed. - */ - - String dbs[] = sfetch.getSupportedDb(); - for (int i=0; i 1 ? " (and " + + database.getSelectedSources().size() + + " others)" : "")); + String eq = database.getExampleQueries(); + dbeg.setText(MessageManager.formatMessage( + "label.example_query_param", new String[] + { eq })); + boolean enablePunct = !(eq != null && eq.indexOf(",") > -1); + for (DbSourceProxy dbs : database.getSelectedSources()) + { + if (dbs instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource) + { + enablePunct = false; + break; + } + } + replacePunctuation.setEnabled(enablePunct); + } catch (Exception ex) { dbeg.setText(""); + replacePunctuation.setEnabled(true); } jPanel2.repaint(); } }); dbeg.setText(""); - jPanel2.add(database, java.awt.BorderLayout.NORTH); + jPanel2.add(databaseButt, java.awt.BorderLayout.NORTH); jPanel2.add(dbeg, java.awt.BorderLayout.CENTER); - jPanel2.add(jLabel1, java.awt.BorderLayout.SOUTH); + JPanel jPanel2a = new JPanel(new BorderLayout()); + jPanel2a.add(jLabel1, java.awt.BorderLayout.NORTH); + jPanel2a.add(replacePunctuation, java.awt.BorderLayout.SOUTH); + jPanel2.add(jPanel2a, java.awt.BorderLayout.SOUTH); // jPanel2.setPreferredSize(new Dimension()) jPanel3.add(jScrollPane1, java.awt.BorderLayout.CENTER); this.add(jPanel1, java.awt.BorderLayout.SOUTH); this.add(jPanel3, java.awt.BorderLayout.CENTER); - this.add(jPanel2,java.awt.BorderLayout.NORTH); + this.add(jPanel2, java.awt.BorderLayout.NORTH); jScrollPane1.getViewport().add(textArea); - } + protected void example_actionPerformed() { - DbSourceProxy db=null; - try { - db = sfetch.getSourceProxy((String)sources.get(database.getSelectedItem())); - textArea.setText(db.getTestQuery()); + DbSourceProxy db = null; + try + { + textArea.setText(database.getExampleQueries()); } catch (Exception ex) { } @@ -252,36 +364,57 @@ extends JPanel implements Runnable textArea.setText(""); jPanel3.repaint(); } + JLabel dbeg = new JLabel(); - JComboBox database = new JComboBox(); + + JDatabaseTree database; + + JButton databaseButt; + JLabel jLabel1 = new JLabel(); + + JCheckBox replacePunctuation = new JCheckBox(); + JButton ok = new JButton(); + JButton clear = new JButton(); + JButton example = new JButton(); + JButton close = new JButton(); + JPanel jPanel1 = new JPanel(); + JTextArea textArea = new JTextArea(); + JScrollPane jScrollPane1 = new JScrollPane(); + JPanel jPanel2 = new JPanel(); + JPanel jPanel3 = new JPanel(); + JPanel jPanel4 = new JPanel(); - + BorderLayout borderLayout1 = new BorderLayout(); + BorderLayout borderLayout2 = new BorderLayout(); + BorderLayout borderLayout3 = new BorderLayout(); + public void close_actionPerformed(ActionEvent e) { try { frame.setClosed(true); + } catch (Exception ex) + { } - catch (Exception ex) - {} } public void ok_actionPerformed() { - database.setEnabled(false); + databaseButt.setEnabled(false); + example.setEnabled(false); textArea.setEnabled(false); ok.setEnabled(false); close.setEnabled(false); @@ -292,22 +425,38 @@ extends JPanel implements Runnable private void resetDialog() { - database.setEnabled(true); + databaseButt.setEnabled(true); + example.setEnabled(true); textArea.setEnabled(true); ok.setEnabled(true); close.setEnabled(true); } + @Override public void run() { String error = ""; - if (database.getSelectedItem().equals(noDbSelected)) + if (!database.hasSelection()) { error += "Please select the source database\n"; } - com.stevesoft.pat.Regex empty = new com.stevesoft.pat.Regex("\\s+", ""); + // TODO: make this transformation more configurable + com.stevesoft.pat.Regex empty; + if (replacePunctuation.isEnabled() && replacePunctuation.isSelected()) + { + empty = new com.stevesoft.pat.Regex( + // replace commas and spaces with a semicolon + "(\\s|[,; ])+", ";"); + } + else + { + // just turn spaces and semicolons into single semicolons + empty = new com.stevesoft.pat.Regex("(\\s|[; ])+", ";"); + } textArea.setText(empty.replaceAll(textArea.getText())); - if (textArea.getText().length() == 0) + // see if there's anthing to search with + 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)"; } @@ -317,339 +466,267 @@ extends JPanel implements Runnable resetDialog(); return; } - AlignmentI aresult=null; - try { - guiWindow.setProgressBar("Fetching Sequences from "+database.getSelectedItem(), Thread.currentThread().hashCode()); - aresult = sfetch.getSourceProxy((String)sources.get(database.getSelectedItem())) - .getSequenceRecords(textArea.getText()); - - } - catch (Exception e) - { - showErrorMessage("Error retrieving " + textArea.getText() - + " from " + database.getSelectedItem()); - //error +="Couldn't retrieve sequences from "+database.getSelectedItem(); - System.err.println("Retrieval failed for source ='"+database.getSelectedItem()+"' and query\n'"+textArea.getText()+"'\n"); - e.printStackTrace(); - } - catch (OutOfMemoryError e) - { - showErrorMessage("Out of Memory when retrieving " + 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) - { - showErrorMessage("Serious Error retrieving " + textArea.getText() - + " from " + database.getSelectedItem()); - e.printStackTrace(); - } - guiWindow.setProgressBar(null, Thread.currentThread().hashCode()); - if (aresult!=null) - { - parseResult(aresult, null, null); - } - resetDialog(); - } - /* - result = new StringBuffer(); - if (database.getSelectedItem().equals("Uniprot")) - { - getUniprotFile(textArea.getText()); - } - else if (database.getSelectedItem().equals("EMBL") - || database.getSelectedItem().equals("EMBLCDS")) - { - String DBRefSource = database.getSelectedItem().equals("EMBLCDS") - ? jalview.datamodel.DBRefSource.EMBLCDS - : jalview.datamodel.DBRefSource.EMBL; + // indicate if successive sources should be merged into one alignment. + boolean addToLast = false; + ArrayList aresultq = new ArrayList(), presultTitle = new ArrayList(); + ArrayList presult = new ArrayList(), aresult = new ArrayList(); + Iterator proxies = database.getSelectedSources() + .iterator(); + String[] qries; + List nextfetch = Arrays.asList(qries = textArea.getText() + .split(";")); + Iterator en = Arrays.asList(new String[0]).iterator(); + int nqueries = qries.length; + while (proxies.hasNext() && (en.hasNext() || nextfetch.size() > 0)) + { + if (!en.hasNext() && nextfetch.size() > 0) + { + en = nextfetch.iterator(); + nqueries = nextfetch.size(); + // save the remaining queries in the original array + qries = nextfetch.toArray(new String[nqueries]); + nextfetch = new ArrayList(); + } - StringTokenizer st = new StringTokenizer(textArea.getText(), ";"); - SequenceI[] seqs = null; - while(st.hasMoreTokens()) + DbSourceProxy proxy = proxies.next(); + boolean isAliSource = false; + try { - EBIFetchClient dbFetch = new EBIFetchClient(); - String qry = database.getSelectedItem().toString().toLowerCase( - ) + ":" + st.nextToken(); - File reply = dbFetch.fetchDataAsFile( - qry, - "emblxml",null); - - jalview.datamodel.xdb.embl.EmblFile efile=null; - if (reply != null && reply.exists()) + // update status + guiWindow.setProgressBar(MessageManager.formatMessage("status.fetching_sequence_queries_from", new String[]{Integer.valueOf(nqueries).toString(),proxy.getDbName()}), Thread + .currentThread().hashCode()); + isAliSource = proxy.isA(DBRefSource.ALIGNMENTDB); + if (proxy.getAccessionSeparator() == null) { - efile = jalview.datamodel.xdb.embl.EmblFile.getEmblFile(reply); - } - if (efile!=null) { - for (Iterator i=efile.getEntries().iterator(); i.hasNext(); ) { - EmblEntry entry = (EmblEntry) i.next(); - SequenceI[] seqparts = entry.getSequences(false,true, DBRefSource); - if (seqparts!=null) { - SequenceI[] newseqs = null; - int si=0; - if (seqs==null) { - newseqs = new SequenceI[seqparts.length]; - } else { - newseqs = new SequenceI[seqs.length+seqparts.length]; - - for (;si0) { - if (parseResult(new Alignment(seqs), null, null)!=null) + else { - result.append("# Successfully parsed the "+database.getSelectedItem()+" Queries into an Alignment"); - } - } - } - else if (database.getSelectedItem().equals("PDB")) - { - StringTokenizer qset = new StringTokenizer(textArea.getText(), ";"); - String query; - SequenceI[] seqs = null; - while (qset.hasMoreTokens() && ((query = qset.nextToken())!=null)) - { - SequenceI[] seqparts = getPDBFile(query.toUpperCase()); - if (seqparts != null) - { - if (seqs == null) + StringBuffer multiacc = new StringBuffer(); + ArrayList tosend = new ArrayList(); + while (en.hasNext()) { - seqs = seqparts; + String nel = en.next(); + tosend.add(nel); + multiacc.append(nel); + if (en.hasNext()) + { + multiacc.append(proxy.getAccessionSeparator()); + } } - else + try { - SequenceI[] newseqs = new SequenceI[seqs.length+seqparts.length]; - int i=0; - for (; i < seqs.length; i++) + AlignmentI rslt; + SequenceI[] rs; + List nores = new ArrayList(); + rslt = proxy.getSequenceRecords(multiacc.toString()); + if (rslt == null || rslt.getHeight() == 0) { - newseqs[i] = seqs[i]; - seqs[i] = null; + // no results - pass on all queries to next source + nextfetch.addAll(tosend); } - for (int j=0;j 0) + { + dbr.setAccessionId(vgr.stringMatched(1)); + } + else + { + dbr.setAccessionId(vgr.stringMatched()); + } + } + else + { + dbr.setAccessionId(q); + } + boolean rfound = false; + for (int r = 0; r < rs.length; r++) + { + if (rs[r] != null + && (found = DBRefUtils.searchRefs( + rs[r].getDBRef(), dbr)) != null + && found.length > 0) + { + rfound = true; + rs[r] = null; + continue; + } + } + if (!rfound) + { + nextfetch.add(q); + } + } } - seqs=newseqs; + } catch (OutOfMemoryError oome) + { + new OOMWarning("fetching " + multiacc + " from " + + database.getSelectedItem(), oome, this); } - result.append("# Success for "+query.toUpperCase()+"\n"); - } - } - if (seqs != null && seqs.length > 0) - { - if (parseResult(new Alignment(seqs), null, null)!=null) - { - result.append( - "# Successfully parsed the PDB File Queries into an Alignment"); } - } - } - else if( database.getSelectedItem().equals("PFAM")) - { - try - { - result.append(new FastaFile( - "http://www.sanger.ac.uk/cgi-bin/Pfam/getalignment.pl?format=fal&acc=" - + textArea.getText().toUpperCase(), "URL").print() - ); - if(result.length()>0) - { - parseResult( result.toString(), textArea.getText().toUpperCase() ); - } - - } - catch (java.io.IOException ex) + } catch (Exception e) { - result = null; - } - } - - if (result == null || result.length() == 0) - { - showErrorMessage("Error retrieving " + textArea.getText() - + " from " + database.getSelectedItem()); - } - - resetDialog(); - return; - } - - void getUniprotFile(String id) - { - EBIFetchClient ebi = new EBIFetchClient(); - File file = ebi.fetchDataAsFile("uniprot:" + id, "xml", null); - - DBRefFetcher dbref = new DBRefFetcher(); - Vector entries = dbref.getUniprotEntries(file); - - if (entries != null) - { - //First, make the new sequences - Enumeration en = entries.elements(); - while (en.hasMoreElements()) + showErrorMessage("Error retrieving " + textArea.getText() + + " from " + database.getSelectedItem()); + // error + // +="Couldn't retrieve sequences from "+database.getSelectedItem(); + System.err.println("Retrieval failed for source ='" + + database.getSelectedItem() + "' and query\n'" + + textArea.getText() + "'\n"); + e.printStackTrace(); + } catch (OutOfMemoryError e) { - UniprotEntry entry = (UniprotEntry) en.nextElement(); - - StringBuffer name = new StringBuffer(">UniProt/Swiss-Prot"); - Enumeration en2 = entry.getAccession().elements(); - while (en2.hasMoreElements()) - { - name.append("|"); - name.append(en2.nextElement()); - } - en2 = entry.getName().elements(); - while (en2.hasMoreElements()) - { - name.append("|"); - name.append(en2.nextElement()); - } - - if (entry.getProtein() != null) - { - name.append(" " + entry.getProtein().getName().elementAt(0)); - } - - result.append(name + "\n" + entry.getUniprotSequence().getContent() + - "\n"); - + // resets dialog box - so we don't use OOMwarning here. + showErrorMessage("Out of Memory when retrieving " + + 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) + { + showErrorMessage("Serious Error retrieving " + textArea.getText() + + " from " + database.getSelectedItem()); + e.printStackTrace(); } - - //Then read in the features and apply them to the dataset - Alignment al = parseResult(result.toString(), null); - for (int i = 0; i < entries.size(); i++) + // Stack results ready for opening in alignment windows + if (aresult != null && aresult.size() > 0) { - UniprotEntry entry = (UniprotEntry) entries.elementAt(i); - Enumeration e = entry.getDbReference().elements(); - Vector onlyPdbEntries = new Vector(); - while (e.hasMoreElements()) + AlignmentI ar = null; + if (isAliSource) { - PDBEntry pdb = (PDBEntry) e.nextElement(); - if (!pdb.getType().equals("PDB")) + addToLast = false; + // new window for each result + while (aresult.size() > 0) { - continue; + presult.add(aresult.remove(0)); + presultTitle.add(aresultq.remove(0) + " " + + getDefaultRetrievalTitle()); } - - onlyPdbEntries.addElement(pdb); } - - Enumeration en2 = entry.getAccession().elements(); - while (en2.hasMoreElements()) - { - al.getSequenceAt(i).getDatasetSequence().addDBRef(new DBRefEntry( - DBRefSource.UNIPROT, - "0", - en2.nextElement().toString())); - } - - - - - al.getSequenceAt(i).getDatasetSequence().setPDBId(onlyPdbEntries); - if (entry.getFeature() != null) + else { - e = entry.getFeature().elements(); - while (e.hasMoreElements()) + String titl = null; + if (addToLast && presult.size() > 0) { - SequenceFeature sf = (SequenceFeature) e.nextElement(); - sf.setFeatureGroup("Uniprot"); - al.getSequenceAt(i).getDatasetSequence().addSequenceFeature( sf ); + ar = presult.remove(presult.size() - 1); + titl = presultTitle.remove(presultTitle.size() - 1); } + // concatenate all results in one window + while (aresult.size() > 0) + { + if (ar == null) + { + ar = aresult.remove(0); + } + else + { + ar.append(aresult.remove(0)); + } + ; + } + addToLast = true; + presult.add(ar); + presultTitle.add(titl); } } + guiWindow.setProgressBar(MessageManager.getString("status.finshed_querying"), Thread.currentThread() + .hashCode()); } - } - - SequenceI[] getPDBFile(String id) - { - Vector result = new Vector(); - String chain = null; - if (id.indexOf(":") > -1) - { - chain = id.substring(id.indexOf(":") + 1); - id = id.substring(0, id.indexOf(":")); - } - - EBIFetchClient ebi = new EBIFetchClient(); - String file = ebi.fetchDataAsFile("pdb:" + id, "pdb", "raw"). - getAbsolutePath(); - if (file == null) + guiWindow.setProgressBar((presult.size() > 0) ? MessageManager.getString("status.parsing_results") + : MessageManager.getString("status.processing"), Thread.currentThread().hashCode()); + // process results + while (presult.size() > 0) { - return null; + parseResult(presult.remove(0), presultTitle.remove(0), null); } - try - { - PDBfile pdbfile = new PDBfile(file, jalview.io.AppletFormatAdapter.FILE); - for (int i = 0; i < pdbfile.chains.size(); i++) + // only remove visual delay after we finished parsing. + guiWindow.setProgressBar(null, Thread.currentThread().hashCode()); + if (nextfetch.size() > 0) + { + StringBuffer sb = new StringBuffer(); + sb.append("Didn't retrieve the following " + + (nextfetch.size() == 1 ? "query" : nextfetch.size() + + " queries") + ": \n"); + int l = sb.length(), lr = 0; + for (String s : nextfetch) { - if (chain == null || - ( (PDBChain) pdbfile.chains.elementAt(i)).id. - toUpperCase().equals(chain)) + if (l != sb.length()) { - PDBChain pdbchain = (PDBChain) pdbfile.chains.elementAt(i); - // Get the Chain's Sequence - who's dataset includes any special features added from the PDB file - SequenceI sq = pdbchain.sequence; - // Specially formatted name for the PDB chain sequences retrieved from the PDB - sq.setName("PDB|"+id+"|"+sq.getName()); - // Might need to add more metadata to the PDBEntry object - // like below - /* - * PDBEntry entry = new PDBEntry(); - // Construct the PDBEntry - entry.setId(id); - if (entry.getProperty() == null) - entry.setProperty(new Hashtable()); - entry.getProperty().put("chains", - pdbchain.id - + "=" + sq.getStart() - + "-" + sq.getEnd()); - sq.getDatasetSequence().addPDBId(entry); - * - // Add PDB DB Refs - // We make a DBRefEtntry because we have obtained the PDB file from a verifiable source - // JBPNote - PDB DBRefEntry should also carry the chain and mapping information - DBRefEntry dbentry = new DBRefEntry(jalview.datamodel.DBRefSource.PDB, - "0", id + pdbchain.id); - sq.addDBRef(dbentry); - // and add seuqence to the retrieved set - result.addElement(sq.deriveSequence()); + sb.append("; "); } + if (lr - sb.length() > 40) + { + sb.append("\n"); + } + sb.append(s); } - - if (result.size() < 1) - { - throw new Exception("WsDBFetch for PDB id resulted in zero result size"); - } - } - catch (Exception ex) // Problem parsing PDB file - { - jalview.bin.Cache.log.warn("Exception when retrieving " + - textArea.getText() + " from " + - database.getSelectedItem(), ex); - return null; + showErrorMessage(sb.toString()); } + resetDialog(); + } - - SequenceI[] results = new SequenceI[result.size()]; - for (int i = 0, j = result.size(); i < j; i++) - { - results[i] = (SequenceI) result.elementAt(i); - result.setElementAt(null,i); - } - return results; - }*/ AlignmentI parseResult(String result, String title) { String format = new IdentifyFile().Identify(result, "Paste"); @@ -659,72 +736,106 @@ extends JPanel implements Runnable sequences = null; try { - sequences = new FormatAdapter().readFile(result.toString(), "Paste", - format); + sequences = new FormatAdapter().readFile(result.toString(), + "Paste", format); + } catch (Exception ex) + { } - catch (Exception ex) - {} - if (sequences!=null) + if (sequences != null) { return parseResult(sequences, title, format); } } else { - showErrorMessage("Error retrieving " + textArea.getText() - + " from " + database.getSelectedItem()); + showErrorMessage("Error retrieving " + textArea.getText() + " from " + + database.getSelectedItem()); } return null; } - AlignmentI parseResult(AlignmentI al, String title, String currentFileFormat) + /** + * + * @return a standard title for any results retrieved using the currently + * selected source and settings + */ + public String getDefaultRetrievalTitle() + { + return "Retrieved from " + database.getSelectedItem(); + } + + AlignmentI parseResult(AlignmentI al, String title, + String currentFileFormat) { if (al != null && al.getHeight() > 0) { if (alignFrame == null) { - AlignFrame af = new AlignFrame(al, - AlignFrame.DEFAULT_WIDTH, - AlignFrame.DEFAULT_HEIGHT); - if (currentFileFormat!=null) + AlignFrame af = new AlignFrame(al, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); + if (currentFileFormat != null) { - af.currentFileFormat = currentFileFormat; // WHAT IS THE DEFAULT FORMAT FOR NON-FormatAdapter Sourced Alignments? + af.currentFileFormat = currentFileFormat; // WHAT IS THE DEFAULT + // FORMAT FOR + // NON-FormatAdapter Sourced + // Alignments? } - if(title==null) + if (title == null) { - title = "Retrieved from " + database.getSelectedItem(); + title = getDefaultRetrievalTitle(); } + SequenceFeature[] sfs = null; + List alsqs; + synchronized (alsqs = al.getSequences()) + { + for (SequenceI sq : alsqs) + { + if ((sfs = (sq).getDatasetSequence().getSequenceFeatures()) != null) + { + if (sfs.length > 0) + { + af.setShowSeqFeatures(true); + break; + } + } - Desktop.addInternalFrame(af, - title, - AlignFrame.DEFAULT_WIDTH, - AlignFrame.DEFAULT_HEIGHT); + } + } + Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH, + AlignFrame.DEFAULT_HEIGHT); - af.statusBar.setText("Successfully pasted alignment file"); + af.statusBar.setText(MessageManager + .getString("label.successfully_pasted_alignment_file")); try { - af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", false)); + af.setMaximum(jalview.bin.Cache.getDefault("SHOW_FULLSCREEN", + false)); + } catch (Exception ex) + { } - catch (Exception ex) - {} } else { for (int i = 0; i < al.getHeight(); i++) { - alignFrame.viewport.alignment.addSequence(al.getSequenceAt(i)); // this also creates dataset sequence entries + alignFrame.viewport.getAlignment().addSequence( + al.getSequenceAt(i)); // this + // also + // creates + // dataset + // sequence + // entries } - alignFrame.viewport.setEndSeq(alignFrame.viewport.alignment. - getHeight()); - alignFrame.viewport.alignment.getWidth(); + alignFrame.viewport.setEndSeq(alignFrame.viewport.getAlignment() + .getHeight()); + alignFrame.viewport.getAlignment().getWidth(); alignFrame.viewport.firePropertyChange("alignment", null, - alignFrame.viewport. - getAlignment().getSequences()); + alignFrame.viewport.getAlignment().getSequences()); } } return al; @@ -735,13 +846,13 @@ extends JPanel implements Runnable resetDialog(); javax.swing.SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { - JOptionPane.showInternalMessageDialog(Desktop.desktop, - error, "Error Retrieving Data", - JOptionPane.WARNING_MESSAGE); + JOptionPane.showInternalMessageDialog(Desktop.desktop, error, + MessageManager.getString("label.error_retrieving_data"), + JOptionPane.WARNING_MESSAGE); } }); } } -