import jalview.gui.IProgressIndicator;\r
import jalview.gui.OOMWarning;\r
import jalview.ws.dbsources.das.api.jalviewSourceI;\r
+import jalview.ws.seqfetcher.DbSourceProxy;\r
\r
import java.lang.reflect.Array;\r
+import java.util.ArrayList;\r
import java.util.Enumeration;\r
import java.util.Hashtable;\r
import java.util.List;\r
// The key will be the seq name or accession id of the seq\r
Hashtable seqRefs;\r
\r
- String[] dbSources;\r
+ DbSourceProxy[] dbSources;\r
\r
SequenceFetcher sfetcher;\r
\r
* @param sources\r
* array of database source strings to query references from\r
*/\r
- public DBRefFetcher(SequenceI[] seqs, AlignFrame af, String[] sources)\r
+ public DBRefFetcher(SequenceI[] seqs, AlignFrame af, DbSourceProxy[] sources)\r
{\r
this.af = af;\r
alseqs = new SequenceI[seqs.length];\r
// af.featureSettings_actionPerformed(null);\r
String[] defdb = null, otherdb = sfetcher\r
.getDbInstances(jalview.ws.dbsources.das.datamodel.DasSequenceSource.class);\r
- Vector selsources = new Vector(), dasselsrc = (af.featureSettings != null) ? af.featureSettings\r
+ List<DbSourceProxy> selsources = new ArrayList<DbSourceProxy>();\r
+ Vector dasselsrc = (af.featureSettings != null) ? af.featureSettings\r
.getSelectedSources() : new jalview.gui.DasSourceBrowser()\r
.getSelectedSources();\r
- Enumeration en = dasselsrc.elements();\r
+ Enumeration<jalviewSourceI> en = dasselsrc.elements();\r
while (en.hasMoreElements())\r
{\r
- jalviewSourceI src = (jalviewSourceI) en.nextElement();\r
- selsources.addElement(src.getTitle());\r
- }\r
- int osel = 0;\r
- for (int o = 0; otherdb != null && o < otherdb.length; o++)\r
- {\r
- if (!selsources.contains(otherdb[o]))\r
+ jalviewSourceI src = en.nextElement();\r
+ List<DbSourceProxy> sp=src.getSequenceSourceProxies();\r
+ selsources.addAll(sp);\r
+ if (sp.size()>1)\r
{\r
- otherdb[o] = null;\r
- }\r
- else\r
- {\r
- osel++;\r
+ Cache.log.debug("Added many Db Sources for :"+src.getTitle());\r
}\r
}\r
// select appropriate databases based on alignFrame context.\r
{\r
defdb = DBRefSource.PROTEINDBS;\r
}\r
- // append the selected sequence sources to the default dbs\r
- dbSources = new String[defdb.length + osel];\r
- System.arraycopy(defdb, 0, dbSources, 0, defdb.length);\r
- for (int o = 0, op = defdb.length; otherdb != null\r
- && o < otherdb.length; o++)\r
- {\r
- if (otherdb[o] != null)\r
- {\r
- dbSources[op++] = otherdb[o];\r
- }\r
+ List<DbSourceProxy> srces=new ArrayList<DbSourceProxy>();\r
+ for (String ddb:defdb) {\r
+ srces.addAll(sfetcher.getSourceProxy(ddb));\r
}\r
+ \r
+ // append the selected sequence sources to the default dbs\r
+ srces.addAll(selsources);\r
+ dbSources = srces.toArray(new DbSourceProxy[0]);\r
}\r
else\r
{\r
{\r
if (dbSources == null)\r
{\r
- dbSources = new String[]\r
- {};\r
+ dbSources = new DbSourceProxy[0];\r
}\r
// append additional sources\r
- String[] otherdb = sfetcher\r
- .getDbInstances(jalview.ws.dbsources.das.datamodel.DasSequenceSource.class);\r
+ DbSourceProxy[] otherdb=sfetcher\r
+ .getDbSourceProxyInstances(jalview.ws.dbsources.das.datamodel.DasSequenceSource.class);\r
if (otherdb != null && otherdb.length > 0)\r
{\r
- String[] newsrc = new String[dbSources.length + otherdb.length];\r
+ DbSourceProxy[] newsrc = new DbSourceProxy[dbSources.length + otherdb.length];\r
System.arraycopy(dbSources, 0, newsrc, 0, dbSources.length);\r
System.arraycopy(otherdb, 0, newsrc, dbSources.length, otherdb.length);\r
dbSources = newsrc;\r
while (sdataset.size() > 0 && db < dbSources.length)\r
{\r
int maxqlen = 1; // default number of queries made to at one time\r
- System.err.println("Verifying against " + dbSources[db]);\r
+ System.err.println("Verifying against " + dbSources[db].getDbName());\r
boolean dn = false;\r
- List<jalview.ws.seqfetcher.DbSourceProxy> srcs = sfetcher\r
- .getSourceProxy(dbSources[db]);\r
- if (srcs == null)\r
- {\r
- System.err.println("No proxy for " + dbSources[db]);\r
- db++;\r
- continue;\r
- }\r
\r
// iterate through db for each remaining un-verified sequence\r
SequenceI[] currSeqs = new SequenceI[sdataset.size()];\r
\r
int seqIndex = 0;\r
\r
- for (jalview.ws.seqfetcher.DbSourceProxy dbsource : srcs)\r
+ jalview.ws.seqfetcher.DbSourceProxy dbsource = dbSources[db];\r
{\r
// for moment, we dumbly iterate over all retrieval sources for a particular database\r
// TODO: introduce multithread multisource queries and logic to remove a query from other sources if any source for a database returns a record\r
}\r
if (retrieved != null)\r
{\r
- transferReferences(sdataset, dbSources[db], retrieved);\r
+ transferReferences(sdataset, dbsource.getDbSource(), retrieved);\r
}\r
}\r
else\r
SequenceI sequence = dataset[seqIndex];\r
DBRefEntry[] uprefs = jalview.util.DBRefUtils.selectRefs(\r
sequence.getDBRef(), new String[]\r
- { dbSources[db] }); // jalview.datamodel.DBRefSource.UNIPROT\r
+ { dbsource.getDbSource() }); // jalview.datamodel.DBRefSource.UNIPROT\r
// });\r
// check for existing dbrefs to use\r
if (uprefs != null && uprefs.length > 0)\r
import jalview.util.DBRefUtils;\r
\r
import java.util.ArrayList;\r
+import java.util.Collection;\r
import java.util.Enumeration;\r
import java.util.HashSet;\r
import java.util.Hashtable;\r
import java.util.Iterator;\r
import java.util.List;\r
+import java.util.Map;\r
import java.util.Stack;\r
import java.util.Vector;\r
\r
/**\r
* set of databases we can retrieve entries from\r
*/\r
- protected Hashtable<String, List<DbSourceProxy>> FETCHABLEDBS;\r
+ protected Hashtable<String, Map<String, DbSourceProxy>> FETCHABLEDBS;\r
\r
public ASequenceFetcher()\r
{\r
*/\r
public List<DbSourceProxy> getSourceProxy(String db)\r
{\r
- List<DbSourceProxy> dbs = FETCHABLEDBS.get(db);\r
+ List<DbSourceProxy> dbs;\r
+ Collection<DbSourceProxy> dblist = FETCHABLEDBS.get(db).values();\r
+ if (dblist.size()>1)\r
+ {\r
+ DbSourceProxy[] l=dblist.toArray(new DbSourceProxy[0]);\r
+ int i=0;\r
+ String[] nm=new String[l.length];\r
+ for (DbSourceProxy s:l)\r
+ {\r
+ nm[i++]=s.getDbName().toLowerCase();\r
+ }\r
+ jalview.util.QuickSort.sort(nm,l);\r
+ dbs = new ArrayList<DbSourceProxy>();\r
+ for (i=l.length-1;i>=0; i--)\r
+ {\r
+ dbs.add(l[i]);\r
+ }\r
+ } else {\r
+ dbs = new ArrayList<DbSourceProxy>(dblist);\r
+ }\r
return dbs;\r
}\r
\r
{\r
if (FETCHABLEDBS == null)\r
{\r
- FETCHABLEDBS = new Hashtable<String, List<DbSourceProxy>>();\r
+ FETCHABLEDBS = new Hashtable<String, Map<String,DbSourceProxy>>();\r
}\r
- List<DbSourceProxy> slist = FETCHABLEDBS.get(proxy.getDbSource());\r
+ Map<String,DbSourceProxy> slist = FETCHABLEDBS.get(proxy.getDbSource());\r
if (slist == null)\r
{\r
FETCHABLEDBS.put(proxy.getDbSource(),\r
- slist = new ArrayList<DbSourceProxy>());\r
+ slist = new Hashtable<String,DbSourceProxy>());\r
}\r
- slist.add(proxy);\r
+ slist.put(proxy.getDbName(),proxy);\r
}\r
}\r
\r
while (dbs.hasMoreElements())\r
{\r
String dbn = (String) dbs.nextElement();\r
- for (DbSourceProxy dbp : FETCHABLEDBS.get(dbn))\r
+ for (DbSourceProxy dbp : FETCHABLEDBS.get(dbn).values())\r
{\r
if (class1.isAssignableFrom(dbp.getClass()))\r
{\r
}\r
return sources;\r
}\r
+ public DbSourceProxy[] getDbSourceProxyInstances(\r
+ Class class1)\r
+ {\r
+ ArrayList<DbSourceProxy> prlist=new ArrayList<DbSourceProxy>();\r
+ for (String fetchable:getSupportedDb())\r
+ for (DbSourceProxy pr:getSourceProxy(fetchable))\r
+ {\r
+ if (class1.isInstance(pr)) {prlist.add(pr);}\r
+ }\r
+ if (prlist.size()==0)\r
+ {\r
+ return null;\r
+ }\r
+ return prlist.toArray(new DbSourceProxy[0]);\r
+ }\r
+\r
}\r