JAL-3210 Improvements to eclipse detection. New src tree and SwingJS updated from...
[jalview.git] / src / jalview / io / RnamlFile.java
index f108994..d5a8d81 100644 (file)
@@ -1,32 +1,41 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
- * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
+ * 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.io;
 
+import jalview.analysis.Rna;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
+import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
+
+import com.stevesoft.pat.Regex;
 
 import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
 import fr.orsay.lri.varna.exceptions.ExceptionLoadingFailed;
@@ -46,7 +55,7 @@ public class RnamlFile extends AlignFile
 
   }
 
-  public RnamlFile(String inFile, String type) throws IOException
+  public RnamlFile(String inFile, DataSourceType type) throws IOException
   {
     super(inFile, type);
 
@@ -58,20 +67,6 @@ public class RnamlFile extends AlignFile
 
   }
 
-  // public RnamlFile(BufferedReader r) throws IOException,
-  // ExceptionFileFormatOrSyntax, ParserConfigurationException, SAXException,
-  // ExceptionPermissionDenied, ExceptionLoadingFailed
-  // {
-  // super();
-  // parse(r);
-  // // sets the index of each sequence in the alignment
-  // for( int i=0,c=seqs.size(); i<c; i++ ) {
-  // seqs.get(i).setIndex(i);
-  // }
-  //
-  //
-  // }
-
   public BufferedReader CreateReader() throws FileNotFoundException
   {
     FileReader fr = null;
@@ -81,90 +76,144 @@ public class RnamlFile extends AlignFile
     return r;
   }
 
