j2sNative references moved to Platform
[jalview.git] / src / jalview / io / FileParse.java
index fddb565..80b6836 100755 (executable)
  */
 package jalview.io;
 
-import jalview.api.AlignExportSettingI;
+import jalview.api.AlignExportSettingsI;
 import jalview.api.AlignViewportI;
 import jalview.api.AlignmentViewPanel;
 import jalview.api.FeatureSettingsModelI;
 import jalview.util.MessageManager;
+import jalview.util.Platform;
 
 import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileReader;
@@ -45,6 +47,10 @@ import java.util.zip.GZIPInputStream;
  */
 public class FileParse
 {
+  protected static final String SPACE = " ";
+
+  protected static final String TAB = "\t";
+
   /**
    * text specifying source of data. usually filename or url.
    */
@@ -52,6 +58,12 @@ public class FileParse
 
   public File inFile = null;
 
+  private byte[] bytes; // from JavaScript
+
+  public byte[] getBytes()
+  {
+    return bytes;
+  }
   /**
    * a viewport associated with the current file operation. May be null. May
    * move to different object.
@@ -61,7 +73,7 @@ public class FileParse
   /**
    * specific settings for exporting data from the current context
    */
-  private AlignExportSettingI exportSettings;
+  private AlignExportSettingsI exportSettings;
 
   /**
    * sequence counter for FileParse object created from same data source
@@ -95,7 +107,7 @@ public class FileParse
    */
   protected String suffix = null;
 
-  protected String type = null;
+  protected DataSourceType dataSourceType = null;
 
   protected BufferedReader dataIn = null;
 
@@ -125,9 +137,8 @@ public class FileParse
   {
     if (from == null)
     {
-      throw new Error(
-              MessageManager
-                      .getString("error.implementation_error_null_fileparse"));
+      throw new Error(MessageManager
+              .getString("error.implementation_error_null_fileparse"));
     }
     if (from == this)
     {
@@ -139,7 +150,7 @@ public class FileParse
     suffix = from.suffix;
     errormessage = from.errormessage; // inherit potential error messages
     error = false; // reset any error condition.
-    type = from.type;
+    dataSourceType = from.dataSourceType;
     dataIn = from.dataIn;
     if (dataIn != null)
     {
@@ -204,16 +215,16 @@ public class FileParse
   private BufferedReader tryAsGzipSource(InputStream inputStream)
           throws Exception
   {
-    BufferedReader inData = new BufferedReader(new InputStreamReader(
-            new GZIPInputStream(inputStream)));
+    BufferedReader inData = new BufferedReader(
+            new InputStreamReader(new GZIPInputStream(inputStream)));
     inData.mark(2048);
     inData.read();
     inData.reset();
     return inData;
   }
 
-  private boolean checkURLSource(String fileStr) throws IOException,
-          MalformedURLException
+  private boolean checkURLSource(String fileStr)
+          throws IOException, MalformedURLException
   {
     errormessage = "URL NOT FOUND";
     URL url = new URL(fileStr);
@@ -242,10 +253,8 @@ public class FileParse
     {
       if (e != null)
       {
-        throw new IOException(
-                MessageManager
-                        .getString("exception.failed_to_resolve_gzip_stream"),
-                e);
+        throw new IOException(MessageManager
+                .getString("exception.failed_to_resolve_gzip_stream"), e);
       }
       throw q;
     }
@@ -279,9 +288,9 @@ public class FileParse
    * configurable values for the origin and the type of the source
    */
   public FileParse(BufferedReader source, String originString,
-          String typeString)
+          DataSourceType sourceType)
   {
-    type = typeString;
+    dataSourceType = sourceType;
     error = false;
     inFile = null;
     dataName = originString;
@@ -302,22 +311,44 @@ public class FileParse
    * Create a datasource for input to Jalview. See AppletFormatAdapter for the
    * types of sources that are handled.
    * 
-   * @param fileStr
-   *          - datasource locator/content
-   * @param type
+   * @param file
+   *          - datasource locator/content as File or String
+   * @param sourceType
    *          - protocol of source
    * @throws MalformedURLException
    * @throws IOException
    */
-  public FileParse(String fileStr, String type)
+  public FileParse(Object file, DataSourceType sourceType)
           throws MalformedURLException, IOException
   {
-    this.type = type;
+    if (file instanceof File)
+    {
+      parse((File) file, ((File) file).getPath(), sourceType, true);
+    }
+    else
+    {
+      parse(null, file.toString(), sourceType, false);
+    }
+  }
+
+  private void parse(File file, String fileStr, DataSourceType sourceType,
+          boolean isFileObject) throws MalformedURLException, IOException
+  {
+       bytes = Platform.getFileBytes(file);
+    this.dataSourceType = sourceType;
     error = false;
 
-    if (type.equals(AppletFormatAdapter.FILE))
+    if (sourceType == DataSourceType.FILE)
     {
-      if (checkFileSource(fileStr))
+
+      if (bytes != null)
+      {
+        // this will be from JavaScript
+        inFile = file;
+        dataIn = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(bytes)));
+        dataName = fileStr;
+      }
+      else if (checkFileSource(fileStr))
       {
         String suffixLess = extractSuffix(fileStr);
         if (suffixLess != null)
@@ -326,19 +357,26 @@ public class FileParse
           {
             throw new IOException(MessageManager.formatMessage(
                     "exception.problem_opening_file_also_tried",
-                    new String[] { inFile.getName(), suffixLess,
-                        errormessage }));
+                    new String[]
+                    { inFile.getName(), suffixLess, errormessage }));
           }
         }
         else
         {
           throw new IOException(MessageManager.formatMessage(
-                  "exception.problem_opening_file",
-                  new String[] { inFile.getName(), errormessage }));
+                  "exception.problem_opening_file", new String[]
+                  { inFile.getName(), errormessage }));
         }
       }
     }
