Merge branch 'Release_2_8_2_Branch' into JAL-429_phylip-file-support
authorJim Procter <j.procter@dundee.ac.uk>
Mon, 6 Oct 2014 15:33:17 +0000 (16:33 +0100)
committerJim Procter <j.procter@dundee.ac.uk>
Mon, 6 Oct 2014 15:33:17 +0000 (16:33 +0100)
Conflicts:
src/jalview/io/AppletFormatAdapter.java

1  2 
src/jalview/io/AppletFormatAdapter.java
src/jalview/io/FileParse.java
src/jalview/io/JalviewFileChooser.java

@@@ -1,41 -1,39 +1,42 @@@
  /*
   * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
   * Copyright (C) 2014 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 
 + * 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 
 + *
 + * 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/>.
   * The Jalview Authors are detailed in the 'AUTHORS' file.
   */
  package jalview.io;
  
 +import jalview.api.AlignViewportI;
 +import jalview.datamodel.Alignment;
 +import jalview.datamodel.AlignmentAnnotation;
 +import jalview.datamodel.AlignmentI;
 +import jalview.datamodel.AlignmentView;
++import jalview.util.MessageManager;
 +
  import java.io.File;
  import java.io.InputStream;
  import java.util.List;
  
 -import jalview.api.AlignViewportI;
 -import jalview.datamodel.*;
 -import jalview.util.MessageManager;
 -
  /**
   * A low level class for alignment and feature IO with alignment formatting
   * methods used by both applet and application for generating flat alignment
   * files. It also holds the lists of magic format names that the applet and
   * application will allow the user to read or write files with.
 - * 
 + *
   * @author $author$
   * @version $Revision$
   */
