summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/beust/jcommander/WrappedParameter.java
blob: e49245a4790e88a04d2cb2cb77501cc0cb9f7acc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package com.beust.jcommander;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Encapsulates the operations common to @Parameter and @DynamicParameter
 */
public class WrappedParameter {
  private Parameter parameter;
  private DynamicParameter dynamicParameter;

  public WrappedParameter(Parameter p) {
    parameter = p;
  }

  public WrappedParameter(DynamicParameter p) {
    dynamicParameter = p;
  }

  public Parameter getParameter() {
    return parameter;
  }

  public DynamicParameter getDynamicParameter() {
    return dynamicParameter;
  }

  public int arity() {
    return parameter != null ? parameter.arity() : 1;
  }

  public boolean hidden() {
    return parameter != null ? parameter.hidden() : dynamicParameter.hidden();
  }

  public boolean required() {
    return parameter != null ? parameter.required() : dynamicParameter.required();
  }

  public boolean password() {
    return parameter != null ? parameter.password() : false;
  }

  public String[] names() {
    return parameter != null ? parameter.names() : dynamicParameter.names();
  }

  public boolean variableArity() {
    return parameter != null ? parameter.variableArity() : false;
  }

  public Class<? extends IParameterValidator>[] validateWith() {
    return parameter != null ? parameter.validateWith() : dynamicParameter.validateWith();
  }

  public Class<? extends IValueValidator>[] validateValueWith() {
    return parameter != null
        ? parameter.validateValueWith()
        : dynamicParameter.validateValueWith();
  }

  public boolean echoInput() {
	  return parameter != null ? parameter.echoInput() : false;
  }

  public void addValue(Parameterized parameterized, Object object, Object value) {
    try {
      addValue(parameterized, object, value, null);
    } catch (IllegalAccessException e) {
      throw new ParameterException("Couldn't set " + object + " to " + value, e);
    }
  }

  public void addValue(Parameterized parameterized, Object object, Object value, Field field)
          throws IllegalAccessException {
    if (parameter != null) {
      if (field != null) {
        field.set(object, value);
      } else {
        parameterized.set(object, value);
      }
    } else {
      String a = dynamicParameter.assignment();
      String sv = value.toString();

      int aInd = sv.indexOf(a);
      if (aInd == -1) {
        throw new ParameterException(
            "Dynamic parameter expected a value of the form a" + a + "b"
                + " but got:" + sv);
      }
      callPut(object, parameterized, sv.substring(0, aInd), sv.substring(aInd + 1));
    }
  }

  private void callPut(Object object, Parameterized parameterized, String key, String value) {
    try {
      Method m;
      m = findPut(parameterized.getType());
      m.invoke(parameterized.get(object), key, value);
    } catch (SecurityException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
      e.printStackTrace();
    }
  }

  private Method findPut(Class<?> cls) throws SecurityException, NoSuchMethodException {
    return cls.getMethod("put", Object.class, Object.class);
  }

  public String getAssignment() {
    return dynamicParameter != null ? dynamicParameter.assignment() : "";
  }

  public boolean isHelp() {
    return parameter != null && parameter.help();
  }

  public boolean isNonOverwritableForced() {
      return parameter != null && parameter.forceNonOverwritable();
  }
}