X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2FDasSequenceFeatureFetcher.java;h=bf200ce7ae07b9c49e23889357503c0a838be8e2;hb=6a29bab67784438dc389729753959b3b2a5e7a29;hp=2d4e73fe51370c261a21a824df0824c14eb39c49;hpb=5d88ae6bbf1ea113cefcb43b7918b5baf560a76e;p=jalview.git diff --git a/src/jalview/ws/DasSequenceFeatureFetcher.java b/src/jalview/ws/DasSequenceFeatureFetcher.java index 2d4e73f..bf200ce 100644 --- a/src/jalview/ws/DasSequenceFeatureFetcher.java +++ b/src/jalview/ws/DasSequenceFeatureFetcher.java @@ -1,20 +1,19 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer - * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with Jalview. If not, see . */ package jalview.ws; @@ -31,40 +30,100 @@ import org.biojava.dasobert.eventmodel.*; import jalview.bin.Cache; import jalview.datamodel.*; import jalview.gui.*; +import jalview.util.UrlLink; /** * DOCUMENT ME! - * + * * @author $author$ * @version $Revision$ */ public class DasSequenceFeatureFetcher { SequenceI[] sequences; + AlignFrame af; + FeatureSettings fsettings; + StringBuffer sbuffer = new StringBuffer(); + Vector selectedSources; + boolean cancelled = false; + private void debug(String mesg) + { + debug(mesg, null); + } + + private void debug(String mesg, Exception e) + { + if (Cache.log != null) + { + Cache.log.debug(mesg, e); + } + else + { + System.err.println(mesg); + if (e != null) + { + e.printStackTrace(); + } + } + } + long startTime; /** - * Creates a new SequenceFeatureFetcher object. - * Uses default - * - * @param align DOCUMENT ME! - * @param ap DOCUMENT ME! + * Creates a new SequenceFeatureFetcher object. Uses default + * + * @param align + * DOCUMENT ME! + * @param ap + * DOCUMENT ME! */ public DasSequenceFeatureFetcher(SequenceI[] sequences, - FeatureSettings fsettings, - Vector selectedSources) + FeatureSettings fsettings, Vector selectedSources) { - this.selectedSources = selectedSources; - this.sequences = sequences; - this.af = fsettings.af; - this.fsettings = fsettings; + this(sequences, fsettings, selectedSources, true, true); + } + public DasSequenceFeatureFetcher(SequenceI[] oursequences, + FeatureSettings fsettings, Vector ourselectedSources, + boolean checkDbrefs, boolean promptFetchDbrefs) + { + this.selectedSources = new Vector(); + Enumeration sources = ourselectedSources.elements(); + // filter both sequences and sources to eliminate duplicates + while (sources.hasMoreElements()) + { + Object src = sources.nextElement(); + if (!selectedSources.contains(src)) + { + selectedSources.addElement(src); + } + ; + } + Vector sqs = new Vector(); + for (int i = 0; i < oursequences.length; i++) + { + if (!sqs.contains(oursequences[i])) + { + sqs.addElement(oursequences[i]); + } + } + sequences = new SequenceI[sqs.size()]; + for (int i = 0; i < sequences.length; i++) + { + sequences[i] = (SequenceI) sqs.elementAt(i); + } + if (fsettings != null) + { + this.fsettings = fsettings; + this.af = fsettings.af; + af.setShowSeqFeatures(true); + } int uniprotCount = 0; for (int i = 0; i < selectedSources.size(); i++) { @@ -72,6 +131,8 @@ public class DasSequenceFeatureFetcher DasCoordinateSystem[] coords = source.getCoordinateSystem(); for (int c = 0; c < coords.length; c++) { + // TODO: match UniProt coord system canonically (?) - does + // UniProt==uniprot==UNIPROT ? if (coords[c].getName().indexOf("UniProt") > -1) { uniprotCount++; @@ -88,8 +149,8 @@ public class DasSequenceFeatureFetcher { for (int j = 0; j < dbref.length; j++) { - if (dbref[j].getSource() - .equals(jalview.datamodel.DBRefSource.UNIPROT)) + if (dbref[j].getSource().equals( + jalview.datamodel.DBRefSource.UNIPROT)) { refCount++; break; @@ -98,15 +159,21 @@ public class DasSequenceFeatureFetcher } } - if (refCount < sequences.length && uniprotCount > 0) + if (checkDbrefs && refCount < sequences.length && uniprotCount > 0) { - int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, - "Do you want Jalview to find\n" - + "Uniprot Accession ids for given sequence names?", - "Find Uniprot Accession Ids", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); + int reply = JOptionPane.YES_OPTION; + if (promptFetchDbrefs) + { + reply = JOptionPane + .showInternalConfirmDialog( + Desktop.desktop, + "Do you want Jalview to find\n" + + "Uniprot Accession ids for given sequence names?", + "Find Uniprot Accession Ids", + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + } if (reply == JOptionPane.YES_OPTION) { @@ -116,17 +183,16 @@ public class DasSequenceFeatureFetcher else { startFetching(); - } + } } else { startFetching(); } - } + } - class FetchDBRefs - implements Runnable + class FetchDBRefs implements Runnable { public void run() { @@ -135,341 +201,434 @@ public class DasSequenceFeatureFetcher } } + /** + * Spawns a number of dasobert Fetcher threads to add features to sequences in + * the dataset + */ + void startFetching() + { + cancelled = false; + startTime = System.currentTimeMillis(); + if (af != null) + { + af.setProgressBar("Fetching DAS Sequence Features", startTime); + } - /** - * Spawns a number of dasobert Fetcher threads to add features to sequences in the dataset - */ - void startFetching() - { - cancelled = false; - startTime = System.currentTimeMillis(); - af.setProgressBar("Fetching DAS Sequence Features", startTime); - - DasSource[] sources = new jalview.gui.DasSourceBrowser().getDASSource(); - - if (selectedSources == null || selectedSources.size() == 0) - { - String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE", - "uniprot"); - StringTokenizer st = new StringTokenizer(active, "\t"); - Vector selectedSources = new Vector(); - String token; - while (st.hasMoreTokens()) - { - token = st.nextToken(); - for (int i = 0; i < sources.length; i++) - { - if (sources[i].getNickname().equals(token)) - { - selectedSources.addElement(sources[i]); - break; - } - } - } - } - - if (selectedSources == null || selectedSources.size() == 0) - { - System.out.println("No DAS Sources active"); - af.setProgressBar("No DAS Sources Active", startTime); - cancelled = true; - fsettings.noDasSourceActive(); - return; - } - - sourcesRemaining = selectedSources.size(); - //Now sending requests one at a time to each server - for (int sourceIndex = 0; - sourceIndex < selectedSources.size() - && !cancelled; - sourceIndex++) - { - DasSource dasSource = (DasSource) selectedSources.elementAt( - sourceIndex); - - nextSequence(dasSource, sequences[0]); - } - } - - public void cancel() - { - af.setProgressBar("DAS Feature Fetching Cancelled", startTime); - cancelled = true; - } - - int sourcesRemaining=0; - void responseComplete(DasSource dasSource, SequenceI seq) - { - if (seq != null) - { - for (int seqIndex = 0; - seqIndex < sequences.length-1 - && !cancelled; seqIndex++) - { - if (sequences[seqIndex] == seq) - { - nextSequence(dasSource, sequences[++seqIndex]); - return; - } - } - } - - sourcesRemaining --; - - if(sourcesRemaining==0) - { - af.setProgressBar("DAS Feature Fetching Complete", startTime); - - if(af.featureSettings!=null) + if (selectedSources == null || selectedSources.size() == 0) + { + try + { + DasSource[] sources = new jalview.gui.DasSourceBrowser() + .getDASSource(); + + String active = jalview.bin.Cache.getDefault("DAS_ACTIVE_SOURCE", + "uniprot"); + StringTokenizer st = new StringTokenizer(active, "\t"); + selectedSources = new Vector(); + String token; + while (st.hasMoreTokens()) + { + token = st.nextToken(); + for (int i = 0; i < sources.length; i++) + { + if (sources[i].getNickname().equals(token)) + { + selectedSources.addElement(sources[i]); + break; + } + } + } + } catch (Exception ex) { - af.featureSettings.setTableData(); + debug("Exception whilst setting default feature sources from registry and local preferences.", + ex); } + } + + if (selectedSources == null || selectedSources.size() == 0) + { + System.out.println("No DAS Sources active"); + cancelled = true; + setGuiNoDassourceActive(); + return; + } - fsettings.complete(); - } + sourcesRemaining = selectedSources.size(); + // Now sending requests one at a time to each server + for (int sourceIndex = 0; sourceIndex < selectedSources.size() + && !cancelled; sourceIndex++) + { + DasSource dasSource = (DasSource) selectedSources + .elementAt(sourceIndex); - } + nextSequence(dasSource, sequences[0]); + } + } - void featuresAdded(SequenceI seq) - { - af.getFeatureRenderer().featuresAdded(); + private void setGuiNoDassourceActive() + { - int start = af.getViewport().getStartSeq(); - int end = af.getViewport().getEndSeq(); - int index; - for(index=start; index 0 + && jalview.util.DBRefUtils.isDasCoordinateSystem( + cs[csIndex].getName(), uprefs[j])) { - DasCoordinateSystem cs[] = dasSource.getCoordinateSystem(); - - for(int csIndex=0; csIndex 0 && jalview.util.DBRefUtils - .isDasCoordinateSystem(cs[csIndex].getName(), uprefs[j])) - { - Cache.log.debug("Launched fetcher for coordinate system " + - cs[0].getName()); - // Will have to pass any mapping information to the fetcher - //- the start/end for the DBRefEntry may not be the same as the sequence's start/end - - System.out.println(seq.getName() + " " + (seq.getDatasetSequence() == null) - + " " + dasSource.getUrl()); - - dasCoordSysFound = true; // break's out of the loop - createFeatureFetcher(seq, - dasSource, - uprefs[j]); - } - else - System.out.println("IGNORE " + cs[csIndex].getName()); - } + debug("Launched fetcher for coordinate system " + + cs[0].getName()); + // Will have to pass any mapping information to the fetcher + // - the start/end for the DBRefEntry may not be the same as the + // sequence's start/end + + System.out.println(seq.getName() + " " + + (seq.getDatasetSequence() == null) + " " + + dasSource.getUrl()); + + dasCoordSysFound = true; // break's out of the loop + createFeatureFetcher(seq, dasSource, uprefs[j]); } + else + System.out.println("IGNORE " + cs[csIndex].getName()); } + } + } - if(!dasCoordSysFound) + if (!dasCoordSysFound) + { + String id = null; + // try and use the name as the sequence id + if (seq.getName().indexOf("|") > -1) + { + id = seq.getName().substring(seq.getName().lastIndexOf("|") + 1); + if (id.trim().length() < 4) { - String id = null; - // try and use the name as the sequence id - if (seq.getName().indexOf("|") > -1) + // hack - we regard a significant ID as being at least 4 + // non-whitespace characters + id = seq.getName().substring(0, seq.getName().lastIndexOf("|")); + if (id.indexOf("|") > -1) { - id = seq.getName().substring( - seq.getName().lastIndexOf("|") + 1); - } - else - { - id = seq.getName(); - } - if (id != null) - { - // Should try to call a general feature fetcher that - // queries many sources with name to discover applicable ID references - createFeatureFetcher(seq, - dasSource, - id); + id = id.substring(id.lastIndexOf("|") + 1); } } + } + else + { + id = seq.getName(); + } + if (id != null) + { + // Should try to call a general feature fetcher that + // queries many sources with name to discover applicable ID references + createFeatureFetcher(seq, dasSource, id); + } + } - } - + } -/** - * fetch and add das features to a sequence using the given source URL and compatible DbRef id. - * new features are mapped using the DbRef mapping to the local coordinate system. - * @param seq - * @param SourceUrl - * @param dbref - */ - protected void createFeatureFetcher(final SequenceI seq, final DasSource dasSource, - final DBRefEntry dbref) { + /** + * fetch and add das features to a sequence using the given source URL and + * compatible DbRef id. new features are mapped using the DbRef mapping to the + * local coordinate system. + * + * @param seq + * @param SourceUrl + * @param dbref + */ + protected void createFeatureFetcher(final SequenceI seq, + final DasSource dasSource, final DBRefEntry dbref) + { - ////////////// - /// fetch DAS features + // //////////// + // / fetch DAS features final Das1Source source = new Das1Source(); source.setUrl(dasSource.getUrl()); source.setNickname(dasSource.getNickname()); - if (dbref==null || dbref.getAccessionId()==null || dbref.getAccessionId().length()<1) + if (dbref == null || dbref.getAccessionId() == null + || dbref.getAccessionId().length() < 1) { + responseComplete(dasSource, seq); // reduce thread count anyhow return; } - Cache.log.debug("new Das Feature Fetcher for " + dbref.getSource()+":"+dbref.getAccessionId() + " querying " + - dasSource.getUrl()); + debug("new Das Feature Fetcher for " + dbref.getSource() + ":" + + dbref.getAccessionId() + " querying " + dasSource.getUrl()); FeatureThread fetcher = new FeatureThread(dbref.getAccessionId() - // + ":" + start + "," + end, - , source); + // + ":" + start + "," + end, + , source); - fetcher.addFeatureListener(new FeatureListener() + fetcher.addFeatureListener(new FeatureListener() + { + public void comeBackLater(FeatureEvent e) { - public void comeBackLater(FeatureEvent e) - { - responseComplete(dasSource, seq); - Cache.log.debug("das source " + e.getDasSource().getNickname() + - " asked us to come back in " + e.getComeBackLater() + - " secs."); - } + responseComplete(dasSource, seq); + debug("das source " + e.getSource().getNickname() + + " asked us to come back in " + e.getComeBackLater() + + " secs."); + } - public void newFeatures(FeatureEvent e) - { + public void newFeatures(FeatureEvent e) + { - Das1Source ds = e.getDasSource(); + Das1Source ds = e.getSource(); - Map[] features = e.getFeatures(); - // add features to sequence - Cache.log.debug("das source " + ds.getUrl() + " returned " + - features.length + " features"); + Map[] features = e.getFeatures(); + // add features to sequence + debug("das source " + ds.getUrl() + " returned " + features.length + + " features"); - if (features.length > 0) + if (features.length > 0) + { + for (int i = 0; i < features.length; i++) { - for (int i = 0; i < features.length; i++) + // standard DAS feature-> jalview sequence feature transformation + SequenceFeature f = newSequenceFeature(features[i], + source.getNickname()); + if (!parseSeqFeature(seq, f, features[i], source)) { - SequenceFeature f = newSequenceFeature(features[i], - source.getNickname()); - if (dbref.getMap()!=null && f.getBegin()>0 && f.getEnd()>0) { - Cache.log.debug("mapping from "+f.getBegin()+" - "+f.getEnd()); - SequenceFeature vf[]=null; - - try { + if (dbref.getMap() != null && f.getBegin() > 0 + && f.getEnd() > 0) + { + debug("mapping from " + f.getBegin() + " - " + f.getEnd()); + SequenceFeature vf[] = null; + + try + { vf = dbref.getMap().locateFeature(f); - } - catch (Exception ex) + } catch (Exception ex) { - Cache.log.info("Error in 'experimental' mapping of features. Please try to reproduce and then report info to help@jalview.org."); - Cache.log.info("Mapping feature from "+f.getBegin()+" to "+f.getEnd()+" in dbref "+dbref.getAccessionId()+" in "+dbref.getSource()); - Cache.log.info("using das Source "+ds.getUrl()); + Cache.log + .info("Error in 'experimental' mapping of features. Please try to reproduce and then report info to jalview-discuss@jalview.org."); + Cache.log.info("Mapping feature from " + f.getBegin() + + " to " + f.getEnd() + " in dbref " + + dbref.getAccessionId() + " in " + + dbref.getSource()); + Cache.log.info("using das Source " + ds.getUrl()); Cache.log.info("Exception", ex); } - - if (vf!=null) { - for (int v=0;v 0) { + debug("new Das Feature Fetcher for " + id + " querying " + + dasSource.getUrl()); FeatureThread fetcher = new FeatureThread(id - // + ":" + start + "," + end, - , source); + // + ":" + start + "," + end, + , source); fetcher.addFeatureListener(new FeatureListener() { public void comeBackLater(FeatureEvent e) { responseComplete(dasSource, seq); - Cache.log.debug("das source " + e.getDasSource().getNickname() + - " asked us to come back in " + e.getComeBackLater() + - " secs."); + debug("das source " + e.getSource().getNickname() + + " asked us to come back in " + e.getComeBackLater() + + " secs."); } public void newFeatures(FeatureEvent e) { - Das1Source ds = e.getDasSource(); + Das1Source ds = e.getSource(); Map[] features = e.getFeatures(); // add features to sequence - Cache.log.debug("das source " + ds.getUrl() + " returned " + - features.length + " features"); + debug("das source " + ds.getUrl() + " returned " + + features.length + " features"); if (features.length > 0) { for (int i = 0; i < features.length; i++) { + // standard DAS feature-> jalview sequence feature transformation SequenceFeature f = newSequenceFeature(features[i], - source.getNickname()); - - seq.addSequenceFeature(f); + source.getNickname()); + if (!parseSeqFeature(seq, f, features[i], source)) + { + // just add as a simple sequence feature + seq.addSequenceFeature(f); + } } featuresAdded(seq); } else { - // System.out.println("No features found for " + seq.getName() - // + " from: " + e.getDasSource().getNickname()); + // System.out.println("No features found for " + seq.getName() + // + " from: " + e.getDasSource().getNickname()); } responseComplete(dasSource, seq); @@ -480,30 +639,137 @@ public class DasSequenceFeatureFetcher fetcher.start(); } + else + { + // invalid fetch - indicate it is finished. + debug("Skipping empty ID for querying " + dasSource.getUrl()); + responseComplete(dasSource, seq); + } + } + + /** + * examine the given sequence feature to determine if it should actually be + * turned into sequence annotation or database cross references rather than a + * simple sequence feature. + * + * @param seq + * the sequence to annotate + * @param f + * the jalview sequence feature generated from the DAS feature + * @param map + * the sequence feature attributes + * @param source + * the source that emitted the feature + * @return true if feature was consumed as another kind of annotation. + */ + protected boolean parseSeqFeature(SequenceI seq, SequenceFeature f, + Map map, Das1Source source) + { + SequenceI mseq = seq; + while (seq.getDatasetSequence() != null) + { + seq = seq.getDatasetSequence(); + } + if (f.getType() != null) + { + String type = f.getType(); + if (type.equalsIgnoreCase("protein_name")) + { + // parse name onto the alignment sequence or the dataset sequence. + if (seq.getDescription() == null + || seq.getDescription().trim().length() == 0) + { + // could look at the note series to pick out the first long name, for + // the moment just use the whole description string + seq.setDescription(f.getDescription()); + } + if (mseq.getDescription() == null + || mseq.getDescription().trim().length() == 0) + { + // could look at the note series to pick out the first long name, for + // the moment just use the whole description string + mseq.setDescription(f.getDescription()); + } + return true; + } + // check if source has biosapiens or other sequence ontology label + if (type.equalsIgnoreCase("DBXREF") || type.equalsIgnoreCase("DBREF")) + { + // try to parse the accession out + + DBRefEntry dbr = new DBRefEntry(); + dbr.setVersion(source.getNickname()); + StringTokenizer st = new StringTokenizer(f.getDescription(), ":"); + if (st.hasMoreTokens()) + { + dbr.setSource(st.nextToken()); + } + if (st.hasMoreTokens()) + { + dbr.setAccessionId(st.nextToken()); + } + seq.addDBRef(dbr); + + if (f.links != null && f.links.size() > 0) + { + // feature is also appended to enable links to be seen. + // TODO: consider extending dbrefs to have their own links ? + // TODO: new feature: extract dbref links from DAS servers and add the + // URL pattern to the list of DB name associated links in the user's + // preferences ? + // for the moment - just fix up the existing feature so it displays + // correctly. + // f.setType(dbr.getSource()); + // f.setDescription(); + f.setValue("linkonly", Boolean.TRUE); + // f.setDescription(""); + Vector newlinks = new Vector(); + Enumeration it = f.links.elements(); + while (it.hasMoreElements()) + { + String elm; + UrlLink urllink = new UrlLink(elm = (String) it.nextElement()); + if (urllink.isValid()) + { + urllink.setLabel(f.getDescription()); + newlinks.addElement(urllink.toString()); + } + else + { + // couldn't parse the link properly. Keep it anyway - just in + // case. + debug("couldn't parse link string - " + elm); + newlinks.addElement(elm); + } + } + f.links = newlinks; + seq.addSequenceFeature(f); + } + return true; + } + } + return false; } /** * creates a jalview sequence feature from a das feature document + * * @param dasfeature * @return sequence feature object created using dasfeature information */ SequenceFeature newSequenceFeature(Map dasfeature, String nickname) { - if (dasfeature==null) + if (dasfeature == null) { return null; } try { /** - * Different qNames for a DAS Feature - are string keys to the HashMaps in features - * "METHOD") || - qName.equals("TYPE") || - qName.equals("START") || - qName.equals("END") || - qName.equals("NOTE") || - qName.equals("LINK") || - qName.equals("SCORE") + * Different qNames for a DAS Feature - are string keys to the HashMaps in + * features "METHOD") || qName.equals("TYPE") || qName.equals("START") || + * qName.equals("END") || qName.equals("NOTE") || qName.equals("LINK") || + * qName.equals("SCORE") */ String desc = new String(); if (dasfeature.containsKey("NOTE")) @@ -517,55 +783,80 @@ public class DasSequenceFeatureFetcher try { start = Integer.parseInt(dasfeature.get("START").toString()); + } catch (Exception ex) + { } - catch (Exception ex) - {} try { end = Integer.parseInt(dasfeature.get("END").toString()); + } catch (Exception ex) + { } - catch (Exception ex) - {} try { - score = Integer.parseInt(dasfeature.get("SCORE").toString()); + Object scr = dasfeature.get("SCORE"); + if (scr != null) + { + score = (float) Double.parseDouble(scr.toString()); + + } + } catch (Exception ex) + { } - catch (Exception ex) - {} SequenceFeature f = new SequenceFeature( - (String) dasfeature.get("TYPE"), - desc, - start, - end, - score, - nickname); + (String) dasfeature.get("TYPE"), desc, start, end, score, + nickname); if (dasfeature.containsKey("LINK")) { - f.addLink(f.getType() + " " + f.begin + "_" + f.end - + "|" + dasfeature.get("LINK")); + // Do not put feature extent in link text for non-positional features + if (f.begin == 0 && f.end == 0) + { + f.addLink(f.getType() + "|" + dasfeature.get("LINK")); + } + else + { + f.addLink(f.getType() + " " + f.begin + "_" + f.end + "|" + + dasfeature.get("LINK")); + } } return f; - } - catch (Exception e) + } catch (Exception e) { System.out.println("ERRR " + e); e.printStackTrace(); System.out.println("############"); - Cache.log.debug("Failed to parse " + dasfeature.toString(), e); + debug("Failed to parse " + dasfeature.toString(), e); return null; } } + /** + * query the default DAS Source Registry for sources. Uses value of jalview + * property DAS_REGISTRY_URL and the DasSourceBrowser.DEFAULT_REGISTRY if that + * doesn't exist. + * + * @return list of sources + */ public static DasSource[] getDASSources() { - DasSourceReaderImpl reader = new DasSourceReaderImpl(); String registryURL = jalview.bin.Cache.getDefault("DAS_REGISTRY_URL", - DasSourceBrowser.DEFAULT_REGISTRY - ); + DasSourceBrowser.DEFAULT_REGISTRY); + return getDASSources(registryURL); + } + + /** + * query the given URL for DasSources. + * + * @param registryURL + * return sources from registryURL + */ + public static DasSource[] getDASSources(String registryURL) + { + DasSourceReaderImpl reader = new DasSourceReaderImpl(); try { @@ -589,18 +880,19 @@ public class DasSequenceFeatureFetcher } else if (ds instanceof Das1Source) { - das1sources.add( (Das1Source) ds); + das1sources.add((Das1Source) ds); } } - return (Das1Source[]) das1sources.toArray(new Das1Source[das1sources.size()]); - } - catch (Exception ex) + return (Das1Source[]) das1sources.toArray(new Das1Source[das1sources + .size()]); + } catch (Exception ex) { + System.err.println("Failed to contact DAS1 registry at " + + registryURL); ex.printStackTrace(); return null; } } } -