From 994985c6ff0ea1ebadb8e184e8090dbb780e3c10 Mon Sep 17 00:00:00 2001 From: jprocter Date: Fri, 20 Apr 2012 16:52:28 +0100 Subject: [PATCH] JAL-1064 - refactor to iterate over many sources associated with a database authority --- src/jalview/ws/DBRefFetcher.java | 215 +++++++++-------- src/jalview/ws/SequenceFetcher.java | 286 ++++++++++++----------- src/jalview/ws/seqfetcher/ASequenceFetcher.java | 256 ++++++++++++-------- 3 files changed, 420 insertions(+), 337 deletions(-) diff --git a/src/jalview/ws/DBRefFetcher.java b/src/jalview/ws/DBRefFetcher.java index 9565679..a919b9e 100644 --- a/src/jalview/ws/DBRefFetcher.java +++ b/src/jalview/ws/DBRefFetcher.java @@ -35,6 +35,7 @@ import jalview.ws.dbsources.das.api.jalviewSourceI; import java.lang.reflect.Array; import java.util.Enumeration; import java.util.Hashtable; +import java.util.List; import java.util.StringTokenizer; import java.util.Vector; @@ -295,24 +296,16 @@ public class DBRefFetcher implements Runnable { int maxqlen = 1; // default number of queries made to at one time System.err.println("Verifying against " + dbSources[db]); - jalview.ws.seqfetcher.DbSourceProxy dbsource = sfetcher + boolean dn = false; + List srcs = sfetcher .getSourceProxy(dbSources[db]); - if (dbsource == null) + if (srcs == null) { System.err.println("No proxy for " + dbSources[db]); db++; continue; } - if (dbsource.getDbSourceProperties() - .containsKey(DBRefSource.MULTIACC)) - { - maxqlen = ((Integer) dbsource.getDbSourceProperties().get( - DBRefSource.MULTIACC)).intValue(); - } - else - { - maxqlen = 1; - } + // iterate through db for each remaining un-verified sequence SequenceI[] currSeqs = new SequenceI[sdataset.size()]; sdataset.copyInto(currSeqs);// seqs that are to be validated against @@ -322,116 +315,132 @@ public class DBRefFetcher implements Runnable int seqIndex = 0; - while (queries.size() > 0 || seqIndex < currSeqs.length) + for (jalview.ws.seqfetcher.DbSourceProxy dbsource : srcs) { - if (queries.size() > 0) + // 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 + if (dbsource.getDbSourceProperties().containsKey( + DBRefSource.MULTIACC)) { - // Still queries to make for current seqIndex - StringBuffer queryString = new StringBuffer(""); - int numq = 0, nqSize = (maxqlen > queries.size()) ? queries - .size() : maxqlen; - - while (queries.size() > 0 && numq < nqSize) + maxqlen = ((Integer) dbsource.getDbSourceProperties().get( + DBRefSource.MULTIACC)).intValue(); + } + else + { + maxqlen = 1; + } + while (queries.size() > 0 || seqIndex < currSeqs.length) + { + if (queries.size() > 0) { - String query = (String) queries.elementAt(0); - if (dbsource.isValidReference(query)) + // Still queries to make for current seqIndex + StringBuffer queryString = new StringBuffer(""); + int numq = 0, nqSize = (maxqlen > queries.size()) ? queries + .size() : maxqlen; + + while (queries.size() > 0 && numq < nqSize) { - queryString.append((numq == 0) ? "" : dbsource - .getAccessionSeparator()); - queryString.append(query); - numq++; + String query = (String) queries.elementAt(0); + if (dbsource.isValidReference(query)) + { + queryString.append((numq == 0) ? "" : dbsource + .getAccessionSeparator()); + queryString.append(query); + numq++; + } + // remove the extracted query string + queries.removeElementAt(0); } - // remove the extracted query string - queries.removeElementAt(0); - } - // make the queries and process the response - AlignmentI retrieved = null; - try - { - if (jalview.bin.Cache.log.isDebugEnabled()) + // make the queries and process the response + AlignmentI retrieved = null; + try + { + if (jalview.bin.Cache.log.isDebugEnabled()) + { + jalview.bin.Cache.log.debug("Querying " + + dbsource.getDbName() + " with : '" + + queryString.toString() + "'"); + } + retrieved = dbsource.getSequenceRecords(queryString + .toString()); + } catch (Exception ex) { - jalview.bin.Cache.log.debug("Querying " - + dbsource.getDbName() + " with : '" - + queryString.toString() + "'"); + ex.printStackTrace(); + } catch (OutOfMemoryError err) + { + new OOMWarning("retrieving database references (" + + queryString.toString() + ")", err); + } + if (retrieved != null) + { + transferReferences(sdataset, dbSources[db], retrieved); } - retrieved = dbsource.getSequenceRecords(queryString.toString()); - } catch (Exception ex) - { - ex.printStackTrace(); - } catch (OutOfMemoryError err) - { - new OOMWarning("retrieving database references (" - + queryString.toString() + ")", err); - } - if (retrieved != null) - { - transferReferences(sdataset, dbSources[db], retrieved); } - } - else - { - // make some more strings for use as queries - for (int i = 0; (seqIndex < dataset.length) && (i < 50); seqIndex++, i++) + else { - SequenceI sequence = dataset[seqIndex]; - DBRefEntry[] uprefs = jalview.util.DBRefUtils.selectRefs( - sequence.getDBRef(), new String[] - { dbSources[db] }); // jalview.datamodel.DBRefSource.UNIPROT - // }); - // check for existing dbrefs to use - if (uprefs != null && uprefs.length > 0) + // make some more strings for use as queries + for (int i = 0; (seqIndex < dataset.length) && (i < 50); seqIndex++, i++) { - for (int j = 0; j < uprefs.length; j++) + SequenceI sequence = dataset[seqIndex]; + DBRefEntry[] uprefs = jalview.util.DBRefUtils.selectRefs( + sequence.getDBRef(), new String[] + { dbSources[db] }); // jalview.datamodel.DBRefSource.UNIPROT + // }); + // check for existing dbrefs to use + if (uprefs != null && uprefs.length > 0) { - addSeqId(sequence, uprefs[j].getAccessionId()); - queries.addElement(uprefs[j].getAccessionId().toUpperCase()); + for (int j = 0; j < uprefs.length; j++) + { + addSeqId(sequence, uprefs[j].getAccessionId()); + queries.addElement(uprefs[j].getAccessionId() + .toUpperCase()); + } } - } - else - { - // generate queries from sequence ID string - StringTokenizer st = new StringTokenizer(sequence.getName(), - "|"); - while (st.hasMoreTokens()) + else { - String token = st.nextToken(); - UPEntry[] presp = null; - if (picrClient != null) + // generate queries from sequence ID string + StringTokenizer st = new StringTokenizer( + sequence.getName(), "|"); + while (st.hasMoreTokens()) { - // resolve the string against PICR to recover valid IDs - try + String token = st.nextToken(); + UPEntry[] presp = null; + if (picrClient != null) { - presp = picrClient - .getUPIForAccession(token, null, - picrClient.getMappedDatabaseNames(), - null, true); - } catch (Exception e) + // resolve the string against PICR to recover valid IDs + try + { + presp = picrClient.getUPIForAccession(token, null, + picrClient.getMappedDatabaseNames(), null, + true); + } catch (Exception e) + { + System.err.println("Exception with Picr for '" + + token + "'\n"); + e.printStackTrace(); + } + } + if (presp != null && presp.length > 0) { - System.err.println("Exception with Picr for '" + token - + "'\n"); - e.printStackTrace(); + for (int id = 0; id < presp.length; id++) + { + // construct sequences from response if sequences are + // present, and do a transferReferences + // otherwise transfer non sequence x-references directly. + } + System.out + .println("Validated ID against PICR... (for what its worth):" + + token); + addSeqId(sequence, token); + queries.addElement(token.toUpperCase()); } - } - if (presp != null && presp.length > 0) - { - for (int id = 0; id < presp.length; id++) + else { - // construct sequences from response if sequences are - // present, and do a transferReferences - // otherwise transfer non sequence x-references directly. + // if () + // System.out.println("Not querying source with token="+token+"\n"); + addSeqId(sequence, token); + queries.addElement(token.toUpperCase()); } - System.out - .println("Validated ID against PICR... (for what its worth):" - + token); - addSeqId(sequence, token); - queries.addElement(token.toUpperCase()); - } - else - { - // if () - // System.out.println("Not querying source with token="+token+"\n"); - addSeqId(sequence, token); - queries.addElement(token.toUpperCase()); } } } diff --git a/src/jalview/ws/SequenceFetcher.java b/src/jalview/ws/SequenceFetcher.java index d5b3d11..077ce14 100644 --- a/src/jalview/ws/SequenceFetcher.java +++ b/src/jalview/ws/SequenceFetcher.java @@ -72,20 +72,23 @@ public class SequenceFetcher extends ASequenceFetcher ArrayList dassrc = new ArrayList(), nondas = new ArrayList(); for (int i = 0; i < srcs.length; i++) { - String nm = getSourceProxy(srcs[i]).getDbName(); - if (getSourceProxy(srcs[i]) instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource) + for (DbSourceProxy dbs : getSourceProxy(srcs[i])) { - if (nm.startsWith("das:")) + String nm = dbs.getDbName(); + if (getSourceProxy(srcs[i]) instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource) { - nm = nm.substring(4); + if (nm.startsWith("das:")) + { + nm = nm.substring(4); + } + dassrc.add(new String[] + { srcs[i], nm.toUpperCase() }); + } + else + { + nondas.add(new String[] + { srcs[i], nm.toUpperCase() }); } - dassrc.add(new String[] - { srcs[i], nm.toUpperCase() }); - } - else - { - nondas.add(new String[] - { srcs[i], nm.toUpperCase() }); } } Object[] sorted = nondas.toArray(); @@ -97,6 +100,8 @@ public class SequenceFetcher extends ASequenceFetcher } jalview.util.QuickSort.sort(tosort, sorted); int i = 0; + // construct array with all sources listed + srcs = new String[sorted.length + dassrc.size()]; for (int j = sorted.length - 1; j >= 0; j--, i++) { srcs[i] = ((String[]) sorted[j])[0]; @@ -133,27 +138,32 @@ public class SequenceFetcher extends ASequenceFetcher + "If given two arguments, SequenceFetcher will try to find the DbFetcher corresponding to and retrieve from it."; if (argv != null && argv.length > 0) { - DbSourceProxy sp = new SequenceFetcher().getSourceProxy(argv[0]); - if (sp != null) + List sps = new SequenceFetcher() + .getSourceProxy(argv[0]); + + if (sps != null) { - AlignmentI al = null; - try - { - al = sp.getSequenceRecords(argv[1]); - } catch (Exception e) + for (DbSourceProxy sp : sps) { - e.printStackTrace(); - System.err.println("Error when retrieving " + argv[1] + " from " - + argv[0] + "\nUsage: " + usage); - } - SequenceI[] prod = al.getSequencesArray(); - if (al != null) - { - for (int p = 0; p < prod.length; p++) + AlignmentI al = null; + try + { + al = sp.getSequenceRecords(argv[1]); + } catch (Exception e) { - System.out.println("Prod " + p + ": " - + prod[p].getDisplayId(true) + " : " - + prod[p].getDescription()); + e.printStackTrace(); + System.err.println("Error when retrieving " + argv[1] + + " from " + argv[0] + "\nUsage: " + usage); + } + SequenceI[] prod = al.getSequencesArray(); + if (al != null) + { + for (int p = 0; p < prod.length; p++) + { + System.out.println("Prod " + p + ": " + + prod[p].getDisplayId(true) + " : " + + prod[p].getDescription()); + } } } return; @@ -165,6 +175,7 @@ public class SequenceFetcher extends ASequenceFetcher + new SequenceFetcher().getSupportedDb()); } System.out.println(usage); + return; } ASequenceFetcher sfetcher = new SequenceFetcher(); String[] dbSources = sfetcher.getSupportedDb(); @@ -174,135 +185,141 @@ public class SequenceFetcher extends ASequenceFetcher // skip me if (db.equals(DBRefSource.PDB)) continue; - DbSourceProxy sp = sfetcher.getSourceProxy(db); - System.out.println("Source: " + sp.getDbName() + " (" + db - + "): retrieving test:" + sp.getTestQuery()); - AlignmentI al = null; - try + for (DbSourceProxy sp : sfetcher.getSourceProxy(db)) { - al = sp.getSequenceRecords(sp.getTestQuery()); - if (al != null && al.getHeight() > 0 - && sp.getDbSourceProperties() != null) + System.out.println("Source: " + sp.getDbName() + " (" + db + + "): retrieving test:" + sp.getTestQuery()); + AlignmentI al = null; + try { - boolean dna = sp.getDbSourceProperties().containsKey( - DBRefSource.DNACODINGSEQDB) - || sp.getDbSourceProperties().containsKey( - DBRefSource.DNASEQDB) - || sp.getDbSourceProperties().containsKey( - DBRefSource.CODINGSEQDB); - // try and find products - String types[] = jalview.analysis.CrossRef.findSequenceXrefTypes( - dna, al.getSequencesArray()); - if (types != null) + al = sp.getSequenceRecords(sp.getTestQuery()); + if (al != null && al.getHeight() > 0 + && sp.getDbSourceProperties() != null) { - System.out.println("Xref Types for: " + (dna ? "dna" : "prot")); - for (int t = 0; t < types.length; t++) + boolean dna = sp.getDbSourceProperties().containsKey( + DBRefSource.DNACODINGSEQDB) + || sp.getDbSourceProperties().containsKey( + DBRefSource.DNASEQDB) + || sp.getDbSourceProperties().containsKey( + DBRefSource.CODINGSEQDB); + // try and find products + String types[] = jalview.analysis.CrossRef + .findSequenceXrefTypes(dna, al.getSequencesArray()); + if (types != null) { - System.out.println("Type: " + types[t]); - SequenceI[] prod = jalview.analysis.CrossRef - .findXrefSequences(al.getSequencesArray(), dna, - types[t]).getSequencesArray(); - System.out.println("Found " - + ((prod == null) ? "no" : "" + prod.length) - + " products"); - if (prod != null) + System.out.println("Xref Types for: " + + (dna ? "dna" : "prot")); + for (int t = 0; t < types.length; t++) { - for (int p = 0; p < prod.length; p++) + System.out.println("Type: " + types[t]); + SequenceI[] prod = jalview.analysis.CrossRef + .findXrefSequences(al.getSequencesArray(), dna, + types[t]).getSequencesArray(); + System.out.println("Found " + + ((prod == null) ? "no" : "" + prod.length) + + " products"); + if (prod != null) { - System.out.println("Prod " + p + ": " - + prod[p].getDisplayId(true)); + for (int p = 0; p < prod.length; p++) + { + System.out.println("Prod " + p + ": " + + prod[p].getDisplayId(true)); + } } } } + else + { + noProds.addElement((dna ? new Object[] + { al, al } : new Object[] + { al })); + } + } - else - { - noProds.addElement((dna ? new Object[] - { al, al } : new Object[] - { al })); - } + } catch (Exception ex) + { + System.out.println("ERROR:Failed to retrieve test query."); + ex.printStackTrace(System.out); + } + if (al == null) + { + System.out.println("ERROR:No alignment retrieved."); + StringBuffer raw = sp.getRawRecords(); + if (raw != null) + System.out.println(raw.toString()); + else + System.out.println("ERROR:No Raw results."); } - } catch (Exception ex) - { - System.out.println("ERROR:Failed to retrieve test query."); - ex.printStackTrace(System.out); - } - if (al == null) - { - System.out.println("ERROR:No alignment retrieved."); - StringBuffer raw = sp.getRawRecords(); - if (raw != null) - System.out.println(raw.toString()); else - System.out.println("ERROR:No Raw results."); - } - else - { - System.out.println("Retrieved " + al.getHeight() + " sequences."); - for (int s = 0; s < al.getHeight(); s++) { - SequenceI sq = al.getSequenceAt(s); - while (sq.getDatasetSequence() != null) + System.out.println("Retrieved " + al.getHeight() + " sequences."); + for (int s = 0; s < al.getHeight(); s++) { - sq = sq.getDatasetSequence(); + SequenceI sq = al.getSequenceAt(s); + while (sq.getDatasetSequence() != null) + { + sq = sq.getDatasetSequence(); - } - if (ds == null) - { - ds = new Alignment(new SequenceI[] - { sq }); + } + if (ds == null) + { + ds = new Alignment(new SequenceI[] + { sq }); - } - else - { - ds.addSequence(sq); + } + else + { + ds.addSequence(sq); + } } } - } - System.out.flush(); - System.err.flush(); - - } - if (noProds.size() > 0) - { - Enumeration ts = noProds.elements(); - while (ts.hasMoreElements()) + System.out.flush(); + System.err.flush(); + } + if (noProds.size() > 0) { - Object[] typeSq = (Object[]) ts.nextElement(); - boolean dna = (typeSq.length > 1); - AlignmentI al = (AlignmentI) typeSq[0]; - System.out.println("Trying getProducts for " - + al.getSequenceAt(0).getDisplayId(true)); - System.out.println("Search DS Xref for: " + (dna ? "dna" : "prot")); - // have a bash at finding the products amongst all the retrieved - // sequences. - SequenceI[] seqs = al.getSequencesArray(); - Alignment prodal = jalview.analysis.CrossRef.findXrefSequences( - seqs, dna, null, ds); - System.out.println("Found " - + ((prodal == null) ? "no" : "" + prodal.getHeight()) - + " products"); - if (prodal != null) + Enumeration ts = noProds.elements(); + while (ts.hasMoreElements()) + { - SequenceI[] prod = prodal.getSequencesArray(); // note - // should - // test - // rather - // than - // throw - // away - // codon - // mapping - // (if - // present) - for (int p = 0; p < prod.length; p++) + Object[] typeSq = (Object[]) ts.nextElement(); + boolean dna = (typeSq.length > 1); + AlignmentI al = (AlignmentI) typeSq[0]; + System.out.println("Trying getProducts for " + + al.getSequenceAt(0).getDisplayId(true)); + System.out.println("Search DS Xref for: " + + (dna ? "dna" : "prot")); + // have a bash at finding the products amongst all the retrieved + // sequences. + SequenceI[] seqs = al.getSequencesArray(); + Alignment prodal = jalview.analysis.CrossRef.findXrefSequences( + seqs, dna, null, ds); + System.out.println("Found " + + ((prodal == null) ? "no" : "" + prodal.getHeight()) + + " products"); + if (prodal != null) { - System.out.println("Prod " + p + ": " - + prod[p].getDisplayId(true)); + SequenceI[] prod = prodal.getSequencesArray(); // note + // should + // test + // rather + // than + // throw + // away + // codon + // mapping + // (if + // present) + for (int p = 0; p < prod.length; p++) + { + System.out.println("Prod " + p + ": " + + prod[p].getDisplayId(true)); + } } } + } } @@ -317,7 +334,8 @@ public class SequenceFetcher extends ASequenceFetcher { // TODO: define a context as a registry provider (either desktop, // jalview.bin.cache, or something else). - for (jalviewSourceI source : jalview.bin.Cache.getDasSourceRegistry().getSources()) + for (jalviewSourceI source : jalview.bin.Cache.getDasSourceRegistry() + .getSources()) { if (source.isSequenceSource()) { diff --git a/src/jalview/ws/seqfetcher/ASequenceFetcher.java b/src/jalview/ws/seqfetcher/ASequenceFetcher.java index d4bcfe8..c63e148 100644 --- a/src/jalview/ws/seqfetcher/ASequenceFetcher.java +++ b/src/jalview/ws/seqfetcher/ASequenceFetcher.java @@ -18,10 +18,17 @@ 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.Enumeration; +import java.util.HashSet; import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Stack; import java.util.Vector; public class ASequenceFetcher @@ -30,7 +37,7 @@ public class ASequenceFetcher /** * set of databases we can retrieve entries from */ - protected Hashtable FETCHABLEDBS; + protected Hashtable> FETCHABLEDBS; public ASequenceFetcher() { @@ -75,120 +82,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)) { - 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()) + 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()) + { + 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 - { - // create a fetcher and go to it - seqset = fetcher.getSequenceRecords(qsb.toString()); - } catch (Exception ex) + DbSourceProxy fetcher = fetchers.next(); + boolean doMultiple = fetcher.getAccessionSeparator() != null; // No + // separator + // - no + // Multiple + // Queries + while (!queriesLeft.isEmpty()) { - 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) { - 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) @@ -206,6 +229,26 @@ 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 * @@ -214,9 +257,9 @@ public class ASequenceFetcher * 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 = FETCHABLEDBS.get(db); return dbs; } @@ -268,15 +311,22 @@ public class ASequenceFetcher { if (FETCHABLEDBS == null) { - FETCHABLEDBS = new Hashtable(); + FETCHABLEDBS = new Hashtable>(); } - FETCHABLEDBS.put(proxy.getDbSource(), proxy); + List slist = FETCHABLEDBS.get(proxy.getDbSource()); + if (slist == null) + { + FETCHABLEDBS.put(proxy.getDbSource(), + slist = new ArrayList()); + } + slist.add(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 @@ -284,12 +334,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; @@ -319,10 +373,12 @@ 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)) { - src.addElement(dbn); + if (class1.isAssignableFrom(dbp.getClass())) + { + src.addElement(dbn); + } } } if (src.size() > 0) -- 1.7.10.2