+ return (inputData == null || inputData.size() == 0);
+ }
+
+ /**
+ * return a url encoded version of this parameter's value, or an empty string
+ * if the parameter has no ='value' content.
+ *
+ * @return
+ */
+ public abstract List<String> getURLEncodedParameter();
+
+ /**
+ * set the property known as tok, possibly by assigning it with a given val
+ *
+ * @param tok
+ * @param val
+ * (may be empty or null)
+ * @param warnings
+ * place where parse warnings are reported
+ * @return true if property was set
+ */
+ public abstract boolean configureProperty(String tok, String val,
+ StringBuffer warnings);
+
+ /**
+ * Get unique key for this type of parameter in a URL encoding.
+ *
+ * @return the string that prefixes an input parameter of InputType<T> type in
+ * the string returned from getURLEncodedParameter
+ */
+ public abstract String getURLtokenPrefix();
+
+ /**
+ * parse the given token String and set InputParameter properties
+ * appropriately
+ *
+ * @param tokenstring
+ * - urlencoded parameter string as returned from
+ * getURLEncodedParameter
+ * @param warnings
+ * - place where any warning messages about bad property values are
+ * written
+ * @return true if configuration succeeded, false otherwise.
+ */
+ public boolean configureFromURLtokenString(List<String> tokenstring,
+ StringBuffer warnings)
+ {
+ boolean valid = true;
+ for (String tok : tokenstring)
+ {
+ Matcher mtch = URL_PATTERN.matcher(tok);
+ if (mtch.find())
+ {
+ try
+ {
+ if (mtch.group(1).equals("min"))
+ {
+ min = Integer.parseInt(mtch.group(2));
+ continue;
+
+ }
+ else if (mtch.group(1).equals("max"))
+ {
+ max = Integer.parseInt(mtch.group(2));
+ continue;
+ }
+ } catch (NumberFormatException x)
+ {
+ valid = false;
+ warnings.append("Invalid value for parameter "
+ + mtch.group(1).toLowerCase() + " '" + mtch.group(2)
+ + "' (expected an integer)\n");
+ }
+
+ if (!configureProperty(mtch.group(1), mtch.group(2), warnings))
+ {
+ if (warnings.length() == 0)
+ {
+ warnings.append("Failed to configure InputType :"
+ + getURLtokenPrefix() + " with property string: '"
+ + mtch.group(0) + "'\n (token is '" + mtch.group(1)
+ + "' and value is '" + mtch.group(2) + "')\n");
+ }
+ valid = false;
+ }
+ }
+ }
+ return valid;
+ }
+
+ public void addBaseParams(ArrayList<String> prms)
+ {
+ // todo : check if replaceids should be a global for the service, rather
+ // than for a specific parameter.
+ if (min != 1)
+ {
+ prms.add("min='" + min + "'");
+ }
+ if (max != 0)
+ {
+ prms.add("max='" + max + "'");
+ }
+ }
+
+ public abstract List<OptionI> getOptions();
+
+ public List<OptionI> getBaseOptions()
+ {
+ ArrayList<OptionI> opts = new ArrayList<OptionI>();
+ opts.add(new IntegerParameter("min",
+ "Minimum number of data of this type", true, 1, min, 0, -1));
+ opts.add(new IntegerParameter("max",
+ "Maximum number of data of this type", false, 0, max, 0, -1));
+ return opts;
+ }
+
+ /**
+ * make a copy of this InputType
+ *
+ * @return may not be needed public abstract InputType copy();
+ */
+
+ /**
+ * parse a set of configuration options
+ *
+ * @param currentSettings
+ * - modified settings originally from getOptions
+ * @throws InvalidArgumentException
+ * thrown if currentSettings contains invalid options for this type.
+ */
+ public void configureFromArgumentI(List<ArgumentI> currentSettings)
+ throws InvalidArgumentException
+ {
+ ArrayList<String> urltoks = new ArrayList<String>();
+ String rg;
+ for (ArgumentI arg : currentSettings)
+ {
+ if (arg instanceof ParameterI)
+ {
+ rg = arg.getName() + "='" + arg.getValue() + "'";
+ }
+ else
+ {
+ // TODO: revise architecture - this is counter intuitive - options with
+ // different values to their names are actually parameters
+ rg = (arg.getValue().length() > 0)
+ ? (arg.getValue().equals(arg.getName()) ? arg.getName()
+ : arg.getName() + "='" + arg.getValue() + "'")
+ : arg.getName();
+ }
+ if (rg.length() > 0)
+ {
+ urltoks.add(rg);
+ }
+ }
+ StringBuffer warnings;
+ if (!configureFromURLtokenString(urltoks,
+ warnings = new StringBuffer()))
+ {
+ throw new InvalidArgumentException(warnings.toString());
+ }
+ }
+
+ protected OptionI createMolTypeOption(String name, String descr,
+ boolean req, molType curType, molType defType)
+ {
+ return new Option(name, descr, req,
+ defType == null ? "" : defType.toString(),
+ curType == null ? "" : curType.toString(),
+ molType.toStringValues(), null);