/*
* Eoulsan development code
*
* This code may be freely distributed and modified under the
* terms of the GNU Lesser General Public License version 2.1 or
* later and CeCILL-C. This should be distributed with the code.
* If you do not have a copy, see:
*
* http://www.gnu.org/licenses/lgpl-2.1.txt
* http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.txt
*
* Copyright for this code is held jointly by the Genomic platform
* of the Institut de Biologie de l'École normale supérieure and
* the individual authors. These should be listed in @author doc
* comments.
*
* For more information on the Eoulsan project and its aims,
* or to join the Eoulsan Google group, visit the home page
* at:
*
* http://outils.genomique.biologie.ens.fr/eoulsan
*
*/
package fr.ens.biologie.genomique.eoulsan.data;
import static fr.ens.biologie.genomique.eoulsan.EoulsanLogger.getLogger;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import fr.ens.biologie.genomique.eoulsan.bio.BadBioEntryException;
import fr.ens.biologie.genomique.eoulsan.bio.ReadSequence;
import fr.ens.biologie.genomique.eoulsan.bio.io.FastqReader;
import fr.ens.biologie.genomique.eoulsan.bio.io.FastqWriter;
import fr.ens.biologie.genomique.eoulsan.bio.io.ReadSequenceReader;
import fr.ens.biologie.genomique.eoulsan.bio.io.ReadSequenceWriter;
import fr.ens.biologie.genomique.eoulsan.bio.io.TFQReader;
import fr.ens.biologie.genomique.eoulsan.bio.io.TFQWriter;
import fr.ens.biologie.genomique.eoulsan.io.CompressionType;
import fr.ens.biologie.genomique.eoulsan.util.FileUtils;
/**
* This class allow to copy and transform data while copying.
* @since 1.0
* @author Laurent Jourdren
*/
public class DataFormatConverter {
private final DataFormat inFormat;
private final DataFormat outFormat;
final DataFile inFile;
final DataFile outFile;
final OutputStream os;
public void convert() throws IOException {
if (this.outFormat == null) {
final OutputStream destOs =
this.os == null ? this.outFile.create() : this.os;
FileUtils.copy(this.inFile.rawOpen(), destOs);
return;
}
final CompressionType srcCT =
CompressionType.getCompressionTypeByContentEncoding(
this.inFile.getMetaData().getContentEncoding());
final CompressionType destCT =
CompressionType.getCompressionTypeByFilename(this.outFile.getName());
getLogger().fine("Convert "
+ this.inFile + " (" + this.inFormat + "/" + srcCT + ") to "
+ this.outFile + " (" + this.outFormat + "/" + destCT + ").");
if (this.inFormat.equals(this.outFormat) && srcCT.equals(destCT)) {
this.inFile.copyTo(this.outFile);
return;
}
final OutputStream destOs =
this.os == null ? this.outFile.create() : this.os;
if (this.inFormat.equals(this.outFormat)) {
final InputStream is = this.inFile.open();
final OutputStream os = destCT.createOutputStream(destOs);
FileUtils.copy(is, os);
return;
}
if ((this.inFormat == DataFormats.READS_FASTQ
|| this.inFormat == DataFormats.READS_TFQ)
&& (this.outFormat == DataFormats.READS_FASTQ
|| this.outFormat == DataFormats.READS_TFQ)) {
final ReadSequenceReader reader;
if (this.inFormat == DataFormats.READS_FASTQ) {
reader = new FastqReader(this.inFile.open());
} else {
reader = new TFQReader(this.inFile.open(), true);
}
final OutputStream os = destCT.createOutputStream(destOs);
final ReadSequenceWriter writer;
if (this.outFormat == DataFormats.READS_FASTQ) {
writer = new FastqWriter(os);
} else {
writer = new TFQWriter(os);
}
try {
for (final ReadSequence read : reader) {
writer.write(read);
}
reader.throwException();
} catch (BadBioEntryException e) {
throw new IOException("Bad read sequence entry: " + e.getEntry());
} finally {
reader.close();
writer.close();
}
return;
}
destOs.close();
throw new IOException("This copy case is not implemented");
}
//
// Constructor
//
/**
* Constructor
* @param inFile input file
* @param outFile output file
* @param os outputStream
*/
public DataFormatConverter(final DataFile inFile, final DataFile outFile,
final OutputStream os) throws IOException {
this(inFile, outFile,
outFile == null
? null : DataFormatRegistry.getInstance()
.getDataFormatFromFilename(outFile.getName()),
os);
}
/**
* Constructor
* @param inFile input file
* @param outFile output file
*/
public DataFormatConverter(final DataFile inFile, final DataFile outFile)
throws IOException {
this(inFile, outFile, null);
}
/**
* Constructor
* @param inFile input file
* @param outFile output file
* @param outFormat output format
*/
public DataFormatConverter(final DataFile inFile, final DataFile outFile,
final DataFormat outFormat, final OutputStream os) throws IOException {
if (inFile == null) {
throw new NullPointerException("The input file is null");
}
this.inFile = inFile;
this.inFormat = inFile.getMetaData().getDataFormat();
if (this.inFormat == null && outFormat != null) {
throw new NullPointerException("The input file format is null");
}
if (outFile == null) {
throw new NullPointerException("The output file format is null");
}
this.outFile = outFile;
this.outFormat = outFormat;
this.os = os;
}
}