JAL-1064 - refactor to iterate over many sources associated with a database authority
authorjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 20 Apr 2012 15:52:28 +0000 (16:52 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Fri, 20 Apr 2012 15:52:28 +0000 (16:52 +0100)
src/jalview/ws/DBRefFetcher.java
src/jalview/ws/SequenceFetcher.java
src/jalview/ws/seqfetcher/ASequenceFetcher.java

index 9565679..a919b9e 100644 (file)
@@ -35,6 +35,7 @@ import jalview.ws.dbsources.das.api.jalviewSourceI;
 import java.lang.reflect.Array;\r
 import java.util.Enumeration;\r
 import java.util.Hashtable;\r
+import java.util.List;\r
 import java.util.StringTokenizer;\r
 import java.util.Vector;\r
 \r
@@ -295,24 +296,16 @@ public class DBRefFetcher implements Runnable
     {\r
       int maxqlen = 1; // default number of queries made to at one time\r
       System.err.println("Verifying against " + dbSources[db]);\r
-      jalview.ws.seqfetcher.DbSourceProxy dbsource = sfetcher\r
+      boolean dn = false;\r
+      List<jalview.ws.seqfetcher.DbSourceProxy> srcs = sfetcher\r
               .getSourceProxy(dbSources[db]);\r
-      if (dbsource == null)\r
+      if (srcs == null)\r
       {\r
         System.err.println("No proxy for " + dbSources[db]);\r
         db++;\r
         continue;\r
       }\r
-      if (dbsource.getDbSourceProperties()\r
-              .containsKey(DBRefSource.MULTIACC))\r
-      {\r
-        maxqlen = ((Integer) dbsource.getDbSourceProperties().get(\r
-                DBRefSource.MULTIACC)).intValue();\r
-      }\r
-      else\r
-      {\r
-        maxqlen = 1;\r
-      }\r
+\r
       // iterate through db for each remaining un-verified sequence\r
       SequenceI[] currSeqs = new SequenceI[sdataset.size()];\r
       sdataset.copyInto(currSeqs);// seqs that are to be validated against\r
@@ -322,116 +315,132 @@ public class DBRefFetcher implements Runnable
 \r
       int seqIndex = 0;\r
 \r
-      while (queries.size() > 0 || seqIndex < currSeqs.length)\r
+      for (jalview.ws.seqfetcher.DbSourceProxy dbsource : srcs)\r
       {\r
-        if (queries.size() > 0)\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
+        if (dbsource.getDbSourceProperties().containsKey(\r
+                DBRefSource.MULTIACC))\r
         {\r
-          // Still queries to make for current seqIndex\r
-          StringBuffer queryString = new StringBuffer("");\r
-          int numq = 0, nqSize = (maxqlen > queries.size()) ? queries\r
-                  .size() : maxqlen;\r
-\r
-          while (queries.size() > 0 && numq < nqSize)\r
+          maxqlen = ((Integer) dbsource.getDbSourceProperties().get(\r
+                  DBRefSource.MULTIACC)).intValue();\r
+        }\r
+        else\r
+        {\r
+          maxqlen = 1;\r
+        }\r
+        while (queries.size() > 0 || seqIndex < currSeqs.length)\r
+        {\r
+          if (queries.size() > 0)\r
           {\r
-            String query = (String) queries.elementAt(0);\r
-            if (dbsource.isValidReference(query))\r
+            // Still queries to make for current seqIndex\r
+            StringBuffer queryString = new StringBuffer("");\r
+            int numq = 0, nqSize = (maxqlen > queries.size()) ? queries\r
+                    .size() : maxqlen;\r
+\r
+            while (queries.size() > 0 && numq < nqSize)\r
             {\r
-              queryString.append((numq == 0) ? "" : dbsource\r
-                      .getAccessionSeparator());\r
-              queryString.append(query);\r
-              numq++;\r
+              String query = (String) queries.elementAt(0);\r
+              if (dbsource.isValidReference(query))\r
+              {\r
+                queryString.append((numq == 0) ? "" : dbsource\r
+                        .getAccessionSeparator());\r
+                queryString.append(query);\r
+                numq++;\r
+              }\r
+              // remove the extracted query string\r
+              queries.removeElementAt(0);\r
             }\r
-            // remove the extracted query string\r
-            queries.removeElementAt(0);\r
-          }\r
-          // make the queries and process the response\r
-          AlignmentI retrieved = null;\r
-          try\r
-          {\r
-            if (jalview.bin.Cache.log.isDebugEnabled())\r
+            // make the queries and process the response\r
+            AlignmentI retrieved = null;\r
+            try\r
+            {\r
+              if (jalview.bin.Cache.log.isDebugEnabled())\r
+              {\r
+                jalview.bin.Cache.log.debug("Querying "\r
+                        + dbsource.getDbName() + " with : '"\r
+                        + queryString.toString() + "'");\r
+              }\r
+              retrieved = dbsource.getSequenceRecords(queryString\r
+                      .toString());\r
+            } catch (Exception ex)\r
             {\r
-              jalview.bin.Cache.log.debug("Querying "\r
-                      + dbsource.getDbName() + " with : '"\r
-                      + queryString.toString() + "'");\r
+              ex.printStackTrace();\r
+            } catch (OutOfMemoryError err)\r
+            {\r
+              new OOMWarning("retrieving database references ("\r
+                      + queryString.toString() + ")", err);\r
+            }\r
+            if (retrieved != null)\r
+            {\r
+              transferReferences(sdataset, dbSources[db], retrieved);\r
             }\r
-            retrieved = dbsource.getSequenceRecords(queryString.toString());\r
-          } catch (Exception ex)\r
-          {\r
-            ex.printStackTrace();\r
-          } catch (OutOfMemoryError err)\r
-          {\r
-            new OOMWarning("retrieving database references ("\r
-                    + queryString.toString() + ")", err);\r
-          }\r
-          if (retrieved != null)\r
-          {\r
-            transferReferences(sdataset, dbSources[db], retrieved);\r
           }\r
-        }\r
-        else\r
-        {\r
-          // make some more strings for use as queries\r
-          for (int i = 0; (seqIndex < dataset.length) && (i < 50); seqIndex++, i++)\r
+          else\r
           {\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
-            // });\r
-            // check for existing dbrefs to use\r
-            if (uprefs != null && uprefs.length > 0)\r
+            // make some more strings for use as queries\r
+            for (int i = 0; (seqIndex < dataset.length) && (i < 50); seqIndex++, i++)\r
             {\r
-              for (int j = 0; j < uprefs.length; j++)\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
+              // });\r
+              // check for existing dbrefs to use\r
+              if (uprefs != null && uprefs.length > 0)\r
               {\r
-                addSeqId(sequence, uprefs[j].getAccessionId());\r
-                queries.addElement(uprefs[j].getAccessionId().toUpperCase());\r
+                for (int j = 0; j < uprefs.length; j++)\r
+                {\r
+                  addSeqId(sequence, uprefs[j].getAccessionId());\r
+                  queries.addElement(uprefs[j].getAccessionId()\r
+                          .toUpperCase());\r
+                }\r
               }\r
-            }\r
-            else\r
-            {\r
-              // generate queries from sequence ID string\r
-              StringTokenizer st = new StringTokenizer(sequence.getName(),\r
-                      "|");\r
-              while (st.hasMoreTokens())\r
+              else\r
               {\r
-                String token = st.nextToken();\r
-                UPEntry[] presp = null;\r
-                if (picrClient != null)\r
+                // generate queries from sequence ID string\r
+                StringTokenizer st = new StringTokenizer(\r
+                        sequence.getName(), "|");\r
+                while (st.hasMoreTokens())\r
                 {\r
-                  // resolve the string against PICR to recover valid IDs\r
-                  try\r
+                  String token = st.nextToken();\r
+                  UPEntry[] presp = null;\r
+                  if (picrClient != null)\r
                   {\r
-                    presp = picrClient\r
-                            .getUPIForAccession(token, null,\r
-                                    picrClient.getMappedDatabaseNames(),\r
-                                    null, true);\r
-                  } catch (Exception e)\r
+                    // resolve the string against PICR to recover valid IDs\r
+                    try\r
+                    {\r
+                      presp = picrClient.getUPIForAccession(token, null,\r
+                              picrClient.getMappedDatabaseNames(), null,\r
+                              true);\r
+                    } catch (Exception e)\r
+                    {\r
+                      System.err.println("Exception with Picr for '"\r
+                              + token + "'\n");\r
+                      e.printStackTrace();\r
+                    }\r
+                  }\r
+                  if (presp != null && presp.length > 0)\r
                   {\r
-                    System.err.println("Exception with Picr for '" + token\r
-                            + "'\n");\r
-                    e.printStackTrace();\r
+                    for (int id = 0; id < presp.length; id++)\r
+                    {\r
+                      // construct sequences from response if sequences are\r
+                      // present, and do a transferReferences\r
+                      // otherwise transfer non sequence x-references directly.\r
+                    }\r
+                    System.out\r
+                            .println("Validated ID against PICR... (for what its worth):"\r
+                                    + token);\r
+                    addSeqId(sequence, token);\r
+                    queries.addElement(token.toUpperCase());\r
                   }\r
-                }\r
-                if (presp != null && presp.length > 0)\r
-                {\r
-                  for (int id = 0; id < presp.length; id++)\r
+                  else\r
                   {\r
-                    // construct sequences from response if sequences are\r
-                    // present, and do a transferReferences\r
-                    // otherwise transfer non sequence x-references directly.\r
+                    // if ()\r
+                    // System.out.println("Not querying source with token="+token+"\n");\r
+                    addSeqId(sequence, token);\r
+                    queries.addElement(token.toUpperCase());\r
                   }\r
-                  System.out\r
-                          .println("Validated ID against PICR... (for what its worth):"\r
-                                  + token);\r
-                  addSeqId(sequence, token);\r
-                  queries.addElement(token.toUpperCase());\r
-                }\r
-                else\r
-                {\r
-                  // if ()\r
-                  // System.out.println("Not querying source with token="+token+"\n");\r
-                  addSeqId(sequence, token);\r
-                  queries.addElement(token.toUpperCase());\r
                 }\r
               }\r
             }\r
index d5b3d11..077ce14 100644 (file)
@@ -72,20 +72,23 @@ public class SequenceFetcher extends ASequenceFetcher
     ArrayList dassrc = new ArrayList(), nondas = new ArrayList();\r
     for (int i = 0; i < srcs.length; i++)\r
     {\r
-      String nm = getSourceProxy(srcs[i]).getDbName();\r
-      if (getSourceProxy(srcs[i]) instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource)\r
+      for (DbSourceProxy dbs : getSourceProxy(srcs[i]))\r
       {\r
-        if (nm.startsWith("das:"))\r
+        String nm = dbs.getDbName();\r
+        if (getSourceProxy(srcs[i]) instanceof jalview.ws.dbsources.das.datamodel.DasSequenceSource)\r
         {\r
-          nm = nm.substring(4);\r
+          if (nm.startsWith("das:"))\r
+          {\r
+            nm = nm.substring(4);\r
+          }\r
+          dassrc.add(new String[]\r
+          { srcs[i], nm.toUpperCase() });\r
+        }\r
+        else\r
+        {\r
+          nondas.add(new String[]\r
+          { srcs[i], nm.toUpperCase() });\r
         }\r
-        dassrc.add(new String[]\r
-        { srcs[i], nm.toUpperCase() });\r
-      }\r
-      else\r
-      {\r
-        nondas.add(new String[]\r
-        { srcs[i], nm.toUpperCase() });\r
       }\r
     }\r
     Object[] sorted = nondas.toArray();\r
@@ -97,6 +100,8 @@ public class SequenceFetcher extends ASequenceFetcher
     }\r
     jalview.util.QuickSort.sort(tosort, sorted);\r
     int i = 0;\r
+    // construct array with all sources listed\r
+    srcs = new String[sorted.length + dassrc.size()];\r
     for (int j = sorted.length - 1; j >= 0; j--, i++)\r
     {\r
       srcs[i] = ((String[]) sorted[j])[0];\r
@@ -133,27 +138,32 @@ public class SequenceFetcher extends ASequenceFetcher
             + "If given two arguments, SequenceFetcher will try to find the DbFetcher corresponding to <DBNAME> and retrieve <ACCNO> from it.";\r
     if (argv != null && argv.length > 0)\r
     {\r
-      DbSourceProxy sp = new SequenceFetcher().getSourceProxy(argv[0]);\r
-      if (sp != null)\r
+      List<DbSourceProxy> sps = new SequenceFetcher()\r
+              .getSourceProxy(argv[0]);\r
+\r
+      if (sps != null)\r
       {\r
-        AlignmentI al = null;\r
-        try\r
-        {\r
-          al = sp.getSequenceRecords(argv[1]);\r
-        } catch (Exception e)\r
+        for (DbSourceProxy sp : sps)\r
         {\r
-          e.printStackTrace();\r
-          System.err.println("Error when retrieving " + argv[1] + " from "\r
-                  + argv[0] + "\nUsage: " + usage);\r
-        }\r
-        SequenceI[] prod = al.getSequencesArray();\r
-        if (al != null)\r
-        {\r
-          for (int p = 0; p < prod.length; p++)\r
+          AlignmentI al = null;\r
+          try\r
+          {\r
+            al = sp.getSequenceRecords(argv[1]);\r
+          } catch (Exception e)\r
           {\r
-            System.out.println("Prod " + p + ": "\r
-                    + prod[p].getDisplayId(true) + " : "\r
-                    + prod[p].getDescription());\r
+            e.printStackTrace();\r
+            System.err.println("Error when retrieving " + argv[1]\r
+                    + " from " + argv[0] + "\nUsage: " + usage);\r
+          }\r
+          SequenceI[] prod = al.getSequencesArray();\r
+          if (al != null)\r
+          {\r
+            for (int p = 0; p < prod.length; p++)\r
+            {\r
+              System.out.println("Prod " + p + ": "\r
+                      + prod[p].getDisplayId(true) + " : "\r
+                      + prod[p].getDescription());\r
+            }\r
           }\r
         }\r
         return;\r
@@ -165,6 +175,7 @@ public class SequenceFetcher extends ASequenceFetcher
                 + new SequenceFetcher().getSupportedDb());\r
       }\r
       System.out.println(usage);\r
+      return;\r
     }\r
     ASequenceFetcher sfetcher = new SequenceFetcher();\r
     String[] dbSources = sfetcher.getSupportedDb();\r
@@ -174,135 +185,141 @@ public class SequenceFetcher extends ASequenceFetcher
       // skip me\r
       if (db.equals(DBRefSource.PDB))\r
         continue;\r
-      DbSourceProxy sp = sfetcher.getSourceProxy(db);\r
-      System.out.println("Source: " + sp.getDbName() + " (" + db\r
-              + "): retrieving test:" + sp.getTestQuery());\r
-      AlignmentI al = null;\r
-      try\r
+      for (DbSourceProxy sp : sfetcher.getSourceProxy(db))\r
       {\r
-        al = sp.getSequenceRecords(sp.getTestQuery());\r
-        if (al != null && al.getHeight() > 0\r
-                && sp.getDbSourceProperties() != null)\r
+        System.out.println("Source: " + sp.getDbName() + " (" + db\r
+                + "): retrieving test:" + sp.getTestQuery());\r
+        AlignmentI al = null;\r
+        try\r
         {\r
-          boolean dna = sp.getDbSourceProperties().containsKey(\r
-                  DBRefSource.DNACODINGSEQDB)\r
-                  || sp.getDbSourceProperties().containsKey(\r
-                          DBRefSource.DNASEQDB)\r
-                  || sp.getDbSourceProperties().containsKey(\r
-                          DBRefSource.CODINGSEQDB);\r
-          // try and find products\r
-          String types[] = jalview.analysis.CrossRef.findSequenceXrefTypes(\r
-                  dna, al.getSequencesArray());\r
-          if (types != null)\r
+          al = sp.getSequenceRecords(sp.getTestQuery());\r
+          if (al != null && al.getHeight() > 0\r
+                  && sp.getDbSourceProperties() != null)\r
           {\r
-            System.out.println("Xref Types for: " + (dna ? "dna" : "prot"));\r
-            for (int t = 0; t < types.length; t++)\r
+            boolean dna = sp.getDbSourceProperties().containsKey(\r
+                    DBRefSource.DNACODINGSEQDB)\r
+                    || sp.getDbSourceProperties().containsKey(\r
+                            DBRefSource.DNASEQDB)\r
+                    || sp.getDbSourceProperties().containsKey(\r
+                            DBRefSource.CODINGSEQDB);\r
+            // try and find products\r
+            String types[] = jalview.analysis.CrossRef\r
+                    .findSequenceXrefTypes(dna, al.getSequencesArray());\r
+            if (types != null)\r
             {\r
-              System.out.println("Type: " + types[t]);\r
-              SequenceI[] prod = jalview.analysis.CrossRef\r
-                      .findXrefSequences(al.getSequencesArray(), dna,\r
-                              types[t]).getSequencesArray();\r
-              System.out.println("Found "\r
-                      + ((prod == null) ? "no" : "" + prod.length)\r
-                      + " products");\r
-              if (prod != null)\r
+              System.out.println("Xref Types for: "\r
+                      + (dna ? "dna" : "prot"));\r
+              for (int t = 0; t < types.length; t++)\r
               {\r
-                for (int p = 0; p < prod.length; p++)\r
+                System.out.println("Type: " + types[t]);\r
+                SequenceI[] prod = jalview.analysis.CrossRef\r
+                        .findXrefSequences(al.getSequencesArray(), dna,\r
+                                types[t]).getSequencesArray();\r
+                System.out.println("Found "\r
+                        + ((prod == null) ? "no" : "" + prod.length)\r
+                        + " products");\r
+                if (prod != null)\r
                 {\r
-                  System.out.println("Prod " + p + ": "\r
-                          + prod[p].getDisplayId(true));\r
+                  for (int p = 0; p < prod.length; p++)\r
+                  {\r
+                    System.out.println("Prod " + p + ": "\r
+                            + prod[p].getDisplayId(true));\r
+                  }\r
                 }\r
               }\r
             }\r
+            else\r
+            {\r
+              noProds.addElement((dna ? new Object[]\r
+              { al, al } : new Object[]\r
+              { al }));\r
+            }\r
+\r
           }\r
-          else\r
-          {\r
-            noProds.addElement((dna ? new Object[]\r
-            { al, al } : new Object[]\r
-            { al }));\r
-          }\r
+        } catch (Exception ex)\r
+        {\r
+          System.out.println("ERROR:Failed to retrieve test query.");\r
+          ex.printStackTrace(System.out);\r
+        }\r
 \r
+        if (al == null)\r
+        {\r
+          System.out.println("ERROR:No alignment retrieved.");\r
+          StringBuffer raw = sp.getRawRecords();\r
+          if (raw != null)\r
+            System.out.println(raw.toString());\r
+          else\r
+            System.out.println("ERROR:No Raw results.");\r
         }\r
-      } catch (Exception ex)\r
-      {\r
-        System.out.println("ERROR:Failed to retrieve test query.");\r
-        ex.printStackTrace(System.out);\r
-      }\r
-      if (al == null)\r
-      {\r
-        System.out.println("ERROR:No alignment retrieved.");\r
-        StringBuffer raw = sp.getRawRecords();\r
-        if (raw != null)\r
-          System.out.println(raw.toString());\r
         else\r
-          System.out.println("ERROR:No Raw results.");\r
-      }\r
-      else\r
-      {\r
-        System.out.println("Retrieved " + al.getHeight() + " sequences.");\r
-        for (int s = 0; s < al.getHeight(); s++)\r
         {\r
-          SequenceI sq = al.getSequenceAt(s);\r
-          while (sq.getDatasetSequence() != null)\r
+          System.out.println("Retrieved " + al.getHeight() + " sequences.");\r
+          for (int s = 0; s < al.getHeight(); s++)\r
           {\r
-            sq = sq.getDatasetSequence();\r
+            SequenceI sq = al.getSequenceAt(s);\r
+            while (sq.getDatasetSequence() != null)\r
+            {\r
+              sq = sq.getDatasetSequence();\r
 \r
-          }\r
-          if (ds == null)\r
-          {\r
-            ds = new Alignment(new SequenceI[]\r
-            { sq });\r
+            }\r
+            if (ds == null)\r
+            {\r
+              ds = new Alignment(new SequenceI[]\r
+              { sq });\r
 \r
-          }\r
-          else\r
-          {\r
-            ds.addSequence(sq);\r
+            }\r
+            else\r
+            {\r
+              ds.addSequence(sq);\r
+            }\r
           }\r
         }\r
-      }\r
-      System.out.flush();\r
-      System.err.flush();\r
-\r
-    }\r
-    if (noProds.size() > 0)\r
-    {\r
-      Enumeration ts = noProds.elements();\r
-      while (ts.hasMoreElements())\r
+        System.out.flush();\r
+        System.err.flush();\r
 \r
+      }\r
+      if (noProds.size() > 0)\r
       {\r
-        Object[] typeSq = (Object[]) ts.nextElement();\r
-        boolean dna = (typeSq.length > 1);\r
-        AlignmentI al = (AlignmentI) typeSq[0];\r
-        System.out.println("Trying getProducts for "\r
-                + al.getSequenceAt(0).getDisplayId(true));\r
-        System.out.println("Search DS Xref for: " + (dna ? "dna" : "prot"));\r
-        // have a bash at finding the products amongst all the retrieved\r
-        // sequences.\r
-        SequenceI[] seqs = al.getSequencesArray();\r
-        Alignment prodal = jalview.analysis.CrossRef.findXrefSequences(\r
-                seqs, dna, null, ds);\r
-        System.out.println("Found "\r
-                + ((prodal == null) ? "no" : "" + prodal.getHeight())\r
-                + " products");\r
-        if (prodal != null)\r
+        Enumeration ts = noProds.elements();\r
+        while (ts.hasMoreElements())\r
+\r
         {\r
-          SequenceI[] prod = prodal.getSequencesArray(); // note\r
-          // should\r
-          // test\r
-          // rather\r
-          // than\r
-          // throw\r
-          // away\r
-          // codon\r
-          // mapping\r
-          // (if\r
-          // present)\r
-          for (int p = 0; p < prod.length; p++)\r
+          Object[] typeSq = (Object[]) ts.nextElement();\r
+          boolean dna = (typeSq.length > 1);\r
+          AlignmentI al = (AlignmentI) typeSq[0];\r
+          System.out.println("Trying getProducts for "\r
+                  + al.getSequenceAt(0).getDisplayId(true));\r
+          System.out.println("Search DS Xref for: "\r
+                  + (dna ? "dna" : "prot"));\r
+          // have a bash at finding the products amongst all the retrieved\r
+          // sequences.\r
+          SequenceI[] seqs = al.getSequencesArray();\r
+          Alignment prodal = jalview.analysis.CrossRef.findXrefSequences(\r
+                  seqs, dna, null, ds);\r
+          System.out.println("Found "\r
+                  + ((prodal == null) ? "no" : "" + prodal.getHeight())\r
+                  + " products");\r
+          if (prodal != null)\r
           {\r
-            System.out.println("Prod " + p + ": "\r
-                    + prod[p].getDisplayId(true));\r
+            SequenceI[] prod = prodal.getSequencesArray(); // note\r
+            // should\r
+            // test\r
+            // rather\r
+            // than\r
+            // throw\r
+            // away\r
+            // codon\r
+            // mapping\r
+            // (if\r
+            // present)\r
+            for (int p = 0; p < prod.length; p++)\r
+            {\r
+              System.out.println("Prod " + p + ": "\r
+                      + prod[p].getDisplayId(true));\r
+            }\r
           }\r
         }\r
+\r
       }\r
 \r
     }\r
@@ -317,7 +334,8 @@ public class SequenceFetcher extends ASequenceFetcher
   {\r
     // TODO: define a context as a registry provider (either desktop,\r
     // jalview.bin.cache, or something else).\r
-    for (jalviewSourceI source : jalview.bin.Cache.getDasSourceRegistry().getSources())\r
+    for (jalviewSourceI source : jalview.bin.Cache.getDasSourceRegistry()\r
+            .getSources())\r
     {\r
       if (source.isSequenceSource())\r
       {\r
index d4bcfe8..c63e148 100644 (file)
 package jalview.ws.seqfetcher;\r
 \r
 import jalview.datamodel.AlignmentI;\r
+import jalview.datamodel.DBRefEntry;\r
 import jalview.datamodel.SequenceI;\r
+import jalview.util.DBRefUtils;\r
 \r
+import java.util.ArrayList;\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.Stack;\r
 import java.util.Vector;\r
 \r
 public class ASequenceFetcher\r
@@ -30,7 +37,7 @@ public class ASequenceFetcher
   /**\r
    * set of databases we can retrieve entries from\r
    */\r
-  protected Hashtable FETCHABLEDBS;\r
+  protected Hashtable<String, List<DbSourceProxy>> FETCHABLEDBS;\r
 \r
   public ASequenceFetcher()\r
   {\r
@@ -75,120 +82,136 @@ public class ASequenceFetcher
   public SequenceI[] getSequences(jalview.datamodel.DBRefEntry[] refs)\r
   {\r
     SequenceI[] ret = null;\r
-    Vector rseqs = new Vector();\r
-    Hashtable queries = new Hashtable();\r
+    Vector<SequenceI> rseqs = new Vector();\r
+    Hashtable<String, List<String>> queries = new Hashtable();\r
     for (int r = 0; r < refs.length; r++)\r
     {\r
       if (!queries.containsKey(refs[r].getSource()))\r
       {\r
-        queries.put(refs[r].getSource(), new Vector());\r
+        queries.put(refs[r].getSource(), new ArrayList<String>());\r
       }\r
-      Vector qset = (Vector) queries.get(refs[r].getSource());\r
+      List<String> qset = queries.get(refs[r].getSource());\r
       if (!qset.contains(refs[r].getAccessionId()))\r
       {\r
-        qset.addElement(refs[r].getAccessionId());\r
+        qset.add(refs[r].getAccessionId());\r
       }\r
     }\r
-    Enumeration e = queries.keys();\r
+    Enumeration<String> e = queries.keys();\r
     while (e.hasMoreElements())\r
     {\r
-      Vector query = null;\r
+      List<String> query = null;\r
       String db = null;\r
-      try\r
+      db = e.nextElement();\r
+      query = queries.get(db);\r
+      if (!isFetchable(db))\r
       {\r
-        db = (String) e.nextElement();\r
-        query = (Vector) queries.get(db);\r
-        if (!isFetchable(db))\r
-          throw new Exception(\r
-                  "Don't know how to fetch from this database :" + db);\r
-        DbSourceProxy fetcher = getSourceProxy(db);\r
-        boolean doMultiple = fetcher.getAccessionSeparator() != null; // No\r
-        // separator\r
-        // - no\r
-        // Multiple\r
-        // Queries\r
-        Enumeration qs = query.elements();\r
-        while (qs.hasMoreElements())\r
+        reportStdError(db, query, new Exception(\r
+                "Don't know how to fetch from this database :" + db));\r
+        continue;\r
+      }\r
+      Iterator<DbSourceProxy> fetchers = getSourceProxy(db).iterator();\r
+      Stack<String> queriesLeft = new Stack<String>();\r
+//      List<String> queriesFailed = new ArrayList<String>();\r
+      queriesLeft.addAll(query);\r
+      while (fetchers.hasNext())\r
+      {\r
+        List<String> queriesMade = new ArrayList<String>();\r
+        HashSet queriesFound = new HashSet<String>();\r
+        try\r
         {\r
-          StringBuffer qsb = new StringBuffer();\r
-          do\r
-          {\r
-            qsb.append((String) qs.nextElement());\r
-            if (qs.hasMoreElements() && doMultiple) // and not reached limit for\r
-            // multiple queries at one\r
-            // time for this source\r
-            {\r
-              qsb.append(fetcher.getAccessionSeparator());\r
-            }\r
-          } while (doMultiple && qs.hasMoreElements());\r
-\r
-          AlignmentI seqset = null;\r
-          try\r
-          {\r
-            // create a fetcher and go to it\r
-            seqset = fetcher.getSequenceRecords(qsb.toString());\r
-          } catch (Exception ex)\r
+          DbSourceProxy fetcher = fetchers.next();\r
+          boolean doMultiple = fetcher.getAccessionSeparator() != null; // No\r
+          // separator\r
+          // - no\r
+          // Multiple\r
+          // Queries\r
+          while (!queriesLeft.isEmpty())\r
           {\r
-            System.err.println("Failed to retrieve the following from "\r
-                    + db);\r
-            System.err.println(qsb);\r
-            ex.printStackTrace(System.err);\r
-          }\r
-          // TODO: Merge alignment together - perhaps\r
-          if (seqset != null)\r
-          {\r
-            SequenceI seqs[] = seqset.getSequencesArray();\r
-            if (seqs != null)\r
+            StringBuffer qsb = new StringBuffer();\r
+            do\r
             {\r
-              for (int is = 0; is < seqs.length; is++)\r
+              if (qsb.length() > 0)\r
               {\r
-                rseqs.addElement(seqs[is]);\r
-                seqs[is] = null;\r
+                qsb.append(fetcher.getAccessionSeparator());\r
               }\r
+              String q = queriesLeft.pop();\r
+              queriesMade.add(q);\r
+              qsb.append(q);\r
+            } while (doMultiple && !queriesLeft.isEmpty());\r
+\r
+            AlignmentI seqset = null;\r
+            try\r
+            {\r
+              // create a fetcher and go to it\r
+              seqset = fetcher.getSequenceRecords(qsb.toString()); // ,\r
+                      // queriesFailed);\r
+            } catch (Exception ex)\r
+            {\r
+              System.err.println("Failed to retrieve the following from "\r
+                      + db);\r
+              System.err.println(qsb);\r
+              ex.printStackTrace(System.err);\r
             }\r
-            else\r
+            // TODO: Merge alignment together - perhaps\r
+            if (seqset != null)\r
             {\r
-              if (fetcher.getRawRecords() != null)\r
+              SequenceI seqs[] = seqset.getSequencesArray();\r
+              if (seqs != null)\r
               {\r
-                System.out.println("# Retrieved from " + db + ":"\r
-                        + qs.toString());\r
-                StringBuffer rrb = fetcher.getRawRecords();\r
-                /*\r
-                 * for (int rr = 0; rr<rrb.length; rr++) {\r
-                 */\r
-                String hdr;\r
-                // if (rr<qs.length)\r
-                // {\r
-                hdr = "# " + db + ":" + qsb.toString();\r
-                /*\r
-                 * } else { hdr = "# part "+rr; }\r
-                 */\r
-                System.out.println(hdr);\r
-                if (rrb != null)\r
-                  System.out.println(rrb);\r
-                System.out.println("# end of " + hdr);\r
+                for (int is = 0; is < seqs.length; is++)\r
+                {\r
+                  rseqs.addElement(seqs[is]);\r
+                  DBRefEntry[] frefs = DBRefUtils.searchRefs(seqs[is]\r
+                          .getDBRef(), new DBRefEntry(db, null, null));\r
+                  if (frefs != null)\r
+                  {\r
+                    for (DBRefEntry dbr : frefs)\r
+                    {\r
+                      queriesFound.add(dbr.getAccessionId());\r
+                      queriesMade.remove(dbr.getAccessionId());\r
+                    }\r
+                  }\r
+                  seqs[is] = null;\r
+                }\r
+              }\r
+              else\r
+              {\r
+                if (fetcher.getRawRecords() != null)\r
+                {\r
+                  System.out.println("# Retrieved from " + db + ":"\r
+                          + qsb.toString());\r
+                  StringBuffer rrb = fetcher.getRawRecords();\r
+                  /*\r
+                   * for (int rr = 0; rr<rrb.length; rr++) {\r
+                   */\r
+                  String hdr;\r
+                  // if (rr<qs.length)\r
+                  // {\r
+                  hdr = "# " + db + ":" + qsb.toString();\r
+                  /*\r
+                   * } else { hdr = "# part "+rr; }\r
+                   */\r
+                  System.out.println(hdr);\r
+                  if (rrb != null)\r
+                    System.out.println(rrb);\r
+                  System.out.println("# end of " + hdr);\r
+                }\r
+\r
               }\r
             }\r
+\r
           }\r
+        } catch (Exception ex)\r
+        {\r
+          reportStdError(db, queriesMade, ex);\r
         }\r
-      } catch (Exception ex)\r
-      {\r
-        System.err\r
-                .println("Failed to retrieve the following references from "\r
-                        + db);\r
-        Enumeration qv = query.elements();\r
-        int n = 0;\r
-        while (qv.hasMoreElements())\r
+        if (queriesMade.size() > 0)\r
         {\r
-          System.err.print(" " + qv.nextElement() + ";");\r
-          if (n++ > 10)\r
-          {\r
-            System.err.println();\r
-            n = 0;\r
-          }\r
+          System.out.println("# Adding " + queriesMade.size()\r
+                  + " ids back to queries list for searching again (" + db\r
+                  + ".");\r
+          queriesLeft.addAll(queriesMade);\r
         }\r
-        System.err.println();\r
-        ex.printStackTrace();\r
       }\r
     }\r
     if (rseqs.size() > 0)\r
@@ -206,6 +229,26 @@ public class ASequenceFetcher
     return ret;\r
   }\r
 \r
+  public void reportStdError(String db, List<String> queriesMade,\r
+          Exception ex)\r
+  {\r
+\r
+    System.err.println("Failed to retrieve the following references from "\r
+            + db);\r
+    int n = 0;\r
+    for (String qv : queriesMade)\r
+    {\r
+      System.err.print(" " + qv + ";");\r
+      if (n++ > 10)\r
+      {\r
+        System.err.println();\r
+        n = 0;\r
+      }\r
+    }\r
+    System.err.println();\r
+    ex.printStackTrace();\r
+  }\r
+\r
   /**\r
    * Retrieve an instance of the proxy for the given source\r
    * \r
@@ -214,9 +257,9 @@ public class ASequenceFetcher
    *          retrieval of specific DB source/version combinations.\r
    * @return an instance of DbSourceProxy for that db.\r
    */\r
-  public DbSourceProxy getSourceProxy(String db)\r
+  public List<DbSourceProxy> getSourceProxy(String db)\r
   {\r
-    DbSourceProxy dbs = (DbSourceProxy) FETCHABLEDBS.get(db);\r
+    List<DbSourceProxy> dbs = FETCHABLEDBS.get(db);\r
     return dbs;\r
   }\r
 \r
@@ -268,15 +311,22 @@ public class ASequenceFetcher
     {\r
       if (FETCHABLEDBS == null)\r
       {\r
-        FETCHABLEDBS = new Hashtable();\r
+        FETCHABLEDBS = new Hashtable<String, List<DbSourceProxy>>();\r
       }\r
-      FETCHABLEDBS.put(proxy.getDbSource(), proxy);\r
+      List<DbSourceProxy> slist = FETCHABLEDBS.get(proxy.getDbSource());\r
+      if (slist == null)\r
+      {\r
+        FETCHABLEDBS.put(proxy.getDbSource(),\r
+                slist = new ArrayList<DbSourceProxy>());\r
+      }\r
+      slist.add(proxy);\r
     }\r
   }\r
 \r
   /**\r
    * test if the database handler for dbName contains the given dbProperty\r
-   * \r
+   * when a dbName resolves to a set of proxies - this method will return the result of the test for the first instance.\r
+   * TODO implement additional method to query all sources for a db to find one with a particular property\r
    * @param dbName\r
    * @param dbProperty\r
    * @return true if proxy has the given property\r
@@ -284,12 +334,16 @@ public class ASequenceFetcher
   public boolean hasDbSourceProperty(String dbName, String dbProperty)\r
   {\r
     // TODO: decide if invalidDbName exception is thrown here.\r
-    DbSourceProxy proxy = getSourceProxy(dbName);\r
-    if (proxy != null)\r
+\r
+    List<DbSourceProxy> proxies = getSourceProxy(dbName);\r
+    if (proxies != null)\r
     {\r
-      if (proxy.getDbSourceProperties() != null)\r
+      for (DbSourceProxy proxy : proxies)\r
       {\r
-        return proxy.getDbSourceProperties().containsKey(dbProperty);\r
+        if (proxy.getDbSourceProperties() != null)\r
+        {\r
+          return proxy.getDbSourceProperties().containsKey(dbProperty);\r
+        }\r
       }\r
     }\r
     return false;\r
@@ -319,10 +373,12 @@ public class ASequenceFetcher
     while (dbs.hasMoreElements())\r
     {\r
       String dbn = (String) dbs.nextElement();\r
-      DbSourceProxy dbp = (DbSourceProxy) FETCHABLEDBS.get(dbn);\r
-      if (class1.isAssignableFrom(dbp.getClass()))\r
+      for (DbSourceProxy dbp : FETCHABLEDBS.get(dbn))\r
       {\r
-        src.addElement(dbn);\r
+        if (class1.isAssignableFrom(dbp.getClass()))\r
+        {\r
+          src.addElement(dbn);\r
+        }\r
       }\r
     }\r
     if (src.size() > 0)\r