package org.molgenis.compute.commandline;
import java.io.File;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import org.molgenis.compute.commandline.options.Options;
import org.molgenis.compute.commandline.options.Options.Multiplicity;
import org.molgenis.compute.commandline.options.Options.Separator;
public class ArgumentParser
{
static Options o;
static String DEF = "DEFAULT", EMPTY = "EMPTY";
/*
* The map that is returned.
*/
static LinkedHashMap<String, String> paramMap = new LinkedHashMap<String, String>();
/*
* All command line parameters
*/
static List<String> parameters = Arrays.asList("inputdir", "outputdir", "workflow", "protocols", "parameters",
"worksheet", "mcdir", "id");
/*
* Get value of command line option 'option' in set 'set'.
*/
private static String getValue(String set, String option)
{
if (o.getSet(set).getOption(option).getResultCount() == 1) return o.getSet(set).getOption(option)
.getResultValue(0);
else
return null;
}
/*
* Add an obligatory parameter 'name' to parameter set 'set'.
*/
private static void addParam(String set, String name)
{
o.getSet(set).addOption(name, false, Separator.EQUALS, Multiplicity.ONCE);
}
/*
* Add an optional parameter to set.
*/
private static void addParamOptional(String set, String name)
{
o.getSet(set).addOption(name, false, Separator.EQUALS, Multiplicity.ZERO_OR_ONE);
}
/*
* Fill paramMap with values based on user inputs and defaults
*/
private static void fillParamMap(String set)
{
String inputdir = "input"; // is reused below
// set default for inputdir
paramMap.put("inputdir", inputdir);
// set default for outputdir
String id = "output";
paramMap.put("outputdir", inputdir + File.separator + id);
// add/overwrite parameters that are not null
for (String p : parameters)
{
String value = getValue(set, p);
if (value != null) paramMap.put(p, value);
}
inputdir = paramMap.get("inputdir") + File.separator;
if (getValue(set, "workflow") == null) paramMap.put("workflow", inputdir + "workflow.csv");
if (getValue(set, "protocols") == null) paramMap.put("protocols", inputdir + "protocols");
if (getValue(set, "parameters") == null) paramMap.put("parameters", inputdir + "parameters.csv");
if (getValue(set, "worksheet") == null) paramMap.put("worksheet", inputdir + "worksheet.csv");
if (getValue(set, "mcdir") == null) paramMap.put("mcdir", ".");
if (getValue(set, "id") == null) paramMap.put("id", id);
/*
* 'Repair' outputdir.
*/
if (getValue(set, "outputdir") == null)
{
paramMap.put("outputdir", inputdir + paramMap.get("id"));
}
}
/*
* Define three different sets of parameters
*/
private static Options defineSets(String[] args)
{
o = new Options(args, Options.Prefix.DASH);
o.addSet(DEF);
for (String p : parameters)
addParamOptional(DEF, p);
o.addSet(EMPTY);
return o;
}
/*
* Determine to which of our three parameter sets the given parameters
* match. Return a boolean that indicates whether a match has been found.
*/
private static boolean matchParameters()
{
boolean match = false;
if (o.check(DEF, false, false) || o.check(EMPTY, false, false))
{
match = true;
fillParamMap(DEF);
}
return match;
}
/*
* Takes command line arguments as input and returns a map with the
* following parameters: inputdir, outputdir, worksheet, workflow,
* protocols, parameters, id and mcdir. But, if command line arguments are
* not specified properly, then an error message this function produces an
* error message and exits with status code 1.
*/
public static LinkedHashMap<String, String> parseParameters(String[] args)
{
defineSets(args);
if (!matchParameters())
{
System.err.println("#");
System.err.println("##");
System.err.println("### Begin of error message.");
System.err.println("##");
System.err.println("#\n");
System.err.println(o.getCheckErrors());
System.err.println("Valid command line arguments are:\n");
System.err
.println(" -inputdir=<input> # Directory with default inputs: workflow.cvs, protocols, parameters.csv, worksheet.csv.");
System.err
.println(" -outputdir=<inputdir/id> # Directory where the generated scripts will be stored.");
System.err
.println(" -workflow=<inputdir/workflow.csv> # A file describing the workflowsteps and their interdependencies.");
System.err
.println(" -protocols=<inputdir/protocols> # A directory containing the *.ftl protocol files.");
System.err
.println(" -parameters=<inputdir/parameters.csv> # A file that describes the parameters that are used in the protocols.");
System.err.println(" -worksheet=<inputdir/worksheet.csv> # A file that describes the work to be doen.");
System.err
.println(" -id=<output> # An ID that may be different each time you generate.");
System.err
.println(" -mcdir=<.> # A directory containing molgenis_compute.sh. This may be used by a protocol that executes that script.");
System.err
.println("\nNo parameters are obligatory. Each parameter has its default value, as specified betweet the brackets < and >.\n");
System.err.println("#");
System.err.println("##");
System.err.println("### End of error message.");
System.err.println("##");
System.err.println("#");
System.err.println("\nProgram exits with status code 1.");
System.exit(1);
}
else
{
System.out.println(">> Parsed command line parameters:");
for (String p : paramMap.keySet())
System.out.println(" -" + p + "=" + paramMap.get(p));
System.out.println("\n");
}
return (paramMap);
}
}