JAL-2344 use ".cif" for saved mmCIF file (and refactor fetch as file)
[jalview.git] / src / jalview / ws / dbsources / EmblXmlSource.java
index b78b904..b2fb808 100644 (file)
@@ -1,19 +1,21 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
- * Copyright (C) 2014 The Jalview Authors
+ * 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.
+ * 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 <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
  * The Jalview Authors are detailed in the 'AUTHORS' file.
  */
 package jalview.ws.dbsources;
@@ -22,18 +24,20 @@ 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.Iterator;
+import java.util.ArrayList;
+import java.util.List;
 
 public abstract class EmblXmlSource extends EbiFileRetrievedProxy
 {
-
-  /**
-   * Last properly parsed embl file.
+  /*
+   * JAL-1856 Embl returns this text for query not found
    */
-  public jalview.datamodel.xdb.embl.EmblFile efile = null;
+  private static final String EMBL_NOT_FOUND_REPLY = "ERROR 12 No entries found.";
 
   public EmblXmlSource()
   {
@@ -59,12 +63,14 @@ public abstract class EmblXmlSource extends EbiFileRetrievedProxy
     try
     {
       reply = dbFetch.fetchDataAsFile(
-              emprefx.toLowerCase() + ":" + query.trim(), "emblxml", null);
+              emprefx.toLowerCase() + ":" + query.trim(), "display=xml",
+              "xml");
     } catch (Exception e)
     {
       stopQuery();
-      throw new Exception("EBI EMBL XML retrieval failed on "
-              + emprefx.toLowerCase() + ":" + query.trim(), e);
+      throw new Exception(MessageManager.formatMessage(
+              "exception.ebiembl_retrieval_failed_on", new String[] {
+                  emprefx.toLowerCase(), query.trim() }), e);
     }
     return getEmblSequenceRecords(emprefx, query, reply);
   }
@@ -84,79 +90,50 @@ public abstract class EmblXmlSource extends EbiFileRetrievedProxy
   public AlignmentI getEmblSequenceRecords(String emprefx, String query,
           File reply) throws Exception
   {
-    SequenceI seqs[] = null;
-    StringBuffer result = new StringBuffer();
+    EmblFile efile = null;
+    List<SequenceI> seqs = new ArrayList<SequenceI>();
+
     if (reply != null && reply.exists())
     {
-      efile = null;
       file = reply.getAbsolutePath();
-      if (reply.length() > 25)
+      if (reply.length() > EMBL_NOT_FOUND_REPLY.length())
       {
-        efile = jalview.datamodel.xdb.embl.EmblFile.getEmblFile(reply);
-      }
-      else
-      {
-        result.append("# No EMBL record retrieved for "
-                + emprefx.toLowerCase() + ":" + query.trim());
+        efile = EmblFile.getEmblFile(reply);
       }
     }
-    if (efile != null)
+
+    /*
+     * invalid accession gets a reply with no <entry> elements, text content of
+     * EmbFile reads something like (e.g.) this ungrammatical phrase
+     * Entry: <acc> display type is either not supported or entry is not found.
+     */
+    List<SequenceI> peptides = new ArrayList<SequenceI>();
+    if (efile != null && efile.getEntries() != null)
     {
-      for (Iterator i = efile.getEntries().iterator(); i.hasNext();)
+      for (EmblEntry entry : efile.getEntries())
       {
-        EmblEntry entry = (EmblEntry) i.next();
-        SequenceI[] seqparts = entry.getSequences(false, true, emprefx); // TODO:
-        // use
-        // !fetchNa,!fetchPeptide
-        // here
-        // instead
-        // -
-        // see
-        // todo
-        // in
-        // emblEntry
-        if (seqparts != null)
+        SequenceI seq = entry.getSequence(emprefx, peptides);
+        if (seq != null)
         {
-          SequenceI[] newseqs = null;
-          int si = 0;
-          if (seqs == null)
-          {
-            newseqs = new SequenceI[seqparts.length];
-          }
-          else
-          {
-            newseqs = new SequenceI[seqs.length + seqparts.length];
-
-            for (; si < seqs.length; si++)
-            {
-              newseqs[si] = seqs[si];
-              seqs[si] = null;
-            }
-          }
-          for (int j = 0; j < seqparts.length; si++, j++)
-          {
-            newseqs[si] = seqparts[j].deriveSequence(); // place DBReferences on
-            // dataset and refer
-          }
-          seqs = newseqs;
-
+          seqs.add(seq.deriveSequence());
+          // place DBReferences on dataset and refer
         }
       }
     }
-    else
-    {
-      result = null;
-    }
+
     AlignmentI al = null;
-    if (seqs != null && seqs.length > 0)
+    if (!seqs.isEmpty())
     {
-      al = new Alignment(seqs);
-      result.append("# Successfully parsed the " + emprefx
-              + " queries into an Alignment");
-      results = result;
+      al = new Alignment(seqs.toArray(new SequenceI[seqs.size()]));
     }
     stopQuery();
     return al;
   }
 
+  @Override
+  public boolean isDnaCoding()
+  {
+    return true;
+  }
+
 }