From: jprocter Date: Tue, 24 Apr 2012 14:40:37 +0000 (+0100) Subject: JAL-1064 sequence database sources are stored and retrieved as lists associated with... X-Git-Tag: Jalview_2_9~532^2~18 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=63da2b63deab3e31f5dbdf75c9d99b6c5b1b5c63;p=jalview.git JAL-1064 sequence database sources are stored and retrieved as lists associated with each canonical database name rather than assuming 1:1 mapping between string and source instance --- diff --git a/src/jalview/ws/DBRefFetcher.java b/src/jalview/ws/DBRefFetcher.java index a919b9e..1886172 100644 --- a/src/jalview/ws/DBRefFetcher.java +++ b/src/jalview/ws/DBRefFetcher.java @@ -31,8 +31,10 @@ import jalview.gui.Desktop; import jalview.gui.IProgressIndicator; import jalview.gui.OOMWarning; import jalview.ws.dbsources.das.api.jalviewSourceI; +import jalview.ws.seqfetcher.DbSourceProxy; import java.lang.reflect.Array; +import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; @@ -69,7 +71,7 @@ public class DBRefFetcher implements Runnable // The key will be the seq name or accession id of the seq Hashtable seqRefs; - String[] dbSources; + DbSourceProxy[] dbSources; SequenceFetcher sfetcher; @@ -104,7 +106,7 @@ public class DBRefFetcher implements Runnable * @param sources * array of database source strings to query references from */ - public DBRefFetcher(SequenceI[] seqs, AlignFrame af, String[] sources) + public DBRefFetcher(SequenceI[] seqs, AlignFrame af, DbSourceProxy[] sources) { this.af = af; alseqs = new SequenceI[seqs.length]; @@ -125,25 +127,19 @@ public class DBRefFetcher implements Runnable // af.featureSettings_actionPerformed(null); String[] defdb = null, otherdb = sfetcher .getDbInstances(jalview.ws.dbsources.das.datamodel.DasSequenceSource.class); - Vector selsources = new Vector(), dasselsrc = (af.featureSettings != null) ? af.featureSettings + List selsources = new ArrayList(); + Vector dasselsrc = (af.featureSettings != null) ? af.featureSettings .getSelectedSources() : new jalview.gui.DasSourceBrowser() .getSelectedSources(); - Enumeration en = dasselsrc.elements(); + Enumeration en = dasselsrc.elements(); while (en.hasMoreElements()) { - jalviewSourceI src = (jalviewSourceI) en.nextElement(); - selsources.addElement(src.getTitle()); - } - int osel = 0; - for (int o = 0; otherdb != null && o < otherdb.length; o++) - { - if (!selsources.contains(otherdb[o])) + jalviewSourceI src = en.nextElement(); + List sp=src.getSequenceSourceProxies(); + selsources.addAll(sp); + if (sp.size()>1) { - otherdb[o] = null; - } - else - { - osel++; + Cache.log.debug("Added many Db Sources for :"+src.getTitle()); } } // select appropriate databases based on alignFrame context. @@ -155,17 +151,14 @@ public class DBRefFetcher implements Runnable { defdb = DBRefSource.PROTEINDBS; } - // append the selected sequence sources to the default dbs - dbSources = new String[defdb.length + osel]; - System.arraycopy(defdb, 0, dbSources, 0, defdb.length); - for (int o = 0, op = defdb.length; otherdb != null - && o < otherdb.length; o++) - { - if (otherdb[o] != null) - { - dbSources[op++] = otherdb[o]; - } + List srces=new ArrayList(); + for (String ddb:defdb) { + srces.addAll(sfetcher.getSourceProxy(ddb)); } + + // append the selected sequence sources to the default dbs + srces.addAll(selsources); + dbSources = srces.toArray(new DbSourceProxy[0]); } else { @@ -183,15 +176,14 @@ public class DBRefFetcher implements Runnable { if (dbSources == null) { - dbSources = new String[] - {}; + dbSources = new DbSourceProxy[0]; } // append additional sources - String[] otherdb = sfetcher - .getDbInstances(jalview.ws.dbsources.das.datamodel.DasSequenceSource.class); + DbSourceProxy[] otherdb=sfetcher + .getDbSourceProxyInstances(jalview.ws.dbsources.das.datamodel.DasSequenceSource.class); if (otherdb != null && otherdb.length > 0) { - String[] newsrc = new String[dbSources.length + otherdb.length]; + DbSourceProxy[] newsrc = new DbSourceProxy[dbSources.length + otherdb.length]; System.arraycopy(dbSources, 0, newsrc, 0, dbSources.length); System.arraycopy(otherdb, 0, newsrc, dbSources.length, otherdb.length); dbSources = newsrc; @@ -295,16 +287,8 @@ public class DBRefFetcher implements Runnable while (sdataset.size() > 0 && db < dbSources.length) { int maxqlen = 1; // default number of queries made to at one time - System.err.println("Verifying against " + dbSources[db]); + System.err.println("Verifying against " + dbSources[db].getDbName()); boolean dn = false; - List srcs = sfetcher - .getSourceProxy(dbSources[db]); - if (srcs == null) - { - System.err.println("No proxy for " + dbSources[db]); - db++; - continue; - } // iterate through db for each remaining un-verified sequence SequenceI[] currSeqs = new SequenceI[sdataset.size()]; @@ -315,7 +299,7 @@ public class DBRefFetcher implements Runnable int seqIndex = 0; - for (jalview.ws.seqfetcher.DbSourceProxy dbsource : srcs) + jalview.ws.seqfetcher.DbSourceProxy dbsource = dbSources[db]; { // for moment, we dumbly iterate over all retrieval sources for a particular database // TODO: introduce multithread multisource queries and logic to remove a query from other sources if any source for a database returns a record @@ -373,7 +357,7 @@ public class DBRefFetcher implements Runnable } if (retrieved != null) { - transferReferences(sdataset, dbSources[db], retrieved); + transferReferences(sdataset, dbsource.getDbSource(), retrieved); } } else @@ -384,7 +368,7 @@ public class DBRefFetcher implements Runnable SequenceI sequence = dataset[seqIndex]; DBRefEntry[] uprefs = jalview.util.DBRefUtils.selectRefs( sequence.getDBRef(), new String[] - { dbSources[db] }); // jalview.datamodel.DBRefSource.UNIPROT + { dbsource.getDbSource() }); // jalview.datamodel.DBRefSource.UNIPROT // }); // check for existing dbrefs to use if (uprefs != null && uprefs.length > 0) diff --git a/src/jalview/ws/seqfetcher/ASequenceFetcher.java b/src/jalview/ws/seqfetcher/ASequenceFetcher.java index c63e148..d4501d8 100644 --- a/src/jalview/ws/seqfetcher/ASequenceFetcher.java +++ b/src/jalview/ws/seqfetcher/ASequenceFetcher.java @@ -23,11 +23,13 @@ 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; @@ -37,7 +39,7 @@ public class ASequenceFetcher /** * set of databases we can retrieve entries from */ - protected Hashtable> FETCHABLEDBS; + protected Hashtable> FETCHABLEDBS; public ASequenceFetcher() { @@ -259,7 +261,26 @@ public class ASequenceFetcher */ public List getSourceProxy(String db) { - List dbs = 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; } @@ -311,15 +332,15 @@ public class ASequenceFetcher { if (FETCHABLEDBS == null) { - FETCHABLEDBS = new Hashtable>(); + FETCHABLEDBS = new Hashtable>(); } - List slist = FETCHABLEDBS.get(proxy.getDbSource()); + Map slist = FETCHABLEDBS.get(proxy.getDbSource()); if (slist == null) { FETCHABLEDBS.put(proxy.getDbSource(), - slist = new ArrayList()); + slist = new Hashtable()); } - slist.add(proxy); + slist.put(proxy.getDbName(),proxy); } } @@ -373,7 +394,7 @@ public class ASequenceFetcher while (dbs.hasMoreElements()) { String dbn = (String) dbs.nextElement(); - for (DbSourceProxy dbp : FETCHABLEDBS.get(dbn)) + for (DbSourceProxy dbp : FETCHABLEDBS.get(dbn).values()) { if (class1.isAssignableFrom(dbp.getClass())) { @@ -387,4 +408,20 @@ public class ASequenceFetcher } 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]); + } + }