X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fseqfetcher%2FASequenceFetcher.java;h=d4501d871cfd6521d6845b2419b19e11d9c867de;hb=7a4569721f8419ae7e040fc672421aabb0321e8b;hp=7d2097afd1668b934c1f9c55d32694e2b680b1e9;hpb=2de8acfae59aced665e4c37ad0f7dcc2ed68818e;p=jalview.git
diff --git a/src/jalview/ws/seqfetcher/ASequenceFetcher.java b/src/jalview/ws/seqfetcher/ASequenceFetcher.java
index 7d2097a..d4501d8 100644
--- a/src/jalview/ws/seqfetcher/ASequenceFetcher.java
+++ b/src/jalview/ws/seqfetcher/ASequenceFetcher.java
@@ -1,28 +1,36 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
- * Copyright (C) 2009 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, J Engelhardt, LM Lui, 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.ws.seqfetcher;
import jalview.datamodel.AlignmentI;
+import jalview.datamodel.DBRefEntry;
import jalview.datamodel.SequenceI;
+import jalview.util.DBRefUtils;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Enumeration;
+import java.util.HashSet;
import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Stack;
import java.util.Vector;
public class ASequenceFetcher
@@ -31,7 +39,7 @@ public class ASequenceFetcher
/**
* set of databases we can retrieve entries from
*/
- protected Hashtable FETCHABLEDBS;
+ protected Hashtable> FETCHABLEDBS;
public ASequenceFetcher()
{
@@ -76,120 +84,136 @@ public class ASequenceFetcher
public SequenceI[] getSequences(jalview.datamodel.DBRefEntry[] refs)
{
SequenceI[] ret = null;
- Vector rseqs = new Vector();
- Hashtable queries = new Hashtable();
+ Vector rseqs = new Vector();
+ Hashtable> queries = new Hashtable();
for (int r = 0; r < refs.length; r++)
{
if (!queries.containsKey(refs[r].getSource()))
{
- queries.put(refs[r].getSource(), new Vector());
+ queries.put(refs[r].getSource(), new ArrayList());
}
- Vector qset = (Vector) queries.get(refs[r].getSource());
+ List qset = queries.get(refs[r].getSource());
if (!qset.contains(refs[r].getAccessionId()))
{
- qset.addElement(refs[r].getAccessionId());
+ qset.add(refs[r].getAccessionId());
}
}
- Enumeration e = queries.keys();
+ Enumeration e = queries.keys();
while (e.hasMoreElements())
{
- Vector query = null;
+ List query = null;
String db = null;
- try
+ db = e.nextElement();
+ query = queries.get(db);
+ if (!isFetchable(db))
+ {
+ reportStdError(db, query, new Exception(
+ "Don't know how to fetch from this database :" + db));
+ continue;
+ }
+ Iterator fetchers = getSourceProxy(db).iterator();
+ Stack queriesLeft = new Stack();
+// List queriesFailed = new ArrayList();
+ queriesLeft.addAll(query);
+ while (fetchers.hasNext())
{
- db = (String) e.nextElement();
- query = (Vector) queries.get(db);
- if (!isFetchable(db))
- throw new Exception(
- "Don't know how to fetch from this database :" + db);
- DbSourceProxy fetcher = getSourceProxy(db);
- boolean doMultiple = fetcher.getAccessionSeparator() != null; // No
- // separator
- // - no
- // Multiple
- // Queries
- Enumeration qs = query.elements();
- while (qs.hasMoreElements())
+ List queriesMade = new ArrayList();
+ HashSet queriesFound = new HashSet();
+ try
{
- StringBuffer qsb = new StringBuffer();
- do
- {
- qsb.append((String) qs.nextElement());
- if (qs.hasMoreElements() && doMultiple) // and not reached limit for
- // multiple queries at one
- // time for this source
- {
- qsb.append(fetcher.getAccessionSeparator());
- }
- } while (doMultiple && qs.hasMoreElements());
-
- AlignmentI seqset = null;
- try
+ DbSourceProxy fetcher = fetchers.next();
+ boolean doMultiple = fetcher.getAccessionSeparator() != null; // No
+ // separator
+ // - no
+ // Multiple
+ // Queries
+ while (!queriesLeft.isEmpty())
{
- // create a fetcher and go to it
- seqset = fetcher.getSequenceRecords(qsb.toString());
- } catch (Exception ex)
- {
- System.err.println("Failed to retrieve the following from "
- + db);
- System.err.println(qsb);
- ex.printStackTrace(System.err);
- }
- // TODO: Merge alignment together - perhaps
- if (seqset != null)
- {
- SequenceI seqs[] = seqset.getSequencesArray();
- if (seqs != null)
+ StringBuffer qsb = new StringBuffer();
+ do
{
- for (int is = 0; is < seqs.length; is++)
+ if (qsb.length() > 0)
{
- rseqs.addElement(seqs[is]);
- seqs[is] = null;
+ qsb.append(fetcher.getAccessionSeparator());
}
+ String q = queriesLeft.pop();
+ queriesMade.add(q);
+ qsb.append(q);
+ } while (doMultiple && !queriesLeft.isEmpty());
+
+ AlignmentI seqset = null;
+ try
+ {
+ // create a fetcher and go to it
+ seqset = fetcher.getSequenceRecords(qsb.toString()); // ,
+ // queriesFailed);
+ } catch (Exception ex)
+ {
+ System.err.println("Failed to retrieve the following from "
+ + db);
+ System.err.println(qsb);
+ ex.printStackTrace(System.err);
}
- else
+ // TODO: Merge alignment together - perhaps
+ if (seqset != null)
{
- if (fetcher.getRawRecords() != null)
+ SequenceI seqs[] = seqset.getSequencesArray();
+ if (seqs != null)
+ {
+ for (int is = 0; is < seqs.length; is++)
+ {
+ rseqs.addElement(seqs[is]);
+ DBRefEntry[] frefs = DBRefUtils.searchRefs(seqs[is]
+ .getDBRef(), new DBRefEntry(db, null, null));
+ if (frefs != null)
+ {
+ for (DBRefEntry dbr : frefs)
+ {
+ queriesFound.add(dbr.getAccessionId());
+ queriesMade.remove(dbr.getAccessionId());
+ }
+ }
+ seqs[is] = null;
+ }
+ }
+ else
{
- System.out.println("# Retrieved from " + db + ":"
- + qs.toString());
- StringBuffer rrb = fetcher.getRawRecords();
- /*
- * for (int rr = 0; rr 0)
{
- System.err.print(" " + qv.nextElement() + ";");
- if (n++ > 10)
- {
- System.err.println();
- n = 0;
- }
+ System.out.println("# Adding " + queriesMade.size()
+ + " ids back to queries list for searching again (" + db
+ + ".");
+ queriesLeft.addAll(queriesMade);
}
- System.err.println();
- ex.printStackTrace();
}
}
if (rseqs.size() > 0)
@@ -207,17 +231,56 @@ public class ASequenceFetcher
return ret;
}
+ public void reportStdError(String db, List queriesMade,
+ Exception ex)
+ {
+
+ System.err.println("Failed to retrieve the following references from "
+ + db);
+ int n = 0;
+ for (String qv : queriesMade)
+ {
+ System.err.print(" " + qv + ";");
+ if (n++ > 10)
+ {
+ System.err.println();
+ n = 0;
+ }
+ }
+ System.err.println();
+ ex.printStackTrace();
+ }
+
/**
* Retrieve an instance of the proxy for the given source
*
* @param db
- * database source string TODO: add version string/wildcard for
- * retrieval of specific DB source/version combinations.
+ * database source string TODO: add version string/wildcard for
+ * retrieval of specific DB source/version combinations.
* @return an instance of DbSourceProxy for that db.
*/
- public DbSourceProxy getSourceProxy(String db)
+ public List getSourceProxy(String db)
{
- DbSourceProxy dbs = (DbSourceProxy) FETCHABLEDBS.get(db);
+ List dbs;
+ Collection dblist = FETCHABLEDBS.get(db).values();
+ if (dblist.size()>1)
+ {
+ DbSourceProxy[] l=dblist.toArray(new DbSourceProxy[0]);
+ int i=0;
+ String[] nm=new String[l.length];
+ for (DbSourceProxy s:l)
+ {
+ nm[i++]=s.getDbName().toLowerCase();
+ }
+ jalview.util.QuickSort.sort(nm,l);
+ dbs = new ArrayList();
+ for (i=l.length-1;i>=0; i--)
+ {
+ dbs.add(l[i]);
+ }
+ } else {
+ dbs = new ArrayList(dblist);
+ }
return dbs;
}
@@ -226,11 +289,10 @@ public class ASequenceFetcher
* dbrefsource
*
* @param dbSourceProxy
- * reference for class implementing
- * jalview.ws.seqfetcher.DbSourceProxy
+ * reference for class implementing
+ * jalview.ws.seqfetcher.DbSourceProxy
* @throws java.lang.IllegalArgumentException
- * if class does not implement
- * jalview.ws.seqfetcher.DbSourceProxy
+ * if class does not implement jalview.ws.seqfetcher.DbSourceProxy
*/
protected void addDBRefSourceImpl(Class dbSourceProxy)
throws java.lang.IllegalArgumentException
@@ -270,15 +332,22 @@ public class ASequenceFetcher
{
if (FETCHABLEDBS == null)
{
- FETCHABLEDBS = new Hashtable();
+ FETCHABLEDBS = new Hashtable>();
+ }
+ Map slist = FETCHABLEDBS.get(proxy.getDbSource());
+ if (slist == null)
+ {
+ FETCHABLEDBS.put(proxy.getDbSource(),
+ slist = new Hashtable());
}
- FETCHABLEDBS.put(proxy.getDbSource(), proxy);
+ slist.put(proxy.getDbName(),proxy);
}
}
/**
* test if the database handler for dbName contains the given dbProperty
- *
+ * when a dbName resolves to a set of proxies - this method will return the result of the test for the first instance.
+ * TODO implement additional method to query all sources for a db to find one with a particular property
* @param dbName
* @param dbProperty
* @return true if proxy has the given property
@@ -286,12 +355,16 @@ public class ASequenceFetcher
public boolean hasDbSourceProperty(String dbName, String dbProperty)
{
// TODO: decide if invalidDbName exception is thrown here.
- DbSourceProxy proxy = getSourceProxy(dbName);
- if (proxy != null)
+
+ List proxies = getSourceProxy(dbName);
+ if (proxies != null)
{
- if (proxy.getDbSourceProperties() != null)
+ for (DbSourceProxy proxy : proxies)
{
- return proxy.getDbSourceProperties().containsKey(dbProperty);
+ if (proxy.getDbSourceProperties() != null)
+ {
+ return proxy.getDbSourceProperties().containsKey(dbProperty);
+ }
}
}
return false;
@@ -299,6 +372,7 @@ public class ASequenceFetcher
/**
* select sources which are implemented by instances of the given class
+ *
* @param class that implements DbSourceProxy
* @return null or vector of source names for fetchers
*/
@@ -306,9 +380,11 @@ public class ASequenceFetcher
{
if (!jalview.ws.seqfetcher.DbSourceProxy.class.isAssignableFrom(class1))
{
- throw new Error("Implmentation Error - getDbInstances must be given a class that implements jalview.ws.seqfetcher.DbSourceProxy (was given '"+class1+"')");
+ throw new Error(
+ "Implmentation Error - getDbInstances must be given a class that implements jalview.ws.seqfetcher.DbSourceProxy (was given '"
+ + class1 + "')");
}
- if (FETCHABLEDBS==null)
+ if (FETCHABLEDBS == null)
{
return null;
}
@@ -318,16 +394,34 @@ public class ASequenceFetcher
while (dbs.hasMoreElements())
{
String dbn = (String) dbs.nextElement();
- DbSourceProxy dbp = (DbSourceProxy) FETCHABLEDBS.get(dbn);
- if (class1.isAssignableFrom(dbp.getClass()))
+ for (DbSourceProxy dbp : FETCHABLEDBS.get(dbn).values())
{
- src.addElement(dbn);
+ if (class1.isAssignableFrom(dbp.getClass()))
+ {
+ src.addElement(dbn);
+ }
}
}
- if (src.size()>0)
+ if (src.size() > 0)
{
src.copyInto(sources = new String[src.size()]);
}
return sources;
}
+ public DbSourceProxy[] getDbSourceProxyInstances(
+ Class class1)
+ {
+ ArrayList prlist=new ArrayList();
+ for (String fetchable:getSupportedDb())
+ for (DbSourceProxy pr:getSourceProxy(fetchable))
+ {
+ if (class1.isInstance(pr)) {prlist.add(pr);}
+ }
+ if (prlist.size()==0)
+ {
+ return null;
+ }
+ return prlist.toArray(new DbSourceProxy[0]);
+ }
+
}