@@@ -45,48 -43,47 +46,48 @@@ public class AppletFormatAdapte
     * List of valid format strings used in the isValidFormat method
     */
    public static final String[] READABLE_FORMATS = new String[]
 -  { "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "STH",
 -      "PDB", "JnetFile", "RNAML" }; // , "SimpleBLAST" };
 +          { "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "STH",
 +    "PDB", "JnetFile", "RNAML", PhylipFile.FILE_DESC }; // , "SimpleBLAST" };
  
    /**
     * List of valid format strings for use by callers of the formatSequences
     * method
     */
    public static final String[] WRITEABLE_FORMATS = new String[]
 -  { "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "AMSA", "STH" };
 +          { "BLC", "CLUSTAL", "FASTA", "MSF", "PileUp", "PIR", "PFAM", "AMSA",
 +    "STH", PhylipFile.FILE_DESC };
  
    /**
     * List of extensions corresponding to file format types in WRITABLE_FNAMES
     * that are writable by the application.
     */
    public static final String[] WRITABLE_EXTENSIONS = new String[]
 -  { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa",
 -      "jvp", "sto,stk", "jar" };
 +          { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa",
 +    "jvp", "sto,stk", "jar", PhylipFile.FILE_EXT };
  
    /**
     * List of writable formats by the application. Order must correspond with the
     * WRITABLE_EXTENSIONS list of formats.
     */
    public static final String[] WRITABLE_FNAMES = new String[]
 -  { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Jalview",
 -      "STH", "Jalview" };
 +          { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Jalview",
 +    "STH", "Jalview", PhylipFile.FILE_DESC };
  
    /**
     * List of readable format file extensions by application in order
     * corresponding to READABLE_FNAMES
     */
    public static final String[] READABLE_EXTENSIONS = new String[]
 -  { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa",
 -      "jar,jvp", "sto,stk", "xml,rnaml" }; // ".blast"
 +          { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa",
 +    "jar,jvp", "sto,stk", "xml,rnaml", PhylipFile.FILE_EXT }; // ".blast"
  
    /**
     * List of readable formats by application in order corresponding to
     * READABLE_EXTENSIONS
     */
    public static final String[] READABLE_FNAMES = new String[]
 -  { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Jalview",
 -      "Stockholm", "RNAML" };// ,
 +          { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Jalview",
 +    "Stockholm", "RNAML", PhylipFile.FILE_DESC };// ,
  
    // "SimpleBLAST"
    // };
@@@ -98,7 -95,7 +99,7 @@@
            + prettyPrint(READABLE_FORMATS);
  
    /**
 -   * 
 +   *
     * @param els
     * @return grammatically correct(ish) list consisting of els elements.
     */
  
    /**
     * check that this format is valid for reading
 -   * 
 +   *
     * @param format
     *          a format string to be compared with READABLE_FORMATS
     * @return true if format is readable
  
    /**
     * validate format is valid for IO
 -   * 
 +   *
     * @param format
     *          a format string to be compared with either READABLE_FORMATS or
     *          WRITEABLE_FORMATS
      boolean valid = false;
      String[] format_list = (forwriting) ? WRITEABLE_FORMATS
              : READABLE_FORMATS;
 -    for (int i = 0; i < format_list.length; i++)
 +    for (String element : format_list)
      {
 -      if (format_list[i].equalsIgnoreCase(format))
 +      if (element.equalsIgnoreCase(format))
        {
          return true;
        }
  
    /**
     * Constructs the correct filetype parser for a characterised datasource
 -   * 
 +   *
     * @param inFile
     *          data/data location
     * @param type
     *          type of datasource
     * @param format
     *          File format of data provided by datasource
 -   * 
 +   *
     * @return DOCUMENT ME!
     */
    public Alignment readFile(String inFile, String type, String format)
        {
          afile = new SimpleBlastFile(inFile, type);
        }
 +      else if (format.equals(PhylipFile.FILE_DESC))
 +      {
 +        afile = new PhylipFile(inFile, type);
 +      }
        else if (format.equals("RNAML"))
        {
          afile = new RnamlFile(inFile, type);
  
    /**
     * Constructs the correct filetype parser for an already open datasource
 -   * 
 +   *
     * @param source
     *          an existing datasource
     * @param format
     *          File format of data that will be provided by datasource
 -   * 
 +   *
     * @return DOCUMENT ME!
     */
    public AlignmentI readFromFile(FileParse source, String format)
        {
          afile = new SimpleBlastFile(source);
        }
 -
 +      else if (format.equals(PhylipFile.FILE_DESC))
 +      {
 +        afile = new PhylipFile(source);
 +      }
        Alignment al = new Alignment(afile.getSeqsAsArray());
  
        afile.addAnnotations(al);
  
  
    /**
 -   * create an alignment flatfile from a Jalview alignment view 
 +   * create an alignment flatfile from a Jalview alignment view
     * @param format
     * @param jvsuffix
     * @param av
          aselview.addAnnotation(aa);
        }
      }
 -    
 +
      return formatSequences(format, aselview, jvsuffix);
    }
 -  
 +
    /**
     * Construct an output class for an alignment in a particular filetype TODO:
     * allow caller to detect errors and warnings encountered when generating
     * output
 -   * 
 +   *
     * @param format
     *          string name of alignment format
     * @param alignment
     * @param jvsuffix
     *          passed to AlnFile class controls whether /START-END is added to
     *          sequence names
 -   * 
 +   *
     * @return alignment flat file contents
     */
    public String formatSequences(String format, AlignmentI alignment,
        {
          afile = new AMSAFile(alignment);
        }
 +      else if (format.equalsIgnoreCase(PhylipFile.FILE_DESC))
 +      {
 +        afile = new PhylipFile();
 +      }
        else if (format.equalsIgnoreCase("RNAML"))
        {
          afile = new RnamlFile();
  
        else
        {
-         throw new Exception(
-                 "Implementation error: Unknown file format string");
+         throw new Exception(MessageManager.getString("error.implementation_error_unknown_file_format_string"));
        }
        afile.setNewlineString(newline);
        afile.addJVSuffix(jvsuffix);
              } catch (Exception e)
              {
                System.err
 -                      .println("Couln't format the alignment for output as a FASTA file.");
 +              .println("Couln't format the alignment for output as a FASTA file.");
                e.printStackTrace(System.err);
              }
            }
            }
            System.out.println("Read took " + (t1 / 1000.0) + " seconds.");
            System.out
 -                  .println("Difference between free memory now and before is "
 -                          + (memf / (1024.0 * 1024.0) * 1.0) + " MB");
 +          .println("Difference between free memory now and before is "
 +                  + (memf / (1024.0 * 1024.0) * 1.0) + " MB");
          } catch (Exception e)
          {
            System.err.println("Exception when dealing with " + i
    /**
     * try to discover how to access the given file as a valid datasource that
     * will be identified as the given type.
 -   * 
 +   *
     * @param file
     * @param format
     * @return protocol that yields the data parsable as the given type
      } catch (Exception ex)
      {
        System.err
 -              .println("Exception checking resources: " + file + " " + ex);
 +      .println("Exception checking resources: " + file + " " + ex);
      }
  
      if (file.indexOf("://") > -1)
            if (debug)
            {
              System.out
 -                    .println("File deemed not accessible via " + protocol);
 +            .println("File deemed not accessible via " + protocol);
            }
            fp.close();
            return null;
@@@ -20,6 -20,8 +20,8 @@@
   */
  package jalview.io;
  
+ import jalview.util.MessageManager;
  import java.io.*;
  import java.net.*;
  import java.util.zip.GZIPInputStream;
@@@ -50,7 -52,7 +52,7 @@@ public class FilePars
  
    public void setNewlineString(String nl)
    {
 -    newline = nl;
 +      newline = nl;
    }
  
    public String getNewlineString()
@@@ -94,8 -96,7 +96,7 @@@
    {
      if (from == null)
      {
-       throw new Error(
-               "Implementation error. Null FileParse in copy constructor");
+       throw new Error(MessageManager.getString("error.implementation_error_null_fileparse"));
      }
      if (from == this)
        return;
      {
        if (e != null)
        {
-         throw new IOException("Failed to resolve GZIP stream", e);
+         throw new IOException(MessageManager.getString("exception.failed_to_resolve_gzip_stream"), e);
        }
        throw q;
      }
          {
            if (checkFileSource(suffixLess))
            {
-             throw new IOException("Problem opening " + inFile
-                     + " (also tried " + suffixLess + ") : " + errormessage);
+             throw new IOException(MessageManager.formatMessage("exception.problem_opening_file_also_tried", new String[]{inFile.getName(),suffixLess,errormessage}));
            }
          }
          else
          {
-           throw new IOException("Problem opening " + inFile + " : "
-                   + errormessage);
+           throw new IOException(MessageManager.formatMessage("exception.problem_opening_file", new String[]{inFile.getName(),errormessage}));
          }
        }
      }
      if (dataIn == null || error)
      {
        // pass up the reason why we have no source to read from
-       throw new IOException("Failed to read data from source:\n"
-               + errormessage);
+       throw new IOException(MessageManager.formatMessage("exception.failed_to_read_data_from_source", new String[]{errormessage}));
      }
      error = false;
      dataIn.mark(READAHEAD_LIMIT);
      }
      else
      {
-       throw new IOException("Unitialised Source Stream");
+       throw new IOException(MessageManager.getString("exception.no_init_source_stream"));
      }
    }
  
    {
      if (!error)
        return dataIn.readLine();
-     throw new IOException("Invalid Source Stream:" + errormessage);
+     throw new IOException(MessageManager.formatMessage("exception.invalid_source_stream", new String[]{errormessage}));
    }
  
    public boolean isValid()
      }
      else
      {
-       throw new IOException(
-               "Implementation Error: Reset called for invalid source.");
+       throw new IOException(MessageManager.getString("error.implementation_error_reset_called_for_invalid_source"));
      }
    }
  
