X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fws%2Fdbsources%2FEmblXmlSource.java;h=b2fb8081b0d74ee0155dadc25bf06824548e9277;hb=48f7c55f44b0526c5f7be8ebf986052ca7dae245;hp=1300c65f53eba77a996a371dee9dd424437778df;hpb=5d88ae6bbf1ea113cefcb43b7918b5baf560a76e;p=jalview.git diff --git a/src/jalview/ws/dbsources/EmblXmlSource.java b/src/jalview/ws/dbsources/EmblXmlSource.java index 1300c65..b2fb808 100644 --- a/src/jalview/ws/dbsources/EmblXmlSource.java +++ b/src/jalview/ws/dbsources/EmblXmlSource.java @@ -1,97 +1,139 @@ -package jalview.ws.dbsources; - -import jalview.datamodel.Alignment; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.SequenceI; -import jalview.datamodel.xdb.embl.EmblEntry; -import jalview.ws.EBIFetchClient; - -import java.io.File; -import java.util.Iterator; -import java.util.Vector; - -public abstract class EmblXmlSource extends EbiFileRetrievedProxy -{ - - /** - * Last properly parsed embl file. - */ - public jalview.datamodel.xdb.embl.EmblFile efile = null; - - public EmblXmlSource() - { - super(); - } - /** - * set this to false to *not* add protein products to alignment dataset. - */ - public boolean getProteinProducts=false; - /** - * retrieve and parse an emblxml file - * @param emprefx either EMBL or EMBLCDS strings are allowed - anything else will not retrieve emblxml - * @param query - * @return - * @throws Exception - */ - public AlignmentI getEmblSequenceRecords(String emprefx, String query) throws Exception - { - startQuery(); - SequenceI seqs[] = null; - Vector alseq = new Vector(); // the sequences that will actually be presented in the alignment - StringBuffer result = new StringBuffer(); - EBIFetchClient dbFetch = new EBIFetchClient(); - File reply; - try { - reply = dbFetch.fetchDataAsFile( - emprefx.toLowerCase() + ":" + query.trim(), - "emblxml",null); - } - catch (Exception e) - { - stopQuery(); - throw new Exception("EBI EMBL XML retrieval failed on "+emprefx.toLowerCase()+":"+query.trim(),e); - } - if (reply != null && reply.exists()) - { - file = reply.getAbsolutePath(); - efile = jalview.datamodel.xdb.embl.EmblFile.getEmblFile(reply); - } - if (efile!=null) { - for (Iterator i=efile.getEntries().iterator(); i.hasNext(); ) { - EmblEntry entry = (EmblEntry) i.next(); - SequenceI[] seqparts = entry.getSequences(false,!getProteinProducts, emprefx); - if (seqparts!=null) { - SequenceI[] newseqs = null; - int si=0; - if (seqs==null) { - newseqs = new SequenceI[seqparts.length]; - } else { - newseqs = new SequenceI[seqs.length+seqparts.length]; - - for (;si0) - { - al = new Alignment(seqs); - result.append("# Successfully parsed the "+emprefx+" queries into an Alignment"); - results = result; - } - stopQuery(); - return al; - } - -} \ No newline at end of file +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * 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 . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ +package jalview.ws.dbsources; + +import jalview.datamodel.Alignment; +import jalview.datamodel.AlignmentI; +import jalview.datamodel.SequenceI; +import jalview.datamodel.xdb.embl.EmblEntry; +import jalview.datamodel.xdb.embl.EmblFile; +import jalview.util.MessageManager; +import jalview.ws.ebi.EBIFetchClient; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public abstract class EmblXmlSource extends EbiFileRetrievedProxy +{ + /* + * JAL-1856 Embl returns this text for query not found + */ + private static final String EMBL_NOT_FOUND_REPLY = "ERROR 12 No entries found."; + + public EmblXmlSource() + { + super(); + } + + /** + * retrieve and parse an emblxml file + * + * @param emprefx + * either EMBL or EMBLCDS strings are allowed - anything else will + * not retrieve emblxml + * @param query + * @return + * @throws Exception + */ + public AlignmentI getEmblSequenceRecords(String emprefx, String query) + throws Exception + { + startQuery(); + EBIFetchClient dbFetch = new EBIFetchClient(); + File reply; + try + { + reply = dbFetch.fetchDataAsFile( + emprefx.toLowerCase() + ":" + query.trim(), "display=xml", + "xml"); + } catch (Exception e) + { + stopQuery(); + throw new Exception(MessageManager.formatMessage( + "exception.ebiembl_retrieval_failed_on", new String[] { + emprefx.toLowerCase(), query.trim() }), e); + } + return getEmblSequenceRecords(emprefx, query, reply); + } + + /** + * parse an emblxml file stored locally + * + * @param emprefx + * either EMBL or EMBLCDS strings are allowed - anything else will + * not retrieve emblxml + * @param query + * @param file + * the EMBL XML file containing the results of a query + * @return + * @throws Exception + */ + public AlignmentI getEmblSequenceRecords(String emprefx, String query, + File reply) throws Exception + { + EmblFile efile = null; + List seqs = new ArrayList(); + + if (reply != null && reply.exists()) + { + file = reply.getAbsolutePath(); + if (reply.length() > EMBL_NOT_FOUND_REPLY.length()) + { + efile = EmblFile.getEmblFile(reply); + } + } + + /* + * invalid accession gets a reply with no elements, text content of + * EmbFile reads something like (e.g.) this ungrammatical phrase + * Entry: display type is either not supported or entry is not found. + */ + List peptides = new ArrayList(); + if (efile != null && efile.getEntries() != null) + { + for (EmblEntry entry : efile.getEntries()) + { + SequenceI seq = entry.getSequence(emprefx, peptides); + if (seq != null) + { + seqs.add(seq.deriveSequence()); + // place DBReferences on dataset and refer + } + } + } + + AlignmentI al = null; + if (!seqs.isEmpty()) + { + al = new Alignment(seqs.toArray(new SequenceI[seqs.size()])); + } + stopQuery(); + return al; + } + + @Override + public boolean isDnaCoding() + { + return true; + } + +}