View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.cling.invoker.mvnenc;
20  
21  import java.util.List;
22  import java.util.ListIterator;
23  import java.util.Optional;
24  import java.util.function.Consumer;
25  import java.util.function.UnaryOperator;
26  
27  import org.apache.commons.cli.CommandLine;
28  import org.apache.commons.cli.Option;
29  import org.apache.commons.cli.ParseException;
30  import org.apache.maven.api.cli.Options;
31  import org.apache.maven.api.cli.ParserRequest;
32  import org.apache.maven.api.cli.mvnenc.EncryptOptions;
33  import org.apache.maven.api.services.Interpolator;
34  import org.apache.maven.api.services.InterpolatorException;
35  import org.apache.maven.cling.invoker.CommonsCliOptions;
36  
37  import static org.apache.maven.cling.invoker.Utils.createInterpolator;
38  
39  /**
40   * Implementation of {@link EncryptOptions} (base + mvnenc).
41   */
42  public class CommonsCliEncryptOptions extends CommonsCliOptions implements EncryptOptions {
43      public static CommonsCliEncryptOptions parse(String[] args) throws ParseException {
44          CLIManager cliManager = new CLIManager();
45          return new CommonsCliEncryptOptions(Options.SOURCE_CLI, cliManager, cliManager.parse(args));
46      }
47  
48      protected CommonsCliEncryptOptions(String source, CLIManager cliManager, CommandLine commandLine) {
49          super(source, cliManager, commandLine);
50      }
51  
52      private static CommonsCliEncryptOptions interpolate(
53              CommonsCliEncryptOptions options, UnaryOperator<String> callback) {
54          try {
55              // now that we have properties, interpolate all arguments
56              Interpolator interpolator = createInterpolator();
57              CommandLine.Builder commandLineBuilder = new CommandLine.Builder();
58              commandLineBuilder.setDeprecatedHandler(o -> {});
59              for (Option option : options.commandLine.getOptions()) {
60                  if (!CLIManager.USER_PROPERTY.equals(option.getOpt())) {
61                      List<String> values = option.getValuesList();
62                      for (ListIterator<String> it = values.listIterator(); it.hasNext(); ) {
63                          it.set(interpolator.interpolate(it.next(), callback));
64                      }
65                  }
66                  commandLineBuilder.addOption(option);
67              }
68              for (String arg : options.commandLine.getArgList()) {
69                  commandLineBuilder.addArg(interpolator.interpolate(arg, callback));
70              }
71              return new CommonsCliEncryptOptions(
72                      options.source, (CLIManager) options.cliManager, commandLineBuilder.build());
73          } catch (InterpolatorException e) {
74              throw new IllegalArgumentException("Could not interpolate CommonsCliOptions", e);
75          }
76      }
77  
78      @Override
79      public Optional<Boolean> force() {
80          if (commandLine.hasOption(CLIManager.FORCE)) {
81              return Optional.of(Boolean.TRUE);
82          }
83          return Optional.empty();
84      }
85  
86      @Override
87      public Optional<Boolean> yes() {
88          if (commandLine.hasOption(CLIManager.YES)) {
89              return Optional.of(Boolean.TRUE);
90          }
91          return Optional.empty();
92      }
93  
94      @Override
95      public Optional<List<String>> goals() {
96          if (!commandLine.getArgList().isEmpty()) {
97              return Optional.of(commandLine.getArgList());
98          }
99          return Optional.empty();
100     }
101 
102     @Override
103     public EncryptOptions interpolate(UnaryOperator<String> callback) {
104         return interpolate(this, callback);
105     }
106 
107     @Override
108     public void displayHelp(ParserRequest request, Consumer<String> printStream) {
109         super.displayHelp(request, printStream);
110         printStream.accept("");
111         // we have no DI here (to discover)
112         printStream.accept("Goals:");
113         printStream.accept("  diag - display encryption configuration diagnostic");
114         printStream.accept("  init - wizard to configure encryption (interactive only)");
115         printStream.accept("  encrypt - encrypts input");
116         printStream.accept("  decrypt - decrypts encrypted input");
117         printStream.accept("");
118     }
119 
120     protected static class CLIManager extends CommonsCliOptions.CLIManager {
121         public static final String FORCE = "f";
122         public static final String YES = "y";
123 
124         @Override
125         protected void prepareOptions(org.apache.commons.cli.Options options) {
126             super.prepareOptions(options);
127             options.addOption(Option.builder(FORCE)
128                     .longOpt("force")
129                     .desc("Should overwrite without asking any configuration?")
130                     .build());
131             options.addOption(Option.builder(YES)
132                     .longOpt("yes")
133                     .desc("Should imply user answered \"yes\" to all incoming questions?")
134                     .build());
135         }
136     }
137 }