package org.molgenis.commandline;
import org.molgenis.compute.ComputeJob;
import org.molgenis.compute.commandline.options.Options;
import org.molgenis.generator.Compute3JobGenerator;
import org.molgenis.generator.JobGenerator;
import org.molgenis.generator.ModelLoader;
import org.molgenis.protocol.Workflow;
import org.molgenis.util.Tuple;
import java.io.File;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
/**
* Created by IntelliJ IDEA.
* User: georgebyelas
* Date: 05/04/2012
* Time: 09:35
* To change this template use File | Settings | File Templates.
*/
public class CommandLineGenerator
{
//here command-line parameters flags-synonyms
private static final String PARAMETER_1 = "parametersfile";
private static final String PARAMETER_2 = "p";
private static final String ENVIRONMENT_1 = "environmentfile";
private static final String ENVIRONMENT_2 = "e";
private static final String WORKFLOW_1 = "workflowfile";
private static final String WORKFLOW_2 = "w";
private static final String WORKSHEET_1 = "worksheet";
private static final String WORKSHEET_2 = "s";
private static final String PROTOCOL_1 = "protocoldir";
private static final String PROTOCOL_2 = "d";
private static final String OUTPUT_1 = "outputscriptsdir";
private static final String OUTPUT_2 = "o";
private static final String BACKEND_1 = "cluster";
private static final String BACKEND_2 = "grid";
private static final String BACKEND_3 = "c";
private static final String BACKEND_4 = "g";
private static final String TEMP_1 = "templatesdir";
private static final String TEMP_2 = "t";
private static final String ERROR_MESSAGE = "command line parameters format: " +
"-parametersfile|p=<file with parameters> \n" +
"-environmentfile|e=<file with environment variables> \n" +
"-workflowfile|w=<file with workflow description> \n" +
"-worksheet|s=<input worksheet> \n" +
"-protocoldir|d=<directory with protocol of the workflow> \n" +
"-templatesdir|t=<directory with templates> \n" +
"-cluster|c|grid|g=<the selected backend and remote directory where> \n" +
"-outputscriptsdir|o=<output directory to write scripts> \n" +
"<ID of the generation run>";
private File fileWorksheet = null, fileParameters = null, fileEnvironment = null, fileWorkflow = null, dirProtocol = null;
private Hashtable<String, String> config = new Hashtable<String, String>();
private String backend = null;
private void run() throws Exception
{
//load compute workflow
ModelLoader loader = new ModelLoader();
Workflow workflow = loader.loadWorkflowFromFiles(fileWorkflow, dirProtocol, fileParameters, fileEnvironment);
//read worksheet
List<Tuple> worksheet = loader.loadWorksheetFromFile(fileWorksheet);
JobGenerator jobGenerator = new Compute3JobGenerator();
//set configuration settings
jobGenerator.setConfig(config);
jobGenerator.setWorksheet(worksheet);
//generate compute jobs
//here, ComputeJobs can be generated also from DB given list of Targets
Vector<ComputeJob> computeJobs = jobGenerator.generateComputeJobsFoldedWorksheet(workflow, worksheet, backend);
//Vector<ComputeDag> dags = ComputeDag.createDags(computeJobs);
//generate actual analysis files
//boolean status = jobGenerator.generateActualJobs(computeJobs, backend, config);
boolean status = jobGenerator.generateActualJobsWithMacros(computeJobs, backend, config);
}
public static void main(String[] args)
{
if (args.length == 0)
{
System.out.println("Error: provide parameters");
System.out.println(ERROR_MESSAGE);
System.exit(1);
}
//specifying command-line settings
Options opt = new Options(args, Options.Prefix.DASH, Options.Multiplicity.ZERO_OR_ONE, 1);
opt.getSet().addOption(PARAMETER_1, false, Options.Separator.EQUALS);
opt.getSet().addOption(PARAMETER_2, false, Options.Separator.EQUALS);
opt.getSet().addOption(ENVIRONMENT_1, false, Options.Separator.EQUALS);
opt.getSet().addOption(ENVIRONMENT_2, false, Options.Separator.EQUALS);
opt.getSet().addOption(WORKFLOW_1, false, Options.Separator.EQUALS);
opt.getSet().addOption(WORKFLOW_2, false, Options.Separator.EQUALS);
opt.getSet().addOption(WORKSHEET_1, false, Options.Separator.EQUALS);
opt.getSet().addOption(WORKSHEET_2, false, Options.Separator.EQUALS);
opt.getSet().addOption(PROTOCOL_1, false, Options.Separator.EQUALS);
opt.getSet().addOption(PROTOCOL_2, false, Options.Separator.EQUALS);
opt.getSet().addOption(OUTPUT_1, false, Options.Separator.EQUALS);
opt.getSet().addOption(OUTPUT_2, false, Options.Separator.EQUALS);
opt.getSet().addOption(BACKEND_1, false, Options.Separator.EQUALS);
opt.getSet().addOption(BACKEND_2, false, Options.Separator.EQUALS);
opt.getSet().addOption(BACKEND_3, false, Options.Separator.EQUALS);
opt.getSet().addOption(BACKEND_4, false, Options.Separator.EQUALS);
opt.getSet().addOption(TEMP_1, false, Options.Separator.EQUALS);
opt.getSet().addOption(TEMP_2, false, Options.Separator.EQUALS);
//checking for correctness
boolean isCorrect = opt.check();
String generationID = opt.getSet().getData().get(0);
if (!isCorrect)
{
System.out.println(opt.getCheckErrors());
System.out.println(ERROR_MESSAGE);
System.exit(1);
}
CommandLineGenerator generator = new CommandLineGenerator();
checkSynonymParameters(generator, opt, "parameters file", PARAMETER_1, PARAMETER_2);
checkSynonymParameters(generator, opt, "environment file", ENVIRONMENT_1, ENVIRONMENT_2);
checkSynonymParameters(generator, opt, "workflow file", WORKFLOW_1, WORKFLOW_2);
checkSynonymParameters(generator, opt, "worksheet", WORKSHEET_1, WORKSHEET_2);
checkSynonymParameters(generator, opt, "protocol directory", PROTOCOL_1, PROTOCOL_2);
checkSynonymParameters(generator, opt, "output directory", OUTPUT_2, OUTPUT_1);
checkSynonymParameters(generator, opt, "backend", BACKEND_1, BACKEND_2, BACKEND_3, BACKEND_4);
checkSynonymParameters(generator, opt, "template directory", TEMP_1, TEMP_2);
System.out.println("... command line parameters are parsed successfully");
generator.setGenerationID(generationID);
//actual generation
try
{
generator.run();
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println("... done");
System.exit(0);
}
private void setParametersFile(String resultValue)
{
fileParameters = new File(resultValue);
}
//lazy code
private static void checkSynonymParameters(CommandLineGenerator generation, Options opt, String backend, String backend1, String backend2, String backend3, String backend4)
{
if (!(opt.getSet().isSet(backend1) ^ opt.getSet().isSet(backend2) ^ opt.getSet().isSet(backend3) ^ opt.getSet().isSet(backend4)))
{
System.out.println(backend + " is not correctly specified");
System.out.println(ERROR_MESSAGE);
System.exit(1);
}
String result = null;
if (opt.getSet().isSet(backend1))
{
generation.setBackEndDirectory(opt.getSet().getOption(backend1).getResultValue(0));
generation.setBackEnd(JobGenerator.CLUSTER);
}
else if (opt.getSet().isSet(backend2))
{
generation.setBackEndDirectory(opt.getSet().getOption(backend2).getResultValue(0));
generation.setBackEnd(JobGenerator.GRID);
}
else if (opt.getSet().isSet(backend3))
{
generation.setBackEndDirectory(opt.getSet().getOption(backend3).getResultValue(0));
generation.setBackEnd(JobGenerator.CLUSTER);
}
else if (opt.getSet().isSet(backend4))
{
generation.setBackEndDirectory(opt.getSet().getOption(backend4).getResultValue(0));
generation.setBackEnd(JobGenerator.GRID);
}
}
private void setBackEndDirectory(String result)
{
//backEndDir = result;
this.config.put(JobGenerator.BACK_END_DIR, result);
}
private static void checkSynonymParameters(CommandLineGenerator generation, Options opt, String parameter, String str1, String str2)
{
if (!(opt.getSet().isSet(str1) ^ opt.getSet().isSet(str2)))
{
System.out.println(parameter + " is not correctly specified");
System.out.println(ERROR_MESSAGE);
System.exit(1);
}
String result = null;
if (opt.getSet().isSet(str1))
result = opt.getSet().getOption(str1).getResultValue(0);
else if (opt.getSet().isSet(str2))
result = opt.getSet().getOption(str2).getResultValue(0);
if (parameter.equalsIgnoreCase("parameters file"))
{
System.out.println("parameters file: " + result);
generation.setParametersFile(result);
}
else if (parameter.equalsIgnoreCase("environment file"))
{
System.out.println("environment file: " + result);
generation.setEnvironmentFile(result);
}
else if (parameter.equalsIgnoreCase("workflow file"))
{
System.out.println("workflow file: " + result);
generation.setWorkflowFile(result);
}
else if (parameter.equalsIgnoreCase("worksheet"))
{
System.out.println("worksheet file: " + result);
generation.setWorksheet(result);
}
else if (parameter.equalsIgnoreCase("protocol directory"))
{
System.out.println("protocol directory: " + result);
generation.setProtocolDir(result);
}
else if (parameter.equalsIgnoreCase("output directory"))
{
System.out.println("output directory: " + result);
generation.setOutputDir(result);
}
else if (parameter.equalsIgnoreCase("template directory"))
{
System.out.println("template directory: " + result);
generation.setTemplatesDir(result);
}
}
private void setEnvironmentFile(String result)
{
fileEnvironment = new File(result);
}
private void setProtocolDir(String result)
{
dirProtocol = new File(result);
}
private void setWorkflowFile(String result)
{
fileWorkflow = new File(result);
}
private void setTemplatesDir(String templatesdir)
{
this.config.put(JobGenerator.TEMPLATE_DIR, templatesdir);
}
private void setOutputDir(String resultValue)
{
this.config.put(JobGenerator.OUTPUT_DIR, resultValue);
}
private void setBackEnd(String backend)
{
this.backend = backend;
}
public void setWorksheet(String str)
{
fileWorksheet = new File(str);
}
public void setGenerationID(String str)
{
this.config.put(JobGenerator.GENERATION_ID, str);
}
}