Changes from JWS2 branch merged, mostly javadoc
[jabaws.git] / datamodel / compbio / metadata / RunnerConfig.java
index eb19a7e..102f20c 100644 (file)
@@ -32,10 +32,11 @@ import compbio.util.annotation.NotThreadSafe;
 \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
@@ -43,257 +44,346 @@ import compbio.util.annotation.NotThreadSafe;
 @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