+  /*
+   * (non-Javadoc)
+   * 
+   * @see jalview.io.AlignFile#parse()
+   */
+  @Override
   public void parse() throws IOException
   {
-    if (System.getProperty("java.version").indexOf("1.6")>-1 || System.getProperty("java.version").indexOf("1.5")>-1)
+    if (System.getProperty("java.version").indexOf("1.6") > -1
+            || System.getProperty("java.version").indexOf("1.5") > -1)
     {
-      // patch for 'This parser does not support specification "null" version "null"' error
-      // this hack ensures we get a properly updated SAXParserFactory on older JVMs
+      // patch for 'This parser does not support specification "null" version
+      // "null"' error
+      // this hack ensures we get a properly updated SAXParserFactory on older
+      // JVMs
       // thanks to Stefan Birkner over at https://coderwall.com/p/kqsrrw
-      System.setProperty("javax.xml.parsers.SAXParserFactory", "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
+      System.setProperty("javax.xml.parsers.SAXParserFactory",
+              "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
     }
-    result = null;
+    // rather than lose exception semantics whilst parsing RNAML with VARNA we
+    // wrap the routine and catch all exceptions before passing them up the
+    // chain as an IOException
     try
     {
-      result = RNAFactory.loadSecStrRNAML(getReader());
-
+      _parse();
     } catch (ExceptionPermissionDenied pdx)
     {
-      errormessage = "Couldn't access datasource (" + pdx.getMessage()
-              + ")";
+      errormessage = MessageManager.formatMessage(
+              "exception.rnaml_couldnt_access_datasource", new String[]
+              { pdx.getMessage() });
       throw new IOException(pdx);
     } catch (ExceptionLoadingFailed lf)
     {
-      errormessage = "Couldn't process data as RNAML file ("
-              + lf.getMessage() + ")";
+      errormessage = MessageManager.formatMessage(
+              "exception.ranml_couldnt_process_data", new String[]
+              { lf.getMessage() });
       throw new IOException(lf);
     } catch (ExceptionFileFormatOrSyntax iff)
     {
-      errormessage = "Invalid RNAML file (" + iff.getMessage() + ")";
+      errormessage = MessageManager
+              .formatMessage("exception.ranml_invalid_file", new String[]
+              { iff.getMessage() });
       throw new IOException(iff);
+    } catch (Exception x)
+    {
+      error = true;
+      errormessage = MessageManager.formatMessage(
+              "exception.ranml_problem_parsing_data", new String[]
+              { x.getMessage() });
+      throw new IOException(errormessage, x);
     }
+  }
 
-    SequenceI[] seqs = new SequenceI[result.size()];
+  @SuppressWarnings("unchecked")
+  public void _parse()
+          throws FileNotFoundException, ExceptionPermissionDenied,
+          ExceptionLoadingFailed, ExceptionFileFormatOrSyntax
+  {
+
+    result = RNAFactory.loadSecStrRNAML(getReader());
+
+    // ArrayList<ArrayList> allarray = new ArrayList();
+    // ArrayList<ArrayList<SimpleBP>> BP = new ArrayList();
+    // ArrayList strucinarray = new ArrayList();
+    SequenceI[] sqs = new SequenceI[result.size()];
 
     for (int i = 0; i < result.size(); i++)
     {
-      // DEBUG System.err.println("RNAML entry "+i);
+
       RNA current = result.get(i);
-      String seq = current.getSeq();
-      // DEBUG System.err.println(seq);
       String rna = current.getStructDBN(true);
-      // DEBUG System.err.println(rna);
-
+      String seq = current.getSeq();
       int begin = 1;
-      int end = seq.length(); // TODO: compute non-gapped length for sequence
+      int end = seq.length();
 
       id = current.getName();
-      seqs[i] = new Sequence(id, seq, begin, end);
+      if (id == null || id.trim().length() == 0)
+      {
+        id = safeName(getDataName());
+        if (result.size() > 1)
+        {
+          id += "." + i;
+        }
+      }
+      sqs[i] = new Sequence(id, seq, begin, end);
 
+      sqs[i].setEnd(sqs[i].findPosition(sqs[i].getLength()));
       String[] annot = new String[rna.length()];
       Annotation[] ann = new Annotation[rna.length()];
 
       for (int j = 0; j < rna.length(); j++)
       {
-        annot[j] = rna.substring(j, j + 1);
+        annot[j] = "" + rna.charAt(j);
 
       }
-
       for (int k = 0; k < rna.length(); k++)
       {
         ann[k] = new Annotation(annot[k], "",
-                jalview.schemes.ResidueProperties.getRNASecStrucState(
-                        annot[k]).charAt(0), 0f);
-
+                Rna.getRNASecStrucState(annot[k]).charAt(0), 0f);
       }
-      AlignmentAnnotation align = new AlignmentAnnotation("Sec. str.",
-              current.getID(), ann);
 
-      seqs[i].addAlignmentAnnotation(align);
-      seqs[i].setRNA(result.get(i));
+      AlignmentAnnotation align = new AlignmentAnnotation(
+              "Secondary Structure",
+              current.getID().trim().length() > 0
+                      ? "Secondary Structure for " + current.getID()
+                      : "",
+              ann);
+
+      sqs[i].addAlignmentAnnotation(align);
+      sqs[i].setRNA(result.get(i));
+
+      // allarray.add(strucinarray);
+
       annotations.addElement(align);
+      // BP.add(align.bps);
+
     }
-    setSeqs(seqs);
+
+    setSeqs(sqs);
   }
 
-  public static String print(SequenceI[] s)
+  @Override
+  public String print(SequenceI[] s, boolean jvSuffix)
   {
-    // TODO: implement RNAML export option
     return "not yet implemented";
   }
 
-  public String print()
+  public List<RNA> getRNA()
   {
-    return print(getSeqsAsArray());
+    return result;
   }
 
+  // public static void main(String[] args) {
+  // Pattern p= Pattern.compile("(.+)[.][^.]+");
+  // Matcher m = p.matcher("toto.xml.zip");
+  // System.out.println(m.matches());
+  // System.out.println(m.group(1));
+  // }
   /**
    * make a friendly ID string.
    * 
@@ -174,13 +223,27 @@ public class RnamlFile extends AlignFile
   private String safeName(String dataName)
   {
     int b = 0;
-    while ((b = dataName.indexOf("/")) > -1 && b < dataName.length())
+    if ((b = dataName.lastIndexOf(".")) > 0)
     {
-      dataName = dataName.substring(b + 1).trim();
-
+      dataName = dataName.substring(0, b - 1);
+    }
+    b = 0;
+    Regex m = getSafeRegex();
+    String mm = dataName;
+    while (m.searchFrom(dataName, b))
+    {
+      mm = m.stringMatched();
+      b = m.matchedTo();
     }
-    int e = (dataName.length() - dataName.indexOf(".")) + 1;
-    dataName = dataName.substring(1, e).trim();
-    return dataName;
+    return mm;
+  }
+
+  private static Regex SAFE_REGEX;
+
+  private static Regex getSafeRegex()
+  {
+    return (SAFE_REGEX == null
+            ? SAFE_REGEX = Platform.newRegex("[\\/]?([-A-Za-z0-9]+)\\.?", null)
+            : SAFE_REGEX);
   }
 }