X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FSequenceFetcher.java;h=43c9d424b715e4c7359fb84f64d9a622c5a04b4c;hb=a45774ee31d9f35d4eff46d54d7deab719afb092;hp=ccd0f7226cd5a236ed3284d9f050f406af163af5;hpb=506d60f0e188723ddc91c26824b41ac7034df3fe;p=jalview.git diff --git a/src/jalview/gui/SequenceFetcher.java b/src/jalview/gui/SequenceFetcher.java index ccd0f72..43c9d42 100755 --- a/src/jalview/gui/SequenceFetcher.java +++ b/src/jalview/gui/SequenceFetcher.java @@ -1,20 +1,19 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4) - * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, 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 - * of the License, or (at your option) any later version. + * This file is part of Jalview. * - * 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 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. * - * 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 + * 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 Jalview. If not, see . */ package jalview.gui; @@ -59,20 +58,54 @@ public class SequenceFetcher extends JPanel implements Runnable private static String 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 + * @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( + "Waiting for Sequence Database Fetchers to initialise", + 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( + "Waiting for Sequence Database Fetchers to initialise", + Thread.currentThread().hashCode()); + } + } if (sfetch == null || dasRegistry != DasSourceBrowser.getDasRegistryURL()) { + _initingFetcher = true; + initingThread = Thread.currentThread(); /** * give a visual indication that sequence fetcher construction is occuring */ @@ -89,7 +122,8 @@ public class SequenceFetcher extends JPanel implements Runnable Thread.currentThread().hashCode()); } sfetch = sf; - + _initingFetcher = false; + initingThread = null; } return sfetch; } @@ -177,11 +211,11 @@ public class SequenceFetcher extends JPanel implements Runnable frame.setContentPane(this); if (new jalview.util.Platform().isAMac()) { - Desktop.addInternalFrame(frame, getFrameTitle(), 400, 180); + Desktop.addInternalFrame(frame, getFrameTitle(), 400, 240); } else { - Desktop.addInternalFrame(frame, getFrameTitle(), 400, 140); + Desktop.addInternalFrame(frame, getFrameTitle(), 400, 180); } } @@ -195,12 +229,16 @@ public class SequenceFetcher extends JPanel implements Runnable { this.setLayout(borderLayout2); - database.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); + database.setFont(JvSwingUtils.getLabelFont()); dbeg.setFont(new java.awt.Font("Verdana", Font.BOLD, 11)); jLabel1.setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); jLabel1.setHorizontalAlignment(SwingConstants.CENTER); - jLabel1 - .setText("Separate multiple accession ids with semi colon \";\""); + jLabel1.setText("Separate multiple accession ids with semi colon \";\""); + + replacePunctuation.setHorizontalAlignment(SwingConstants.CENTER); + replacePunctuation + .setFont(new java.awt.Font("Verdana", Font.ITALIC, 11)); + replacePunctuation.setText("Replace commas with semi-colons"); ok.setText("OK"); ok.addActionListener(new ActionListener() { @@ -234,7 +272,7 @@ public class SequenceFetcher extends JPanel implements Runnable close_actionPerformed(e); } }); - textArea.setFont(new java.awt.Font("Verdana", Font.PLAIN, 11)); + textArea.setFont(JvSwingUtils.getLabelFont()); textArea.setLineWrap(true); textArea.addKeyListener(new KeyAdapter() { @@ -263,10 +301,13 @@ public class SequenceFetcher extends JPanel implements Runnable { db = sfetch.getSourceProxy((String) sources.get(database .getSelectedItem())); - dbeg.setText("Example query: " + db.getTestQuery()); + String eq = db.getTestQuery(); + dbeg.setText("Example query: " + eq); + replacePunctuation.setEnabled(!(eq != null && eq.indexOf(",") > -1)); } catch (Exception ex) { dbeg.setText(""); + replacePunctuation.setEnabled(true); } jPanel2.repaint(); } @@ -274,7 +315,10 @@ public class SequenceFetcher extends JPanel implements Runnable dbeg.setText(""); jPanel2.add(database, 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); @@ -310,6 +354,8 @@ public class SequenceFetcher extends JPanel implements Runnable JLabel jLabel1 = new JLabel(); + JCheckBox replacePunctuation = new JCheckBox(); + JButton ok = new JButton(); JButton clear = new JButton(); @@ -372,9 +418,23 @@ public class SequenceFetcher extends JPanel implements Runnable { 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)"; } @@ -384,15 +444,82 @@ public class SequenceFetcher extends JPanel implements Runnable resetDialog(); return; } - AlignmentI aresult = null; + ArrayList aresultq=new ArrayList(); + ArrayList aresult = new ArrayList(); + Object source = database.getSelectedItem(); + Enumeration en = new StringTokenizer(textArea.getText(), ";"); + boolean isAliSource=false; try { - guiWindow.setProgressBar("Fetching Sequences from " - + database.getSelectedItem(), Thread.currentThread() - .hashCode()); - aresult = sfetch.getSourceProxy( - (String) sources.get(database.getSelectedItem())) - .getSequenceRecords(textArea.getText()); + guiWindow.setProgressBar( + "Fetching Sequences from " + database.getSelectedItem(), + Thread.currentThread().hashCode()); + DbSourceProxy proxy = sfetch.getSourceProxy((String) sources + .get(source)); + isAliSource = proxy.isA(DBRefSource.ALIGNMENTDB); + if (proxy.getAccessionSeparator() == null) + { + while (en.hasMoreElements()) + { + String item = (String) en.nextElement(); + try + { + if (aresult != null) + { + try + { + // give the server a chance to breathe + Thread.sleep(5); + } catch (Exception e) + { + // + } + + } + + AlignmentI indres = null; + try + { + indres = proxy.getSequenceRecords(item); + } catch (OutOfMemoryError oome) + { + new OOMWarning("fetching " + item + " from " + + database.getSelectedItem(), oome, this); + } + if (indres != null) + { + aresultq.add(item); + aresult.add(indres); + } + } catch (Exception e) + { + jalview.bin.Cache.log.info("Error retrieving " + item + + " from " + source, e); + } + } + } + else + { + StringBuffer multiacc = new StringBuffer(); + while (en.hasMoreElements()) + { + multiacc.append(en.nextElement()); + if (en.hasMoreElements()) + { + multiacc.append(proxy.getAccessionSeparator()); + } + } + try + { + aresultq.add(multiacc.toString()); + aresult.add(proxy.getSequenceRecords(multiacc.toString())); + } catch (OutOfMemoryError oome) + { + new OOMWarning("fetching " + multiacc + " from " + + database.getSelectedItem(), oome, this); + } + + } } catch (Exception e) { @@ -418,9 +545,24 @@ public class SequenceFetcher extends JPanel implements Runnable + " from " + database.getSelectedItem()); e.printStackTrace(); } - if (aresult != null) + if (aresult != null && aresult.size()>0) { - parseResult(aresult, null, null); + AlignmentI ar=null; + if (isAliSource) { + // new window for each result + while (aresult.size()>0) + { + parseResult(aresult.remove(0), aresultq.remove(0)+" "+getDefaultRetrievalTitle(), null); + } + } else { + // concatenate all results in one window + while (aresult.size()>0) + { + if (ar==null) { ar = aresult.remove(0);} + else { ar.append(aresult.remove(0)); }; + } + parseResult(ar, null, null); + } } // only remove visual delay after we finished parsing. guiWindow.setProgressBar(null, Thread.currentThread().hashCode()); @@ -437,15 +579,15 @@ public class SequenceFetcher extends JPanel implements Runnable * jalview.datamodel.DBRefSource.EMBLCDS : jalview.datamodel.DBRefSource.EMBL; * * StringTokenizer st = new StringTokenizer(textArea.getText(), ";"); - * SequenceI[] seqs = null; while(st.hasMoreTokens()) { EBIFetchClient dbFetch = - * new EBIFetchClient(); String qry = + * SequenceI[] seqs = null; while(st.hasMoreTokens()) { 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()) { efile = - * jalview.datamodel.xdb.embl.EmblFile.getEmblFile(reply); } if (efile!=null) { - * for (Iterator i=efile.getEntries().iterator(); i.hasNext(); ) { EmblEntry + * 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 @@ -465,11 +607,12 @@ public class SequenceFetcher extends JPanel implements Runnable * SequenceI[] seqparts = getPDBFile(query.toUpperCase()); if (seqparts != * null) { if (seqs == null) { seqs = seqparts; } else { SequenceI[] newseqs = * new SequenceI[seqs.length+seqparts.length]; int i=0; for (; i < - * seqs.length; i++) { newseqs[i] = seqs[i]; seqs[i] = null; } for (int j=0;j 0) { if (parseResult(new Alignment(seqs), null, null)!=null) { - * result.append( "# Successfully parsed the PDB File Queries into an + * seqs.length; i++) { newseqs[i] = seqs[i]; seqs[i] = null; } for (int + * j=0;j 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=" + @@ -480,7 +623,8 @@ public class SequenceFetcher extends JPanel implements Runnable * result = null; } } * * if (result == null || result.length() == 0) { showErrorMessage("Error - * retrieving " + textArea.getText() + " from " + database.getSelectedItem()); } + * retrieving " + textArea.getText() + " from " + database.getSelectedItem()); + * } * * resetDialog(); return; } * @@ -527,15 +671,16 @@ public class SequenceFetcher extends JPanel implements Runnable * (entry.getFeature() != null) { e = entry.getFeature().elements(); while * (e.hasMoreElements()) { SequenceFeature sf = (SequenceFeature) * e.nextElement(); sf.setFeatureGroup("Uniprot"); - * al.getSequenceAt(i).getDatasetSequence().addSequenceFeature( sf ); } } } } } + * al.getSequenceAt(i).getDatasetSequence().addSequenceFeature( sf ); } } } } + * } * * 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) { return null; } try { PDBfile pdbfile = new PDBfile(file, + * ebi.fetchDataAsFile("pdb:" + id, "pdb", "raw"). getAbsolutePath(); if (file + * == null) { return null; } try { PDBfile pdbfile = new PDBfile(file, * jalview.io.AppletFormatAdapter.FILE); for (int i = 0; i < * pdbfile.chains.size(); i++) { if (chain == null || ( (PDBChain) * pdbfile.chains.elementAt(i)).id. toUpperCase().equals(chain)) { PDBChain @@ -549,16 +694,16 @@ public class SequenceFetcher extends JPanel implements Runnable * 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 + * 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()); } } * * 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 " + + * 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; } * @@ -596,6 +741,13 @@ public class SequenceFetcher extends JPanel implements Runnable return null; } + /** + * + * @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) { @@ -616,9 +768,23 @@ public class SequenceFetcher extends JPanel implements Runnable if (title == null) { - title = "Retrieved from " + database.getSelectedItem(); + title = getDefaultRetrievalTitle(); } + SequenceFeature[] sfs = null; + for (Enumeration sq = al.getSequences().elements(); sq + .hasMoreElements();) + { + if ((sfs = ((SequenceI) sq.nextElement()).getDatasetSequence() + .getSequenceFeatures()) != null) + { + if (sfs.length > 0) + { + af.setShowSeqFeatures(true); + break; + } + } + } Desktop.addInternalFrame(af, title, AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);