package picocli.examples.defaultprovider;
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Option;
import picocli.CommandLine.Spec;
import picocli.CommandLine.Unmatched;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
/**
* This example demonstrates a command that allows users to specify the location of
* a "profile" file where the default values are stored.
*
* We take a two-pass approach to loading defaults, where the user-specified arguments
* are parsed twice, once to get the profile path, and the next (final) time with
* a default provider that is initialized from the specified profile path.
*
*/
public class TwoPass {
@Command(mixinStandardHelpOptions = true)
static class FirstPass {
@Option(names = "--profile", description = "...")
File profilePath = new File(System.getProperty("user.dir"), "my-command.properties");
@Unmatched
List remainder;
}
@Command(name = "my-command", mixinStandardHelpOptions = true, version = "my-command 1.0",
description = "Demonstrates a command that allows users to specify the location of a \"profile\" file with default values for the command line arguments")
static class FinalPass implements Runnable {
@Option(names = "--profile", description = "Path to the profile file. Default: ${DEFAULT-VALUE}")
File profilePath = new File(System.getProperty("user.dir"), "my-command.properties");
@Option(names = "-a", description = "...")
int a;
@Option(names = "-b", description = "...", descriptionKey = "bbb")
int b;
@Option(names = "--long-option")
String value;
@Spec CommandLine.Model.CommandSpec spec;
@Override
public void run() {
System.out.println("Executing the business logic...");
System.out.printf("profile=%s%n", profilePath);
System.out.printf("a=%s%n", a);
System.out.printf("b=%s%n", b);
System.out.printf("long-option=%s%n", value);
System.out.println("Command line args:");
System.out.printf("%s%n", spec.commandLine().getParseResult().originalArgs());
}
}
public static void main(String[] args) throws IOException {
File path = createExampleProfileFile();
args = ("--profile=" + path.getAbsolutePath() + " -b123 --long-option USER-SPECIFIED").split(" ");
//args = new String[] {"-h"}; // shows help for my-command (not for FirstPass)
FirstPass firstPass = new FirstPass();
CommandLine cmd = new CommandLine(firstPass);
cmd.parseArgs(args); // first pass
if (cmd.isUsageHelpRequested()) {
new CommandLine(new FinalPass()).usage(System.out);
} else if (cmd.isVersionHelpRequested()) {
new CommandLine(new FinalPass()).printVersionHelp(System.out);
} else {
// final pass
int exitCode = new CommandLine(new FinalPass()).
setDefaultValueProvider(new PropertiesDefaultProvider(firstPass.profilePath))
.execute(args);
System.exit(exitCode);
}
}
// create some defaults
private static File createExampleProfileFile() throws IOException {
Properties profile = new Properties();
profile.setProperty("a", "111111");
profile.setProperty("bbb", "99999999");
profile.setProperty("long-option", "this is the default for long-option");
// store them in a file
File path = File.createTempFile("twopass", ".properties");
profile.store(new FileWriter(path), "Default values for my-command");
return path;
}
}