+ 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
+ {\r
+\r
+ GFFAdapter gff = result.getGFF();\r
+ List<SEGMENT> segments = gff.getSegments();\r
+ List<ERRORSEGMENT> errorsegs = gff.getErrorSegments();\r
+ List<UNKNOWNFEATURE> unkfeats = gff.getUnknownFeatures();\r
+ List<UNKNOWNSEGMENT> unksegs = gff.getUnknownSegments();\r
+ debug("das source " + source + " returned " + gff.getTotal()\r
+ + " responses. " + (errorsegs != null ? errorsegs.size() : 0)\r
+ + " were incorrect segment queries, "\r
+ + (unkfeats != null ? unkfeats.size() : 0)\r
+ + " were unknown features "\r
+ + (unksegs != null ? unksegs.size() : 0)\r
+ + " were unknown segments and "\r
+ + (segments != null ? segments.size() : 0)\r
+ + " were segment responses.");\r
+ Iterator<DBRefEntry> dbr = idobj.iterator();\r
+ if (segments != null)\r
+ {\r
+ for (SEGMENT seg : segments)\r
+ {\r
+ String id = seg.getId();\r
+ if (ids.indexOf(id)==-1)\r
+ {\r
+ id=id.toUpperCase();\r
+ }\r
+ DBRefEntry dbref = idobj.get(ids.indexOf(id));\r
+ SequenceI sequence = sequencemap.get(id);\r
+ boolean added = false;\r
+ sequences.add(sequence);\r
+\r
+ for (FEATURE feat : seg.getFEATURE())\r
+ {\r
+ // standard DAS feature-> jalview sequence feature transformation\r
+ SequenceFeature f = newSequenceFeature(feat, jvsource.getTitle());\r
+ if (!parseSeqFeature(sequence, f, feat, jvsource))\r
+ {\r
+ if (dbref.getMap() != null && f.getBegin() > 0\r
+ && f.getEnd() > 0)\r
+ {\r
+ debug("mapping from " + f.getBegin() + " - " + f.getEnd());\r
+ SequenceFeature vf[] = null;\r
+\r
+ try\r
+ {\r
+ vf = dbref.getMap().locateFeature(f);\r
+ } catch (Exception ex)\r
+ {\r
+ Cache.log\r
+ .info("Error in 'experimental' mapping of features. Please try to reproduce and then report info to jalview-discuss@jalview.org.");\r
+ Cache.log.info("Mapping feature from " + f.getBegin()\r
+ + " to " + f.getEnd() + " in dbref "\r
+ + dbref.getAccessionId() + " in "\r
+ + dbref.getSource());\r
+ Cache.log.info("using das Source " + source);\r
+ Cache.log.info("Exception", ex);\r
+ }\r
+\r
+ if (vf != null)\r
+ {\r
+ for (int v = 0; v < vf.length; v++)\r
+ {\r
+ debug("mapping to " + v + ": " + vf[v].getBegin()\r
+ + " - " + vf[v].getEnd());\r
+ sequence.addSequenceFeature(vf[v]);\r
+ }\r
+ }\r
+ }\r
+ else\r
+ {\r
+ sequence.addSequenceFeature(f);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ featuresAdded(sequences);\r
+ }\r
+ else\r
+ {\r
+ // System.out.println("No features found for " + seq.getName()\r
+ // + " from: " + e.getDasSource().getNickname());\r
+ }\r