@@@ -1,19 -1,19 +1,19 @@@
  /*
   * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.2)
   * Copyright (C) 2014 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 
 + * 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 
 + *
 + * 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/>.
   * The Jalview Authors are detailed in the 'AUTHORS' file.
@@@ -23,31 -23,21 +23,31 @@@ package jalview.io
  
  import jalview.util.MessageManager;
  
 -import java.io.*;
 -import java.util.*;
 -
 -import java.awt.*;
 -import java.awt.event.*;
 -import javax.swing.*;
 +import java.awt.Component;
 +import java.awt.Dimension;
 +import java.awt.EventQueue;
 +import java.awt.HeadlessException;
 +import java.awt.event.MouseAdapter;
 +import java.awt.event.MouseEvent;
 +import java.io.File;
 +import java.util.StringTokenizer;
 +import java.util.Vector;
 +
 +import javax.swing.DefaultListCellRenderer;
 +import javax.swing.JFileChooser;
 +import javax.swing.JList;
 +import javax.swing.JOptionPane;
 +import javax.swing.JPanel;
 +import javax.swing.JScrollPane;
  
  /**
   * Enhanced file chooser dialog box.
 - * 
 + *
   * NOTE: bug on Windows systems when filechooser opened on directory to view
   * files with colons in title.
 - * 
 + *
   * @author AMW
 - * 
 + *
   */
  public class JalviewFileChooser extends JFileChooser
  {
      setAccessory(new RecentlyOpened());
    }
  
 +  @Override
    public void setFileFilter(javax.swing.filechooser.FileFilter filter)
    {
      super.setFileFilter(filter);
  
          EventQueue.invokeLater(new Thread()
          {
 +          @Override
            public void run()
            {
              String currentName = ui.getFileName();
      {
        format = "PFAM";
      }
 +    else if (format.toUpperCase().startsWith(PhylipFile.FILE_DESC))
 +    {
 +      format = PhylipFile.FILE_DESC;
 +    }
  
      return format;
    }
  
 +  @Override
    public int showSaveDialog(Component parent) throws HeadlessException
    {
      this.setAccessory(null);
              && getSelectedFile().exists())
      {
        int confirm = JOptionPane.showConfirmDialog(parent,
-               "Overwrite existing file?", "File exists",
+               MessageManager.getString("label.overwrite_existing_file"), MessageManager.getString("label.file_already_exists"),
                JOptionPane.YES_NO_OPTION);
  
        if (confirm != JOptionPane.YES_OPTION)
  
        list.addMouseListener(new MouseAdapter()
        {
 +        @Override
          public void mousePressed(MouseEvent evt)
          {
            recentListSelectionChanged(list.getSelectedValue());
          }
        });
  
-       this.setBorder(new javax.swing.border.TitledBorder("Recently Opened"));
+       this.setBorder(new javax.swing.border.TitledBorder(MessageManager.getString("label.recently_opened")));
  
        final JScrollPane scroller = new JScrollPane(list);
        scroller.setPreferredSize(new Dimension(130, 200));
  
        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
 +        @Override
          public void run()
          {
            scroller.getHorizontalScrollBar().setValue(