Merge branch 'develop' into features/JAL-4219_extended_fasta_rna_ss
[jalview.git] / src / jalview / io / IdentifyFile.java
index ea87058..8251c22 100755 (executable)
@@ -21,6 +21,7 @@
 package jalview.io;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.Locale;
 
@@ -35,8 +36,10 @@ import jalview.bin.Console;
 public class IdentifyFile
 {
 
+  private static final String XMLHEADER = "<?XML VERSION=\"1.0\" ENCODING=\"UTF-8\" STANDALONE=\"YES\"?>";
+
   public FileFormatI identify(Object file, DataSourceType protocol)
-          throws FileFormatException
+          throws FileFormatException, FileNotFoundException
   {
     // BH 2018
     return (file instanceof File ? identify((File) file, protocol)
@@ -81,10 +84,11 @@ public class IdentifyFile
    * @throws FileFormatException
    */
   public FileFormatI identify(String file, DataSourceType sourceType)
-          throws FileFormatException
+          throws FileFormatException, FileNotFoundException
   {
     String emessage = "UNIDENTIFIED FILE PARSING ERROR";
     FileParse parser = null;
+    FileNotFoundException fnf = null;
     try
     {
       parser = new FileParse(file, sourceType);
@@ -92,6 +96,14 @@ public class IdentifyFile
       {
         return identify(parser);
       }
+    } catch (FileNotFoundException e)
+    {
+      fnf = e;
+      emessage = "Could not find '" + file + "'";
+      Console.error("Could not find '" + file + "'", e);
+    } catch (IOException e)
+    {
+      Console.error("Error whilst trying to read " + file, e);
     } catch (Exception e)
     {
       Console.error("Error whilst identifying " + file, e);
@@ -101,6 +113,10 @@ public class IdentifyFile
     {
       throw new FileFormatException(parser.errormessage);
     }
+    if (fnf != null)
+    {
+      throw (fnf);
+    }
     throw new FileFormatException(emessage);
   }
 
@@ -134,6 +150,7 @@ public class IdentifyFile
     String data;
     int bytesRead = 0;
     int trimmedLength = 0;
+    boolean isXml = false; // set true if first line is XMLHEADER
     boolean lineswereskipped = false;
     boolean isBinary = false; // true if length is non-zero and non-printable
     // characters are encountered
@@ -188,6 +205,10 @@ public class IdentifyFile
           reply = FileFormat.ScoreMatrix;
           break;
         }
+        if (data.startsWith(XMLHEADER) && !lineswereskipped)
+        {
+          isXml = true;
+        }
         if (data.startsWith("LOCUS"))
         {
           reply = FileFormat.GenBank;
@@ -346,6 +367,12 @@ public class IdentifyFile
             reply = FileFormat.Rnaml;
             break;
           }
+          if (isXml && data.contains(
+                  "<NS2:JALVIEWUSERCOLOURS SCHEMENAME=\"SEQUENCE FEATURES\" XMLNS:NS2=\"WWW.JALVIEW.ORG/COLOURS\">"))
+          {
+            reply = FileFormat.FeatureSettings;
+            break;
+          }
         }
 
         if ((data.length() < 1) || (data.indexOf("#") == 0))
@@ -481,6 +508,10 @@ public class IdentifyFile
       try
       {
         type = ider.identify(args[i], DataSourceType.FILE);
+      } catch (FileNotFoundException e)
+      {
+        Console.error(String.format("Error '%s' fetching file %s", args[i],
+                e.getMessage()));
       } catch (FileFormatException e)
       {
         Console.error(