Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Using Default Values

Header Image

Ahoy, mateys! Welcome back to our series of tutorials on Apache Commons CLI. In this article, we’ll be discussing how to specify default option values using this powerful library. Setting default values can save you time and effort, especially when you have to handle lots of options with complex configurations. So, hoist the main sail and let’s get started!

Specifying Default Option Values

In Apache Commons CLI, you can set default values for your options by using the Option.Builder class. This class provides a method called defaultValue() that you can use to specify a default value for an option. Here’s an example:

Option option = Option.builder("f")
                .longOpt("file")
                .hasArg()
                .argName("file")
                .desc("Input file name")
                .defaultValue("default.txt")
                .build();

In this example, we’re creating an option with the short name “f” and the long name “file”. The hasArg() method specifies that this option requires an argument, and argName() sets the name of that argument to “file”. The desc() method provides a description of the option. Finally, we’re setting the default value for the option to “default.txt” using the defaultValue() method.

Use Case: Specifying a Default Input File

Let’s say you’re writing a command-line tool that processes text files. One of the options is the input file name. If the user doesn’t provide a file name, you want to use a default file called “default.txt”. Here’s how you can do that with Apache Commons CLI:

public static void main(String[] args) {
    Options options = new Options();
    Option input = Option.builder("f")
            .longOpt("file")
            .hasArg()
            .argName("file")
            .desc("Input file name")
            .defaultValue("default.txt")
            .build();
    options.addOption(input);

    CommandLineParser parser = new DefaultParser();
    try {
        CommandLine cmd = parser.parse(options, args);
        String inputFile = cmd.getOptionValue("f");
        // If no file is provided, use the default file
        if (inputFile == null) {
            inputFile = "default.txt";
        }
        // Do something with the input file
        processInputFile(inputFile);
    } catch (ParseException e) {
        // Handle parsing errors
        System.err.println("Error: " + e.getMessage());
        // Display the usage message
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp("mytool", options);
    }
}

In this example, we’re creating an option called “file” with the short name “f” and the long name “file”. We’re setting the default value to “default.txt” using the defaultValue() method. Then, we’re adding this option to the Options object using the addOption() method.

When we parse the command line using CommandLineParser, we check if the “file” option is present using the getOptionValue() method. If it’s not present, we set the input file to the default value of “default.txt”. Finally, we call the processInputFile() method to do something with the input file.

Handling Missing Option Values

In some cases, the user may forget to provide a value for an option, even if it’s required. In such situations, you need to handle missing option values in a way that makes sense for your application. Apache Commons CLI provides several options for dealing with missing option values.

One way to handle missing option values is to display an error message and exit the program. You can do this by checking if the option value is null after parsing the command line arguments. Here’s an example:

Option input = Option.builder("f")
            .longOpt("file")
            .hasArg()
            .argName("file")
            .desc("Input file name")
            .required()
            .build();

In this example, we’ve added the required() method to the Option.Builder object. This method tells Apache Commons CLI that this option is required and must have a value. If the user forgets to provide a value for this option, the parser throws a MissingArgumentException exception. You can catch this exception and display an error message to the user.

try {
    CommandLine cmd = parser.parse(options, args);
    String inputFile = cmd.getOptionValue("f");
    if (inputFile == null) {
        throw new MissingArgumentException("The input file name is required");
    }
    processInputFile(inputFile);
} catch (ParseException | MissingArgumentException e) {
    System.err.println("Error: " + e.getMessage());
    HelpFormatter formatter = new HelpFormatter();
    formatter.printHelp("mytool", options);
}

In this example, we’ve added a try-catch block to handle the MissingArgumentException exception. If the user forgets to provide a value for the “file” option, the getOptionValue() method returns null, and we throw a MissingArgumentException exception. This exception is caught in the catch block, and we display an error message to the user.

Another way to handle missing option values is to provide a default value, as we discussed in the previous section. This approach can be useful when the option is not required, and you have a sensible default value that you can use.

Option output = Option.builder("o")
            .longOpt("output")
            .hasArg()
            .argName("file")
            .desc("Output file name")
            .defaultValue("output.txt")
            .build();

In this example, we’ve added the defaultValue() method to the Option.Builder object. If the user forgets to provide a value for this option, the parser sets the value to “output.txt”, which is the default value we specified.

Conclusion

In this article, we’ve covered how to specify default option values and how to handle missing option values in Apache Commons CLI. By using the Option.Builder class, you can easily set default values for your options, and by using the required() method, you can ensure that required options have a value. We hope this article has been informative and helpful for you. Stay tuned for more articles on Apache Commons CLI, and happy coding!