Merge branch 'develop' into features/JAL-653_gffalignments
[jalview.git] / src / jalview / io / AppletFormatAdapter.java
index 41fac7f..de9e6bd 100755 (executable)
  */
 package jalview.io;
 
+import java.io.File;
+import java.io.InputStream;
+import java.util.List;
+
 import jalview.api.AlignViewportI;
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
@@ -28,10 +32,6 @@ import jalview.datamodel.AlignmentView;
 import jalview.datamodel.SequenceGroup;
 import jalview.util.MessageManager;
 
-import java.io.File;
-import java.io.InputStream;
-import java.util.List;
-
 /**
  * A low level class for alignment and feature IO with alignment formatting
  * methods used by both applet and application for generating flat alignment
@@ -43,12 +43,46 @@ import java.util.List;
  */
 public class AppletFormatAdapter
 {
+  private AlignViewportI viewport;
+
+  public static String FILE = "File";
+
+  public static String URL = "URL";
+
+  public static String PASTE = "Paste";
+
+  public static String CLASSLOADER = "ClassLoader";
+
+  /**
+   * add jalview-derived non-secondary structure annotation from PDB structure
+   */
+  boolean annotFromStructure = false;
+
+  /**
+   * add secondary structure from PDB data with built-in algorithms
+   */
+  boolean localSecondaryStruct = false;
+
+  /**
+   * process PDB data with web services
+   */
+  boolean serviceSecondaryStruct = false;
+
+  private AlignFile alignFile = null;
+
+  String inFile;
+
+  /**
+   * character used to write newlines
+   */
+  protected String newline = System.getProperty("line.separator");
+
   /**
    * 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", PhylipFile.FILE_DESC, JSONFile.FILE_DESC,
+      "PDB", "JnetFile", "RNAML", PhylipFile.FILE_DESC, JSONFile.FILE_DESC, IdentifyFile.GFF3File,
       "HTML" };
 
   /**
@@ -58,6 +92,7 @@ public class AppletFormatAdapter
   public static final String[] READABLE_EXTENSIONS = new String[]
   { "fa, fasta, mfa, fastq", "aln", "pfam", "msf", "pir", "blc", "amsa",
       "sto,stk", "xml,rnaml", PhylipFile.FILE_EXT, JSONFile.FILE_EXT,
+      ".gff2,gff3",
       "jar,jvp", HtmlFile.FILE_EXT };
 
   /**
@@ -66,7 +101,7 @@ public class AppletFormatAdapter
    */
   public static final String[] READABLE_FNAMES = new String[]
   { "Fasta", "Clustal", "PFAM", "MSF", "PIR", "BLC", "AMSA", "Stockholm",
-      "RNAML", PhylipFile.FILE_DESC, JSONFile.FILE_DESC, "Jalview",
+      "RNAML", PhylipFile.FILE_DESC, JSONFile.FILE_DESC, IdentifyFile.GFF3File, "Jalview",
       HtmlFile.FILE_DESC };
 
   /**
@@ -99,6 +134,15 @@ public class AppletFormatAdapter
   public static String SUPPORTED_FORMATS = "Formats currently supported are\n"
           + prettyPrint(READABLE_FORMATS);
 
+  public AppletFormatAdapter()
+  {
+  }
+
+  public AppletFormatAdapter(AlignViewportI viewport)
+  {
+    this.viewport = viewport;
+  }
+
   /**
    *
    * @param els
@@ -116,37 +160,6 @@ public class AppletFormatAdapter
     return list.toString();
   }
 
-  public static String FILE = "File";
-
-  public static String URL = "URL";
-
-  public static String PASTE = "Paste";
-
-  public static String CLASSLOADER = "ClassLoader";
-
-  /**
-   * add jalview-derived non-secondary structure annotation from PDB structure
-   */
-  boolean annotFromStructure = false;
-
-  /**
-   * add secondary structure from PDB data with built-in algorithms
-   */
-  boolean localSecondaryStruct = false;
-
-  /**
-   * process PDB data with web services
-   */
-  boolean serviceSecondaryStruct = false;
-
-  AlignFile afile = null;
-
-  String inFile;
-
-  /**
-   * character used to write newlines
-   */
-  protected String newline = System.getProperty("line.separator");
 
   public void setNewlineString(String nl)
   {
@@ -220,73 +233,75 @@ public class AppletFormatAdapter
       Alignment al;
       if (format.equals("FASTA"))
       {
-        afile = new FastaFile(inFile, type);
+        alignFile = new FastaFile(inFile, type);
       }
       else if (format.equals("MSF"))
       {
-        afile = new MSFfile(inFile, type);
+        alignFile = new MSFfile(inFile, type);
       }
       else if (format.equals("PileUp"))
       {
-        afile = new PileUpfile(inFile, type);
+        alignFile = new PileUpfile(inFile, type);
       }
       else if (format.equals("CLUSTAL"))
       {
-        afile = new ClustalFile(inFile, type);
+        alignFile = new ClustalFile(inFile, type);
       }
       else if (format.equals("BLC"))
       {
-        afile = new BLCFile(inFile, type);
+        alignFile = new BLCFile(inFile, type);
       }
       else if (format.equals("PIR"))
       {
-        afile = new PIRFile(inFile, type);
+        alignFile = new PIRFile(inFile, type);
       }
       else if (format.equals("PFAM"))
       {
-        afile = new PfamFile(inFile, type);
+        alignFile = new PfamFile(inFile, type);
       }
       else if (format.equals("JnetFile"))
       {
-        afile = new JPredFile(inFile, type);
-        ((JPredFile) afile).removeNonSequences();
+        alignFile = new JPredFile(inFile, type);
+        ((JPredFile) alignFile).removeNonSequences();
       }
       else if (format.equals("PDB"))
       {
-        afile = new MCview.PDBfile(annotFromStructure,
+        alignFile = new MCview.PDBfile(annotFromStructure,
                 localSecondaryStruct, serviceSecondaryStruct, inFile, type);
         // Uncomment to test Jmol data based PDB processing: JAL-1213
         // afile = new jalview.ext.jmol.PDBFileWithJmol(inFile, type);
       }
       else if (format.equals("STH"))
       {
-        afile = new StockholmFile(inFile, type);
+        alignFile = new StockholmFile(inFile, type);
       }
       else if (format.equals("SimpleBLAST"))
       {
-        afile = new SimpleBlastFile(inFile, type);
+        alignFile = new SimpleBlastFile(inFile, type);
       }
       else if (format.equals(PhylipFile.FILE_DESC))
       {
-        afile = new PhylipFile(inFile, type);
+        alignFile = new PhylipFile(inFile, type);
       }
       else if (format.equals(JSONFile.FILE_DESC))
       {
-        afile = new JSONFile(inFile, type);
-        al = new Alignment(afile.getSeqsAsArray());
-        afile.addAnnotations(al);
-        for (SequenceGroup sg : afile.getSeqGroups())
+        alignFile = new JSONFile(inFile, type);
+        al = new Alignment(alignFile.getSeqsAsArray());
+        alignFile.addAnnotations(al);
+        ((JSONFile) alignFile).setViewport(viewport);
+        for (SequenceGroup sg : alignFile.getSeqGroups())
         {
           al.addGroup(sg);
         }
+
         return al;
       }
       else if (format.equals(HtmlFile.FILE_DESC))
       {
-        afile = new HtmlFile(inFile, type);
-        al = new Alignment(afile.getSeqsAsArray());
-        afile.addAnnotations(al);
-        for (SequenceGroup sg : afile.getSeqGroups())
+        alignFile = new HtmlFile(inFile, type);
+        al = new Alignment(alignFile.getSeqsAsArray());
+        alignFile.addAnnotations(al);
+        for (SequenceGroup sg : alignFile.getSeqGroups())
         {
           al.addGroup(sg);
         }
@@ -294,12 +309,16 @@ public class AppletFormatAdapter
       }
       else if (format.equals("RNAML"))
       {
-        afile = new RnamlFile(inFile, type);
+        alignFile = new RnamlFile(inFile, type);
+      }
+      else if (format.equals(IdentifyFile.GFF3File))
+      {
+        alignFile = new Gff3File(inFile, type);
       }
 
-      al = new Alignment(afile.getSeqsAsArray());
+      al = new Alignment(alignFile.getSeqsAsArray());
 
-      afile.addAnnotations(al);
+      alignFile.addAnnotations(al);
 
       return al;
     } catch (Exception e)
@@ -320,11 +339,11 @@ public class AppletFormatAdapter
         try
         {
           // Possible sequence is just residues with no label
-          afile = new FastaFile(">UNKNOWN\n" + inFile, "Paste");
-          Alignment al = new Alignment(afile.getSeqsAsArray());
+          alignFile = new FastaFile(">UNKNOWN\n" + inFile, "Paste");
+          Alignment al = new Alignment(alignFile.getSeqsAsArray());
 
-          afile.addSeqGroups(al);
-          afile.addAnnotations(al);
+          alignFile.addSeqGroups(al);
+          alignFile.addAnnotations(al);
           return al;
 
         } catch (Exception ex)
@@ -367,72 +386,76 @@ public class AppletFormatAdapter
       Alignment al;
       if (format.equals("FASTA"))
       {
-        afile = new FastaFile(source);
+        alignFile = new FastaFile(source);
       }
       else if (format.equals("MSF"))
       {
-        afile = new MSFfile(source);
+        alignFile = new MSFfile(source);
       }
       else if (format.equals("PileUp"))
       {
-        afile = new PileUpfile(source);
+        alignFile = new PileUpfile(source);
       }
       else if (format.equals("CLUSTAL"))
       {
-        afile = new ClustalFile(source);
+        alignFile = new ClustalFile(source);
       }
       else if (format.equals("BLC"))
       {
-        afile = new BLCFile(source);
+        alignFile = new BLCFile(source);
       }
       else if (format.equals("PIR"))
       {
-        afile = new PIRFile(source);
+        alignFile = new PIRFile(source);
       }
       else if (format.equals("PFAM"))
       {
-        afile = new PfamFile(source);
+        alignFile = new PfamFile(source);
       }
       else if (format.equals("JnetFile"))
       {
-        afile = new JPredFile(source);
-        ((JPredFile) afile).removeNonSequences();
+        alignFile = new JPredFile(source);
+        ((JPredFile) alignFile).removeNonSequences();
       }
       else if (format.equals("PDB"))
       {
-        afile = new MCview.PDBfile(annotFromStructure,
+        alignFile = new MCview.PDBfile(annotFromStructure,
                 localSecondaryStruct, serviceSecondaryStruct, source);
       }
       else if (format.equals("STH"))
       {
-        afile = new StockholmFile(source);
+        alignFile = new StockholmFile(source);
       }
       else if (format.equals("RNAML"))
       {
-        afile = new RnamlFile(source);
+        alignFile = new RnamlFile(source);
       }
       else if (format.equals("SimpleBLAST"))
       {
-        afile = new SimpleBlastFile(source);
+        alignFile = new SimpleBlastFile(source);
       }
       else if (format.equals(PhylipFile.FILE_DESC))
       {
-        afile = new PhylipFile(source);
+        alignFile = new PhylipFile(source);
+      }
+      else if (format.equals(IdentifyFile.GFF3File))
+      {
+        alignFile = new Gff3File(inFile, type);
       }
       else if (format.equals(JSONFile.FILE_DESC))
       {
-        afile = new JSONFile(source);
-        al = new Alignment(afile.getSeqsAsArray());
-        afile.addAnnotations(al);
-        afile.addSeqGroups(al);
+        alignFile = new JSONFile(source);
+        al = new Alignment(alignFile.getSeqsAsArray());
+        alignFile.addAnnotations(al);
+        alignFile.addSeqGroups(al);
         return al;
       }
       else if (format.equals(HtmlFile.FILE_DESC))
       {
-        afile = new HtmlFile(source);
+        alignFile = new HtmlFile(source);
       }
-      al = new Alignment(afile.getSeqsAsArray());
-      afile.addAnnotations(al);
+      al = new Alignment(alignFile.getSeqsAsArray());
+      alignFile.addAnnotations(al);
 
       return al;
     } catch (Exception e)
@@ -453,10 +476,10 @@ public class AppletFormatAdapter
         try
         {
           // Possible sequence is just residues with no label
-          afile = new FastaFile(">UNKNOWN\n" + inFile, "Paste");
-          Alignment al = new Alignment(afile.getSeqsAsArray());
-          afile.addAnnotations(al);
-          afile.addSeqGroups(al);
+          alignFile = new FastaFile(">UNKNOWN\n" + inFile, "Paste");
+          Alignment al = new Alignment(alignFile.getSeqsAsArray());
+          alignFile.addAnnotations(al);
+          alignFile.addSeqGroups(al);
           return al;
 
         } catch (Exception ex)
@@ -568,6 +591,7 @@ public class AppletFormatAdapter
        else if (format.equalsIgnoreCase(JSONFile.FILE_DESC))
        {
         afile = new JSONFile();
+        afile.setViewport(viewport);
         // Add groups to AlignFile
         afile.seqGroups = alignment.getGroups();
 
@@ -857,4 +881,14 @@ public class AppletFormatAdapter
     }
     return null;
   }
+
+  public AlignFile getAlignFile()
+  {
+    return alignFile;
+  }
+
+  public void setAlignFile(AlignFile alignFile)
+  {
+    this.alignFile = alignFile;
+  }
 }