-    else if (type.equals(AppletFormatAdapter.URL))
+    else if (sourceType == DataSourceType.RELATIVE_URL)
+    {
+      bytes = Platform.getFileAsBytes(fileStr);
+      dataIn = new BufferedReader(new java.io.InputStreamReader(new ByteArrayInputStream(bytes)));      
+      dataName = fileStr;
+
+    }
+    else if (sourceType == DataSourceType.URL)
     {
       try
       {
@@ -375,13 +413,13 @@ public class FileParse
         error = true;
       }
     }
-    else if (type.equals(AppletFormatAdapter.PASTE))
+    else if (sourceType == DataSourceType.PASTE)
     {
       errormessage = "PASTE INACCESSIBLE!";
       dataIn = new BufferedReader(new StringReader(fileStr));
       dataName = "Paste";
     }
-    else if (type.equals(AppletFormatAdapter.CLASSLOADER))
+    else if (sourceType == DataSourceType.CLASSLOADER)
     {
       errormessage = "RESOURCE CANNOT BE LOCATED";
       java.io.InputStream is = getClass()
@@ -407,7 +445,7 @@ public class FileParse
     else
     {
       errormessage = "PROBABLE IMPLEMENTATION ERROR : Datasource Type given as '"
-              + (type != null ? type : "null") + "'";
+              + (sourceType != null ? sourceType : "null") + "'";
       error = true;
     }
     if (dataIn == null || error)
@@ -415,7 +453,8 @@ public class FileParse
       // pass up the reason why we have no source to read from
       throw new IOException(MessageManager.formatMessage(
               "exception.failed_to_read_data_from_source",
-              new String[] { errormessage }));
+              new String[]
+              { errormessage }));
     }
     error = false;
     dataIn.mark(READAHEAD_LIMIT);
@@ -446,9 +485,9 @@ public class FileParse
     {
       return dataIn.readLine();
     }
-    throw new IOException(MessageManager.formatMessage(
-            "exception.invalid_source_stream",
-            new String[] { errormessage }));
+    throw new IOException(MessageManager
+            .formatMessage("exception.invalid_source_stream", new String[]
+            { errormessage }));
   }
 
   /**
@@ -501,9 +540,8 @@ public class FileParse
     }
     else
     {
-      throw new IOException(
-              MessageManager
-                      .getString("error.implementation_error_reset_called_for_invalid_source"));
+      throw new IOException(MessageManager.getString(
+              "error.implementation_error_reset_called_for_invalid_source"));
     }
   }
 
@@ -584,7 +622,7 @@ public class FileParse
   /**
    * @return the currently configured exportSettings for writing data.
    */
-  public AlignExportSettingI getExportSettings()
+  public AlignExportSettingsI getExportSettings()
   {
     return exportSettings;
   }
@@ -595,7 +633,7 @@ public class FileParse
    * @param exportSettings
    *          the exportSettings to set
    */
-  public void setExportSettings(AlignExportSettingI exportSettings)
+  public void setExportSettings(AlignExportSettingsI exportSettings)
   {
     this.exportSettings = exportSettings;
   }
@@ -625,4 +663,9 @@ public class FileParse
   {
     return null;
   }
+
+  public DataSourceType getDataSourceType()
+  {
+    return dataSourceType;
+  }
 }