/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.commons.cli; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * Main entry-point into the library. *

* Options represents a collection of {@link Option} objects, which * describe the possible options for a command-line. *

* It may flexibly parse long and short options, with or without * values. Additionally, it may parse only a portion of a commandline, * allowing for flexible multi-stage parsing. * * @see org.apache.commons.cli.CommandLine * * @version $Id: Options.java 1685376 2015-06-14 09:51:59Z britter $ */ public class Options implements Serializable { /** The serial version UID. */ private static final long serialVersionUID = 1L; /** a map of the options with the character key */ private final Map shortOpts = new LinkedHashMap(); /** a map of the options with the long key */ private final Map longOpts = new LinkedHashMap(); /** a map of the required options */ // N.B. This can contain either a String (addOption) or an OptionGroup (addOptionGroup) // TODO this seems wrong private final List requiredOpts = new ArrayList(); /** a map of the option groups */ private final Map optionGroups = new HashMap(); /** * Add the specified option group. * * @param group the OptionGroup that is to be added * @return the resulting Options instance */ public Options addOptionGroup(OptionGroup group) { if (group.isRequired()) { requiredOpts.add(group); } for (final Option option : group.getOptions()) { // an Option cannot be required if it is in an // OptionGroup, either the group is required or // nothing is required option.setRequired(false); addOption(option); optionGroups.put(option.getKey(), group); } return this; } /** * Lists the OptionGroups that are members of this Options instance. * * @return a Collection of OptionGroup instances. */ Collection getOptionGroups() { return new HashSet(optionGroups.values()); } /** * Add an option that only contains a short name. * The option does not take an argument. * * @param opt Short single-character name of the option. * @param description Self-documenting description * @return the resulting Options instance * @since 1.3 */ public Options addOption(String opt, String description) { addOption(opt, null, false, description); return this; } /** * Add an option that only contains a short-name. * It may be specified as requiring an argument. * * @param opt Short single-character name of the option. * @param hasArg flag signally if an argument is required after this option * @param description Self-documenting description * @return the resulting Options instance */ public Options addOption(String opt, boolean hasArg, String description) { addOption(opt, null, hasArg, description); return this; } /** * Add an option that contains a short-name and a long-name. * It may be specified as requiring an argument. * * @param opt Short single-character name of the option. * @param longOpt Long multi-character name of the option. * @param hasArg flag signally if an argument is required after this option * @param description Self-documenting description * @return the resulting Options instance */ public Options addOption(String opt, String longOpt, boolean hasArg, String description) { addOption(new Option(opt, longOpt, hasArg, description)); return this; } /** * Adds an option instance * * @param opt the option that is to be added * @return the resulting Options instance */ public Options addOption(Option opt) { final String key = opt.getKey(); // add it to the long option list if (opt.hasLongOpt()) { longOpts.put(opt.getLongOpt(), opt); } // if the option is required add it to the required list if (opt.isRequired()) { if (requiredOpts.contains(key)) { requiredOpts.remove(requiredOpts.indexOf(key)); } requiredOpts.add(key); } shortOpts.put(key, opt); return this; } /** * Retrieve a read-only list of options in this set * * @return read-only Collection of {@link Option} objects in this descriptor */ public Collection