+ ArrayList<jalviewSourceI> srcobj = new ArrayList<jalviewSourceI>();\r
+ ArrayList<String> src = new ArrayList<String>();\r
+ List<List<String>> ids = new ArrayList<List<String>>();\r
+ List<List<DBRefEntry>> idobj = new ArrayList<List<DBRefEntry>>();\r
+ List<Map<String, SequenceI>> sqset = new ArrayList<Map<String, SequenceI>>();\r
+ for (jalviewSourceI _sr : selectedSources)\r
+ {\r
+\r
+ Map<String, SequenceI> slist = new HashMap<String, SequenceI>();\r
+ List<DBRefEntry> idob = new ArrayList<DBRefEntry>();\r
+ List<String> qset = new ArrayList<String>();\r
+\r
+ for (SequenceI seq : sequences)\r
+ {\r
+ Object[] idset = nextSequence(_sr, seq);\r
+ if (idset != null)\r
+ {\r
+ List<DBRefEntry> _idob = (List<DBRefEntry>) idset[0];\r
+ List<String> _qset = (List<String>) idset[1];\r
+ if (_idob.size() > 0)\r
+ {\r
+ // add sequence's ref for each id derived from it\r
+ // (space inefficient, but most unambiguous)\r
+ // could replace with hash with _qset values as keys.\r
+ Iterator<DBRefEntry> dbobj = _idob.iterator();\r
+ for (String q : _qset)\r
+ {\r
+ SequenceI osq = slist.get(q);\r
+ DBRefEntry dr = dbobj.next();\r
+ if (osq != null && osq != seq)\r
+ {\r
+ // skip - non-canonical query\r
+ }\r
+ else\r
+ {\r
+ idob.add(dr);\r
+ qset.add(q);\r
+ slist.put(q, seq);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ if (idob.size() > 0)\r
+ {\r
+ srcobj.add(_sr);\r
+ src.add(_sr.getSourceURL());\r
+ ids.add(qset);\r
+ idobj.add(idob);\r
+ sqset.add(slist);\r
+ }\r
+ }\r
+ Map<String, Map<List<String>, Exception>> errors = new HashMap<String, Map<List<String>, Exception>>();\r
+ Map<String, Map<List<String>, DasGFFAdapter>> results = new HashMap<String, Map<List<String>, DasGFFAdapter>>();\r
+ if (!useJDASMultiThread)\r
+ {\r
+ Iterator<String> sources=src.iterator();\r
+ // iterate over each query for each source and do each one individually\r
+ for (List<String> idl:ids)\r
+ {\r
+ String source=sources.next();\r
+ FeaturesClient featuresc=new FeaturesClient(sourceRegistry.getSessionHandler().getConnectionPropertyProviderFor(source));\r
+ for (String id:idl)\r
+ {\r
+ List<String> qid=Arrays.asList(new String[] { id});\r
+ try {\r
+ DasGFFAdapter dga=featuresc.fetchData(source, qid);\r
+ Map<List<String>,DasGFFAdapter> ers=results.get(source);\r
+ if (ers==null)\r
+ {\r
+ results.put(source, ers=new HashMap<List<String>,DasGFFAdapter>());\r
+ }\r
+ ers.put(qid, dga);\r
+ } catch (Exception ex)\r
+ {\r
+ Map<List<String>,Exception> ers=errors.get(source);\r
+ if (ers==null)\r
+ {\r
+ errors.put(source, ers=new HashMap<List<String>,Exception>());\r
+ }\r
+ ers.put(qid, ex);\r
+ }\r
+ }\r
+ }\r
+ } else {\r
+ // pass them all at once\r
+ fc.fetchData(src, ids, false, results, errors);\r
+ fc.shutDown();\r
+ while (!fc.isTerminated())\r
+ {\r
+ try\r
+ {\r
+ Thread.sleep(200);\r
+ } catch (InterruptedException x)\r
+ {\r
+\r
+ }\r
+ }\r
+ }\r
+ Iterator<List<String>> idset = ids.iterator();\r
+ Iterator<List<DBRefEntry>> idobjset = idobj.iterator();\r
+ Iterator<Map<String, SequenceI>> seqset = sqset.iterator();\r
+ for (jalviewSourceI source : srcobj)\r
+ {\r
+ processResponse(seqset.next(), source, idset.next(), idobjset.next(),\r
+ results.get(source.getSourceURL()),\r
+ errors.get(source.getSourceURL()));\r
+ }\r
+ }\r
+\r
+ private void processResponse(Map<String, SequenceI> sequencemap,\r
+ jalviewSourceI jvsource, List<String> ids,\r
+ List<DBRefEntry> idobj, Map<List<String>, DasGFFAdapter> results,\r
+ Map<List<String>, Exception> errors)\r
+ {\r
+ Set<SequenceI> sequences = new HashSet<SequenceI>();\r
+ String source = jvsource.getSourceURL();\r
+ // process features\r
+ DasGFFAdapter result = (results == null) ? null : results.get(ids);\r
+ Exception error = (errors == null) ? null : errors.get(ids);\r
+ if (result == null)\r
+ {\r
+ debug("das source " + source + " could not be contacted. "\r
+ + (error == null ? "" : error.toString()));\r
+ }\r
+ else\r