public CommandLine(List<String> args, AbstractShellScript ss)
      throws UnsupportedOptionException, InvalidOptionValueException {
    for (int i = 0; i < args.size(); ++i) {
      String arg = args.get(i);

      // if this is a specified option that says that the next element is
      // NOT an option
      // like in "rm -- -f" if you wqnt to erase a file named "-f"
      if (arg.equals("--")) {
        // adds the next positional parameter as an argument
        CommandLineElement parm = new CommandLineElement();
        parm.setText(args.get(++i));
        getPositionalParameters().add(parm);
      } else {
        // this is an option
        if (arg.startsWith("-")) {
          boolean isLong = arg.startsWith("--");
          int pos = arg.indexOf('=');
          String name = isLong ? arg.substring(0, pos > 0 ? pos : arg.length()) : arg;
          OptionSpecification spec = ss.getOptionSpecification(name);

          // no specifications exist for this parameter, which means
          // that the option does not exist
          if (spec == null) {
            throw new UnsupportedOptionException(
                "option \"" + arg + "\" is not supported. Please use \"--help\"");
          } else {
            Option option = new Option();
            option.setSpecification(spec);
            option.setSpecified(true);

            // if the option requires a value
            if (spec.getValueRegexp() != null) {
              if (isLong) {
                if (pos < 0) {
                  throw new InvalidOptionValueException("empty value for option " + name);
                } else {
                  option.setValue(arg.substring(pos + 1));
                }
              } else {
                option.setValue(args.get(++i));
              }
            }

            getPositionalParameters().add(option);
          }
        }
        // this argument is not an option, it's hence a parameter
        else {
          CommandLineElement parm = new CommandLineElement();
          parm.setText(arg);
          getPositionalParameters().add(parm);
        }
      }
    }
  }
  public List<String> findArguments() {
    List<String> args = new ArrayList<String>();

    for (CommandLineElement p : getPositionalParameters()) {
      if (!(p instanceof Option)) {
        args.add(p.getText());
      }
    }

    return Collections.unmodifiableList(args);
  }