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 }