View Javadoc

1   package com.lexicalscope.jewel.cli;
2   
3   import static com.lexicalscope.jewel.cli.ConvertTypeOfObject.converterTo;
4   
5   import java.util.LinkedHashMap;
6   import java.util.List;
7   import java.util.Map;
8   
9   import com.lexicalscope.jewel.cli.specification.OptionSpecification;
10  import com.lexicalscope.jewel.cli.specification.OptionsSpecification;
11  import com.lexicalscope.jewel.cli.specification.ParsedOptionSpecification;
12  import com.lexicalscope.jewel.cli.specification.UnparsedOptionSpecification;
13  import com.lexicalscope.jewel.cli.validation.Argument;
14  import com.lexicalscope.jewel.cli.validation.OptionCollection;
15  
16  
17  class ArgumentPresenterImpl<O> implements ArgumentPresenter<O> {
18      private final OptionsSpecification<O> specification;
19      private final ArgumentPresentingStrategy<O> argumentPresentingStrategy;
20  
21      public ArgumentPresenterImpl(
22              final OptionsSpecification<O> specification,
23              final ArgumentPresentingStrategy<O> argumentPresentingStrategy) {
24          this.specification = specification;
25          this.argumentPresentingStrategy = argumentPresentingStrategy;
26      }
27  
28      @Option public O presentArguments(final OptionCollection validatedArguments) throws ArgumentValidationException {
29          final Map<String, Object> argumentMap = new LinkedHashMap<String, Object>();
30  
31          final ValidationErrorBuilder validationErrorBuilder = new ValidationErrorBuilderImpl();
32  
33          for (final ParsedOptionSpecification optionSpecification : specification) {
34              final ConvertTypeOfObject<?> convertTypeOfObject =
35                      converterTo(validationErrorBuilder, optionSpecification, optionSpecification.getMethod());
36              putDefaultInMap(argumentMap, optionSpecification, convertTypeOfObject);
37  
38              final Argument argument = validatedArguments.getArgument(optionSpecification);
39              if (argument != null) {
40                  putValuesInMap(argumentMap, optionSpecification, convertTypeOfObject, argument.getValues());
41              }
42          }
43  
44          if (specification.hasUnparsedSpecification()) {
45              final UnparsedOptionSpecification unparsedSpecification = specification.getUnparsedSpecification();
46  
47              final ConvertTypeOfObject<?> convertTypeOfObject =
48                      converterTo(
49                              validationErrorBuilder,
50                              unparsedSpecification,
51                              unparsedSpecification.getMethod());
52  
53              putDefaultInMap(argumentMap, unparsedSpecification, convertTypeOfObject);
54              if (!validatedArguments.getUnparsed().isEmpty()) {
55                  putValuesInMap(
56                          argumentMap,
57                          unparsedSpecification,
58                          convertTypeOfObject,
59                          validatedArguments.getUnparsed());
60              }
61          }
62          validationErrorBuilder.validate();
63          return argumentPresentingStrategy.presentArguments(argumentMap);
64      }
65  
66      private void putValuesInMap(
67              final Map<String, Object> argumentMap,
68              final OptionSpecification specification,
69              final ConvertTypeOfObject<?> convertTypeOfObject,
70              final List<String> values) {
71          if (specification.isMultiValued())
72          {
73              argumentMap.put(
74                      specification.getCanonicalIdentifier(),
75                      convertTypeOfObject.convert(values));
76          }
77          else if (!values.isEmpty())
78          {
79              argumentMap.put(
80                      specification.getCanonicalIdentifier(),
81                      convertTypeOfObject.convert(values.get(0)));
82          } else if (values.isEmpty()) {
83              argumentMap.put(specification.getCanonicalIdentifier(), null);
84          }
85      }
86  
87      private void putDefaultInMap(
88              final Map<String, Object> argumentMap,
89              final OptionSpecification optionSpecification,
90              final ConvertTypeOfObject<?> convertTypeOfObject) {
91          if (optionSpecification.isMultiValued() && optionSpecification.hasDefaultValue())
92          {
93              argumentMap.put(
94                      optionSpecification.getCanonicalIdentifier(),
95                      convertTypeOfObject.convert(optionSpecification.getDefaultValue()));
96          }
97          else if (optionSpecification.hasDefaultValue() && optionSpecification.getDefaultValue().size() > 0)
98          {
99              argumentMap.put(
100                     optionSpecification.getCanonicalIdentifier(),
101                     convertTypeOfObject.convert(optionSpecification.getDefaultValue().get(0)));
102         }
103     }
104 }