package fr.ens.biologie.genomique.eoulsan.core.workflow;
import static com.google.common.base.Preconditions.checkNotNull;
import static fr.ens.biologie.genomique.eoulsan.Globals.STEP_OUTPUT_DIRECTORY_SUFFIX;
import fr.ens.biologie.genomique.eoulsan.EoulsanRuntime;
import fr.ens.biologie.genomique.eoulsan.Globals;
import fr.ens.biologie.genomique.eoulsan.annotations.EoulsanAnnotationUtils;
import fr.ens.biologie.genomique.eoulsan.annotations.ExecutionMode;
import fr.ens.biologie.genomique.eoulsan.core.Module;
import fr.ens.biologie.genomique.eoulsan.data.DataFile;
/**
* This class allow to determine the output directory of a step.
* @author Laurent Jourdren
* @since 2.0
*/
class StepOutputDirectory {
private static StepOutputDirectory singleton;
private final OutputTreeType outputTree;
private final boolean hadoopMode;
/**
* This enum define the output tree type of a step.
*/
public enum OutputTreeType {
FLAT, STEP;
/**
* Get a OutputTreeType object from a type name.
* @param type the type
* @return a OutputTreeType object
*/
public static OutputTreeType getOutputTreeType(final String type) {
if (type == null) {
return OutputTreeType.valueOf(Globals.OUTPUT_TREE_TYPE_DEFAULT);
}
final OutputTreeType result =
OutputTreeType.valueOf(type.toUpperCase().trim());
if (result == null) {
return OutputTreeType.valueOf(Globals.OUTPUT_TREE_TYPE_DEFAULT);
}
return result;
}
/**
* Get a OutputTreeType object from the Eoulsan settings.
* @return a OutputTreeType object
*/
public static OutputTreeType getOutputTreeType() {
return getOutputTreeType(
EoulsanRuntime.getSettings().getOutputTreeType());
}
}
/**
* Get the output directory of the step if the outputs of the step are outputs
* of workflow.
* @param workflow the workflow
* @param step the step
* @return the output directory of the step
*/
public DataFile defaultDirectory(final AbstractWorkflow workflow,
final AbstractStep step, final Module module,
final boolean copyResultsToOutput) {
checkNotNull(workflow, "workflow argument cannot be null");
checkNotNull(step, "step argument cannot be null");
checkNotNull(module, "module argument cannot be null");
if (this.hadoopMode
&& ExecutionMode
.getExecutionMode(module.getClass()).isHadoopCompatible()) {
return workflow.getHadoopWorkingDirectory();
}
if (copyResultsToOutput) {
return workflowDirectory(workflow, step, module);
}
return workingDirectory(workflow, step, module);
}
/**
* Get the working directory of a step.
* @param workflow the workflow
* @param step the step
* @param module the module
* @return the working directory of a step
*/
public DataFile workingDirectory(final AbstractWorkflow workflow,
final AbstractStep step, final Module module) {
checkNotNull(workflow, "workflow argument cannot be null");
checkNotNull(step, "step argument cannot be null");
checkNotNull(module, "module argument cannot be null");
if (this.hadoopMode
&& ExecutionMode.getExecutionMode(module.getClass())
.isHadoopCompatible()) {
return workflow.getHadoopWorkingDirectory();
}
return workflow.getLocalWorkingDirectory();
}
/**
* Get the workflow output directory of a step.
* @param workflow the workflow
* @param step the step
* @param module the module
* @return the working directory of a step
*/
public DataFile workflowDirectory(final AbstractWorkflow workflow,
final AbstractStep step, final Module module) {
checkNotNull(workflow, "workflow argument cannot be null");
checkNotNull(step, "step argument cannot be null");
checkNotNull(module, "module argument cannot be null");
if (EoulsanAnnotationUtils.isNoOutputDirectory(module)) {
return workflow.getOutputDirectory();
}
switch (this.outputTree) {
case STEP:
final String subDirname = step.getId() + STEP_OUTPUT_DIRECTORY_SUFFIX;
return new DataFile(workflow.getOutputDirectory(), subDirname);
case FLAT:
default:
return workflow.getOutputDirectory();
}
}
//
// Static methods
//
/**
* Get the singleton of the class
* @return the singleton of the class
*/
public static synchronized StepOutputDirectory getInstance() {
if (singleton == null) {
singleton = new StepOutputDirectory();
}
return singleton;
}
//
// Constructor
//
/**
* Private constructor.
*/
private StepOutputDirectory() {
this.hadoopMode = EoulsanRuntime.getRuntime().getMode().isHadoopMode();
this.outputTree = OutputTreeType.getOutputTreeType();
}
}