Чистый код. Создание, анализ и рефакторинг — страница 43 из 94

      argsFound.add(argChar);

    else {

      unexpectedArguments.add(argChar);

      errorCode = ErrorCode.UNEXPECTED_ARGUMENT;

      valid = false;

    }

  }


  private boolean setArgument(char argChar) throws ArgsException {

    ArgumentMarshaler m = marshalers.get(argChar);

    try {

      if (m instanceof BooleanArgumentMarshaler)

        setBooleanArg(m);

      else if (m instanceof StringArgumentMarshaler)

        setStringArg(m);

      else if (m instanceof IntegerArgumentMarshaler)

        setIntArg(m);

      else

        return false;

    } catch (ArgsException e) {

      valid = false;

      errorArgumentId = argChar;

      throw e;

    }

    return true;

  }


  private void setIntArg(ArgumentMarshaler m) throws ArgsException {

    currentArgument++;

    String parameter = null;

    try {

      parameter = args[currentArgument];

      m.set(parameter);

    } catch (ArrayIndexOutOfBoundsException e) {

      errorCode = ErrorCode.MISSING_INTEGER;

      throw new ArgsException();

    } catch (ArgsException e) {

      errorParameter = parameter;

      errorCode = ErrorCode.INVALID_INTEGER;

      throw e;

    }

  }


  private void setStringArg(ArgumentMarshaler m) throws ArgsException {

    currentArgument++;

    try {

      m.set(args[currentArgument]);

    } catch (ArrayIndexOutOfBoundsException e) {

      errorCode = ErrorCode.MISSING_STRING;

      throw new ArgsException();

    }

  }


  private void setBooleanArg(ArgumentMarshaler m) {

    try {

      m.set("true");

    } catch (ArgsException e) {

    }

  }


  public int cardinality() {

    return argsFound.size();

  }


  public String usage() {

    if (schema.length() > 0)

      return "-[" + schema + "]";

    else

      return "";

  }


  public String errorMessage() throws Exception {

    switch (errorCode) {

      case OK:

        throw new Exception("TILT: Should not get here.");

      case UNEXPECTED_ARGUMENT:

        return unexpectedArgumentMessage();

      case MISSING_STRING:

        return String.format("Could not find string parameter for -%c.",

                             errorArgumentId);

      case INVALID_INTEGER:

        return String.format("Argument -%c expects an integer but was '%s'.",

              errorArgumentId, errorParameter);


Листинг 14.12 (продолжение)

      case MISSING_INTEGER:

        return String.format("Could not find integer parameter for -%c.",

                             errorArgumentId);

    }

    return "";

  }


  private String unexpectedArgumentMessage() {

    StringBuffer message = new StringBuffer("Argument(s) -");

    for (char c : unexpectedArguments) {

      message.append(c);

    }

    message.append(" unexpected.");

    return message.toString();

  }


  public boolean getBoolean(char arg) {

    Args.ArgumentMarshaler am = marshalers.get(arg);

    boolean b = false;

    try {

      b = am != null && (Boolean) am.get();

    } catch (ClassCastException e) {

      b = false;

    }

    return b;

  }


  public String getString(char arg) {

    Args.ArgumentMarshaler am = marshalers.get(arg);

    try {

      return am == null ? "" : (String) am.get();

    } catch (ClassCastException e) {

      return "";

    }

  }


  public int getInt(char arg) {

    Args.ArgumentMarshaler am = marshalers.get(arg);

    try {

      return am == null ? 0 : (Integer) am.get();

    } catch (Exception e) {

      return 0;

    }

  }


  public boolean has(char arg) {

    return argsFound.contains(arg);

  }


  public boolean isValid() {

    return valid;

  }

  private class ArgsException extends Exception {

  }


  private abstract class ArgumentMarshaler {

    public abstract void set(String s) throws ArgsException;

    public abstract Object get();

  }


  private class BooleanArgumentMarshaler extends ArgumentMarshaler {

    private boolean booleanValue = false;

    public void set(String s) {

      booleanValue = true;

    }

    public Object get() {

      return booleanValue;

    }

  }


  private class StringArgumentMarshaler extends ArgumentMarshaler {

    private String stringValue = "";

    public void set(String s) {

      stringValue = s;

    }

    public Object get() {

      return stringValue;

    }

  }