package fr.ens.biologie.genomique.eoulsan.modules.diffana; import static com.google.common.base.Preconditions.checkNotNull; import static fr.ens.biologie.genomique.eoulsan.requirements.DockerRequirement.newDockerRequirement; import static fr.ens.biologie.genomique.eoulsan.util.r.ProcessRExecutor.RSCRIPT_EXECUTABLE; import java.io.IOException; import java.util.HashSet; import java.util.Set; import fr.ens.biologie.genomique.eoulsan.EoulsanException; import fr.ens.biologie.genomique.eoulsan.Settings; import fr.ens.biologie.genomique.eoulsan.core.Modules; import fr.ens.biologie.genomique.eoulsan.core.Parameter; import fr.ens.biologie.genomique.eoulsan.core.StepConfigurationContext; import fr.ens.biologie.genomique.eoulsan.requirements.PathRequirement; import fr.ens.biologie.genomique.eoulsan.requirements.Requirement; import fr.ens.biologie.genomique.eoulsan.requirements.RserveRequirement; import fr.ens.biologie.genomique.eoulsan.util.r.DockerRExecutor; import fr.ens.biologie.genomique.eoulsan.util.r.ProcessRExecutor; import fr.ens.biologie.genomique.eoulsan.util.r.RExecutor; import fr.ens.biologie.genomique.eoulsan.util.r.RExecutorFactory; import fr.ens.biologie.genomique.eoulsan.util.r.RExecutorFactory.Mode; import fr.ens.biologie.genomique.eoulsan.util.r.RserveRExecutor; /** * This class define common methods used for the configuration of the step of * the package. * @author Laurent Jourdren * @since 2.0 */ public class RModuleCommonConfiguration { private static final String EXECUTION_MODE = "r.execution.mode"; private static final String RSERVE_SERVER = "rserve.servername"; private static final String DOCKER_IMAGE = "docker.image"; /** * Parse the step parameter and create a configured RExecutor object. * @param context the step context * @param stepParameters the step parameters. Must be a mutable object * @param defaultDockerImage default docker image * @return a configured RExecutor object * @throws EoulsanException if one or more parameter is invalid */ public static RExecutor parseRExecutorParameter( final StepConfigurationContext context, final Set<Parameter> stepParameters, final Set<Requirement> requirements, final String defaultDockerImage) throws EoulsanException { checkNotNull(context, "context argument cannot be null"); checkNotNull(stepParameters, "stepParameters argument cannot be null"); checkNotNull(requirements, "requirements argument cannot be null"); checkNotNull(defaultDockerImage, "defaultDockerImage argument cannot be null"); final Set<Parameter> toRemove = new HashSet<>(); final Settings settings = context.getSettings(); RExecutorFactory.Mode executionMode = null; String dockerImage = defaultDockerImage; String rserveServer = settings.isRServeServerEnabled() ? settings.getRServeServerName() : null; for (Parameter p : stepParameters) { switch (p.getName()) { case EXECUTION_MODE: executionMode = Mode.parse(p.getStringValue()); if (executionMode == null) { Modules.badParameterValue(context, p, "Unknown execution mode"); } toRemove.add(p); break; case RSERVE_SERVER: rserveServer = p.getStringValue(); toRemove.add(p); break; case DOCKER_IMAGE: dockerImage = p.getStringValue(); toRemove.add(p); break; default: break; } } // Remove parsed parameters stepParameters.removeAll(toRemove); // Create the executor object final RExecutor result; try { result = RExecutorFactory.newRExecutor(executionMode, rserveServer, dockerImage, context.getStepOutputDirectory().toFile(), context.getLocalTempDirectory()); } catch (IOException e) { throw new EoulsanException(e); } // Set the requirements switch (result.getName()) { case ProcessRExecutor.REXECUTOR_NAME: requirements.add(PathRequirement.newPathRequirement(RSCRIPT_EXECUTABLE)); break; case DockerRExecutor.REXECUTOR_NAME: requirements.add(newDockerRequirement(dockerImage)); break; case RserveRExecutor.REXECUTOR_NAME: requirements.add(RserveRequirement.newRserveRequirement(rserveServer)); break; default: break; } return result; } }