/*
* 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;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import fr.ens.biologie.genomique.eoulsan.io.CompressionType;
import fr.ens.biologie.genomique.eoulsan.util.FileUtils;
import fr.ens.biologie.genomique.eoulsan.util.StringUtils;
/**
* This class define an abstract EoulsanRuntime.
* @since 1.0
* @author Laurent Jourdren
*/
public abstract class AbstractEoulsanRuntime {
/**
* This Enum define the Eoulsan execution mode.
*/
public enum EoulsanExecMode {
LOCAL, HADOOP, HADOOP_TASK, AMAZON, CLUSTER, CLUSTER_TASK, EXTERNAL_APP;
/**
* Test if Eoulsan is in an Hadoop mode.
* @return true if Eoulsan is in an Hadoop mode
*/
public boolean isHadoopMode() {
switch (this) {
case HADOOP:
case AMAZON:
return true;
default:
return false;
}
}
/**
* Test if Hadoop protocols can be used in the current Eoulsan mode.
* @return true if Hadoop protocols can be used in the current Eoulsan mode
*/
public boolean isHadoopProtocolMode() {
return isHadoopMode() || this == EoulsanExecMode.HADOOP_TASK;
}
}
private final Settings settings;
/**
* Get Settings.
* @return a Settings object
*/
public Settings getSettings() {
return this.settings;
}
/**
* Get the temporary directory.
* @return the temporary directory as a File object
*/
public abstract File getTempDirectory();
/**
* Get Eoulsan mode.
* @return the Eoulsan mode
*/
public abstract EoulsanExecMode getMode();
/**
* Create an InputStream to load data.
* @param dataSource the source of the data to load
* @return an InputStream corresponding to the source
* @throws IOException if an error occurs the InputStream
*/
public abstract InputStream getInputStream(String dataSource)
throws IOException;
/**
* Create a raw InputStream (without decompression of input data) to load
* data.
* @param dataSource the source of the data to load
* @return an InputStream corresponding to the source
* @throws IOException if an error occurs the InputStream
*/
public abstract InputStream getRawInputStream(String dataSource)
throws IOException;
/**
* Create an OutputStream to load data.
* @param dataSource the source of the data to load
* @return an OutputStream corresponding to the source
* @throws IOException if an error occurs the OutputStream
*/
public abstract OutputStream getOutputStream(String dataSource)
throws IOException;
/**
* Decompress an inputStream if needed.
* @param is the InputStream
* @param source source of the inputStream
* @return a InputStream with decompression integrated or not
* @throws IOException if an error occurs while creating decompressor
* InputStream
*/
protected InputStream decompressInputStreamIsNeeded(final InputStream is,
final String source) throws IOException {
final String extension = StringUtils.compressionExtension(source);
return CompressionType.getCompressionTypeByExtension(extension)
.createInputStream(is);
}
/**
* Create a new temporary directory.
* @return the new directory
* @throws IOException if there is an error creating the temporary directory
*/
public File createTempDir() throws IOException {
return FileUtils.createTempDir(getTempDirectory(), null);
}
/**
* Create a new temporary directory.
* @param prefix prefix of the temporary directory
* @return the new directory
* @throws IOException if there is an error creating the temporary directory
*/
public File createTempDir(final String prefix) throws IOException {
return FileUtils.createTempDir(getTempDirectory(), prefix);
}
/**
* Create a new temporary file.
* @param prefix Prefix of the temporary file
* @param suffix suffix of the temporary file
* @return the new temporary file
* @throws IOException if there is an error creating the temporary directory
*/
public File createTempFile(final String prefix, final String suffix)
throws IOException {
return FileUtils.createTempFile(getTempDirectory(), prefix, suffix);
}
/**
* Create a file in the temporary directory.
* @param filename The filename to create
* @return The new File
*/
public File createFileInTempDir(final String filename) {
return new File(getTempDirectory(), filename);
}
//
// Constructor
//
protected AbstractEoulsanRuntime(final Settings settings) {
if (settings == null) {
throw new EoulsanError("The settings are null");
}
this.settings = settings;
}
}