\r
/**\r
* The list of {@link Parameter}s and {@link Option}s supported by executable.\r
+ * The lists is defined in and loaded from <ExecutableName>Parameters.xml file.\r
* \r
* @author pvtroshin\r
* \r
- * Date October 2009\r
+ * @version 1.0 October 2009\r
* @param <T>\r
* type of an Executable\r
*/\r
@NotThreadSafe\r
public class RunnerConfig<T> {\r
\r
- /**\r
- * Please note that the order of the fields is important to generate xml\r
- * compliant to the hand written schema!!!\r
- */\r
- /**\r
- * The class name of a runnable e.g. T\r
- */\r
- private String runnerClassName;\r
- List<Option<T>> options = new ArrayList<Option<T>>();\r
- String prmSeparator;\r
- List<Parameter<T>> parameters = new ArrayList<Parameter<T>>();\r
+ /*\r
+ * Please note that the order of the fields in this class is important to\r
+ * generate xml compliant to the hand written schema!!!\r
+ */\r
\r
- @XmlTransient\r
- List<Option<T>> arguments;\r
+ /**\r
+ * The class name of a runnable e.g. T\r
+ */\r
+ private String runnerClassName;\r
+ List<Option<T>> options = new ArrayList<Option<T>>();\r
+ String prmSeparator;\r
+ List<Parameter<T>> parameters = new ArrayList<Parameter<T>>();\r
\r
- public RunnerConfig() {\r
- // JAXB default constructor\r
- }\r
+ @XmlTransient\r
+ List<Option<T>> arguments;\r
\r
- public RunnerConfig<T> copyAndValidateRConfig(RunnerConfig<?> runnerConf) {\r
- if (this.runnerClassName != runnerConf.runnerClassName) {\r
- throw new InvalidParameterException("Wrong runner configuration! ");\r
+ public RunnerConfig() {\r
+ // JAXB default constructor\r
}\r
- RunnerConfig<T> newrconfig = new RunnerConfig<T>();\r
- newrconfig.runnerClassName = runnerConf.runnerClassName;\r
- newrconfig.options = new ArrayList<Option<T>>(options);\r
- return newrconfig;\r
- }\r
\r
- /**\r
- * \r
- * @return list of {@link Option} supported by type T\r
- */\r
- public List<Option<T>> getOptions() {\r
- return options;\r
- }\r
-\r
- public void addParameter(Parameter<T> param) {\r
- assert param != null;\r
- parameters.add(param);\r
- }\r
-\r
- public void addOption(Option<T> option) {\r
- assert option != null;\r
- options.add(option);\r
- }\r
-\r
- /**\r
- * \r
- * @return list of {@link Option} and {@link Parameter} supported by type T\r
- */\r
- @XmlTransient\r
- public List<Option<T>> getArguments() {\r
- arguments = new ArrayList<Option<T>>(options);\r
- arguments.addAll(parameters);\r
- return arguments;\r
- }\r
-\r
- /**\r
- * \r
- * @return name value separator character\r
- */\r
- public String getPrmSeparator() {\r
- return prmSeparator;\r
- }\r
-\r
- public void setPrmSeparator(String prmSeparator) {\r
- this.prmSeparator = prmSeparator;\r
- }\r
-\r
- public void setOptions(List<Option<T>> parameters) {\r
- this.options = parameters;\r
- }\r
-\r
- /**\r
- * \r
- * @return fully qualified class name for type T\r
- */\r
- @XmlElement(required = true)\r
- public String getRunnerClassName() {\r
- return runnerClassName;\r
- }\r
-\r
- public void setRunnerClassName(String runnerClassName) {\r
- this.runnerClassName = runnerClassName;\r
- }\r
+ public RunnerConfig<T> copyAndValidateRConfig(RunnerConfig<?> runnerConf) {\r
+ if (this.runnerClassName != runnerConf.runnerClassName) {\r
+ throw new InvalidParameterException("Wrong runner configuration! ");\r
+ }\r
+ RunnerConfig<T> newrconfig = new RunnerConfig<T>();\r
+ newrconfig.runnerClassName = runnerConf.runnerClassName;\r
+ newrconfig.options = new ArrayList<Option<T>>(options);\r
+ return newrconfig;\r
+ }\r
\r
- public void setParameters(List<Parameter<T>> parameters) {\r
- this.parameters = parameters;\r
- }\r
+ /**\r
+ * Returns the list of the Options supported by the executable of type T\r
+ * \r
+ * @return list of {@link Option} supported by type T\r
+ * @see Option\r
+ */\r
+ public List<Option<T>> getOptions() {\r
+ return options;\r
+ }\r
\r
- /**\r
- * \r
- * @return List of {@link Parameter} supported by type T.\r
- */\r
- public List<Parameter<T>> getParameters() {\r
- return parameters;\r
- }\r
+ /**\r
+ * Adds parameter to the internal parameter list\r
+ * \r
+ * @param param\r
+ * the {@link Parameter} to add\r
+ * @see Parameter\r
+ */\r
+ public void addParameter(Parameter<T> param) {\r
+ assert param != null;\r
+ parameters.add(param);\r
+ }\r
\r
- @Override\r
- public String toString() {\r
- String value = "Runner: " + this.runnerClassName + SysPrefs.newlinechar;\r
- for (Option<T> par : this.getArguments()) {\r
- value += par;\r
+ /**\r
+ * Adds Option to the internal list of options\r
+ * \r
+ * @param option\r
+ * the {@link Option} to add\r
+ */\r
+ public void addOption(Option<T> option) {\r
+ assert option != null;\r
+ options.add(option);\r
}\r
- return value;\r
- }\r
\r
- /*\r
- * Cast is safe as runnerClassNames equality checked (non-Javadoc)\r
- * \r
- * @see java.lang.Object#equals(java.lang.Object)\r
- */\r
- @SuppressWarnings("unchecked")\r
- @Override\r
- public boolean equals(Object obj) {\r
- if (obj == null) {\r
- return false;\r
+ /**\r
+ * Returns list of {@link Parameter} and {@link Option} supported by current\r
+ * runner\r
+ * \r
+ * @return list of {@link Option} and {@link Parameter} supported by type T\r
+ */\r
+ @XmlTransient\r
+ public List<Option<T>> getArguments() {\r
+ arguments = new ArrayList<Option<T>>(options);\r
+ arguments.addAll(parameters);\r
+ return arguments;\r
}\r
- RunnerConfig<?> rconf = null;\r
- if (obj instanceof RunnerConfig) {\r
- rconf = (RunnerConfig) obj;\r
+\r
+ /**\r
+ * \r
+ * @return name value separator character\r
+ */\r
+ public String getPrmSeparator() {\r
+ return prmSeparator;\r
}\r
- if (!rconf.runnerClassName.equals(this.runnerClassName)) {\r
- return false;\r
+\r
+ /**\r
+ * Sets name value separator character\r
+ * \r
+ * @param prmSeparator\r
+ * the separator char\r
+ */\r
+ public void setPrmSeparator(String prmSeparator) {\r
+ this.prmSeparator = prmSeparator;\r
}\r
- if (this.options.size() != rconf.options.size()) {\r
- return false;\r
+\r
+ /**\r
+ * Adds the list of options or parameters to the internal list of options\r
+ * \r
+ * @param parameters\r
+ * the list of parameters to add\r
+ * \r
+ */\r
+ public void setOptions(List<Option<T>> parameters) {\r
+ this.options = parameters;\r
}\r
- if (this.parameters.size() != rconf.parameters.size()) {\r
- return false;\r
+\r
+ /**\r
+ * \r
+ * @return fully qualified class name for type T\r
+ */\r
+ @XmlElement(required = true)\r
+ public String getRunnerClassName() {\r
+ return runnerClassName;\r
}\r
- if (!this.prmSeparator.equals(rconf.prmSeparator)) {\r
- return false;\r
+\r
+ /**\r
+ * Set the name of a runner class\r
+ * \r
+ * @param runnerClassName\r
+ * the name of the executable wrapping class\r
+ */\r
+ public void setRunnerClassName(String runnerClassName) {\r
+ this.runnerClassName = runnerClassName;\r
}\r
- // Size of option list is the same at that point\r
- for (Option<T> op : options) {\r
- Option<T> roption = (Option<T>) rconf.getArgument(op.getName());\r
- if (roption == null) {\r
- return false;\r
- }\r
- if (!op.equals(roption)) {\r
- return false;\r
- }\r
+\r
+ /**\r
+ * Sets the list of parameters as internal list\r
+ * \r
+ * @param parameters\r
+ * the list of parameters\r
+ */\r
+ public void setParameters(List<Parameter<T>> parameters) {\r
+ this.parameters = parameters;\r
}\r
- // Size of parameters list is the same at that point\r
- for (Parameter<T> par : parameters) {\r
- Parameter<T> rpar = (Parameter<T>) rconf.getArgument(par.getName());\r
- if (rpar == null) {\r
- return false;\r
- }\r
- if (!par.equals(rpar)) {\r
- return false;\r
- }\r
+\r
+ /**\r
+ * Returns the list of parameters supported executable of type T. Where\r
+ * {@link Parameter} is an {@link Option} with value.\r
+ * \r
+ * @return List of {@link Parameter} supported by type T.\r
+ */\r
+ public List<Parameter<T>> getParameters() {\r
+ return parameters;\r
}\r
- return true;\r
- }\r
\r
- /**\r
- * Returns the argument by its name if found, NULL otherwise\r
- * \r
- * @param name\r
- * @return {@link Argument}\r
- */\r
- public Option<T> getArgument(String name) {\r
- for (Option<T> par : getArguments()) {\r
- if (par.getName().equalsIgnoreCase(name)) {\r
- return par;\r
- }\r
+ @Override\r
+ public String toString() {\r
+ String value = "Runner: " + this.runnerClassName + SysPrefs.newlinechar;\r
+ for (Option<T> par : this.getArguments()) {\r
+ value += par;\r
+ }\r
+ return value;\r
}\r
- return null;\r
- }\r
\r
- /**\r
- * Removes the argument {@link Argument} if found.\r
- * \r
- * @param name\r
- * of the argument\r
- * @return true if argument was removed, false otherwise\r
- */\r
- @SuppressWarnings("unchecked")\r
- // Just use raw type in instanceof this is safe\r
- public boolean removeArgument(String name) {\r
- Option<T> par = getArgument(name);\r
- if (par != null) {\r
- if (par instanceof Parameter) {\r
- parameters.remove(par);\r
- return true;\r
- } else {\r
- this.options.remove(par);\r
+ /*\r
+ * Cast is safe as runnerClassNames equality checked (non-Javadoc)\r
+ * @see java.lang.Object#equals(java.lang.Object)\r
+ */\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (obj == null) {\r
+ return false;\r
+ }\r
+ RunnerConfig<?> rconf = null;\r
+ if (obj instanceof RunnerConfig) {\r
+ rconf = (RunnerConfig) obj;\r
+ }\r
+ if (!rconf.runnerClassName.equals(this.runnerClassName)) {\r
+ return false;\r
+ }\r
+ if (this.options.size() != rconf.options.size()) {\r
+ return false;\r
+ }\r
+ if (this.parameters.size() != rconf.parameters.size()) {\r
+ return false;\r
+ }\r
+ if (!this.prmSeparator.equals(rconf.prmSeparator)) {\r
+ return false;\r
+ }\r
+ // Size of option list is the same at that point\r
+ for (Option<T> op : options) {\r
+ Option<T> roption = (Option<T>) rconf.getArgument(op.getName());\r
+ if (roption == null) {\r
+ return false;\r
+ }\r
+ if (!op.equals(roption)) {\r
+ return false;\r
+ }\r
+ }\r
+ // Size of parameters list is the same at that point\r
+ for (Parameter<T> par : parameters) {\r
+ Parameter<T> rpar = (Parameter<T>) rconf.getArgument(par.getName());\r
+ if (rpar == null) {\r
+ return false;\r
+ }\r
+ if (!par.equals(rpar)) {\r
+ return false;\r
+ }\r
+ }\r
return true;\r
- }\r
}\r
- return false;\r
- }\r
\r
- /**\r
- * Returns the argument by option name, NULL if the argument is not found\r
- * \r
- * @param optionName\r
- * - the name of the option\r
- * @return Option\r
- */\r
- public Option<T> getArgumentByOptionName(String optionName) {\r
- for (Option<T> opt : getArguments()) {\r
- for (String val : opt.getOptionNames()) {\r
- if (val.equalsIgnoreCase(optionName)) {\r
- return opt;\r
+ /**\r
+ * Returns the argument by its name if found, NULL otherwise. Where the\r
+ * Argument is a common interface for {@link Option} and {@link Parameter}\r
+ * therefore this method can return either. If you need to retrieve the\r
+ * Option by its optionNames use @link\r
+ * {@link RunnerConfig#getArgumentByOptionName(String)} method. The\r
+ * difference between option name and optionName is explained by the\r
+ * following example:\r
+ * \r
+ * <pre>\r
+ * <name>Sequence type</name>\r
+ * <description>\r
+ * --nuc - Assume the sequences are nucleotide.\r
+ * --amino - Assume the sequences are amino acid. </description>\r
+ * <optionNames>--amino</optionNames>\r
+ * <optionNames>--nuc</optionNames>\r
+ * <optionNames>--auto</optionNames>\r
+ * </pre>\r
+ * \r
+ * In the example, the "Sequence type" is a name whereas --amino, --nuc and\r
+ * --auto are all optionNames. This dichotomy only manifests in\r
+ * <code>Option</code> never in <code>Parameters</code> as the latter can\r
+ * only have single <optioNames> element\r
+ * \r
+ * @param name\r
+ * the Parameter of Option name\r
+ * @return {@link Argument}\r
+ */\r
+ public Option<T> getArgument(String name) {\r
+ for (Option<T> par : getArguments()) {\r
+ if (par.getName().equalsIgnoreCase(name)) {\r
+ return par;\r
+ }\r
+ }\r
+ return null;\r
+ }\r
+\r
+ /**\r
+ * Removes the argument {@link Argument} if found. Where Argument is either\r
+ * {@link Option} or {@link Parameter}.\r
+ * \r
+ * @param name\r
+ * of the argument\r
+ * @return true if argument was removed, false otherwise\r
+ */\r
+ @SuppressWarnings("unchecked")\r
+ // Just use raw type in instanceof this is safe\r
+ public boolean removeArgument(String name) {\r
+ Option<T> par = getArgument(name);\r
+ if (par != null) {\r
+ if (par instanceof Parameter) {\r
+ parameters.remove(par);\r
+ return true;\r
+ } else {\r
+ this.options.remove(par);\r
+ return true;\r
+ }\r
}\r
- }\r
+ return false;\r
}\r
\r
- return null;\r
- }\r
+ /**\r
+ * Returns the argument by option name, NULL if the argument is not found\r
+ * \r
+ * @param optionName\r
+ * - the optionName. This is not the same as an Option name.\r
+ * \r
+ * For example:\r
+ * \r
+ * <pre>\r
+ * <name>Output sequences order</name>\r
+ * <description>--inputorder - Output order: same as input. \r
+ * --reorder - Output order: aligned. Default: same as input</description>\r
+ * <optionNames>--inputorder</optionNames>\r
+ * <optionNames>--reorder</optionNames>\r
+ * </pre>\r
+ * \r
+ * The name of the option in the example is\r
+ * "Output sequences order" whereas optionNames are\r
+ * "--inputorder" and "--reorder". If you need to retrieve the\r
+ * Option or Parameter by its names use\r
+ * {@link RunnerConfig#getArgument(String)} method\r
+ * @return Option\r
+ */\r
+ public Option<T> getArgumentByOptionName(String optionName) {\r
+ for (Option<T> opt : getArguments()) {\r
+ for (String val : opt.getOptionNames()) {\r
+ if (val.equalsIgnoreCase(optionName)) {\r
+ return opt;\r
+ }\r
+ }\r
+ }\r
\r
- /**\r
- * Removes the argument\r
- * \r
- * @param optionName\r
- * @return true if argument with optionName exists and was removed, false\r
- * otherwise\r
- */\r
- @SuppressWarnings("unchecked")\r
- // Just use raw type in instanceof this is safe\r
- public boolean removeArgumentByOptionName(String optionName) {\r
- Option<T> par = getArgumentByOptionName(optionName);\r
- if (par != null) {\r
- if (par instanceof Parameter) {\r
- this.parameters.remove(par);\r
- return true;\r
- } else {\r
- this.options.remove(par);\r
- return true;\r
- }\r
+ return null;\r
}\r
- return false;\r
- }\r
\r
- /**\r
- * Validate the arguments\r
- * \r
- * @throws ValidationException\r
- * if any of the arguments found invalid which is when\r
- * <dl>\r
- * <li>Parameter value outside {@link ValueConstrain} boundary</li>\r
- * <li>Parameter name is not listed in possible values</li>\r
- * </dl>\r
- */\r
- public void validate() throws ValidationException {\r
- for (Option<?> option : getArguments()) {\r
- option.validate();\r
+ /**\r
+ * Removes the argument which can be a Parameter or an Option instance by\r
+ * the value in <optionNames> element of the runner configuration\r
+ * descriptor.\r
+ * \r
+ * @param optionName\r
+ * the optionName of the option, do not confuse with the name!\r
+ * @return true if argument with optionName exists and was removed, false\r
+ * otherwise\r
+ * @see RunnerConfig#getArgumentByOptionName(String) for destinctions\r
+ * between optionNames and the name of the Option\r
+ */\r
+ @SuppressWarnings("unchecked")\r
+ // Just use raw type in instanceof this is safe\r
+ public boolean removeArgumentByOptionName(String optionName) {\r
+ Option<T> par = getArgumentByOptionName(optionName);\r
+ if (par != null) {\r
+ if (par instanceof Parameter) {\r
+ this.parameters.remove(par);\r
+ return true;\r
+ } else {\r
+ this.options.remove(par);\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ /**\r
+ * Validate the value of the argument. Checks whether the argument value is\r
+ * in the valid values range.\r
+ * \r
+ * @throws ValidationException\r
+ * if any of the arguments found invalid which is when\r
+ * <dl>\r
+ * <li>Parameter value outside {@link ValueConstrain} boundary</li>\r
+ * <li>Parameter name is not listed in possible values</li>\r
+ * </dl>\r
+ */\r
+ public void validate() throws ValidationException {\r
+ for (Option<?> option : getArguments()) {\r
+ option.validate();\r
+ }\r
}\r
- }\r
}\r