/*
* 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.core.workflow;
import static java.util.Objects.requireNonNull;
import java.util.HashMap;
import java.util.Map;
import fr.ens.biologie.genomique.eoulsan.EoulsanException;
import fr.ens.biologie.genomique.eoulsan.EoulsanRuntimeException;
import fr.ens.biologie.genomique.eoulsan.core.Module;
import fr.ens.biologie.genomique.eoulsan.core.Step;
/**
* This class store module instances and avoid storing this instance in Step
* objects that are serialized.
* @author Laurent Jourdren
* @since 2.0
*/
public class StepInstances {
private static StepInstances instance;
private final Map<Step, Module> steps = new HashMap<>();
/**
* Get a module instance.
* @param step the step
* @return a module instance
* @throws EoulsanRuntimeException if an error occurs while loading the module
*/
public Module getModule(final Step step) {
requireNonNull(step, "Step is null");
final String stepName = step.getModuleName();
final String stepVersion = step.getStepVersion();
try {
return getModule(step, stepName, stepVersion);
} catch (EoulsanException e) {
throw new EoulsanRuntimeException(e);
}
}
/**
* Get a step instance.
* @param step workflow step
* @param moduleVersion step version
* @return a step instance
* @throws EoulsanException if an error occurs while loading the step
*/
public Module getModule(final Step step, final String moduleName,
final String moduleVersion) throws EoulsanException {
requireNonNull(moduleName, "Step name is null");
if (!this.steps.containsKey(step)) {
// Load module
final Module moduleInstance = loadModule(moduleName, moduleVersion);
// Register module instance
registerStep(step, moduleInstance);
// return module instance
return moduleInstance;
}
return this.steps.get(step);
}
/**
* Register a step instance.
* @param step the step
* @param module module instance
*/
public void registerStep(final Step step, final Module module) {
requireNonNull(step, "workflow step is null");
requireNonNull(module, "module is null");
this.steps.put(step, module);
}
/**
* Remove a step instance.
* @param step workflow step
*/
public void removeStep(final Step step) {
requireNonNull(step);
this.steps.remove(step);
}
//
// Static methods
//
/**
* Singleton method.
* @return the singleton
*/
public static StepInstances getInstance() {
if (instance == null) {
instance = new StepInstances();
}
return instance;
}
//
// Static methods
//
/**
* Get a Module object from its name.
* @param moduleName name of the step
* @param moduleVersion version of the step
* @return a Module object
* @throws EoulsanException if the module does not exits
*/
private static Module loadModule(final String moduleName,
final String moduleVersion) throws EoulsanException {
if (moduleName == null) {
throw new EoulsanException("Step name is null");
}
final String lower = moduleName.trim().toLowerCase();
final Module result =
ModuleRegistry.getInstance().loadModule(lower, moduleVersion);
if (result == null) {
throw new EoulsanException("Unknown module: "
+ lower + ("".equals(moduleVersion)
? "" : " (version required: " + moduleVersion + ")"));
}
return result;
}
//
// Constructor
//
/**
* Private constructor.
*/
private StepInstances() {
}
}