JAL-3703 fix Gff3 shared InputStream with embedded FASTA data
authorBen Soares <b.soares@dundee.ac.uk>
Tue, 11 Jan 2022 20:13:57 +0000 (20:13 +0000)
committerBen Soares <b.soares@dundee.ac.uk>
Tue, 11 Jan 2022 20:13:57 +0000 (20:13 +0000)
src/jalview/io/AlignFile.java
src/jalview/io/FastaFile.java
src/jalview/io/FeaturesFile.java
src/jalview/io/FileParse.java

index 9e426ab..3202ac9 100755 (executable)
@@ -79,6 +79,8 @@ public abstract class AlignFile extends FileParse
 
   private boolean parseImmediately = true;
 
+  private boolean dataClosed = false;
+
   /**
    * @return if doParse() was called at construction time
    */
@@ -165,6 +167,12 @@ public abstract class AlignFile extends FileParse
   public AlignFile(boolean parseImmediately, FileParse source)
           throws IOException
   {
+    this(parseImmediately, source, true);
+  }
+
+  public AlignFile(boolean parseImmediately, FileParse source,
+          boolean closeData) throws IOException
+  {
     super(source);
     initData();
 
@@ -174,7 +182,7 @@ public abstract class AlignFile extends FileParse
 
     if (parseImmediately)
     {
-      doParse();
+      doParse(closeData);
     }
   }
 
@@ -185,6 +193,11 @@ public abstract class AlignFile extends FileParse
    */
   public void doParse() throws IOException
   {
+    doParse(true);
+  }
+
+  public void doParse(boolean closeData) throws IOException
+  {
     if (parseCalled)
     {
       throw new IOException(
@@ -193,7 +206,11 @@ public abstract class AlignFile extends FileParse
     }
     parseCalled = true;
     parse();
-    dataIn.close();
+    if (closeData && !dataClosed)
+    {
+      dataIn.close();
+      dataClosed = true;
+    }
   }
 
   /**
index 9acd7da..c698a31 100755 (executable)
  */
 package jalview.io;
 
+import java.io.IOException;
+
 import jalview.datamodel.Alignment;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.Annotation;
 import jalview.datamodel.Sequence;
 import jalview.datamodel.SequenceI;
 
-import java.io.IOException;
-
 /**
  * DOCUMENT ME!
  * 
@@ -69,7 +69,12 @@ public class FastaFile extends AlignFile
 
   public FastaFile(FileParse source) throws IOException
   {
-    super(source);
+    this(source, true);
+  }
+
+  public FastaFile(FileParse source, boolean closeData) throws IOException
+  {
+    super(true, source, closeData);
   }
 
   public FastaFile(SequenceI[] seqs)
index dda59a7..71fc659 100755 (executable)
@@ -1393,7 +1393,9 @@ public class FeaturesFile extends AlignFile implements FeaturesSourceI
     } catch (IOException q)
     {
     }
-    FastaFile parser = new FastaFile(this);
+    // Opening a FastaFile object with the remainder of this object's dataIn.
+    // Tell the constructor to NOT close the dataIn when finished.
+    FastaFile parser = new FastaFile(this, false);
     List<SequenceI> includedseqs = parser.getSeqs();
 
     SequenceIdMatcher smatcher = new SequenceIdMatcher(newseqs);
index 2ff0d27..5fd33be 100755 (executable)
@@ -230,7 +230,7 @@ public class FileParse
       return false;
     }
     input.mark(4);
-    
+
     // get first 2 bytes or return false
     byte[] bytes = new byte[2];
     int read = input.read(bytes);
@@ -239,7 +239,7 @@ public class FileParse
     {
       return false;
     }
-    
+
     int header = (bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
     return (GZIPInputStream.GZIP_MAGIC == header);
   }