JAL-4315 identify feature settings file from its xml schema header
authorJames Procter <j.procter@dundee.ac.uk>
Mon, 30 Oct 2023 11:23:05 +0000 (11:23 +0000)
committerJames Procter <j.procter@dundee.ac.uk>
Mon, 30 Oct 2023 11:23:18 +0000 (11:23 +0000)
src/jalview/io/FileFormat.java
src/jalview/io/IdentifyFile.java
test/jalview/gui/FeatureSettingsTest.java

index 43c6dcf..91ce527 100644 (file)
@@ -308,6 +308,21 @@ public enum FileFormat implements FileFormatI
       return new FeaturesFile();
     }
   },
+  FeatureSettings("Jalview Feature Settings File","fc",false,false)
+  {
+    @Override
+    public AlignmentFileReaderI getReader(FileParse source)
+            throws IOException
+    {
+      return null;
+    }
+
+    @Override
+    public AlignmentFileWriterI getWriter(AlignmentI al)
+    {
+      return null;
+    }    
+  },
   ScoreMatrix("Substitution matrix", "", false, false)
   {
     @Override
index ea87058..11d96a3 100755 (executable)
@@ -35,6 +35,8 @@ 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
   {
@@ -134,6 +136,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 +191,10 @@ public class IdentifyFile
           reply = FileFormat.ScoreMatrix;
           break;
         }
+        if (data.startsWith(XMLHEADER) && !lineswereskipped)
+        {
+          isXml = true;
+        }
         if (data.startsWith("LOCUS"))
         {
           reply = FileFormat.GenBank;
@@ -346,6 +353,11 @@ 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))
index 5ef693a..7cc4cc1 100644 (file)
@@ -42,7 +42,10 @@ import jalview.datamodel.features.FeatureMatcher;
 import jalview.datamodel.features.FeatureMatcherSet;
 import jalview.datamodel.features.FeatureMatcherSetI;
 import jalview.io.DataSourceType;
+import jalview.io.FileFormat;
+import jalview.io.FileFormatI;
 import jalview.io.FileLoader;
+import jalview.io.IdentifyFile;
 import jalview.schemes.FeatureColour;
 import jalview.schemes.FeatureColourTest;
 import jalview.util.matcher.Condition;
@@ -278,4 +281,13 @@ public class FeatureSettingsTest
             "<html>By Score (&gt; 4.0)<br>" + simpleTooltip
                     + "</br></html>");
   }
+  String fsfile="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><ns2:JalviewUserColours schemeName=\"Sequence Features\" xmlns:ns2=\"www.jalview.org/colours\">",fsfile2="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<ns2:JalviewUserColours schemeName=\"Sequence Features\" xmlns:ns2=\"www.jalview.org/colours\">";
+  @Test(groups="Functional")
+  public void testIdentifyFeatureSettingsFile() throws Exception
+  {
+    FileFormatI type = new IdentifyFile().identify(fsfile, DataSourceType.PASTE);
+    assertTrue(FileFormat.FeatureSettings==type,"Feature settings file was identified as "+type);
+    type = new IdentifyFile().identify(fsfile2, DataSourceType.PASTE);
+    assertTrue(FileFormat.FeatureSettings==type,"Feature settings file with newline was identified as "+type);
+  }
 }