JAL-3436 save filePath from fileObject, tidy updateRecentlyOpened
[jalview.git] / src / jalview / io / FileLoader.java
index 1fa6957..684e59a 100755 (executable)
@@ -49,13 +49,27 @@ import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.util.StringTokenizer;
-import java.util.Vector;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.swing.SwingUtilities;
 
 public class FileLoader implements Runnable
 {
+  private static final String DEFAULT_FILE_FORMAT_PROPERTY = "DEFAULT_FILE_FORMAT";
+
+  private static final String RECENT_URL_PROPERTY = "RECENT_URL";
+
+  private static final String RECENT_FILE_PROPERTY = "RECENT_FILE";
+
+  private static final String TAB = "\t";
+
+  /*
+   * maximum number of items in file/url history lists;
+   * pseudo-constant (not final) so amendable by Groovy if wanted
+   */
+  private static int MAX_HISTORY = 11;
+
   private File selectedFile;
 
   String file;
@@ -146,17 +160,6 @@ public class FileLoader implements Runnable
   }
 
   /**
-   * Load a (file, protocol) source of unknown type
-   * 
-   * @param file
-   * @param protocol
-   */
-  public void LoadFile(String file, DataSourceType protocol)
-  {
-    loadFile(file, protocol, null);
-  }
-
-  /**
    * Load alignment from (file, protocol) and wait till loaded
    * 
    * @param file
@@ -187,36 +190,23 @@ public class FileLoader implements Runnable
   /**
    * Load alignment from (file, protocol) of type format and wait till loaded
    * 
-   * @param file
+   * @param fileObject
    * @param sourceType
    * @param format
    * @return alignFrame constructed from file contents
+   * @throws NullPointerException
+   *           if {@code file} is null
    */
-  public AlignFrame loadFileWaitTillLoaded(File file,
+  public AlignFrame loadFileWaitTillLoaded(File fileObject,
           DataSourceType sourceType, FileFormatI format)
   {
-    setFileFields(null, file, null, sourceType, format);
+    setFileFields(null, fileObject, fileObject.getPath(), sourceType, format);
     return _loadFileWaitTillLoaded();
   }
 
   /**
-   * Load alignment from FileParse source of type format and wait till loaded
-   * 
-   * @param source
-   * @param format
-   * @return alignFrame constructed from file contents
-   */
-  public AlignFrame loadFileWaitTillLoaded(AlignmentFileReaderI source,
-          FileFormatI format)
-  {
-    setFileFields(source, null, source.getInFile(),
-            source.getDataSourceType(), format);
-    return _loadFileWaitTillLoaded();
-  }
-
-  /**
-   * runs the 'run' method (in this thread), then return the alignFrame that's
-   * (hopefully) been read
+   * Runs the 'run' method (in this thread), then returns the alignFrame that
+   * (hopefully) has been constructed
    * 
    * @return
    */
@@ -226,35 +216,45 @@ public class FileLoader implements Runnable
     return alignFrame;
   }
 
+  /**
+   * Updates the Jalview properties file to add the last file or URL read to the
+   * tab-separated list in property RECENT_FILE or RECENT_URL respectively. The
+   * property is created if it does not already exist. The new entry is added as
+   * the first item (without duplication). If the list exceeds some maximum
+   * length (currently 10 entries), the oldest (last) entry is dropped.
+   * <p>
+   * Files read from the temporary file directory are not added to the property.
+   * <p>
+   * Property DEFAULT_FILE_FORMAT (e.g. "Fasta" etc) is also set if currently
+   * reading from file.
+   */
   public void updateRecentlyOpened()
   {
-    Vector<String> recent = new Vector<>();
+    List<String> recent = new ArrayList<>();
     if (protocol == DataSourceType.PASTE)
     {
       // do nothing if the file was pasted in as text... there is no filename to
       // refer to it as.
       return;
     }
-    if (file != null
-            && file.indexOf(System.getProperty("java.io.tmpdir")) > -1)
+    if (file == null
+            || file.indexOf(System.getProperty("java.io.tmpdir")) > -1)
     {
       // ignore files loaded from the system's temporary directory
       return;
     }
-    String type = protocol == DataSourceType.FILE ? "RECENT_FILE"
-            : "RECENT_URL";
+    String type = protocol == DataSourceType.FILE ? RECENT_FILE_PROPERTY
+            : RECENT_URL_PROPERTY;
 
     String historyItems = Cache.getProperty(type);
 
-    StringTokenizer st;
-
     if (historyItems != null)
     {
-      st = new StringTokenizer(historyItems, "\t");
+      String[] tokens = historyItems.split("\\t");
 
-      while (st.hasMoreTokens())
+      for (String token : tokens)
       {
-        recent.addElement(st.nextToken().trim());
+        recent.add(token.trim());
       }
     }
 
@@ -263,18 +263,18 @@ public class FileLoader implements Runnable
       recent.remove(file);
     }
 
-    StringBuffer newHistory = new StringBuffer(file);
-    for (int i = 0; i < recent.size() && i < 10; i++)
+    StringBuilder newHistory = new StringBuilder(file);
+    for (int i = 0; i < recent.size() && i < MAX_HISTORY - 1; i++)
     {
-      newHistory.append("\t");
-      newHistory.append(recent.elementAt(i));
+      newHistory.append(TAB);
+      newHistory.append(recent.get(i));
     }
 
     Cache.setProperty(type, newHistory.toString());
 
     if (protocol == DataSourceType.FILE)
     {
-      Cache.setProperty("DEFAULT_FILE_FORMAT", format.getName());
+      Cache.setProperty(DEFAULT_FILE_FORMAT_PROPERTY, format.getName());
     }
   }