<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<title>Source code</title>
<link rel="stylesheet" type="text/css" href="../../../../../../../../stylesheet.css" title="Style">
</head>
<body>
<div class="sourceContainer">
<pre><span class="sourceLineNo">001</span>/*<a name="line.1"></a>
<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
<span class="sourceLineNo">003</span> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
<span class="sourceLineNo">004</span> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
<span class="sourceLineNo">005</span> * The ASF licenses this file to You under the Apache license, Version 2.0<a name="line.5"></a>
<span class="sourceLineNo">006</span> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
<span class="sourceLineNo">007</span> * the License. You may obtain a copy of the License at<a name="line.7"></a>
<span class="sourceLineNo">008</span> *<a name="line.8"></a>
<span class="sourceLineNo">009</span> *      http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
<span class="sourceLineNo">010</span> *<a name="line.10"></a>
<span class="sourceLineNo">011</span> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
<span class="sourceLineNo">012</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
<span class="sourceLineNo">013</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
<span class="sourceLineNo">014</span> * See the license for the specific language governing permissions and<a name="line.14"></a>
<span class="sourceLineNo">015</span> * limitations under the license.<a name="line.15"></a>
<span class="sourceLineNo">016</span> */<a name="line.16"></a>
<span class="sourceLineNo">017</span>package org.apache.logging.log4j.core.tools.picocli;<a name="line.17"></a>
<span class="sourceLineNo">018</span><a name="line.18"></a>
<span class="sourceLineNo">019</span>import java.io.File;<a name="line.19"></a>
<span class="sourceLineNo">020</span>import java.io.PrintStream;<a name="line.20"></a>
<span class="sourceLineNo">021</span>import java.lang.annotation.ElementType;<a name="line.21"></a>
<span class="sourceLineNo">022</span>import java.lang.annotation.Retention;<a name="line.22"></a>
<span class="sourceLineNo">023</span>import java.lang.annotation.RetentionPolicy;<a name="line.23"></a>
<span class="sourceLineNo">024</span>import java.lang.annotation.Target;<a name="line.24"></a>
<span class="sourceLineNo">025</span>import java.lang.reflect.Array;<a name="line.25"></a>
<span class="sourceLineNo">026</span>import java.lang.reflect.Constructor;<a name="line.26"></a>
<span class="sourceLineNo">027</span>import java.lang.reflect.Field;<a name="line.27"></a>
<span class="sourceLineNo">028</span>import java.lang.reflect.ParameterizedType;<a name="line.28"></a>
<span class="sourceLineNo">029</span>import java.lang.reflect.Type;<a name="line.29"></a>
<span class="sourceLineNo">030</span>import java.lang.reflect.WildcardType;<a name="line.30"></a>
<span class="sourceLineNo">031</span>import java.math.BigDecimal;<a name="line.31"></a>
<span class="sourceLineNo">032</span>import java.math.BigInteger;<a name="line.32"></a>
<span class="sourceLineNo">033</span>import java.net.InetAddress;<a name="line.33"></a>
<span class="sourceLineNo">034</span>import java.net.MalformedURLException;<a name="line.34"></a>
<span class="sourceLineNo">035</span>import java.net.URI;<a name="line.35"></a>
<span class="sourceLineNo">036</span>import java.net.URISyntaxException;<a name="line.36"></a>
<span class="sourceLineNo">037</span>import java.net.URL;<a name="line.37"></a>
<span class="sourceLineNo">038</span>import java.nio.charset.Charset;<a name="line.38"></a>
<span class="sourceLineNo">039</span>import java.nio.file.Path;<a name="line.39"></a>
<span class="sourceLineNo">040</span>import java.nio.file.Paths;<a name="line.40"></a>
<span class="sourceLineNo">041</span>import java.sql.Time;<a name="line.41"></a>
<span class="sourceLineNo">042</span>import java.text.BreakIterator;<a name="line.42"></a>
<span class="sourceLineNo">043</span>import java.text.ParseException;<a name="line.43"></a>
<span class="sourceLineNo">044</span>import java.text.SimpleDateFormat;<a name="line.44"></a>
<span class="sourceLineNo">045</span>import java.util.ArrayList;<a name="line.45"></a>
<span class="sourceLineNo">046</span>import java.util.Arrays;<a name="line.46"></a>
<span class="sourceLineNo">047</span>import java.util.Collection;<a name="line.47"></a>
<span class="sourceLineNo">048</span>import java.util.Collections;<a name="line.48"></a>
<span class="sourceLineNo">049</span>import java.util.Comparator;<a name="line.49"></a>
<span class="sourceLineNo">050</span>import java.util.Date;<a name="line.50"></a>
<span class="sourceLineNo">051</span>import java.util.HashMap;<a name="line.51"></a>
<span class="sourceLineNo">052</span>import java.util.HashSet;<a name="line.52"></a>
<span class="sourceLineNo">053</span>import java.util.LinkedHashMap;<a name="line.53"></a>
<span class="sourceLineNo">054</span>import java.util.LinkedHashSet;<a name="line.54"></a>
<span class="sourceLineNo">055</span>import java.util.LinkedList;<a name="line.55"></a>
<span class="sourceLineNo">056</span>import java.util.List;<a name="line.56"></a>
<span class="sourceLineNo">057</span>import java.util.Map;<a name="line.57"></a>
<span class="sourceLineNo">058</span>import java.util.Queue;<a name="line.58"></a>
<span class="sourceLineNo">059</span>import java.util.Set;<a name="line.59"></a>
<span class="sourceLineNo">060</span>import java.util.SortedSet;<a name="line.60"></a>
<span class="sourceLineNo">061</span>import java.util.Stack;<a name="line.61"></a>
<span class="sourceLineNo">062</span>import java.util.TreeSet;<a name="line.62"></a>
<span class="sourceLineNo">063</span>import java.util.UUID;<a name="line.63"></a>
<span class="sourceLineNo">064</span>import java.util.concurrent.Callable;<a name="line.64"></a>
<span class="sourceLineNo">065</span>import java.util.regex.Pattern;<a name="line.65"></a>
<span class="sourceLineNo">066</span><a name="line.66"></a>
<span class="sourceLineNo">067</span>import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.IStyle;<a name="line.67"></a>
<span class="sourceLineNo">068</span>import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.Style;<a name="line.68"></a>
<span class="sourceLineNo">069</span>import org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Ansi.Text;<a name="line.69"></a>
<span class="sourceLineNo">070</span><a name="line.70"></a>
<span class="sourceLineNo">071</span>import static java.util.Locale.ENGLISH;<a name="line.71"></a>
<span class="sourceLineNo">072</span>import static org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Column.Overflow.SPAN;<a name="line.72"></a>
<span class="sourceLineNo">073</span>import static org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Column.Overflow.TRUNCATE;<a name="line.73"></a>
<span class="sourceLineNo">074</span>import static org.apache.logging.log4j.core.tools.picocli.CommandLine.Help.Column.Overflow.WRAP;<a name="line.74"></a>
<span class="sourceLineNo">075</span><a name="line.75"></a>
<span class="sourceLineNo">076</span>/**<a name="line.76"></a>
<span class="sourceLineNo">077</span> * &lt;p&gt;<a name="line.77"></a>
<span class="sourceLineNo">078</span> * CommandLine interpreter that uses reflection to initialize an annotated domain object with values obtained from the<a name="line.78"></a>
<span class="sourceLineNo">079</span> * command line arguments.<a name="line.79"></a>
<span class="sourceLineNo">080</span> * &lt;/p&gt;&lt;h2&gt;Example&lt;/h2&gt;<a name="line.80"></a>
<span class="sourceLineNo">081</span> * &lt;pre&gt;import static picocli.CommandLine.*;<a name="line.81"></a>
<span class="sourceLineNo">082</span> *<a name="line.82"></a>
<span class="sourceLineNo">083</span> * &amp;#064;Command(header = "Encrypt FILE(s), or standard input, to standard output or to the output file.",<a name="line.83"></a>
<span class="sourceLineNo">084</span> *          version = "v1.2.3")<a name="line.84"></a>
<span class="sourceLineNo">085</span> * public class Encrypt {<a name="line.85"></a>
<span class="sourceLineNo">086</span> *<a name="line.86"></a>
<span class="sourceLineNo">087</span> *     &amp;#064;Parameters(type = File.class, description = "Any number of input files")<a name="line.87"></a>
<span class="sourceLineNo">088</span> *     private List&amp;lt;File&amp;gt; files = new ArrayList&amp;lt;File&amp;gt;();<a name="line.88"></a>
<span class="sourceLineNo">089</span> *<a name="line.89"></a>
<span class="sourceLineNo">090</span> *     &amp;#064;Option(names = { "-o", "--out" }, description = "Output file (default: print to console)")<a name="line.90"></a>
<span class="sourceLineNo">091</span> *     private File outputFile;<a name="line.91"></a>
<span class="sourceLineNo">092</span> *<a name="line.92"></a>
<span class="sourceLineNo">093</span> *     &amp;#064;Option(names = { "-v", "--verbose"}, description = "Verbosely list files processed")<a name="line.93"></a>
<span class="sourceLineNo">094</span> *     private boolean verbose;<a name="line.94"></a>
<span class="sourceLineNo">095</span> *<a name="line.95"></a>
<span class="sourceLineNo">096</span> *     &amp;#064;Option(names = { "-h", "--help", "-?", "-help"}, usageHelp = true, description = "Display this help and exit")<a name="line.96"></a>
<span class="sourceLineNo">097</span> *     private boolean help;<a name="line.97"></a>
<span class="sourceLineNo">098</span> *<a name="line.98"></a>
<span class="sourceLineNo">099</span> *     &amp;#064;Option(names = { "-V", "--version"}, versionHelp = true, description = "Display version info and exit")<a name="line.99"></a>
<span class="sourceLineNo">100</span> *     private boolean versionHelp;<a name="line.100"></a>
<span class="sourceLineNo">101</span> * }<a name="line.101"></a>
<span class="sourceLineNo">102</span> * &lt;/pre&gt;<a name="line.102"></a>
<span class="sourceLineNo">103</span> * &lt;p&gt;<a name="line.103"></a>
<span class="sourceLineNo">104</span> * Use {@code CommandLine} to initialize a domain object as follows:<a name="line.104"></a>
<span class="sourceLineNo">105</span> * &lt;/p&gt;&lt;pre&gt;<a name="line.105"></a>
<span class="sourceLineNo">106</span> * public static void main(String... args) {<a name="line.106"></a>
<span class="sourceLineNo">107</span> *     Encrypt encrypt = new Encrypt();<a name="line.107"></a>
<span class="sourceLineNo">108</span> *     try {<a name="line.108"></a>
<span class="sourceLineNo">109</span> *         List&amp;lt;CommandLine&amp;gt; parsedCommands = new CommandLine(encrypt).parse(args);<a name="line.109"></a>
<span class="sourceLineNo">110</span> *         if (!CommandLine.printHelpIfRequested(parsedCommands, System.err, Help.Ansi.AUTO)) {<a name="line.110"></a>
<span class="sourceLineNo">111</span> *             runProgram(encrypt);<a name="line.111"></a>
<span class="sourceLineNo">112</span> *         }<a name="line.112"></a>
<span class="sourceLineNo">113</span> *     } catch (ParameterException ex) { // command line arguments could not be parsed<a name="line.113"></a>
<span class="sourceLineNo">114</span> *         System.err.println(ex.getMessage());<a name="line.114"></a>
<span class="sourceLineNo">115</span> *         ex.getCommandLine().usage(System.err);<a name="line.115"></a>
<span class="sourceLineNo">116</span> *     }<a name="line.116"></a>
<span class="sourceLineNo">117</span> * }<a name="line.117"></a>
<span class="sourceLineNo">118</span> * &lt;/pre&gt;&lt;p&gt;<a name="line.118"></a>
<span class="sourceLineNo">119</span> * Invoke the above program with some command line arguments. The below are all equivalent:<a name="line.119"></a>
<span class="sourceLineNo">120</span> * &lt;/p&gt;<a name="line.120"></a>
<span class="sourceLineNo">121</span> * &lt;pre&gt;<a name="line.121"></a>
<span class="sourceLineNo">122</span> * --verbose --out=outfile in1 in2<a name="line.122"></a>
<span class="sourceLineNo">123</span> * --verbose --out outfile in1 in2<a name="line.123"></a>
<span class="sourceLineNo">124</span> * -v --out=outfile in1 in2<a name="line.124"></a>
<span class="sourceLineNo">125</span> * -v -o outfile in1 in2<a name="line.125"></a>
<span class="sourceLineNo">126</span> * -v -o=outfile in1 in2<a name="line.126"></a>
<span class="sourceLineNo">127</span> * -vo outfile in1 in2<a name="line.127"></a>
<span class="sourceLineNo">128</span> * -vo=outfile in1 in2<a name="line.128"></a>
<span class="sourceLineNo">129</span> * -v -ooutfile in1 in2<a name="line.129"></a>
<span class="sourceLineNo">130</span> * -vooutfile in1 in2<a name="line.130"></a>
<span class="sourceLineNo">131</span> * &lt;/pre&gt;<a name="line.131"></a>
<span class="sourceLineNo">132</span> */<a name="line.132"></a>
<span class="sourceLineNo">133</span>public class CommandLine {<a name="line.133"></a>
<span class="sourceLineNo">134</span>    /** This is picocli version {@value}. */<a name="line.134"></a>
<span class="sourceLineNo">135</span>    public static final String VERSION = "2.0.3";<a name="line.135"></a>
<span class="sourceLineNo">136</span><a name="line.136"></a>
<span class="sourceLineNo">137</span>    private final Tracer tracer = new Tracer();<a name="line.137"></a>
<span class="sourceLineNo">138</span>    private final Interpreter interpreter;<a name="line.138"></a>
<span class="sourceLineNo">139</span>    private String commandName = Help.DEFAULT_COMMAND_NAME;<a name="line.139"></a>
<span class="sourceLineNo">140</span>    private boolean overwrittenOptionsAllowed = false;<a name="line.140"></a>
<span class="sourceLineNo">141</span>    private boolean unmatchedArgumentsAllowed = false;<a name="line.141"></a>
<span class="sourceLineNo">142</span>    private final List&lt;String&gt; unmatchedArguments = new ArrayList&lt;String&gt;();<a name="line.142"></a>
<span class="sourceLineNo">143</span>    private CommandLine parent;<a name="line.143"></a>
<span class="sourceLineNo">144</span>    private boolean usageHelpRequested;<a name="line.144"></a>
<span class="sourceLineNo">145</span>    private boolean versionHelpRequested;<a name="line.145"></a>
<span class="sourceLineNo">146</span>    private final List&lt;String&gt; versionLines = new ArrayList&lt;String&gt;();<a name="line.146"></a>
<span class="sourceLineNo">147</span><a name="line.147"></a>
<span class="sourceLineNo">148</span>    /**<a name="line.148"></a>
<span class="sourceLineNo">149</span>     * Constructs a new {@code CommandLine} interpreter with the specified annotated object.<a name="line.149"></a>
<span class="sourceLineNo">150</span>     * When the {@link #parse(String...)} method is called, fields of the specified object that are annotated<a name="line.150"></a>
<span class="sourceLineNo">151</span>     * with {@code @Option} or {@code @Parameters} will be initialized based on command line arguments.<a name="line.151"></a>
<span class="sourceLineNo">152</span>     * @param command the object to initialize from the command line arguments<a name="line.152"></a>
<span class="sourceLineNo">153</span>     * @throws InitializationException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.153"></a>
<span class="sourceLineNo">154</span>     */<a name="line.154"></a>
<span class="sourceLineNo">155</span>    public CommandLine(final Object command) {<a name="line.155"></a>
<span class="sourceLineNo">156</span>        interpreter = new Interpreter(command);<a name="line.156"></a>
<span class="sourceLineNo">157</span>    }<a name="line.157"></a>
<span class="sourceLineNo">158</span><a name="line.158"></a>
<span class="sourceLineNo">159</span>    /** Registers a subcommand with the specified name. For example:<a name="line.159"></a>
<span class="sourceLineNo">160</span>     * &lt;pre&gt;<a name="line.160"></a>
<span class="sourceLineNo">161</span>     * CommandLine commandLine = new CommandLine(new Git())<a name="line.161"></a>
<span class="sourceLineNo">162</span>     *         .addSubcommand("status",   new GitStatus())<a name="line.162"></a>
<span class="sourceLineNo">163</span>     *         .addSubcommand("commit",   new GitCommit();<a name="line.163"></a>
<span class="sourceLineNo">164</span>     *         .addSubcommand("add",      new GitAdd())<a name="line.164"></a>
<span class="sourceLineNo">165</span>     *         .addSubcommand("branch",   new GitBranch())<a name="line.165"></a>
<span class="sourceLineNo">166</span>     *         .addSubcommand("checkout", new GitCheckout())<a name="line.166"></a>
<span class="sourceLineNo">167</span>     *         //...<a name="line.167"></a>
<span class="sourceLineNo">168</span>     *         ;<a name="line.168"></a>
<span class="sourceLineNo">169</span>     * &lt;/pre&gt;<a name="line.169"></a>
<span class="sourceLineNo">170</span>     *<a name="line.170"></a>
<span class="sourceLineNo">171</span>     * &lt;p&gt;The specified object can be an annotated object or a<a name="line.171"></a>
<span class="sourceLineNo">172</span>     * {@code CommandLine} instance with its own nested subcommands. For example:&lt;/p&gt;<a name="line.172"></a>
<span class="sourceLineNo">173</span>     * &lt;pre&gt;<a name="line.173"></a>
<span class="sourceLineNo">174</span>     * CommandLine commandLine = new CommandLine(new MainCommand())<a name="line.174"></a>
<span class="sourceLineNo">175</span>     *         .addSubcommand("cmd1",                 new ChildCommand1()) // subcommand<a name="line.175"></a>
<span class="sourceLineNo">176</span>     *         .addSubcommand("cmd2",                 new ChildCommand2())<a name="line.176"></a>
<span class="sourceLineNo">177</span>     *         .addSubcommand("cmd3", new CommandLine(new ChildCommand3()) // subcommand with nested sub-subcommands<a name="line.177"></a>
<span class="sourceLineNo">178</span>     *                 .addSubcommand("cmd3sub1",                 new GrandChild3Command1())<a name="line.178"></a>
<span class="sourceLineNo">179</span>     *                 .addSubcommand("cmd3sub2",                 new GrandChild3Command2())<a name="line.179"></a>
<span class="sourceLineNo">180</span>     *                 .addSubcommand("cmd3sub3", new CommandLine(new GrandChild3Command3()) // deeper nesting<a name="line.180"></a>
<span class="sourceLineNo">181</span>     *                         .addSubcommand("cmd3sub3sub1", new GreatGrandChild3Command3_1())<a name="line.181"></a>
<span class="sourceLineNo">182</span>     *                         .addSubcommand("cmd3sub3sub2", new GreatGrandChild3Command3_2())<a name="line.182"></a>
<span class="sourceLineNo">183</span>     *                 )<a name="line.183"></a>
<span class="sourceLineNo">184</span>     *         );<a name="line.184"></a>
<span class="sourceLineNo">185</span>     * &lt;/pre&gt;<a name="line.185"></a>
<span class="sourceLineNo">186</span>     * &lt;p&gt;The default type converters are available on all subcommands and nested sub-subcommands, but custom type<a name="line.186"></a>
<span class="sourceLineNo">187</span>     * converters are registered only with the subcommand hierarchy as it existed when the custom type was registered.<a name="line.187"></a>
<span class="sourceLineNo">188</span>     * To ensure a custom type converter is available to all subcommands, register the type converter last, after<a name="line.188"></a>
<span class="sourceLineNo">189</span>     * adding subcommands.&lt;/p&gt;<a name="line.189"></a>
<span class="sourceLineNo">190</span>     * &lt;p&gt;See also the {@link Command#subcommands()} annotation to register subcommands declaratively.&lt;/p&gt;<a name="line.190"></a>
<span class="sourceLineNo">191</span>     *<a name="line.191"></a>
<span class="sourceLineNo">192</span>     * @param name the string to recognize on the command line as a subcommand<a name="line.192"></a>
<span class="sourceLineNo">193</span>     * @param command the object to initialize with command line arguments following the subcommand name.<a name="line.193"></a>
<span class="sourceLineNo">194</span>     *          This may be a {@code CommandLine} instance with its own (nested) subcommands<a name="line.194"></a>
<span class="sourceLineNo">195</span>     * @return this CommandLine object, to allow method chaining<a name="line.195"></a>
<span class="sourceLineNo">196</span>     * @see #registerConverter(Class, ITypeConverter)<a name="line.196"></a>
<span class="sourceLineNo">197</span>     * @since 0.9.7<a name="line.197"></a>
<span class="sourceLineNo">198</span>     * @see Command#subcommands()<a name="line.198"></a>
<span class="sourceLineNo">199</span>     */<a name="line.199"></a>
<span class="sourceLineNo">200</span>    public CommandLine addSubcommand(final String name, final Object command) {<a name="line.200"></a>
<span class="sourceLineNo">201</span>        final CommandLine commandLine = toCommandLine(command);<a name="line.201"></a>
<span class="sourceLineNo">202</span>        commandLine.parent = this;<a name="line.202"></a>
<span class="sourceLineNo">203</span>        interpreter.commands.put(name, commandLine);<a name="line.203"></a>
<span class="sourceLineNo">204</span>        return this;<a name="line.204"></a>
<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
<span class="sourceLineNo">206</span>    /** Returns a map with the subcommands {@linkplain #addSubcommand(String, Object) registered} on this instance.<a name="line.206"></a>
<span class="sourceLineNo">207</span>     * @return a map with the registered subcommands<a name="line.207"></a>
<span class="sourceLineNo">208</span>     * @since 0.9.7<a name="line.208"></a>
<span class="sourceLineNo">209</span>     */<a name="line.209"></a>
<span class="sourceLineNo">210</span>    public Map&lt;String, CommandLine&gt; getSubcommands() {<a name="line.210"></a>
<span class="sourceLineNo">211</span>        return new LinkedHashMap&lt;String, CommandLine&gt;(interpreter.commands);<a name="line.211"></a>
<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
<span class="sourceLineNo">213</span>    /**<a name="line.213"></a>
<span class="sourceLineNo">214</span>     * Returns the command that this is a subcommand of, or {@code null} if this is a top-level command.<a name="line.214"></a>
<span class="sourceLineNo">215</span>     * @return the command that this is a subcommand of, or {@code null} if this is a top-level command<a name="line.215"></a>
<span class="sourceLineNo">216</span>     * @see #addSubcommand(String, Object)<a name="line.216"></a>
<span class="sourceLineNo">217</span>     * @see Command#subcommands()<a name="line.217"></a>
<span class="sourceLineNo">218</span>     * @since 0.9.8<a name="line.218"></a>
<span class="sourceLineNo">219</span>     */<a name="line.219"></a>
<span class="sourceLineNo">220</span>    public CommandLine getParent() {<a name="line.220"></a>
<span class="sourceLineNo">221</span>        return parent;<a name="line.221"></a>
<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
<span class="sourceLineNo">223</span><a name="line.223"></a>
<span class="sourceLineNo">224</span>    /** Returns the annotated object that this {@code CommandLine} instance was constructed with.<a name="line.224"></a>
<span class="sourceLineNo">225</span>     * @param &lt;T&gt; the type of the variable that the return value is being assigned to<a name="line.225"></a>
<span class="sourceLineNo">226</span>     * @return the annotated object that this {@code CommandLine} instance was constructed with<a name="line.226"></a>
<span class="sourceLineNo">227</span>     * @since 0.9.7<a name="line.227"></a>
<span class="sourceLineNo">228</span>     */<a name="line.228"></a>
<span class="sourceLineNo">229</span>    public &lt;T&gt; T getCommand() {<a name="line.229"></a>
<span class="sourceLineNo">230</span>        return (T) interpreter.command;<a name="line.230"></a>
<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
<span class="sourceLineNo">232</span><a name="line.232"></a>
<span class="sourceLineNo">233</span>    /** Returns {@code true} if an option annotated with {@link Option#usageHelp()} was specified on the command line.<a name="line.233"></a>
<span class="sourceLineNo">234</span>     * @return whether the parser encountered an option annotated with {@link Option#usageHelp()}.<a name="line.234"></a>
<span class="sourceLineNo">235</span>     * @since 0.9.8 */<a name="line.235"></a>
<span class="sourceLineNo">236</span>    public boolean isUsageHelpRequested() { return usageHelpRequested; }<a name="line.236"></a>
<span class="sourceLineNo">237</span><a name="line.237"></a>
<span class="sourceLineNo">238</span>    /** Returns {@code true} if an option annotated with {@link Option#versionHelp()} was specified on the command line.<a name="line.238"></a>
<span class="sourceLineNo">239</span>     * @return whether the parser encountered an option annotated with {@link Option#versionHelp()}.<a name="line.239"></a>
<span class="sourceLineNo">240</span>     * @since 0.9.8 */<a name="line.240"></a>
<span class="sourceLineNo">241</span>    public boolean isVersionHelpRequested() { return versionHelpRequested; }<a name="line.241"></a>
<span class="sourceLineNo">242</span><a name="line.242"></a>
<span class="sourceLineNo">243</span>    /** Returns whether options for single-value fields can be specified multiple times on the command line.<a name="line.243"></a>
<span class="sourceLineNo">244</span>     * The default is {@code false} and a {@link OverwrittenOptionException} is thrown if this happens.<a name="line.244"></a>
<span class="sourceLineNo">245</span>     * When {@code true}, the last specified value is retained.<a name="line.245"></a>
<span class="sourceLineNo">246</span>     * @return {@code true} if options for single-value fields can be specified multiple times on the command line, {@code false} otherwise<a name="line.246"></a>
<span class="sourceLineNo">247</span>     * @since 0.9.7<a name="line.247"></a>
<span class="sourceLineNo">248</span>     */<a name="line.248"></a>
<span class="sourceLineNo">249</span>    public boolean isOverwrittenOptionsAllowed() {<a name="line.249"></a>
<span class="sourceLineNo">250</span>        return overwrittenOptionsAllowed;<a name="line.250"></a>
<span class="sourceLineNo">251</span>    }<a name="line.251"></a>
<span class="sourceLineNo">252</span><a name="line.252"></a>
<span class="sourceLineNo">253</span>    /** Sets whether options for single-value fields can be specified multiple times on the command line without a {@link OverwrittenOptionException} being thrown.<a name="line.253"></a>
<span class="sourceLineNo">254</span>     * &lt;p&gt;The specified setting will be registered with this {@code CommandLine} and the full hierarchy of its<a name="line.254"></a>
<span class="sourceLineNo">255</span>     * subcommands and nested sub-subcommands &lt;em&gt;at the moment this method is called&lt;/em&gt;. Subcommands added<a name="line.255"></a>
<span class="sourceLineNo">256</span>     * later will have the default setting. To ensure a setting is applied to all<a name="line.256"></a>
<span class="sourceLineNo">257</span>     * subcommands, call the setter last, after adding subcommands.&lt;/p&gt;<a name="line.257"></a>
<span class="sourceLineNo">258</span>     * @param newValue the new setting<a name="line.258"></a>
<span class="sourceLineNo">259</span>     * @return this {@code CommandLine} object, to allow method chaining<a name="line.259"></a>
<span class="sourceLineNo">260</span>     * @since 0.9.7<a name="line.260"></a>
<span class="sourceLineNo">261</span>     */<a name="line.261"></a>
<span class="sourceLineNo">262</span>    public CommandLine setOverwrittenOptionsAllowed(final boolean newValue) {<a name="line.262"></a>
<span class="sourceLineNo">263</span>        this.overwrittenOptionsAllowed = newValue;<a name="line.263"></a>
<span class="sourceLineNo">264</span>        for (final CommandLine command : interpreter.commands.values()) {<a name="line.264"></a>
<span class="sourceLineNo">265</span>            command.setOverwrittenOptionsAllowed(newValue);<a name="line.265"></a>
<span class="sourceLineNo">266</span>        }<a name="line.266"></a>
<span class="sourceLineNo">267</span>        return this;<a name="line.267"></a>
<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
<span class="sourceLineNo">269</span><a name="line.269"></a>
<span class="sourceLineNo">270</span>    /** Returns whether the end user may specify arguments on the command line that are not matched to any option or parameter fields.<a name="line.270"></a>
<span class="sourceLineNo">271</span>     * The default is {@code false} and a {@link UnmatchedArgumentException} is thrown if this happens.<a name="line.271"></a>
<span class="sourceLineNo">272</span>     * When {@code true}, the last unmatched arguments are available via the {@link #getUnmatchedArguments()} method.<a name="line.272"></a>
<span class="sourceLineNo">273</span>     * @return {@code true} if the end use may specify unmatched arguments on the command line, {@code false} otherwise<a name="line.273"></a>
<span class="sourceLineNo">274</span>     * @see #getUnmatchedArguments()<a name="line.274"></a>
<span class="sourceLineNo">275</span>     * @since 0.9.7<a name="line.275"></a>
<span class="sourceLineNo">276</span>     */<a name="line.276"></a>
<span class="sourceLineNo">277</span>    public boolean isUnmatchedArgumentsAllowed() {<a name="line.277"></a>
<span class="sourceLineNo">278</span>        return unmatchedArgumentsAllowed;<a name="line.278"></a>
<span class="sourceLineNo">279</span>    }<a name="line.279"></a>
<span class="sourceLineNo">280</span><a name="line.280"></a>
<span class="sourceLineNo">281</span>    /** Sets whether the end user may specify unmatched arguments on the command line without a {@link UnmatchedArgumentException} being thrown.<a name="line.281"></a>
<span class="sourceLineNo">282</span>     * &lt;p&gt;The specified setting will be registered with this {@code CommandLine} and the full hierarchy of its<a name="line.282"></a>
<span class="sourceLineNo">283</span>     * subcommands and nested sub-subcommands &lt;em&gt;at the moment this method is called&lt;/em&gt;. Subcommands added<a name="line.283"></a>
<span class="sourceLineNo">284</span>     * later will have the default setting. To ensure a setting is applied to all<a name="line.284"></a>
<span class="sourceLineNo">285</span>     * subcommands, call the setter last, after adding subcommands.&lt;/p&gt;<a name="line.285"></a>
<span class="sourceLineNo">286</span>     * @param newValue the new setting. When {@code true}, the last unmatched arguments are available via the {@link #getUnmatchedArguments()} method.<a name="line.286"></a>
<span class="sourceLineNo">287</span>     * @return this {@code CommandLine} object, to allow method chaining<a name="line.287"></a>
<span class="sourceLineNo">288</span>     * @since 0.9.7<a name="line.288"></a>
<span class="sourceLineNo">289</span>     * @see #getUnmatchedArguments()<a name="line.289"></a>
<span class="sourceLineNo">290</span>     */<a name="line.290"></a>
<span class="sourceLineNo">291</span>    public CommandLine setUnmatchedArgumentsAllowed(final boolean newValue) {<a name="line.291"></a>
<span class="sourceLineNo">292</span>        this.unmatchedArgumentsAllowed = newValue;<a name="line.292"></a>
<span class="sourceLineNo">293</span>        for (final CommandLine command : interpreter.commands.values()) {<a name="line.293"></a>
<span class="sourceLineNo">294</span>            command.setUnmatchedArgumentsAllowed(newValue);<a name="line.294"></a>
<span class="sourceLineNo">295</span>        }<a name="line.295"></a>
<span class="sourceLineNo">296</span>        return this;<a name="line.296"></a>
<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
<span class="sourceLineNo">298</span><a name="line.298"></a>
<span class="sourceLineNo">299</span>    /** Returns the list of unmatched command line arguments, if any.<a name="line.299"></a>
<span class="sourceLineNo">300</span>     * @return the list of unmatched command line arguments or an empty list<a name="line.300"></a>
<span class="sourceLineNo">301</span>     * @see #isUnmatchedArgumentsAllowed()<a name="line.301"></a>
<span class="sourceLineNo">302</span>     * @since 0.9.7<a name="line.302"></a>
<span class="sourceLineNo">303</span>     */<a name="line.303"></a>
<span class="sourceLineNo">304</span>    public List&lt;String&gt; getUnmatchedArguments() {<a name="line.304"></a>
<span class="sourceLineNo">305</span>        return unmatchedArguments;<a name="line.305"></a>
<span class="sourceLineNo">306</span>    }<a name="line.306"></a>
<span class="sourceLineNo">307</span><a name="line.307"></a>
<span class="sourceLineNo">308</span>    /**<a name="line.308"></a>
<span class="sourceLineNo">309</span>     * &lt;p&gt;<a name="line.309"></a>
<span class="sourceLineNo">310</span>     * Convenience method that initializes the specified annotated object from the specified command line arguments.<a name="line.310"></a>
<span class="sourceLineNo">311</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.311"></a>
<span class="sourceLineNo">312</span>     * This is equivalent to<a name="line.312"></a>
<span class="sourceLineNo">313</span>     * &lt;/p&gt;&lt;pre&gt;<a name="line.313"></a>
<span class="sourceLineNo">314</span>     * CommandLine cli = new CommandLine(command);<a name="line.314"></a>
<span class="sourceLineNo">315</span>     * cli.parse(args);<a name="line.315"></a>
<span class="sourceLineNo">316</span>     * return command;<a name="line.316"></a>
<span class="sourceLineNo">317</span>     * &lt;/pre&gt;<a name="line.317"></a>
<span class="sourceLineNo">318</span>     *<a name="line.318"></a>
<span class="sourceLineNo">319</span>     * @param command the object to initialize. This object contains fields annotated with<a name="line.319"></a>
<span class="sourceLineNo">320</span>     *          {@code @Option} or {@code @Parameters}.<a name="line.320"></a>
<span class="sourceLineNo">321</span>     * @param args the command line arguments to parse<a name="line.321"></a>
<span class="sourceLineNo">322</span>     * @param &lt;T&gt; the type of the annotated object<a name="line.322"></a>
<span class="sourceLineNo">323</span>     * @return the specified annotated object<a name="line.323"></a>
<span class="sourceLineNo">324</span>     * @throws InitializationException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.324"></a>
<span class="sourceLineNo">325</span>     * @throws ParameterException if the specified command line arguments are invalid<a name="line.325"></a>
<span class="sourceLineNo">326</span>     * @since 0.9.7<a name="line.326"></a>
<span class="sourceLineNo">327</span>     */<a name="line.327"></a>
<span class="sourceLineNo">328</span>    public static &lt;T&gt; T populateCommand(final T command, final String... args) {<a name="line.328"></a>
<span class="sourceLineNo">329</span>        final CommandLine cli = toCommandLine(command);<a name="line.329"></a>
<span class="sourceLineNo">330</span>        cli.parse(args);<a name="line.330"></a>
<span class="sourceLineNo">331</span>        return command;<a name="line.331"></a>
<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
<span class="sourceLineNo">333</span><a name="line.333"></a>
<span class="sourceLineNo">334</span>    /** Parses the specified command line arguments and returns a list of {@code CommandLine} objects representing the<a name="line.334"></a>
<span class="sourceLineNo">335</span>     * top-level command and any subcommands (if any) that were recognized and initialized during the parsing process.<a name="line.335"></a>
<span class="sourceLineNo">336</span>     * &lt;p&gt;<a name="line.336"></a>
<span class="sourceLineNo">337</span>     * If parsing succeeds, the first element in the returned list is always {@code this CommandLine} object. The<a name="line.337"></a>
<span class="sourceLineNo">338</span>     * returned list may contain more elements if subcommands were {@linkplain #addSubcommand(String, Object) registered}<a name="line.338"></a>
<span class="sourceLineNo">339</span>     * and these subcommands were initialized by matching command line arguments. If parsing fails, a<a name="line.339"></a>
<span class="sourceLineNo">340</span>     * {@link ParameterException} is thrown.<a name="line.340"></a>
<span class="sourceLineNo">341</span>     * &lt;/p&gt;<a name="line.341"></a>
<span class="sourceLineNo">342</span>     *<a name="line.342"></a>
<span class="sourceLineNo">343</span>     * @param args the command line arguments to parse<a name="line.343"></a>
<span class="sourceLineNo">344</span>     * @return a list with the top-level command and any subcommands initialized by this method<a name="line.344"></a>
<span class="sourceLineNo">345</span>     * @throws ParameterException if the specified command line arguments are invalid; use<a name="line.345"></a>
<span class="sourceLineNo">346</span>     *      {@link ParameterException#getCommandLine()} to get the command or subcommand whose user input was invalid<a name="line.346"></a>
<span class="sourceLineNo">347</span>     */<a name="line.347"></a>
<span class="sourceLineNo">348</span>    public List&lt;CommandLine&gt; parse(final String... args) {<a name="line.348"></a>
<span class="sourceLineNo">349</span>        return interpreter.parse(args);<a name="line.349"></a>
<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
<span class="sourceLineNo">351</span>    /**<a name="line.351"></a>
<span class="sourceLineNo">352</span>     * Represents a function that can process a List of {@code CommandLine} objects resulting from successfully<a name="line.352"></a>
<span class="sourceLineNo">353</span>     * {@linkplain #parse(String...) parsing} the command line arguments. This is a<a name="line.353"></a>
<span class="sourceLineNo">354</span>     * &lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html"&gt;functional interface&lt;/a&gt;<a name="line.354"></a>
<span class="sourceLineNo">355</span>     * whose functional method is {@link #handleParseResult(List, PrintStream, CommandLine.Help.Ansi)}.<a name="line.355"></a>
<span class="sourceLineNo">356</span>     * &lt;p&gt;<a name="line.356"></a>
<span class="sourceLineNo">357</span>     * Implementations of this functions can be passed to the {@link #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...) CommandLine::parseWithHandler}<a name="line.357"></a>
<span class="sourceLineNo">358</span>     * methods to take some next step after the command line was successfully parsed.<a name="line.358"></a>
<span class="sourceLineNo">359</span>     * &lt;/p&gt;<a name="line.359"></a>
<span class="sourceLineNo">360</span>     * @see RunFirst<a name="line.360"></a>
<span class="sourceLineNo">361</span>     * @see RunLast<a name="line.361"></a>
<span class="sourceLineNo">362</span>     * @see RunAll<a name="line.362"></a>
<span class="sourceLineNo">363</span>     * @since 2.0 */<a name="line.363"></a>
<span class="sourceLineNo">364</span>    public static interface IParseResultHandler {<a name="line.364"></a>
<span class="sourceLineNo">365</span>        /** Processes a List of {@code CommandLine} objects resulting from successfully<a name="line.365"></a>
<span class="sourceLineNo">366</span>         * {@linkplain #parse(String...) parsing} the command line arguments and optionally returns a list of results.<a name="line.366"></a>
<span class="sourceLineNo">367</span>         * @param parsedCommands the {@code CommandLine} objects that resulted from successfully parsing the command line arguments<a name="line.367"></a>
<span class="sourceLineNo">368</span>         * @param out the {@code PrintStream} to print help to if requested<a name="line.368"></a>
<span class="sourceLineNo">369</span>         * @param ansi for printing help messages using ANSI styles and colors<a name="line.369"></a>
<span class="sourceLineNo">370</span>         * @return a list of results, or an empty list if there are no results<a name="line.370"></a>
<span class="sourceLineNo">371</span>         * @throws ExecutionException if a problem occurred while processing the parse results; use<a name="line.371"></a>
<span class="sourceLineNo">372</span>         *      {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed<a name="line.372"></a>
<span class="sourceLineNo">373</span>         */<a name="line.373"></a>
<span class="sourceLineNo">374</span>        List&lt;Object&gt; handleParseResult(List&lt;CommandLine&gt; parsedCommands, PrintStream out, Help.Ansi ansi) throws ExecutionException;<a name="line.374"></a>
<span class="sourceLineNo">375</span>    }<a name="line.375"></a>
<span class="sourceLineNo">376</span>    /**<a name="line.376"></a>
<span class="sourceLineNo">377</span>     * Represents a function that can handle a {@code ParameterException} that occurred while<a name="line.377"></a>
<span class="sourceLineNo">378</span>     * {@linkplain #parse(String...) parsing} the command line arguments. This is a<a name="line.378"></a>
<span class="sourceLineNo">379</span>     * &lt;a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html"&gt;functional interface&lt;/a&gt;<a name="line.379"></a>
<span class="sourceLineNo">380</span>     * whose functional method is {@link #handleException(CommandLine.ParameterException, PrintStream, CommandLine.Help.Ansi, String...)}.<a name="line.380"></a>
<span class="sourceLineNo">381</span>     * &lt;p&gt;<a name="line.381"></a>
<span class="sourceLineNo">382</span>     * Implementations of this functions can be passed to the {@link #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...) CommandLine::parseWithHandler}<a name="line.382"></a>
<span class="sourceLineNo">383</span>     * methods to handle situations when the command line could not be parsed.<a name="line.383"></a>
<span class="sourceLineNo">384</span>     * &lt;/p&gt;<a name="line.384"></a>
<span class="sourceLineNo">385</span>     * @see DefaultExceptionHandler<a name="line.385"></a>
<span class="sourceLineNo">386</span>     * @since 2.0 */<a name="line.386"></a>
<span class="sourceLineNo">387</span>    public static interface IExceptionHandler {<a name="line.387"></a>
<span class="sourceLineNo">388</span>        /** Handles a {@code ParameterException} that occurred while {@linkplain #parse(String...) parsing} the command<a name="line.388"></a>
<span class="sourceLineNo">389</span>         * line arguments and optionally returns a list of results.<a name="line.389"></a>
<span class="sourceLineNo">390</span>         * @param ex the ParameterException describing the problem that occurred while parsing the command line arguments,<a name="line.390"></a>
<span class="sourceLineNo">391</span>         *           and the CommandLine representing the command or subcommand whose input was invalid<a name="line.391"></a>
<span class="sourceLineNo">392</span>         * @param out the {@code PrintStream} to print help to if requested<a name="line.392"></a>
<span class="sourceLineNo">393</span>         * @param ansi for printing help messages using ANSI styles and colors<a name="line.393"></a>
<span class="sourceLineNo">394</span>         * @param args the command line arguments that could not be parsed<a name="line.394"></a>
<span class="sourceLineNo">395</span>         * @return a list of results, or an empty list if there are no results<a name="line.395"></a>
<span class="sourceLineNo">396</span>         */<a name="line.396"></a>
<span class="sourceLineNo">397</span>        List&lt;Object&gt; handleException(ParameterException ex, PrintStream out, Help.Ansi ansi, String... args);<a name="line.397"></a>
<span class="sourceLineNo">398</span>    }<a name="line.398"></a>
<span class="sourceLineNo">399</span>    /**<a name="line.399"></a>
<span class="sourceLineNo">400</span>     * Default exception handler that prints the exception message to the specified {@code PrintStream}, followed by the<a name="line.400"></a>
<span class="sourceLineNo">401</span>     * usage message for the command or subcommand whose input was invalid.<a name="line.401"></a>
<span class="sourceLineNo">402</span>     * &lt;p&gt;Implementation roughly looks like this:&lt;/p&gt;<a name="line.402"></a>
<span class="sourceLineNo">403</span>     * &lt;pre&gt;<a name="line.403"></a>
<span class="sourceLineNo">404</span>     *     System.err.println(paramException.getMessage());<a name="line.404"></a>
<span class="sourceLineNo">405</span>     *     paramException.getCommandLine().usage(System.err);<a name="line.405"></a>
<span class="sourceLineNo">406</span>     * &lt;/pre&gt;<a name="line.406"></a>
<span class="sourceLineNo">407</span>     * @since 2.0 */<a name="line.407"></a>
<span class="sourceLineNo">408</span>    public static class DefaultExceptionHandler implements IExceptionHandler {<a name="line.408"></a>
<span class="sourceLineNo">409</span>        @Override<a name="line.409"></a>
<span class="sourceLineNo">410</span>        public List&lt;Object&gt; handleException(final ParameterException ex, final PrintStream out, final Help.Ansi ansi, final String... args) {<a name="line.410"></a>
<span class="sourceLineNo">411</span>            out.println(ex.getMessage());<a name="line.411"></a>
<span class="sourceLineNo">412</span>            ex.getCommandLine().usage(out, ansi);<a name="line.412"></a>
<span class="sourceLineNo">413</span>            return Collections.emptyList();<a name="line.413"></a>
<span class="sourceLineNo">414</span>        }<a name="line.414"></a>
<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
<span class="sourceLineNo">416</span>    /**<a name="line.416"></a>
<span class="sourceLineNo">417</span>     * Helper method that may be useful when processing the list of {@code CommandLine} objects that result from successfully<a name="line.417"></a>
<span class="sourceLineNo">418</span>     * {@linkplain #parse(String...) parsing} command line arguments. This method prints out<a name="line.418"></a>
<span class="sourceLineNo">419</span>     * {@linkplain #usage(PrintStream, Help.Ansi) usage help} if {@linkplain #isUsageHelpRequested() requested}<a name="line.419"></a>
<span class="sourceLineNo">420</span>     * or {@linkplain #printVersionHelp(PrintStream, Help.Ansi) version help} if {@linkplain #isVersionHelpRequested() requested}<a name="line.420"></a>
<span class="sourceLineNo">421</span>     * and returns {@code true}. Otherwise, if none of the specified {@code CommandLine} objects have help requested,<a name="line.421"></a>
<span class="sourceLineNo">422</span>     * this method returns {@code false}.<a name="line.422"></a>
<span class="sourceLineNo">423</span>     * &lt;p&gt;<a name="line.423"></a>
<span class="sourceLineNo">424</span>     * Note that this method &lt;em&gt;only&lt;/em&gt; looks at the {@link Option#usageHelp() usageHelp} and<a name="line.424"></a>
<span class="sourceLineNo">425</span>     * {@link Option#versionHelp() versionHelp} attributes. The {@link Option#help() help} attribute is ignored.<a name="line.425"></a>
<span class="sourceLineNo">426</span>     * &lt;/p&gt;<a name="line.426"></a>
<span class="sourceLineNo">427</span>     * @param parsedCommands the list of {@code CommandLine} objects to check if help was requested<a name="line.427"></a>
<span class="sourceLineNo">428</span>     * @param out the {@code PrintStream} to print help to if requested<a name="line.428"></a>
<span class="sourceLineNo">429</span>     * @param ansi for printing help messages using ANSI styles and colors<a name="line.429"></a>
<span class="sourceLineNo">430</span>     * @return {@code true} if help was printed, {@code false} otherwise<a name="line.430"></a>
<span class="sourceLineNo">431</span>     * @since 2.0 */<a name="line.431"></a>
<span class="sourceLineNo">432</span>    public static boolean printHelpIfRequested(final List&lt;CommandLine&gt; parsedCommands, final PrintStream out, final Help.Ansi ansi) {<a name="line.432"></a>
<span class="sourceLineNo">433</span>        for (final CommandLine parsed : parsedCommands) {<a name="line.433"></a>
<span class="sourceLineNo">434</span>            if (parsed.isUsageHelpRequested()) {<a name="line.434"></a>
<span class="sourceLineNo">435</span>                parsed.usage(out, ansi);<a name="line.435"></a>
<span class="sourceLineNo">436</span>                return true;<a name="line.436"></a>
<span class="sourceLineNo">437</span>            } else if (parsed.isVersionHelpRequested()) {<a name="line.437"></a>
<span class="sourceLineNo">438</span>                parsed.printVersionHelp(out, ansi);<a name="line.438"></a>
<span class="sourceLineNo">439</span>                return true;<a name="line.439"></a>
<span class="sourceLineNo">440</span>            }<a name="line.440"></a>
<span class="sourceLineNo">441</span>        }<a name="line.441"></a>
<span class="sourceLineNo">442</span>        return false;<a name="line.442"></a>
<span class="sourceLineNo">443</span>    }<a name="line.443"></a>
<span class="sourceLineNo">444</span>    private static Object execute(final CommandLine parsed) {<a name="line.444"></a>
<span class="sourceLineNo">445</span>        final Object command = parsed.getCommand();<a name="line.445"></a>
<span class="sourceLineNo">446</span>        if (command instanceof Runnable) {<a name="line.446"></a>
<span class="sourceLineNo">447</span>            try {<a name="line.447"></a>
<span class="sourceLineNo">448</span>                ((Runnable) command).run();<a name="line.448"></a>
<span class="sourceLineNo">449</span>                return null;<a name="line.449"></a>
<span class="sourceLineNo">450</span>            } catch (final Exception ex) {<a name="line.450"></a>
<span class="sourceLineNo">451</span>                throw new ExecutionException(parsed, "Error while running command (" + command + ")", ex);<a name="line.451"></a>
<span class="sourceLineNo">452</span>            }<a name="line.452"></a>
<span class="sourceLineNo">453</span>        } else if (command instanceof Callable) {<a name="line.453"></a>
<span class="sourceLineNo">454</span>            try {<a name="line.454"></a>
<span class="sourceLineNo">455</span>                return ((Callable&lt;Object&gt;) command).call();<a name="line.455"></a>
<span class="sourceLineNo">456</span>            } catch (final Exception ex) {<a name="line.456"></a>
<span class="sourceLineNo">457</span>                throw new ExecutionException(parsed, "Error while calling command (" + command + ")", ex);<a name="line.457"></a>
<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
<span class="sourceLineNo">459</span>        }<a name="line.459"></a>
<span class="sourceLineNo">460</span>        throw new ExecutionException(parsed, "Parsed command (" + command + ") is not Runnable or Callable");<a name="line.460"></a>
<span class="sourceLineNo">461</span>    }<a name="line.461"></a>
<span class="sourceLineNo">462</span>    /**<a name="line.462"></a>
<span class="sourceLineNo">463</span>     * Command line parse result handler that prints help if requested, and otherwise executes the top-level<a name="line.463"></a>
<span class="sourceLineNo">464</span>     * {@code Runnable} or {@code Callable} command.<a name="line.464"></a>
<span class="sourceLineNo">465</span>     * For use in the {@link #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...) parseWithHandler} methods.<a name="line.465"></a>
<span class="sourceLineNo">466</span>     * &lt;p&gt;<a name="line.466"></a>
<span class="sourceLineNo">467</span>     * From picocli v2.0, {@code RunFirst} is used to implement the {@link #run(Runnable, PrintStream, Help.Ansi, String...) run}<a name="line.467"></a>
<span class="sourceLineNo">468</span>     * and {@link #call(Callable, PrintStream, Help.Ansi, String...) call} convenience methods.<a name="line.468"></a>
<span class="sourceLineNo">469</span>     * &lt;/p&gt;<a name="line.469"></a>
<span class="sourceLineNo">470</span>     * @since 2.0 */<a name="line.470"></a>
<span class="sourceLineNo">471</span>    public static class RunFirst implements IParseResultHandler {<a name="line.471"></a>
<span class="sourceLineNo">472</span>        /** Prints help if requested, and otherwise executes the top-level {@code Runnable} or {@code Callable} command.<a name="line.472"></a>
<span class="sourceLineNo">473</span>         * If the top-level command does not implement either {@code Runnable} or {@code Callable}, a {@code ExecutionException}<a name="line.473"></a>
<span class="sourceLineNo">474</span>         * is thrown detailing the problem and capturing the offending {@code CommandLine} object.<a name="line.474"></a>
<span class="sourceLineNo">475</span>         *<a name="line.475"></a>
<span class="sourceLineNo">476</span>         * @param parsedCommands the {@code CommandLine} objects that resulted from successfully parsing the command line arguments<a name="line.476"></a>
<span class="sourceLineNo">477</span>         * @param out the {@code PrintStream} to print help to if requested<a name="line.477"></a>
<span class="sourceLineNo">478</span>         * @param ansi for printing help messages using ANSI styles and colors<a name="line.478"></a>
<span class="sourceLineNo">479</span>         * @return an empty list if help was requested, or a list containing a single element: the result of calling the<a name="line.479"></a>
<span class="sourceLineNo">480</span>         *      {@code Callable}, or a {@code null} element if the top-level command was a {@code Runnable}<a name="line.480"></a>
<span class="sourceLineNo">481</span>         * @throws ExecutionException if a problem occurred while processing the parse results; use<a name="line.481"></a>
<span class="sourceLineNo">482</span>         *      {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed<a name="line.482"></a>
<span class="sourceLineNo">483</span>         */<a name="line.483"></a>
<span class="sourceLineNo">484</span>        @Override<a name="line.484"></a>
<span class="sourceLineNo">485</span>        public List&lt;Object&gt; handleParseResult(final List&lt;CommandLine&gt; parsedCommands, final PrintStream out, final Help.Ansi ansi) {<a name="line.485"></a>
<span class="sourceLineNo">486</span>            if (printHelpIfRequested(parsedCommands, out, ansi)) { return Collections.emptyList(); }<a name="line.486"></a>
<span class="sourceLineNo">487</span>            return Arrays.asList(execute(parsedCommands.get(0)));<a name="line.487"></a>
<span class="sourceLineNo">488</span>        }<a name="line.488"></a>
<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
<span class="sourceLineNo">490</span>    /**<a name="line.490"></a>
<span class="sourceLineNo">491</span>     * Command line parse result handler that prints help if requested, and otherwise executes the most specific<a name="line.491"></a>
<span class="sourceLineNo">492</span>     * {@code Runnable} or {@code Callable} subcommand.<a name="line.492"></a>
<span class="sourceLineNo">493</span>     * For use in the {@link #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...) parseWithHandler} methods.<a name="line.493"></a>
<span class="sourceLineNo">494</span>     * &lt;p&gt;<a name="line.494"></a>
<span class="sourceLineNo">495</span>     * Something like this:&lt;/p&gt;<a name="line.495"></a>
<span class="sourceLineNo">496</span>     * &lt;pre&gt;<a name="line.496"></a>
<span class="sourceLineNo">497</span>     *     // RunLast implementation: print help if requested, otherwise execute the most specific subcommand<a name="line.497"></a>
<span class="sourceLineNo">498</span>     *     if (CommandLine.printHelpIfRequested(parsedCommands, System.err, Help.Ansi.AUTO)) {<a name="line.498"></a>
<span class="sourceLineNo">499</span>     *         return emptyList();<a name="line.499"></a>
<span class="sourceLineNo">500</span>     *     }<a name="line.500"></a>
<span class="sourceLineNo">501</span>     *     CommandLine last = parsedCommands.get(parsedCommands.size() - 1);<a name="line.501"></a>
<span class="sourceLineNo">502</span>     *     Object command = last.getCommand();<a name="line.502"></a>
<span class="sourceLineNo">503</span>     *     if (command instanceof Runnable) {<a name="line.503"></a>
<span class="sourceLineNo">504</span>     *         try {<a name="line.504"></a>
<span class="sourceLineNo">505</span>     *             ((Runnable) command).run();<a name="line.505"></a>
<span class="sourceLineNo">506</span>     *         } catch (Exception ex) {<a name="line.506"></a>
<span class="sourceLineNo">507</span>     *             throw new ExecutionException(last, "Error in runnable " + command, ex);<a name="line.507"></a>
<span class="sourceLineNo">508</span>     *         }<a name="line.508"></a>
<span class="sourceLineNo">509</span>     *     } else if (command instanceof Callable) {<a name="line.509"></a>
<span class="sourceLineNo">510</span>     *         Object result;<a name="line.510"></a>
<span class="sourceLineNo">511</span>     *         try {<a name="line.511"></a>
<span class="sourceLineNo">512</span>     *             result = ((Callable) command).call();<a name="line.512"></a>
<span class="sourceLineNo">513</span>     *         } catch (Exception ex) {<a name="line.513"></a>
<span class="sourceLineNo">514</span>     *             throw new ExecutionException(last, "Error in callable " + command, ex);<a name="line.514"></a>
<span class="sourceLineNo">515</span>     *         }<a name="line.515"></a>
<span class="sourceLineNo">516</span>     *         // ...do something with result<a name="line.516"></a>
<span class="sourceLineNo">517</span>     *     } else {<a name="line.517"></a>
<span class="sourceLineNo">518</span>     *         throw new ExecutionException(last, "Parsed command (" + command + ") is not Runnable or Callable");<a name="line.518"></a>
<span class="sourceLineNo">519</span>     *     }<a name="line.519"></a>
<span class="sourceLineNo">520</span>     * &lt;/pre&gt;<a name="line.520"></a>
<span class="sourceLineNo">521</span>     * @since 2.0 */<a name="line.521"></a>
<span class="sourceLineNo">522</span>    public static class RunLast implements IParseResultHandler {<a name="line.522"></a>
<span class="sourceLineNo">523</span>        /** Prints help if requested, and otherwise executes the most specific {@code Runnable} or {@code Callable} subcommand.<a name="line.523"></a>
<span class="sourceLineNo">524</span>         * If the last (sub)command does not implement either {@code Runnable} or {@code Callable}, a {@code ExecutionException}<a name="line.524"></a>
<span class="sourceLineNo">525</span>         * is thrown detailing the problem and capturing the offending {@code CommandLine} object.<a name="line.525"></a>
<span class="sourceLineNo">526</span>         *<a name="line.526"></a>
<span class="sourceLineNo">527</span>         * @param parsedCommands the {@code CommandLine} objects that resulted from successfully parsing the command line arguments<a name="line.527"></a>
<span class="sourceLineNo">528</span>         * @param out the {@code PrintStream} to print help to if requested<a name="line.528"></a>
<span class="sourceLineNo">529</span>         * @param ansi for printing help messages using ANSI styles and colors<a name="line.529"></a>
<span class="sourceLineNo">530</span>         * @return an empty list if help was requested, or a list containing a single element: the result of calling the<a name="line.530"></a>
<span class="sourceLineNo">531</span>         *      {@code Callable}, or a {@code null} element if the last (sub)command was a {@code Runnable}<a name="line.531"></a>
<span class="sourceLineNo">532</span>         * @throws ExecutionException if a problem occurred while processing the parse results; use<a name="line.532"></a>
<span class="sourceLineNo">533</span>         *      {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed<a name="line.533"></a>
<span class="sourceLineNo">534</span>         */<a name="line.534"></a>
<span class="sourceLineNo">535</span>        @Override<a name="line.535"></a>
<span class="sourceLineNo">536</span>        public List&lt;Object&gt; handleParseResult(final List&lt;CommandLine&gt; parsedCommands, final PrintStream out, final Help.Ansi ansi) {<a name="line.536"></a>
<span class="sourceLineNo">537</span>            if (printHelpIfRequested(parsedCommands, out, ansi)) { return Collections.emptyList(); }<a name="line.537"></a>
<span class="sourceLineNo">538</span>            final CommandLine last = parsedCommands.get(parsedCommands.size() - 1);<a name="line.538"></a>
<span class="sourceLineNo">539</span>            return Arrays.asList(execute(last));<a name="line.539"></a>
<span class="sourceLineNo">540</span>        }<a name="line.540"></a>
<span class="sourceLineNo">541</span>    }<a name="line.541"></a>
<span class="sourceLineNo">542</span>    /**<a name="line.542"></a>
<span class="sourceLineNo">543</span>     * Command line parse result handler that prints help if requested, and otherwise executes the top-level command and<a name="line.543"></a>
<span class="sourceLineNo">544</span>     * all subcommands as {@code Runnable} or {@code Callable}.<a name="line.544"></a>
<span class="sourceLineNo">545</span>     * For use in the {@link #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...) parseWithHandler} methods.<a name="line.545"></a>
<span class="sourceLineNo">546</span>     * @since 2.0 */<a name="line.546"></a>
<span class="sourceLineNo">547</span>    public static class RunAll implements IParseResultHandler {<a name="line.547"></a>
<span class="sourceLineNo">548</span>        /** Prints help if requested, and otherwise executes the top-level command and all subcommands as {@code Runnable}<a name="line.548"></a>
<span class="sourceLineNo">549</span>         * or {@code Callable}. If any of the {@code CommandLine} commands does not implement either<a name="line.549"></a>
<span class="sourceLineNo">550</span>         * {@code Runnable} or {@code Callable}, a {@code ExecutionException}<a name="line.550"></a>
<span class="sourceLineNo">551</span>         * is thrown detailing the problem and capturing the offending {@code CommandLine} object.<a name="line.551"></a>
<span class="sourceLineNo">552</span>         *<a name="line.552"></a>
<span class="sourceLineNo">553</span>         * @param parsedCommands the {@code CommandLine} objects that resulted from successfully parsing the command line arguments<a name="line.553"></a>
<span class="sourceLineNo">554</span>         * @param out the {@code PrintStream} to print help to if requested<a name="line.554"></a>
<span class="sourceLineNo">555</span>         * @param ansi for printing help messages using ANSI styles and colors<a name="line.555"></a>
<span class="sourceLineNo">556</span>         * @return an empty list if help was requested, or a list containing the result of executing all commands:<a name="line.556"></a>
<span class="sourceLineNo">557</span>         *      the return values from calling the {@code Callable} commands, {@code null} elements for commands that implement {@code Runnable}<a name="line.557"></a>
<span class="sourceLineNo">558</span>         * @throws ExecutionException if a problem occurred while processing the parse results; use<a name="line.558"></a>
<span class="sourceLineNo">559</span>         *      {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed<a name="line.559"></a>
<span class="sourceLineNo">560</span>         */<a name="line.560"></a>
<span class="sourceLineNo">561</span>        @Override<a name="line.561"></a>
<span class="sourceLineNo">562</span>        public List&lt;Object&gt; handleParseResult(final List&lt;CommandLine&gt; parsedCommands, final PrintStream out, final Help.Ansi ansi) {<a name="line.562"></a>
<span class="sourceLineNo">563</span>            if (printHelpIfRequested(parsedCommands, out, ansi)) {<a name="line.563"></a>
<span class="sourceLineNo">564</span>                return null;<a name="line.564"></a>
<span class="sourceLineNo">565</span>            }<a name="line.565"></a>
<span class="sourceLineNo">566</span>            final List&lt;Object&gt; result = new ArrayList&lt;Object&gt;();<a name="line.566"></a>
<span class="sourceLineNo">567</span>            for (final CommandLine parsed : parsedCommands) {<a name="line.567"></a>
<span class="sourceLineNo">568</span>                result.add(execute(parsed));<a name="line.568"></a>
<span class="sourceLineNo">569</span>            }<a name="line.569"></a>
<span class="sourceLineNo">570</span>            return result;<a name="line.570"></a>
<span class="sourceLineNo">571</span>        }<a name="line.571"></a>
<span class="sourceLineNo">572</span>    }<a name="line.572"></a>
<span class="sourceLineNo">573</span>    /**<a name="line.573"></a>
<span class="sourceLineNo">574</span>     * Returns the result of calling {@link #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)}<a name="line.574"></a>
<span class="sourceLineNo">575</span>     * with {@code Help.Ansi.AUTO} and a new {@link DefaultExceptionHandler} in addition to the specified parse result handler,<a name="line.575"></a>
<span class="sourceLineNo">576</span>     * {@code PrintStream}, and the specified command line arguments.<a name="line.576"></a>
<span class="sourceLineNo">577</span>     * &lt;p&gt;<a name="line.577"></a>
<span class="sourceLineNo">578</span>     * This is a convenience method intended to offer the same ease of use as the {@link #run(Runnable, PrintStream, Help.Ansi, String...) run}<a name="line.578"></a>
<span class="sourceLineNo">579</span>     * and {@link #call(Callable, PrintStream, Help.Ansi, String...) call} methods, but with more flexibility and better<a name="line.579"></a>
<span class="sourceLineNo">580</span>     * support for nested subcommands.<a name="line.580"></a>
<span class="sourceLineNo">581</span>     * &lt;/p&gt;<a name="line.581"></a>
<span class="sourceLineNo">582</span>     * &lt;p&gt;Calling this method roughly expands to:&lt;/p&gt;<a name="line.582"></a>
<span class="sourceLineNo">583</span>     * &lt;pre&gt;<a name="line.583"></a>
<span class="sourceLineNo">584</span>     * try {<a name="line.584"></a>
<span class="sourceLineNo">585</span>     *     List&amp;lt;CommandLine&amp;gt; parsedCommands = parse(args);<a name="line.585"></a>
<span class="sourceLineNo">586</span>     *     return parseResultsHandler.handleParseResult(parsedCommands, out, Help.Ansi.AUTO);<a name="line.586"></a>
<span class="sourceLineNo">587</span>     * } catch (ParameterException ex) {<a name="line.587"></a>
<span class="sourceLineNo">588</span>     *     return new DefaultExceptionHandler().handleException(ex, out, ansi, args);<a name="line.588"></a>
<span class="sourceLineNo">589</span>     * }<a name="line.589"></a>
<span class="sourceLineNo">590</span>     * &lt;/pre&gt;<a name="line.590"></a>
<span class="sourceLineNo">591</span>     * &lt;p&gt;<a name="line.591"></a>
<span class="sourceLineNo">592</span>     * Picocli provides some default handlers that allow you to accomplish some common tasks with very little code.<a name="line.592"></a>
<span class="sourceLineNo">593</span>     * The following handlers are available:&lt;/p&gt;<a name="line.593"></a>
<span class="sourceLineNo">594</span>     * &lt;ul&gt;<a name="line.594"></a>
<span class="sourceLineNo">595</span>     *   &lt;li&gt;{@link RunLast} handler prints help if requested, and otherwise gets the last specified command or subcommand<a name="line.595"></a>
<span class="sourceLineNo">596</span>     * and tries to execute it as a {@code Runnable} or {@code Callable}.&lt;/li&gt;<a name="line.596"></a>
<span class="sourceLineNo">597</span>     *   &lt;li&gt;{@link RunFirst} handler prints help if requested, and otherwise executes the top-level command as a {@code Runnable} or {@code Callable}.&lt;/li&gt;<a name="line.597"></a>
<span class="sourceLineNo">598</span>     *   &lt;li&gt;{@link RunAll} handler prints help if requested, and otherwise executes all recognized commands and subcommands as {@code Runnable} or {@code Callable} tasks.&lt;/li&gt;<a name="line.598"></a>
<span class="sourceLineNo">599</span>     *   &lt;li&gt;{@link DefaultExceptionHandler} prints the error message followed by usage help&lt;/li&gt;<a name="line.599"></a>
<span class="sourceLineNo">600</span>     * &lt;/ul&gt;<a name="line.600"></a>
<span class="sourceLineNo">601</span>     * @param handler the function that will process the result of successfully parsing the command line arguments<a name="line.601"></a>
<span class="sourceLineNo">602</span>     * @param out the {@code PrintStream} to print help to if requested<a name="line.602"></a>
<span class="sourceLineNo">603</span>     * @param args the command line arguments<a name="line.603"></a>
<span class="sourceLineNo">604</span>     * @return a list of results, or an empty list if there are no results<a name="line.604"></a>
<span class="sourceLineNo">605</span>     * @throws ExecutionException if the command line arguments were parsed successfully but a problem occurred while processing the<a name="line.605"></a>
<span class="sourceLineNo">606</span>     *      parse results; use {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed<a name="line.606"></a>
<span class="sourceLineNo">607</span>     * @see RunLast<a name="line.607"></a>
<span class="sourceLineNo">608</span>     * @see RunAll<a name="line.608"></a>
<span class="sourceLineNo">609</span>     * @since 2.0 */<a name="line.609"></a>
<span class="sourceLineNo">610</span>    public List&lt;Object&gt; parseWithHandler(final IParseResultHandler handler, final PrintStream out, final String... args) {<a name="line.610"></a>
<span class="sourceLineNo">611</span>        return parseWithHandlers(handler, out, Help.Ansi.AUTO, new DefaultExceptionHandler(), args);<a name="line.611"></a>
<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
<span class="sourceLineNo">613</span>    /**<a name="line.613"></a>
<span class="sourceLineNo">614</span>     * Tries to {@linkplain #parse(String...) parse} the specified command line arguments, and if successful, delegates<a name="line.614"></a>
<span class="sourceLineNo">615</span>     * the processing of the resulting list of {@code CommandLine} objects to the specified {@linkplain IParseResultHandler handler}.<a name="line.615"></a>
<span class="sourceLineNo">616</span>     * If the command line arguments were invalid, the {@code ParameterException} thrown from the {@code parse} method<a name="line.616"></a>
<span class="sourceLineNo">617</span>     * is caught and passed to the specified {@link IExceptionHandler}.<a name="line.617"></a>
<span class="sourceLineNo">618</span>     * &lt;p&gt;<a name="line.618"></a>
<span class="sourceLineNo">619</span>     * This is a convenience method intended to offer the same ease of use as the {@link #run(Runnable, PrintStream, Help.Ansi, String...) run}<a name="line.619"></a>
<span class="sourceLineNo">620</span>     * and {@link #call(Callable, PrintStream, Help.Ansi, String...) call} methods, but with more flexibility and better<a name="line.620"></a>
<span class="sourceLineNo">621</span>     * support for nested subcommands.<a name="line.621"></a>
<span class="sourceLineNo">622</span>     * &lt;/p&gt;<a name="line.622"></a>
<span class="sourceLineNo">623</span>     * &lt;p&gt;Calling this method roughly expands to:&lt;/p&gt;<a name="line.623"></a>
<span class="sourceLineNo">624</span>     * &lt;pre&gt;<a name="line.624"></a>
<span class="sourceLineNo">625</span>     * try {<a name="line.625"></a>
<span class="sourceLineNo">626</span>     *     List&amp;lt;CommandLine&amp;gt; parsedCommands = parse(args);<a name="line.626"></a>
<span class="sourceLineNo">627</span>     *     return parseResultsHandler.handleParseResult(parsedCommands, out, ansi);<a name="line.627"></a>
<span class="sourceLineNo">628</span>     * } catch (ParameterException ex) {<a name="line.628"></a>
<span class="sourceLineNo">629</span>     *     return new exceptionHandler.handleException(ex, out, ansi, args);<a name="line.629"></a>
<span class="sourceLineNo">630</span>     * }<a name="line.630"></a>
<span class="sourceLineNo">631</span>     * &lt;/pre&gt;<a name="line.631"></a>
<span class="sourceLineNo">632</span>     * &lt;p&gt;<a name="line.632"></a>
<span class="sourceLineNo">633</span>     * Picocli provides some default handlers that allow you to accomplish some common tasks with very little code.<a name="line.633"></a>
<span class="sourceLineNo">634</span>     * The following handlers are available:&lt;/p&gt;<a name="line.634"></a>
<span class="sourceLineNo">635</span>     * &lt;ul&gt;<a name="line.635"></a>
<span class="sourceLineNo">636</span>     *   &lt;li&gt;{@link RunLast} handler prints help if requested, and otherwise gets the last specified command or subcommand<a name="line.636"></a>
<span class="sourceLineNo">637</span>     * and tries to execute it as a {@code Runnable} or {@code Callable}.&lt;/li&gt;<a name="line.637"></a>
<span class="sourceLineNo">638</span>     *   &lt;li&gt;{@link RunFirst} handler prints help if requested, and otherwise executes the top-level command as a {@code Runnable} or {@code Callable}.&lt;/li&gt;<a name="line.638"></a>
<span class="sourceLineNo">639</span>     *   &lt;li&gt;{@link RunAll} handler prints help if requested, and otherwise executes all recognized commands and subcommands as {@code Runnable} or {@code Callable} tasks.&lt;/li&gt;<a name="line.639"></a>
<span class="sourceLineNo">640</span>     *   &lt;li&gt;{@link DefaultExceptionHandler} prints the error message followed by usage help&lt;/li&gt;<a name="line.640"></a>
<span class="sourceLineNo">641</span>     * &lt;/ul&gt;<a name="line.641"></a>
<span class="sourceLineNo">642</span>     *<a name="line.642"></a>
<span class="sourceLineNo">643</span>     * @param handler the function that will process the result of successfully parsing the command line arguments<a name="line.643"></a>
<span class="sourceLineNo">644</span>     * @param out the {@code PrintStream} to print help to if requested<a name="line.644"></a>
<span class="sourceLineNo">645</span>     * @param ansi for printing help messages using ANSI styles and colors<a name="line.645"></a>
<span class="sourceLineNo">646</span>     * @param exceptionHandler the function that can handle the {@code ParameterException} thrown when the command line arguments are invalid<a name="line.646"></a>
<span class="sourceLineNo">647</span>     * @param args the command line arguments<a name="line.647"></a>
<span class="sourceLineNo">648</span>     * @return a list of results produced by the {@code IParseResultHandler} or the {@code IExceptionHandler}, or an empty list if there are no results<a name="line.648"></a>
<span class="sourceLineNo">649</span>     * @throws ExecutionException if the command line arguments were parsed successfully but a problem occurred while processing the parse<a name="line.649"></a>
<span class="sourceLineNo">650</span>     *      result {@code CommandLine} objects; use {@link ExecutionException#getCommandLine()} to get the command or subcommand where processing failed<a name="line.650"></a>
<span class="sourceLineNo">651</span>     * @see RunLast<a name="line.651"></a>
<span class="sourceLineNo">652</span>     * @see RunAll<a name="line.652"></a>
<span class="sourceLineNo">653</span>     * @see DefaultExceptionHandler<a name="line.653"></a>
<span class="sourceLineNo">654</span>     * @since 2.0 */<a name="line.654"></a>
<span class="sourceLineNo">655</span>    public List&lt;Object&gt; parseWithHandlers(final IParseResultHandler handler, final PrintStream out, final Help.Ansi ansi, final IExceptionHandler exceptionHandler, final String... args) {<a name="line.655"></a>
<span class="sourceLineNo">656</span>        try {<a name="line.656"></a>
<span class="sourceLineNo">657</span>            final List&lt;CommandLine&gt; result = parse(args);<a name="line.657"></a>
<span class="sourceLineNo">658</span>            return handler.handleParseResult(result, out, ansi);<a name="line.658"></a>
<span class="sourceLineNo">659</span>        } catch (final ParameterException ex) {<a name="line.659"></a>
<span class="sourceLineNo">660</span>            return exceptionHandler.handleException(ex, out, ansi, args);<a name="line.660"></a>
<span class="sourceLineNo">661</span>        }<a name="line.661"></a>
<span class="sourceLineNo">662</span>    }<a name="line.662"></a>
<span class="sourceLineNo">663</span>    /**<a name="line.663"></a>
<span class="sourceLineNo">664</span>     * Equivalent to {@code new CommandLine(command).usage(out)}. See {@link #usage(PrintStream)} for details.<a name="line.664"></a>
<span class="sourceLineNo">665</span>     * @param command the object annotated with {@link Command}, {@link Option} and {@link Parameters}<a name="line.665"></a>
<span class="sourceLineNo">666</span>     * @param out the print stream to print the help message to<a name="line.666"></a>
<span class="sourceLineNo">667</span>     * @throws IllegalArgumentException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.667"></a>
<span class="sourceLineNo">668</span>     */<a name="line.668"></a>
<span class="sourceLineNo">669</span>    public static void usage(final Object command, final PrintStream out) {<a name="line.669"></a>
<span class="sourceLineNo">670</span>        toCommandLine(command).usage(out);<a name="line.670"></a>
<span class="sourceLineNo">671</span>    }<a name="line.671"></a>
<span class="sourceLineNo">672</span><a name="line.672"></a>
<span class="sourceLineNo">673</span>    /**<a name="line.673"></a>
<span class="sourceLineNo">674</span>     * Equivalent to {@code new CommandLine(command).usage(out, ansi)}.<a name="line.674"></a>
<span class="sourceLineNo">675</span>     * See {@link #usage(PrintStream, Help.Ansi)} for details.<a name="line.675"></a>
<span class="sourceLineNo">676</span>     * @param command the object annotated with {@link Command}, {@link Option} and {@link Parameters}<a name="line.676"></a>
<span class="sourceLineNo">677</span>     * @param out the print stream to print the help message to<a name="line.677"></a>
<span class="sourceLineNo">678</span>     * @param ansi whether the usage message should contain ANSI escape codes or not<a name="line.678"></a>
<span class="sourceLineNo">679</span>     * @throws IllegalArgumentException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.679"></a>
<span class="sourceLineNo">680</span>     */<a name="line.680"></a>
<span class="sourceLineNo">681</span>    public static void usage(final Object command, final PrintStream out, final Help.Ansi ansi) {<a name="line.681"></a>
<span class="sourceLineNo">682</span>        toCommandLine(command).usage(out, ansi);<a name="line.682"></a>
<span class="sourceLineNo">683</span>    }<a name="line.683"></a>
<span class="sourceLineNo">684</span><a name="line.684"></a>
<span class="sourceLineNo">685</span>    /**<a name="line.685"></a>
<span class="sourceLineNo">686</span>     * Equivalent to {@code new CommandLine(command).usage(out, colorScheme)}.<a name="line.686"></a>
<span class="sourceLineNo">687</span>     * See {@link #usage(PrintStream, Help.ColorScheme)} for details.<a name="line.687"></a>
<span class="sourceLineNo">688</span>     * @param command the object annotated with {@link Command}, {@link Option} and {@link Parameters}<a name="line.688"></a>
<span class="sourceLineNo">689</span>     * @param out the print stream to print the help message to<a name="line.689"></a>
<span class="sourceLineNo">690</span>     * @param colorScheme the {@code ColorScheme} defining the styles for options, parameters and commands when ANSI is enabled<a name="line.690"></a>
<span class="sourceLineNo">691</span>     * @throws IllegalArgumentException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.691"></a>
<span class="sourceLineNo">692</span>     */<a name="line.692"></a>
<span class="sourceLineNo">693</span>    public static void usage(final Object command, final PrintStream out, final Help.ColorScheme colorScheme) {<a name="line.693"></a>
<span class="sourceLineNo">694</span>        toCommandLine(command).usage(out, colorScheme);<a name="line.694"></a>
<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
<span class="sourceLineNo">696</span><a name="line.696"></a>
<span class="sourceLineNo">697</span>    /**<a name="line.697"></a>
<span class="sourceLineNo">698</span>     * Delegates to {@link #usage(PrintStream, Help.Ansi)} with the {@linkplain Help.Ansi#AUTO platform default}.<a name="line.698"></a>
<span class="sourceLineNo">699</span>     * @param out the printStream to print to<a name="line.699"></a>
<span class="sourceLineNo">700</span>     * @see #usage(PrintStream, Help.ColorScheme)<a name="line.700"></a>
<span class="sourceLineNo">701</span>     */<a name="line.701"></a>
<span class="sourceLineNo">702</span>    public void usage(final PrintStream out) {<a name="line.702"></a>
<span class="sourceLineNo">703</span>        usage(out, Help.Ansi.AUTO);<a name="line.703"></a>
<span class="sourceLineNo">704</span>    }<a name="line.704"></a>
<span class="sourceLineNo">705</span><a name="line.705"></a>
<span class="sourceLineNo">706</span>    /**<a name="line.706"></a>
<span class="sourceLineNo">707</span>     * Delegates to {@link #usage(PrintStream, Help.ColorScheme)} with the {@linkplain Help#defaultColorScheme(CommandLine.Help.Ansi) default color scheme}.<a name="line.707"></a>
<span class="sourceLineNo">708</span>     * @param out the printStream to print to<a name="line.708"></a>
<span class="sourceLineNo">709</span>     * @param ansi whether the usage message should include ANSI escape codes or not<a name="line.709"></a>
<span class="sourceLineNo">710</span>     * @see #usage(PrintStream, Help.ColorScheme)<a name="line.710"></a>
<span class="sourceLineNo">711</span>     */<a name="line.711"></a>
<span class="sourceLineNo">712</span>    public void usage(final PrintStream out, final Help.Ansi ansi) {<a name="line.712"></a>
<span class="sourceLineNo">713</span>        usage(out, Help.defaultColorScheme(ansi));<a name="line.713"></a>
<span class="sourceLineNo">714</span>    }<a name="line.714"></a>
<span class="sourceLineNo">715</span>    /**<a name="line.715"></a>
<span class="sourceLineNo">716</span>     * Prints a usage help message for the annotated command class to the specified {@code PrintStream}.<a name="line.716"></a>
<span class="sourceLineNo">717</span>     * Delegates construction of the usage help message to the {@link Help} inner class and is equivalent to:<a name="line.717"></a>
<span class="sourceLineNo">718</span>     * &lt;pre&gt;<a name="line.718"></a>
<span class="sourceLineNo">719</span>     * Help help = new Help(command).addAllSubcommands(getSubcommands());<a name="line.719"></a>
<span class="sourceLineNo">720</span>     * StringBuilder sb = new StringBuilder()<a name="line.720"></a>
<span class="sourceLineNo">721</span>     *         .append(help.headerHeading())<a name="line.721"></a>
<span class="sourceLineNo">722</span>     *         .append(help.header())<a name="line.722"></a>
<span class="sourceLineNo">723</span>     *         .append(help.synopsisHeading())      //e.g. Usage:<a name="line.723"></a>
<span class="sourceLineNo">724</span>     *         .append(help.synopsis())             //e.g. &amp;lt;main class&amp;gt; [OPTIONS] &amp;lt;command&amp;gt; [COMMAND-OPTIONS] [ARGUMENTS]<a name="line.724"></a>
<span class="sourceLineNo">725</span>     *         .append(help.descriptionHeading())   //e.g. %nDescription:%n%n<a name="line.725"></a>
<span class="sourceLineNo">726</span>     *         .append(help.description())          //e.g. {"Converts foos to bars.", "Use options to control conversion mode."}<a name="line.726"></a>
<span class="sourceLineNo">727</span>     *         .append(help.parameterListHeading()) //e.g. %nPositional parameters:%n%n<a name="line.727"></a>
<span class="sourceLineNo">728</span>     *         .append(help.parameterList())        //e.g. [FILE...] the files to convert<a name="line.728"></a>
<span class="sourceLineNo">729</span>     *         .append(help.optionListHeading())    //e.g. %nOptions:%n%n<a name="line.729"></a>
<span class="sourceLineNo">730</span>     *         .append(help.optionList())           //e.g. -h, --help   displays this help and exits<a name="line.730"></a>
<span class="sourceLineNo">731</span>     *         .append(help.commandListHeading())   //e.g. %nCommands:%n%n<a name="line.731"></a>
<span class="sourceLineNo">732</span>     *         .append(help.commandList())          //e.g.    add       adds the frup to the frooble<a name="line.732"></a>
<span class="sourceLineNo">733</span>     *         .append(help.footerHeading())<a name="line.733"></a>
<span class="sourceLineNo">734</span>     *         .append(help.footer());<a name="line.734"></a>
<span class="sourceLineNo">735</span>     * out.print(sb);<a name="line.735"></a>
<span class="sourceLineNo">736</span>     * &lt;/pre&gt;<a name="line.736"></a>
<span class="sourceLineNo">737</span>     * &lt;p&gt;Annotate your class with {@link Command} to control many aspects of the usage help message, including<a name="line.737"></a>
<span class="sourceLineNo">738</span>     * the program name, text of section headings and section contents, and some aspects of the auto-generated sections<a name="line.738"></a>
<span class="sourceLineNo">739</span>     * of the usage help message.<a name="line.739"></a>
<span class="sourceLineNo">740</span>     * &lt;p&gt;To customize the auto-generated sections of the usage help message, like how option details are displayed,<a name="line.740"></a>
<span class="sourceLineNo">741</span>     * instantiate a {@link Help} object and use a {@link Help.TextTable} with more of fewer columns, a custom<a name="line.741"></a>
<span class="sourceLineNo">742</span>     * {@linkplain Help.Layout layout}, and/or a custom option {@linkplain Help.IOptionRenderer renderer}<a name="line.742"></a>
<span class="sourceLineNo">743</span>     * for ultimate control over which aspects of an Option or Field are displayed where.&lt;/p&gt;<a name="line.743"></a>
<span class="sourceLineNo">744</span>     * @param out the {@code PrintStream} to print the usage help message to<a name="line.744"></a>
<span class="sourceLineNo">745</span>     * @param colorScheme the {@code ColorScheme} defining the styles for options, parameters and commands when ANSI is enabled<a name="line.745"></a>
<span class="sourceLineNo">746</span>     */<a name="line.746"></a>
<span class="sourceLineNo">747</span>    public void usage(final PrintStream out, final Help.ColorScheme colorScheme) {<a name="line.747"></a>
<span class="sourceLineNo">748</span>        final Help help = new Help(interpreter.command, colorScheme).addAllSubcommands(getSubcommands());<a name="line.748"></a>
<span class="sourceLineNo">749</span>        if (!Help.DEFAULT_SEPARATOR.equals(getSeparator())) {<a name="line.749"></a>
<span class="sourceLineNo">750</span>            help.separator = getSeparator();<a name="line.750"></a>
<span class="sourceLineNo">751</span>            help.parameterLabelRenderer = help.createDefaultParamLabelRenderer(); // update for new separator<a name="line.751"></a>
<span class="sourceLineNo">752</span>        }<a name="line.752"></a>
<span class="sourceLineNo">753</span>        if (!Help.DEFAULT_COMMAND_NAME.equals(getCommandName())) {<a name="line.753"></a>
<span class="sourceLineNo">754</span>            help.commandName = getCommandName();<a name="line.754"></a>
<span class="sourceLineNo">755</span>        }<a name="line.755"></a>
<span class="sourceLineNo">756</span>        final StringBuilder sb = new StringBuilder()<a name="line.756"></a>
<span class="sourceLineNo">757</span>                .append(help.headerHeading())<a name="line.757"></a>
<span class="sourceLineNo">758</span>                .append(help.header())<a name="line.758"></a>
<span class="sourceLineNo">759</span>                .append(help.synopsisHeading())      //e.g. Usage:<a name="line.759"></a>
<span class="sourceLineNo">760</span>                .append(help.synopsis(help.synopsisHeadingLength())) //e.g. &amp;lt;main class&amp;gt; [OPTIONS] &amp;lt;command&amp;gt; [COMMAND-OPTIONS] [ARGUMENTS]<a name="line.760"></a>
<span class="sourceLineNo">761</span>                .append(help.descriptionHeading())   //e.g. %nDescription:%n%n<a name="line.761"></a>
<span class="sourceLineNo">762</span>                .append(help.description())          //e.g. {"Converts foos to bars.", "Use options to control conversion mode."}<a name="line.762"></a>
<span class="sourceLineNo">763</span>                .append(help.parameterListHeading()) //e.g. %nPositional parameters:%n%n<a name="line.763"></a>
<span class="sourceLineNo">764</span>                .append(help.parameterList())        //e.g. [FILE...] the files to convert<a name="line.764"></a>
<span class="sourceLineNo">765</span>                .append(help.optionListHeading())    //e.g. %nOptions:%n%n<a name="line.765"></a>
<span class="sourceLineNo">766</span>                .append(help.optionList())           //e.g. -h, --help   displays this help and exits<a name="line.766"></a>
<span class="sourceLineNo">767</span>                .append(help.commandListHeading())   //e.g. %nCommands:%n%n<a name="line.767"></a>
<span class="sourceLineNo">768</span>                .append(help.commandList())          //e.g.    add       adds the frup to the frooble<a name="line.768"></a>
<span class="sourceLineNo">769</span>                .append(help.footerHeading())<a name="line.769"></a>
<span class="sourceLineNo">770</span>                .append(help.footer());<a name="line.770"></a>
<span class="sourceLineNo">771</span>        out.print(sb);<a name="line.771"></a>
<span class="sourceLineNo">772</span>    }<a name="line.772"></a>
<span class="sourceLineNo">773</span><a name="line.773"></a>
<span class="sourceLineNo">774</span>    /**<a name="line.774"></a>
<span class="sourceLineNo">775</span>     * Delegates to {@link #printVersionHelp(PrintStream, Help.Ansi)} with the {@linkplain Help.Ansi#AUTO platform default}.<a name="line.775"></a>
<span class="sourceLineNo">776</span>     * @param out the printStream to print to<a name="line.776"></a>
<span class="sourceLineNo">777</span>     * @see #printVersionHelp(PrintStream, Help.Ansi)<a name="line.777"></a>
<span class="sourceLineNo">778</span>     * @since 0.9.8<a name="line.778"></a>
<span class="sourceLineNo">779</span>     */<a name="line.779"></a>
<span class="sourceLineNo">780</span>    public void printVersionHelp(final PrintStream out) { printVersionHelp(out, Help.Ansi.AUTO); }<a name="line.780"></a>
<span class="sourceLineNo">781</span><a name="line.781"></a>
<span class="sourceLineNo">782</span>    /**<a name="line.782"></a>
<span class="sourceLineNo">783</span>     * Prints version information from the {@link Command#version()} annotation to the specified {@code PrintStream}.<a name="line.783"></a>
<span class="sourceLineNo">784</span>     * Each element of the array of version strings is printed on a separate line. Version strings may contain<a name="line.784"></a>
<span class="sourceLineNo">785</span>     * &lt;a href="http://picocli.info/#_usage_help_with_styles_and_colors"&gt;markup for colors and style&lt;/a&gt;.<a name="line.785"></a>
<span class="sourceLineNo">786</span>     * @param out the printStream to print to<a name="line.786"></a>
<span class="sourceLineNo">787</span>     * @param ansi whether the usage message should include ANSI escape codes or not<a name="line.787"></a>
<span class="sourceLineNo">788</span>     * @see Command#version()<a name="line.788"></a>
<span class="sourceLineNo">789</span>     * @see Option#versionHelp()<a name="line.789"></a>
<span class="sourceLineNo">790</span>     * @see #isVersionHelpRequested()<a name="line.790"></a>
<span class="sourceLineNo">791</span>     * @since 0.9.8<a name="line.791"></a>
<span class="sourceLineNo">792</span>     */<a name="line.792"></a>
<span class="sourceLineNo">793</span>    public void printVersionHelp(final PrintStream out, final Help.Ansi ansi) {<a name="line.793"></a>
<span class="sourceLineNo">794</span>        for (final String versionInfo : versionLines) {<a name="line.794"></a>
<span class="sourceLineNo">795</span>            out.println(ansi.new Text(versionInfo));<a name="line.795"></a>
<span class="sourceLineNo">796</span>        }<a name="line.796"></a>
<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
<span class="sourceLineNo">798</span>    /**<a name="line.798"></a>
<span class="sourceLineNo">799</span>     * Prints version information from the {@link Command#version()} annotation to the specified {@code PrintStream}.<a name="line.799"></a>
<span class="sourceLineNo">800</span>     * Each element of the array of version strings is {@linkplain String#format(String, Object...) formatted} with the<a name="line.800"></a>
<span class="sourceLineNo">801</span>     * specified parameters, and printed on a separate line. Both version strings and parameters may contain<a name="line.801"></a>
<span class="sourceLineNo">802</span>     * &lt;a href="http://picocli.info/#_usage_help_with_styles_and_colors"&gt;markup for colors and style&lt;/a&gt;.<a name="line.802"></a>
<span class="sourceLineNo">803</span>     * @param out the printStream to print to<a name="line.803"></a>
<span class="sourceLineNo">804</span>     * @param ansi whether the usage message should include ANSI escape codes or not<a name="line.804"></a>
<span class="sourceLineNo">805</span>     * @param params Arguments referenced by the format specifiers in the version strings<a name="line.805"></a>
<span class="sourceLineNo">806</span>     * @see Command#version()<a name="line.806"></a>
<span class="sourceLineNo">807</span>     * @see Option#versionHelp()<a name="line.807"></a>
<span class="sourceLineNo">808</span>     * @see #isVersionHelpRequested()<a name="line.808"></a>
<span class="sourceLineNo">809</span>     * @since 1.0.0<a name="line.809"></a>
<span class="sourceLineNo">810</span>     */<a name="line.810"></a>
<span class="sourceLineNo">811</span>    public void printVersionHelp(final PrintStream out, final Help.Ansi ansi, final Object... params) {<a name="line.811"></a>
<span class="sourceLineNo">812</span>        for (final String versionInfo : versionLines) {<a name="line.812"></a>
<span class="sourceLineNo">813</span>            out.println(ansi.new Text(String.format(versionInfo, params)));<a name="line.813"></a>
<span class="sourceLineNo">814</span>        }<a name="line.814"></a>
<span class="sourceLineNo">815</span>    }<a name="line.815"></a>
<span class="sourceLineNo">816</span><a name="line.816"></a>
<span class="sourceLineNo">817</span>    /**<a name="line.817"></a>
<span class="sourceLineNo">818</span>     * Delegates to {@link #call(Callable, PrintStream, Help.Ansi, String...)} with {@link Help.Ansi#AUTO}.<a name="line.818"></a>
<span class="sourceLineNo">819</span>     * &lt;p&gt;<a name="line.819"></a>
<span class="sourceLineNo">820</span>     * From picocli v2.0, this method prints usage help or version help if {@linkplain #printHelpIfRequested(List, PrintStream, Help.Ansi) requested},<a name="line.820"></a>
<span class="sourceLineNo">821</span>     * and any exceptions thrown by the {@code Callable} are caught and rethrown wrapped in an {@code ExecutionException}.<a name="line.821"></a>
<span class="sourceLineNo">822</span>     * &lt;/p&gt;<a name="line.822"></a>
<span class="sourceLineNo">823</span>     * @param callable the command to call when {@linkplain #parse(String...) parsing} succeeds.<a name="line.823"></a>
<span class="sourceLineNo">824</span>     * @param out the printStream to print to<a name="line.824"></a>
<span class="sourceLineNo">825</span>     * @param args the command line arguments to parse<a name="line.825"></a>
<span class="sourceLineNo">826</span>     * @param &lt;C&gt; the annotated object must implement Callable<a name="line.826"></a>
<span class="sourceLineNo">827</span>     * @param &lt;T&gt; the return type of the most specific command (must implement {@code Callable})<a name="line.827"></a>
<span class="sourceLineNo">828</span>     * @see #call(Callable, PrintStream, Help.Ansi, String...)<a name="line.828"></a>
<span class="sourceLineNo">829</span>     * @throws InitializationException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.829"></a>
<span class="sourceLineNo">830</span>     * @throws ExecutionException if the Callable throws an exception<a name="line.830"></a>
<span class="sourceLineNo">831</span>     * @return {@code null} if an error occurred while parsing the command line options, otherwise returns the result of calling the Callable<a name="line.831"></a>
<span class="sourceLineNo">832</span>     * @see #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)<a name="line.832"></a>
<span class="sourceLineNo">833</span>     * @see RunFirst<a name="line.833"></a>
<span class="sourceLineNo">834</span>     */<a name="line.834"></a>
<span class="sourceLineNo">835</span>    public static &lt;C extends Callable&lt;T&gt;, T&gt; T call(final C callable, final PrintStream out, final String... args) {<a name="line.835"></a>
<span class="sourceLineNo">836</span>        return call(callable, out, Help.Ansi.AUTO, args);<a name="line.836"></a>
<span class="sourceLineNo">837</span>    }<a name="line.837"></a>
<span class="sourceLineNo">838</span>    /**<a name="line.838"></a>
<span class="sourceLineNo">839</span>     * Convenience method to allow command line application authors to avoid some boilerplate code in their application.<a name="line.839"></a>
<span class="sourceLineNo">840</span>     * The annotated object needs to implement {@link Callable}. Calling this method is equivalent to:<a name="line.840"></a>
<span class="sourceLineNo">841</span>     * &lt;pre&gt;<a name="line.841"></a>
<span class="sourceLineNo">842</span>     * CommandLine cmd = new CommandLine(callable);<a name="line.842"></a>
<span class="sourceLineNo">843</span>     * List&amp;lt;CommandLine&amp;gt; parsedCommands;<a name="line.843"></a>
<span class="sourceLineNo">844</span>     * try {<a name="line.844"></a>
<span class="sourceLineNo">845</span>     *     parsedCommands = cmd.parse(args);<a name="line.845"></a>
<span class="sourceLineNo">846</span>     * } catch (ParameterException ex) {<a name="line.846"></a>
<span class="sourceLineNo">847</span>     *     out.println(ex.getMessage());<a name="line.847"></a>
<span class="sourceLineNo">848</span>     *     cmd.usage(out, ansi);<a name="line.848"></a>
<span class="sourceLineNo">849</span>     *     return null;<a name="line.849"></a>
<span class="sourceLineNo">850</span>     * }<a name="line.850"></a>
<span class="sourceLineNo">851</span>     * if (CommandLine.printHelpIfRequested(parsedCommands, out, ansi)) {<a name="line.851"></a>
<span class="sourceLineNo">852</span>     *     return null;<a name="line.852"></a>
<span class="sourceLineNo">853</span>     * }<a name="line.853"></a>
<span class="sourceLineNo">854</span>     * CommandLine last = parsedCommands.get(parsedCommands.size() - 1);<a name="line.854"></a>
<span class="sourceLineNo">855</span>     * try {<a name="line.855"></a>
<span class="sourceLineNo">856</span>     *     Callable&amp;lt;Object&amp;gt; subcommand = last.getCommand();<a name="line.856"></a>
<span class="sourceLineNo">857</span>     *     return subcommand.call();<a name="line.857"></a>
<span class="sourceLineNo">858</span>     * } catch (Exception ex) {<a name="line.858"></a>
<span class="sourceLineNo">859</span>     *     throw new ExecutionException(last, "Error calling " + last.getCommand(), ex);<a name="line.859"></a>
<span class="sourceLineNo">860</span>     * }<a name="line.860"></a>
<span class="sourceLineNo">861</span>     * &lt;/pre&gt;<a name="line.861"></a>
<span class="sourceLineNo">862</span>     * &lt;p&gt;<a name="line.862"></a>
<span class="sourceLineNo">863</span>     * If the specified Callable command has subcommands, the {@linkplain RunLast last} subcommand specified on the<a name="line.863"></a>
<span class="sourceLineNo">864</span>     * command line is executed.<a name="line.864"></a>
<span class="sourceLineNo">865</span>     * Commands with subcommands may be interested in calling the {@link #parseWithHandler(IParseResultHandler, PrintStream, String...) parseWithHandler}<a name="line.865"></a>
<span class="sourceLineNo">866</span>     * method with a {@link RunAll} handler or a custom handler.<a name="line.866"></a>
<span class="sourceLineNo">867</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.867"></a>
<span class="sourceLineNo">868</span>     * From picocli v2.0, this method prints usage help or version help if {@linkplain #printHelpIfRequested(List, PrintStream, Help.Ansi) requested},<a name="line.868"></a>
<span class="sourceLineNo">869</span>     * and any exceptions thrown by the {@code Callable} are caught and rethrown wrapped in an {@code ExecutionException}.<a name="line.869"></a>
<span class="sourceLineNo">870</span>     * &lt;/p&gt;<a name="line.870"></a>
<span class="sourceLineNo">871</span>     * @param callable the command to call when {@linkplain #parse(String...) parsing} succeeds.<a name="line.871"></a>
<span class="sourceLineNo">872</span>     * @param out the printStream to print to<a name="line.872"></a>
<span class="sourceLineNo">873</span>     * @param ansi whether the usage message should include ANSI escape codes or not<a name="line.873"></a>
<span class="sourceLineNo">874</span>     * @param args the command line arguments to parse<a name="line.874"></a>
<span class="sourceLineNo">875</span>     * @param &lt;C&gt; the annotated object must implement Callable<a name="line.875"></a>
<span class="sourceLineNo">876</span>     * @param &lt;T&gt; the return type of the specified {@code Callable}<a name="line.876"></a>
<span class="sourceLineNo">877</span>     * @throws InitializationException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.877"></a>
<span class="sourceLineNo">878</span>     * @throws ExecutionException if the Callable throws an exception<a name="line.878"></a>
<span class="sourceLineNo">879</span>     * @return {@code null} if an error occurred while parsing the command line options, or if help was requested and printed. Otherwise returns the result of calling the Callable<a name="line.879"></a>
<span class="sourceLineNo">880</span>     * @see #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)<a name="line.880"></a>
<span class="sourceLineNo">881</span>     * @see RunLast<a name="line.881"></a>
<span class="sourceLineNo">882</span>     */<a name="line.882"></a>
<span class="sourceLineNo">883</span>    public static &lt;C extends Callable&lt;T&gt;, T&gt; T call(final C callable, final PrintStream out, final Help.Ansi ansi, final String... args) {<a name="line.883"></a>
<span class="sourceLineNo">884</span>        final CommandLine cmd = new CommandLine(callable); // validate command outside of try-catch<a name="line.884"></a>
<span class="sourceLineNo">885</span>        final List&lt;Object&gt; results = cmd.parseWithHandlers(new RunLast(), out, ansi, new DefaultExceptionHandler(), args);<a name="line.885"></a>
<span class="sourceLineNo">886</span>        return results == null || results.isEmpty() ? null : (T) results.get(0);<a name="line.886"></a>
<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
<span class="sourceLineNo">888</span><a name="line.888"></a>
<span class="sourceLineNo">889</span>    /**<a name="line.889"></a>
<span class="sourceLineNo">890</span>     * Delegates to {@link #run(Runnable, PrintStream, Help.Ansi, String...)} with {@link Help.Ansi#AUTO}.<a name="line.890"></a>
<span class="sourceLineNo">891</span>     * &lt;p&gt;<a name="line.891"></a>
<span class="sourceLineNo">892</span>     * From picocli v2.0, this method prints usage help or version help if {@linkplain #printHelpIfRequested(List, PrintStream, Help.Ansi) requested},<a name="line.892"></a>
<span class="sourceLineNo">893</span>     * and any exceptions thrown by the {@code Runnable} are caught and rethrown wrapped in an {@code ExecutionException}.<a name="line.893"></a>
<span class="sourceLineNo">894</span>     * &lt;/p&gt;<a name="line.894"></a>
<span class="sourceLineNo">895</span>     * @param runnable the command to run when {@linkplain #parse(String...) parsing} succeeds.<a name="line.895"></a>
<span class="sourceLineNo">896</span>     * @param out the printStream to print to<a name="line.896"></a>
<span class="sourceLineNo">897</span>     * @param args the command line arguments to parse<a name="line.897"></a>
<span class="sourceLineNo">898</span>     * @param &lt;R&gt; the annotated object must implement Runnable<a name="line.898"></a>
<span class="sourceLineNo">899</span>     * @see #run(Runnable, PrintStream, Help.Ansi, String...)<a name="line.899"></a>
<span class="sourceLineNo">900</span>     * @throws InitializationException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.900"></a>
<span class="sourceLineNo">901</span>     * @throws ExecutionException if the Runnable throws an exception<a name="line.901"></a>
<span class="sourceLineNo">902</span>     * @see #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)<a name="line.902"></a>
<span class="sourceLineNo">903</span>     * @see RunFirst<a name="line.903"></a>
<span class="sourceLineNo">904</span>     */<a name="line.904"></a>
<span class="sourceLineNo">905</span>    public static &lt;R extends Runnable&gt; void run(final R runnable, final PrintStream out, final String... args) {<a name="line.905"></a>
<span class="sourceLineNo">906</span>        run(runnable, out, Help.Ansi.AUTO, args);<a name="line.906"></a>
<span class="sourceLineNo">907</span>    }<a name="line.907"></a>
<span class="sourceLineNo">908</span>    /**<a name="line.908"></a>
<span class="sourceLineNo">909</span>     * Convenience method to allow command line application authors to avoid some boilerplate code in their application.<a name="line.909"></a>
<span class="sourceLineNo">910</span>     * The annotated object needs to implement {@link Runnable}. Calling this method is equivalent to:<a name="line.910"></a>
<span class="sourceLineNo">911</span>     * &lt;pre&gt;<a name="line.911"></a>
<span class="sourceLineNo">912</span>     * CommandLine cmd = new CommandLine(runnable);<a name="line.912"></a>
<span class="sourceLineNo">913</span>     * List&amp;lt;CommandLine&amp;gt; parsedCommands;<a name="line.913"></a>
<span class="sourceLineNo">914</span>     * try {<a name="line.914"></a>
<span class="sourceLineNo">915</span>     *     parsedCommands = cmd.parse(args);<a name="line.915"></a>
<span class="sourceLineNo">916</span>     * } catch (ParameterException ex) {<a name="line.916"></a>
<span class="sourceLineNo">917</span>     *     out.println(ex.getMessage());<a name="line.917"></a>
<span class="sourceLineNo">918</span>     *     cmd.usage(out, ansi);<a name="line.918"></a>
<span class="sourceLineNo">919</span>     *     return null;<a name="line.919"></a>
<span class="sourceLineNo">920</span>     * }<a name="line.920"></a>
<span class="sourceLineNo">921</span>     * if (CommandLine.printHelpIfRequested(parsedCommands, out, ansi)) {<a name="line.921"></a>
<span class="sourceLineNo">922</span>     *     return null;<a name="line.922"></a>
<span class="sourceLineNo">923</span>     * }<a name="line.923"></a>
<span class="sourceLineNo">924</span>     * CommandLine last = parsedCommands.get(parsedCommands.size() - 1);<a name="line.924"></a>
<span class="sourceLineNo">925</span>     * try {<a name="line.925"></a>
<span class="sourceLineNo">926</span>     *     Runnable subcommand = last.getCommand();<a name="line.926"></a>
<span class="sourceLineNo">927</span>     *     subcommand.run();<a name="line.927"></a>
<span class="sourceLineNo">928</span>     * } catch (Exception ex) {<a name="line.928"></a>
<span class="sourceLineNo">929</span>     *     throw new ExecutionException(last, "Error running " + last.getCommand(), ex);<a name="line.929"></a>
<span class="sourceLineNo">930</span>     * }<a name="line.930"></a>
<span class="sourceLineNo">931</span>     * &lt;/pre&gt;<a name="line.931"></a>
<span class="sourceLineNo">932</span>     * &lt;p&gt;<a name="line.932"></a>
<span class="sourceLineNo">933</span>     * If the specified Runnable command has subcommands, the {@linkplain RunLast last} subcommand specified on the<a name="line.933"></a>
<span class="sourceLineNo">934</span>     * command line is executed.<a name="line.934"></a>
<span class="sourceLineNo">935</span>     * Commands with subcommands may be interested in calling the {@link #parseWithHandler(IParseResultHandler, PrintStream, String...) parseWithHandler}<a name="line.935"></a>
<span class="sourceLineNo">936</span>     * method with a {@link RunAll} handler or a custom handler.<a name="line.936"></a>
<span class="sourceLineNo">937</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.937"></a>
<span class="sourceLineNo">938</span>     * From picocli v2.0, this method prints usage help or version help if {@linkplain #printHelpIfRequested(List, PrintStream, Help.Ansi) requested},<a name="line.938"></a>
<span class="sourceLineNo">939</span>     * and any exceptions thrown by the {@code Runnable} are caught and rethrown wrapped in an {@code ExecutionException}.<a name="line.939"></a>
<span class="sourceLineNo">940</span>     * &lt;/p&gt;<a name="line.940"></a>
<span class="sourceLineNo">941</span>     * @param runnable the command to run when {@linkplain #parse(String...) parsing} succeeds.<a name="line.941"></a>
<span class="sourceLineNo">942</span>     * @param out the printStream to print to<a name="line.942"></a>
<span class="sourceLineNo">943</span>     * @param ansi whether the usage message should include ANSI escape codes or not<a name="line.943"></a>
<span class="sourceLineNo">944</span>     * @param args the command line arguments to parse<a name="line.944"></a>
<span class="sourceLineNo">945</span>     * @param &lt;R&gt; the annotated object must implement Runnable<a name="line.945"></a>
<span class="sourceLineNo">946</span>     * @throws InitializationException if the specified command object does not have a {@link Command}, {@link Option} or {@link Parameters} annotation<a name="line.946"></a>
<span class="sourceLineNo">947</span>     * @throws ExecutionException if the Runnable throws an exception<a name="line.947"></a>
<span class="sourceLineNo">948</span>     * @see #parseWithHandlers(IParseResultHandler, PrintStream, Help.Ansi, IExceptionHandler, String...)<a name="line.948"></a>
<span class="sourceLineNo">949</span>     * @see RunLast<a name="line.949"></a>
<span class="sourceLineNo">950</span>     */<a name="line.950"></a>
<span class="sourceLineNo">951</span>    public static &lt;R extends Runnable&gt; void run(final R runnable, final PrintStream out, final Help.Ansi ansi, final String... args) {<a name="line.951"></a>
<span class="sourceLineNo">952</span>        final CommandLine cmd = new CommandLine(runnable); // validate command outside of try-catch<a name="line.952"></a>
<span class="sourceLineNo">953</span>        cmd.parseWithHandlers(new RunLast(), out, ansi, new DefaultExceptionHandler(), args);<a name="line.953"></a>
<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
<span class="sourceLineNo">955</span><a name="line.955"></a>
<span class="sourceLineNo">956</span>    /**<a name="line.956"></a>
<span class="sourceLineNo">957</span>     * Registers the specified type converter for the specified class. When initializing fields annotated with<a name="line.957"></a>
<span class="sourceLineNo">958</span>     * {@link Option}, the field's type is used as a lookup key to find the associated type converter, and this<a name="line.958"></a>
<span class="sourceLineNo">959</span>     * type converter converts the original command line argument string value to the correct type.<a name="line.959"></a>
<span class="sourceLineNo">960</span>     * &lt;p&gt;<a name="line.960"></a>
<span class="sourceLineNo">961</span>     * Java 8 lambdas make it easy to register custom type converters:<a name="line.961"></a>
<span class="sourceLineNo">962</span>     * &lt;/p&gt;<a name="line.962"></a>
<span class="sourceLineNo">963</span>     * &lt;pre&gt;<a name="line.963"></a>
<span class="sourceLineNo">964</span>     * commandLine.registerConverter(java.nio.file.Path.class, s -&amp;gt; java.nio.file.Paths.get(s));<a name="line.964"></a>
<span class="sourceLineNo">965</span>     * commandLine.registerConverter(java.time.Duration.class, s -&amp;gt; java.time.Duration.parse(s));&lt;/pre&gt;<a name="line.965"></a>
<span class="sourceLineNo">966</span>     * &lt;p&gt;<a name="line.966"></a>
<span class="sourceLineNo">967</span>     * Built-in type converters are pre-registered for the following java 1.5 types:<a name="line.967"></a>
<span class="sourceLineNo">968</span>     * &lt;/p&gt;<a name="line.968"></a>
<span class="sourceLineNo">969</span>     * &lt;ul&gt;<a name="line.969"></a>
<span class="sourceLineNo">970</span>     *   &lt;li&gt;all primitive types&lt;/li&gt;<a name="line.970"></a>
<span class="sourceLineNo">971</span>     *   &lt;li&gt;all primitive wrapper types: Boolean, Byte, Character, Double, Float, Integer, Long, Short&lt;/li&gt;<a name="line.971"></a>
<span class="sourceLineNo">972</span>     *   &lt;li&gt;any enum&lt;/li&gt;<a name="line.972"></a>
<span class="sourceLineNo">973</span>     *   &lt;li&gt;java.io.File&lt;/li&gt;<a name="line.973"></a>
<span class="sourceLineNo">974</span>     *   &lt;li&gt;java.math.BigDecimal&lt;/li&gt;<a name="line.974"></a>
<span class="sourceLineNo">975</span>     *   &lt;li&gt;java.math.BigInteger&lt;/li&gt;<a name="line.975"></a>
<span class="sourceLineNo">976</span>     *   &lt;li&gt;java.net.InetAddress&lt;/li&gt;<a name="line.976"></a>
<span class="sourceLineNo">977</span>     *   &lt;li&gt;java.net.URI&lt;/li&gt;<a name="line.977"></a>
<span class="sourceLineNo">978</span>     *   &lt;li&gt;java.net.URL&lt;/li&gt;<a name="line.978"></a>
<span class="sourceLineNo">979</span>     *   &lt;li&gt;java.nio.charset.Charset&lt;/li&gt;<a name="line.979"></a>
<span class="sourceLineNo">980</span>     *   &lt;li&gt;java.sql.Time&lt;/li&gt;<a name="line.980"></a>
<span class="sourceLineNo">981</span>     *   &lt;li&gt;java.util.Date&lt;/li&gt;<a name="line.981"></a>
<span class="sourceLineNo">982</span>     *   &lt;li&gt;java.util.UUID&lt;/li&gt;<a name="line.982"></a>
<span class="sourceLineNo">983</span>     *   &lt;li&gt;java.util.regex.Pattern&lt;/li&gt;<a name="line.983"></a>
<span class="sourceLineNo">984</span>     *   &lt;li&gt;StringBuilder&lt;/li&gt;<a name="line.984"></a>
<span class="sourceLineNo">985</span>     *   &lt;li&gt;CharSequence&lt;/li&gt;<a name="line.985"></a>
<span class="sourceLineNo">986</span>     *   &lt;li&gt;String&lt;/li&gt;<a name="line.986"></a>
<span class="sourceLineNo">987</span>     * &lt;/ul&gt;<a name="line.987"></a>
<span class="sourceLineNo">988</span>     * &lt;p&gt;The specified converter will be registered with this {@code CommandLine} and the full hierarchy of its<a name="line.988"></a>
<span class="sourceLineNo">989</span>     * subcommands and nested sub-subcommands &lt;em&gt;at the moment the converter is registered&lt;/em&gt;. Subcommands added<a name="line.989"></a>
<span class="sourceLineNo">990</span>     * later will not have this converter added automatically. To ensure a custom type converter is available to all<a name="line.990"></a>
<span class="sourceLineNo">991</span>     * subcommands, register the type converter last, after adding subcommands.&lt;/p&gt;<a name="line.991"></a>
<span class="sourceLineNo">992</span>     *<a name="line.992"></a>
<span class="sourceLineNo">993</span>     * @param cls the target class to convert parameter string values to<a name="line.993"></a>
<span class="sourceLineNo">994</span>     * @param converter the class capable of converting string values to the specified target type<a name="line.994"></a>
<span class="sourceLineNo">995</span>     * @param &lt;K&gt; the target type<a name="line.995"></a>
<span class="sourceLineNo">996</span>     * @return this CommandLine object, to allow method chaining<a name="line.996"></a>
<span class="sourceLineNo">997</span>     * @see #addSubcommand(String, Object)<a name="line.997"></a>
<span class="sourceLineNo">998</span>     */<a name="line.998"></a>
<span class="sourceLineNo">999</span>    public &lt;K&gt; CommandLine registerConverter(final Class&lt;K&gt; cls, final ITypeConverter&lt;K&gt; converter) {<a name="line.999"></a>
<span class="sourceLineNo">1000</span>        interpreter.converterRegistry.put(Assert.notNull(cls, "class"), Assert.notNull(converter, "converter"));<a name="line.1000"></a>
<span class="sourceLineNo">1001</span>        for (final CommandLine command : interpreter.commands.values()) {<a name="line.1001"></a>
<span class="sourceLineNo">1002</span>            command.registerConverter(cls, converter);<a name="line.1002"></a>
<span class="sourceLineNo">1003</span>        }<a name="line.1003"></a>
<span class="sourceLineNo">1004</span>        return this;<a name="line.1004"></a>
<span class="sourceLineNo">1005</span>    }<a name="line.1005"></a>
<span class="sourceLineNo">1006</span><a name="line.1006"></a>
<span class="sourceLineNo">1007</span>    /** Returns the String that separates option names from option values when parsing command line options. {@value Help#DEFAULT_SEPARATOR} by default.<a name="line.1007"></a>
<span class="sourceLineNo">1008</span>     * @return the String the parser uses to separate option names from option values */<a name="line.1008"></a>
<span class="sourceLineNo">1009</span>    public String getSeparator() {<a name="line.1009"></a>
<span class="sourceLineNo">1010</span>        return interpreter.separator;<a name="line.1010"></a>
<span class="sourceLineNo">1011</span>    }<a name="line.1011"></a>
<span class="sourceLineNo">1012</span><a name="line.1012"></a>
<span class="sourceLineNo">1013</span>    /** Sets the String the parser uses to separate option names from option values to the specified value.<a name="line.1013"></a>
<span class="sourceLineNo">1014</span>     * The separator may also be set declaratively with the {@link CommandLine.Command#separator()} annotation attribute.<a name="line.1014"></a>
<span class="sourceLineNo">1015</span>     * @param separator the String that separates option names from option values<a name="line.1015"></a>
<span class="sourceLineNo">1016</span>     * @return this {@code CommandLine} object, to allow method chaining */<a name="line.1016"></a>
<span class="sourceLineNo">1017</span>    public CommandLine setSeparator(final String separator) {<a name="line.1017"></a>
<span class="sourceLineNo">1018</span>        interpreter.separator = Assert.notNull(separator, "separator");<a name="line.1018"></a>
<span class="sourceLineNo">1019</span>        return this;<a name="line.1019"></a>
<span class="sourceLineNo">1020</span>    }<a name="line.1020"></a>
<span class="sourceLineNo">1021</span><a name="line.1021"></a>
<span class="sourceLineNo">1022</span>    /** Returns the command name (also called program name) displayed in the usage help synopsis. {@value Help#DEFAULT_COMMAND_NAME} by default.<a name="line.1022"></a>
<span class="sourceLineNo">1023</span>     * @return the command name (also called program name) displayed in the usage */<a name="line.1023"></a>
<span class="sourceLineNo">1024</span>    public String getCommandName() {<a name="line.1024"></a>
<span class="sourceLineNo">1025</span>        return commandName;<a name="line.1025"></a>
<span class="sourceLineNo">1026</span>    }<a name="line.1026"></a>
<span class="sourceLineNo">1027</span><a name="line.1027"></a>
<span class="sourceLineNo">1028</span>    /** Sets the command name (also called program name) displayed in the usage help synopsis to the specified value.<a name="line.1028"></a>
<span class="sourceLineNo">1029</span>     * Note that this method only modifies the usage help message, it does not impact parsing behaviour.<a name="line.1029"></a>
<span class="sourceLineNo">1030</span>     * The command name may also be set declaratively with the {@link CommandLine.Command#name()} annotation attribute.<a name="line.1030"></a>
<span class="sourceLineNo">1031</span>     * @param commandName command name (also called program name) displayed in the usage help synopsis<a name="line.1031"></a>
<span class="sourceLineNo">1032</span>     * @return this {@code CommandLine} object, to allow method chaining */<a name="line.1032"></a>
<span class="sourceLineNo">1033</span>    public CommandLine setCommandName(final String commandName) {<a name="line.1033"></a>
<span class="sourceLineNo">1034</span>        this.commandName = Assert.notNull(commandName, "commandName");<a name="line.1034"></a>
<span class="sourceLineNo">1035</span>        return this;<a name="line.1035"></a>
<span class="sourceLineNo">1036</span>    }<a name="line.1036"></a>
<span class="sourceLineNo">1037</span>    private static boolean empty(final String str) { return str == null || str.trim().length() == 0; }<a name="line.1037"></a>
<span class="sourceLineNo">1038</span>    private static boolean empty(final Object[] array) { return array == null || array.length == 0; }<a name="line.1038"></a>
<span class="sourceLineNo">1039</span>    private static boolean empty(final Text txt) { return txt == null || txt.plain.toString().trim().length() == 0; }<a name="line.1039"></a>
<span class="sourceLineNo">1040</span>    private static String str(final String[] arr, final int i) { return (arr == null || arr.length == 0) ? "" : arr[i]; }<a name="line.1040"></a>
<span class="sourceLineNo">1041</span>    private static boolean isBoolean(final Class&lt;?&gt; type) { return type == Boolean.class || type == Boolean.TYPE; }<a name="line.1041"></a>
<span class="sourceLineNo">1042</span>    private static CommandLine toCommandLine(final Object obj) { return obj instanceof CommandLine ? (CommandLine) obj : new CommandLine(obj);}<a name="line.1042"></a>
<span class="sourceLineNo">1043</span>    private static boolean isMultiValue(final Field field) {  return isMultiValue(field.getType()); }<a name="line.1043"></a>
<span class="sourceLineNo">1044</span>    private static boolean isMultiValue(final Class&lt;?&gt; cls) { return cls.isArray() || Collection.class.isAssignableFrom(cls) || Map.class.isAssignableFrom(cls); }<a name="line.1044"></a>
<span class="sourceLineNo">1045</span>    private static Class&lt;?&gt;[] getTypeAttribute(final Field field) {<a name="line.1045"></a>
<span class="sourceLineNo">1046</span>        final Class&lt;?&gt;[] explicit = field.isAnnotationPresent(Parameters.class) ? field.getAnnotation(Parameters.class).type() : field.getAnnotation(Option.class).type();<a name="line.1046"></a>
<span class="sourceLineNo">1047</span>        if (explicit.length &gt; 0) { return explicit; }<a name="line.1047"></a>
<span class="sourceLineNo">1048</span>        if (field.getType().isArray()) { return new Class&lt;?&gt;[] { field.getType().getComponentType() }; }<a name="line.1048"></a>
<span class="sourceLineNo">1049</span>        if (isMultiValue(field)) {<a name="line.1049"></a>
<span class="sourceLineNo">1050</span>            final Type type = field.getGenericType(); // e.g. Map&lt;Long, ? extends Number&gt;<a name="line.1050"></a>
<span class="sourceLineNo">1051</span>            if (type instanceof ParameterizedType) {<a name="line.1051"></a>
<span class="sourceLineNo">1052</span>                final ParameterizedType parameterizedType = (ParameterizedType) type;<a name="line.1052"></a>
<span class="sourceLineNo">1053</span>                final Type[] paramTypes = parameterizedType.getActualTypeArguments(); // e.g. ? extends Number<a name="line.1053"></a>
<span class="sourceLineNo">1054</span>                final Class&lt;?&gt;[] result = new Class&lt;?&gt;[paramTypes.length];<a name="line.1054"></a>
<span class="sourceLineNo">1055</span>                for (int i = 0; i &lt; paramTypes.length; i++) {<a name="line.1055"></a>
<span class="sourceLineNo">1056</span>                    if (paramTypes[i] instanceof Class) { result[i] = (Class&lt;?&gt;) paramTypes[i]; continue; } // e.g. Long<a name="line.1056"></a>
<span class="sourceLineNo">1057</span>                    if (paramTypes[i] instanceof WildcardType) { // e.g. ? extends Number<a name="line.1057"></a>
<span class="sourceLineNo">1058</span>                        final WildcardType wildcardType = (WildcardType) paramTypes[i];<a name="line.1058"></a>
<span class="sourceLineNo">1059</span>                        final Type[] lower = wildcardType.getLowerBounds(); // e.g. []<a name="line.1059"></a>
<span class="sourceLineNo">1060</span>                        if (lower.length &gt; 0 &amp;&amp; lower[0] instanceof Class) { result[i] = (Class&lt;?&gt;) lower[0]; continue; }<a name="line.1060"></a>
<span class="sourceLineNo">1061</span>                        final Type[] upper = wildcardType.getUpperBounds(); // e.g. Number<a name="line.1061"></a>
<span class="sourceLineNo">1062</span>                        if (upper.length &gt; 0 &amp;&amp; upper[0] instanceof Class) { result[i] = (Class&lt;?&gt;) upper[0]; continue; }<a name="line.1062"></a>
<span class="sourceLineNo">1063</span>                    }<a name="line.1063"></a>
<span class="sourceLineNo">1064</span>                    Arrays.fill(result, String.class); return result; // too convoluted generic type, giving up<a name="line.1064"></a>
<span class="sourceLineNo">1065</span>                }<a name="line.1065"></a>
<span class="sourceLineNo">1066</span>                return result; // we inferred all types from ParameterizedType<a name="line.1066"></a>
<span class="sourceLineNo">1067</span>            }<a name="line.1067"></a>
<span class="sourceLineNo">1068</span>            return new Class&lt;?&gt;[] {String.class, String.class}; // field is multi-value but not ParameterizedType<a name="line.1068"></a>
<span class="sourceLineNo">1069</span>        }<a name="line.1069"></a>
<span class="sourceLineNo">1070</span>        return new Class&lt;?&gt;[] {field.getType()}; // not a multi-value field<a name="line.1070"></a>
<span class="sourceLineNo">1071</span>    }<a name="line.1071"></a>
<span class="sourceLineNo">1072</span>    /**<a name="line.1072"></a>
<span class="sourceLineNo">1073</span>     * &lt;p&gt;<a name="line.1073"></a>
<span class="sourceLineNo">1074</span>     * Annotate fields in your class with {@code @Option} and picocli will initialize these fields when matching<a name="line.1074"></a>
<span class="sourceLineNo">1075</span>     * arguments are specified on the command line.<a name="line.1075"></a>
<span class="sourceLineNo">1076</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.1076"></a>
<span class="sourceLineNo">1077</span>     * For example:<a name="line.1077"></a>
<span class="sourceLineNo">1078</span>     * &lt;/p&gt;<a name="line.1078"></a>
<span class="sourceLineNo">1079</span>     * &lt;pre&gt;import static picocli.CommandLine.*;<a name="line.1079"></a>
<span class="sourceLineNo">1080</span>     *<a name="line.1080"></a>
<span class="sourceLineNo">1081</span>     * public class MyClass {<a name="line.1081"></a>
<span class="sourceLineNo">1082</span>     *     &amp;#064;Parameters(type = File.class, description = "Any number of input files")<a name="line.1082"></a>
<span class="sourceLineNo">1083</span>     *     private List&amp;lt;File&amp;gt; files = new ArrayList&amp;lt;File&amp;gt;();<a name="line.1083"></a>
<span class="sourceLineNo">1084</span>     *<a name="line.1084"></a>
<span class="sourceLineNo">1085</span>     *     &amp;#064;Option(names = { "-o", "--out" }, description = "Output file (default: print to console)")<a name="line.1085"></a>
<span class="sourceLineNo">1086</span>     *     private File outputFile;<a name="line.1086"></a>
<span class="sourceLineNo">1087</span>     *<a name="line.1087"></a>
<span class="sourceLineNo">1088</span>     *     &amp;#064;Option(names = { "-v", "--verbose"}, description = "Verbosely list files processed")<a name="line.1088"></a>
<span class="sourceLineNo">1089</span>     *     private boolean verbose;<a name="line.1089"></a>
<span class="sourceLineNo">1090</span>     *<a name="line.1090"></a>
<span class="sourceLineNo">1091</span>     *     &amp;#064;Option(names = { "-h", "--help", "-?", "-help"}, usageHelp = true, description = "Display this help and exit")<a name="line.1091"></a>
<span class="sourceLineNo">1092</span>     *     private boolean help;<a name="line.1092"></a>
<span class="sourceLineNo">1093</span>     *<a name="line.1093"></a>
<span class="sourceLineNo">1094</span>     *     &amp;#064;Option(names = { "-V", "--version"}, versionHelp = true, description = "Display version information and exit")<a name="line.1094"></a>
<span class="sourceLineNo">1095</span>     *     private boolean version;<a name="line.1095"></a>
<span class="sourceLineNo">1096</span>     * }<a name="line.1096"></a>
<span class="sourceLineNo">1097</span>     * &lt;/pre&gt;<a name="line.1097"></a>
<span class="sourceLineNo">1098</span>     * &lt;p&gt;<a name="line.1098"></a>
<span class="sourceLineNo">1099</span>     * A field cannot be annotated with both {@code @Parameters} and {@code @Option} or a<a name="line.1099"></a>
<span class="sourceLineNo">1100</span>     * {@code ParameterException} is thrown.<a name="line.1100"></a>
<span class="sourceLineNo">1101</span>     * &lt;/p&gt;<a name="line.1101"></a>
<span class="sourceLineNo">1102</span>     */<a name="line.1102"></a>
<span class="sourceLineNo">1103</span>    @Retention(RetentionPolicy.RUNTIME)<a name="line.1103"></a>
<span class="sourceLineNo">1104</span>    @Target(ElementType.FIELD)<a name="line.1104"></a>
<span class="sourceLineNo">1105</span>    public @interface Option {<a name="line.1105"></a>
<span class="sourceLineNo">1106</span>        /**<a name="line.1106"></a>
<span class="sourceLineNo">1107</span>         * One or more option names. At least one option name is required.<a name="line.1107"></a>
<span class="sourceLineNo">1108</span>         * &lt;p&gt;<a name="line.1108"></a>
<span class="sourceLineNo">1109</span>         * Different environments have different conventions for naming options, but usually options have a prefix<a name="line.1109"></a>
<span class="sourceLineNo">1110</span>         * that sets them apart from parameters.<a name="line.1110"></a>
<span class="sourceLineNo">1111</span>         * Picocli supports all of the below styles. The default separator is {@code '='}, but this can be configured.<a name="line.1111"></a>
<span class="sourceLineNo">1112</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1112"></a>
<span class="sourceLineNo">1113</span>         * &lt;b&gt;*nix&lt;/b&gt;<a name="line.1113"></a>
<span class="sourceLineNo">1114</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1114"></a>
<span class="sourceLineNo">1115</span>         * In Unix and Linux, options have a short (single-character) name, a long name or both.<a name="line.1115"></a>
<span class="sourceLineNo">1116</span>         * Short options<a name="line.1116"></a>
<span class="sourceLineNo">1117</span>         * (&lt;a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html#tag_12_02"&gt;POSIX<a name="line.1117"></a>
<span class="sourceLineNo">1118</span>         * style&lt;/a&gt; are single-character and are preceded by the {@code '-'} character, e.g., {@code `-v'}.<a name="line.1118"></a>
<span class="sourceLineNo">1119</span>         * &lt;a href="https://www.gnu.org/software/tar/manual/html_node/Long-Options.html"&gt;GNU-style&lt;/a&gt; long<a name="line.1119"></a>
<span class="sourceLineNo">1120</span>         * (or &lt;em&gt;mnemonic&lt;/em&gt;) options start with two dashes in a row, e.g., {@code `--file'}.<a name="line.1120"></a>
<span class="sourceLineNo">1121</span>         * &lt;/p&gt;&lt;p&gt;Picocli supports the POSIX convention that short options can be grouped, with the last option<a name="line.1121"></a>
<span class="sourceLineNo">1122</span>         * optionally taking a parameter, which may be attached to the option name or separated by a space or<a name="line.1122"></a>
<span class="sourceLineNo">1123</span>         * a {@code '='} character. The below examples are all equivalent:<a name="line.1123"></a>
<span class="sourceLineNo">1124</span>         * &lt;/p&gt;&lt;pre&gt;<a name="line.1124"></a>
<span class="sourceLineNo">1125</span>         * -xvfFILE<a name="line.1125"></a>
<span class="sourceLineNo">1126</span>         * -xvf FILE<a name="line.1126"></a>
<span class="sourceLineNo">1127</span>         * -xvf=FILE<a name="line.1127"></a>
<span class="sourceLineNo">1128</span>         * -xv --file FILE<a name="line.1128"></a>
<span class="sourceLineNo">1129</span>         * -xv --file=FILE<a name="line.1129"></a>
<span class="sourceLineNo">1130</span>         * -x -v --file FILE<a name="line.1130"></a>
<span class="sourceLineNo">1131</span>         * -x -v --file=FILE<a name="line.1131"></a>
<span class="sourceLineNo">1132</span>         * &lt;/pre&gt;&lt;p&gt;<a name="line.1132"></a>
<span class="sourceLineNo">1133</span>         * &lt;b&gt;DOS&lt;/b&gt;<a name="line.1133"></a>
<span class="sourceLineNo">1134</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1134"></a>
<span class="sourceLineNo">1135</span>         * DOS options mostly have upper case single-character names and start with a single slash {@code '/'} character.<a name="line.1135"></a>
<span class="sourceLineNo">1136</span>         * Option parameters are separated by a {@code ':'} character. Options cannot be grouped together but<a name="line.1136"></a>
<span class="sourceLineNo">1137</span>         * must be specified separately. For example:<a name="line.1137"></a>
<span class="sourceLineNo">1138</span>         * &lt;/p&gt;&lt;pre&gt;<a name="line.1138"></a>
<span class="sourceLineNo">1139</span>         * DIR /S /A:D /T:C<a name="line.1139"></a>
<span class="sourceLineNo">1140</span>         * &lt;/pre&gt;&lt;p&gt;<a name="line.1140"></a>
<span class="sourceLineNo">1141</span>         * &lt;b&gt;PowerShell&lt;/b&gt;<a name="line.1141"></a>
<span class="sourceLineNo">1142</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1142"></a>
<span class="sourceLineNo">1143</span>         * Windows PowerShell options generally are a word preceded by a single {@code '-'} character, e.g., {@code `-Help'}.<a name="line.1143"></a>
<span class="sourceLineNo">1144</span>         * Option parameters are separated by a space or by a {@code ':'} character.<a name="line.1144"></a>
<span class="sourceLineNo">1145</span>         * &lt;/p&gt;<a name="line.1145"></a>
<span class="sourceLineNo">1146</span>         * @return one or more option names<a name="line.1146"></a>
<span class="sourceLineNo">1147</span>         */<a name="line.1147"></a>
<span class="sourceLineNo">1148</span>        String[] names();<a name="line.1148"></a>
<span class="sourceLineNo">1149</span><a name="line.1149"></a>
<span class="sourceLineNo">1150</span>        /**<a name="line.1150"></a>
<span class="sourceLineNo">1151</span>         * Indicates whether this option is required. By default this is false.<a name="line.1151"></a>
<span class="sourceLineNo">1152</span>         * If an option is required, but a user invokes the program without specifying the required option,<a name="line.1152"></a>
<span class="sourceLineNo">1153</span>         * a {@link MissingParameterException} is thrown from the {@link #parse(String...)} method.<a name="line.1153"></a>
<span class="sourceLineNo">1154</span>         * @return whether this option is required<a name="line.1154"></a>
<span class="sourceLineNo">1155</span>         */<a name="line.1155"></a>
<span class="sourceLineNo">1156</span>        boolean required() default false;<a name="line.1156"></a>
<span class="sourceLineNo">1157</span><a name="line.1157"></a>
<span class="sourceLineNo">1158</span>        /**<a name="line.1158"></a>
<span class="sourceLineNo">1159</span>         * Set {@code help=true} if this option should disable validation of the remaining arguments:<a name="line.1159"></a>
<span class="sourceLineNo">1160</span>         * If the {@code help} option is specified, no error message is generated for missing required options.<a name="line.1160"></a>
<span class="sourceLineNo">1161</span>         * &lt;p&gt;<a name="line.1161"></a>
<span class="sourceLineNo">1162</span>         * This attribute is useful for special options like help ({@code -h} and {@code --help} on unix,<a name="line.1162"></a>
<span class="sourceLineNo">1163</span>         * {@code -?} and {@code -Help} on Windows) or version ({@code -V} and {@code --version} on unix,<a name="line.1163"></a>
<span class="sourceLineNo">1164</span>         * {@code -Version} on Windows).<a name="line.1164"></a>
<span class="sourceLineNo">1165</span>         * &lt;/p&gt;<a name="line.1165"></a>
<span class="sourceLineNo">1166</span>         * &lt;p&gt;<a name="line.1166"></a>
<span class="sourceLineNo">1167</span>         * Note that the {@link #parse(String...)} method will not print help documentation. It will only set<a name="line.1167"></a>
<span class="sourceLineNo">1168</span>         * the value of the annotated field. It is the responsibility of the caller to inspect the annotated fields<a name="line.1168"></a>
<span class="sourceLineNo">1169</span>         * and take the appropriate action.<a name="line.1169"></a>
<span class="sourceLineNo">1170</span>         * &lt;/p&gt;<a name="line.1170"></a>
<span class="sourceLineNo">1171</span>         * @return whether this option disables validation of the other arguments<a name="line.1171"></a>
<span class="sourceLineNo">1172</span>         * @deprecated Use {@link #usageHelp()} and {@link #versionHelp()} instead. See {@link #printHelpIfRequested(List, PrintStream, CommandLine.Help.Ansi)}<a name="line.1172"></a>
<span class="sourceLineNo">1173</span>         */<a name="line.1173"></a>
<span class="sourceLineNo">1174</span>        boolean help() default false;<a name="line.1174"></a>
<span class="sourceLineNo">1175</span><a name="line.1175"></a>
<span class="sourceLineNo">1176</span>        /**<a name="line.1176"></a>
<span class="sourceLineNo">1177</span>         * Set {@code usageHelp=true} if this option allows the user to request usage help. If this option is<a name="line.1177"></a>
<span class="sourceLineNo">1178</span>         * specified on the command line, picocli will not validate the remaining arguments (so no "missing required<a name="line.1178"></a>
<span class="sourceLineNo">1179</span>         * option" errors) and the {@link CommandLine#isUsageHelpRequested()} method will return {@code true}.<a name="line.1179"></a>
<span class="sourceLineNo">1180</span>         * &lt;p&gt;<a name="line.1180"></a>
<span class="sourceLineNo">1181</span>         * This attribute is useful for special options like help ({@code -h} and {@code --help} on unix,<a name="line.1181"></a>
<span class="sourceLineNo">1182</span>         * {@code -?} and {@code -Help} on Windows).<a name="line.1182"></a>
<span class="sourceLineNo">1183</span>         * &lt;/p&gt;<a name="line.1183"></a>
<span class="sourceLineNo">1184</span>         * &lt;p&gt;<a name="line.1184"></a>
<span class="sourceLineNo">1185</span>         * Note that the {@link #parse(String...)} method will not print usage help documentation. It will only set<a name="line.1185"></a>
<span class="sourceLineNo">1186</span>         * the value of the annotated field. It is the responsibility of the caller to inspect the annotated fields<a name="line.1186"></a>
<span class="sourceLineNo">1187</span>         * and take the appropriate action.<a name="line.1187"></a>
<span class="sourceLineNo">1188</span>         * &lt;/p&gt;<a name="line.1188"></a>
<span class="sourceLineNo">1189</span>         * @return whether this option allows the user to request usage help<a name="line.1189"></a>
<span class="sourceLineNo">1190</span>         * @since 0.9.8<a name="line.1190"></a>
<span class="sourceLineNo">1191</span>         */<a name="line.1191"></a>
<span class="sourceLineNo">1192</span>        boolean usageHelp() default false;<a name="line.1192"></a>
<span class="sourceLineNo">1193</span><a name="line.1193"></a>
<span class="sourceLineNo">1194</span>        /**<a name="line.1194"></a>
<span class="sourceLineNo">1195</span>         * Set {@code versionHelp=true} if this option allows the user to request version information. If this option is<a name="line.1195"></a>
<span class="sourceLineNo">1196</span>         * specified on the command line, picocli will not validate the remaining arguments (so no "missing required<a name="line.1196"></a>
<span class="sourceLineNo">1197</span>         * option" errors) and the {@link CommandLine#isVersionHelpRequested()} method will return {@code true}.<a name="line.1197"></a>
<span class="sourceLineNo">1198</span>         * &lt;p&gt;<a name="line.1198"></a>
<span class="sourceLineNo">1199</span>         * This attribute is useful for special options like version ({@code -V} and {@code --version} on unix,<a name="line.1199"></a>
<span class="sourceLineNo">1200</span>         * {@code -Version} on Windows).<a name="line.1200"></a>
<span class="sourceLineNo">1201</span>         * &lt;/p&gt;<a name="line.1201"></a>
<span class="sourceLineNo">1202</span>         * &lt;p&gt;<a name="line.1202"></a>
<span class="sourceLineNo">1203</span>         * Note that the {@link #parse(String...)} method will not print version information. It will only set<a name="line.1203"></a>
<span class="sourceLineNo">1204</span>         * the value of the annotated field. It is the responsibility of the caller to inspect the annotated fields<a name="line.1204"></a>
<span class="sourceLineNo">1205</span>         * and take the appropriate action.<a name="line.1205"></a>
<span class="sourceLineNo">1206</span>         * &lt;/p&gt;<a name="line.1206"></a>
<span class="sourceLineNo">1207</span>         * @return whether this option allows the user to request version information<a name="line.1207"></a>
<span class="sourceLineNo">1208</span>         * @since 0.9.8<a name="line.1208"></a>
<span class="sourceLineNo">1209</span>         */<a name="line.1209"></a>
<span class="sourceLineNo">1210</span>        boolean versionHelp() default false;<a name="line.1210"></a>
<span class="sourceLineNo">1211</span><a name="line.1211"></a>
<span class="sourceLineNo">1212</span>        /**<a name="line.1212"></a>
<span class="sourceLineNo">1213</span>         * Description of this option, used when generating the usage documentation.<a name="line.1213"></a>
<span class="sourceLineNo">1214</span>         * @return the description of this option<a name="line.1214"></a>
<span class="sourceLineNo">1215</span>         */<a name="line.1215"></a>
<span class="sourceLineNo">1216</span>        String[] description() default {};<a name="line.1216"></a>
<span class="sourceLineNo">1217</span><a name="line.1217"></a>
<span class="sourceLineNo">1218</span>        /**<a name="line.1218"></a>
<span class="sourceLineNo">1219</span>         * Specifies the minimum number of required parameters and the maximum number of accepted parameters.<a name="line.1219"></a>
<span class="sourceLineNo">1220</span>         * If an option declares a positive arity, and the user specifies an insufficient number of parameters on the<a name="line.1220"></a>
<span class="sourceLineNo">1221</span>         * command line, a {@link MissingParameterException} is thrown by the {@link #parse(String...)} method.<a name="line.1221"></a>
<span class="sourceLineNo">1222</span>         * &lt;p&gt;<a name="line.1222"></a>
<span class="sourceLineNo">1223</span>         * In many cases picocli can deduce the number of required parameters from the field's type.<a name="line.1223"></a>
<span class="sourceLineNo">1224</span>         * By default, flags (boolean options) have arity zero,<a name="line.1224"></a>
<span class="sourceLineNo">1225</span>         * and single-valued type fields (String, int, Integer, double, Double, File, Date, etc) have arity one.<a name="line.1225"></a>
<span class="sourceLineNo">1226</span>         * Generally, fields with types that cannot hold multiple values can omit the {@code arity} attribute.<a name="line.1226"></a>
<span class="sourceLineNo">1227</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1227"></a>
<span class="sourceLineNo">1228</span>         * Fields used to capture options with arity two or higher should have a type that can hold multiple values,<a name="line.1228"></a>
<span class="sourceLineNo">1229</span>         * like arrays or Collections. See {@link #type()} for strongly-typed Collection fields.<a name="line.1229"></a>
<span class="sourceLineNo">1230</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1230"></a>
<span class="sourceLineNo">1231</span>         * For example, if an option has 2 required parameters and any number of optional parameters,<a name="line.1231"></a>
<span class="sourceLineNo">1232</span>         * specify {@code @Option(names = "-example", arity = "2..*")}.<a name="line.1232"></a>
<span class="sourceLineNo">1233</span>         * &lt;/p&gt;<a name="line.1233"></a>
<span class="sourceLineNo">1234</span>         * &lt;b&gt;A note on boolean options&lt;/b&gt;<a name="line.1234"></a>
<span class="sourceLineNo">1235</span>         * &lt;p&gt;<a name="line.1235"></a>
<span class="sourceLineNo">1236</span>         * By default picocli does not expect boolean options (also called "flags" or "switches") to have a parameter.<a name="line.1236"></a>
<span class="sourceLineNo">1237</span>         * You can make a boolean option take a required parameter by annotating your field with {@code arity="1"}.<a name="line.1237"></a>
<span class="sourceLineNo">1238</span>         * For example: &lt;/p&gt;<a name="line.1238"></a>
<span class="sourceLineNo">1239</span>         * &lt;pre&gt;&amp;#064;Option(names = "-v", arity = "1") boolean verbose;&lt;/pre&gt;<a name="line.1239"></a>
<span class="sourceLineNo">1240</span>         * &lt;p&gt;<a name="line.1240"></a>
<span class="sourceLineNo">1241</span>         * Because this boolean field is defined with arity 1, the user must specify either {@code &lt;program&gt; -v false}<a name="line.1241"></a>
<span class="sourceLineNo">1242</span>         * or {@code &lt;program&gt; -v true}<a name="line.1242"></a>
<span class="sourceLineNo">1243</span>         * on the command line, or a {@link MissingParameterException} is thrown by the {@link #parse(String...)}<a name="line.1243"></a>
<span class="sourceLineNo">1244</span>         * method.<a name="line.1244"></a>
<span class="sourceLineNo">1245</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1245"></a>
<span class="sourceLineNo">1246</span>         * To make the boolean parameter possible but optional, define the field with {@code arity = "0..1"}.<a name="line.1246"></a>
<span class="sourceLineNo">1247</span>         * For example: &lt;/p&gt;<a name="line.1247"></a>
<span class="sourceLineNo">1248</span>         * &lt;pre&gt;&amp;#064;Option(names="-v", arity="0..1") boolean verbose;&lt;/pre&gt;<a name="line.1248"></a>
<span class="sourceLineNo">1249</span>         * &lt;p&gt;This will accept any of the below without throwing an exception:&lt;/p&gt;<a name="line.1249"></a>
<span class="sourceLineNo">1250</span>         * &lt;pre&gt;<a name="line.1250"></a>
<span class="sourceLineNo">1251</span>         * -v<a name="line.1251"></a>
<span class="sourceLineNo">1252</span>         * -v true<a name="line.1252"></a>
<span class="sourceLineNo">1253</span>         * -v false<a name="line.1253"></a>
<span class="sourceLineNo">1254</span>         * &lt;/pre&gt;<a name="line.1254"></a>
<span class="sourceLineNo">1255</span>         * @return how many arguments this option requires<a name="line.1255"></a>
<span class="sourceLineNo">1256</span>         */<a name="line.1256"></a>
<span class="sourceLineNo">1257</span>        String arity() default "";<a name="line.1257"></a>
<span class="sourceLineNo">1258</span><a name="line.1258"></a>
<span class="sourceLineNo">1259</span>        /**<a name="line.1259"></a>
<span class="sourceLineNo">1260</span>         * Specify a {@code paramLabel} for the option parameter to be used in the usage help message. If omitted,<a name="line.1260"></a>
<span class="sourceLineNo">1261</span>         * picocli uses the field name in fish brackets ({@code '&lt;'} and {@code '&gt;'}) by default. Example:<a name="line.1261"></a>
<span class="sourceLineNo">1262</span>         * &lt;pre&gt;class Example {<a name="line.1262"></a>
<span class="sourceLineNo">1263</span>         *     &amp;#064;Option(names = {"-o", "--output"}, paramLabel="FILE", description="path of the output file")<a name="line.1263"></a>
<span class="sourceLineNo">1264</span>         *     private File out;<a name="line.1264"></a>
<span class="sourceLineNo">1265</span>         *     &amp;#064;Option(names = {"-j", "--jobs"}, arity="0..1", description="Allow N jobs at once; infinite jobs with no arg.")<a name="line.1265"></a>
<span class="sourceLineNo">1266</span>         *     private int maxJobs = -1;<a name="line.1266"></a>
<span class="sourceLineNo">1267</span>         * }&lt;/pre&gt;<a name="line.1267"></a>
<span class="sourceLineNo">1268</span>         * &lt;p&gt;By default, the above gives a usage help message like the following:&lt;/p&gt;&lt;pre&gt;<a name="line.1268"></a>
<span class="sourceLineNo">1269</span>         * Usage: &amp;lt;main class&amp;gt; [OPTIONS]<a name="line.1269"></a>
<span class="sourceLineNo">1270</span>         * -o, --output FILE       path of the output file<a name="line.1270"></a>
<span class="sourceLineNo">1271</span>         * -j, --jobs [&amp;lt;maxJobs&amp;gt;]  Allow N jobs at once; infinite jobs with no arg.<a name="line.1271"></a>
<span class="sourceLineNo">1272</span>         * &lt;/pre&gt;<a name="line.1272"></a>
<span class="sourceLineNo">1273</span>         * @return name of the option parameter used in the usage help message<a name="line.1273"></a>
<span class="sourceLineNo">1274</span>         */<a name="line.1274"></a>
<span class="sourceLineNo">1275</span>        String paramLabel() default "";<a name="line.1275"></a>
<span class="sourceLineNo">1276</span><a name="line.1276"></a>
<span class="sourceLineNo">1277</span>        /** &lt;p&gt;<a name="line.1277"></a>
<span class="sourceLineNo">1278</span>         * Optionally specify a {@code type} to control exactly what Class the option parameter should be converted<a name="line.1278"></a>
<span class="sourceLineNo">1279</span>         * to. This may be useful when the field type is an interface or an abstract class. For example, a field can<a name="line.1279"></a>
<span class="sourceLineNo">1280</span>         * be declared to have type {@code java.lang.Number}, and annotating {@code @Option(type=Short.class)}<a name="line.1280"></a>
<span class="sourceLineNo">1281</span>         * ensures that the option parameter value is converted to a {@code Short} before setting the field value.<a name="line.1281"></a>
<span class="sourceLineNo">1282</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1282"></a>
<span class="sourceLineNo">1283</span>         * For array fields whose &lt;em&gt;component&lt;/em&gt; type is an interface or abstract class, specify the concrete &lt;em&gt;component&lt;/em&gt; type.<a name="line.1283"></a>
<span class="sourceLineNo">1284</span>         * For example, a field with type {@code Number[]} may be annotated with {@code @Option(type=Short.class)}<a name="line.1284"></a>
<span class="sourceLineNo">1285</span>         * to ensure that option parameter values are converted to {@code Short} before adding an element to the array.<a name="line.1285"></a>
<span class="sourceLineNo">1286</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1286"></a>
<span class="sourceLineNo">1287</span>         * Picocli will use the {@link ITypeConverter} that is<a name="line.1287"></a>
<span class="sourceLineNo">1288</span>         * {@linkplain #registerConverter(Class, ITypeConverter) registered} for the specified type to convert<a name="line.1288"></a>
<span class="sourceLineNo">1289</span>         * the raw String values before modifying the field value.<a name="line.1289"></a>
<span class="sourceLineNo">1290</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1290"></a>
<span class="sourceLineNo">1291</span>         * Prior to 2.0, the {@code type} attribute was necessary for {@code Collection} and {@code Map} fields,<a name="line.1291"></a>
<span class="sourceLineNo">1292</span>         * but starting from 2.0 picocli will infer the component type from the generic type's type arguments.<a name="line.1292"></a>
<span class="sourceLineNo">1293</span>         * For example, for a field of type {@code Map&lt;TimeUnit, Long&gt;} picocli will know the option parameter<a name="line.1293"></a>
<span class="sourceLineNo">1294</span>         * should be split up in key=value pairs, where the key should be converted to a {@code java.util.concurrent.TimeUnit}<a name="line.1294"></a>
<span class="sourceLineNo">1295</span>         * enum value, and the value should be converted to a {@code Long}. No {@code @Option(type=...)} type attribute<a name="line.1295"></a>
<span class="sourceLineNo">1296</span>         * is required for this. For generic types with wildcards, picocli will take the specified upper or lower bound<a name="line.1296"></a>
<span class="sourceLineNo">1297</span>         * as the Class to convert to, unless the {@code @Option} annotation specifies an explicit {@code type} attribute.<a name="line.1297"></a>
<span class="sourceLineNo">1298</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1298"></a>
<span class="sourceLineNo">1299</span>         * If the field type is a raw collection or a raw map, and you want it to contain other values than Strings,<a name="line.1299"></a>
<span class="sourceLineNo">1300</span>         * or if the generic type's type arguments are interfaces or abstract classes, you may<a name="line.1300"></a>
<span class="sourceLineNo">1301</span>         * specify a {@code type} attribute to control the Class that the option parameter should be converted to.<a name="line.1301"></a>
<span class="sourceLineNo">1302</span>         * @return the type(s) to convert the raw String values<a name="line.1302"></a>
<span class="sourceLineNo">1303</span>         */<a name="line.1303"></a>
<span class="sourceLineNo">1304</span>        Class&lt;?&gt;[] type() default {};<a name="line.1304"></a>
<span class="sourceLineNo">1305</span><a name="line.1305"></a>
<span class="sourceLineNo">1306</span>        /**<a name="line.1306"></a>
<span class="sourceLineNo">1307</span>         * Specify a regular expression to use to split option parameter values before applying them to the field.<a name="line.1307"></a>
<span class="sourceLineNo">1308</span>         * All elements resulting from the split are added to the array or Collection. Ignored for single-value fields.<a name="line.1308"></a>
<span class="sourceLineNo">1309</span>         * @return a regular expression to split option parameter values or {@code ""} if the value should not be split<a name="line.1309"></a>
<span class="sourceLineNo">1310</span>         * @see String#split(String)<a name="line.1310"></a>
<span class="sourceLineNo">1311</span>         */<a name="line.1311"></a>
<span class="sourceLineNo">1312</span>        String split() default "";<a name="line.1312"></a>
<span class="sourceLineNo">1313</span><a name="line.1313"></a>
<span class="sourceLineNo">1314</span>        /**<a name="line.1314"></a>
<span class="sourceLineNo">1315</span>         * Set {@code hidden=true} if this option should not be included in the usage documentation.<a name="line.1315"></a>
<span class="sourceLineNo">1316</span>         * @return whether this option should be excluded from the usage message<a name="line.1316"></a>
<span class="sourceLineNo">1317</span>         */<a name="line.1317"></a>
<span class="sourceLineNo">1318</span>        boolean hidden() default false;<a name="line.1318"></a>
<span class="sourceLineNo">1319</span>    }<a name="line.1319"></a>
<span class="sourceLineNo">1320</span>    /**<a name="line.1320"></a>
<span class="sourceLineNo">1321</span>     * &lt;p&gt;<a name="line.1321"></a>
<span class="sourceLineNo">1322</span>     * Fields annotated with {@code @Parameters} will be initialized with positional parameters. By specifying the<a name="line.1322"></a>
<span class="sourceLineNo">1323</span>     * {@link #index()} attribute you can pick which (or what range) of the positional parameters to apply. If no index<a name="line.1323"></a>
<span class="sourceLineNo">1324</span>     * is specified, the field will get all positional parameters (so it should be an array or a collection).<a name="line.1324"></a>
<span class="sourceLineNo">1325</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.1325"></a>
<span class="sourceLineNo">1326</span>     * When parsing the command line arguments, picocli first tries to match arguments to {@link Option Options}.<a name="line.1326"></a>
<span class="sourceLineNo">1327</span>     * Positional parameters are the arguments that follow the options, or the arguments that follow a "--" (double<a name="line.1327"></a>
<span class="sourceLineNo">1328</span>     * dash) argument on the command line.<a name="line.1328"></a>
<span class="sourceLineNo">1329</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.1329"></a>
<span class="sourceLineNo">1330</span>     * For example:<a name="line.1330"></a>
<span class="sourceLineNo">1331</span>     * &lt;/p&gt;<a name="line.1331"></a>
<span class="sourceLineNo">1332</span>     * &lt;pre&gt;import static picocli.CommandLine.*;<a name="line.1332"></a>
<span class="sourceLineNo">1333</span>     *<a name="line.1333"></a>
<span class="sourceLineNo">1334</span>     * public class MyCalcParameters {<a name="line.1334"></a>
<span class="sourceLineNo">1335</span>     *     &amp;#064;Parameters(type = BigDecimal.class, description = "Any number of input numbers")<a name="line.1335"></a>
<span class="sourceLineNo">1336</span>     *     private List&amp;lt;BigDecimal&amp;gt; files = new ArrayList&amp;lt;BigDecimal&amp;gt;();<a name="line.1336"></a>
<span class="sourceLineNo">1337</span>     *<a name="line.1337"></a>
<span class="sourceLineNo">1338</span>     *     &amp;#064;Option(names = { "-h", "--help", "-?", "-help"}, help = true, description = "Display this help and exit")<a name="line.1338"></a>
<span class="sourceLineNo">1339</span>     *     private boolean help;<a name="line.1339"></a>
<span class="sourceLineNo">1340</span>     * }<a name="line.1340"></a>
<span class="sourceLineNo">1341</span>     * &lt;/pre&gt;&lt;p&gt;<a name="line.1341"></a>
<span class="sourceLineNo">1342</span>     * A field cannot be annotated with both {@code @Parameters} and {@code @Option} or a {@code ParameterException}<a name="line.1342"></a>
<span class="sourceLineNo">1343</span>     * is thrown.&lt;/p&gt;<a name="line.1343"></a>
<span class="sourceLineNo">1344</span>     */<a name="line.1344"></a>
<span class="sourceLineNo">1345</span>    @Retention(RetentionPolicy.RUNTIME)<a name="line.1345"></a>
<span class="sourceLineNo">1346</span>    @Target(ElementType.FIELD)<a name="line.1346"></a>
<span class="sourceLineNo">1347</span>    public @interface Parameters {<a name="line.1347"></a>
<span class="sourceLineNo">1348</span>        /** Specify an index ("0", or "1", etc.) to pick which of the command line arguments should be assigned to this<a name="line.1348"></a>
<span class="sourceLineNo">1349</span>         * field. For array or Collection fields, you can also specify an index range ("0..3", or "2..*", etc.) to assign<a name="line.1349"></a>
<span class="sourceLineNo">1350</span>         * a subset of the command line arguments to this field. The default is "*", meaning all command line arguments.<a name="line.1350"></a>
<span class="sourceLineNo">1351</span>         * @return an index or range specifying which of the command line arguments should be assigned to this field<a name="line.1351"></a>
<span class="sourceLineNo">1352</span>         */<a name="line.1352"></a>
<span class="sourceLineNo">1353</span>        String index() default "*";<a name="line.1353"></a>
<span class="sourceLineNo">1354</span><a name="line.1354"></a>
<span class="sourceLineNo">1355</span>        /** Description of the parameter(s), used when generating the usage documentation.<a name="line.1355"></a>
<span class="sourceLineNo">1356</span>         * @return the description of the parameter(s)<a name="line.1356"></a>
<span class="sourceLineNo">1357</span>         */<a name="line.1357"></a>
<span class="sourceLineNo">1358</span>        String[] description() default {};<a name="line.1358"></a>
<span class="sourceLineNo">1359</span><a name="line.1359"></a>
<span class="sourceLineNo">1360</span>        /**<a name="line.1360"></a>
<span class="sourceLineNo">1361</span>         * Specifies the minimum number of required parameters and the maximum number of accepted parameters. If a<a name="line.1361"></a>
<span class="sourceLineNo">1362</span>         * positive arity is declared, and the user specifies an insufficient number of parameters on the command line,<a name="line.1362"></a>
<span class="sourceLineNo">1363</span>         * {@link MissingParameterException} is thrown by the {@link #parse(String...)} method.<a name="line.1363"></a>
<span class="sourceLineNo">1364</span>         * &lt;p&gt;The default depends on the type of the parameter: booleans require no parameters, arrays and Collections<a name="line.1364"></a>
<span class="sourceLineNo">1365</span>         * accept zero to any number of parameters, and any other type accepts one parameter.&lt;/p&gt;<a name="line.1365"></a>
<span class="sourceLineNo">1366</span>         * @return the range of minimum and maximum parameters accepted by this command<a name="line.1366"></a>
<span class="sourceLineNo">1367</span>         */<a name="line.1367"></a>
<span class="sourceLineNo">1368</span>        String arity() default "";<a name="line.1368"></a>
<span class="sourceLineNo">1369</span><a name="line.1369"></a>
<span class="sourceLineNo">1370</span>        /**<a name="line.1370"></a>
<span class="sourceLineNo">1371</span>         * Specify a {@code paramLabel} for the parameter to be used in the usage help message. If omitted,<a name="line.1371"></a>
<span class="sourceLineNo">1372</span>         * picocli uses the field name in fish brackets ({@code '&lt;'} and {@code '&gt;'}) by default. Example:<a name="line.1372"></a>
<span class="sourceLineNo">1373</span>         * &lt;pre&gt;class Example {<a name="line.1373"></a>
<span class="sourceLineNo">1374</span>         *     &amp;#064;Parameters(paramLabel="FILE", description="path of the input FILE(s)")<a name="line.1374"></a>
<span class="sourceLineNo">1375</span>         *     private File[] inputFiles;<a name="line.1375"></a>
<span class="sourceLineNo">1376</span>         * }&lt;/pre&gt;<a name="line.1376"></a>
<span class="sourceLineNo">1377</span>         * &lt;p&gt;By default, the above gives a usage help message like the following:&lt;/p&gt;&lt;pre&gt;<a name="line.1377"></a>
<span class="sourceLineNo">1378</span>         * Usage: &amp;lt;main class&amp;gt; [FILE...]<a name="line.1378"></a>
<span class="sourceLineNo">1379</span>         * [FILE...]       path of the input FILE(s)<a name="line.1379"></a>
<span class="sourceLineNo">1380</span>         * &lt;/pre&gt;<a name="line.1380"></a>
<span class="sourceLineNo">1381</span>         * @return name of the positional parameter used in the usage help message<a name="line.1381"></a>
<span class="sourceLineNo">1382</span>         */<a name="line.1382"></a>
<span class="sourceLineNo">1383</span>        String paramLabel() default "";<a name="line.1383"></a>
<span class="sourceLineNo">1384</span><a name="line.1384"></a>
<span class="sourceLineNo">1385</span>        /**<a name="line.1385"></a>
<span class="sourceLineNo">1386</span>         * &lt;p&gt;<a name="line.1386"></a>
<span class="sourceLineNo">1387</span>         * Optionally specify a {@code type} to control exactly what Class the positional parameter should be converted<a name="line.1387"></a>
<span class="sourceLineNo">1388</span>         * to. This may be useful when the field type is an interface or an abstract class. For example, a field can<a name="line.1388"></a>
<span class="sourceLineNo">1389</span>         * be declared to have type {@code java.lang.Number}, and annotating {@code @Parameters(type=Short.class)}<a name="line.1389"></a>
<span class="sourceLineNo">1390</span>         * ensures that the positional parameter value is converted to a {@code Short} before setting the field value.<a name="line.1390"></a>
<span class="sourceLineNo">1391</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1391"></a>
<span class="sourceLineNo">1392</span>         * For array fields whose &lt;em&gt;component&lt;/em&gt; type is an interface or abstract class, specify the concrete &lt;em&gt;component&lt;/em&gt; type.<a name="line.1392"></a>
<span class="sourceLineNo">1393</span>         * For example, a field with type {@code Number[]} may be annotated with {@code @Parameters(type=Short.class)}<a name="line.1393"></a>
<span class="sourceLineNo">1394</span>         * to ensure that positional parameter values are converted to {@code Short} before adding an element to the array.<a name="line.1394"></a>
<span class="sourceLineNo">1395</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1395"></a>
<span class="sourceLineNo">1396</span>         * Picocli will use the {@link ITypeConverter} that is<a name="line.1396"></a>
<span class="sourceLineNo">1397</span>         * {@linkplain #registerConverter(Class, ITypeConverter) registered} for the specified type to convert<a name="line.1397"></a>
<span class="sourceLineNo">1398</span>         * the raw String values before modifying the field value.<a name="line.1398"></a>
<span class="sourceLineNo">1399</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1399"></a>
<span class="sourceLineNo">1400</span>         * Prior to 2.0, the {@code type} attribute was necessary for {@code Collection} and {@code Map} fields,<a name="line.1400"></a>
<span class="sourceLineNo">1401</span>         * but starting from 2.0 picocli will infer the component type from the generic type's type arguments.<a name="line.1401"></a>
<span class="sourceLineNo">1402</span>         * For example, for a field of type {@code Map&lt;TimeUnit, Long&gt;} picocli will know the positional parameter<a name="line.1402"></a>
<span class="sourceLineNo">1403</span>         * should be split up in key=value pairs, where the key should be converted to a {@code java.util.concurrent.TimeUnit}<a name="line.1403"></a>
<span class="sourceLineNo">1404</span>         * enum value, and the value should be converted to a {@code Long}. No {@code @Parameters(type=...)} type attribute<a name="line.1404"></a>
<span class="sourceLineNo">1405</span>         * is required for this. For generic types with wildcards, picocli will take the specified upper or lower bound<a name="line.1405"></a>
<span class="sourceLineNo">1406</span>         * as the Class to convert to, unless the {@code @Parameters} annotation specifies an explicit {@code type} attribute.<a name="line.1406"></a>
<span class="sourceLineNo">1407</span>         * &lt;/p&gt;&lt;p&gt;<a name="line.1407"></a>
<span class="sourceLineNo">1408</span>         * If the field type is a raw collection or a raw map, and you want it to contain other values than Strings,<a name="line.1408"></a>
<span class="sourceLineNo">1409</span>         * or if the generic type's type arguments are interfaces or abstract classes, you may<a name="line.1409"></a>
<span class="sourceLineNo">1410</span>         * specify a {@code type} attribute to control the Class that the positional parameter should be converted to.<a name="line.1410"></a>
<span class="sourceLineNo">1411</span>         * @return the type(s) to convert the raw String values<a name="line.1411"></a>
<span class="sourceLineNo">1412</span>         */<a name="line.1412"></a>
<span class="sourceLineNo">1413</span>        Class&lt;?&gt;[] type() default {};<a name="line.1413"></a>
<span class="sourceLineNo">1414</span><a name="line.1414"></a>
<span class="sourceLineNo">1415</span>        /**<a name="line.1415"></a>
<span class="sourceLineNo">1416</span>         * Specify a regular expression to use to split positional parameter values before applying them to the field.<a name="line.1416"></a>
<span class="sourceLineNo">1417</span>         * All elements resulting from the split are added to the array or Collection. Ignored for single-value fields.<a name="line.1417"></a>
<span class="sourceLineNo">1418</span>         * @return a regular expression to split operand values or {@code ""} if the value should not be split<a name="line.1418"></a>
<span class="sourceLineNo">1419</span>         * @see String#split(String)<a name="line.1419"></a>
<span class="sourceLineNo">1420</span>         */<a name="line.1420"></a>
<span class="sourceLineNo">1421</span>        String split() default "";<a name="line.1421"></a>
<span class="sourceLineNo">1422</span><a name="line.1422"></a>
<span class="sourceLineNo">1423</span>        /**<a name="line.1423"></a>
<span class="sourceLineNo">1424</span>         * Set {@code hidden=true} if this parameter should not be included in the usage message.<a name="line.1424"></a>
<span class="sourceLineNo">1425</span>         * @return whether this parameter should be excluded from the usage message<a name="line.1425"></a>
<span class="sourceLineNo">1426</span>         */<a name="line.1426"></a>
<span class="sourceLineNo">1427</span>        boolean hidden() default false;<a name="line.1427"></a>
<span class="sourceLineNo">1428</span>    }<a name="line.1428"></a>
<span class="sourceLineNo">1429</span><a name="line.1429"></a>
<span class="sourceLineNo">1430</span>    /**<a name="line.1430"></a>
<span class="sourceLineNo">1431</span>     * &lt;p&gt;Annotate your class with {@code @Command} when you want more control over the format of the generated help<a name="line.1431"></a>
<span class="sourceLineNo">1432</span>     * message.<a name="line.1432"></a>
<span class="sourceLineNo">1433</span>     * &lt;/p&gt;&lt;pre&gt;<a name="line.1433"></a>
<span class="sourceLineNo">1434</span>     * &amp;#064;Command(name      = "Encrypt",<a name="line.1434"></a>
<span class="sourceLineNo">1435</span>     *        description = "Encrypt FILE(s), or standard input, to standard output or to the output file.",<a name="line.1435"></a>
<span class="sourceLineNo">1436</span>     *        footer      = "Copyright (c) 2017")<a name="line.1436"></a>
<span class="sourceLineNo">1437</span>     * public class Encrypt {<a name="line.1437"></a>
<span class="sourceLineNo">1438</span>     *     &amp;#064;Parameters(paramLabel = "FILE", type = File.class, description = "Any number of input files")<a name="line.1438"></a>
<span class="sourceLineNo">1439</span>     *     private List&amp;lt;File&amp;gt; files     = new ArrayList&amp;lt;File&amp;gt;();<a name="line.1439"></a>
<span class="sourceLineNo">1440</span>     *<a name="line.1440"></a>
<span class="sourceLineNo">1441</span>     *     &amp;#064;Option(names = { "-o", "--out" }, description = "Output file (default: print to console)")<a name="line.1441"></a>
<span class="sourceLineNo">1442</span>     *     private File outputFile;<a name="line.1442"></a>
<span class="sourceLineNo">1443</span>     * }&lt;/pre&gt;<a name="line.1443"></a>
<span class="sourceLineNo">1444</span>     * &lt;p&gt;<a name="line.1444"></a>
<span class="sourceLineNo">1445</span>     * The structure of a help message looks like this:<a name="line.1445"></a>
<span class="sourceLineNo">1446</span>     * &lt;/p&gt;&lt;ul&gt;<a name="line.1446"></a>
<span class="sourceLineNo">1447</span>     *   &lt;li&gt;[header]&lt;/li&gt;<a name="line.1447"></a>
<span class="sourceLineNo">1448</span>     *   &lt;li&gt;[synopsis]: {@code Usage: &lt;commandName&gt; [OPTIONS] [FILE...]}&lt;/li&gt;<a name="line.1448"></a>
<span class="sourceLineNo">1449</span>     *   &lt;li&gt;[description]&lt;/li&gt;<a name="line.1449"></a>
<span class="sourceLineNo">1450</span>     *   &lt;li&gt;[parameter list]: {@code      [FILE...]   Any number of input files}&lt;/li&gt;<a name="line.1450"></a>
<span class="sourceLineNo">1451</span>     *   &lt;li&gt;[option list]: {@code   -h, --help   prints this help message and exits}&lt;/li&gt;<a name="line.1451"></a>
<span class="sourceLineNo">1452</span>     *   &lt;li&gt;[footer]&lt;/li&gt;<a name="line.1452"></a>
<span class="sourceLineNo">1453</span>     * &lt;/ul&gt; */<a name="line.1453"></a>
<span class="sourceLineNo">1454</span>    @Retention(RetentionPolicy.RUNTIME)<a name="line.1454"></a>
<span class="sourceLineNo">1455</span>    @Target({ElementType.TYPE, ElementType.LOCAL_VARIABLE, ElementType.PACKAGE})<a name="line.1455"></a>
<span class="sourceLineNo">1456</span>    public @interface Command {<a name="line.1456"></a>
<span class="sourceLineNo">1457</span>        /** Program name to show in the synopsis. If omitted, {@code "&lt;main class&gt;"} is used.<a name="line.1457"></a>
<span class="sourceLineNo">1458</span>         * For {@linkplain #subcommands() declaratively added} subcommands, this attribute is also used<a name="line.1458"></a>
<span class="sourceLineNo">1459</span>         * by the parser to recognize subcommands in the command line arguments.<a name="line.1459"></a>
<span class="sourceLineNo">1460</span>         * @return the program name to show in the synopsis<a name="line.1460"></a>
<span class="sourceLineNo">1461</span>         * @see Help#commandName */<a name="line.1461"></a>
<span class="sourceLineNo">1462</span>        String name() default "&lt;main class&gt;";<a name="line.1462"></a>
<span class="sourceLineNo">1463</span><a name="line.1463"></a>
<span class="sourceLineNo">1464</span>        /** A list of classes to instantiate and register as subcommands. When registering subcommands declaratively<a name="line.1464"></a>
<span class="sourceLineNo">1465</span>         * like this, you don't need to call the {@link CommandLine#addSubcommand(String, Object)} method. For example, this:<a name="line.1465"></a>
<span class="sourceLineNo">1466</span>         * &lt;pre&gt;<a name="line.1466"></a>
<span class="sourceLineNo">1467</span>         * &amp;#064;Command(subcommands = {<a name="line.1467"></a>
<span class="sourceLineNo">1468</span>         *         GitStatus.class,<a name="line.1468"></a>
<span class="sourceLineNo">1469</span>         *         GitCommit.class,<a name="line.1469"></a>
<span class="sourceLineNo">1470</span>         *         GitBranch.class })<a name="line.1470"></a>
<span class="sourceLineNo">1471</span>         * public class Git { ... }<a name="line.1471"></a>
<span class="sourceLineNo">1472</span>         *<a name="line.1472"></a>
<span class="sourceLineNo">1473</span>         * CommandLine commandLine = new CommandLine(new Git());<a name="line.1473"></a>
<span class="sourceLineNo">1474</span>         * &lt;/pre&gt; is equivalent to this:<a name="line.1474"></a>
<span class="sourceLineNo">1475</span>         * &lt;pre&gt;<a name="line.1475"></a>
<span class="sourceLineNo">1476</span>         * // alternative: programmatically add subcommands.<a name="line.1476"></a>
<span class="sourceLineNo">1477</span>         * // NOTE: in this case there should be no `subcommands` attribute on the @Command annotation.<a name="line.1477"></a>
<span class="sourceLineNo">1478</span>         * &amp;#064;Command public class Git { ... }<a name="line.1478"></a>
<span class="sourceLineNo">1479</span>         *<a name="line.1479"></a>
<span class="sourceLineNo">1480</span>         * CommandLine commandLine = new CommandLine(new Git())<a name="line.1480"></a>
<span class="sourceLineNo">1481</span>         *         .addSubcommand("status",   new GitStatus())<a name="line.1481"></a>
<span class="sourceLineNo">1482</span>         *         .addSubcommand("commit",   new GitCommit())<a name="line.1482"></a>
<span class="sourceLineNo">1483</span>         *         .addSubcommand("branch",   new GitBranch());<a name="line.1483"></a>
<span class="sourceLineNo">1484</span>         * &lt;/pre&gt;<a name="line.1484"></a>
<span class="sourceLineNo">1485</span>         * @return the declaratively registered subcommands of this command, or an empty array if none<a name="line.1485"></a>
<span class="sourceLineNo">1486</span>         * @see CommandLine#addSubcommand(String, Object)<a name="line.1486"></a>
<span class="sourceLineNo">1487</span>         * @since 0.9.8<a name="line.1487"></a>
<span class="sourceLineNo">1488</span>         */<a name="line.1488"></a>
<span class="sourceLineNo">1489</span>        Class&lt;?&gt;[] subcommands() default {};<a name="line.1489"></a>
<span class="sourceLineNo">1490</span><a name="line.1490"></a>
<span class="sourceLineNo">1491</span>        /** String that separates options from option parameters. Default is {@code "="}. Spaces are also accepted.<a name="line.1491"></a>
<span class="sourceLineNo">1492</span>         * @return the string that separates options from option parameters, used both when parsing and when generating usage help<a name="line.1492"></a>
<span class="sourceLineNo">1493</span>         * @see Help#separator<a name="line.1493"></a>
<span class="sourceLineNo">1494</span>         * @see CommandLine#setSeparator(String) */<a name="line.1494"></a>
<span class="sourceLineNo">1495</span>        String separator() default "=";<a name="line.1495"></a>
<span class="sourceLineNo">1496</span><a name="line.1496"></a>
<span class="sourceLineNo">1497</span>        /** Version information for this command, to print to the console when the user specifies an<a name="line.1497"></a>
<span class="sourceLineNo">1498</span>         * {@linkplain Option#versionHelp() option} to request version help. This is not part of the usage help message.<a name="line.1498"></a>
<span class="sourceLineNo">1499</span>         *<a name="line.1499"></a>
<span class="sourceLineNo">1500</span>         * @return a string or an array of strings with version information about this command.<a name="line.1500"></a>
<span class="sourceLineNo">1501</span>         * @since 0.9.8<a name="line.1501"></a>
<span class="sourceLineNo">1502</span>         * @see CommandLine#printVersionHelp(PrintStream)<a name="line.1502"></a>
<span class="sourceLineNo">1503</span>         */<a name="line.1503"></a>
<span class="sourceLineNo">1504</span>        String[] version() default {};<a name="line.1504"></a>
<span class="sourceLineNo">1505</span><a name="line.1505"></a>
<span class="sourceLineNo">1506</span>        /** Set the heading preceding the header section. May contain embedded {@linkplain java.util.Formatter format specifiers}.<a name="line.1506"></a>
<span class="sourceLineNo">1507</span>         * @return the heading preceding the header section<a name="line.1507"></a>
<span class="sourceLineNo">1508</span>         * @see Help#headerHeading(Object...)  */<a name="line.1508"></a>
<span class="sourceLineNo">1509</span>        String headerHeading() default "";<a name="line.1509"></a>
<span class="sourceLineNo">1510</span><a name="line.1510"></a>
<span class="sourceLineNo">1511</span>        /** Optional summary description of the command, shown before the synopsis.<a name="line.1511"></a>
<span class="sourceLineNo">1512</span>         * @return summary description of the command<a name="line.1512"></a>
<span class="sourceLineNo">1513</span>         * @see Help#header<a name="line.1513"></a>
<span class="sourceLineNo">1514</span>         * @see Help#header(Object...)  */<a name="line.1514"></a>
<span class="sourceLineNo">1515</span>        String[] header() default {};<a name="line.1515"></a>
<span class="sourceLineNo">1516</span><a name="line.1516"></a>
<span class="sourceLineNo">1517</span>        /** Set the heading preceding the synopsis text. May contain embedded<a name="line.1517"></a>
<span class="sourceLineNo">1518</span>         * {@linkplain java.util.Formatter format specifiers}. The default heading is {@code "Usage: "} (without a line<a name="line.1518"></a>
<span class="sourceLineNo">1519</span>         * break between the heading and the synopsis text).<a name="line.1519"></a>
<span class="sourceLineNo">1520</span>         * @return the heading preceding the synopsis text<a name="line.1520"></a>
<span class="sourceLineNo">1521</span>         * @see Help#synopsisHeading(Object...)  */<a name="line.1521"></a>
<span class="sourceLineNo">1522</span>        String synopsisHeading() default "Usage: ";<a name="line.1522"></a>
<span class="sourceLineNo">1523</span><a name="line.1523"></a>
<span class="sourceLineNo">1524</span>        /** Specify {@code true} to generate an abbreviated synopsis like {@code "&lt;main&gt; [OPTIONS] [PARAMETERS...]"}.<a name="line.1524"></a>
<span class="sourceLineNo">1525</span>         * By default, a detailed synopsis with individual option names and parameters is generated.<a name="line.1525"></a>
<span class="sourceLineNo">1526</span>         * @return whether the synopsis should be abbreviated<a name="line.1526"></a>
<span class="sourceLineNo">1527</span>         * @see Help#abbreviateSynopsis<a name="line.1527"></a>
<span class="sourceLineNo">1528</span>         * @see Help#abbreviatedSynopsis()<a name="line.1528"></a>
<span class="sourceLineNo">1529</span>         * @see Help#detailedSynopsis(Comparator, boolean) */<a name="line.1529"></a>
<span class="sourceLineNo">1530</span>        boolean abbreviateSynopsis() default false;<a name="line.1530"></a>
<span class="sourceLineNo">1531</span><a name="line.1531"></a>
<span class="sourceLineNo">1532</span>        /** Specify one or more custom synopsis lines to display instead of an auto-generated synopsis.<a name="line.1532"></a>
<span class="sourceLineNo">1533</span>         * @return custom synopsis text to replace the auto-generated synopsis<a name="line.1533"></a>
<span class="sourceLineNo">1534</span>         * @see Help#customSynopsis<a name="line.1534"></a>
<span class="sourceLineNo">1535</span>         * @see Help#customSynopsis(Object...) */<a name="line.1535"></a>
<span class="sourceLineNo">1536</span>        String[] customSynopsis() default {};<a name="line.1536"></a>
<span class="sourceLineNo">1537</span><a name="line.1537"></a>
<span class="sourceLineNo">1538</span>        /** Set the heading preceding the description section. May contain embedded {@linkplain java.util.Formatter format specifiers}.<a name="line.1538"></a>
<span class="sourceLineNo">1539</span>         * @return the heading preceding the description section<a name="line.1539"></a>
<span class="sourceLineNo">1540</span>         * @see Help#descriptionHeading(Object...)  */<a name="line.1540"></a>
<span class="sourceLineNo">1541</span>        String descriptionHeading() default "";<a name="line.1541"></a>
<span class="sourceLineNo">1542</span><a name="line.1542"></a>
<span class="sourceLineNo">1543</span>        /** Optional text to display between the synopsis line(s) and the list of options.<a name="line.1543"></a>
<span class="sourceLineNo">1544</span>         * @return description of this command<a name="line.1544"></a>
<span class="sourceLineNo">1545</span>         * @see Help#description<a name="line.1545"></a>
<span class="sourceLineNo">1546</span>         * @see Help#description(Object...) */<a name="line.1546"></a>
<span class="sourceLineNo">1547</span>        String[] description() default {};<a name="line.1547"></a>
<span class="sourceLineNo">1548</span><a name="line.1548"></a>
<span class="sourceLineNo">1549</span>        /** Set the heading preceding the parameters list. May contain embedded {@linkplain java.util.Formatter format specifiers}.<a name="line.1549"></a>
<span class="sourceLineNo">1550</span>         * @return the heading preceding the parameters list<a name="line.1550"></a>
<span class="sourceLineNo">1551</span>         * @see Help#parameterListHeading(Object...)  */<a name="line.1551"></a>
<span class="sourceLineNo">1552</span>        String parameterListHeading() default "";<a name="line.1552"></a>
<span class="sourceLineNo">1553</span><a name="line.1553"></a>
<span class="sourceLineNo">1554</span>        /** Set the heading preceding the options list. May contain embedded {@linkplain java.util.Formatter format specifiers}.<a name="line.1554"></a>
<span class="sourceLineNo">1555</span>         * @return the heading preceding the options list<a name="line.1555"></a>
<span class="sourceLineNo">1556</span>         * @see Help#optionListHeading(Object...)  */<a name="line.1556"></a>
<span class="sourceLineNo">1557</span>        String optionListHeading() default "";<a name="line.1557"></a>
<span class="sourceLineNo">1558</span><a name="line.1558"></a>
<span class="sourceLineNo">1559</span>        /** Specify {@code false} to show Options in declaration order. The default is to sort alphabetically.<a name="line.1559"></a>
<span class="sourceLineNo">1560</span>         * @return whether options should be shown in alphabetic order.<a name="line.1560"></a>
<span class="sourceLineNo">1561</span>         * @see Help#sortOptions */<a name="line.1561"></a>
<span class="sourceLineNo">1562</span>        boolean sortOptions() default true;<a name="line.1562"></a>
<span class="sourceLineNo">1563</span><a name="line.1563"></a>
<span class="sourceLineNo">1564</span>        /** Prefix required options with this character in the options list. The default is no marker: the synopsis<a name="line.1564"></a>
<span class="sourceLineNo">1565</span>         * indicates which options and parameters are required.<a name="line.1565"></a>
<span class="sourceLineNo">1566</span>         * @return the character to show in the options list to mark required options<a name="line.1566"></a>
<span class="sourceLineNo">1567</span>         * @see Help#requiredOptionMarker */<a name="line.1567"></a>
<span class="sourceLineNo">1568</span>        char requiredOptionMarker() default ' ';<a name="line.1568"></a>
<span class="sourceLineNo">1569</span><a name="line.1569"></a>
<span class="sourceLineNo">1570</span>        /** Specify {@code true} to show default values in the description column of the options list (except for<a name="line.1570"></a>
<span class="sourceLineNo">1571</span>         * boolean options). False by default.<a name="line.1571"></a>
<span class="sourceLineNo">1572</span>         * @return whether the default values for options and parameters should be shown in the description column<a name="line.1572"></a>
<span class="sourceLineNo">1573</span>         * @see Help#showDefaultValues */<a name="line.1573"></a>
<span class="sourceLineNo">1574</span>        boolean showDefaultValues() default false;<a name="line.1574"></a>
<span class="sourceLineNo">1575</span><a name="line.1575"></a>
<span class="sourceLineNo">1576</span>        /** Set the heading preceding the subcommands list. May contain embedded {@linkplain java.util.Formatter format specifiers}.<a name="line.1576"></a>
<span class="sourceLineNo">1577</span>         * The default heading is {@code "Commands:%n"} (with a line break at the end).<a name="line.1577"></a>
<span class="sourceLineNo">1578</span>         * @return the heading preceding the subcommands list<a name="line.1578"></a>
<span class="sourceLineNo">1579</span>         * @see Help#commandListHeading(Object...)  */<a name="line.1579"></a>
<span class="sourceLineNo">1580</span>        String commandListHeading() default "Commands:%n";<a name="line.1580"></a>
<span class="sourceLineNo">1581</span><a name="line.1581"></a>
<span class="sourceLineNo">1582</span>        /** Set the heading preceding the footer section. May contain embedded {@linkplain java.util.Formatter format specifiers}.<a name="line.1582"></a>
<span class="sourceLineNo">1583</span>         * @return the heading preceding the footer section<a name="line.1583"></a>
<span class="sourceLineNo">1584</span>         * @see Help#footerHeading(Object...)  */<a name="line.1584"></a>
<span class="sourceLineNo">1585</span>        String footerHeading() default "";<a name="line.1585"></a>
<span class="sourceLineNo">1586</span><a name="line.1586"></a>
<span class="sourceLineNo">1587</span>        /** Optional text to display after the list of options.<a name="line.1587"></a>
<span class="sourceLineNo">1588</span>         * @return text to display after the list of options<a name="line.1588"></a>
<span class="sourceLineNo">1589</span>         * @see Help#footer<a name="line.1589"></a>
<span class="sourceLineNo">1590</span>         * @see Help#footer(Object...) */<a name="line.1590"></a>
<span class="sourceLineNo">1591</span>        String[] footer() default {};<a name="line.1591"></a>
<span class="sourceLineNo">1592</span>    }<a name="line.1592"></a>
<span class="sourceLineNo">1593</span>    /**<a name="line.1593"></a>
<span class="sourceLineNo">1594</span>     * &lt;p&gt;<a name="line.1594"></a>
<span class="sourceLineNo">1595</span>     * When parsing command line arguments and initializing<a name="line.1595"></a>
<span class="sourceLineNo">1596</span>     * fields annotated with {@link Option @Option} or {@link Parameters @Parameters},<a name="line.1596"></a>
<span class="sourceLineNo">1597</span>     * String values can be converted to any type for which a {@code ITypeConverter} is registered.<a name="line.1597"></a>
<span class="sourceLineNo">1598</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.1598"></a>
<span class="sourceLineNo">1599</span>     * This interface defines the contract for classes that know how to convert a String into some domain object.<a name="line.1599"></a>
<span class="sourceLineNo">1600</span>     * Custom converters can be registered with the {@link #registerConverter(Class, ITypeConverter)} method.<a name="line.1600"></a>
<span class="sourceLineNo">1601</span>     * &lt;/p&gt;&lt;p&gt;<a name="line.1601"></a>
<span class="sourceLineNo">1602</span>     * Java 8 lambdas make it easy to register custom type converters:<a name="line.1602"></a>
<span class="sourceLineNo">1603</span>     * &lt;/p&gt;<a name="line.1603"></a>
<span class="sourceLineNo">1604</span>     * &lt;pre&gt;<a name="line.1604"></a>
<span class="sourceLineNo">1605</span>     * commandLine.registerConverter(java.nio.file.Path.class, s -&amp;gt; java.nio.file.Paths.get(s));<a name="line.1605"></a>
<span class="sourceLineNo">1606</span>     * commandLine.registerConverter(java.time.Duration.class, s -&amp;gt; java.time.Duration.parse(s));&lt;/pre&gt;<a name="line.1606"></a>
<span class="sourceLineNo">1607</span>     * &lt;p&gt;<a name="line.1607"></a>
<span class="sourceLineNo">1608</span>     * Built-in type converters are pre-registered for the following java 1.5 types:<a name="line.1608"></a>
<span class="sourceLineNo">1609</span>     * &lt;/p&gt;<a name="line.1609"></a>
<span class="sourceLineNo">1610</span>     * &lt;ul&gt;<a name="line.1610"></a>
<span class="sourceLineNo">1611</span>     *   &lt;li&gt;all primitive types&lt;/li&gt;<a name="line.1611"></a>
<span class="sourceLineNo">1612</span>     *   &lt;li&gt;all primitive wrapper types: Boolean, Byte, Character, Double, Float, Integer, Long, Short&lt;/li&gt;<a name="line.1612"></a>
<span class="sourceLineNo">1613</span>     *   &lt;li&gt;any enum&lt;/li&gt;<a name="line.1613"></a>
<span class="sourceLineNo">1614</span>     *   &lt;li&gt;java.io.File&lt;/li&gt;<a name="line.1614"></a>
<span class="sourceLineNo">1615</span>     *   &lt;li&gt;java.math.BigDecimal&lt;/li&gt;<a name="line.1615"></a>
<span class="sourceLineNo">1616</span>     *   &lt;li&gt;java.math.BigInteger&lt;/li&gt;<a name="line.1616"></a>
<span class="sourceLineNo">1617</span>     *   &lt;li&gt;java.net.InetAddress&lt;/li&gt;<a name="line.1617"></a>
<span class="sourceLineNo">1618</span>     *   &lt;li&gt;java.net.URI&lt;/li&gt;<a name="line.1618"></a>
<span class="sourceLineNo">1619</span>     *   &lt;li&gt;java.net.URL&lt;/li&gt;<a name="line.1619"></a>
<span class="sourceLineNo">1620</span>     *   &lt;li&gt;java.nio.charset.Charset&lt;/li&gt;<a name="line.1620"></a>
<span class="sourceLineNo">1621</span>     *   &lt;li&gt;java.sql.Time&lt;/li&gt;<a name="line.1621"></a>
<span class="sourceLineNo">1622</span>     *   &lt;li&gt;java.util.Date&lt;/li&gt;<a name="line.1622"></a>
<span class="sourceLineNo">1623</span>     *   &lt;li&gt;java.util.UUID&lt;/li&gt;<a name="line.1623"></a>
<span class="sourceLineNo">1624</span>     *   &lt;li&gt;java.util.regex.Pattern&lt;/li&gt;<a name="line.1624"></a>
<span class="sourceLineNo">1625</span>     *   &lt;li&gt;StringBuilder&lt;/li&gt;<a name="line.1625"></a>
<span class="sourceLineNo">1626</span>     *   &lt;li&gt;CharSequence&lt;/li&gt;<a name="line.1626"></a>
<span class="sourceLineNo">1627</span>     *   &lt;li&gt;String&lt;/li&gt;<a name="line.1627"></a>
<span class="sourceLineNo">1628</span>     * &lt;/ul&gt;<a name="line.1628"></a>
<span class="sourceLineNo">1629</span>     * @param &lt;K&gt; the type of the object that is the result of the conversion<a name="line.1629"></a>
<span class="sourceLineNo">1630</span>     */<a name="line.1630"></a>
<span class="sourceLineNo">1631</span>    public interface ITypeConverter&lt;K&gt; {<a name="line.1631"></a>
<span class="sourceLineNo">1632</span>        /**<a name="line.1632"></a>
<span class="sourceLineNo">1633</span>         * Converts the specified command line argument value to some domain object.<a name="line.1633"></a>
<span class="sourceLineNo">1634</span>         * @param value the command line argument String value<a name="line.1634"></a>
<span class="sourceLineNo">1635</span>         * @return the resulting domain object<a name="line.1635"></a>
<span class="sourceLineNo">1636</span>         * @throws Exception an exception detailing what went wrong during the conversion<a name="line.1636"></a>
<span class="sourceLineNo">1637</span>         */<a name="line.1637"></a>
<span class="sourceLineNo">1638</span>        K convert(String value) throws Exception;<a name="line.1638"></a>
<span class="sourceLineNo">1639</span>    }<a name="line.1639"></a>
<span class="sourceLineNo">1640</span>    /** Describes the number of parameters required and accepted by an option or a positional parameter.<a name="line.1640"></a>
<span class="sourceLineNo">1641</span>     * @since 0.9.7<a name="line.1641"></a>
<span class="sourceLineNo">1642</span>     */<a name="line.1642"></a>
<span class="sourceLineNo">1643</span>    public static class Range implements Comparable&lt;Range&gt; {<a name="line.1643"></a>
<span class="sourceLineNo">1644</span>        /** Required number of parameters for an option or positional parameter. */<a name="line.1644"></a>
<span class="sourceLineNo">1645</span>        public final int min;<a name="line.1645"></a>
<span class="sourceLineNo">1646</span>        /** Maximum accepted number of parameters for an option or positional parameter. */<a name="line.1646"></a>
<span class="sourceLineNo">1647</span>        public final int max;<a name="line.1647"></a>
<span class="sourceLineNo">1648</span>        public final boolean isVariable;<a name="line.1648"></a>
<span class="sourceLineNo">1649</span>        private final boolean isUnspecified;<a name="line.1649"></a>
<span class="sourceLineNo">1650</span>        private final String originalValue;<a name="line.1650"></a>
<span class="sourceLineNo">1651</span><a name="line.1651"></a>
<span class="sourceLineNo">1652</span>        /** Constructs a new Range object with the specified parameters.<a name="line.1652"></a>
<span class="sourceLineNo">1653</span>         * @param min minimum number of required parameters<a name="line.1653"></a>
<span class="sourceLineNo">1654</span>         * @param max maximum number of allowed parameters (or Integer.MAX_VALUE if variable)<a name="line.1654"></a>
<span class="sourceLineNo">1655</span>         * @param variable {@code true} if any number or parameters is allowed, {@code false} otherwise<a name="line.1655"></a>
<span class="sourceLineNo">1656</span>         * @param unspecified {@code true} if no arity was specified on the option/parameter (value is based on type)<a name="line.1656"></a>
<span class="sourceLineNo">1657</span>         * @param originalValue the original value that was specified on the option or parameter<a name="line.1657"></a>
<span class="sourceLineNo">1658</span>         */<a name="line.1658"></a>
<span class="sourceLineNo">1659</span>        public Range(final int min, final int max, final boolean variable, final boolean unspecified, final String originalValue) {<a name="line.1659"></a>
<span class="sourceLineNo">1660</span>            this.min = min;<a name="line.1660"></a>
<span class="sourceLineNo">1661</span>            this.max = max;<a name="line.1661"></a>
<span class="sourceLineNo">1662</span>            this.isVariable = variable;<a name="line.1662"></a>
<span class="sourceLineNo">1663</span>            this.isUnspecified = unspecified;<a name="line.1663"></a>
<span class="sourceLineNo">1664</span>            this.originalValue = originalValue;<a name="line.1664"></a>
<span class="sourceLineNo">1665</span>        }<a name="line.1665"></a>
<span class="sourceLineNo">1666</span>        /** Returns a new {@code Range} based on the {@link Option#arity()} annotation on the specified field,<a name="line.1666"></a>
<span class="sourceLineNo">1667</span>         * or the field type's default arity if no arity was specified.<a name="line.1667"></a>
<span class="sourceLineNo">1668</span>         * @param field the field whose Option annotation to inspect<a name="line.1668"></a>
<span class="sourceLineNo">1669</span>         * @return a new {@code Range} based on the Option arity annotation on the specified field */<a name="line.1669"></a>
<span class="sourceLineNo">1670</span>        public static Range optionArity(final Field field) {<a name="line.1670"></a>
<span class="sourceLineNo">1671</span>            return field.isAnnotationPresent(Option.class)<a name="line.1671"></a>
<span class="sourceLineNo">1672</span>                    ? adjustForType(Range.valueOf(field.getAnnotation(Option.class).arity()), field)<a name="line.1672"></a>
<span class="sourceLineNo">1673</span>                    : new Range(0, 0, false, true, "0");<a name="line.1673"></a>
<span class="sourceLineNo">1674</span>        }<a name="line.1674"></a>
<span class="sourceLineNo">1675</span>        /** Returns a new {@code Range} based on the {@link Parameters#arity()} annotation on the specified field,<a name="line.1675"></a>
<span class="sourceLineNo">1676</span>         * or the field type's default arity if no arity was specified.<a name="line.1676"></a>
<span class="sourceLineNo">1677</span>         * @param field the field whose Parameters annotation to inspect<a name="line.1677"></a>
<span class="sourceLineNo">1678</span>         * @return a new {@code Range} based on the Parameters arity annotation on the specified field */<a name="line.1678"></a>
<span class="sourceLineNo">1679</span>        public static Range parameterArity(final Field field) {<a name="line.1679"></a>
<span class="sourceLineNo">1680</span>            return field.isAnnotationPresent(Parameters.class)<a name="line.1680"></a>
<span class="sourceLineNo">1681</span>                    ? adjustForType(Range.valueOf(field.getAnnotation(Parameters.class).arity()), field)<a name="line.1681"></a>
<span class="sourceLineNo">1682</span>                    : new Range(0, 0, false, true, "0");<a name="line.1682"></a>
<span class="sourceLineNo">1683</span>        }<a name="line.1683"></a>
<span class="sourceLineNo">1684</span>        /** Returns a new {@code Range} based on the {@link Parameters#index()} annotation on the specified field.<a name="line.1684"></a>
<span class="sourceLineNo">1685</span>         * @param field the field whose Parameters annotation to inspect<a name="line.1685"></a>
<span class="sourceLineNo">1686</span>         * @return a new {@code Range} based on the Parameters index annotation on the specified field */<a name="line.1686"></a>
<span class="sourceLineNo">1687</span>        public static Range parameterIndex(final Field field) {<a name="line.1687"></a>
<span class="sourceLineNo">1688</span>            return field.isAnnotationPresent(Parameters.class)<a name="line.1688"></a>
<span class="sourceLineNo">1689</span>                    ? Range.valueOf(field.getAnnotation(Parameters.class).index())<a name="line.1689"></a>
<span class="sourceLineNo">1690</span>                    : new Range(0, 0, false, true, "0");<a name="line.1690"></a>
<span class="sourceLineNo">1691</span>        }<a name="line.1691"></a>
<span class="sourceLineNo">1692</span>        static Range adjustForType(final Range result, final Field field) {<a name="line.1692"></a>
<span class="sourceLineNo">1693</span>            return result.isUnspecified ? defaultArity(field) : result;<a name="line.1693"></a>
<span class="sourceLineNo">1694</span>        }<a name="line.1694"></a>
<span class="sourceLineNo">1695</span>        /** Returns the default arity {@code Range}: for {@link Option options} this is 0 for booleans and 1 for<a name="line.1695"></a>
<span class="sourceLineNo">1696</span>         * other types, for {@link Parameters parameters} booleans have arity 0, arrays or Collections have<a name="line.1696"></a>
<span class="sourceLineNo">1697</span>         * arity "0..*", and other types have arity 1.<a name="line.1697"></a>
<span class="sourceLineNo">1698</span>         * @param field the field whose default arity to return<a name="line.1698"></a>
<span class="sourceLineNo">1699</span>         * @return a new {@code Range} indicating the default arity of the specified field<a name="line.1699"></a>
<span class="sourceLineNo">1700</span>         * @since 2.0 */<a name="line.1700"></a>
<span class="sourceLineNo">1701</span>        public static Range defaultArity(final Field field) {<a name="line.1701"></a>
<span class="sourceLineNo">1702</span>            final Class&lt;?&gt; type = field.getType();<a name="line.1702"></a>
<span class="sourceLineNo">1703</span>            if (field.isAnnotationPresent(Option.class)) {<a name="line.1703"></a>
<span class="sourceLineNo">1704</span>                return defaultArity(type);<a name="line.1704"></a>
<span class="sourceLineNo">1705</span>            }<a name="line.1705"></a>
<span class="sourceLineNo">1706</span>            if (isMultiValue(type)) {<a name="line.1706"></a>
<span class="sourceLineNo">1707</span>                return Range.valueOf("0..1");<a name="line.1707"></a>
<span class="sourceLineNo">1708</span>            }<a name="line.1708"></a>
<span class="sourceLineNo">1709</span>            return Range.valueOf("1");// for single-valued fields (incl. boolean positional parameters)<a name="line.1709"></a>
<span class="sourceLineNo">1710</span>        }<a name="line.1710"></a>
<span class="sourceLineNo">1711</span>        /** Returns the default arity {@code Range} for {@link Option options}: booleans have arity 0, other types have arity 1.<a name="line.1711"></a>
<span class="sourceLineNo">1712</span>         * @param type the type whose default arity to return<a name="line.1712"></a>
<span class="sourceLineNo">1713</span>         * @return a new {@code Range} indicating the default arity of the specified type */<a name="line.1713"></a>
<span class="sourceLineNo">1714</span>        public static Range defaultArity(final Class&lt;?&gt; type) {<a name="line.1714"></a>
<span class="sourceLineNo">1715</span>            return isBoolean(type) ? Range.valueOf("0") : Range.valueOf("1");<a name="line.1715"></a>
<span class="sourceLineNo">1716</span>        }<a name="line.1716"></a>
<span class="sourceLineNo">1717</span>        private int size() { return 1 + max - min; }<a name="line.1717"></a>
<span class="sourceLineNo">1718</span>        static Range parameterCapacity(final Field field) {<a name="line.1718"></a>
<span class="sourceLineNo">1719</span>            final Range arity = parameterArity(field);<a name="line.1719"></a>
<span class="sourceLineNo">1720</span>            if (!isMultiValue(field)) { return arity; }<a name="line.1720"></a>
<span class="sourceLineNo">1721</span>            final Range index = parameterIndex(field);<a name="line.1721"></a>
<span class="sourceLineNo">1722</span>            if (arity.max == 0)    { return arity; }<a name="line.1722"></a>
<span class="sourceLineNo">1723</span>            if (index.size() == 1) { return arity; }<a name="line.1723"></a>
<span class="sourceLineNo">1724</span>            if (index.isVariable)  { return Range.valueOf(arity.min + "..*"); }<a name="line.1724"></a>
<span class="sourceLineNo">1725</span>            if (arity.size() == 1) { return Range.valueOf(arity.min * index.size() + ""); }<a name="line.1725"></a>
<span class="sourceLineNo">1726</span>            if (arity.isVariable)  { return Range.valueOf(arity.min * index.size() + "..*"); }<a name="line.1726"></a>
<span class="sourceLineNo">1727</span>            return Range.valueOf(arity.min * index.size() + ".." + arity.max * index.size());<a name="line.1727"></a>
<span class="sourceLineNo">1728</span>        }<a name="line.1728"></a>
<span class="sourceLineNo">1729</span>        /** Leniently parses the specified String as an {@code Range} value and return the result. A range string can<a name="line.1729"></a>
<span class="sourceLineNo">1730</span>         * be a fixed integer value or a range of the form {@code MIN_VALUE + ".." + MAX_VALUE}. If the<a name="line.1730"></a>
<span class="sourceLineNo">1731</span>         * {@code MIN_VALUE} string is not numeric, the minimum is zero. If the {@code MAX_VALUE} is not numeric, the<a name="line.1731"></a>
<span class="sourceLineNo">1732</span>         * range is taken to be variable and the maximum is {@code Integer.MAX_VALUE}.<a name="line.1732"></a>
<span class="sourceLineNo">1733</span>         * @param range the value range string to parse<a name="line.1733"></a>
<span class="sourceLineNo">1734</span>         * @return a new {@code Range} value */<a name="line.1734"></a>
<span class="sourceLineNo">1735</span>        public static Range valueOf(String range) {<a name="line.1735"></a>
<span class="sourceLineNo">1736</span>            range = range.trim();<a name="line.1736"></a>
<span class="sourceLineNo">1737</span>            final boolean unspecified = range.length() == 0 || range.startsWith(".."); // || range.endsWith("..");<a name="line.1737"></a>
<span class="sourceLineNo">1738</span>            int min = -1, max = -1;<a name="line.1738"></a>
<span class="sourceLineNo">1739</span>            boolean variable = false;<a name="line.1739"></a>
<span class="sourceLineNo">1740</span>            int dots = -1;<a name="line.1740"></a>
<span class="sourceLineNo">1741</span>            if ((dots = range.indexOf("..")) &gt;= 0) {<a name="line.1741"></a>
<span class="sourceLineNo">1742</span>                min = parseInt(range.substring(0, dots), 0);<a name="line.1742"></a>
<span class="sourceLineNo">1743</span>                max = parseInt(range.substring(dots + 2), Integer.MAX_VALUE);<a name="line.1743"></a>
<span class="sourceLineNo">1744</span>                variable = max == Integer.MAX_VALUE;<a name="line.1744"></a>
<span class="sourceLineNo">1745</span>            } else {<a name="line.1745"></a>
<span class="sourceLineNo">1746</span>                max = parseInt(range, Integer.MAX_VALUE);<a name="line.1746"></a>
<span class="sourceLineNo">1747</span>                variable = max == Integer.MAX_VALUE;<a name="line.1747"></a>
<span class="sourceLineNo">1748</span>                min = variable ? 0 : max;<a name="line.1748"></a>
<span class="sourceLineNo">1749</span>            }<a name="line.1749"></a>
<span class="sourceLineNo">1750</span>            final Range result = new Range(min, max, variable, unspecified, range);<a name="line.1750"></a>
<span class="sourceLineNo">1751</span>            return result;<a name="line.1751"></a>
<span class="sourceLineNo">1752</span>        }<a name="line.1752"></a>
<span class="sourceLineNo">1753</span>        private static int parseInt(final String str, final int defaultValue) {<a name="line.1753"></a>
<span class="sourceLineNo">1754</span>            try {<a name="line.1754"></a>
<span class="sourceLineNo">1755</span>                return Integer.parseInt(str);<a name="line.1755"></a>
<span class="sourceLineNo">1756</span>            } catch (final Exception ex) {<a name="line.1756"></a>
<span class="sourceLineNo">1757</span>                return defaultValue;<a name="line.1757"></a>
<span class="sourceLineNo">1758</span>            }<a name="line.1758"></a>
<span class="sourceLineNo">1759</span>        }<a name="line.1759"></a>
<span class="sourceLineNo">1760</span>        /** Returns a new Range object with the {@code min} value replaced by the specified value.<a name="line.1760"></a>
<span class="sourceLineNo">1761</span>         * The {@code max} of the returned Range is guaranteed not to be less than the new {@code min} value.<a name="line.1761"></a>
<span class="sourceLineNo">1762</span>         * @param newMin the {@code min} value of the returned Range object<a name="line.1762"></a>
<span class="sourceLineNo">1763</span>         * @return a new Range object with the specified {@code min} value */<a name="line.1763"></a>
<span class="sourceLineNo">1764</span>        public Range min(final int newMin) { return new Range(newMin, Math.max(newMin, max), isVariable, isUnspecified, originalValue); }<a name="line.1764"></a>
<span class="sourceLineNo">1765</span><a name="line.1765"></a>
<span class="sourceLineNo">1766</span>        /** Returns a new Range object with the {@code max} value replaced by the specified value.<a name="line.1766"></a>
<span class="sourceLineNo">1767</span>         * The {@code min} of the returned Range is guaranteed not to be greater than the new {@code max} value.<a name="line.1767"></a>
<span class="sourceLineNo">1768</span>         * @param newMax the {@code max} value of the returned Range object<a name="line.1768"></a>
<span class="sourceLineNo">1769</span>         * @return a new Range object with the specified {@code max} value */<a name="line.1769"></a>
<span class="sourceLineNo">1770</span>        public Range max(final int newMax) { return new Range(Math.min(min, newMax), newMax, isVariable, isUnspecified, originalValue); }<a name="line.1770"></a>
<span class="sourceLineNo">1771</span><a name="line.1771"></a>
<span class="sourceLineNo">1772</span>        /**<a name="line.1772"></a>
<span class="sourceLineNo">1773</span>         * Returns {@code true} if this Range includes the specified value, {@code false} otherwise.<a name="line.1773"></a>
<span class="sourceLineNo">1774</span>         * @param value the value to check<a name="line.1774"></a>
<span class="sourceLineNo">1775</span>         * @return {@code true} if the specified value is not less than the minimum and not greater than the maximum of this Range<a name="line.1775"></a>
<span class="sourceLineNo">1776</span>         */<a name="line.1776"></a>
<span class="sourceLineNo">1777</span>        public boolean contains(final int value) { return min &lt;= value &amp;&amp; max &gt;= value; }<a name="line.1777"></a>
<span class="sourceLineNo">1778</span><a name="line.1778"></a>
<span class="sourceLineNo">1779</span>        @Override<a name="line.1779"></a>
<span class="sourceLineNo">1780</span>        public boolean equals(final Object object) {<a name="line.1780"></a>
<span class="sourceLineNo">1781</span>            if (!(object instanceof Range)) { return false; }<a name="line.1781"></a>
<span class="sourceLineNo">1782</span>            final Range other = (Range) object;<a name="line.1782"></a>
<span class="sourceLineNo">1783</span>            return other.max == this.max &amp;&amp; other.min == this.min &amp;&amp; other.isVariable == this.isVariable;<a name="line.1783"></a>
<span class="sourceLineNo">1784</span>        }<a name="line.1784"></a>
<span class="sourceLineNo">1785</span>        @Override<a name="line.1785"></a>
<span class="sourceLineNo">1786</span>        public int hashCode() {<a name="line.1786"></a>
<span class="sourceLineNo">1787</span>            return ((17 * 37 + max) * 37 + min) * 37 + (isVariable ? 1 : 0);<a name="line.1787"></a>
<span class="sourceLineNo">1788</span>        }<a name="line.1788"></a>
<span class="sourceLineNo">1789</span>        @Override<a name="line.1789"></a>
<span class="sourceLineNo">1790</span>        public String toString() {<a name="line.1790"></a>
<span class="sourceLineNo">1791</span>            return min == max ? String.valueOf(min) : min + ".." + (isVariable ? "*" : max);<a name="line.1791"></a>
<span class="sourceLineNo">1792</span>        }<a name="line.1792"></a>
<span class="sourceLineNo">1793</span>        @Override<a name="line.1793"></a>
<span class="sourceLineNo">1794</span>        public int compareTo(final Range other) {<a name="line.1794"></a>
<span class="sourceLineNo">1795</span>            final int result = min - other.min;<a name="line.1795"></a>
<span class="sourceLineNo">1796</span>            return (result == 0) ? max - other.max : result;<a name="line.1796"></a>
<span class="sourceLineNo">1797</span>        }<a name="line.1797"></a>
<span class="sourceLineNo">1798</span>    }<a name="line.1798"></a>
<span class="sourceLineNo">1799</span>    static void init(final Class&lt;?&gt; cls,<a name="line.1799"></a>
<span class="sourceLineNo">1800</span>                              final List&lt;Field&gt; requiredFields,<a name="line.1800"></a>
<span class="sourceLineNo">1801</span>                              final Map&lt;String, Field&gt; optionName2Field,<a name="line.1801"></a>
<span class="sourceLineNo">1802</span>                              final Map&lt;Character, Field&gt; singleCharOption2Field,<a name="line.1802"></a>
<span class="sourceLineNo">1803</span>                              final List&lt;Field&gt; positionalParametersFields) {<a name="line.1803"></a>
<span class="sourceLineNo">1804</span>        final Field[] declaredFields = cls.getDeclaredFields();<a name="line.1804"></a>
<span class="sourceLineNo">1805</span>        for (final Field field : declaredFields) {<a name="line.1805"></a>
<span class="sourceLineNo">1806</span>            field.setAccessible(true);<a name="line.1806"></a>
<span class="sourceLineNo">1807</span>            if (field.isAnnotationPresent(Option.class)) {<a name="line.1807"></a>
<span class="sourceLineNo">1808</span>                final Option option = field.getAnnotation(Option.class);<a name="line.1808"></a>
<span class="sourceLineNo">1809</span>                if (option.required()) {<a name="line.1809"></a>
<span class="sourceLineNo">1810</span>                    requiredFields.add(field);<a name="line.1810"></a>
<span class="sourceLineNo">1811</span>                }<a name="line.1811"></a>
<span class="sourceLineNo">1812</span>                for (final String name : option.names()) { // cannot be null or empty<a name="line.1812"></a>
<span class="sourceLineNo">1813</span>                    final Field existing = optionName2Field.put(name, field);<a name="line.1813"></a>
<span class="sourceLineNo">1814</span>                    if (existing != null &amp;&amp; existing != field) {<a name="line.1814"></a>
<span class="sourceLineNo">1815</span>                        throw DuplicateOptionAnnotationsException.create(name, field, existing);<a name="line.1815"></a>
<span class="sourceLineNo">1816</span>                    }<a name="line.1816"></a>
<span class="sourceLineNo">1817</span>                    if (name.length() == 2 &amp;&amp; name.startsWith("-")) {<a name="line.1817"></a>
<span class="sourceLineNo">1818</span>                        final char flag = name.charAt(1);<a name="line.1818"></a>
<span class="sourceLineNo">1819</span>                        final Field existing2 = singleCharOption2Field.put(flag, field);<a name="line.1819"></a>
<span class="sourceLineNo">1820</span>                        if (existing2 != null &amp;&amp; existing2 != field) {<a name="line.1820"></a>
<span class="sourceLineNo">1821</span>                            throw DuplicateOptionAnnotationsException.create(name, field, existing2);<a name="line.1821"></a>
<span class="sourceLineNo">1822</span>                        }<a name="line.1822"></a>
<span class="sourceLineNo">1823</span>                    }<a name="line.1823"></a>
<span class="sourceLineNo">1824</span>                }<a name="line.1824"></a>
<span class="sourceLineNo">1825</span>            }<a name="line.1825"></a>
<span class="sourceLineNo">1826</span>            if (field.isAnnotationPresent(Parameters.class)) {<a name="line.1826"></a>
<span class="sourceLineNo">1827</span>                if (field.isAnnotationPresent(Option.class)) {<a name="line.1827"></a>
<span class="sourceLineNo">1828</span>                    throw new DuplicateOptionAnnotationsException("A field can be either @Option or @Parameters, but '"<a name="line.1828"></a>
<span class="sourceLineNo">1829</span>                            + field.getName() + "' is both.");<a name="line.1829"></a>
<span class="sourceLineNo">1830</span>                }<a name="line.1830"></a>
<span class="sourceLineNo">1831</span>                positionalParametersFields.add(field);<a name="line.1831"></a>
<span class="sourceLineNo">1832</span>                final Range arity = Range.parameterArity(field);<a name="line.1832"></a>
<span class="sourceLineNo">1833</span>                if (arity.min &gt; 0) {<a name="line.1833"></a>
<span class="sourceLineNo">1834</span>                    requiredFields.add(field);<a name="line.1834"></a>
<span class="sourceLineNo">1835</span>                }<a name="line.1835"></a>
<span class="sourceLineNo">1836</span>            }<a name="line.1836"></a>
<span class="sourceLineNo">1837</span>        }<a name="line.1837"></a>
<span class="sourceLineNo">1838</span>    }<a name="line.1838"></a>
<span class="sourceLineNo">1839</span>    static void validatePositionalParameters(final List&lt;Field&gt; positionalParametersFields) {<a name="line.1839"></a>
<span class="sourceLineNo">1840</span>        int min = 0;<a name="line.1840"></a>
<span class="sourceLineNo">1841</span>        for (final Field field : positionalParametersFields) {<a name="line.1841"></a>
<span class="sourceLineNo">1842</span>            final Range index = Range.parameterIndex(field);<a name="line.1842"></a>
<span class="sourceLineNo">1843</span>            if (index.min &gt; min) {<a name="line.1843"></a>
<span class="sourceLineNo">1844</span>                throw new ParameterIndexGapException("Missing field annotated with @Parameter(index=" + min +<a name="line.1844"></a>
<span class="sourceLineNo">1845</span>                        "). Nearest field '" + field.getName() + "' has index=" + index.min);<a name="line.1845"></a>
<span class="sourceLineNo">1846</span>            }<a name="line.1846"></a>
<span class="sourceLineNo">1847</span>            min = Math.max(min, index.max);<a name="line.1847"></a>
<span class="sourceLineNo">1848</span>            min = min == Integer.MAX_VALUE ? min : min + 1;<a name="line.1848"></a>
<span class="sourceLineNo">1849</span>        }<a name="line.1849"></a>
<span class="sourceLineNo">1850</span>    }<a name="line.1850"></a>
<span class="sourceLineNo">1851</span>    private static &lt;T&gt; Stack&lt;T&gt; reverse(final Stack&lt;T&gt; stack) {<a name="line.1851"></a>
<span class="sourceLineNo">1852</span>        Collections.reverse(stack);<a name="line.1852"></a>
<span class="sourceLineNo">1853</span>        return stack;<a name="line.1853"></a>
<span class="sourceLineNo">1854</span>    }<a name="line.1854"></a>
<span class="sourceLineNo">1855</span>    /**<a name="line.1855"></a>
<span class="sourceLineNo">1856</span>     * Helper class responsible for processing command line arguments.<a name="line.1856"></a>
<span class="sourceLineNo">1857</span>     */<a name="line.1857"></a>
<span class="sourceLineNo">1858</span>    private class Interpreter {<a name="line.1858"></a>
<span class="sourceLineNo">1859</span>        private final Map&lt;String, CommandLine&gt; commands                  = new LinkedHashMap&lt;String, CommandLine&gt;();<a name="line.1859"></a>
<span class="sourceLineNo">1860</span>        private final Map&lt;Class&lt;?&gt;, ITypeConverter&lt;?&gt;&gt; converterRegistry = new HashMap&lt;Class&lt;?&gt;, ITypeConverter&lt;?&gt;&gt;();<a name="line.1860"></a>
<span class="sourceLineNo">1861</span>        private final Map&lt;String, Field&gt; optionName2Field                = new HashMap&lt;String, Field&gt;();<a name="line.1861"></a>
<span class="sourceLineNo">1862</span>        private final Map&lt;Character, Field&gt; singleCharOption2Field       = new HashMap&lt;Character, Field&gt;();<a name="line.1862"></a>
<span class="sourceLineNo">1863</span>        private final List&lt;Field&gt; requiredFields                         = new ArrayList&lt;Field&gt;();<a name="line.1863"></a>
<span class="sourceLineNo">1864</span>        private final List&lt;Field&gt; positionalParametersFields             = new ArrayList&lt;Field&gt;();<a name="line.1864"></a>
<span class="sourceLineNo">1865</span>        private final Object command;<a name="line.1865"></a>
<span class="sourceLineNo">1866</span>        private boolean isHelpRequested;<a name="line.1866"></a>
<span class="sourceLineNo">1867</span>        private String separator = Help.DEFAULT_SEPARATOR;<a name="line.1867"></a>
<span class="sourceLineNo">1868</span>        private int position;<a name="line.1868"></a>
<span class="sourceLineNo">1869</span><a name="line.1869"></a>
<span class="sourceLineNo">1870</span>        Interpreter(final Object command) {<a name="line.1870"></a>
<span class="sourceLineNo">1871</span>            converterRegistry.put(Path.class,          new BuiltIn.PathConverter());<a name="line.1871"></a>
<span class="sourceLineNo">1872</span>            converterRegistry.put(Object.class,        new BuiltIn.StringConverter());<a name="line.1872"></a>
<span class="sourceLineNo">1873</span>            converterRegistry.put(String.class,        new BuiltIn.StringConverter());<a name="line.1873"></a>
<span class="sourceLineNo">1874</span>            converterRegistry.put(StringBuilder.class, new BuiltIn.StringBuilderConverter());<a name="line.1874"></a>
<span class="sourceLineNo">1875</span>            converterRegistry.put(CharSequence.class,  new BuiltIn.CharSequenceConverter());<a name="line.1875"></a>
<span class="sourceLineNo">1876</span>            converterRegistry.put(Byte.class,          new BuiltIn.ByteConverter());<a name="line.1876"></a>
<span class="sourceLineNo">1877</span>            converterRegistry.put(Byte.TYPE,           new BuiltIn.ByteConverter());<a name="line.1877"></a>
<span class="sourceLineNo">1878</span>            converterRegistry.put(Boolean.class,       new BuiltIn.BooleanConverter());<a name="line.1878"></a>
<span class="sourceLineNo">1879</span>            converterRegistry.put(Boolean.TYPE,        new BuiltIn.BooleanConverter());<a name="line.1879"></a>
<span class="sourceLineNo">1880</span>            converterRegistry.put(Character.class,     new BuiltIn.CharacterConverter());<a name="line.1880"></a>
<span class="sourceLineNo">1881</span>            converterRegistry.put(Character.TYPE,      new BuiltIn.CharacterConverter());<a name="line.1881"></a>
<span class="sourceLineNo">1882</span>            converterRegistry.put(Short.class,         new BuiltIn.ShortConverter());<a name="line.1882"></a>
<span class="sourceLineNo">1883</span>            converterRegistry.put(Short.TYPE,          new BuiltIn.ShortConverter());<a name="line.1883"></a>
<span class="sourceLineNo">1884</span>            converterRegistry.put(Integer.class,       new BuiltIn.IntegerConverter());<a name="line.1884"></a>
<span class="sourceLineNo">1885</span>            converterRegistry.put(Integer.TYPE,        new BuiltIn.IntegerConverter());<a name="line.1885"></a>
<span class="sourceLineNo">1886</span>            converterRegistry.put(Long.class,          new BuiltIn.LongConverter());<a name="line.1886"></a>
<span class="sourceLineNo">1887</span>            converterRegistry.put(Long.TYPE,           new BuiltIn.LongConverter());<a name="line.1887"></a>
<span class="sourceLineNo">1888</span>            converterRegistry.put(Float.class,         new BuiltIn.FloatConverter());<a name="line.1888"></a>
<span class="sourceLineNo">1889</span>            converterRegistry.put(Float.TYPE,          new BuiltIn.FloatConverter());<a name="line.1889"></a>
<span class="sourceLineNo">1890</span>            converterRegistry.put(Double.class,        new BuiltIn.DoubleConverter());<a name="line.1890"></a>
<span class="sourceLineNo">1891</span>            converterRegistry.put(Double.TYPE,         new BuiltIn.DoubleConverter());<a name="line.1891"></a>
<span class="sourceLineNo">1892</span>            converterRegistry.put(File.class,          new BuiltIn.FileConverter());<a name="line.1892"></a>
<span class="sourceLineNo">1893</span>            converterRegistry.put(URI.class,           new BuiltIn.URIConverter());<a name="line.1893"></a>
<span class="sourceLineNo">1894</span>            converterRegistry.put(URL.class,           new BuiltIn.URLConverter());<a name="line.1894"></a>
<span class="sourceLineNo">1895</span>            converterRegistry.put(Date.class,          new BuiltIn.ISO8601DateConverter());<a name="line.1895"></a>
<span class="sourceLineNo">1896</span>            converterRegistry.put(Time.class,          new BuiltIn.ISO8601TimeConverter());<a name="line.1896"></a>
<span class="sourceLineNo">1897</span>            converterRegistry.put(BigDecimal.class,    new BuiltIn.BigDecimalConverter());<a name="line.1897"></a>
<span class="sourceLineNo">1898</span>            converterRegistry.put(BigInteger.class,    new BuiltIn.BigIntegerConverter());<a name="line.1898"></a>
<span class="sourceLineNo">1899</span>            converterRegistry.put(Charset.class,       new BuiltIn.CharsetConverter());<a name="line.1899"></a>
<span class="sourceLineNo">1900</span>            converterRegistry.put(InetAddress.class,   new BuiltIn.InetAddressConverter());<a name="line.1900"></a>
<span class="sourceLineNo">1901</span>            converterRegistry.put(Pattern.class,       new BuiltIn.PatternConverter());<a name="line.1901"></a>
<span class="sourceLineNo">1902</span>            converterRegistry.put(UUID.class,          new BuiltIn.UUIDConverter());<a name="line.1902"></a>
<span class="sourceLineNo">1903</span><a name="line.1903"></a>
<span class="sourceLineNo">1904</span>            this.command                 = Assert.notNull(command, "command");<a name="line.1904"></a>
<span class="sourceLineNo">1905</span>            Class&lt;?&gt; cls                 = command.getClass();<a name="line.1905"></a>
<span class="sourceLineNo">1906</span>            String declaredName          = null;<a name="line.1906"></a>
<span class="sourceLineNo">1907</span>            String declaredSeparator     = null;<a name="line.1907"></a>
<span class="sourceLineNo">1908</span>            boolean hasCommandAnnotation = false;<a name="line.1908"></a>
<span class="sourceLineNo">1909</span>            while (cls != null) {<a name="line.1909"></a>
<span class="sourceLineNo">1910</span>                init(cls, requiredFields, optionName2Field, singleCharOption2Field, positionalParametersFields);<a name="line.1910"></a>
<span class="sourceLineNo">1911</span>                if (cls.isAnnotationPresent(Command.class)) {<a name="line.1911"></a>
<span class="sourceLineNo">1912</span>                    hasCommandAnnotation = true;<a name="line.1912"></a>
<span class="sourceLineNo">1913</span>                    final Command cmd = cls.getAnnotation(Command.class);<a name="line.1913"></a>
<span class="sourceLineNo">1914</span>                    declaredSeparator = (declaredSeparator == null) ? cmd.separator() : declaredSeparator;<a name="line.1914"></a>
<span class="sourceLineNo">1915</span>                    declaredName = (declaredName == null) ? cmd.name() : declaredName;<a name="line.1915"></a>
<span class="sourceLineNo">1916</span>                    CommandLine.this.versionLines.addAll(Arrays.asList(cmd.version()));<a name="line.1916"></a>
<span class="sourceLineNo">1917</span><a name="line.1917"></a>
<span class="sourceLineNo">1918</span>                    for (final Class&lt;?&gt; sub : cmd.subcommands()) {<a name="line.1918"></a>
<span class="sourceLineNo">1919</span>                        final Command subCommand = sub.getAnnotation(Command.class);<a name="line.1919"></a>
<span class="sourceLineNo">1920</span>                        if (subCommand == null || Help.DEFAULT_COMMAND_NAME.equals(subCommand.name())) {<a name="line.1920"></a>
<span class="sourceLineNo">1921</span>                            throw new InitializationException("Subcommand " + sub.getName() +<a name="line.1921"></a>
<span class="sourceLineNo">1922</span>                                    " is missing the mandatory @Command annotation with a 'name' attribute");<a name="line.1922"></a>
<span class="sourceLineNo">1923</span>                        }<a name="line.1923"></a>
<span class="sourceLineNo">1924</span>                        try {<a name="line.1924"></a>
<span class="sourceLineNo">1925</span>                            final Constructor&lt;?&gt; constructor = sub.getDeclaredConstructor();<a name="line.1925"></a>
<span class="sourceLineNo">1926</span>                            constructor.setAccessible(true);<a name="line.1926"></a>
<span class="sourceLineNo">1927</span>                            final CommandLine commandLine = toCommandLine(constructor.newInstance());<a name="line.1927"></a>
<span class="sourceLineNo">1928</span>                            commandLine.parent = CommandLine.this;<a name="line.1928"></a>
<span class="sourceLineNo">1929</span>                            commands.put(subCommand.name(), commandLine);<a name="line.1929"></a>
<span class="sourceLineNo">1930</span>                        }<a name="line.1930"></a>
<span class="sourceLineNo">1931</span>                        catch (final InitializationException ex) { throw ex; }<a name="line.1931"></a>
<span class="sourceLineNo">1932</span>                        catch (final NoSuchMethodException ex) { throw new InitializationException("Cannot instantiate subcommand " +<a name="line.1932"></a>
<span class="sourceLineNo">1933</span>                                sub.getName() + ": the class has no constructor", ex); }<a name="line.1933"></a>
<span class="sourceLineNo">1934</span>                        catch (final Exception ex) {<a name="line.1934"></a>
<span class="sourceLineNo">1935</span>                            throw new InitializationException("Could not instantiate and add subcommand " +<a name="line.1935"></a>
<span class="sourceLineNo">1936</span>                                    sub.getName() + ": " + ex, ex);<a name="line.1936"></a>
<span class="sourceLineNo">1937</span>                        }<a name="line.1937"></a>
<span class="sourceLineNo">1938</span>                    }<a name="line.1938"></a>
<span class="sourceLineNo">1939</span>                }<a name="line.1939"></a>
<span class="sourceLineNo">1940</span>                cls = cls.getSuperclass();<a name="line.1940"></a>
<span class="sourceLineNo">1941</span>            }<a name="line.1941"></a>
<span class="sourceLineNo">1942</span>            separator = declaredSeparator != null ? declaredSeparator : separator;<a name="line.1942"></a>
<span class="sourceLineNo">1943</span>            CommandLine.this.commandName = declaredName != null ? declaredName : CommandLine.this.commandName;<a name="line.1943"></a>
<span class="sourceLineNo">1944</span>            Collections.sort(positionalParametersFields, new PositionalParametersSorter());<a name="line.1944"></a>
<span class="sourceLineNo">1945</span>            validatePositionalParameters(positionalParametersFields);<a name="line.1945"></a>
<span class="sourceLineNo">1946</span><a name="line.1946"></a>
<span class="sourceLineNo">1947</span>            if (positionalParametersFields.isEmpty() &amp;&amp; optionName2Field.isEmpty() &amp;&amp; !hasCommandAnnotation) {<a name="line.1947"></a>
<span class="sourceLineNo">1948</span>                throw new InitializationException(command + " (" + command.getClass() +<a name="line.1948"></a>
<span class="sourceLineNo">1949</span>                        ") is not a command: it has no @Command, @Option or @Parameters annotations");<a name="line.1949"></a>
<span class="sourceLineNo">1950</span>            }<a name="line.1950"></a>
<span class="sourceLineNo">1951</span>        }<a name="line.1951"></a>
<span class="sourceLineNo">1952</span><a name="line.1952"></a>
<span class="sourceLineNo">1953</span>        /**<a name="line.1953"></a>
<span class="sourceLineNo">1954</span>         * Entry point into parsing command line arguments.<a name="line.1954"></a>
<span class="sourceLineNo">1955</span>         * @param args the command line arguments<a name="line.1955"></a>
<span class="sourceLineNo">1956</span>         * @return a list with all commands and subcommands initialized by this method<a name="line.1956"></a>
<span class="sourceLineNo">1957</span>         * @throws ParameterException if the specified command line arguments are invalid<a name="line.1957"></a>
<span class="sourceLineNo">1958</span>         */<a name="line.1958"></a>
<span class="sourceLineNo">1959</span>        List&lt;CommandLine&gt; parse(final String... args) {<a name="line.1959"></a>
<span class="sourceLineNo">1960</span>            Assert.notNull(args, "argument array");<a name="line.1960"></a>
<span class="sourceLineNo">1961</span>            if (tracer.isInfo()) {tracer.info("Parsing %d command line args %s%n", args.length, Arrays.toString(args));}<a name="line.1961"></a>
<span class="sourceLineNo">1962</span>            final Stack&lt;String&gt; arguments = new Stack&lt;String&gt;();<a name="line.1962"></a>
<span class="sourceLineNo">1963</span>            for (int i = args.length - 1; i &gt;= 0; i--) {<a name="line.1963"></a>
<span class="sourceLineNo">1964</span>                arguments.push(args[i]);<a name="line.1964"></a>
<span class="sourceLineNo">1965</span>            }<a name="line.1965"></a>
<span class="sourceLineNo">1966</span>            final List&lt;CommandLine&gt; result = new ArrayList&lt;CommandLine&gt;();<a name="line.1966"></a>
<span class="sourceLineNo">1967</span>            parse(result, arguments, args);<a name="line.1967"></a>
<span class="sourceLineNo">1968</span>            return result;<a name="line.1968"></a>
<span class="sourceLineNo">1969</span>        }<a name="line.1969"></a>
<span class="sourceLineNo">1970</span><a name="line.1970"></a>
<span class="sourceLineNo">1971</span>        private void parse(final List&lt;CommandLine&gt; parsedCommands, final Stack&lt;String&gt; argumentStack, final String[] originalArgs) {<a name="line.1971"></a>
<span class="sourceLineNo">1972</span>            // first reset any state in case this CommandLine instance is being reused<a name="line.1972"></a>
<span class="sourceLineNo">1973</span>            isHelpRequested = false;<a name="line.1973"></a>
<span class="sourceLineNo">1974</span>            CommandLine.this.versionHelpRequested = false;<a name="line.1974"></a>
<span class="sourceLineNo">1975</span>            CommandLine.this.usageHelpRequested = false;<a name="line.1975"></a>
<span class="sourceLineNo">1976</span><a name="line.1976"></a>
<span class="sourceLineNo">1977</span>            final Class&lt;?&gt; cmdClass = this.command.getClass();<a name="line.1977"></a>
<span class="sourceLineNo">1978</span>            if (tracer.isDebug()) {tracer.debug("Initializing %s: %d options, %d positional parameters, %d required, %d subcommands.%n", cmdClass.getName(), new HashSet&lt;Field&gt;(optionName2Field.values()).size(), positionalParametersFields.size(), requiredFields.size(), commands.size());}<a name="line.1978"></a>
<span class="sourceLineNo">1979</span>            parsedCommands.add(CommandLine.this);<a name="line.1979"></a>
<span class="sourceLineNo">1980</span>            final List&lt;Field&gt; required = new ArrayList&lt;Field&gt;(requiredFields);<a name="line.1980"></a>
<span class="sourceLineNo">1981</span>            final Set&lt;Field&gt; initialized = new HashSet&lt;Field&gt;();<a name="line.1981"></a>
<span class="sourceLineNo">1982</span>            Collections.sort(required, new PositionalParametersSorter());<a name="line.1982"></a>
<span class="sourceLineNo">1983</span>            try {<a name="line.1983"></a>
<span class="sourceLineNo">1984</span>                processArguments(parsedCommands, argumentStack, required, initialized, originalArgs);<a name="line.1984"></a>
<span class="sourceLineNo">1985</span>            } catch (final ParameterException ex) {<a name="line.1985"></a>
<span class="sourceLineNo">1986</span>                throw ex;<a name="line.1986"></a>
<span class="sourceLineNo">1987</span>            } catch (final Exception ex) {<a name="line.1987"></a>
<span class="sourceLineNo">1988</span>                final int offendingArgIndex = originalArgs.length - argumentStack.size() - 1;<a name="line.1988"></a>
<span class="sourceLineNo">1989</span>                final String arg = offendingArgIndex &gt;= 0 &amp;&amp; offendingArgIndex &lt; originalArgs.length ? originalArgs[offendingArgIndex] : "?";<a name="line.1989"></a>
<span class="sourceLineNo">1990</span>                throw ParameterException.create(CommandLine.this, ex, arg, offendingArgIndex, originalArgs);<a name="line.1990"></a>
<span class="sourceLineNo">1991</span>            }<a name="line.1991"></a>
<span class="sourceLineNo">1992</span>            if (!isAnyHelpRequested() &amp;&amp; !required.isEmpty()) {<a name="line.1992"></a>
<span class="sourceLineNo">1993</span>                for (final Field missing : required) {<a name="line.1993"></a>
<span class="sourceLineNo">1994</span>                    if (missing.isAnnotationPresent(Option.class)) {<a name="line.1994"></a>
<span class="sourceLineNo">1995</span>                        throw MissingParameterException.create(CommandLine.this, required, separator);<a name="line.1995"></a>
<span class="sourceLineNo">1996</span>                    } else {<a name="line.1996"></a>
<span class="sourceLineNo">1997</span>                        assertNoMissingParameters(missing, Range.parameterArity(missing).min, argumentStack);<a name="line.1997"></a>
<span class="sourceLineNo">1998</span>                    }<a name="line.1998"></a>
<span class="sourceLineNo">1999</span>                }<a name="line.1999"></a>
<span class="sourceLineNo">2000</span>            }<a name="line.2000"></a>
<span class="sourceLineNo">2001</span>            if (!unmatchedArguments.isEmpty()) {<a name="line.2001"></a>
<span class="sourceLineNo">2002</span>                if (!isUnmatchedArgumentsAllowed()) { throw new UnmatchedArgumentException(CommandLine.this, unmatchedArguments); }<a name="line.2002"></a>
<span class="sourceLineNo">2003</span>                if (tracer.isWarn()) { tracer.warn("Unmatched arguments: %s%n", unmatchedArguments); }<a name="line.2003"></a>
<span class="sourceLineNo">2004</span>            }<a name="line.2004"></a>
<span class="sourceLineNo">2005</span>        }<a name="line.2005"></a>
<span class="sourceLineNo">2006</span><a name="line.2006"></a>
<span class="sourceLineNo">2007</span>        private void processArguments(final List&lt;CommandLine&gt; parsedCommands,<a name="line.2007"></a>
<span class="sourceLineNo">2008</span>                                      final Stack&lt;String&gt; args,<a name="line.2008"></a>
<span class="sourceLineNo">2009</span>                                      final Collection&lt;Field&gt; required,<a name="line.2009"></a>
<span class="sourceLineNo">2010</span>                                      final Set&lt;Field&gt; initialized,<a name="line.2010"></a>
<span class="sourceLineNo">2011</span>                                      final String[] originalArgs) throws Exception {<a name="line.2011"></a>
<span class="sourceLineNo">2012</span>            // arg must be one of:<a name="line.2012"></a>
<span class="sourceLineNo">2013</span>            // 1. the "--" double dash separating options from positional arguments<a name="line.2013"></a>
<span class="sourceLineNo">2014</span>            // 1. a stand-alone flag, like "-v" or "--verbose": no value required, must map to boolean or Boolean field<a name="line.2014"></a>
<span class="sourceLineNo">2015</span>            // 2. a short option followed by an argument, like "-f file" or "-ffile": may map to any type of field<a name="line.2015"></a>
<span class="sourceLineNo">2016</span>            // 3. a long option followed by an argument, like "-file out.txt" or "-file=out.txt"<a name="line.2016"></a>
<span class="sourceLineNo">2017</span>            // 3. one or more remaining arguments without any associated options. Must be the last in the list.<a name="line.2017"></a>
<span class="sourceLineNo">2018</span>            // 4. a combination of stand-alone options, like "-vxr". Equivalent to "-v -x -r", "-v true -x true -r true"<a name="line.2018"></a>
<span class="sourceLineNo">2019</span>            // 5. a combination of stand-alone options and one option with an argument, like "-vxrffile"<a name="line.2019"></a>
<span class="sourceLineNo">2020</span><a name="line.2020"></a>
<span class="sourceLineNo">2021</span>            while (!args.isEmpty()) {<a name="line.2021"></a>
<span class="sourceLineNo">2022</span>                String arg = args.pop();<a name="line.2022"></a>
<span class="sourceLineNo">2023</span>                if (tracer.isDebug()) {tracer.debug("Processing argument '%s'. Remainder=%s%n", arg, reverse((Stack&lt;String&gt;) args.clone()));}<a name="line.2023"></a>
<span class="sourceLineNo">2024</span><a name="line.2024"></a>
<span class="sourceLineNo">2025</span>                // Double-dash separates options from positional arguments.<a name="line.2025"></a>
<span class="sourceLineNo">2026</span>                // If found, then interpret the remaining args as positional parameters.<a name="line.2026"></a>
<span class="sourceLineNo">2027</span>                if ("--".equals(arg)) {<a name="line.2027"></a>
<span class="sourceLineNo">2028</span>                    tracer.info("Found end-of-options delimiter '--'. Treating remainder as positional parameters.%n");<a name="line.2028"></a>
<span class="sourceLineNo">2029</span>                    processRemainderAsPositionalParameters(required, initialized, args);<a name="line.2029"></a>
<span class="sourceLineNo">2030</span>                    return; // we are done<a name="line.2030"></a>
<span class="sourceLineNo">2031</span>                }<a name="line.2031"></a>
<span class="sourceLineNo">2032</span><a name="line.2032"></a>
<span class="sourceLineNo">2033</span>                // if we find another command, we are done with the current command<a name="line.2033"></a>
<span class="sourceLineNo">2034</span>                if (commands.containsKey(arg)) {<a name="line.2034"></a>
<span class="sourceLineNo">2035</span>                    if (!isHelpRequested &amp;&amp; !required.isEmpty()) { // ensure current command portion is valid<a name="line.2035"></a>
<span class="sourceLineNo">2036</span>                        throw MissingParameterException.create(CommandLine.this, required, separator);<a name="line.2036"></a>
<span class="sourceLineNo">2037</span>                    }<a name="line.2037"></a>
<span class="sourceLineNo">2038</span>                    if (tracer.isDebug()) {tracer.debug("Found subcommand '%s' (%s)%n", arg, commands.get(arg).interpreter.command.getClass().getName());}<a name="line.2038"></a>
<span class="sourceLineNo">2039</span>                    commands.get(arg).interpreter.parse(parsedCommands, args, originalArgs);<a name="line.2039"></a>
<span class="sourceLineNo">2040</span>                    return; // remainder done by the command<a name="line.2040"></a>
<span class="sourceLineNo">2041</span>                }<a name="line.2041"></a>
<span class="sourceLineNo">2042</span><a name="line.2042"></a>
<span class="sourceLineNo">2043</span>                // First try to interpret the argument as a single option (as opposed to a compact group of options).<a name="line.2043"></a>
<span class="sourceLineNo">2044</span>                // A single option may be without option parameters, like "-v" or "--verbose" (a boolean value),<a name="line.2044"></a>
<span class="sourceLineNo">2045</span>                // or an option may have one or more option parameters.<a name="line.2045"></a>
<span class="sourceLineNo">2046</span>                // A parameter may be attached to the option.<a name="line.2046"></a>
<span class="sourceLineNo">2047</span>                boolean paramAttachedToOption = false;<a name="line.2047"></a>
<span class="sourceLineNo">2048</span>                final int separatorIndex = arg.indexOf(separator);<a name="line.2048"></a>
<span class="sourceLineNo">2049</span>                if (separatorIndex &gt; 0) {<a name="line.2049"></a>
<span class="sourceLineNo">2050</span>                    final String key = arg.substring(0, separatorIndex);<a name="line.2050"></a>
<span class="sourceLineNo">2051</span>                    // be greedy. Consume the whole arg as an option if possible.<a name="line.2051"></a>
<span class="sourceLineNo">2052</span>                    if (optionName2Field.containsKey(key) &amp;&amp; !optionName2Field.containsKey(arg)) {<a name="line.2052"></a>
<span class="sourceLineNo">2053</span>                        paramAttachedToOption = true;<a name="line.2053"></a>
<span class="sourceLineNo">2054</span>                        final String optionParam = arg.substring(separatorIndex + separator.length());<a name="line.2054"></a>
<span class="sourceLineNo">2055</span>                        args.push(optionParam);<a name="line.2055"></a>
<span class="sourceLineNo">2056</span>                        arg = key;<a name="line.2056"></a>
<span class="sourceLineNo">2057</span>                        if (tracer.isDebug()) {tracer.debug("Separated '%s' option from '%s' option parameter%n", key, optionParam);}<a name="line.2057"></a>
<span class="sourceLineNo">2058</span>                    } else {<a name="line.2058"></a>
<span class="sourceLineNo">2059</span>                        if (tracer.isDebug()) {tracer.debug("'%s' contains separator '%s' but '%s' is not a known option%n", arg, separator, key);}<a name="line.2059"></a>
<span class="sourceLineNo">2060</span>                    }<a name="line.2060"></a>
<span class="sourceLineNo">2061</span>                } else {<a name="line.2061"></a>
<span class="sourceLineNo">2062</span>                    if (tracer.isDebug()) {tracer.debug("'%s' cannot be separated into &lt;option&gt;%s&lt;option-parameter&gt;%n", arg, separator);}<a name="line.2062"></a>
<span class="sourceLineNo">2063</span>                }<a name="line.2063"></a>
<span class="sourceLineNo">2064</span>                if (optionName2Field.containsKey(arg)) {<a name="line.2064"></a>
<span class="sourceLineNo">2065</span>                    processStandaloneOption(required, initialized, arg, args, paramAttachedToOption);<a name="line.2065"></a>
<span class="sourceLineNo">2066</span>                }<a name="line.2066"></a>
<span class="sourceLineNo">2067</span>                // Compact (single-letter) options can be grouped with other options or with an argument.<a name="line.2067"></a>
<span class="sourceLineNo">2068</span>                // only single-letter options can be combined with other options or with an argument<a name="line.2068"></a>
<span class="sourceLineNo">2069</span>                else if (arg.length() &gt; 2 &amp;&amp; arg.startsWith("-")) {<a name="line.2069"></a>
<span class="sourceLineNo">2070</span>                    if (tracer.isDebug()) {tracer.debug("Trying to process '%s' as clustered short options%n", arg, args);}<a name="line.2070"></a>
<span class="sourceLineNo">2071</span>                    processClusteredShortOptions(required, initialized, arg, args);<a name="line.2071"></a>
<span class="sourceLineNo">2072</span>                }<a name="line.2072"></a>
<span class="sourceLineNo">2073</span>                // The argument could not be interpreted as an option.<a name="line.2073"></a>
<span class="sourceLineNo">2074</span>                // We take this to mean that the remainder are positional arguments<a name="line.2074"></a>
<span class="sourceLineNo">2075</span>                else {<a name="line.2075"></a>
<span class="sourceLineNo">2076</span>                    args.push(arg);<a name="line.2076"></a>
<span class="sourceLineNo">2077</span>                    if (tracer.isDebug()) {tracer.debug("Could not find option '%s', deciding whether to treat as unmatched option or positional parameter...%n", arg);}<a name="line.2077"></a>
<span class="sourceLineNo">2078</span>                    if (resemblesOption(arg)) { handleUnmatchedArguments(args.pop()); continue; } // #149<a name="line.2078"></a>
<span class="sourceLineNo">2079</span>                    if (tracer.isDebug()) {tracer.debug("No option named '%s' found. Processing remainder as positional parameters%n", arg);}<a name="line.2079"></a>
<span class="sourceLineNo">2080</span>                    processPositionalParameter(required, initialized, args);<a name="line.2080"></a>
<span class="sourceLineNo">2081</span>                }<a name="line.2081"></a>
<span class="sourceLineNo">2082</span>            }<a name="line.2082"></a>
<span class="sourceLineNo">2083</span>        }<a name="line.2083"></a>
<span class="sourceLineNo">2084</span>        private boolean resemblesOption(final String arg) {<a name="line.2084"></a>
<span class="sourceLineNo">2085</span>            int count = 0;<a name="line.2085"></a>
<span class="sourceLineNo">2086</span>            for (final String optionName : optionName2Field.keySet()) {<a name="line.2086"></a>
<span class="sourceLineNo">2087</span>                for (int i = 0; i &lt; arg.length(); i++) {<a name="line.2087"></a>
<span class="sourceLineNo">2088</span>                    if (optionName.length() &gt; i &amp;&amp; arg.charAt(i) == optionName.charAt(i)) { count++; } else { break; }<a name="line.2088"></a>
<span class="sourceLineNo">2089</span>                }<a name="line.2089"></a>
<span class="sourceLineNo">2090</span>            }<a name="line.2090"></a>
<span class="sourceLineNo">2091</span>            final boolean result = count &gt; 0 &amp;&amp; count * 10 &gt;= optionName2Field.size() * 9; // at least one prefix char in common with 9 out of 10 options<a name="line.2091"></a>
<span class="sourceLineNo">2092</span>            if (tracer.isDebug()) {tracer.debug("%s %s an option: %d matching prefix chars out of %d option names%n", arg, (result ? "resembles" : "doesn't resemble"), count, optionName2Field.size());}<a name="line.2092"></a>
<span class="sourceLineNo">2093</span>            return result;<a name="line.2093"></a>
<span class="sourceLineNo">2094</span>        }<a name="line.2094"></a>
<span class="sourceLineNo">2095</span>        private void handleUnmatchedArguments(final String arg) {final Stack&lt;String&gt; args = new Stack&lt;String&gt;(); args.add(arg); handleUnmatchedArguments(args);}<a name="line.2095"></a>
<span class="sourceLineNo">2096</span>        private void handleUnmatchedArguments(final Stack&lt;String&gt; args) {<a name="line.2096"></a>
<span class="sourceLineNo">2097</span>            while (!args.isEmpty()) { unmatchedArguments.add(args.pop()); } // addAll would give args in reverse order<a name="line.2097"></a>
<span class="sourceLineNo">2098</span>        }<a name="line.2098"></a>
<span class="sourceLineNo">2099</span><a name="line.2099"></a>
<span class="sourceLineNo">2100</span>        private void processRemainderAsPositionalParameters(final Collection&lt;Field&gt; required, final Set&lt;Field&gt; initialized, final Stack&lt;String&gt; args) throws Exception {<a name="line.2100"></a>
<span class="sourceLineNo">2101</span>            while (!args.empty()) {<a name="line.2101"></a>
<span class="sourceLineNo">2102</span>                processPositionalParameter(required, initialized, args);<a name="line.2102"></a>
<span class="sourceLineNo">2103</span>            }<a name="line.2103"></a>
<span class="sourceLineNo">2104</span>        }<a name="line.2104"></a>
<span class="sourceLineNo">2105</span>        private void processPositionalParameter(final Collection&lt;Field&gt; required, final Set&lt;Field&gt; initialized, final Stack&lt;String&gt; args) throws Exception {<a name="line.2105"></a>
<span class="sourceLineNo">2106</span>            if (tracer.isDebug()) {tracer.debug("Processing next arg as a positional parameter at index=%d. Remainder=%s%n", position, reverse((Stack&lt;String&gt;) args.clone()));}<a name="line.2106"></a>
<span class="sourceLineNo">2107</span>            int consumed = 0;<a name="line.2107"></a>
<span class="sourceLineNo">2108</span>            for (final Field positionalParam : positionalParametersFields) {<a name="line.2108"></a>
<span class="sourceLineNo">2109</span>                final Range indexRange = Range.parameterIndex(positionalParam);<a name="line.2109"></a>
<span class="sourceLineNo">2110</span>                if (!indexRange.contains(position)) {<a name="line.2110"></a>
<span class="sourceLineNo">2111</span>                    continue;<a name="line.2111"></a>
<span class="sourceLineNo">2112</span>                }<a name="line.2112"></a>
<span class="sourceLineNo">2113</span>                @SuppressWarnings("unchecked")<a name="line.2113"></a>
<span class="sourceLineNo">2114</span>                final<a name="line.2114"></a>
<span class="sourceLineNo">2115</span>                Stack&lt;String&gt; argsCopy = (Stack&lt;String&gt;) args.clone();<a name="line.2115"></a>
<span class="sourceLineNo">2116</span>                final Range arity = Range.parameterArity(positionalParam);<a name="line.2116"></a>
<span class="sourceLineNo">2117</span>                if (tracer.isDebug()) {tracer.debug("Position %d is in index range %s. Trying to assign args to %s, arity=%s%n", position, indexRange, positionalParam, arity);}<a name="line.2117"></a>
<span class="sourceLineNo">2118</span>                assertNoMissingParameters(positionalParam, arity.min, argsCopy);<a name="line.2118"></a>
<span class="sourceLineNo">2119</span>                final int originalSize = argsCopy.size();<a name="line.2119"></a>
<span class="sourceLineNo">2120</span>                applyOption(positionalParam, Parameters.class, arity, false, argsCopy, initialized, "args[" + indexRange + "] at position " + position);<a name="line.2120"></a>
<span class="sourceLineNo">2121</span>                final int count = originalSize - argsCopy.size();<a name="line.2121"></a>
<span class="sourceLineNo">2122</span>                if (count &gt; 0) { required.remove(positionalParam); }<a name="line.2122"></a>
<span class="sourceLineNo">2123</span>                consumed = Math.max(consumed, count);<a name="line.2123"></a>
<span class="sourceLineNo">2124</span>            }<a name="line.2124"></a>
<span class="sourceLineNo">2125</span>            // remove processed args from the stack<a name="line.2125"></a>
<span class="sourceLineNo">2126</span>            for (int i = 0; i &lt; consumed; i++) { args.pop(); }<a name="line.2126"></a>
<span class="sourceLineNo">2127</span>            position += consumed;<a name="line.2127"></a>
<span class="sourceLineNo">2128</span>            if (tracer.isDebug()) {tracer.debug("Consumed %d arguments, moving position to index %d.%n", consumed, position);}<a name="line.2128"></a>
<span class="sourceLineNo">2129</span>            if (consumed == 0 &amp;&amp; !args.isEmpty()) {<a name="line.2129"></a>
<span class="sourceLineNo">2130</span>                handleUnmatchedArguments(args.pop());<a name="line.2130"></a>
<span class="sourceLineNo">2131</span>            }<a name="line.2131"></a>
<span class="sourceLineNo">2132</span>        }<a name="line.2132"></a>
<span class="sourceLineNo">2133</span><a name="line.2133"></a>
<span class="sourceLineNo">2134</span>        private void processStandaloneOption(final Collection&lt;Field&gt; required,<a name="line.2134"></a>
<span class="sourceLineNo">2135</span>                                             final Set&lt;Field&gt; initialized,<a name="line.2135"></a>
<span class="sourceLineNo">2136</span>                                             final String arg,<a name="line.2136"></a>
<span class="sourceLineNo">2137</span>                                             final Stack&lt;String&gt; args,<a name="line.2137"></a>
<span class="sourceLineNo">2138</span>                                             final boolean paramAttachedToKey) throws Exception {<a name="line.2138"></a>
<span class="sourceLineNo">2139</span>            final Field field = optionName2Field.get(arg);<a name="line.2139"></a>
<span class="sourceLineNo">2140</span>            required.remove(field);<a name="line.2140"></a>
<span class="sourceLineNo">2141</span>            Range arity = Range.optionArity(field);<a name="line.2141"></a>
<span class="sourceLineNo">2142</span>            if (paramAttachedToKey) {<a name="line.2142"></a>
<span class="sourceLineNo">2143</span>                arity = arity.min(Math.max(1, arity.min)); // if key=value, minimum arity is at least 1<a name="line.2143"></a>
<span class="sourceLineNo">2144</span>            }<a name="line.2144"></a>
<span class="sourceLineNo">2145</span>            if (tracer.isDebug()) {tracer.debug("Found option named '%s': field %s, arity=%s%n", arg, field, arity);}<a name="line.2145"></a>
<span class="sourceLineNo">2146</span>            applyOption(field, Option.class, arity, paramAttachedToKey, args, initialized, "option " + arg);<a name="line.2146"></a>
<span class="sourceLineNo">2147</span>        }<a name="line.2147"></a>
<span class="sourceLineNo">2148</span><a name="line.2148"></a>
<span class="sourceLineNo">2149</span>        private void processClusteredShortOptions(final Collection&lt;Field&gt; required,<a name="line.2149"></a>
<span class="sourceLineNo">2150</span>                                                  final Set&lt;Field&gt; initialized,<a name="line.2150"></a>
<span class="sourceLineNo">2151</span>                                                  final String arg,<a name="line.2151"></a>
<span class="sourceLineNo">2152</span>                                                  final Stack&lt;String&gt; args)<a name="line.2152"></a>
<span class="sourceLineNo">2153</span>                throws Exception {<a name="line.2153"></a>
<span class="sourceLineNo">2154</span>            final String prefix = arg.substring(0, 1);<a name="line.2154"></a>
<span class="sourceLineNo">2155</span>            String cluster = arg.substring(1);<a name="line.2155"></a>
<span class="sourceLineNo">2156</span>            boolean paramAttachedToOption = true;<a name="line.2156"></a>
<span class="sourceLineNo">2157</span>            do {<a name="line.2157"></a>
<span class="sourceLineNo">2158</span>                if (cluster.length() &gt; 0 &amp;&amp; singleCharOption2Field.containsKey(cluster.charAt(0))) {<a name="line.2158"></a>
<span class="sourceLineNo">2159</span>                    final Field field = singleCharOption2Field.get(cluster.charAt(0));<a name="line.2159"></a>
<span class="sourceLineNo">2160</span>                    Range arity = Range.optionArity(field);<a name="line.2160"></a>
<span class="sourceLineNo">2161</span>                    final String argDescription = "option " + prefix + cluster.charAt(0);<a name="line.2161"></a>
<span class="sourceLineNo">2162</span>                    if (tracer.isDebug()) {tracer.debug("Found option '%s%s' in %s: field %s, arity=%s%n", prefix, cluster.charAt(0), arg, field, arity);}<a name="line.2162"></a>
<span class="sourceLineNo">2163</span>                    required.remove(field);<a name="line.2163"></a>
<span class="sourceLineNo">2164</span>                    cluster = cluster.length() &gt; 0 ? cluster.substring(1) : "";<a name="line.2164"></a>
<span class="sourceLineNo">2165</span>                    paramAttachedToOption = cluster.length() &gt; 0;<a name="line.2165"></a>
<span class="sourceLineNo">2166</span>                    if (cluster.startsWith(separator)) {// attached with separator, like -f=FILE or -v=true<a name="line.2166"></a>
<span class="sourceLineNo">2167</span>                        cluster = cluster.substring(separator.length());<a name="line.2167"></a>
<span class="sourceLineNo">2168</span>                        arity = arity.min(Math.max(1, arity.min)); // if key=value, minimum arity is at least 1<a name="line.2168"></a>
<span class="sourceLineNo">2169</span>                    }<a name="line.2169"></a>
<span class="sourceLineNo">2170</span>                    if (arity.min &gt; 0 &amp;&amp; !empty(cluster)) {<a name="line.2170"></a>
<span class="sourceLineNo">2171</span>                        if (tracer.isDebug()) {tracer.debug("Trying to process '%s' as option parameter%n", cluster);}<a name="line.2171"></a>
<span class="sourceLineNo">2172</span>                    }<a name="line.2172"></a>
<span class="sourceLineNo">2173</span>                    // arity may be &gt;= 1, or<a name="line.2173"></a>
<span class="sourceLineNo">2174</span>                    // arity &lt;= 0 &amp;&amp; !cluster.startsWith(separator)<a name="line.2174"></a>
<span class="sourceLineNo">2175</span>                    // e.g., boolean @Option("-v", arity=0, varargs=true); arg "-rvTRUE", remainder cluster="TRUE"<a name="line.2175"></a>
<span class="sourceLineNo">2176</span>                    if (!empty(cluster)) {<a name="line.2176"></a>
<span class="sourceLineNo">2177</span>                        args.push(cluster); // interpret remainder as option parameter<a name="line.2177"></a>
<span class="sourceLineNo">2178</span>                    }<a name="line.2178"></a>
<span class="sourceLineNo">2179</span>                    final int consumed = applyOption(field, Option.class, arity, paramAttachedToOption, args, initialized, argDescription);<a name="line.2179"></a>
<span class="sourceLineNo">2180</span>                    // only return if cluster (and maybe more) was consumed, otherwise continue do-while loop<a name="line.2180"></a>
<span class="sourceLineNo">2181</span>                    if (empty(cluster) || consumed &gt; 0 || args.isEmpty()) {<a name="line.2181"></a>
<span class="sourceLineNo">2182</span>                        return;<a name="line.2182"></a>
<span class="sourceLineNo">2183</span>                    }<a name="line.2183"></a>
<span class="sourceLineNo">2184</span>                    cluster = args.pop();<a name="line.2184"></a>
<span class="sourceLineNo">2185</span>                } else { // cluster is empty || cluster.charAt(0) is not a short option key<a name="line.2185"></a>
<span class="sourceLineNo">2186</span>                    if (cluster.length() == 0) { // we finished parsing a group of short options like -rxv<a name="line.2186"></a>
<span class="sourceLineNo">2187</span>                        return; // return normally and parse the next arg<a name="line.2187"></a>
<span class="sourceLineNo">2188</span>                    }<a name="line.2188"></a>
<span class="sourceLineNo">2189</span>                    // We get here when the remainder of the cluster group is neither an option,<a name="line.2189"></a>
<span class="sourceLineNo">2190</span>                    // nor a parameter that the last option could consume.<a name="line.2190"></a>
<span class="sourceLineNo">2191</span>                    if (arg.endsWith(cluster)) {<a name="line.2191"></a>
<span class="sourceLineNo">2192</span>                        args.push(paramAttachedToOption ? prefix + cluster : cluster);<a name="line.2192"></a>
<span class="sourceLineNo">2193</span>                        if (args.peek().equals(arg)) { // #149 be consistent between unmatched short and long options<a name="line.2193"></a>
<span class="sourceLineNo">2194</span>                            if (tracer.isDebug()) {tracer.debug("Could not match any short options in %s, deciding whether to treat as unmatched option or positional parameter...%n", arg);}<a name="line.2194"></a>
<span class="sourceLineNo">2195</span>                            if (resemblesOption(arg)) { handleUnmatchedArguments(args.pop()); return; } // #149<a name="line.2195"></a>
<span class="sourceLineNo">2196</span>                            processPositionalParameter(required, initialized, args);<a name="line.2196"></a>
<span class="sourceLineNo">2197</span>                            return;<a name="line.2197"></a>
<span class="sourceLineNo">2198</span>                        }<a name="line.2198"></a>
<span class="sourceLineNo">2199</span>                        // remainder was part of a clustered group that could not be completely parsed<a name="line.2199"></a>
<span class="sourceLineNo">2200</span>                        if (tracer.isDebug()) {tracer.debug("No option found for %s in %s%n", cluster, arg);}<a name="line.2200"></a>
<span class="sourceLineNo">2201</span>                        handleUnmatchedArguments(args.pop());<a name="line.2201"></a>
<span class="sourceLineNo">2202</span>                    } else {<a name="line.2202"></a>
<span class="sourceLineNo">2203</span>                        args.push(cluster);<a name="line.2203"></a>
<span class="sourceLineNo">2204</span>                        if (tracer.isDebug()) {tracer.debug("%s is not an option parameter for %s%n", cluster, arg);}<a name="line.2204"></a>
<span class="sourceLineNo">2205</span>                        processPositionalParameter(required, initialized, args);<a name="line.2205"></a>
<span class="sourceLineNo">2206</span>                    }<a name="line.2206"></a>
<span class="sourceLineNo">2207</span>                    return;<a name="line.2207"></a>
<span class="sourceLineNo">2208</span>                }<a name="line.2208"></a>
<span class="sourceLineNo">2209</span>            } while (true);<a name="line.2209"></a>
<span class="sourceLineNo">2210</span>        }<a name="line.2210"></a>
<span class="sourceLineNo">2211</span><a name="line.2211"></a>
<span class="sourceLineNo">2212</span>        private int applyOption(final Field field,<a name="line.2212"></a>
<span class="sourceLineNo">2213</span>                                final Class&lt;?&gt; annotation,<a name="line.2213"></a>
<span class="sourceLineNo">2214</span>                                final Range arity,<a name="line.2214"></a>
<span class="sourceLineNo">2215</span>                                final boolean valueAttachedToOption,<a name="line.2215"></a>
<span class="sourceLineNo">2216</span>                                final Stack&lt;String&gt; args,<a name="line.2216"></a>
<span class="sourceLineNo">2217</span>                                final Set&lt;Field&gt; initialized,<a name="line.2217"></a>
<span class="sourceLineNo">2218</span>                                final String argDescription) throws Exception {<a name="line.2218"></a>
<span class="sourceLineNo">2219</span>            updateHelpRequested(field);<a name="line.2219"></a>
<span class="sourceLineNo">2220</span>            final int length = args.size();<a name="line.2220"></a>
<span class="sourceLineNo">2221</span>            assertNoMissingParameters(field, arity.min, args);<a name="line.2221"></a>
<span class="sourceLineNo">2222</span><a name="line.2222"></a>
<span class="sourceLineNo">2223</span>            Class&lt;?&gt; cls = field.getType();<a name="line.2223"></a>
<span class="sourceLineNo">2224</span>            if (cls.isArray()) {<a name="line.2224"></a>
<span class="sourceLineNo">2225</span>                return applyValuesToArrayField(field, annotation, arity, args, cls, argDescription);<a name="line.2225"></a>
<span class="sourceLineNo">2226</span>            }<a name="line.2226"></a>
<span class="sourceLineNo">2227</span>            if (Collection.class.isAssignableFrom(cls)) {<a name="line.2227"></a>
<span class="sourceLineNo">2228</span>                return applyValuesToCollectionField(field, annotation, arity, args, cls, argDescription);<a name="line.2228"></a>
<span class="sourceLineNo">2229</span>            }<a name="line.2229"></a>
<span class="sourceLineNo">2230</span>            if (Map.class.isAssignableFrom(cls)) {<a name="line.2230"></a>
<span class="sourceLineNo">2231</span>                return applyValuesToMapField(field, annotation, arity, args, cls, argDescription);<a name="line.2231"></a>
<span class="sourceLineNo">2232</span>            }<a name="line.2232"></a>
<span class="sourceLineNo">2233</span>            cls = getTypeAttribute(field)[0]; // field may be interface/abstract type, use annotation to get concrete type<a name="line.2233"></a>
<span class="sourceLineNo">2234</span>            return applyValueToSingleValuedField(field, arity, args, cls, initialized, argDescription);<a name="line.2234"></a>
<span class="sourceLineNo">2235</span>        }<a name="line.2235"></a>
<span class="sourceLineNo">2236</span><a name="line.2236"></a>
<span class="sourceLineNo">2237</span>        private int applyValueToSingleValuedField(final Field field,<a name="line.2237"></a>
<span class="sourceLineNo">2238</span>                                                  final Range arity,<a name="line.2238"></a>
<span class="sourceLineNo">2239</span>                                                  final Stack&lt;String&gt; args,<a name="line.2239"></a>
<span class="sourceLineNo">2240</span>                                                  final Class&lt;?&gt; cls,<a name="line.2240"></a>
<span class="sourceLineNo">2241</span>                                                  final Set&lt;Field&gt; initialized,<a name="line.2241"></a>
<span class="sourceLineNo">2242</span>                                                  final String argDescription) throws Exception {<a name="line.2242"></a>
<span class="sourceLineNo">2243</span>            final boolean noMoreValues = args.isEmpty();<a name="line.2243"></a>
<span class="sourceLineNo">2244</span>            String value = args.isEmpty() ? null : trim(args.pop()); // unquote the value<a name="line.2244"></a>
<span class="sourceLineNo">2245</span>            int result = arity.min; // the number or args we need to consume<a name="line.2245"></a>
<span class="sourceLineNo">2246</span><a name="line.2246"></a>
<span class="sourceLineNo">2247</span>            // special logic for booleans: BooleanConverter accepts only "true" or "false".<a name="line.2247"></a>
<span class="sourceLineNo">2248</span>            if ((cls == Boolean.class || cls == Boolean.TYPE) &amp;&amp; arity.min &lt;= 0) {<a name="line.2248"></a>
<span class="sourceLineNo">2249</span><a name="line.2249"></a>
<span class="sourceLineNo">2250</span>                // boolean option with arity = 0..1 or 0..*: value MAY be a param<a name="line.2250"></a>
<span class="sourceLineNo">2251</span>                if (arity.max &gt; 0 &amp;&amp; ("true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value))) {<a name="line.2251"></a>
<span class="sourceLineNo">2252</span>                    result = 1;            // if it is a varargs we only consume 1 argument if it is a boolean value<a name="line.2252"></a>
<span class="sourceLineNo">2253</span>                } else {<a name="line.2253"></a>
<span class="sourceLineNo">2254</span>                    if (value != null) {<a name="line.2254"></a>
<span class="sourceLineNo">2255</span>                        args.push(value); // we don't consume the value<a name="line.2255"></a>
<span class="sourceLineNo">2256</span>                    }<a name="line.2256"></a>
<span class="sourceLineNo">2257</span>                    final Boolean currentValue = (Boolean) field.get(command);<a name="line.2257"></a>
<span class="sourceLineNo">2258</span>                    value = String.valueOf(currentValue == null ? true : !currentValue); // #147 toggle existing boolean value<a name="line.2258"></a>
<span class="sourceLineNo">2259</span>                }<a name="line.2259"></a>
<span class="sourceLineNo">2260</span>            }<a name="line.2260"></a>
<span class="sourceLineNo">2261</span>            if (noMoreValues &amp;&amp; value == null) {<a name="line.2261"></a>
<span class="sourceLineNo">2262</span>                return 0;<a name="line.2262"></a>
<span class="sourceLineNo">2263</span>            }<a name="line.2263"></a>
<span class="sourceLineNo">2264</span>            final ITypeConverter&lt;?&gt; converter = getTypeConverter(cls, field);<a name="line.2264"></a>
<span class="sourceLineNo">2265</span>            final Object newValue = tryConvert(field, -1, converter, value, cls);<a name="line.2265"></a>
<span class="sourceLineNo">2266</span>            final Object oldValue = field.get(command);<a name="line.2266"></a>
<span class="sourceLineNo">2267</span>            TraceLevel level = TraceLevel.INFO;<a name="line.2267"></a>
<span class="sourceLineNo">2268</span>            String traceMessage = "Setting %s field '%s.%s' to '%5$s' (was '%4$s') for %6$s%n";<a name="line.2268"></a>
<span class="sourceLineNo">2269</span>            if (initialized != null) {<a name="line.2269"></a>
<span class="sourceLineNo">2270</span>                if (initialized.contains(field)) {<a name="line.2270"></a>
<span class="sourceLineNo">2271</span>                    if (!isOverwrittenOptionsAllowed()) {<a name="line.2271"></a>
<span class="sourceLineNo">2272</span>                        throw new OverwrittenOptionException(CommandLine.this, optionDescription("", field, 0) +  " should be specified only once");<a name="line.2272"></a>
<span class="sourceLineNo">2273</span>                    }<a name="line.2273"></a>
<span class="sourceLineNo">2274</span>                    level = TraceLevel.WARN;<a name="line.2274"></a>
<span class="sourceLineNo">2275</span>                    traceMessage = "Overwriting %s field '%s.%s' value '%s' with '%s' for %s%n";<a name="line.2275"></a>
<span class="sourceLineNo">2276</span>                }<a name="line.2276"></a>
<span class="sourceLineNo">2277</span>                initialized.add(field);<a name="line.2277"></a>
<span class="sourceLineNo">2278</span>            }<a name="line.2278"></a>
<span class="sourceLineNo">2279</span>            if (tracer.level.isEnabled(level)) { level.print(tracer, traceMessage, field.getType().getSimpleName(),<a name="line.2279"></a>
<span class="sourceLineNo">2280</span>                        field.getDeclaringClass().getSimpleName(), field.getName(), String.valueOf(oldValue), String.valueOf(newValue), argDescription);<a name="line.2280"></a>
<span class="sourceLineNo">2281</span>            }<a name="line.2281"></a>
<span class="sourceLineNo">2282</span>            field.set(command, newValue);<a name="line.2282"></a>
<span class="sourceLineNo">2283</span>            return result;<a name="line.2283"></a>
<span class="sourceLineNo">2284</span>        }<a name="line.2284"></a>
<span class="sourceLineNo">2285</span>        private int applyValuesToMapField(final Field field,<a name="line.2285"></a>
<span class="sourceLineNo">2286</span>                                          final Class&lt;?&gt; annotation,<a name="line.2286"></a>
<span class="sourceLineNo">2287</span>                                          final Range arity,<a name="line.2287"></a>
<span class="sourceLineNo">2288</span>                                          final Stack&lt;String&gt; args,<a name="line.2288"></a>
<span class="sourceLineNo">2289</span>                                          final Class&lt;?&gt; cls,<a name="line.2289"></a>
<span class="sourceLineNo">2290</span>                                          final String argDescription) throws Exception {<a name="line.2290"></a>
<span class="sourceLineNo">2291</span>            final Class&lt;?&gt;[] classes = getTypeAttribute(field);<a name="line.2291"></a>
<span class="sourceLineNo">2292</span>            if (classes.length &lt; 2) { throw new ParameterException(CommandLine.this, "Field " + field + " needs two types (one for the map key, one for the value) but only has " + classes.length + " types configured."); }<a name="line.2292"></a>
<span class="sourceLineNo">2293</span>            final ITypeConverter&lt;?&gt; keyConverter   = getTypeConverter(classes[0], field);<a name="line.2293"></a>
<span class="sourceLineNo">2294</span>            final ITypeConverter&lt;?&gt; valueConverter = getTypeConverter(classes[1], field);<a name="line.2294"></a>
<span class="sourceLineNo">2295</span>            Map&lt;Object, Object&gt; result = (Map&lt;Object, Object&gt;) field.get(command);<a name="line.2295"></a>
<span class="sourceLineNo">2296</span>            if (result == null) {<a name="line.2296"></a>
<span class="sourceLineNo">2297</span>                result = createMap(cls);<a name="line.2297"></a>
<span class="sourceLineNo">2298</span>                field.set(command, result);<a name="line.2298"></a>
<span class="sourceLineNo">2299</span>            }<a name="line.2299"></a>
<span class="sourceLineNo">2300</span>            final int originalSize = result.size();<a name="line.2300"></a>
<span class="sourceLineNo">2301</span>            consumeMapArguments(field, arity, args, classes, keyConverter, valueConverter, result, argDescription);<a name="line.2301"></a>
<span class="sourceLineNo">2302</span>            return result.size() - originalSize;<a name="line.2302"></a>
<span class="sourceLineNo">2303</span>        }<a name="line.2303"></a>
<span class="sourceLineNo">2304</span><a name="line.2304"></a>
<span class="sourceLineNo">2305</span>        private void consumeMapArguments(final Field field,<a name="line.2305"></a>
<span class="sourceLineNo">2306</span>                                         final Range arity,<a name="line.2306"></a>
<span class="sourceLineNo">2307</span>                                         final Stack&lt;String&gt; args,<a name="line.2307"></a>
<span class="sourceLineNo">2308</span>                                         final Class&lt;?&gt;[] classes,<a name="line.2308"></a>
<span class="sourceLineNo">2309</span>                                         final ITypeConverter&lt;?&gt; keyConverter,<a name="line.2309"></a>
<span class="sourceLineNo">2310</span>                                         final ITypeConverter&lt;?&gt; valueConverter,<a name="line.2310"></a>
<span class="sourceLineNo">2311</span>                                         final Map&lt;Object, Object&gt; result,<a name="line.2311"></a>
<span class="sourceLineNo">2312</span>                                         final String argDescription) throws Exception {<a name="line.2312"></a>
<span class="sourceLineNo">2313</span>            // first do the arity.min mandatory parameters<a name="line.2313"></a>
<span class="sourceLineNo">2314</span>            for (int i = 0; i &lt; arity.min; i++) {<a name="line.2314"></a>
<span class="sourceLineNo">2315</span>                consumeOneMapArgument(field, arity, args, classes, keyConverter, valueConverter, result, i, argDescription);<a name="line.2315"></a>
<span class="sourceLineNo">2316</span>            }<a name="line.2316"></a>
<span class="sourceLineNo">2317</span>            // now process the varargs if any<a name="line.2317"></a>
<span class="sourceLineNo">2318</span>            for (int i = arity.min; i &lt; arity.max &amp;&amp; !args.isEmpty(); i++) {<a name="line.2318"></a>
<span class="sourceLineNo">2319</span>                if (!field.isAnnotationPresent(Parameters.class)) {<a name="line.2319"></a>
<span class="sourceLineNo">2320</span>                    if (commands.containsKey(args.peek()) || isOption(args.peek())) {<a name="line.2320"></a>
<span class="sourceLineNo">2321</span>                        return;<a name="line.2321"></a>
<span class="sourceLineNo">2322</span>                    }<a name="line.2322"></a>
<span class="sourceLineNo">2323</span>                }<a name="line.2323"></a>
<span class="sourceLineNo">2324</span>                consumeOneMapArgument(field, arity, args, classes, keyConverter, valueConverter, result, i, argDescription);<a name="line.2324"></a>
<span class="sourceLineNo">2325</span>            }<a name="line.2325"></a>
<span class="sourceLineNo">2326</span>        }<a name="line.2326"></a>
<span class="sourceLineNo">2327</span><a name="line.2327"></a>
<span class="sourceLineNo">2328</span>        private void consumeOneMapArgument(final Field field,<a name="line.2328"></a>
<span class="sourceLineNo">2329</span>                                           final Range arity,<a name="line.2329"></a>
<span class="sourceLineNo">2330</span>                                           final Stack&lt;String&gt; args,<a name="line.2330"></a>
<span class="sourceLineNo">2331</span>                                           final Class&lt;?&gt;[] classes,<a name="line.2331"></a>
<span class="sourceLineNo">2332</span>                                           final ITypeConverter&lt;?&gt; keyConverter, final ITypeConverter&lt;?&gt; valueConverter,<a name="line.2332"></a>
<span class="sourceLineNo">2333</span>                                           final Map&lt;Object, Object&gt; result,<a name="line.2333"></a>
<span class="sourceLineNo">2334</span>                                           final int index,<a name="line.2334"></a>
<span class="sourceLineNo">2335</span>                                           final String argDescription) throws Exception {<a name="line.2335"></a>
<span class="sourceLineNo">2336</span>            final String[] values = split(trim(args.pop()), field);<a name="line.2336"></a>
<span class="sourceLineNo">2337</span>            for (final String value : values) {<a name="line.2337"></a>
<span class="sourceLineNo">2338</span>                final String[] keyValue = value.split("=");<a name="line.2338"></a>
<span class="sourceLineNo">2339</span>                if (keyValue.length &lt; 2) {<a name="line.2339"></a>
<span class="sourceLineNo">2340</span>                    final String splitRegex = splitRegex(field);<a name="line.2340"></a>
<span class="sourceLineNo">2341</span>                    if (splitRegex.length() == 0) {<a name="line.2341"></a>
<span class="sourceLineNo">2342</span>                        throw new ParameterException(CommandLine.this, "Value for option " + optionDescription("", field,<a name="line.2342"></a>
<span class="sourceLineNo">2343</span>                                0) + " should be in KEY=VALUE format but was " + value);<a name="line.2343"></a>
<span class="sourceLineNo">2344</span>                    } else {<a name="line.2344"></a>
<span class="sourceLineNo">2345</span>                        throw new ParameterException(CommandLine.this, "Value for option " + optionDescription("", field,<a name="line.2345"></a>
<span class="sourceLineNo">2346</span>                                0) + " should be in KEY=VALUE[" + splitRegex + "KEY=VALUE]... format but was " + value);<a name="line.2346"></a>
<span class="sourceLineNo">2347</span>                    }<a name="line.2347"></a>
<span class="sourceLineNo">2348</span>                }<a name="line.2348"></a>
<span class="sourceLineNo">2349</span>                final Object mapKey =   tryConvert(field, index, keyConverter,   keyValue[0], classes[0]);<a name="line.2349"></a>
<span class="sourceLineNo">2350</span>                final Object mapValue = tryConvert(field, index, valueConverter, keyValue[1], classes[1]);<a name="line.2350"></a>
<span class="sourceLineNo">2351</span>                result.put(mapKey, mapValue);<a name="line.2351"></a>
<span class="sourceLineNo">2352</span>                if (tracer.isInfo()) {tracer.info("Putting [%s : %s] in %s&lt;%s, %s&gt; field '%s.%s' for %s%n", String.valueOf(mapKey), String.valueOf(mapValue),<a name="line.2352"></a>
<span class="sourceLineNo">2353</span>                        result.getClass().getSimpleName(), classes[0].getSimpleName(), classes[1].getSimpleName(), field.getDeclaringClass().getSimpleName(), field.getName(), argDescription);}<a name="line.2353"></a>
<span class="sourceLineNo">2354</span>            }<a name="line.2354"></a>
<span class="sourceLineNo">2355</span>        }<a name="line.2355"></a>
<span class="sourceLineNo">2356</span><a name="line.2356"></a>
<span class="sourceLineNo">2357</span>        private void checkMaxArityExceeded(final Range arity, final int remainder, final Field field, final String[] values) {<a name="line.2357"></a>
<span class="sourceLineNo">2358</span>            if (values.length &lt;= remainder) { return; }<a name="line.2358"></a>
<span class="sourceLineNo">2359</span>            final String desc = arity.max == remainder ? "" + remainder : arity + ", remainder=" + remainder;<a name="line.2359"></a>
<span class="sourceLineNo">2360</span>            throw new MaxValuesforFieldExceededException(CommandLine.this, optionDescription("", field, -1) +<a name="line.2360"></a>
<span class="sourceLineNo">2361</span>                    " max number of values (" + arity.max + ") exceeded: remainder is " + remainder + " but " +<a name="line.2361"></a>
<span class="sourceLineNo">2362</span>                    values.length + " values were specified: " + Arrays.toString(values));<a name="line.2362"></a>
<span class="sourceLineNo">2363</span>        }<a name="line.2363"></a>
<span class="sourceLineNo">2364</span><a name="line.2364"></a>
<span class="sourceLineNo">2365</span>        private int applyValuesToArrayField(final Field field,<a name="line.2365"></a>
<span class="sourceLineNo">2366</span>                                            final Class&lt;?&gt; annotation,<a name="line.2366"></a>
<span class="sourceLineNo">2367</span>                                            final Range arity,<a name="line.2367"></a>
<span class="sourceLineNo">2368</span>                                            final Stack&lt;String&gt; args,<a name="line.2368"></a>
<span class="sourceLineNo">2369</span>                                            final Class&lt;?&gt; cls,<a name="line.2369"></a>
<span class="sourceLineNo">2370</span>                                            final String argDescription) throws Exception {<a name="line.2370"></a>
<span class="sourceLineNo">2371</span>            final Object existing = field.get(command);<a name="line.2371"></a>
<span class="sourceLineNo">2372</span>            final int length = existing == null ? 0 : Array.getLength(existing);<a name="line.2372"></a>
<span class="sourceLineNo">2373</span>            final Class&lt;?&gt; type = getTypeAttribute(field)[0];<a name="line.2373"></a>
<span class="sourceLineNo">2374</span>            final List&lt;Object&gt; converted = consumeArguments(field, annotation, arity, args, type, length, argDescription);<a name="line.2374"></a>
<span class="sourceLineNo">2375</span>            final List&lt;Object&gt; newValues = new ArrayList&lt;Object&gt;();<a name="line.2375"></a>
<span class="sourceLineNo">2376</span>            for (int i = 0; i &lt; length; i++) {<a name="line.2376"></a>
<span class="sourceLineNo">2377</span>                newValues.add(Array.get(existing, i));<a name="line.2377"></a>
<span class="sourceLineNo">2378</span>            }<a name="line.2378"></a>
<span class="sourceLineNo">2379</span>            for (final Object obj : converted) {<a name="line.2379"></a>
<span class="sourceLineNo">2380</span>                if (obj instanceof Collection&lt;?&gt;) {<a name="line.2380"></a>
<span class="sourceLineNo">2381</span>                    newValues.addAll((Collection&lt;?&gt;) obj);<a name="line.2381"></a>
<span class="sourceLineNo">2382</span>                } else {<a name="line.2382"></a>
<span class="sourceLineNo">2383</span>                    newValues.add(obj);<a name="line.2383"></a>
<span class="sourceLineNo">2384</span>                }<a name="line.2384"></a>
<span class="sourceLineNo">2385</span>            }<a name="line.2385"></a>
<span class="sourceLineNo">2386</span>            final Object array = Array.newInstance(type, newValues.size());<a name="line.2386"></a>
<span class="sourceLineNo">2387</span>            field.set(command, array);<a name="line.2387"></a>
<span class="sourceLineNo">2388</span>            for (int i = 0; i &lt; newValues.size(); i++) {<a name="line.2388"></a>
<span class="sourceLineNo">2389</span>                Array.set(array, i, newValues.get(i));<a name="line.2389"></a>
<span class="sourceLineNo">2390</span>            }<a name="line.2390"></a>
<span class="sourceLineNo">2391</span>            return converted.size(); // return how many args were consumed<a name="line.2391"></a>
<span class="sourceLineNo">2392</span>        }<a name="line.2392"></a>
<span class="sourceLineNo">2393</span><a name="line.2393"></a>
<span class="sourceLineNo">2394</span>        @SuppressWarnings("unchecked")<a name="line.2394"></a>
<span class="sourceLineNo">2395</span>        private int applyValuesToCollectionField(final Field field,<a name="line.2395"></a>
<span class="sourceLineNo">2396</span>                                                 final Class&lt;?&gt; annotation,<a name="line.2396"></a>
<span class="sourceLineNo">2397</span>                                                 final Range arity,<a name="line.2397"></a>
<span class="sourceLineNo">2398</span>                                                 final Stack&lt;String&gt; args,<a name="line.2398"></a>
<span class="sourceLineNo">2399</span>                                                 final Class&lt;?&gt; cls,<a name="line.2399"></a>
<span class="sourceLineNo">2400</span>                                                 final String argDescription) throws Exception {<a name="line.2400"></a>
<span class="sourceLineNo">2401</span>            Collection&lt;Object&gt; collection = (Collection&lt;Object&gt;) field.get(command);<a name="line.2401"></a>
<span class="sourceLineNo">2402</span>            final Class&lt;?&gt; type = getTypeAttribute(field)[0];<a name="line.2402"></a>
<span class="sourceLineNo">2403</span>            final int length = collection == null ? 0 : collection.size();<a name="line.2403"></a>
<span class="sourceLineNo">2404</span>            final List&lt;Object&gt; converted = consumeArguments(field, annotation, arity, args, type, length, argDescription);<a name="line.2404"></a>
<span class="sourceLineNo">2405</span>            if (collection == null) {<a name="line.2405"></a>
<span class="sourceLineNo">2406</span>                collection = createCollection(cls);<a name="line.2406"></a>
<span class="sourceLineNo">2407</span>                field.set(command, collection);<a name="line.2407"></a>
<span class="sourceLineNo">2408</span>            }<a name="line.2408"></a>
<span class="sourceLineNo">2409</span>            for (final Object element : converted) {<a name="line.2409"></a>
<span class="sourceLineNo">2410</span>                if (element instanceof Collection&lt;?&gt;) {<a name="line.2410"></a>
<span class="sourceLineNo">2411</span>                    collection.addAll((Collection&lt;?&gt;) element);<a name="line.2411"></a>
<span class="sourceLineNo">2412</span>                } else {<a name="line.2412"></a>
<span class="sourceLineNo">2413</span>                    collection.add(element);<a name="line.2413"></a>
<span class="sourceLineNo">2414</span>                }<a name="line.2414"></a>
<span class="sourceLineNo">2415</span>            }<a name="line.2415"></a>
<span class="sourceLineNo">2416</span>            return converted.size();<a name="line.2416"></a>
<span class="sourceLineNo">2417</span>        }<a name="line.2417"></a>
<span class="sourceLineNo">2418</span><a name="line.2418"></a>
<span class="sourceLineNo">2419</span>        private List&lt;Object&gt; consumeArguments(final Field field,<a name="line.2419"></a>
<span class="sourceLineNo">2420</span>                                              final Class&lt;?&gt; annotation,<a name="line.2420"></a>
<span class="sourceLineNo">2421</span>                                              final Range arity,<a name="line.2421"></a>
<span class="sourceLineNo">2422</span>                                              final Stack&lt;String&gt; args,<a name="line.2422"></a>
<span class="sourceLineNo">2423</span>                                              final Class&lt;?&gt; type,<a name="line.2423"></a>
<span class="sourceLineNo">2424</span>                                              final int originalSize,<a name="line.2424"></a>
<span class="sourceLineNo">2425</span>                                              final String argDescription) throws Exception {<a name="line.2425"></a>
<span class="sourceLineNo">2426</span>            final List&lt;Object&gt; result = new ArrayList&lt;Object&gt;();<a name="line.2426"></a>
<span class="sourceLineNo">2427</span><a name="line.2427"></a>
<span class="sourceLineNo">2428</span>            // first do the arity.min mandatory parameters<a name="line.2428"></a>
<span class="sourceLineNo">2429</span>            for (int i = 0; i &lt; arity.min; i++) {<a name="line.2429"></a>
<span class="sourceLineNo">2430</span>                consumeOneArgument(field, arity, args, type, result, i, originalSize, argDescription);<a name="line.2430"></a>
<span class="sourceLineNo">2431</span>            }<a name="line.2431"></a>
<span class="sourceLineNo">2432</span>            // now process the varargs if any<a name="line.2432"></a>
<span class="sourceLineNo">2433</span>            for (int i = arity.min; i &lt; arity.max &amp;&amp; !args.isEmpty(); i++) {<a name="line.2433"></a>
<span class="sourceLineNo">2434</span>                if (annotation != Parameters.class) { // for vararg Options, we stop if we encounter '--', a command, or another option<a name="line.2434"></a>
<span class="sourceLineNo">2435</span>                    if (commands.containsKey(args.peek()) || isOption(args.peek())) {<a name="line.2435"></a>
<span class="sourceLineNo">2436</span>                        return result;<a name="line.2436"></a>
<span class="sourceLineNo">2437</span>                    }<a name="line.2437"></a>
<span class="sourceLineNo">2438</span>                }<a name="line.2438"></a>
<span class="sourceLineNo">2439</span>                consumeOneArgument(field, arity, args, type, result, i, originalSize, argDescription);<a name="line.2439"></a>
<span class="sourceLineNo">2440</span>            }<a name="line.2440"></a>
<span class="sourceLineNo">2441</span>            return result;<a name="line.2441"></a>
<span class="sourceLineNo">2442</span>        }<a name="line.2442"></a>
<span class="sourceLineNo">2443</span><a name="line.2443"></a>
<span class="sourceLineNo">2444</span>        private int consumeOneArgument(final Field field,<a name="line.2444"></a>
<span class="sourceLineNo">2445</span>                                       final Range arity,<a name="line.2445"></a>
<span class="sourceLineNo">2446</span>                                       final Stack&lt;String&gt; args,<a name="line.2446"></a>
<span class="sourceLineNo">2447</span>                                       final Class&lt;?&gt; type,<a name="line.2447"></a>
<span class="sourceLineNo">2448</span>                                       final List&lt;Object&gt; result,<a name="line.2448"></a>
<span class="sourceLineNo">2449</span>                                       int index,<a name="line.2449"></a>
<span class="sourceLineNo">2450</span>                                       final int originalSize,<a name="line.2450"></a>
<span class="sourceLineNo">2451</span>                                       final String argDescription) throws Exception {<a name="line.2451"></a>
<span class="sourceLineNo">2452</span>            final String[] values = split(trim(args.pop()), field);<a name="line.2452"></a>
<span class="sourceLineNo">2453</span>            final ITypeConverter&lt;?&gt; converter = getTypeConverter(type, field);<a name="line.2453"></a>
<span class="sourceLineNo">2454</span><a name="line.2454"></a>
<span class="sourceLineNo">2455</span>            for (int j = 0; j &lt; values.length; j++) {<a name="line.2455"></a>
<span class="sourceLineNo">2456</span>                result.add(tryConvert(field, index, converter, values[j], type));<a name="line.2456"></a>
<span class="sourceLineNo">2457</span>                if (tracer.isInfo()) {<a name="line.2457"></a>
<span class="sourceLineNo">2458</span>                    if (field.getType().isArray()) {<a name="line.2458"></a>
<span class="sourceLineNo">2459</span>                        tracer.info("Adding [%s] to %s[] field '%s.%s' for %s%n", String.valueOf(result.get(result.size() - 1)), type.getSimpleName(), field.getDeclaringClass().getSimpleName(), field.getName(), argDescription);<a name="line.2459"></a>
<span class="sourceLineNo">2460</span>                    } else {<a name="line.2460"></a>
<span class="sourceLineNo">2461</span>                        tracer.info("Adding [%s] to %s&lt;%s&gt; field '%s.%s' for %s%n", String.valueOf(result.get(result.size() - 1)), field.getType().getSimpleName(), type.getSimpleName(), field.getDeclaringClass().getSimpleName(), field.getName(), argDescription);<a name="line.2461"></a>
<span class="sourceLineNo">2462</span>                    }<a name="line.2462"></a>
<span class="sourceLineNo">2463</span>                }<a name="line.2463"></a>
<span class="sourceLineNo">2464</span>            }<a name="line.2464"></a>
<span class="sourceLineNo">2465</span>            //checkMaxArityExceeded(arity, max, field, values);<a name="line.2465"></a>
<span class="sourceLineNo">2466</span>            return ++index;<a name="line.2466"></a>
<span class="sourceLineNo">2467</span>        }<a name="line.2467"></a>
<span class="sourceLineNo">2468</span><a name="line.2468"></a>
<span class="sourceLineNo">2469</span>        private String splitRegex(final Field field) {<a name="line.2469"></a>
<span class="sourceLineNo">2470</span>            if (field.isAnnotationPresent(Option.class))     { return field.getAnnotation(Option.class).split(); }<a name="line.2470"></a>
<span class="sourceLineNo">2471</span>            if (field.isAnnotationPresent(Parameters.class)) { return field.getAnnotation(Parameters.class).split(); }<a name="line.2471"></a>
<span class="sourceLineNo">2472</span>            return "";<a name="line.2472"></a>
<span class="sourceLineNo">2473</span>        }<a name="line.2473"></a>
<span class="sourceLineNo">2474</span>        private String[] split(final String value, final Field field) {<a name="line.2474"></a>
<span class="sourceLineNo">2475</span>            final String regex = splitRegex(field);<a name="line.2475"></a>
<span class="sourceLineNo">2476</span>            return regex.length() == 0 ? new String[] {value} : value.split(regex);<a name="line.2476"></a>
<span class="sourceLineNo">2477</span>        }<a name="line.2477"></a>
<span class="sourceLineNo">2478</span><a name="line.2478"></a>
<span class="sourceLineNo">2479</span>        /**<a name="line.2479"></a>
<span class="sourceLineNo">2480</span>         * Called when parsing varargs parameters for a multi-value option.<a name="line.2480"></a>
<span class="sourceLineNo">2481</span>         * When an option is encountered, the remainder should not be interpreted as vararg elements.<a name="line.2481"></a>
<span class="sourceLineNo">2482</span>         * @param arg the string to determine whether it is an option or not<a name="line.2482"></a>
<span class="sourceLineNo">2483</span>         * @return true if it is an option, false otherwise<a name="line.2483"></a>
<span class="sourceLineNo">2484</span>         */<a name="line.2484"></a>
<span class="sourceLineNo">2485</span>        private boolean isOption(final String arg) {<a name="line.2485"></a>
<span class="sourceLineNo">2486</span>            if ("--".equals(arg)) {<a name="line.2486"></a>
<span class="sourceLineNo">2487</span>                return true;<a name="line.2487"></a>
<span class="sourceLineNo">2488</span>            }<a name="line.2488"></a>
<span class="sourceLineNo">2489</span>            // not just arg prefix: we may be in the middle of parsing -xrvfFILE<a name="line.2489"></a>
<span class="sourceLineNo">2490</span>            if (optionName2Field.containsKey(arg)) { // -v or -f or --file (not attached to param or other option)<a name="line.2490"></a>
<span class="sourceLineNo">2491</span>                return true;<a name="line.2491"></a>
<span class="sourceLineNo">2492</span>            }<a name="line.2492"></a>
<span class="sourceLineNo">2493</span>            final int separatorIndex = arg.indexOf(separator);<a name="line.2493"></a>
<span class="sourceLineNo">2494</span>            if (separatorIndex &gt; 0) { // -f=FILE or --file==FILE (attached to param via separator)<a name="line.2494"></a>
<span class="sourceLineNo">2495</span>                if (optionName2Field.containsKey(arg.substring(0, separatorIndex))) {<a name="line.2495"></a>
<span class="sourceLineNo">2496</span>                    return true;<a name="line.2496"></a>
<span class="sourceLineNo">2497</span>                }<a name="line.2497"></a>
<span class="sourceLineNo">2498</span>            }<a name="line.2498"></a>
<span class="sourceLineNo">2499</span>            return (arg.length() &gt; 2 &amp;&amp; arg.startsWith("-") &amp;&amp; singleCharOption2Field.containsKey(arg.charAt(1)));<a name="line.2499"></a>
<span class="sourceLineNo">2500</span>        }<a name="line.2500"></a>
<span class="sourceLineNo">2501</span>        private Object tryConvert(final Field field, final int index, final ITypeConverter&lt;?&gt; converter, final String value, final Class&lt;?&gt; type)<a name="line.2501"></a>
<span class="sourceLineNo">2502</span>                throws Exception {<a name="line.2502"></a>
<span class="sourceLineNo">2503</span>            try {<a name="line.2503"></a>
<span class="sourceLineNo">2504</span>                return converter.convert(value);<a name="line.2504"></a>
<span class="sourceLineNo">2505</span>            } catch (final TypeConversionException ex) {<a name="line.2505"></a>
<span class="sourceLineNo">2506</span>                throw new ParameterException(CommandLine.this, ex.getMessage() + optionDescription(" for ", field, index));<a name="line.2506"></a>
<span class="sourceLineNo">2507</span>            } catch (final Exception other) {<a name="line.2507"></a>
<span class="sourceLineNo">2508</span>                final String desc = optionDescription(" for ", field, index) + ": " + other;<a name="line.2508"></a>
<span class="sourceLineNo">2509</span>                throw new ParameterException(CommandLine.this, "Could not convert '" + value + "' to " + type.getSimpleName() + desc, other);<a name="line.2509"></a>
<span class="sourceLineNo">2510</span>            }<a name="line.2510"></a>
<span class="sourceLineNo">2511</span>        }<a name="line.2511"></a>
<span class="sourceLineNo">2512</span><a name="line.2512"></a>
<span class="sourceLineNo">2513</span>        private String optionDescription(final String prefix, final Field field, final int index) {<a name="line.2513"></a>
<span class="sourceLineNo">2514</span>            final Help.IParamLabelRenderer labelRenderer = Help.createMinimalParamLabelRenderer();<a name="line.2514"></a>
<span class="sourceLineNo">2515</span>            String desc = "";<a name="line.2515"></a>
<span class="sourceLineNo">2516</span>            if (field.isAnnotationPresent(Option.class)) {<a name="line.2516"></a>
<span class="sourceLineNo">2517</span>                desc = prefix + "option '" + field.getAnnotation(Option.class).names()[0] + "'";<a name="line.2517"></a>
<span class="sourceLineNo">2518</span>                if (index &gt;= 0) {<a name="line.2518"></a>
<span class="sourceLineNo">2519</span>                    final Range arity = Range.optionArity(field);<a name="line.2519"></a>
<span class="sourceLineNo">2520</span>                    if (arity.max &gt; 1) {<a name="line.2520"></a>
<span class="sourceLineNo">2521</span>                        desc += " at index " + index;<a name="line.2521"></a>
<span class="sourceLineNo">2522</span>                    }<a name="line.2522"></a>
<span class="sourceLineNo">2523</span>                    desc += " (" + labelRenderer.renderParameterLabel(field, Help.Ansi.OFF, Collections.&lt;IStyle&gt;emptyList()) + ")";<a name="line.2523"></a>
<span class="sourceLineNo">2524</span>                }<a name="line.2524"></a>
<span class="sourceLineNo">2525</span>            } else if (field.isAnnotationPresent(Parameters.class)) {<a name="line.2525"></a>
<span class="sourceLineNo">2526</span>                final Range indexRange = Range.parameterIndex(field);<a name="line.2526"></a>
<span class="sourceLineNo">2527</span>                final Text label = labelRenderer.renderParameterLabel(field, Help.Ansi.OFF, Collections.&lt;IStyle&gt;emptyList());<a name="line.2527"></a>
<span class="sourceLineNo">2528</span>                desc = prefix + "positional parameter at index " + indexRange + " (" + label + ")";<a name="line.2528"></a>
<span class="sourceLineNo">2529</span>            }<a name="line.2529"></a>
<span class="sourceLineNo">2530</span>            return desc;<a name="line.2530"></a>
<span class="sourceLineNo">2531</span>        }<a name="line.2531"></a>
<span class="sourceLineNo">2532</span><a name="line.2532"></a>
<span class="sourceLineNo">2533</span>        private boolean isAnyHelpRequested() { return isHelpRequested || versionHelpRequested || usageHelpRequested; }<a name="line.2533"></a>
<span class="sourceLineNo">2534</span><a name="line.2534"></a>
<span class="sourceLineNo">2535</span>        private void updateHelpRequested(final Field field) {<a name="line.2535"></a>
<span class="sourceLineNo">2536</span>            if (field.isAnnotationPresent(Option.class)) {<a name="line.2536"></a>
<span class="sourceLineNo">2537</span>                isHelpRequested                       |= is(field, "help", field.getAnnotation(Option.class).help());<a name="line.2537"></a>
<span class="sourceLineNo">2538</span>                CommandLine.this.versionHelpRequested |= is(field, "versionHelp", field.getAnnotation(Option.class).versionHelp());<a name="line.2538"></a>
<span class="sourceLineNo">2539</span>                CommandLine.this.usageHelpRequested   |= is(field, "usageHelp", field.getAnnotation(Option.class).usageHelp());<a name="line.2539"></a>
<span class="sourceLineNo">2540</span>            }<a name="line.2540"></a>
<span class="sourceLineNo">2541</span>        }<a name="line.2541"></a>
<span class="sourceLineNo">2542</span>        private boolean is(final Field f, final String description, final boolean value) {<a name="line.2542"></a>
<span class="sourceLineNo">2543</span>            if (value) { if (tracer.isInfo()) {tracer.info("Field '%s.%s' has '%s' annotation: not validating required fields%n", f.getDeclaringClass().getSimpleName(), f.getName(), description); }}<a name="line.2543"></a>
<span class="sourceLineNo">2544</span>            return value;<a name="line.2544"></a>
<span class="sourceLineNo">2545</span>        }<a name="line.2545"></a>
<span class="sourceLineNo">2546</span>        @SuppressWarnings("unchecked")<a name="line.2546"></a>
<span class="sourceLineNo">2547</span>        private Collection&lt;Object&gt; createCollection(final Class&lt;?&gt; collectionClass) throws Exception {<a name="line.2547"></a>
<span class="sourceLineNo">2548</span>            if (collectionClass.isInterface()) {<a name="line.2548"></a>
<span class="sourceLineNo">2549</span>                if (List.class.isAssignableFrom(collectionClass)) {<a name="line.2549"></a>
<span class="sourceLineNo">2550</span>                    return new ArrayList&lt;Object&gt;();<a name="line.2550"></a>
<span class="sourceLineNo">2551</span>                } else if (SortedSet.class.isAssignableFrom(collectionClass)) {<a name="line.2551"></a>
<span class="sourceLineNo">2552</span>                    return new TreeSet&lt;Object&gt;();<a name="line.2552"></a>
<span class="sourceLineNo">2553</span>                } else if (Set.class.isAssignableFrom(collectionClass)) {<a name="line.2553"></a>
<span class="sourceLineNo">2554</span>                    return new LinkedHashSet&lt;Object&gt;();<a name="line.2554"></a>
<span class="sourceLineNo">2555</span>                } else if (Queue.class.isAssignableFrom(collectionClass)) {<a name="line.2555"></a>
<span class="sourceLineNo">2556</span>                    return new LinkedList&lt;Object&gt;(); // ArrayDeque is only available since 1.6<a name="line.2556"></a>
<span class="sourceLineNo">2557</span>                }<a name="line.2557"></a>
<span class="sourceLineNo">2558</span>                return new ArrayList&lt;Object&gt;();<a name="line.2558"></a>
<span class="sourceLineNo">2559</span>            }<a name="line.2559"></a>
<span class="sourceLineNo">2560</span>            // custom Collection implementation class must have default constructor<a name="line.2560"></a>
<span class="sourceLineNo">2561</span>            return (Collection&lt;Object&gt;) collectionClass.newInstance();<a name="line.2561"></a>
<span class="sourceLineNo">2562</span>        }<a name="line.2562"></a>
<span class="sourceLineNo">2563</span>        private Map&lt;Object, Object&gt; createMap(final Class&lt;?&gt; mapClass) throws Exception {<a name="line.2563"></a>
<span class="sourceLineNo">2564</span>            try { // if it is an implementation class, instantiate it<a name="line.2564"></a>
<span class="sourceLineNo">2565</span>                return (Map&lt;Object, Object&gt;) mapClass.newInstance();<a name="line.2565"></a>
<span class="sourceLineNo">2566</span>            } catch (final Exception ignored) {}<a name="line.2566"></a>
<span class="sourceLineNo">2567</span>            return new LinkedHashMap&lt;Object, Object&gt;();<a name="line.2567"></a>
<span class="sourceLineNo">2568</span>        }<a name="line.2568"></a>
<span class="sourceLineNo">2569</span>        private ITypeConverter&lt;?&gt; getTypeConverter(final Class&lt;?&gt; type, final Field field) {<a name="line.2569"></a>
<span class="sourceLineNo">2570</span>            final ITypeConverter&lt;?&gt; result = converterRegistry.get(type);<a name="line.2570"></a>
<span class="sourceLineNo">2571</span>            if (result != null) {<a name="line.2571"></a>
<span class="sourceLineNo">2572</span>                return result;<a name="line.2572"></a>
<span class="sourceLineNo">2573</span>            }<a name="line.2573"></a>
<span class="sourceLineNo">2574</span>            if (type.isEnum()) {<a name="line.2574"></a>
<span class="sourceLineNo">2575</span>                return new ITypeConverter&lt;Object&gt;() {<a name="line.2575"></a>
<span class="sourceLineNo">2576</span>                    @Override<a name="line.2576"></a>
<span class="sourceLineNo">2577</span>                    @SuppressWarnings("unchecked")<a name="line.2577"></a>
<span class="sourceLineNo">2578</span>                    public Object convert(final String value) throws Exception {<a name="line.2578"></a>
<span class="sourceLineNo">2579</span>                        return Enum.valueOf((Class&lt;Enum&gt;) type, value);<a name="line.2579"></a>
<span class="sourceLineNo">2580</span>                    }<a name="line.2580"></a>
<span class="sourceLineNo">2581</span>                };<a name="line.2581"></a>
<span class="sourceLineNo">2582</span>            }<a name="line.2582"></a>
<span class="sourceLineNo">2583</span>            throw new MissingTypeConverterException(CommandLine.this, "No TypeConverter registered for " + type.getName() + " of field " + field);<a name="line.2583"></a>
<span class="sourceLineNo">2584</span>        }<a name="line.2584"></a>
<span class="sourceLineNo">2585</span><a name="line.2585"></a>
<span class="sourceLineNo">2586</span>        private void assertNoMissingParameters(final Field field, final int arity, final Stack&lt;String&gt; args) {<a name="line.2586"></a>
<span class="sourceLineNo">2587</span>            if (arity &gt; args.size()) {<a name="line.2587"></a>
<span class="sourceLineNo">2588</span>                if (arity == 1) {<a name="line.2588"></a>
<span class="sourceLineNo">2589</span>                    if (field.isAnnotationPresent(Option.class)) {<a name="line.2589"></a>
<span class="sourceLineNo">2590</span>                        throw new MissingParameterException(CommandLine.this, "Missing required parameter for " +<a name="line.2590"></a>
<span class="sourceLineNo">2591</span>                                optionDescription("", field, 0));<a name="line.2591"></a>
<span class="sourceLineNo">2592</span>                    }<a name="line.2592"></a>
<span class="sourceLineNo">2593</span>                    final Range indexRange = Range.parameterIndex(field);<a name="line.2593"></a>
<span class="sourceLineNo">2594</span>                    final Help.IParamLabelRenderer labelRenderer = Help.createMinimalParamLabelRenderer();<a name="line.2594"></a>
<span class="sourceLineNo">2595</span>                    String sep = "";<a name="line.2595"></a>
<span class="sourceLineNo">2596</span>                    String names = "";<a name="line.2596"></a>
<span class="sourceLineNo">2597</span>                    int count = 0;<a name="line.2597"></a>
<span class="sourceLineNo">2598</span>                    for (int i = indexRange.min; i &lt; positionalParametersFields.size(); i++) {<a name="line.2598"></a>
<span class="sourceLineNo">2599</span>                        if (Range.parameterArity(positionalParametersFields.get(i)).min &gt; 0) {<a name="line.2599"></a>
<span class="sourceLineNo">2600</span>                            names += sep + labelRenderer.renderParameterLabel(positionalParametersFields.get(i),<a name="line.2600"></a>
<span class="sourceLineNo">2601</span>                                    Help.Ansi.OFF, Collections.&lt;IStyle&gt;emptyList());<a name="line.2601"></a>
<span class="sourceLineNo">2602</span>                            sep = ", ";<a name="line.2602"></a>
<span class="sourceLineNo">2603</span>                            count++;<a name="line.2603"></a>
<span class="sourceLineNo">2604</span>                        }<a name="line.2604"></a>
<span class="sourceLineNo">2605</span>                    }<a name="line.2605"></a>
<span class="sourceLineNo">2606</span>                    String msg = "Missing required parameter";<a name="line.2606"></a>
<span class="sourceLineNo">2607</span>                    final Range paramArity = Range.parameterArity(field);<a name="line.2607"></a>
<span class="sourceLineNo">2608</span>                    if (paramArity.isVariable) {<a name="line.2608"></a>
<span class="sourceLineNo">2609</span>                        msg += "s at positions " + indexRange + ": ";<a name="line.2609"></a>
<span class="sourceLineNo">2610</span>                    } else {<a name="line.2610"></a>
<span class="sourceLineNo">2611</span>                        msg += (count &gt; 1 ? "s: " : ": ");<a name="line.2611"></a>
<span class="sourceLineNo">2612</span>                    }<a name="line.2612"></a>
<span class="sourceLineNo">2613</span>                    throw new MissingParameterException(CommandLine.this, msg + names);<a name="line.2613"></a>
<span class="sourceLineNo">2614</span>                }<a name="line.2614"></a>
<span class="sourceLineNo">2615</span>                if (args.isEmpty()) {<a name="line.2615"></a>
<span class="sourceLineNo">2616</span>                    throw new MissingParameterException(CommandLine.this, optionDescription("", field, 0) +<a name="line.2616"></a>
<span class="sourceLineNo">2617</span>                            " requires at least " + arity + " values, but none were specified.");<a name="line.2617"></a>
<span class="sourceLineNo">2618</span>                }<a name="line.2618"></a>
<span class="sourceLineNo">2619</span>                throw new MissingParameterException(CommandLine.this, optionDescription("", field, 0) +<a name="line.2619"></a>
<span class="sourceLineNo">2620</span>                        " requires at least " + arity + " values, but only " + args.size() + " were specified: " + reverse(args));<a name="line.2620"></a>
<span class="sourceLineNo">2621</span>            }<a name="line.2621"></a>
<span class="sourceLineNo">2622</span>        }<a name="line.2622"></a>
<span class="sourceLineNo">2623</span>        private String trim(final String value) {<a name="line.2623"></a>
<span class="sourceLineNo">2624</span>            return unquote(value);<a name="line.2624"></a>
<span class="sourceLineNo">2625</span>        }<a name="line.2625"></a>
<span class="sourceLineNo">2626</span><a name="line.2626"></a>
<span class="sourceLineNo">2627</span>        private String unquote(final String value) {<a name="line.2627"></a>
<span class="sourceLineNo">2628</span>            return value == null<a name="line.2628"></a>
<span class="sourceLineNo">2629</span>                    ? null<a name="line.2629"></a>
<span class="sourceLineNo">2630</span>                    : (value.length() &gt; 1 &amp;&amp; value.startsWith("\"") &amp;&amp; value.endsWith("\""))<a name="line.2630"></a>
<span class="sourceLineNo">2631</span>                        ? value.substring(1, value.length() - 1)<a name="line.2631"></a>
<span class="sourceLineNo">2632</span>                        : value;<a name="line.2632"></a>
<span class="sourceLineNo">2633</span>        }<a name="line.2633"></a>
<span class="sourceLineNo">2634</span>    }<a name="line.2634"></a>
<span class="sourceLineNo">2635</span>    private static class PositionalParametersSorter implements Comparator&lt;Field&gt; {<a name="line.2635"></a>
<span class="sourceLineNo">2636</span>        @Override<a name="line.2636"></a>
<span class="sourceLineNo">2637</span>        public int compare(final Field o1, final Field o2) {<a name="line.2637"></a>
<span class="sourceLineNo">2638</span>            final int result = Range.parameterIndex(o1).compareTo(Range.parameterIndex(o2));<a name="line.2638"></a>
<span class="sourceLineNo">2639</span>            return (result == 0) ? Range.parameterArity(o1).compareTo(Range.parameterArity(o2)) : result;<a name="line.2639"></a>
<span class="sourceLineNo">2640</span>        }<a name="line.2640"></a>
<span class="sourceLineNo">2641</span>    }<a name="line.2641"></a>
<span class="sourceLineNo">2642</span>    /**<a name="line.2642"></a>
<span class="sourceLineNo">2643</span>     * Inner class to group the built-in {@link ITypeConverter} implementations.<a name="line.2643"></a>
<span class="sourceLineNo">2644</span>     */<a name="line.2644"></a>
<span class="sourceLineNo">2645</span>    private static class BuiltIn {<a name="line.2645"></a>
<span class="sourceLineNo">2646</span>        static class PathConverter implements ITypeConverter&lt;Path&gt; {<a name="line.2646"></a>
<span class="sourceLineNo">2647</span>            @Override public Path convert(final String value) { return Paths.get(value); }<a name="line.2647"></a>
<span class="sourceLineNo">2648</span>        }<a name="line.2648"></a>
<span class="sourceLineNo">2649</span>        static class StringConverter implements ITypeConverter&lt;String&gt; {<a name="line.2649"></a>
<span class="sourceLineNo">2650</span>            @Override<a name="line.2650"></a>
<span class="sourceLineNo">2651</span>            public String convert(final String value) { return value; }<a name="line.2651"></a>
<span class="sourceLineNo">2652</span>        }<a name="line.2652"></a>
<span class="sourceLineNo">2653</span>        static class StringBuilderConverter implements ITypeConverter&lt;StringBuilder&gt; {<a name="line.2653"></a>
<span class="sourceLineNo">2654</span>            @Override<a name="line.2654"></a>
<span class="sourceLineNo">2655</span>            public StringBuilder convert(final String value) { return new StringBuilder(value); }<a name="line.2655"></a>
<span class="sourceLineNo">2656</span>        }<a name="line.2656"></a>
<span class="sourceLineNo">2657</span>        static class CharSequenceConverter implements ITypeConverter&lt;CharSequence&gt; {<a name="line.2657"></a>
<span class="sourceLineNo">2658</span>            @Override<a name="line.2658"></a>
<span class="sourceLineNo">2659</span>            public String convert(final String value) { return value; }<a name="line.2659"></a>
<span class="sourceLineNo">2660</span>        }<a name="line.2660"></a>
<span class="sourceLineNo">2661</span>        /** Converts text to a {@code Byte} by delegating to {@link Byte#valueOf(String)}.*/<a name="line.2661"></a>
<span class="sourceLineNo">2662</span>        static class ByteConverter implements ITypeConverter&lt;Byte&gt; {<a name="line.2662"></a>
<span class="sourceLineNo">2663</span>            @Override<a name="line.2663"></a>
<span class="sourceLineNo">2664</span>            public Byte convert(final String value) { return Byte.valueOf(value); }<a name="line.2664"></a>
<span class="sourceLineNo">2665</span>        }<a name="line.2665"></a>
<span class="sourceLineNo">2666</span>        /** Converts {@code "true"} or {@code "false"} to a {@code Boolean}. Other values result in a ParameterException.*/<a name="line.2666"></a>
<span class="sourceLineNo">2667</span>        static class BooleanConverter implements ITypeConverter&lt;Boolean&gt; {<a name="line.2667"></a>
<span class="sourceLineNo">2668</span>            @Override<a name="line.2668"></a>
<span class="sourceLineNo">2669</span>            public Boolean convert(final String value) {<a name="line.2669"></a>
<span class="sourceLineNo">2670</span>                if ("true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value)) {<a name="line.2670"></a>
<span class="sourceLineNo">2671</span>                    return Boolean.parseBoolean(value);<a name="line.2671"></a>
<span class="sourceLineNo">2672</span>                } else {<a name="line.2672"></a>
<span class="sourceLineNo">2673</span>                    throw new TypeConversionException("'" + value + "' is not a boolean");<a name="line.2673"></a>
<span class="sourceLineNo">2674</span>                }<a name="line.2674"></a>
<span class="sourceLineNo">2675</span>            }<a name="line.2675"></a>
<span class="sourceLineNo">2676</span>        }<a name="line.2676"></a>
<span class="sourceLineNo">2677</span>        static class CharacterConverter implements ITypeConverter&lt;Character&gt; {<a name="line.2677"></a>
<span class="sourceLineNo">2678</span>            @Override<a name="line.2678"></a>
<span class="sourceLineNo">2679</span>            public Character convert(final String value) {<a name="line.2679"></a>
<span class="sourceLineNo">2680</span>                if (value.length() &gt; 1) {<a name="line.2680"></a>
<span class="sourceLineNo">2681</span>                    throw new TypeConversionException("'" + value + "' is not a single character");<a name="line.2681"></a>
<span class="sourceLineNo">2682</span>                }<a name="line.2682"></a>
<span class="sourceLineNo">2683</span>                return value.charAt(0);<a name="line.2683"></a>
<span class="sourceLineNo">2684</span>            }<a name="line.2684"></a>
<span class="sourceLineNo">2685</span>        }<a name="line.2685"></a>
<span class="sourceLineNo">2686</span>        /** Converts text to a {@code Short} by delegating to {@link Short#valueOf(String)}.*/<a name="line.2686"></a>
<span class="sourceLineNo">2687</span>        static class ShortConverter implements ITypeConverter&lt;Short&gt; {<a name="line.2687"></a>
<span class="sourceLineNo">2688</span>            @Override<a name="line.2688"></a>
<span class="sourceLineNo">2689</span>            public Short convert(final String value) { return Short.valueOf(value); }<a name="line.2689"></a>
<span class="sourceLineNo">2690</span>        }<a name="line.2690"></a>
<span class="sourceLineNo">2691</span>        /** Converts text to an {@code Integer} by delegating to {@link Integer#valueOf(String)}.*/<a name="line.2691"></a>
<span class="sourceLineNo">2692</span>        static class IntegerConverter implements ITypeConverter&lt;Integer&gt; {<a name="line.2692"></a>
<span class="sourceLineNo">2693</span>            @Override<a name="line.2693"></a>
<span class="sourceLineNo">2694</span>            public Integer convert(final String value) { return Integer.valueOf(value); }<a name="line.2694"></a>
<span class="sourceLineNo">2695</span>        }<a name="line.2695"></a>
<span class="sourceLineNo">2696</span>        /** Converts text to a {@code Long} by delegating to {@link Long#valueOf(String)}.*/<a name="line.2696"></a>
<span class="sourceLineNo">2697</span>        static class LongConverter implements ITypeConverter&lt;Long&gt; {<a name="line.2697"></a>
<span class="sourceLineNo">2698</span>            @Override<a name="line.2698"></a>
<span class="sourceLineNo">2699</span>            public Long convert(final String value) { return Long.valueOf(value); }<a name="line.2699"></a>
<span class="sourceLineNo">2700</span>        }<a name="line.2700"></a>
<span class="sourceLineNo">2701</span>        static class FloatConverter implements ITypeConverter&lt;Float&gt; {<a name="line.2701"></a>
<span class="sourceLineNo">2702</span>            @Override<a name="line.2702"></a>
<span class="sourceLineNo">2703</span>            public Float convert(final String value) { return Float.valueOf(value); }<a name="line.2703"></a>
<span class="sourceLineNo">2704</span>        }<a name="line.2704"></a>
<span class="sourceLineNo">2705</span>        static class DoubleConverter implements ITypeConverter&lt;Double&gt; {<a name="line.2705"></a>
<span class="sourceLineNo">2706</span>            @Override<a name="line.2706"></a>
<span class="sourceLineNo">2707</span>            public Double convert(final String value) { return Double.valueOf(value); }<a name="line.2707"></a>
<span class="sourceLineNo">2708</span>        }<a name="line.2708"></a>
<span class="sourceLineNo">2709</span>        static class FileConverter implements ITypeConverter&lt;File&gt; {<a name="line.2709"></a>
<span class="sourceLineNo">2710</span>            @Override<a name="line.2710"></a>
<span class="sourceLineNo">2711</span>            public File convert(final String value) { return new File(value); }<a name="line.2711"></a>
<span class="sourceLineNo">2712</span>        }<a name="line.2712"></a>
<span class="sourceLineNo">2713</span>        static class URLConverter implements ITypeConverter&lt;URL&gt; {<a name="line.2713"></a>
<span class="sourceLineNo">2714</span>            @Override<a name="line.2714"></a>
<span class="sourceLineNo">2715</span>            public URL convert(final String value) throws MalformedURLException { return new URL(value); }<a name="line.2715"></a>
<span class="sourceLineNo">2716</span>        }<a name="line.2716"></a>
<span class="sourceLineNo">2717</span>        static class URIConverter implements ITypeConverter&lt;URI&gt; {<a name="line.2717"></a>
<span class="sourceLineNo">2718</span>            @Override<a name="line.2718"></a>
<span class="sourceLineNo">2719</span>            public URI convert(final String value) throws URISyntaxException { return new URI(value); }<a name="line.2719"></a>
<span class="sourceLineNo">2720</span>        }<a name="line.2720"></a>
<span class="sourceLineNo">2721</span>        /** Converts text in {@code yyyy-mm-dd} format to a {@code java.util.Date}. ParameterException on failure. */<a name="line.2721"></a>
<span class="sourceLineNo">2722</span>        static class ISO8601DateConverter implements ITypeConverter&lt;Date&gt; {<a name="line.2722"></a>
<span class="sourceLineNo">2723</span>            @Override<a name="line.2723"></a>
<span class="sourceLineNo">2724</span>            public Date convert(final String value) {<a name="line.2724"></a>
<span class="sourceLineNo">2725</span>                try {<a name="line.2725"></a>
<span class="sourceLineNo">2726</span>                    return new SimpleDateFormat("yyyy-MM-dd").parse(value);<a name="line.2726"></a>
<span class="sourceLineNo">2727</span>                } catch (final ParseException e) {<a name="line.2727"></a>
<span class="sourceLineNo">2728</span>                    throw new TypeConversionException("'" + value + "' is not a yyyy-MM-dd date");<a name="line.2728"></a>
<span class="sourceLineNo">2729</span>                }<a name="line.2729"></a>
<span class="sourceLineNo">2730</span>            }<a name="line.2730"></a>
<span class="sourceLineNo">2731</span>        }<a name="line.2731"></a>
<span class="sourceLineNo">2732</span>        /** Converts text in any of the following formats to a {@code java.sql.Time}: {@code HH:mm}, {@code HH:mm:ss},<a name="line.2732"></a>
<span class="sourceLineNo">2733</span>         * {@code HH:mm:ss.SSS}, {@code HH:mm:ss,SSS}. Other formats result in a ParameterException. */<a name="line.2733"></a>
<span class="sourceLineNo">2734</span>        static class ISO8601TimeConverter implements ITypeConverter&lt;Time&gt; {<a name="line.2734"></a>
<span class="sourceLineNo">2735</span>            @Override<a name="line.2735"></a>
<span class="sourceLineNo">2736</span>            public Time convert(final String value) {<a name="line.2736"></a>
<span class="sourceLineNo">2737</span>                try {<a name="line.2737"></a>
<span class="sourceLineNo">2738</span>                    if (value.length() &lt;= 5) {<a name="line.2738"></a>
<span class="sourceLineNo">2739</span>                        return new Time(new SimpleDateFormat("HH:mm").parse(value).getTime());<a name="line.2739"></a>
<span class="sourceLineNo">2740</span>                    } else if (value.length() &lt;= 8) {<a name="line.2740"></a>
<span class="sourceLineNo">2741</span>                        return new Time(new SimpleDateFormat("HH:mm:ss").parse(value).getTime());<a name="line.2741"></a>
<span class="sourceLineNo">2742</span>                    } else if (value.length() &lt;= 12) {<a name="line.2742"></a>
<span class="sourceLineNo">2743</span>                        try {<a name="line.2743"></a>
<span class="sourceLineNo">2744</span>                            return new Time(new SimpleDateFormat("HH:mm:ss.SSS").parse(value).getTime());<a name="line.2744"></a>
<span class="sourceLineNo">2745</span>                        } catch (final ParseException e2) {<a name="line.2745"></a>
<span class="sourceLineNo">2746</span>                            return new Time(new SimpleDateFormat("HH:mm:ss,SSS").parse(value).getTime());<a name="line.2746"></a>
<span class="sourceLineNo">2747</span>                        }<a name="line.2747"></a>
<span class="sourceLineNo">2748</span>                    }<a name="line.2748"></a>
<span class="sourceLineNo">2749</span>                } catch (final ParseException ignored) {<a name="line.2749"></a>
<span class="sourceLineNo">2750</span>                    // ignored because we throw a ParameterException below<a name="line.2750"></a>
<span class="sourceLineNo">2751</span>                }<a name="line.2751"></a>
<span class="sourceLineNo">2752</span>                throw new TypeConversionException("'" + value + "' is not a HH:mm[:ss[.SSS]] time");<a name="line.2752"></a>
<span class="sourceLineNo">2753</span>            }<a name="line.2753"></a>
<span class="sourceLineNo">2754</span>        }<a name="line.2754"></a>
<span class="sourceLineNo">2755</span>        static class BigDecimalConverter implements ITypeConverter&lt;BigDecimal&gt; {<a name="line.2755"></a>
<span class="sourceLineNo">2756</span>            @Override<a name="line.2756"></a>
<span class="sourceLineNo">2757</span>            public BigDecimal convert(final String value) { return new BigDecimal(value); }<a name="line.2757"></a>
<span class="sourceLineNo">2758</span>        }<a name="line.2758"></a>
<span class="sourceLineNo">2759</span>        static class BigIntegerConverter implements ITypeConverter&lt;BigInteger&gt; {<a name="line.2759"></a>
<span class="sourceLineNo">2760</span>            @Override<a name="line.2760"></a>
<span class="sourceLineNo">2761</span>            public BigInteger convert(final String value) { return new BigInteger(value); }<a name="line.2761"></a>
<span class="sourceLineNo">2762</span>        }<a name="line.2762"></a>
<span class="sourceLineNo">2763</span>        static class CharsetConverter implements ITypeConverter&lt;Charset&gt; {<a name="line.2763"></a>
<span class="sourceLineNo">2764</span>            @Override<a name="line.2764"></a>
<span class="sourceLineNo">2765</span>            public Charset convert(final String s) { return Charset.forName(s); }<a name="line.2765"></a>
<span class="sourceLineNo">2766</span>        }<a name="line.2766"></a>
<span class="sourceLineNo">2767</span>        /** Converts text to a {@code InetAddress} by delegating to {@link InetAddress#getByName(String)}. */<a name="line.2767"></a>
<span class="sourceLineNo">2768</span>        static class InetAddressConverter implements ITypeConverter&lt;InetAddress&gt; {<a name="line.2768"></a>
<span class="sourceLineNo">2769</span>            @Override<a name="line.2769"></a>
<span class="sourceLineNo">2770</span>            public InetAddress convert(final String s) throws Exception { return InetAddress.getByName(s); }<a name="line.2770"></a>
<span class="sourceLineNo">2771</span>        }<a name="line.2771"></a>
<span class="sourceLineNo">2772</span>        static class PatternConverter implements ITypeConverter&lt;Pattern&gt; {<a name="line.2772"></a>
<span class="sourceLineNo">2773</span>            @Override<a name="line.2773"></a>
<span class="sourceLineNo">2774</span>            public Pattern convert(final String s) { return Pattern.compile(s); }<a name="line.2774"></a>
<span class="sourceLineNo">2775</span>        }<a name="line.2775"></a>
<span class="sourceLineNo">2776</span>        static class UUIDConverter implements ITypeConverter&lt;UUID&gt; {<a name="line.2776"></a>
<span class="sourceLineNo">2777</span>            @Override<a name="line.2777"></a>
<span class="sourceLineNo">2778</span>            public UUID convert(final String s) throws Exception { return UUID.fromString(s); }<a name="line.2778"></a>
<span class="sourceLineNo">2779</span>        }<a name="line.2779"></a>
<span class="sourceLineNo">2780</span>        private BuiltIn() {} // private constructor: never instantiate<a name="line.2780"></a>
<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
<span class="sourceLineNo">2782</span><a name="line.2782"></a>
<span class="sourceLineNo">2783</span>    /**<a name="line.2783"></a>
<span class="sourceLineNo">2784</span>     * A collection of methods and inner classes that provide fine-grained control over the contents and layout of<a name="line.2784"></a>
<span class="sourceLineNo">2785</span>     * the usage help message to display to end users when help is requested or invalid input values were specified.<a name="line.2785"></a>
<span class="sourceLineNo">2786</span>     * &lt;h3&gt;Layered API&lt;/h3&gt;<a name="line.2786"></a>
<span class="sourceLineNo">2787</span>     * &lt;p&gt;The {@link Command} annotation provides the easiest way to customize usage help messages. See<a name="line.2787"></a>
<span class="sourceLineNo">2788</span>     * the &lt;a href="https://remkop.github.io/picocli/index.html#_usage_help"&gt;Manual&lt;/a&gt; for details.&lt;/p&gt;<a name="line.2788"></a>
<span class="sourceLineNo">2789</span>     * &lt;p&gt;This Help class provides high-level functions to create sections of the usage help message and headings<a name="line.2789"></a>
<span class="sourceLineNo">2790</span>     * for these sections. Instead of calling the {@link CommandLine#usage(PrintStream, CommandLine.Help.ColorScheme)}<a name="line.2790"></a>
<span class="sourceLineNo">2791</span>     * method, application authors may want to create a custom usage help message by reorganizing sections in a<a name="line.2791"></a>
<span class="sourceLineNo">2792</span>     * different order and/or adding custom sections.&lt;/p&gt;<a name="line.2792"></a>
<span class="sourceLineNo">2793</span>     * &lt;p&gt;Finally, the Help class contains inner classes and interfaces that can be used to create custom help messages.&lt;/p&gt;<a name="line.2793"></a>
<span class="sourceLineNo">2794</span>     * &lt;h4&gt;IOptionRenderer and IParameterRenderer&lt;/h4&gt;<a name="line.2794"></a>
<span class="sourceLineNo">2795</span>     * &lt;p&gt;Renders a field annotated with {@link Option} or {@link Parameters} to an array of {@link Text} values.<a name="line.2795"></a>
<span class="sourceLineNo">2796</span>     * By default, these values are&lt;/p&gt;&lt;ul&gt;<a name="line.2796"></a>
<span class="sourceLineNo">2797</span>     * &lt;li&gt;mandatory marker character (if the option/parameter is {@link Option#required() required})&lt;/li&gt;<a name="line.2797"></a>
<span class="sourceLineNo">2798</span>     * &lt;li&gt;short option name (empty for parameters)&lt;/li&gt;<a name="line.2798"></a>
<span class="sourceLineNo">2799</span>     * &lt;li&gt;comma or empty (empty for parameters)&lt;/li&gt;<a name="line.2799"></a>
<span class="sourceLineNo">2800</span>     * &lt;li&gt;long option names (the parameter {@link IParamLabelRenderer label} for parameters)&lt;/li&gt;<a name="line.2800"></a>
<span class="sourceLineNo">2801</span>     * &lt;li&gt;description&lt;/li&gt;<a name="line.2801"></a>
<span class="sourceLineNo">2802</span>     * &lt;/ul&gt;<a name="line.2802"></a>
<span class="sourceLineNo">2803</span>     * &lt;p&gt;Other components rely on this ordering.&lt;/p&gt;<a name="line.2803"></a>
<span class="sourceLineNo">2804</span>     * &lt;h4&gt;Layout&lt;/h4&gt;<a name="line.2804"></a>
<span class="sourceLineNo">2805</span>     * &lt;p&gt;Delegates to the renderers to create {@link Text} values for the annotated fields, and uses a<a name="line.2805"></a>
<span class="sourceLineNo">2806</span>     * {@link TextTable} to display these values in tabular format. Layout is responsible for deciding which values<a name="line.2806"></a>
<span class="sourceLineNo">2807</span>     * to display where in the table. By default, Layout shows one option or parameter per table row.&lt;/p&gt;<a name="line.2807"></a>
<span class="sourceLineNo">2808</span>     * &lt;h4&gt;TextTable&lt;/h4&gt;<a name="line.2808"></a>
<span class="sourceLineNo">2809</span>     * &lt;p&gt;Responsible for spacing out {@link Text} values according to the {@link Column} definitions the table was<a name="line.2809"></a>
<span class="sourceLineNo">2810</span>     * created with. Columns have a width, indentation, and an overflow policy that decides what to do if a value is<a name="line.2810"></a>
<span class="sourceLineNo">2811</span>     * longer than the column's width.&lt;/p&gt;<a name="line.2811"></a>
<span class="sourceLineNo">2812</span>     * &lt;h4&gt;Text&lt;/h4&gt;<a name="line.2812"></a>
<span class="sourceLineNo">2813</span>     * &lt;p&gt;Encapsulates rich text with styles and colors in a way that other components like {@link TextTable} are<a name="line.2813"></a>
<span class="sourceLineNo">2814</span>     * unaware of the embedded ANSI escape codes.&lt;/p&gt;<a name="line.2814"></a>
<span class="sourceLineNo">2815</span>     */<a name="line.2815"></a>
<span class="sourceLineNo">2816</span>    public static class Help {<a name="line.2816"></a>
<span class="sourceLineNo">2817</span>        /** Constant String holding the default program name: {@value} */<a name="line.2817"></a>
<span class="sourceLineNo">2818</span>        protected static final String DEFAULT_COMMAND_NAME = "&lt;main class&gt;";<a name="line.2818"></a>
<span class="sourceLineNo">2819</span><a name="line.2819"></a>
<span class="sourceLineNo">2820</span>        /** Constant String holding the default string that separates options from option parameters: {@value} */<a name="line.2820"></a>
<span class="sourceLineNo">2821</span>        protected static final String DEFAULT_SEPARATOR = "=";<a name="line.2821"></a>
<span class="sourceLineNo">2822</span><a name="line.2822"></a>
<span class="sourceLineNo">2823</span>        private final static int usageHelpWidth = 80;<a name="line.2823"></a>
<span class="sourceLineNo">2824</span>        private final static int optionsColumnWidth = 2 + 2 + 1 + 24;<a name="line.2824"></a>
<span class="sourceLineNo">2825</span>        private final Object command;<a name="line.2825"></a>
<span class="sourceLineNo">2826</span>        private final Map&lt;String, Help&gt; commands = new LinkedHashMap&lt;String, Help&gt;();<a name="line.2826"></a>
<span class="sourceLineNo">2827</span>        final ColorScheme colorScheme;<a name="line.2827"></a>
<span class="sourceLineNo">2828</span><a name="line.2828"></a>
<span class="sourceLineNo">2829</span>        /** Immutable list of fields annotated with {@link Option}, in declaration order. */<a name="line.2829"></a>
<span class="sourceLineNo">2830</span>        public final List&lt;Field&gt; optionFields;<a name="line.2830"></a>
<span class="sourceLineNo">2831</span><a name="line.2831"></a>
<span class="sourceLineNo">2832</span>        /** Immutable list of fields annotated with {@link Parameters}, or an empty list if no such field exists. */<a name="line.2832"></a>
<span class="sourceLineNo">2833</span>        public final List&lt;Field&gt; positionalParametersFields;<a name="line.2833"></a>
<span class="sourceLineNo">2834</span><a name="line.2834"></a>
<span class="sourceLineNo">2835</span>        /** The String to use as the separator between options and option parameters. {@code "="} by default,<a name="line.2835"></a>
<span class="sourceLineNo">2836</span>         * initialized from {@link Command#separator()} if defined.<a name="line.2836"></a>
<span class="sourceLineNo">2837</span>         * @see #parameterLabelRenderer */<a name="line.2837"></a>
<span class="sourceLineNo">2838</span>        public String separator;<a name="line.2838"></a>
<span class="sourceLineNo">2839</span><a name="line.2839"></a>
<span class="sourceLineNo">2840</span>        /** The String to use as the program name in the synopsis line of the help message.<a name="line.2840"></a>
<span class="sourceLineNo">2841</span>         * {@link #DEFAULT_COMMAND_NAME} by default, initialized from {@link Command#name()} if defined. */<a name="line.2841"></a>
<span class="sourceLineNo">2842</span>        public String commandName = DEFAULT_COMMAND_NAME;<a name="line.2842"></a>
<span class="sourceLineNo">2843</span><a name="line.2843"></a>
<span class="sourceLineNo">2844</span>        /** Optional text lines to use as the description of the help message, displayed between the synopsis and the<a name="line.2844"></a>
<span class="sourceLineNo">2845</span>         * options list. Initialized from {@link Command#description()} if the {@code Command} annotation is present,<a name="line.2845"></a>
<span class="sourceLineNo">2846</span>         * otherwise this is an empty array and the help message has no description.<a name="line.2846"></a>
<span class="sourceLineNo">2847</span>         * Applications may programmatically set this field to create a custom help message. */<a name="line.2847"></a>
<span class="sourceLineNo">2848</span>        public String[] description = {};<a name="line.2848"></a>
<span class="sourceLineNo">2849</span><a name="line.2849"></a>
<span class="sourceLineNo">2850</span>        /** Optional custom synopsis lines to use instead of the auto-generated synopsis.<a name="line.2850"></a>
<span class="sourceLineNo">2851</span>         * Initialized from {@link Command#customSynopsis()} if the {@code Command} annotation is present,<a name="line.2851"></a>
<span class="sourceLineNo">2852</span>         * otherwise this is an empty array and the synopsis is generated.<a name="line.2852"></a>
<span class="sourceLineNo">2853</span>         * Applications may programmatically set this field to create a custom help message. */<a name="line.2853"></a>
<span class="sourceLineNo">2854</span>        public String[] customSynopsis = {};<a name="line.2854"></a>
<span class="sourceLineNo">2855</span><a name="line.2855"></a>
<span class="sourceLineNo">2856</span>        /** Optional header lines displayed at the top of the help message. For subcommands, the first header line is<a name="line.2856"></a>
<span class="sourceLineNo">2857</span>         * displayed in the list of commands. Values are initialized from {@link Command#header()}<a name="line.2857"></a>
<span class="sourceLineNo">2858</span>         * if the {@code Command} annotation is present, otherwise this is an empty array and the help message has no<a name="line.2858"></a>
<span class="sourceLineNo">2859</span>         * header. Applications may programmatically set this field to create a custom help message. */<a name="line.2859"></a>
<span class="sourceLineNo">2860</span>        public String[] header = {};<a name="line.2860"></a>
<span class="sourceLineNo">2861</span><a name="line.2861"></a>
<span class="sourceLineNo">2862</span>        /** Optional footer text lines displayed at the bottom of the help message. Initialized from<a name="line.2862"></a>
<span class="sourceLineNo">2863</span>         * {@link Command#footer()} if the {@code Command} annotation is present, otherwise this is an empty array and<a name="line.2863"></a>
<span class="sourceLineNo">2864</span>         * the help message has no footer.<a name="line.2864"></a>
<span class="sourceLineNo">2865</span>         * Applications may programmatically set this field to create a custom help message. */<a name="line.2865"></a>
<span class="sourceLineNo">2866</span>        public String[] footer = {};<a name="line.2866"></a>
<span class="sourceLineNo">2867</span><a name="line.2867"></a>
<span class="sourceLineNo">2868</span>        /** Option and positional parameter value label renderer used for the synopsis line(s) and the option list.<a name="line.2868"></a>
<span class="sourceLineNo">2869</span>         * By default initialized to the result of {@link #createDefaultParamLabelRenderer()}, which takes a snapshot<a name="line.2869"></a>
<span class="sourceLineNo">2870</span>         * of the {@link #separator} at construction time. If the separator is modified after Help construction, you<a name="line.2870"></a>
<span class="sourceLineNo">2871</span>         * may need to re-initialize this field by calling {@link #createDefaultParamLabelRenderer()} again. */<a name="line.2871"></a>
<span class="sourceLineNo">2872</span>        public IParamLabelRenderer parameterLabelRenderer;<a name="line.2872"></a>
<span class="sourceLineNo">2873</span><a name="line.2873"></a>
<span class="sourceLineNo">2874</span>        /** If {@code true}, the synopsis line(s) will show an abbreviated synopsis without detailed option names. */<a name="line.2874"></a>
<span class="sourceLineNo">2875</span>        public Boolean abbreviateSynopsis;<a name="line.2875"></a>
<span class="sourceLineNo">2876</span><a name="line.2876"></a>
<span class="sourceLineNo">2877</span>        /** If {@code true}, the options list is sorted alphabetically. */<a name="line.2877"></a>
<span class="sourceLineNo">2878</span>        public Boolean sortOptions;<a name="line.2878"></a>
<span class="sourceLineNo">2879</span><a name="line.2879"></a>
<span class="sourceLineNo">2880</span>        /** If {@code true}, the options list will show default values for all options except booleans. */<a name="line.2880"></a>
<span class="sourceLineNo">2881</span>        public Boolean showDefaultValues;<a name="line.2881"></a>
<span class="sourceLineNo">2882</span><a name="line.2882"></a>
<span class="sourceLineNo">2883</span>        /** Character used to prefix required options in the options list. */<a name="line.2883"></a>
<span class="sourceLineNo">2884</span>        public Character requiredOptionMarker;<a name="line.2884"></a>
<span class="sourceLineNo">2885</span><a name="line.2885"></a>
<span class="sourceLineNo">2886</span>        /** Optional heading preceding the header section. Initialized from {@link Command#headerHeading()}, or null. */<a name="line.2886"></a>
<span class="sourceLineNo">2887</span>        public String headerHeading;<a name="line.2887"></a>
<span class="sourceLineNo">2888</span><a name="line.2888"></a>
<span class="sourceLineNo">2889</span>        /** Optional heading preceding the synopsis. Initialized from {@link Command#synopsisHeading()}, {@code "Usage: "} by default. */<a name="line.2889"></a>
<span class="sourceLineNo">2890</span>        public String synopsisHeading;<a name="line.2890"></a>
<span class="sourceLineNo">2891</span><a name="line.2891"></a>
<span class="sourceLineNo">2892</span>        /** Optional heading preceding the description section. Initialized from {@link Command#descriptionHeading()}, or null. */<a name="line.2892"></a>
<span class="sourceLineNo">2893</span>        public String descriptionHeading;<a name="line.2893"></a>
<span class="sourceLineNo">2894</span><a name="line.2894"></a>
<span class="sourceLineNo">2895</span>        /** Optional heading preceding the parameter list. Initialized from {@link Command#parameterListHeading()}, or null. */<a name="line.2895"></a>
<span class="sourceLineNo">2896</span>        public String parameterListHeading;<a name="line.2896"></a>
<span class="sourceLineNo">2897</span><a name="line.2897"></a>
<span class="sourceLineNo">2898</span>        /** Optional heading preceding the options list. Initialized from {@link Command#optionListHeading()}, or null. */<a name="line.2898"></a>
<span class="sourceLineNo">2899</span>        public String optionListHeading;<a name="line.2899"></a>
<span class="sourceLineNo">2900</span><a name="line.2900"></a>
<span class="sourceLineNo">2901</span>        /** Optional heading preceding the subcommand list. Initialized from {@link Command#commandListHeading()}. {@code "Commands:%n"} by default. */<a name="line.2901"></a>
<span class="sourceLineNo">2902</span>        public String commandListHeading;<a name="line.2902"></a>
<span class="sourceLineNo">2903</span><a name="line.2903"></a>
<span class="sourceLineNo">2904</span>        /** Optional heading preceding the footer section. Initialized from {@link Command#footerHeading()}, or null. */<a name="line.2904"></a>
<span class="sourceLineNo">2905</span>        public String footerHeading;<a name="line.2905"></a>
<span class="sourceLineNo">2906</span><a name="line.2906"></a>
<span class="sourceLineNo">2907</span>        /** Constructs a new {@code Help} instance with a default color scheme, initialized from annotatations<a name="line.2907"></a>
<span class="sourceLineNo">2908</span>         * on the specified class and superclasses.<a name="line.2908"></a>
<span class="sourceLineNo">2909</span>         * @param command the annotated object to create usage help for */<a name="line.2909"></a>
<span class="sourceLineNo">2910</span>        public Help(final Object command) {<a name="line.2910"></a>
<span class="sourceLineNo">2911</span>            this(command, Ansi.AUTO);<a name="line.2911"></a>
<span class="sourceLineNo">2912</span>        }<a name="line.2912"></a>
<span class="sourceLineNo">2913</span><a name="line.2913"></a>
<span class="sourceLineNo">2914</span>        /** Constructs a new {@code Help} instance with a default color scheme, initialized from annotatations<a name="line.2914"></a>
<span class="sourceLineNo">2915</span>         * on the specified class and superclasses.<a name="line.2915"></a>
<span class="sourceLineNo">2916</span>         * @param command the annotated object to create usage help for<a name="line.2916"></a>
<span class="sourceLineNo">2917</span>         * @param ansi whether to emit ANSI escape codes or not */<a name="line.2917"></a>
<span class="sourceLineNo">2918</span>        public Help(final Object command, final Ansi ansi) {<a name="line.2918"></a>
<span class="sourceLineNo">2919</span>            this(command, defaultColorScheme(ansi));<a name="line.2919"></a>
<span class="sourceLineNo">2920</span>        }<a name="line.2920"></a>
<span class="sourceLineNo">2921</span><a name="line.2921"></a>
<span class="sourceLineNo">2922</span>        /** Constructs a new {@code Help} instance with the specified color scheme, initialized from annotatations<a name="line.2922"></a>
<span class="sourceLineNo">2923</span>         * on the specified class and superclasses.<a name="line.2923"></a>
<span class="sourceLineNo">2924</span>         * @param command the annotated object to create usage help for<a name="line.2924"></a>
<span class="sourceLineNo">2925</span>         * @param colorScheme the color scheme to use */<a name="line.2925"></a>
<span class="sourceLineNo">2926</span>        public Help(final Object command, final ColorScheme colorScheme) {<a name="line.2926"></a>
<span class="sourceLineNo">2927</span>            this.command = Assert.notNull(command, "command");<a name="line.2927"></a>
<span class="sourceLineNo">2928</span>            this.colorScheme = Assert.notNull(colorScheme, "colorScheme").applySystemProperties();<a name="line.2928"></a>
<span class="sourceLineNo">2929</span>            final List&lt;Field&gt; options = new ArrayList&lt;Field&gt;();<a name="line.2929"></a>
<span class="sourceLineNo">2930</span>            final List&lt;Field&gt; operands = new ArrayList&lt;Field&gt;();<a name="line.2930"></a>
<span class="sourceLineNo">2931</span>            Class&lt;?&gt; cls = command.getClass();<a name="line.2931"></a>
<span class="sourceLineNo">2932</span>            while (cls != null) {<a name="line.2932"></a>
<span class="sourceLineNo">2933</span>                for (final Field field : cls.getDeclaredFields()) {<a name="line.2933"></a>
<span class="sourceLineNo">2934</span>                    field.setAccessible(true);<a name="line.2934"></a>
<span class="sourceLineNo">2935</span>                    if (field.isAnnotationPresent(Option.class)) {<a name="line.2935"></a>
<span class="sourceLineNo">2936</span>                        final Option option = field.getAnnotation(Option.class);<a name="line.2936"></a>
<span class="sourceLineNo">2937</span>                        if (!option.hidden()) { // hidden options should not appear in usage help<a name="line.2937"></a>
<span class="sourceLineNo">2938</span>                            // TODO remember longest concatenated option string length (issue #45)<a name="line.2938"></a>
<span class="sourceLineNo">2939</span>                            options.add(field);<a name="line.2939"></a>
<span class="sourceLineNo">2940</span>                        }<a name="line.2940"></a>
<span class="sourceLineNo">2941</span>                    }<a name="line.2941"></a>
<span class="sourceLineNo">2942</span>                    if (field.isAnnotationPresent(Parameters.class)) {<a name="line.2942"></a>
<span class="sourceLineNo">2943</span>                        operands.add(field);<a name="line.2943"></a>
<span class="sourceLineNo">2944</span>                    }<a name="line.2944"></a>
<span class="sourceLineNo">2945</span>                }<a name="line.2945"></a>
<span class="sourceLineNo">2946</span>                // superclass values should not overwrite values if both class and superclass have a @Command annotation<a name="line.2946"></a>
<span class="sourceLineNo">2947</span>                if (cls.isAnnotationPresent(Command.class)) {<a name="line.2947"></a>
<span class="sourceLineNo">2948</span>                    final Command cmd = cls.getAnnotation(Command.class);<a name="line.2948"></a>
<span class="sourceLineNo">2949</span>                    if (DEFAULT_COMMAND_NAME.equals(commandName)) {<a name="line.2949"></a>
<span class="sourceLineNo">2950</span>                        commandName = cmd.name();<a name="line.2950"></a>
<span class="sourceLineNo">2951</span>                    }<a name="line.2951"></a>
<span class="sourceLineNo">2952</span>                    separator = (separator == null) ? cmd.separator() : separator;<a name="line.2952"></a>
<span class="sourceLineNo">2953</span>                    abbreviateSynopsis = (abbreviateSynopsis == null) ? cmd.abbreviateSynopsis() : abbreviateSynopsis;<a name="line.2953"></a>
<span class="sourceLineNo">2954</span>                    sortOptions = (sortOptions == null) ? cmd.sortOptions() : sortOptions;<a name="line.2954"></a>
<span class="sourceLineNo">2955</span>                    requiredOptionMarker = (requiredOptionMarker == null) ? cmd.requiredOptionMarker() : requiredOptionMarker;<a name="line.2955"></a>
<span class="sourceLineNo">2956</span>                    showDefaultValues = (showDefaultValues == null) ? cmd.showDefaultValues() : showDefaultValues;<a name="line.2956"></a>
<span class="sourceLineNo">2957</span>                    customSynopsis = empty(customSynopsis) ? cmd.customSynopsis() : customSynopsis;<a name="line.2957"></a>
<span class="sourceLineNo">2958</span>                    description = empty(description) ? cmd.description() : description;<a name="line.2958"></a>
<span class="sourceLineNo">2959</span>                    header = empty(header) ? cmd.header() : header;<a name="line.2959"></a>
<span class="sourceLineNo">2960</span>                    footer = empty(footer) ? cmd.footer() : footer;<a name="line.2960"></a>
<span class="sourceLineNo">2961</span>                    headerHeading = empty(headerHeading) ? cmd.headerHeading() : headerHeading;<a name="line.2961"></a>
<span class="sourceLineNo">2962</span>                    synopsisHeading = empty(synopsisHeading) || "Usage: ".equals(synopsisHeading) ? cmd.synopsisHeading() : synopsisHeading;<a name="line.2962"></a>
<span class="sourceLineNo">2963</span>                    descriptionHeading = empty(descriptionHeading) ? cmd.descriptionHeading() : descriptionHeading;<a name="line.2963"></a>
<span class="sourceLineNo">2964</span>                    parameterListHeading = empty(parameterListHeading) ? cmd.parameterListHeading() : parameterListHeading;<a name="line.2964"></a>
<span class="sourceLineNo">2965</span>                    optionListHeading = empty(optionListHeading) ? cmd.optionListHeading() : optionListHeading;<a name="line.2965"></a>
<span class="sourceLineNo">2966</span>                    commandListHeading = empty(commandListHeading) || "Commands:%n".equals(commandListHeading) ? cmd.commandListHeading() : commandListHeading;<a name="line.2966"></a>
<span class="sourceLineNo">2967</span>                    footerHeading = empty(footerHeading) ? cmd.footerHeading() : footerHeading;<a name="line.2967"></a>
<span class="sourceLineNo">2968</span>                }<a name="line.2968"></a>
<span class="sourceLineNo">2969</span>                cls = cls.getSuperclass();<a name="line.2969"></a>
<span class="sourceLineNo">2970</span>            }<a name="line.2970"></a>
<span class="sourceLineNo">2971</span>            sortOptions =          (sortOptions == null)          ? true : sortOptions;<a name="line.2971"></a>
<span class="sourceLineNo">2972</span>            abbreviateSynopsis =   (abbreviateSynopsis == null)   ? false : abbreviateSynopsis;<a name="line.2972"></a>
<span class="sourceLineNo">2973</span>            requiredOptionMarker = (requiredOptionMarker == null) ? ' ' : requiredOptionMarker;<a name="line.2973"></a>
<span class="sourceLineNo">2974</span>            showDefaultValues =    (showDefaultValues == null)    ? false : showDefaultValues;<a name="line.2974"></a>
<span class="sourceLineNo">2975</span>            synopsisHeading =      (synopsisHeading == null)      ? "Usage: " : synopsisHeading;<a name="line.2975"></a>
<span class="sourceLineNo">2976</span>            commandListHeading =   (commandListHeading == null)   ? "Commands:%n" : commandListHeading;<a name="line.2976"></a>
<span class="sourceLineNo">2977</span>            separator =            (separator == null)            ? DEFAULT_SEPARATOR : separator;<a name="line.2977"></a>
<span class="sourceLineNo">2978</span>            parameterLabelRenderer = createDefaultParamLabelRenderer(); // uses help separator<a name="line.2978"></a>
<span class="sourceLineNo">2979</span>            Collections.sort(operands, new PositionalParametersSorter());<a name="line.2979"></a>
<span class="sourceLineNo">2980</span>            positionalParametersFields = Collections.unmodifiableList(operands);<a name="line.2980"></a>
<span class="sourceLineNo">2981</span>            optionFields                 = Collections.unmodifiableList(options);<a name="line.2981"></a>
<span class="sourceLineNo">2982</span>        }<a name="line.2982"></a>
<span class="sourceLineNo">2983</span><a name="line.2983"></a>
<span class="sourceLineNo">2984</span>        /** Registers all specified subcommands with this Help.<a name="line.2984"></a>
<span class="sourceLineNo">2985</span>         * @param commands maps the command names to the associated CommandLine object<a name="line.2985"></a>
<span class="sourceLineNo">2986</span>         * @return this Help instance (for method chaining)<a name="line.2986"></a>
<span class="sourceLineNo">2987</span>         * @see CommandLine#getSubcommands()<a name="line.2987"></a>
<span class="sourceLineNo">2988</span>         */<a name="line.2988"></a>
<span class="sourceLineNo">2989</span>        public Help addAllSubcommands(final Map&lt;String, CommandLine&gt; commands) {<a name="line.2989"></a>
<span class="sourceLineNo">2990</span>            if (commands != null) {<a name="line.2990"></a>
<span class="sourceLineNo">2991</span>                for (final Map.Entry&lt;String, CommandLine&gt; entry : commands.entrySet()) {<a name="line.2991"></a>
<span class="sourceLineNo">2992</span>                    addSubcommand(entry.getKey(), entry.getValue().getCommand());<a name="line.2992"></a>
<span class="sourceLineNo">2993</span>                }<a name="line.2993"></a>
<span class="sourceLineNo">2994</span>            }<a name="line.2994"></a>
<span class="sourceLineNo">2995</span>            return this;<a name="line.2995"></a>
<span class="sourceLineNo">2996</span>        }<a name="line.2996"></a>
<span class="sourceLineNo">2997</span><a name="line.2997"></a>
<span class="sourceLineNo">2998</span>        /** Registers the specified subcommand with this Help.<a name="line.2998"></a>
<span class="sourceLineNo">2999</span>         * @param commandName the name of the subcommand to display in the usage message<a name="line.2999"></a>
<span class="sourceLineNo">3000</span>         * @param command the annotated object to get more information from<a name="line.3000"></a>
<span class="sourceLineNo">3001</span>         * @return this Help instance (for method chaining)<a name="line.3001"></a>
<span class="sourceLineNo">3002</span>         */<a name="line.3002"></a>
<span class="sourceLineNo">3003</span>        public Help addSubcommand(final String commandName, final Object command) {<a name="line.3003"></a>
<span class="sourceLineNo">3004</span>            commands.put(commandName, new Help(command));<a name="line.3004"></a>
<span class="sourceLineNo">3005</span>            return this;<a name="line.3005"></a>
<span class="sourceLineNo">3006</span>        }<a name="line.3006"></a>
<span class="sourceLineNo">3007</span><a name="line.3007"></a>
<span class="sourceLineNo">3008</span>        /** Returns a synopsis for the command without reserving space for the synopsis heading.<a name="line.3008"></a>
<span class="sourceLineNo">3009</span>         * @return a synopsis<a name="line.3009"></a>
<span class="sourceLineNo">3010</span>         * @see #abbreviatedSynopsis()<a name="line.3010"></a>
<span class="sourceLineNo">3011</span>         * @see #detailedSynopsis(Comparator, boolean)<a name="line.3011"></a>
<span class="sourceLineNo">3012</span>         * @deprecated use {@link #synopsis(int)} instead<a name="line.3012"></a>
<span class="sourceLineNo">3013</span>         */<a name="line.3013"></a>
<span class="sourceLineNo">3014</span>        @Deprecated<a name="line.3014"></a>
<span class="sourceLineNo">3015</span>        public String synopsis() { return synopsis(0); }<a name="line.3015"></a>
<span class="sourceLineNo">3016</span><a name="line.3016"></a>
<span class="sourceLineNo">3017</span>        /**<a name="line.3017"></a>
<span class="sourceLineNo">3018</span>         * Returns a synopsis for the command, reserving the specified space for the synopsis heading.<a name="line.3018"></a>
<span class="sourceLineNo">3019</span>         * @param synopsisHeadingLength the length of the synopsis heading that will be displayed on the same line<a name="line.3019"></a>
<span class="sourceLineNo">3020</span>         * @return a synopsis<a name="line.3020"></a>
<span class="sourceLineNo">3021</span>         * @see #abbreviatedSynopsis()<a name="line.3021"></a>
<span class="sourceLineNo">3022</span>         * @see #detailedSynopsis(Comparator, boolean)<a name="line.3022"></a>
<span class="sourceLineNo">3023</span>         * @see #synopsisHeading<a name="line.3023"></a>
<span class="sourceLineNo">3024</span>         */<a name="line.3024"></a>
<span class="sourceLineNo">3025</span>        public String synopsis(final int synopsisHeadingLength) {<a name="line.3025"></a>
<span class="sourceLineNo">3026</span>            if (!empty(customSynopsis)) { return customSynopsis(); }<a name="line.3026"></a>
<span class="sourceLineNo">3027</span>            return abbreviateSynopsis ? abbreviatedSynopsis()<a name="line.3027"></a>
<span class="sourceLineNo">3028</span>                    : detailedSynopsis(synopsisHeadingLength, createShortOptionArityAndNameComparator(), true);<a name="line.3028"></a>
<span class="sourceLineNo">3029</span>        }<a name="line.3029"></a>
<span class="sourceLineNo">3030</span><a name="line.3030"></a>
<span class="sourceLineNo">3031</span>        /** Generates a generic synopsis like {@code &lt;command name&gt; [OPTIONS] [PARAM1 [PARAM2]...]}, omitting parts<a name="line.3031"></a>
<span class="sourceLineNo">3032</span>         * that don't apply to the command (e.g., does not show [OPTIONS] if the command has no options).<a name="line.3032"></a>
<span class="sourceLineNo">3033</span>         * @return a generic synopsis */<a name="line.3033"></a>
<span class="sourceLineNo">3034</span>        public String abbreviatedSynopsis() {<a name="line.3034"></a>
<span class="sourceLineNo">3035</span>            final StringBuilder sb = new StringBuilder();<a name="line.3035"></a>
<span class="sourceLineNo">3036</span>            if (!optionFields.isEmpty()) { // only show if annotated object actually has options<a name="line.3036"></a>
<span class="sourceLineNo">3037</span>                sb.append(" [OPTIONS]");<a name="line.3037"></a>
<span class="sourceLineNo">3038</span>            }<a name="line.3038"></a>
<span class="sourceLineNo">3039</span>            // sb.append(" [--] "); // implied<a name="line.3039"></a>
<span class="sourceLineNo">3040</span>            for (final Field positionalParam : positionalParametersFields) {<a name="line.3040"></a>
<span class="sourceLineNo">3041</span>                if (!positionalParam.getAnnotation(Parameters.class).hidden()) {<a name="line.3041"></a>
<span class="sourceLineNo">3042</span>                    sb.append(' ').append(parameterLabelRenderer.renderParameterLabel(positionalParam, ansi(), colorScheme.parameterStyles));<a name="line.3042"></a>
<span class="sourceLineNo">3043</span>                }<a name="line.3043"></a>
<span class="sourceLineNo">3044</span>            }<a name="line.3044"></a>
<span class="sourceLineNo">3045</span>            return colorScheme.commandText(commandName).toString()<a name="line.3045"></a>
<span class="sourceLineNo">3046</span>                    + (sb.toString()) + System.getProperty("line.separator");<a name="line.3046"></a>
<span class="sourceLineNo">3047</span>        }<a name="line.3047"></a>
<span class="sourceLineNo">3048</span>        /** Generates a detailed synopsis message showing all options and parameters. Follows the unix convention of<a name="line.3048"></a>
<span class="sourceLineNo">3049</span>         * showing optional options and parameters in square brackets ({@code [ ]}).<a name="line.3049"></a>
<span class="sourceLineNo">3050</span>         * @param optionSort comparator to sort options or {@code null} if options should not be sorted<a name="line.3050"></a>
<span class="sourceLineNo">3051</span>         * @param clusterBooleanOptions {@code true} if boolean short options should be clustered into a single string<a name="line.3051"></a>
<span class="sourceLineNo">3052</span>         * @return a detailed synopsis<a name="line.3052"></a>
<span class="sourceLineNo">3053</span>         * @deprecated use {@link #detailedSynopsis(int, Comparator, boolean)} instead. */<a name="line.3053"></a>
<span class="sourceLineNo">3054</span>        @Deprecated<a name="line.3054"></a>
<span class="sourceLineNo">3055</span>        public String detailedSynopsis(final Comparator&lt;Field&gt; optionSort, final boolean clusterBooleanOptions) {<a name="line.3055"></a>
<span class="sourceLineNo">3056</span>            return detailedSynopsis(0, optionSort, clusterBooleanOptions);<a name="line.3056"></a>
<span class="sourceLineNo">3057</span>        }<a name="line.3057"></a>
<span class="sourceLineNo">3058</span><a name="line.3058"></a>
<span class="sourceLineNo">3059</span>        /** Generates a detailed synopsis message showing all options and parameters. Follows the unix convention of<a name="line.3059"></a>
<span class="sourceLineNo">3060</span>         * showing optional options and parameters in square brackets ({@code [ ]}).<a name="line.3060"></a>
<span class="sourceLineNo">3061</span>         * @param synopsisHeadingLength the length of the synopsis heading that will be displayed on the same line<a name="line.3061"></a>
<span class="sourceLineNo">3062</span>         * @param optionSort comparator to sort options or {@code null} if options should not be sorted<a name="line.3062"></a>
<span class="sourceLineNo">3063</span>         * @param clusterBooleanOptions {@code true} if boolean short options should be clustered into a single string<a name="line.3063"></a>
<span class="sourceLineNo">3064</span>         * @return a detailed synopsis */<a name="line.3064"></a>
<span class="sourceLineNo">3065</span>        public String detailedSynopsis(final int synopsisHeadingLength, final Comparator&lt;Field&gt; optionSort, final boolean clusterBooleanOptions) {<a name="line.3065"></a>
<span class="sourceLineNo">3066</span>            Text optionText = ansi().new Text(0);<a name="line.3066"></a>
<span class="sourceLineNo">3067</span>            final List&lt;Field&gt; fields = new ArrayList&lt;Field&gt;(optionFields); // iterate in declaration order<a name="line.3067"></a>
<span class="sourceLineNo">3068</span>            if (optionSort != null) {<a name="line.3068"></a>
<span class="sourceLineNo">3069</span>                Collections.sort(fields, optionSort);// iterate in specified sort order<a name="line.3069"></a>
<span class="sourceLineNo">3070</span>            }<a name="line.3070"></a>
<span class="sourceLineNo">3071</span>            if (clusterBooleanOptions) { // cluster all short boolean options into a single string<a name="line.3071"></a>
<span class="sourceLineNo">3072</span>                final List&lt;Field&gt; booleanOptions = new ArrayList&lt;Field&gt;();<a name="line.3072"></a>
<span class="sourceLineNo">3073</span>                final StringBuilder clusteredRequired = new StringBuilder("-");<a name="line.3073"></a>
<span class="sourceLineNo">3074</span>                final StringBuilder clusteredOptional = new StringBuilder("-");<a name="line.3074"></a>
<span class="sourceLineNo">3075</span>                for (final Field field : fields) {<a name="line.3075"></a>
<span class="sourceLineNo">3076</span>                    if (field.getType() == boolean.class || field.getType() == Boolean.class) {<a name="line.3076"></a>
<span class="sourceLineNo">3077</span>                        final Option option = field.getAnnotation(Option.class);<a name="line.3077"></a>
<span class="sourceLineNo">3078</span>                        final String shortestName = ShortestFirst.sort(option.names())[0];<a name="line.3078"></a>
<span class="sourceLineNo">3079</span>                        if (shortestName.length() == 2 &amp;&amp; shortestName.startsWith("-")) {<a name="line.3079"></a>
<span class="sourceLineNo">3080</span>                            booleanOptions.add(field);<a name="line.3080"></a>
<span class="sourceLineNo">3081</span>                            if (option.required()) {<a name="line.3081"></a>
<span class="sourceLineNo">3082</span>                                clusteredRequired.append(shortestName.substring(1));<a name="line.3082"></a>
<span class="sourceLineNo">3083</span>                            } else {<a name="line.3083"></a>
<span class="sourceLineNo">3084</span>                                clusteredOptional.append(shortestName.substring(1));<a name="line.3084"></a>
<span class="sourceLineNo">3085</span>                            }<a name="line.3085"></a>
<span class="sourceLineNo">3086</span>                        }<a name="line.3086"></a>
<span class="sourceLineNo">3087</span>                    }<a name="line.3087"></a>
<span class="sourceLineNo">3088</span>                }<a name="line.3088"></a>
<span class="sourceLineNo">3089</span>                fields.removeAll(booleanOptions);<a name="line.3089"></a>
<span class="sourceLineNo">3090</span>                if (clusteredRequired.length() &gt; 1) { // initial length was 1<a name="line.3090"></a>
<span class="sourceLineNo">3091</span>                    optionText = optionText.append(" ").append(colorScheme.optionText(clusteredRequired.toString()));<a name="line.3091"></a>
<span class="sourceLineNo">3092</span>                }<a name="line.3092"></a>
<span class="sourceLineNo">3093</span>                if (clusteredOptional.length() &gt; 1) { // initial length was 1<a name="line.3093"></a>
<span class="sourceLineNo">3094</span>                    optionText = optionText.append(" [").append(colorScheme.optionText(clusteredOptional.toString())).append("]");<a name="line.3094"></a>
<span class="sourceLineNo">3095</span>                }<a name="line.3095"></a>
<span class="sourceLineNo">3096</span>            }<a name="line.3096"></a>
<span class="sourceLineNo">3097</span>            for (final Field field : fields) {<a name="line.3097"></a>
<span class="sourceLineNo">3098</span>                final Option option = field.getAnnotation(Option.class);<a name="line.3098"></a>
<span class="sourceLineNo">3099</span>                if (!option.hidden()) {<a name="line.3099"></a>
<span class="sourceLineNo">3100</span>                    if (option.required()) {<a name="line.3100"></a>
<span class="sourceLineNo">3101</span>                        optionText = appendOptionSynopsis(optionText, field, ShortestFirst.sort(option.names())[0], " ", "");<a name="line.3101"></a>
<span class="sourceLineNo">3102</span>                        if (isMultiValue(field)) {<a name="line.3102"></a>
<span class="sourceLineNo">3103</span>                            optionText = appendOptionSynopsis(optionText, field, ShortestFirst.sort(option.names())[0], " [", "]...");<a name="line.3103"></a>
<span class="sourceLineNo">3104</span>                        }<a name="line.3104"></a>
<span class="sourceLineNo">3105</span>                    } else {<a name="line.3105"></a>
<span class="sourceLineNo">3106</span>                        optionText = appendOptionSynopsis(optionText, field, ShortestFirst.sort(option.names())[0], " [", "]");<a name="line.3106"></a>
<span class="sourceLineNo">3107</span>                        if (isMultiValue(field)) {<a name="line.3107"></a>
<span class="sourceLineNo">3108</span>                            optionText = optionText.append("...");<a name="line.3108"></a>
<span class="sourceLineNo">3109</span>                        }<a name="line.3109"></a>
<span class="sourceLineNo">3110</span>                    }<a name="line.3110"></a>
<span class="sourceLineNo">3111</span>                }<a name="line.3111"></a>
<span class="sourceLineNo">3112</span>            }<a name="line.3112"></a>
<span class="sourceLineNo">3113</span>            for (final Field positionalParam : positionalParametersFields) {<a name="line.3113"></a>
<span class="sourceLineNo">3114</span>                if (!positionalParam.getAnnotation(Parameters.class).hidden()) {<a name="line.3114"></a>
<span class="sourceLineNo">3115</span>                    optionText = optionText.append(" ");<a name="line.3115"></a>
<span class="sourceLineNo">3116</span>                    final Text label = parameterLabelRenderer.renderParameterLabel(positionalParam, colorScheme.ansi(), colorScheme.parameterStyles);<a name="line.3116"></a>
<span class="sourceLineNo">3117</span>                    optionText = optionText.append(label);<a name="line.3117"></a>
<span class="sourceLineNo">3118</span>                }<a name="line.3118"></a>
<span class="sourceLineNo">3119</span>            }<a name="line.3119"></a>
<span class="sourceLineNo">3120</span>            // Fix for #142: first line of synopsis overshoots max. characters<a name="line.3120"></a>
<span class="sourceLineNo">3121</span>            final int firstColumnLength = commandName.length() + synopsisHeadingLength;<a name="line.3121"></a>
<span class="sourceLineNo">3122</span><a name="line.3122"></a>
<span class="sourceLineNo">3123</span>            // synopsis heading ("Usage: ") may be on the same line, so adjust column width<a name="line.3123"></a>
<span class="sourceLineNo">3124</span>            final TextTable textTable = new TextTable(ansi(), firstColumnLength, usageHelpWidth - firstColumnLength);<a name="line.3124"></a>
<span class="sourceLineNo">3125</span>            textTable.indentWrappedLines = 1; // don't worry about first line: options (2nd column) always start with a space<a name="line.3125"></a>
<span class="sourceLineNo">3126</span><a name="line.3126"></a>
<span class="sourceLineNo">3127</span>            // right-adjust the command name by length of synopsis heading<a name="line.3127"></a>
<span class="sourceLineNo">3128</span>            final Text PADDING = Ansi.OFF.new Text(stringOf('X', synopsisHeadingLength));<a name="line.3128"></a>
<span class="sourceLineNo">3129</span>            textTable.addRowValues(new Text[] {PADDING.append(colorScheme.commandText(commandName)), optionText});<a name="line.3129"></a>
<span class="sourceLineNo">3130</span>            return textTable.toString().substring(synopsisHeadingLength); // cut off leading synopsis heading spaces<a name="line.3130"></a>
<span class="sourceLineNo">3131</span>        }<a name="line.3131"></a>
<span class="sourceLineNo">3132</span><a name="line.3132"></a>
<span class="sourceLineNo">3133</span>        private Text appendOptionSynopsis(final Text optionText, final Field field, final String optionName, final String prefix, final String suffix) {<a name="line.3133"></a>
<span class="sourceLineNo">3134</span>            final Text optionParamText = parameterLabelRenderer.renderParameterLabel(field, colorScheme.ansi(), colorScheme.optionParamStyles);<a name="line.3134"></a>
<span class="sourceLineNo">3135</span>            return optionText.append(prefix)<a name="line.3135"></a>
<span class="sourceLineNo">3136</span>                    .append(colorScheme.optionText(optionName))<a name="line.3136"></a>
<span class="sourceLineNo">3137</span>                    .append(optionParamText)<a name="line.3137"></a>
<span class="sourceLineNo">3138</span>                    .append(suffix);<a name="line.3138"></a>
<span class="sourceLineNo">3139</span>        }<a name="line.3139"></a>
<span class="sourceLineNo">3140</span><a name="line.3140"></a>
<span class="sourceLineNo">3141</span>        /** Returns the number of characters the synopsis heading will take on the same line as the synopsis.<a name="line.3141"></a>
<span class="sourceLineNo">3142</span>         * @return the number of characters the synopsis heading will take on the same line as the synopsis.<a name="line.3142"></a>
<span class="sourceLineNo">3143</span>         * @see #detailedSynopsis(int, Comparator, boolean)<a name="line.3143"></a>
<span class="sourceLineNo">3144</span>         */<a name="line.3144"></a>
<span class="sourceLineNo">3145</span>        public int synopsisHeadingLength() {<a name="line.3145"></a>
<span class="sourceLineNo">3146</span>            final String[] lines = Ansi.OFF.new Text(synopsisHeading).toString().split("\\r?\\n|\\r|%n", -1);<a name="line.3146"></a>
<span class="sourceLineNo">3147</span>            return lines[lines.length - 1].length();<a name="line.3147"></a>
<span class="sourceLineNo">3148</span>        }<a name="line.3148"></a>
<span class="sourceLineNo">3149</span>        /**<a name="line.3149"></a>
<span class="sourceLineNo">3150</span>         * &lt;p&gt;Returns a description of the {@linkplain Option options} supported by the application.<a name="line.3150"></a>
<span class="sourceLineNo">3151</span>         * This implementation {@linkplain #createShortOptionNameComparator() sorts options alphabetically}, and shows<a name="line.3151"></a>
<span class="sourceLineNo">3152</span>         * only the {@linkplain Option#hidden() non-hidden} options in a {@linkplain TextTable tabular format}<a name="line.3152"></a>
<span class="sourceLineNo">3153</span>         * using the {@linkplain #createDefaultOptionRenderer() default renderer} and {@linkplain Layout default layout}.&lt;/p&gt;<a name="line.3153"></a>
<span class="sourceLineNo">3154</span>         * @return the fully formatted option list<a name="line.3154"></a>
<span class="sourceLineNo">3155</span>         * @see #optionList(Layout, Comparator, IParamLabelRenderer)<a name="line.3155"></a>
<span class="sourceLineNo">3156</span>         */<a name="line.3156"></a>
<span class="sourceLineNo">3157</span>        public String optionList() {<a name="line.3157"></a>
<span class="sourceLineNo">3158</span>            final Comparator&lt;Field&gt; sortOrder = sortOptions == null || sortOptions.booleanValue()<a name="line.3158"></a>
<span class="sourceLineNo">3159</span>                    ? createShortOptionNameComparator()<a name="line.3159"></a>
<span class="sourceLineNo">3160</span>                    : null;<a name="line.3160"></a>
<span class="sourceLineNo">3161</span>            return optionList(createDefaultLayout(), sortOrder, parameterLabelRenderer);<a name="line.3161"></a>
<span class="sourceLineNo">3162</span>        }<a name="line.3162"></a>
<span class="sourceLineNo">3163</span><a name="line.3163"></a>
<span class="sourceLineNo">3164</span>        /** Sorts all {@code Options} with the specified {@code comparator} (if the comparator is non-{@code null}),<a name="line.3164"></a>
<span class="sourceLineNo">3165</span>         * then {@linkplain Layout#addOption(Field, CommandLine.Help.IParamLabelRenderer) adds} all non-hidden options to the<a name="line.3165"></a>
<span class="sourceLineNo">3166</span>         * specified TextTable and returns the result of TextTable.toString().<a name="line.3166"></a>
<span class="sourceLineNo">3167</span>         * @param layout responsible for rendering the option list<a name="line.3167"></a>
<span class="sourceLineNo">3168</span>         * @param optionSort determines in what order {@code Options} should be listed. Declared order if {@code null}<a name="line.3168"></a>
<span class="sourceLineNo">3169</span>         * @param valueLabelRenderer used for options with a parameter<a name="line.3169"></a>
<span class="sourceLineNo">3170</span>         * @return the fully formatted option list<a name="line.3170"></a>
<span class="sourceLineNo">3171</span>         */<a name="line.3171"></a>
<span class="sourceLineNo">3172</span>        public String optionList(final Layout layout, final Comparator&lt;Field&gt; optionSort, final IParamLabelRenderer valueLabelRenderer) {<a name="line.3172"></a>
<span class="sourceLineNo">3173</span>            final List&lt;Field&gt; fields = new ArrayList&lt;Field&gt;(optionFields); // options are stored in order of declaration<a name="line.3173"></a>
<span class="sourceLineNo">3174</span>            if (optionSort != null) {<a name="line.3174"></a>
<span class="sourceLineNo">3175</span>                Collections.sort(fields, optionSort); // default: sort options ABC<a name="line.3175"></a>
<span class="sourceLineNo">3176</span>            }<a name="line.3176"></a>
<span class="sourceLineNo">3177</span>            layout.addOptions(fields, valueLabelRenderer);<a name="line.3177"></a>
<span class="sourceLineNo">3178</span>            return layout.toString();<a name="line.3178"></a>
<span class="sourceLineNo">3179</span>        }<a name="line.3179"></a>
<span class="sourceLineNo">3180</span><a name="line.3180"></a>
<span class="sourceLineNo">3181</span>        /**<a name="line.3181"></a>
<span class="sourceLineNo">3182</span>         * Returns the section of the usage help message that lists the parameters with their descriptions.<a name="line.3182"></a>
<span class="sourceLineNo">3183</span>         * @return the section of the usage help message that lists the parameters<a name="line.3183"></a>
<span class="sourceLineNo">3184</span>         */<a name="line.3184"></a>
<span class="sourceLineNo">3185</span>        public String parameterList() {<a name="line.3185"></a>
<span class="sourceLineNo">3186</span>            return parameterList(createDefaultLayout(), parameterLabelRenderer);<a name="line.3186"></a>
<span class="sourceLineNo">3187</span>        }<a name="line.3187"></a>
<span class="sourceLineNo">3188</span>        /**<a name="line.3188"></a>
<span class="sourceLineNo">3189</span>         * Returns the section of the usage help message that lists the parameters with their descriptions.<a name="line.3189"></a>
<span class="sourceLineNo">3190</span>         * @param layout the layout to use<a name="line.3190"></a>
<span class="sourceLineNo">3191</span>         * @param paramLabelRenderer for rendering parameter names<a name="line.3191"></a>
<span class="sourceLineNo">3192</span>         * @return the section of the usage help message that lists the parameters<a name="line.3192"></a>
<span class="sourceLineNo">3193</span>         */<a name="line.3193"></a>
<span class="sourceLineNo">3194</span>        public String parameterList(final Layout layout, final IParamLabelRenderer paramLabelRenderer) {<a name="line.3194"></a>
<span class="sourceLineNo">3195</span>            layout.addPositionalParameters(positionalParametersFields, paramLabelRenderer);<a name="line.3195"></a>
<span class="sourceLineNo">3196</span>            return layout.toString();<a name="line.3196"></a>
<span class="sourceLineNo">3197</span>        }<a name="line.3197"></a>
<span class="sourceLineNo">3198</span><a name="line.3198"></a>
<span class="sourceLineNo">3199</span>        private static String heading(final Ansi ansi, final String values, final Object... params) {<a name="line.3199"></a>
<span class="sourceLineNo">3200</span>            final StringBuilder sb = join(ansi, new String[] {values}, new StringBuilder(), params);<a name="line.3200"></a>
<span class="sourceLineNo">3201</span>            String result = sb.toString();<a name="line.3201"></a>
<span class="sourceLineNo">3202</span>            result = result.endsWith(System.getProperty("line.separator"))<a name="line.3202"></a>
<span class="sourceLineNo">3203</span>                    ? result.substring(0, result.length() - System.getProperty("line.separator").length()) : result;<a name="line.3203"></a>
<span class="sourceLineNo">3204</span>            return result + new String(spaces(countTrailingSpaces(values)));<a name="line.3204"></a>
<span class="sourceLineNo">3205</span>        }<a name="line.3205"></a>
<span class="sourceLineNo">3206</span>        private static char[] spaces(final int length) { final char[] result = new char[length]; Arrays.fill(result, ' '); return result; }<a name="line.3206"></a>
<span class="sourceLineNo">3207</span>        private static int countTrailingSpaces(final String str) {<a name="line.3207"></a>
<span class="sourceLineNo">3208</span>            if (str == null) {return 0;}<a name="line.3208"></a>
<span class="sourceLineNo">3209</span>            int trailingSpaces = 0;<a name="line.3209"></a>
<span class="sourceLineNo">3210</span>            for (int i = str.length() - 1; i &gt;= 0 &amp;&amp; str.charAt(i) == ' '; i--) { trailingSpaces++; }<a name="line.3210"></a>
<span class="sourceLineNo">3211</span>            return trailingSpaces;<a name="line.3211"></a>
<span class="sourceLineNo">3212</span>        }<a name="line.3212"></a>
<span class="sourceLineNo">3213</span><a name="line.3213"></a>
<span class="sourceLineNo">3214</span>        /** Formats each of the specified values and appends it to the specified StringBuilder.<a name="line.3214"></a>
<span class="sourceLineNo">3215</span>         * @param ansi whether the result should contain ANSI escape codes or not<a name="line.3215"></a>
<span class="sourceLineNo">3216</span>         * @param values the values to format and append to the StringBuilder<a name="line.3216"></a>
<span class="sourceLineNo">3217</span>         * @param sb the StringBuilder to collect the formatted strings<a name="line.3217"></a>
<span class="sourceLineNo">3218</span>         * @param params the parameters to pass to the format method when formatting each value<a name="line.3218"></a>
<span class="sourceLineNo">3219</span>         * @return the specified StringBuilder */<a name="line.3219"></a>
<span class="sourceLineNo">3220</span>        public static StringBuilder join(final Ansi ansi, final String[] values, final StringBuilder sb, final Object... params) {<a name="line.3220"></a>
<span class="sourceLineNo">3221</span>            if (values != null) {<a name="line.3221"></a>
<span class="sourceLineNo">3222</span>                final TextTable table = new TextTable(ansi, usageHelpWidth);<a name="line.3222"></a>
<span class="sourceLineNo">3223</span>                table.indentWrappedLines = 0;<a name="line.3223"></a>
<span class="sourceLineNo">3224</span>                for (final String summaryLine : values) {<a name="line.3224"></a>
<span class="sourceLineNo">3225</span>                    final Text[] lines = ansi.new Text(format(summaryLine, params)).splitLines();<a name="line.3225"></a>
<span class="sourceLineNo">3226</span>                    for (final Text line : lines) {  table.addRowValues(line); }<a name="line.3226"></a>
<span class="sourceLineNo">3227</span>                }<a name="line.3227"></a>
<span class="sourceLineNo">3228</span>                table.toString(sb);<a name="line.3228"></a>
<span class="sourceLineNo">3229</span>            }<a name="line.3229"></a>
<span class="sourceLineNo">3230</span>            return sb;<a name="line.3230"></a>
<span class="sourceLineNo">3231</span>        }<a name="line.3231"></a>
<span class="sourceLineNo">3232</span>        private static String format(final String formatString,  final Object... params) {<a name="line.3232"></a>
<span class="sourceLineNo">3233</span>            return formatString == null ? "" : String.format(formatString, params);<a name="line.3233"></a>
<span class="sourceLineNo">3234</span>        }<a name="line.3234"></a>
<span class="sourceLineNo">3235</span>        /** Returns command custom synopsis as a string. A custom synopsis can be zero or more lines, and can be<a name="line.3235"></a>
<span class="sourceLineNo">3236</span>         * specified declaratively with the {@link Command#customSynopsis()} annotation attribute or programmatically<a name="line.3236"></a>
<span class="sourceLineNo">3237</span>         * by setting the Help instance's {@link Help#customSynopsis} field.<a name="line.3237"></a>
<span class="sourceLineNo">3238</span>         * @param params Arguments referenced by the format specifiers in the synopsis strings<a name="line.3238"></a>
<span class="sourceLineNo">3239</span>         * @return the custom synopsis lines combined into a single String (which may be empty)<a name="line.3239"></a>
<span class="sourceLineNo">3240</span>         */<a name="line.3240"></a>
<span class="sourceLineNo">3241</span>        public String customSynopsis(final Object... params) {<a name="line.3241"></a>
<span class="sourceLineNo">3242</span>            return join(ansi(), customSynopsis, new StringBuilder(), params).toString();<a name="line.3242"></a>
<span class="sourceLineNo">3243</span>        }<a name="line.3243"></a>
<span class="sourceLineNo">3244</span>        /** Returns command description text as a string. Description text can be zero or more lines, and can be specified<a name="line.3244"></a>
<span class="sourceLineNo">3245</span>         * declaratively with the {@link Command#description()} annotation attribute or programmatically by<a name="line.3245"></a>
<span class="sourceLineNo">3246</span>         * setting the Help instance's {@link Help#description} field.<a name="line.3246"></a>
<span class="sourceLineNo">3247</span>         * @param params Arguments referenced by the format specifiers in the description strings<a name="line.3247"></a>
<span class="sourceLineNo">3248</span>         * @return the description lines combined into a single String (which may be empty)<a name="line.3248"></a>
<span class="sourceLineNo">3249</span>         */<a name="line.3249"></a>
<span class="sourceLineNo">3250</span>        public String description(final Object... params) {<a name="line.3250"></a>
<span class="sourceLineNo">3251</span>            return join(ansi(), description, new StringBuilder(), params).toString();<a name="line.3251"></a>
<span class="sourceLineNo">3252</span>        }<a name="line.3252"></a>
<span class="sourceLineNo">3253</span>        /** Returns the command header text as a string. Header text can be zero or more lines, and can be specified<a name="line.3253"></a>
<span class="sourceLineNo">3254</span>         * declaratively with the {@link Command#header()} annotation attribute or programmatically by<a name="line.3254"></a>
<span class="sourceLineNo">3255</span>         * setting the Help instance's {@link Help#header} field.<a name="line.3255"></a>
<span class="sourceLineNo">3256</span>         * @param params Arguments referenced by the format specifiers in the header strings<a name="line.3256"></a>
<span class="sourceLineNo">3257</span>         * @return the header lines combined into a single String (which may be empty)<a name="line.3257"></a>
<span class="sourceLineNo">3258</span>         */<a name="line.3258"></a>
<span class="sourceLineNo">3259</span>        public String header(final Object... params) {<a name="line.3259"></a>
<span class="sourceLineNo">3260</span>            return join(ansi(), header, new StringBuilder(), params).toString();<a name="line.3260"></a>
<span class="sourceLineNo">3261</span>        }<a name="line.3261"></a>
<span class="sourceLineNo">3262</span>        /** Returns command footer text as a string. Footer text can be zero or more lines, and can be specified<a name="line.3262"></a>
<span class="sourceLineNo">3263</span>         * declaratively with the {@link Command#footer()} annotation attribute or programmatically by<a name="line.3263"></a>
<span class="sourceLineNo">3264</span>         * setting the Help instance's {@link Help#footer} field.<a name="line.3264"></a>
<span class="sourceLineNo">3265</span>         * @param params Arguments referenced by the format specifiers in the footer strings<a name="line.3265"></a>
<span class="sourceLineNo">3266</span>         * @return the footer lines combined into a single String (which may be empty)<a name="line.3266"></a>
<span class="sourceLineNo">3267</span>         */<a name="line.3267"></a>
<span class="sourceLineNo">3268</span>        public String footer(final Object... params) {<a name="line.3268"></a>
<span class="sourceLineNo">3269</span>            return join(ansi(), footer, new StringBuilder(), params).toString();<a name="line.3269"></a>
<span class="sourceLineNo">3270</span>        }<a name="line.3270"></a>
<span class="sourceLineNo">3271</span><a name="line.3271"></a>
<span class="sourceLineNo">3272</span>        /** Returns the text displayed before the header text; the result of {@code String.format(headerHeading, params)}.<a name="line.3272"></a>
<span class="sourceLineNo">3273</span>         * @param params the parameters to use to format the header heading<a name="line.3273"></a>
<span class="sourceLineNo">3274</span>         * @return the formatted header heading */<a name="line.3274"></a>
<span class="sourceLineNo">3275</span>        public String headerHeading(final Object... params) {<a name="line.3275"></a>
<span class="sourceLineNo">3276</span>            return heading(ansi(), headerHeading, params);<a name="line.3276"></a>
<span class="sourceLineNo">3277</span>        }<a name="line.3277"></a>
<span class="sourceLineNo">3278</span><a name="line.3278"></a>
<span class="sourceLineNo">3279</span>        /** Returns the text displayed before the synopsis text; the result of {@code String.format(synopsisHeading, params)}.<a name="line.3279"></a>
<span class="sourceLineNo">3280</span>         * @param params the parameters to use to format the synopsis heading<a name="line.3280"></a>
<span class="sourceLineNo">3281</span>         * @return the formatted synopsis heading */<a name="line.3281"></a>
<span class="sourceLineNo">3282</span>        public String synopsisHeading(final Object... params) {<a name="line.3282"></a>
<span class="sourceLineNo">3283</span>            return heading(ansi(), synopsisHeading, params);<a name="line.3283"></a>
<span class="sourceLineNo">3284</span>        }<a name="line.3284"></a>
<span class="sourceLineNo">3285</span><a name="line.3285"></a>
<span class="sourceLineNo">3286</span>        /** Returns the text displayed before the description text; an empty string if there is no description,<a name="line.3286"></a>
<span class="sourceLineNo">3287</span>         * otherwise the result of {@code String.format(descriptionHeading, params)}.<a name="line.3287"></a>
<span class="sourceLineNo">3288</span>         * @param params the parameters to use to format the description heading<a name="line.3288"></a>
<span class="sourceLineNo">3289</span>         * @return the formatted description heading */<a name="line.3289"></a>
<span class="sourceLineNo">3290</span>        public String descriptionHeading(final Object... params) {<a name="line.3290"></a>
<span class="sourceLineNo">3291</span>            return empty(descriptionHeading) ? "" : heading(ansi(), descriptionHeading, params);<a name="line.3291"></a>
<span class="sourceLineNo">3292</span>        }<a name="line.3292"></a>
<span class="sourceLineNo">3293</span><a name="line.3293"></a>
<span class="sourceLineNo">3294</span>        /** Returns the text displayed before the positional parameter list; an empty string if there are no positional<a name="line.3294"></a>
<span class="sourceLineNo">3295</span>         * parameters, otherwise the result of {@code String.format(parameterListHeading, params)}.<a name="line.3295"></a>
<span class="sourceLineNo">3296</span>         * @param params the parameters to use to format the parameter list heading<a name="line.3296"></a>
<span class="sourceLineNo">3297</span>         * @return the formatted parameter list heading */<a name="line.3297"></a>
<span class="sourceLineNo">3298</span>        public String parameterListHeading(final Object... params) {<a name="line.3298"></a>
<span class="sourceLineNo">3299</span>            return positionalParametersFields.isEmpty() ? "" : heading(ansi(), parameterListHeading, params);<a name="line.3299"></a>
<span class="sourceLineNo">3300</span>        }<a name="line.3300"></a>
<span class="sourceLineNo">3301</span><a name="line.3301"></a>
<span class="sourceLineNo">3302</span>        /** Returns the text displayed before the option list; an empty string if there are no options,<a name="line.3302"></a>
<span class="sourceLineNo">3303</span>         * otherwise the result of {@code String.format(optionListHeading, params)}.<a name="line.3303"></a>
<span class="sourceLineNo">3304</span>         * @param params the parameters to use to format the option list heading<a name="line.3304"></a>
<span class="sourceLineNo">3305</span>         * @return the formatted option list heading */<a name="line.3305"></a>
<span class="sourceLineNo">3306</span>        public String optionListHeading(final Object... params) {<a name="line.3306"></a>
<span class="sourceLineNo">3307</span>            return optionFields.isEmpty() ? "" : heading(ansi(), optionListHeading, params);<a name="line.3307"></a>
<span class="sourceLineNo">3308</span>        }<a name="line.3308"></a>
<span class="sourceLineNo">3309</span><a name="line.3309"></a>
<span class="sourceLineNo">3310</span>        /** Returns the text displayed before the command list; an empty string if there are no commands,<a name="line.3310"></a>
<span class="sourceLineNo">3311</span>         * otherwise the result of {@code String.format(commandListHeading, params)}.<a name="line.3311"></a>
<span class="sourceLineNo">3312</span>         * @param params the parameters to use to format the command list heading<a name="line.3312"></a>
<span class="sourceLineNo">3313</span>         * @return the formatted command list heading */<a name="line.3313"></a>
<span class="sourceLineNo">3314</span>        public String commandListHeading(final Object... params) {<a name="line.3314"></a>
<span class="sourceLineNo">3315</span>            return commands.isEmpty() ? "" : heading(ansi(), commandListHeading, params);<a name="line.3315"></a>
<span class="sourceLineNo">3316</span>        }<a name="line.3316"></a>
<span class="sourceLineNo">3317</span><a name="line.3317"></a>
<span class="sourceLineNo">3318</span>        /** Returns the text displayed before the footer text; the result of {@code String.format(footerHeading, params)}.<a name="line.3318"></a>
<span class="sourceLineNo">3319</span>         * @param params the parameters to use to format the footer heading<a name="line.3319"></a>
<span class="sourceLineNo">3320</span>         * @return the formatted footer heading */<a name="line.3320"></a>
<span class="sourceLineNo">3321</span>        public String footerHeading(final Object... params) {<a name="line.3321"></a>
<span class="sourceLineNo">3322</span>            return heading(ansi(), footerHeading, params);<a name="line.3322"></a>
<span class="sourceLineNo">3323</span>        }<a name="line.3323"></a>
<span class="sourceLineNo">3324</span>        /** Returns a 2-column list with command names and the first line of their header or (if absent) description.<a name="line.3324"></a>
<span class="sourceLineNo">3325</span>         * @return a usage help section describing the added commands */<a name="line.3325"></a>
<span class="sourceLineNo">3326</span>        public String commandList() {<a name="line.3326"></a>
<span class="sourceLineNo">3327</span>            if (commands.isEmpty()) { return ""; }<a name="line.3327"></a>
<span class="sourceLineNo">3328</span>            final int commandLength = maxLength(commands.keySet());<a name="line.3328"></a>
<span class="sourceLineNo">3329</span>            final Help.TextTable textTable = new Help.TextTable(ansi(),<a name="line.3329"></a>
<span class="sourceLineNo">3330</span>                    new Help.Column(commandLength + 2, 2, Help.Column.Overflow.SPAN),<a name="line.3330"></a>
<span class="sourceLineNo">3331</span>                    new Help.Column(usageHelpWidth - (commandLength + 2), 2, Help.Column.Overflow.WRAP));<a name="line.3331"></a>
<span class="sourceLineNo">3332</span><a name="line.3332"></a>
<span class="sourceLineNo">3333</span>            for (final Map.Entry&lt;String, Help&gt; entry : commands.entrySet()) {<a name="line.3333"></a>
<span class="sourceLineNo">3334</span>                final Help command = entry.getValue();<a name="line.3334"></a>
<span class="sourceLineNo">3335</span>                final String header = command.header != null &amp;&amp; command.header.length &gt; 0 ? command.header[0]<a name="line.3335"></a>
<span class="sourceLineNo">3336</span>                        : (command.description != null &amp;&amp; command.description.length &gt; 0 ? command.description[0] : "");<a name="line.3336"></a>
<span class="sourceLineNo">3337</span>                textTable.addRowValues(colorScheme.commandText(entry.getKey()), ansi().new Text(header));<a name="line.3337"></a>
<span class="sourceLineNo">3338</span>            }<a name="line.3338"></a>
<span class="sourceLineNo">3339</span>            return textTable.toString();<a name="line.3339"></a>
<span class="sourceLineNo">3340</span>        }<a name="line.3340"></a>
<span class="sourceLineNo">3341</span>        private static int maxLength(final Collection&lt;String&gt; any) {<a name="line.3341"></a>
<span class="sourceLineNo">3342</span>            final List&lt;String&gt; strings = new ArrayList&lt;String&gt;(any);<a name="line.3342"></a>
<span class="sourceLineNo">3343</span>            Collections.sort(strings, Collections.reverseOrder(Help.shortestFirst()));<a name="line.3343"></a>
<span class="sourceLineNo">3344</span>            return strings.get(0).length();<a name="line.3344"></a>
<span class="sourceLineNo">3345</span>        }<a name="line.3345"></a>
<span class="sourceLineNo">3346</span>        private static String join(final String[] names, final int offset, final int length, final String separator) {<a name="line.3346"></a>
<span class="sourceLineNo">3347</span>            if (names == null) { return ""; }<a name="line.3347"></a>
<span class="sourceLineNo">3348</span>            final StringBuilder result = new StringBuilder();<a name="line.3348"></a>
<span class="sourceLineNo">3349</span>            for (int i = offset; i &lt; offset + length; i++) {<a name="line.3349"></a>
<span class="sourceLineNo">3350</span>                result.append((i &gt; offset) ? separator : "").append(names[i]);<a name="line.3350"></a>
<span class="sourceLineNo">3351</span>            }<a name="line.3351"></a>
<span class="sourceLineNo">3352</span>            return result.toString();<a name="line.3352"></a>
<span class="sourceLineNo">3353</span>        }<a name="line.3353"></a>
<span class="sourceLineNo">3354</span>        private static String stringOf(final char chr, final int length) {<a name="line.3354"></a>
<span class="sourceLineNo">3355</span>            final char[] buff = new char[length];<a name="line.3355"></a>
<span class="sourceLineNo">3356</span>            Arrays.fill(buff, chr);<a name="line.3356"></a>
<span class="sourceLineNo">3357</span>            return new String(buff);<a name="line.3357"></a>
<span class="sourceLineNo">3358</span>        }<a name="line.3358"></a>
<span class="sourceLineNo">3359</span><a name="line.3359"></a>
<span class="sourceLineNo">3360</span>        /** Returns a {@code Layout} instance configured with the user preferences captured in this Help instance.<a name="line.3360"></a>
<span class="sourceLineNo">3361</span>         * @return a Layout */<a name="line.3361"></a>
<span class="sourceLineNo">3362</span>        public Layout createDefaultLayout() {<a name="line.3362"></a>
<span class="sourceLineNo">3363</span>            return new Layout(colorScheme, new TextTable(colorScheme.ansi()), createDefaultOptionRenderer(), createDefaultParameterRenderer());<a name="line.3363"></a>
<span class="sourceLineNo">3364</span>        }<a name="line.3364"></a>
<span class="sourceLineNo">3365</span>        /** Returns a new default OptionRenderer which converts {@link Option Options} to five columns of text to match<a name="line.3365"></a>
<span class="sourceLineNo">3366</span>         *  the default {@linkplain TextTable TextTable} column layout. The first row of values looks like this:<a name="line.3366"></a>
<span class="sourceLineNo">3367</span>         * &lt;ol&gt;<a name="line.3367"></a>
<span class="sourceLineNo">3368</span>         * &lt;li&gt;the required option marker&lt;/li&gt;<a name="line.3368"></a>
<span class="sourceLineNo">3369</span>         * &lt;li&gt;2-character short option name (or empty string if no short option exists)&lt;/li&gt;<a name="line.3369"></a>
<span class="sourceLineNo">3370</span>         * &lt;li&gt;comma separator (only if both short option and long option exist, empty string otherwise)&lt;/li&gt;<a name="line.3370"></a>
<span class="sourceLineNo">3371</span>         * &lt;li&gt;comma-separated string with long option name(s)&lt;/li&gt;<a name="line.3371"></a>
<span class="sourceLineNo">3372</span>         * &lt;li&gt;first element of the {@link Option#description()} array&lt;/li&gt;<a name="line.3372"></a>
<span class="sourceLineNo">3373</span>         * &lt;/ol&gt;<a name="line.3373"></a>
<span class="sourceLineNo">3374</span>         * &lt;p&gt;Following this, there will be one row for each of the remaining elements of the {@link<a name="line.3374"></a>
<span class="sourceLineNo">3375</span>         *   Option#description()} array, and these rows look like {@code {"", "", "", "", option.description()[i]}}.&lt;/p&gt;<a name="line.3375"></a>
<span class="sourceLineNo">3376</span>         * &lt;p&gt;If configured, this option renderer adds an additional row to display the default field value.&lt;/p&gt;<a name="line.3376"></a>
<span class="sourceLineNo">3377</span>         * @return a new default OptionRenderer<a name="line.3377"></a>
<span class="sourceLineNo">3378</span>         */<a name="line.3378"></a>
<span class="sourceLineNo">3379</span>        public IOptionRenderer createDefaultOptionRenderer() {<a name="line.3379"></a>
<span class="sourceLineNo">3380</span>            final DefaultOptionRenderer result = new DefaultOptionRenderer();<a name="line.3380"></a>
<span class="sourceLineNo">3381</span>            result.requiredMarker = String.valueOf(requiredOptionMarker);<a name="line.3381"></a>
<span class="sourceLineNo">3382</span>            if (showDefaultValues != null &amp;&amp; showDefaultValues.booleanValue()) {<a name="line.3382"></a>
<span class="sourceLineNo">3383</span>                result.command = this.command;<a name="line.3383"></a>
<span class="sourceLineNo">3384</span>            }<a name="line.3384"></a>
<span class="sourceLineNo">3385</span>            return result;<a name="line.3385"></a>
<span class="sourceLineNo">3386</span>        }<a name="line.3386"></a>
<span class="sourceLineNo">3387</span>        /** Returns a new minimal OptionRenderer which converts {@link Option Options} to a single row with two columns<a name="line.3387"></a>
<span class="sourceLineNo">3388</span>         * of text: an option name and a description. If multiple names or descriptions exist, the first value is used.<a name="line.3388"></a>
<span class="sourceLineNo">3389</span>         * @return a new minimal OptionRenderer */<a name="line.3389"></a>
<span class="sourceLineNo">3390</span>        public static IOptionRenderer createMinimalOptionRenderer() {<a name="line.3390"></a>
<span class="sourceLineNo">3391</span>            return new MinimalOptionRenderer();<a name="line.3391"></a>
<span class="sourceLineNo">3392</span>        }<a name="line.3392"></a>
<span class="sourceLineNo">3393</span><a name="line.3393"></a>
<span class="sourceLineNo">3394</span>        /** Returns a new default ParameterRenderer which converts {@link Parameters Parameters} to four columns of<a name="line.3394"></a>
<span class="sourceLineNo">3395</span>         * text to match the default {@linkplain TextTable TextTable} column layout. The first row of values looks like this:<a name="line.3395"></a>
<span class="sourceLineNo">3396</span>         * &lt;ol&gt;<a name="line.3396"></a>
<span class="sourceLineNo">3397</span>         * &lt;li&gt;empty string &lt;/li&gt;<a name="line.3397"></a>
<span class="sourceLineNo">3398</span>         * &lt;li&gt;empty string &lt;/li&gt;<a name="line.3398"></a>
<span class="sourceLineNo">3399</span>         * &lt;li&gt;parameter(s) label as rendered by the {@link IParamLabelRenderer}&lt;/li&gt;<a name="line.3399"></a>
<span class="sourceLineNo">3400</span>         * &lt;li&gt;first element of the {@link Parameters#description()} array&lt;/li&gt;<a name="line.3400"></a>
<span class="sourceLineNo">3401</span>         * &lt;/ol&gt;<a name="line.3401"></a>
<span class="sourceLineNo">3402</span>         * &lt;p&gt;Following this, there will be one row for each of the remaining elements of the {@link<a name="line.3402"></a>
<span class="sourceLineNo">3403</span>         *   Parameters#description()} array, and these rows look like {@code {"", "", "", param.description()[i]}}.&lt;/p&gt;<a name="line.3403"></a>
<span class="sourceLineNo">3404</span>         * &lt;p&gt;If configured, this parameter renderer adds an additional row to display the default field value.&lt;/p&gt;<a name="line.3404"></a>
<span class="sourceLineNo">3405</span>         * @return a new default ParameterRenderer<a name="line.3405"></a>
<span class="sourceLineNo">3406</span>         */<a name="line.3406"></a>
<span class="sourceLineNo">3407</span>        public IParameterRenderer createDefaultParameterRenderer() {<a name="line.3407"></a>
<span class="sourceLineNo">3408</span>            final DefaultParameterRenderer result = new DefaultParameterRenderer();<a name="line.3408"></a>
<span class="sourceLineNo">3409</span>            result.requiredMarker = String.valueOf(requiredOptionMarker);<a name="line.3409"></a>
<span class="sourceLineNo">3410</span>            return result;<a name="line.3410"></a>
<span class="sourceLineNo">3411</span>        }<a name="line.3411"></a>
<span class="sourceLineNo">3412</span>        /** Returns a new minimal ParameterRenderer which converts {@link Parameters Parameters} to a single row with<a name="line.3412"></a>
<span class="sourceLineNo">3413</span>         * two columns of text: an option name and a description. If multiple descriptions exist, the first value is used.<a name="line.3413"></a>
<span class="sourceLineNo">3414</span>         * @return a new minimal ParameterRenderer */<a name="line.3414"></a>
<span class="sourceLineNo">3415</span>        public static IParameterRenderer createMinimalParameterRenderer() {<a name="line.3415"></a>
<span class="sourceLineNo">3416</span>            return new MinimalParameterRenderer();<a name="line.3416"></a>
<span class="sourceLineNo">3417</span>        }<a name="line.3417"></a>
<span class="sourceLineNo">3418</span><a name="line.3418"></a>
<span class="sourceLineNo">3419</span>        /** Returns a value renderer that returns the {@code paramLabel} if defined or the field name otherwise.<a name="line.3419"></a>
<span class="sourceLineNo">3420</span>         * @return a new minimal ParamLabelRenderer */<a name="line.3420"></a>
<span class="sourceLineNo">3421</span>        public static IParamLabelRenderer createMinimalParamLabelRenderer() {<a name="line.3421"></a>
<span class="sourceLineNo">3422</span>            return new IParamLabelRenderer() {<a name="line.3422"></a>
<span class="sourceLineNo">3423</span>                @Override<a name="line.3423"></a>
<span class="sourceLineNo">3424</span>                public Text renderParameterLabel(final Field field, final Ansi ansi, final List&lt;IStyle&gt; styles) {<a name="line.3424"></a>
<span class="sourceLineNo">3425</span>                    final String text = DefaultParamLabelRenderer.renderParameterName(field);<a name="line.3425"></a>
<span class="sourceLineNo">3426</span>                    return ansi.apply(text, styles);<a name="line.3426"></a>
<span class="sourceLineNo">3427</span>                }<a name="line.3427"></a>
<span class="sourceLineNo">3428</span>                @Override<a name="line.3428"></a>
<span class="sourceLineNo">3429</span>                public String separator() { return ""; }<a name="line.3429"></a>
<span class="sourceLineNo">3430</span>            };<a name="line.3430"></a>
<span class="sourceLineNo">3431</span>        }<a name="line.3431"></a>
<span class="sourceLineNo">3432</span>        /** Returns a new default value renderer that separates option parameters from their {@linkplain Option<a name="line.3432"></a>
<span class="sourceLineNo">3433</span>         * options} with the specified separator string, surrounds optional parameters with {@code '['} and {@code ']'}<a name="line.3433"></a>
<span class="sourceLineNo">3434</span>         * characters and uses ellipses ("...") to indicate that any number of a parameter are allowed.<a name="line.3434"></a>
<span class="sourceLineNo">3435</span>         * @return a new default ParamLabelRenderer<a name="line.3435"></a>
<span class="sourceLineNo">3436</span>         */<a name="line.3436"></a>
<span class="sourceLineNo">3437</span>        public IParamLabelRenderer createDefaultParamLabelRenderer() {<a name="line.3437"></a>
<span class="sourceLineNo">3438</span>            return new DefaultParamLabelRenderer(separator);<a name="line.3438"></a>
<span class="sourceLineNo">3439</span>        }<a name="line.3439"></a>
<span class="sourceLineNo">3440</span>        /** Sorts Fields annotated with {@code Option} by their option name in case-insensitive alphabetic order. If an<a name="line.3440"></a>
<span class="sourceLineNo">3441</span>         * Option has multiple names, the shortest name is used for the sorting. Help options follow non-help options.<a name="line.3441"></a>
<span class="sourceLineNo">3442</span>         * @return a comparator that sorts fields by their option name in case-insensitive alphabetic order */<a name="line.3442"></a>
<span class="sourceLineNo">3443</span>        public static Comparator&lt;Field&gt; createShortOptionNameComparator() {<a name="line.3443"></a>
<span class="sourceLineNo">3444</span>            return new SortByShortestOptionNameAlphabetically();<a name="line.3444"></a>
<span class="sourceLineNo">3445</span>        }<a name="line.3445"></a>
<span class="sourceLineNo">3446</span>        /** Sorts Fields annotated with {@code Option} by their option {@linkplain Range#max max arity} first, by<a name="line.3446"></a>
<span class="sourceLineNo">3447</span>         * {@linkplain Range#min min arity} next, and by {@linkplain #createShortOptionNameComparator() option name} last.<a name="line.3447"></a>
<span class="sourceLineNo">3448</span>         * @return a comparator that sorts fields by arity first, then their option name */<a name="line.3448"></a>
<span class="sourceLineNo">3449</span>        public static Comparator&lt;Field&gt; createShortOptionArityAndNameComparator() {<a name="line.3449"></a>
<span class="sourceLineNo">3450</span>            return new SortByOptionArityAndNameAlphabetically();<a name="line.3450"></a>
<span class="sourceLineNo">3451</span>        }<a name="line.3451"></a>
<span class="sourceLineNo">3452</span>        /** Sorts short strings before longer strings.<a name="line.3452"></a>
<span class="sourceLineNo">3453</span>         * @return a comparators that sorts short strings before longer strings */<a name="line.3453"></a>
<span class="sourceLineNo">3454</span>        public static Comparator&lt;String&gt; shortestFirst() {<a name="line.3454"></a>
<span class="sourceLineNo">3455</span>            return new ShortestFirst();<a name="line.3455"></a>
<span class="sourceLineNo">3456</span>        }<a name="line.3456"></a>
<span class="sourceLineNo">3457</span><a name="line.3457"></a>
<span class="sourceLineNo">3458</span>        /** Returns whether ANSI escape codes are enabled or not.<a name="line.3458"></a>
<span class="sourceLineNo">3459</span>         * @return whether ANSI escape codes are enabled or not<a name="line.3459"></a>
<span class="sourceLineNo">3460</span>         */<a name="line.3460"></a>
<span class="sourceLineNo">3461</span>        public Ansi ansi() {<a name="line.3461"></a>
<span class="sourceLineNo">3462</span>            return colorScheme.ansi;<a name="line.3462"></a>
<span class="sourceLineNo">3463</span>        }<a name="line.3463"></a>
<span class="sourceLineNo">3464</span><a name="line.3464"></a>
<span class="sourceLineNo">3465</span>        /** When customizing online help for {@link Option Option} details, a custom {@code IOptionRenderer} can be<a name="line.3465"></a>
<span class="sourceLineNo">3466</span>         * used to create textual representation of an Option in a tabular format: one or more rows, each containing<a name="line.3466"></a>
<span class="sourceLineNo">3467</span>         * one or more columns. The {@link Layout Layout} is responsible for placing these text values in the<a name="line.3467"></a>
<span class="sourceLineNo">3468</span>         * {@link TextTable TextTable}. */<a name="line.3468"></a>
<span class="sourceLineNo">3469</span>        public interface IOptionRenderer {<a name="line.3469"></a>
<span class="sourceLineNo">3470</span>            /**<a name="line.3470"></a>
<span class="sourceLineNo">3471</span>             * Returns a text representation of the specified Option and the Field that captures the option value.<a name="line.3471"></a>
<span class="sourceLineNo">3472</span>             * @param option the command line option to show online usage help for<a name="line.3472"></a>
<span class="sourceLineNo">3473</span>             * @param field the field that will hold the value for the command line option<a name="line.3473"></a>
<span class="sourceLineNo">3474</span>             * @param parameterLabelRenderer responsible for rendering option parameters to text<a name="line.3474"></a>
<span class="sourceLineNo">3475</span>             * @param scheme color scheme for applying ansi color styles to options and option parameters<a name="line.3475"></a>
<span class="sourceLineNo">3476</span>             * @return a 2-dimensional array of text values: one or more rows, each containing one or more columns<a name="line.3476"></a>
<span class="sourceLineNo">3477</span>             */<a name="line.3477"></a>
<span class="sourceLineNo">3478</span>            Text[][] render(Option option, Field field, IParamLabelRenderer parameterLabelRenderer, ColorScheme scheme);<a name="line.3478"></a>
<span class="sourceLineNo">3479</span>        }<a name="line.3479"></a>
<span class="sourceLineNo">3480</span>        /** The DefaultOptionRenderer converts {@link Option Options} to five columns of text to match the default<a name="line.3480"></a>
<span class="sourceLineNo">3481</span>         * {@linkplain TextTable TextTable} column layout. The first row of values looks like this:<a name="line.3481"></a>
<span class="sourceLineNo">3482</span>         * &lt;ol&gt;<a name="line.3482"></a>
<span class="sourceLineNo">3483</span>         * &lt;li&gt;the required option marker (if the option is required)&lt;/li&gt;<a name="line.3483"></a>
<span class="sourceLineNo">3484</span>         * &lt;li&gt;2-character short option name (or empty string if no short option exists)&lt;/li&gt;<a name="line.3484"></a>
<span class="sourceLineNo">3485</span>         * &lt;li&gt;comma separator (only if both short option and long option exist, empty string otherwise)&lt;/li&gt;<a name="line.3485"></a>
<span class="sourceLineNo">3486</span>         * &lt;li&gt;comma-separated string with long option name(s)&lt;/li&gt;<a name="line.3486"></a>
<span class="sourceLineNo">3487</span>         * &lt;li&gt;first element of the {@link Option#description()} array&lt;/li&gt;<a name="line.3487"></a>
<span class="sourceLineNo">3488</span>         * &lt;/ol&gt;<a name="line.3488"></a>
<span class="sourceLineNo">3489</span>         * &lt;p&gt;Following this, there will be one row for each of the remaining elements of the {@link<a name="line.3489"></a>
<span class="sourceLineNo">3490</span>         *   Option#description()} array, and these rows look like {@code {"", "", "", option.description()[i]}}.&lt;/p&gt;<a name="line.3490"></a>
<span class="sourceLineNo">3491</span>         */<a name="line.3491"></a>
<span class="sourceLineNo">3492</span>        static class DefaultOptionRenderer implements IOptionRenderer {<a name="line.3492"></a>
<span class="sourceLineNo">3493</span>            public String requiredMarker = " ";<a name="line.3493"></a>
<span class="sourceLineNo">3494</span>            public Object command;<a name="line.3494"></a>
<span class="sourceLineNo">3495</span>            private String sep;<a name="line.3495"></a>
<span class="sourceLineNo">3496</span>            private boolean showDefault;<a name="line.3496"></a>
<span class="sourceLineNo">3497</span>            @Override<a name="line.3497"></a>
<span class="sourceLineNo">3498</span>            public Text[][] render(final Option option, final Field field, final IParamLabelRenderer paramLabelRenderer, final ColorScheme scheme) {<a name="line.3498"></a>
<span class="sourceLineNo">3499</span>                final String[] names = ShortestFirst.sort(option.names());<a name="line.3499"></a>
<span class="sourceLineNo">3500</span>                final int shortOptionCount = names[0].length() == 2 ? 1 : 0;<a name="line.3500"></a>
<span class="sourceLineNo">3501</span>                final String shortOption = shortOptionCount &gt; 0 ? names[0] : "";<a name="line.3501"></a>
<span class="sourceLineNo">3502</span>                sep = shortOptionCount &gt; 0 &amp;&amp; names.length &gt; 1 ? "," : "";<a name="line.3502"></a>
<span class="sourceLineNo">3503</span><a name="line.3503"></a>
<span class="sourceLineNo">3504</span>                final String longOption = join(names, shortOptionCount, names.length - shortOptionCount, ", ");<a name="line.3504"></a>
<span class="sourceLineNo">3505</span>                final Text longOptionText = createLongOptionText(field, paramLabelRenderer, scheme, longOption);<a name="line.3505"></a>
<span class="sourceLineNo">3506</span><a name="line.3506"></a>
<span class="sourceLineNo">3507</span>                showDefault = command != null &amp;&amp; !option.help() &amp;&amp; !isBoolean(field.getType());<a name="line.3507"></a>
<span class="sourceLineNo">3508</span>                final Object defaultValue = createDefaultValue(field);<a name="line.3508"></a>
<span class="sourceLineNo">3509</span><a name="line.3509"></a>
<span class="sourceLineNo">3510</span>                final String requiredOption = option.required() ? requiredMarker : "";<a name="line.3510"></a>
<span class="sourceLineNo">3511</span>                return renderDescriptionLines(option, scheme, requiredOption, shortOption, longOptionText, defaultValue);<a name="line.3511"></a>
<span class="sourceLineNo">3512</span>            }<a name="line.3512"></a>
<span class="sourceLineNo">3513</span><a name="line.3513"></a>
<span class="sourceLineNo">3514</span>            private Object createDefaultValue(final Field field) {<a name="line.3514"></a>
<span class="sourceLineNo">3515</span>                Object defaultValue = null;<a name="line.3515"></a>
<span class="sourceLineNo">3516</span>                try {<a name="line.3516"></a>
<span class="sourceLineNo">3517</span>                    defaultValue = field.get(command);<a name="line.3517"></a>
<span class="sourceLineNo">3518</span>                    if (defaultValue == null) { showDefault = false; } // #201 don't show null default values<a name="line.3518"></a>
<span class="sourceLineNo">3519</span>                    else if (field.getType().isArray()) {<a name="line.3519"></a>
<span class="sourceLineNo">3520</span>                        final StringBuilder sb = new StringBuilder();<a name="line.3520"></a>
<span class="sourceLineNo">3521</span>                        for (int i = 0; i &lt; Array.getLength(defaultValue); i++) {<a name="line.3521"></a>
<span class="sourceLineNo">3522</span>                            sb.append(i &gt; 0 ? ", " : "").append(Array.get(defaultValue, i));<a name="line.3522"></a>
<span class="sourceLineNo">3523</span>                        }<a name="line.3523"></a>
<span class="sourceLineNo">3524</span>                        defaultValue = sb.insert(0, "[").append("]").toString();<a name="line.3524"></a>
<span class="sourceLineNo">3525</span>                    }<a name="line.3525"></a>
<span class="sourceLineNo">3526</span>                } catch (final Exception ex) {<a name="line.3526"></a>
<span class="sourceLineNo">3527</span>                    showDefault = false;<a name="line.3527"></a>
<span class="sourceLineNo">3528</span>                }<a name="line.3528"></a>
<span class="sourceLineNo">3529</span>                return defaultValue;<a name="line.3529"></a>
<span class="sourceLineNo">3530</span>            }<a name="line.3530"></a>
<span class="sourceLineNo">3531</span><a name="line.3531"></a>
<span class="sourceLineNo">3532</span>            private Text createLongOptionText(final Field field, final IParamLabelRenderer renderer, final ColorScheme scheme, final String longOption) {<a name="line.3532"></a>
<span class="sourceLineNo">3533</span>                Text paramLabelText = renderer.renderParameterLabel(field, scheme.ansi(), scheme.optionParamStyles);<a name="line.3533"></a>
<span class="sourceLineNo">3534</span><a name="line.3534"></a>
<span class="sourceLineNo">3535</span>                // if no long option, fill in the space between the short option name and the param label value<a name="line.3535"></a>
<span class="sourceLineNo">3536</span>                if (paramLabelText.length &gt; 0 &amp;&amp; longOption.length() == 0) {<a name="line.3536"></a>
<span class="sourceLineNo">3537</span>                    sep = renderer.separator();<a name="line.3537"></a>
<span class="sourceLineNo">3538</span>                    // #181 paramLabelText may be =LABEL or [=LABEL...]<a name="line.3538"></a>
<span class="sourceLineNo">3539</span>                    final int sepStart = paramLabelText.plainString().indexOf(sep);<a name="line.3539"></a>
<span class="sourceLineNo">3540</span>                    final Text prefix = paramLabelText.substring(0, sepStart);<a name="line.3540"></a>
<span class="sourceLineNo">3541</span>                    paramLabelText = prefix.append(paramLabelText.substring(sepStart + sep.length()));<a name="line.3541"></a>
<span class="sourceLineNo">3542</span>                }<a name="line.3542"></a>
<span class="sourceLineNo">3543</span>                Text longOptionText = scheme.optionText(longOption);<a name="line.3543"></a>
<span class="sourceLineNo">3544</span>                longOptionText = longOptionText.append(paramLabelText);<a name="line.3544"></a>
<span class="sourceLineNo">3545</span>                return longOptionText;<a name="line.3545"></a>
<span class="sourceLineNo">3546</span>            }<a name="line.3546"></a>
<span class="sourceLineNo">3547</span><a name="line.3547"></a>
<span class="sourceLineNo">3548</span>            private Text[][] renderDescriptionLines(final Option option,<a name="line.3548"></a>
<span class="sourceLineNo">3549</span>                                                    final ColorScheme scheme,<a name="line.3549"></a>
<span class="sourceLineNo">3550</span>                                                    final String requiredOption,<a name="line.3550"></a>
<span class="sourceLineNo">3551</span>                                                    final String shortOption,<a name="line.3551"></a>
<span class="sourceLineNo">3552</span>                                                    final Text longOptionText,<a name="line.3552"></a>
<span class="sourceLineNo">3553</span>                                                    final Object defaultValue) {<a name="line.3553"></a>
<span class="sourceLineNo">3554</span>                final Text EMPTY = Ansi.EMPTY_TEXT;<a name="line.3554"></a>
<span class="sourceLineNo">3555</span>                final List&lt;Text[]&gt; result = new ArrayList&lt;Text[]&gt;();<a name="line.3555"></a>
<span class="sourceLineNo">3556</span>                Text[] descriptionFirstLines = scheme.ansi().new Text(str(option.description(), 0)).splitLines();<a name="line.3556"></a>
<span class="sourceLineNo">3557</span>                if (descriptionFirstLines.length == 0) {<a name="line.3557"></a>
<span class="sourceLineNo">3558</span>                    if (showDefault) {<a name="line.3558"></a>
<span class="sourceLineNo">3559</span>                        descriptionFirstLines = new Text[]{scheme.ansi().new Text("  Default: " + defaultValue)};<a name="line.3559"></a>
<span class="sourceLineNo">3560</span>                        showDefault = false; // don't show the default value twice<a name="line.3560"></a>
<span class="sourceLineNo">3561</span>                    } else {<a name="line.3561"></a>
<span class="sourceLineNo">3562</span>                        descriptionFirstLines = new Text[]{ EMPTY };<a name="line.3562"></a>
<span class="sourceLineNo">3563</span>                    }<a name="line.3563"></a>
<span class="sourceLineNo">3564</span>                }<a name="line.3564"></a>
<span class="sourceLineNo">3565</span>                result.add(new Text[] { scheme.optionText(requiredOption), scheme.optionText(shortOption),<a name="line.3565"></a>
<span class="sourceLineNo">3566</span>                        scheme.ansi().new Text(sep), longOptionText, descriptionFirstLines[0] });<a name="line.3566"></a>
<span class="sourceLineNo">3567</span>                for (int i = 1; i &lt; descriptionFirstLines.length; i++) {<a name="line.3567"></a>
<span class="sourceLineNo">3568</span>                    result.add(new Text[] { EMPTY, EMPTY, EMPTY, EMPTY, descriptionFirstLines[i] });<a name="line.3568"></a>
<span class="sourceLineNo">3569</span>                }<a name="line.3569"></a>
<span class="sourceLineNo">3570</span>                for (int i = 1; i &lt; option.description().length; i++) {<a name="line.3570"></a>
<span class="sourceLineNo">3571</span>                    final Text[] descriptionNextLines = scheme.ansi().new Text(option.description()[i]).splitLines();<a name="line.3571"></a>
<span class="sourceLineNo">3572</span>                    for (final Text line : descriptionNextLines) {<a name="line.3572"></a>
<span class="sourceLineNo">3573</span>                        result.add(new Text[] { EMPTY, EMPTY, EMPTY, EMPTY, line });<a name="line.3573"></a>
<span class="sourceLineNo">3574</span>                    }<a name="line.3574"></a>
<span class="sourceLineNo">3575</span>                }<a name="line.3575"></a>
<span class="sourceLineNo">3576</span>                if (showDefault) {<a name="line.3576"></a>
<span class="sourceLineNo">3577</span>                    result.add(new Text[] { EMPTY, EMPTY, EMPTY, EMPTY, scheme.ansi().new Text("  Default: " + defaultValue) });<a name="line.3577"></a>
<span class="sourceLineNo">3578</span>                }<a name="line.3578"></a>
<span class="sourceLineNo">3579</span>                return result.toArray(new Text[result.size()][]);<a name="line.3579"></a>
<span class="sourceLineNo">3580</span>            }<a name="line.3580"></a>
<span class="sourceLineNo">3581</span>        }<a name="line.3581"></a>
<span class="sourceLineNo">3582</span>        /** The MinimalOptionRenderer converts {@link Option Options} to a single row with two columns of text: an<a name="line.3582"></a>
<span class="sourceLineNo">3583</span>         * option name and a description. If multiple names or description lines exist, the first value is used. */<a name="line.3583"></a>
<span class="sourceLineNo">3584</span>        static class MinimalOptionRenderer implements IOptionRenderer {<a name="line.3584"></a>
<span class="sourceLineNo">3585</span>            @Override<a name="line.3585"></a>
<span class="sourceLineNo">3586</span>            public Text[][] render(final Option option, final Field field, final IParamLabelRenderer parameterLabelRenderer, final ColorScheme scheme) {<a name="line.3586"></a>
<span class="sourceLineNo">3587</span>                Text optionText = scheme.optionText(option.names()[0]);<a name="line.3587"></a>
<span class="sourceLineNo">3588</span>                final Text paramLabelText = parameterLabelRenderer.renderParameterLabel(field, scheme.ansi(), scheme.optionParamStyles);<a name="line.3588"></a>
<span class="sourceLineNo">3589</span>                optionText = optionText.append(paramLabelText);<a name="line.3589"></a>
<span class="sourceLineNo">3590</span>                return new Text[][] {{ optionText,<a name="line.3590"></a>
<span class="sourceLineNo">3591</span>                                        scheme.ansi().new Text(option.description().length == 0 ? "" : option.description()[0]) }};<a name="line.3591"></a>
<span class="sourceLineNo">3592</span>            }<a name="line.3592"></a>
<span class="sourceLineNo">3593</span>        }<a name="line.3593"></a>
<span class="sourceLineNo">3594</span>        /** The MinimalParameterRenderer converts {@link Parameters Parameters} to a single row with two columns of<a name="line.3594"></a>
<span class="sourceLineNo">3595</span>         * text: the parameters label and a description. If multiple description lines exist, the first value is used. */<a name="line.3595"></a>
<span class="sourceLineNo">3596</span>        static class MinimalParameterRenderer implements IParameterRenderer {<a name="line.3596"></a>
<span class="sourceLineNo">3597</span>            @Override<a name="line.3597"></a>
<span class="sourceLineNo">3598</span>            public Text[][] render(final Parameters param, final Field field, final IParamLabelRenderer parameterLabelRenderer, final ColorScheme scheme) {<a name="line.3598"></a>
<span class="sourceLineNo">3599</span>                return new Text[][] {{ parameterLabelRenderer.renderParameterLabel(field, scheme.ansi(), scheme.parameterStyles),<a name="line.3599"></a>
<span class="sourceLineNo">3600</span>                        scheme.ansi().new Text(param.description().length == 0 ? "" : param.description()[0]) }};<a name="line.3600"></a>
<span class="sourceLineNo">3601</span>            }<a name="line.3601"></a>
<span class="sourceLineNo">3602</span>        }<a name="line.3602"></a>
<span class="sourceLineNo">3603</span>        /** When customizing online help for {@link Parameters Parameters} details, a custom {@code IParameterRenderer}<a name="line.3603"></a>
<span class="sourceLineNo">3604</span>         * can be used to create textual representation of a Parameters field in a tabular format: one or more rows,<a name="line.3604"></a>
<span class="sourceLineNo">3605</span>         * each containing one or more columns. The {@link Layout Layout} is responsible for placing these text<a name="line.3605"></a>
<span class="sourceLineNo">3606</span>         * values in the {@link TextTable TextTable}. */<a name="line.3606"></a>
<span class="sourceLineNo">3607</span>        public interface IParameterRenderer {<a name="line.3607"></a>
<span class="sourceLineNo">3608</span>            /**<a name="line.3608"></a>
<span class="sourceLineNo">3609</span>             * Returns a text representation of the specified Parameters and the Field that captures the parameter values.<a name="line.3609"></a>
<span class="sourceLineNo">3610</span>             * @param parameters the command line parameters to show online usage help for<a name="line.3610"></a>
<span class="sourceLineNo">3611</span>             * @param field the field that will hold the value for the command line parameters<a name="line.3611"></a>
<span class="sourceLineNo">3612</span>             * @param parameterLabelRenderer responsible for rendering parameter labels to text<a name="line.3612"></a>
<span class="sourceLineNo">3613</span>             * @param scheme color scheme for applying ansi color styles to positional parameters<a name="line.3613"></a>
<span class="sourceLineNo">3614</span>             * @return a 2-dimensional array of text values: one or more rows, each containing one or more columns<a name="line.3614"></a>
<span class="sourceLineNo">3615</span>             */<a name="line.3615"></a>
<span class="sourceLineNo">3616</span>            Text[][] render(Parameters parameters, Field field, IParamLabelRenderer parameterLabelRenderer, ColorScheme scheme);<a name="line.3616"></a>
<span class="sourceLineNo">3617</span>        }<a name="line.3617"></a>
<span class="sourceLineNo">3618</span>        /** The DefaultParameterRenderer converts {@link Parameters Parameters} to five columns of text to match the<a name="line.3618"></a>
<span class="sourceLineNo">3619</span>         * default {@linkplain TextTable TextTable} column layout. The first row of values looks like this:<a name="line.3619"></a>
<span class="sourceLineNo">3620</span>         * &lt;ol&gt;<a name="line.3620"></a>
<span class="sourceLineNo">3621</span>         * &lt;li&gt;the required option marker (if the parameter's arity is to have at least one value)&lt;/li&gt;<a name="line.3621"></a>
<span class="sourceLineNo">3622</span>         * &lt;li&gt;empty string &lt;/li&gt;<a name="line.3622"></a>
<span class="sourceLineNo">3623</span>         * &lt;li&gt;empty string &lt;/li&gt;<a name="line.3623"></a>
<span class="sourceLineNo">3624</span>         * &lt;li&gt;parameter(s) label as rendered by the {@link IParamLabelRenderer}&lt;/li&gt;<a name="line.3624"></a>
<span class="sourceLineNo">3625</span>         * &lt;li&gt;first element of the {@link Parameters#description()} array&lt;/li&gt;<a name="line.3625"></a>
<span class="sourceLineNo">3626</span>         * &lt;/ol&gt;<a name="line.3626"></a>
<span class="sourceLineNo">3627</span>         * &lt;p&gt;Following this, there will be one row for each of the remaining elements of the {@link<a name="line.3627"></a>
<span class="sourceLineNo">3628</span>         *   Parameters#description()} array, and these rows look like {@code {"", "", "", param.description()[i]}}.&lt;/p&gt;<a name="line.3628"></a>
<span class="sourceLineNo">3629</span>         */<a name="line.3629"></a>
<span class="sourceLineNo">3630</span>        static class DefaultParameterRenderer implements IParameterRenderer {<a name="line.3630"></a>
<span class="sourceLineNo">3631</span>            public String requiredMarker = " ";<a name="line.3631"></a>
<span class="sourceLineNo">3632</span>            @Override<a name="line.3632"></a>
<span class="sourceLineNo">3633</span>            public Text[][] render(final Parameters params, final Field field, final IParamLabelRenderer paramLabelRenderer, final ColorScheme scheme) {<a name="line.3633"></a>
<span class="sourceLineNo">3634</span>                final Text label = paramLabelRenderer.renderParameterLabel(field, scheme.ansi(), scheme.parameterStyles);<a name="line.3634"></a>
<span class="sourceLineNo">3635</span>                final Text requiredParameter = scheme.parameterText(Range.parameterArity(field).min &gt; 0 ? requiredMarker : "");<a name="line.3635"></a>
<span class="sourceLineNo">3636</span><a name="line.3636"></a>
<span class="sourceLineNo">3637</span>                final Text EMPTY = Ansi.EMPTY_TEXT;<a name="line.3637"></a>
<span class="sourceLineNo">3638</span>                final List&lt;Text[]&gt; result = new ArrayList&lt;Text[]&gt;();<a name="line.3638"></a>
<span class="sourceLineNo">3639</span>                Text[] descriptionFirstLines = scheme.ansi().new Text(str(params.description(), 0)).splitLines();<a name="line.3639"></a>
<span class="sourceLineNo">3640</span>                if (descriptionFirstLines.length == 0) { descriptionFirstLines = new Text[]{ EMPTY }; }<a name="line.3640"></a>
<span class="sourceLineNo">3641</span>                result.add(new Text[] { requiredParameter, EMPTY, EMPTY, label, descriptionFirstLines[0] });<a name="line.3641"></a>
<span class="sourceLineNo">3642</span>                for (int i = 1; i &lt; descriptionFirstLines.length; i++) {<a name="line.3642"></a>
<span class="sourceLineNo">3643</span>                    result.add(new Text[] { EMPTY, EMPTY, EMPTY, EMPTY, descriptionFirstLines[i] });<a name="line.3643"></a>
<span class="sourceLineNo">3644</span>                }<a name="line.3644"></a>
<span class="sourceLineNo">3645</span>                for (int i = 1; i &lt; params.description().length; i++) {<a name="line.3645"></a>
<span class="sourceLineNo">3646</span>                    final Text[] descriptionNextLines = scheme.ansi().new Text(params.description()[i]).splitLines();<a name="line.3646"></a>
<span class="sourceLineNo">3647</span>                    for (final Text line : descriptionNextLines) {<a name="line.3647"></a>
<span class="sourceLineNo">3648</span>                        result.add(new Text[] { EMPTY, EMPTY, EMPTY, EMPTY, line });<a name="line.3648"></a>
<span class="sourceLineNo">3649</span>                    }<a name="line.3649"></a>
<span class="sourceLineNo">3650</span>                }<a name="line.3650"></a>
<span class="sourceLineNo">3651</span>                return result.toArray(new Text[result.size()][]);<a name="line.3651"></a>
<span class="sourceLineNo">3652</span>            }<a name="line.3652"></a>
<span class="sourceLineNo">3653</span>        }<a name="line.3653"></a>
<span class="sourceLineNo">3654</span>        /** When customizing online usage help for an option parameter or a positional parameter, a custom<a name="line.3654"></a>
<span class="sourceLineNo">3655</span>         * {@code IParamLabelRenderer} can be used to render the parameter name or label to a String. */<a name="line.3655"></a>
<span class="sourceLineNo">3656</span>        public interface IParamLabelRenderer {<a name="line.3656"></a>
<span class="sourceLineNo">3657</span><a name="line.3657"></a>
<span class="sourceLineNo">3658</span>            /** Returns a text rendering of the Option parameter or positional parameter; returns an empty string<a name="line.3658"></a>
<span class="sourceLineNo">3659</span>             * {@code ""} if the option is a boolean and does not take a parameter.<a name="line.3659"></a>
<span class="sourceLineNo">3660</span>             * @param field the annotated field with a parameter label<a name="line.3660"></a>
<span class="sourceLineNo">3661</span>             * @param ansi determines whether ANSI escape codes should be emitted or not<a name="line.3661"></a>
<span class="sourceLineNo">3662</span>             * @param styles the styles to apply to the parameter label<a name="line.3662"></a>
<span class="sourceLineNo">3663</span>             * @return a text rendering of the Option parameter or positional parameter */<a name="line.3663"></a>
<span class="sourceLineNo">3664</span>            Text renderParameterLabel(Field field, Ansi ansi, List&lt;IStyle&gt; styles);<a name="line.3664"></a>
<span class="sourceLineNo">3665</span><a name="line.3665"></a>
<span class="sourceLineNo">3666</span>            /** Returns the separator between option name and param label.<a name="line.3666"></a>
<span class="sourceLineNo">3667</span>             * @return the separator between option name and param label */<a name="line.3667"></a>
<span class="sourceLineNo">3668</span>            String separator();<a name="line.3668"></a>
<span class="sourceLineNo">3669</span>        }<a name="line.3669"></a>
<span class="sourceLineNo">3670</span>        /**<a name="line.3670"></a>
<span class="sourceLineNo">3671</span>         * DefaultParamLabelRenderer separates option parameters from their {@linkplain Option options} with a<a name="line.3671"></a>
<span class="sourceLineNo">3672</span>         * {@linkplain DefaultParamLabelRenderer#separator separator} string, surrounds optional values<a name="line.3672"></a>
<span class="sourceLineNo">3673</span>         * with {@code '['} and {@code ']'} characters and uses ellipses ("...") to indicate that any number of<a name="line.3673"></a>
<span class="sourceLineNo">3674</span>         * values is allowed for options or parameters with variable arity.<a name="line.3674"></a>
<span class="sourceLineNo">3675</span>         */<a name="line.3675"></a>
<span class="sourceLineNo">3676</span>        static class DefaultParamLabelRenderer implements IParamLabelRenderer {<a name="line.3676"></a>
<span class="sourceLineNo">3677</span>            /** The string to use to separate option parameters from their options. */<a name="line.3677"></a>
<span class="sourceLineNo">3678</span>            public final String separator;<a name="line.3678"></a>
<span class="sourceLineNo">3679</span>            /** Constructs a new DefaultParamLabelRenderer with the specified separator string. */<a name="line.3679"></a>
<span class="sourceLineNo">3680</span>            public DefaultParamLabelRenderer(final String separator) {<a name="line.3680"></a>
<span class="sourceLineNo">3681</span>                this.separator = Assert.notNull(separator, "separator");<a name="line.3681"></a>
<span class="sourceLineNo">3682</span>            }<a name="line.3682"></a>
<span class="sourceLineNo">3683</span>            @Override<a name="line.3683"></a>
<span class="sourceLineNo">3684</span>            public String separator() { return separator; }<a name="line.3684"></a>
<span class="sourceLineNo">3685</span>            @Override<a name="line.3685"></a>
<span class="sourceLineNo">3686</span>            public Text renderParameterLabel(final Field field, final Ansi ansi, final List&lt;IStyle&gt; styles) {<a name="line.3686"></a>
<span class="sourceLineNo">3687</span>                final boolean isOptionParameter = field.isAnnotationPresent(Option.class);<a name="line.3687"></a>
<span class="sourceLineNo">3688</span>                final Range arity = isOptionParameter ? Range.optionArity(field) : Range.parameterCapacity(field);<a name="line.3688"></a>
<span class="sourceLineNo">3689</span>                final String split = isOptionParameter ? field.getAnnotation(Option.class).split() : field.getAnnotation(Parameters.class).split();<a name="line.3689"></a>
<span class="sourceLineNo">3690</span>                Text result = ansi.new Text("");<a name="line.3690"></a>
<span class="sourceLineNo">3691</span>                String sep = isOptionParameter ? separator : "";<a name="line.3691"></a>
<span class="sourceLineNo">3692</span>                Text paramName = ansi.apply(renderParameterName(field), styles);<a name="line.3692"></a>
<span class="sourceLineNo">3693</span>                if (!empty(split)) { paramName = paramName.append("[" + split).append(paramName).append("]..."); } // #194<a name="line.3693"></a>
<span class="sourceLineNo">3694</span>                for (int i = 0; i &lt; arity.min; i++) {<a name="line.3694"></a>
<span class="sourceLineNo">3695</span>                    result = result.append(sep).append(paramName);<a name="line.3695"></a>
<span class="sourceLineNo">3696</span>                    sep = " ";<a name="line.3696"></a>
<span class="sourceLineNo">3697</span>                }<a name="line.3697"></a>
<span class="sourceLineNo">3698</span>                if (arity.isVariable) {<a name="line.3698"></a>
<span class="sourceLineNo">3699</span>                    if (result.length == 0) { // arity="*" or arity="0..*"<a name="line.3699"></a>
<span class="sourceLineNo">3700</span>                        result = result.append(sep + "[").append(paramName).append("]...");<a name="line.3700"></a>
<span class="sourceLineNo">3701</span>                    } else if (!result.plainString().endsWith("...")) { // split param may already end with "..."<a name="line.3701"></a>
<span class="sourceLineNo">3702</span>                        result = result.append("...");<a name="line.3702"></a>
<span class="sourceLineNo">3703</span>                    }<a name="line.3703"></a>
<span class="sourceLineNo">3704</span>                } else {<a name="line.3704"></a>
<span class="sourceLineNo">3705</span>                    sep = result.length == 0 ? (isOptionParameter ? separator : "") : " ";<a name="line.3705"></a>
<span class="sourceLineNo">3706</span>                    for (int i = arity.min; i &lt; arity.max; i++) {<a name="line.3706"></a>
<span class="sourceLineNo">3707</span>                        if (sep.trim().length() == 0) {<a name="line.3707"></a>
<span class="sourceLineNo">3708</span>                            result = result.append(sep + "[").append(paramName);<a name="line.3708"></a>
<span class="sourceLineNo">3709</span>                        } else {<a name="line.3709"></a>
<span class="sourceLineNo">3710</span>                            result = result.append("[" + sep).append(paramName);<a name="line.3710"></a>
<span class="sourceLineNo">3711</span>                        }<a name="line.3711"></a>
<span class="sourceLineNo">3712</span>                        sep  = " ";<a name="line.3712"></a>
<span class="sourceLineNo">3713</span>                    }<a name="line.3713"></a>
<span class="sourceLineNo">3714</span>                    for (int i = arity.min; i &lt; arity.max; i++) { result = result.append("]"); }<a name="line.3714"></a>
<span class="sourceLineNo">3715</span>                }<a name="line.3715"></a>
<span class="sourceLineNo">3716</span>                return result;<a name="line.3716"></a>
<span class="sourceLineNo">3717</span>            }<a name="line.3717"></a>
<span class="sourceLineNo">3718</span>            private static String renderParameterName(final Field field) {<a name="line.3718"></a>
<span class="sourceLineNo">3719</span>                String result = null;<a name="line.3719"></a>
<span class="sourceLineNo">3720</span>                if (field.isAnnotationPresent(Option.class)) {<a name="line.3720"></a>
<span class="sourceLineNo">3721</span>                    result = field.getAnnotation(Option.class).paramLabel();<a name="line.3721"></a>
<span class="sourceLineNo">3722</span>                } else if (field.isAnnotationPresent(Parameters.class)) {<a name="line.3722"></a>
<span class="sourceLineNo">3723</span>                    result = field.getAnnotation(Parameters.class).paramLabel();<a name="line.3723"></a>
<span class="sourceLineNo">3724</span>                }<a name="line.3724"></a>
<span class="sourceLineNo">3725</span>                if (result != null &amp;&amp; result.trim().length() &gt; 0) {<a name="line.3725"></a>
<span class="sourceLineNo">3726</span>                    return result.trim();<a name="line.3726"></a>
<span class="sourceLineNo">3727</span>                }<a name="line.3727"></a>
<span class="sourceLineNo">3728</span>                String name = field.getName();<a name="line.3728"></a>
<span class="sourceLineNo">3729</span>                if (Map.class.isAssignableFrom(field.getType())) { // #195 better param labels for map fields<a name="line.3729"></a>
<span class="sourceLineNo">3730</span>                    final Class&lt;?&gt;[] paramTypes = getTypeAttribute(field);<a name="line.3730"></a>
<span class="sourceLineNo">3731</span>                    if (paramTypes.length &lt; 2 || paramTypes[0] == null || paramTypes[1] == null) {<a name="line.3731"></a>
<span class="sourceLineNo">3732</span>                        name = "String=String";<a name="line.3732"></a>
<span class="sourceLineNo">3733</span>                    } else { name = paramTypes[0].getSimpleName() + "=" + paramTypes[1].getSimpleName(); }<a name="line.3733"></a>
<span class="sourceLineNo">3734</span>                }<a name="line.3734"></a>
<span class="sourceLineNo">3735</span>                return "&lt;" + name + "&gt;";<a name="line.3735"></a>
<span class="sourceLineNo">3736</span>            }<a name="line.3736"></a>
<span class="sourceLineNo">3737</span>        }<a name="line.3737"></a>
<span class="sourceLineNo">3738</span>        /** Use a Layout to format usage help text for options and parameters in tabular format.<a name="line.3738"></a>
<span class="sourceLineNo">3739</span>         * &lt;p&gt;Delegates to the renderers to create {@link Text} values for the annotated fields, and uses a<a name="line.3739"></a>
<span class="sourceLineNo">3740</span>         * {@link TextTable} to display these values in tabular format. Layout is responsible for deciding which values<a name="line.3740"></a>
<span class="sourceLineNo">3741</span>         * to display where in the table. By default, Layout shows one option or parameter per table row.&lt;/p&gt;<a name="line.3741"></a>
<span class="sourceLineNo">3742</span>         * &lt;p&gt;Customize by overriding the {@link #layout(Field, CommandLine.Help.Ansi.Text[][])} method.&lt;/p&gt;<a name="line.3742"></a>
<span class="sourceLineNo">3743</span>         * @see IOptionRenderer rendering options to text<a name="line.3743"></a>
<span class="sourceLineNo">3744</span>         * @see IParameterRenderer rendering parameters to text<a name="line.3744"></a>
<span class="sourceLineNo">3745</span>         * @see TextTable showing values in a tabular format<a name="line.3745"></a>
<span class="sourceLineNo">3746</span>         */<a name="line.3746"></a>
<span class="sourceLineNo">3747</span>        public static class Layout {<a name="line.3747"></a>
<span class="sourceLineNo">3748</span>            protected final ColorScheme colorScheme;<a name="line.3748"></a>
<span class="sourceLineNo">3749</span>            protected final TextTable table;<a name="line.3749"></a>
<span class="sourceLineNo">3750</span>            protected IOptionRenderer optionRenderer;<a name="line.3750"></a>
<span class="sourceLineNo">3751</span>            protected IParameterRenderer parameterRenderer;<a name="line.3751"></a>
<span class="sourceLineNo">3752</span><a name="line.3752"></a>
<span class="sourceLineNo">3753</span>            /** Constructs a Layout with the specified color scheme, a new default TextTable, the<a name="line.3753"></a>
<span class="sourceLineNo">3754</span>             * {@linkplain Help#createDefaultOptionRenderer() default option renderer}, and the<a name="line.3754"></a>
<span class="sourceLineNo">3755</span>             * {@linkplain Help#createDefaultParameterRenderer() default parameter renderer}.<a name="line.3755"></a>
<span class="sourceLineNo">3756</span>             * @param colorScheme the color scheme to use for common, auto-generated parts of the usage help message */<a name="line.3756"></a>
<span class="sourceLineNo">3757</span>            public Layout(final ColorScheme colorScheme) { this(colorScheme, new TextTable(colorScheme.ansi())); }<a name="line.3757"></a>
<span class="sourceLineNo">3758</span><a name="line.3758"></a>
<span class="sourceLineNo">3759</span>            /** Constructs a Layout with the specified color scheme, the specified TextTable, the<a name="line.3759"></a>
<span class="sourceLineNo">3760</span>             * {@linkplain Help#createDefaultOptionRenderer() default option renderer}, and the<a name="line.3760"></a>
<span class="sourceLineNo">3761</span>             * {@linkplain Help#createDefaultParameterRenderer() default parameter renderer}.<a name="line.3761"></a>
<span class="sourceLineNo">3762</span>             * @param colorScheme the color scheme to use for common, auto-generated parts of the usage help message<a name="line.3762"></a>
<span class="sourceLineNo">3763</span>             * @param textTable the TextTable to lay out parts of the usage help message in tabular format */<a name="line.3763"></a>
<span class="sourceLineNo">3764</span>            public Layout(final ColorScheme colorScheme, final TextTable textTable) {<a name="line.3764"></a>
<span class="sourceLineNo">3765</span>                this(colorScheme, textTable, new DefaultOptionRenderer(), new DefaultParameterRenderer());<a name="line.3765"></a>
<span class="sourceLineNo">3766</span>            }<a name="line.3766"></a>
<span class="sourceLineNo">3767</span>            /** Constructs a Layout with the specified color scheme, the specified TextTable, the<a name="line.3767"></a>
<span class="sourceLineNo">3768</span>             * specified option renderer and the specified parameter renderer.<a name="line.3768"></a>
<span class="sourceLineNo">3769</span>             * @param colorScheme the color scheme to use for common, auto-generated parts of the usage help message<a name="line.3769"></a>
<span class="sourceLineNo">3770</span>             * @param optionRenderer the object responsible for rendering Options to Text<a name="line.3770"></a>
<span class="sourceLineNo">3771</span>             * @param parameterRenderer the object responsible for rendering Parameters to Text<a name="line.3771"></a>
<span class="sourceLineNo">3772</span>             * @param textTable the TextTable to lay out parts of the usage help message in tabular format */<a name="line.3772"></a>
<span class="sourceLineNo">3773</span>            public Layout(final ColorScheme colorScheme, final TextTable textTable, final IOptionRenderer optionRenderer, final IParameterRenderer parameterRenderer) {<a name="line.3773"></a>
<span class="sourceLineNo">3774</span>                this.colorScheme       = Assert.notNull(colorScheme, "colorScheme");<a name="line.3774"></a>
<span class="sourceLineNo">3775</span>                this.table             = Assert.notNull(textTable, "textTable");<a name="line.3775"></a>
<span class="sourceLineNo">3776</span>                this.optionRenderer    = Assert.notNull(optionRenderer, "optionRenderer");<a name="line.3776"></a>
<span class="sourceLineNo">3777</span>                this.parameterRenderer = Assert.notNull(parameterRenderer, "parameterRenderer");<a name="line.3777"></a>
<span class="sourceLineNo">3778</span>            }<a name="line.3778"></a>
<span class="sourceLineNo">3779</span>            /**<a name="line.3779"></a>
<span class="sourceLineNo">3780</span>             * Copies the specified text values into the correct cells in the {@link TextTable}. This implementation<a name="line.3780"></a>
<span class="sourceLineNo">3781</span>             * delegates to {@link TextTable#addRowValues(CommandLine.Help.Ansi.Text...)} for each row of values.<a name="line.3781"></a>
<span class="sourceLineNo">3782</span>             * &lt;p&gt;Subclasses may override.&lt;/p&gt;<a name="line.3782"></a>
<span class="sourceLineNo">3783</span>             * @param field the field annotated with the specified Option or Parameters<a name="line.3783"></a>
<span class="sourceLineNo">3784</span>             * @param cellValues the text values representing the Option/Parameters, to be displayed in tabular form<a name="line.3784"></a>
<span class="sourceLineNo">3785</span>             */<a name="line.3785"></a>
<span class="sourceLineNo">3786</span>            public void layout(final Field field, final Text[][] cellValues) {<a name="line.3786"></a>
<span class="sourceLineNo">3787</span>                for (final Text[] oneRow : cellValues) {<a name="line.3787"></a>
<span class="sourceLineNo">3788</span>                    table.addRowValues(oneRow);<a name="line.3788"></a>
<span class="sourceLineNo">3789</span>                }<a name="line.3789"></a>
<span class="sourceLineNo">3790</span>            }<a name="line.3790"></a>
<span class="sourceLineNo">3791</span>            /** Calls {@link #addOption(Field, CommandLine.Help.IParamLabelRenderer)} for all non-hidden Options in the list.<a name="line.3791"></a>
<span class="sourceLineNo">3792</span>             * @param fields fields annotated with {@link Option} to add usage descriptions for<a name="line.3792"></a>
<span class="sourceLineNo">3793</span>             * @param paramLabelRenderer object that knows how to render option parameters */<a name="line.3793"></a>
<span class="sourceLineNo">3794</span>            public void addOptions(final List&lt;Field&gt; fields, final IParamLabelRenderer paramLabelRenderer) {<a name="line.3794"></a>
<span class="sourceLineNo">3795</span>                for (final Field field : fields) {<a name="line.3795"></a>
<span class="sourceLineNo">3796</span>                    final Option option = field.getAnnotation(Option.class);<a name="line.3796"></a>
<span class="sourceLineNo">3797</span>                    if (!option.hidden()) {<a name="line.3797"></a>
<span class="sourceLineNo">3798</span>                        addOption(field, paramLabelRenderer);<a name="line.3798"></a>
<span class="sourceLineNo">3799</span>                    }<a name="line.3799"></a>
<span class="sourceLineNo">3800</span>                }<a name="line.3800"></a>
<span class="sourceLineNo">3801</span>            }<a name="line.3801"></a>
<span class="sourceLineNo">3802</span>            /**<a name="line.3802"></a>
<span class="sourceLineNo">3803</span>             * Delegates to the {@link #optionRenderer option renderer} of this layout to obtain<a name="line.3803"></a>
<span class="sourceLineNo">3804</span>             * text values for the specified {@link Option}, and then calls the {@link #layout(Field, CommandLine.Help.Ansi.Text[][])}<a name="line.3804"></a>
<span class="sourceLineNo">3805</span>             * method to write these text values into the correct cells in the TextTable.<a name="line.3805"></a>
<span class="sourceLineNo">3806</span>             * @param field the field annotated with the specified Option<a name="line.3806"></a>
<span class="sourceLineNo">3807</span>             * @param paramLabelRenderer knows how to render option parameters<a name="line.3807"></a>
<span class="sourceLineNo">3808</span>             */<a name="line.3808"></a>
<span class="sourceLineNo">3809</span>            public void addOption(final Field field, final IParamLabelRenderer paramLabelRenderer) {<a name="line.3809"></a>
<span class="sourceLineNo">3810</span>                final Option option = field.getAnnotation(Option.class);<a name="line.3810"></a>
<span class="sourceLineNo">3811</span>                final Text[][] values = optionRenderer.render(option, field, paramLabelRenderer, colorScheme);<a name="line.3811"></a>
<span class="sourceLineNo">3812</span>                layout(field, values);<a name="line.3812"></a>
<span class="sourceLineNo">3813</span>            }<a name="line.3813"></a>
<span class="sourceLineNo">3814</span>            /** Calls {@link #addPositionalParameter(Field, CommandLine.Help.IParamLabelRenderer)} for all non-hidden Parameters in the list.<a name="line.3814"></a>
<span class="sourceLineNo">3815</span>             * @param fields fields annotated with {@link Parameters} to add usage descriptions for<a name="line.3815"></a>
<span class="sourceLineNo">3816</span>             * @param paramLabelRenderer knows how to render option parameters */<a name="line.3816"></a>
<span class="sourceLineNo">3817</span>            public void addPositionalParameters(final List&lt;Field&gt; fields, final IParamLabelRenderer paramLabelRenderer) {<a name="line.3817"></a>
<span class="sourceLineNo">3818</span>                for (final Field field : fields) {<a name="line.3818"></a>
<span class="sourceLineNo">3819</span>                    final Parameters parameters = field.getAnnotation(Parameters.class);<a name="line.3819"></a>
<span class="sourceLineNo">3820</span>                    if (!parameters.hidden()) {<a name="line.3820"></a>
<span class="sourceLineNo">3821</span>                        addPositionalParameter(field, paramLabelRenderer);<a name="line.3821"></a>
<span class="sourceLineNo">3822</span>                    }<a name="line.3822"></a>
<span class="sourceLineNo">3823</span>                }<a name="line.3823"></a>
<span class="sourceLineNo">3824</span>            }<a name="line.3824"></a>
<span class="sourceLineNo">3825</span>            /**<a name="line.3825"></a>
<span class="sourceLineNo">3826</span>             * Delegates to the {@link #parameterRenderer parameter renderer} of this layout<a name="line.3826"></a>
<span class="sourceLineNo">3827</span>             * to obtain text values for the specified {@link Parameters}, and then calls<a name="line.3827"></a>
<span class="sourceLineNo">3828</span>             * {@link #layout(Field, CommandLine.Help.Ansi.Text[][])} to write these text values into the correct cells in the TextTable.<a name="line.3828"></a>
<span class="sourceLineNo">3829</span>             * @param field the field annotated with the specified Parameters<a name="line.3829"></a>
<span class="sourceLineNo">3830</span>             * @param paramLabelRenderer knows how to render option parameters<a name="line.3830"></a>
<span class="sourceLineNo">3831</span>             */<a name="line.3831"></a>
<span class="sourceLineNo">3832</span>            public void addPositionalParameter(final Field field, final IParamLabelRenderer paramLabelRenderer) {<a name="line.3832"></a>
<span class="sourceLineNo">3833</span>                final Parameters option = field.getAnnotation(Parameters.class);<a name="line.3833"></a>
<span class="sourceLineNo">3834</span>                final Text[][] values = parameterRenderer.render(option, field, paramLabelRenderer, colorScheme);<a name="line.3834"></a>
<span class="sourceLineNo">3835</span>                layout(field, values);<a name="line.3835"></a>
<span class="sourceLineNo">3836</span>            }<a name="line.3836"></a>
<span class="sourceLineNo">3837</span>            /** Returns the section of the usage help message accumulated in the TextTable owned by this layout. */<a name="line.3837"></a>
<span class="sourceLineNo">3838</span>            @Override public String toString() {<a name="line.3838"></a>
<span class="sourceLineNo">3839</span>                return table.toString();<a name="line.3839"></a>
<span class="sourceLineNo">3840</span>            }<a name="line.3840"></a>
<span class="sourceLineNo">3841</span>        }<a name="line.3841"></a>
<span class="sourceLineNo">3842</span>        /** Sorts short strings before longer strings. */<a name="line.3842"></a>
<span class="sourceLineNo">3843</span>        static class ShortestFirst implements Comparator&lt;String&gt; {<a name="line.3843"></a>
<span class="sourceLineNo">3844</span>            @Override<a name="line.3844"></a>
<span class="sourceLineNo">3845</span>            public int compare(final String o1, final String o2) {<a name="line.3845"></a>
<span class="sourceLineNo">3846</span>                return o1.length() - o2.length();<a name="line.3846"></a>
<span class="sourceLineNo">3847</span>            }<a name="line.3847"></a>
<span class="sourceLineNo">3848</span>            /** Sorts the specified array of Strings shortest-first and returns it. */<a name="line.3848"></a>
<span class="sourceLineNo">3849</span>            public static String[] sort(final String[] names) {<a name="line.3849"></a>
<span class="sourceLineNo">3850</span>                Arrays.sort(names, new ShortestFirst());<a name="line.3850"></a>
<span class="sourceLineNo">3851</span>                return names;<a name="line.3851"></a>
<span class="sourceLineNo">3852</span>            }<a name="line.3852"></a>
<span class="sourceLineNo">3853</span>        }<a name="line.3853"></a>
<span class="sourceLineNo">3854</span>        /** Sorts {@code Option} instances by their name in case-insensitive alphabetic order. If an Option has<a name="line.3854"></a>
<span class="sourceLineNo">3855</span>         * multiple names, the shortest name is used for the sorting. Help options follow non-help options. */<a name="line.3855"></a>
<span class="sourceLineNo">3856</span>        static class SortByShortestOptionNameAlphabetically implements Comparator&lt;Field&gt; {<a name="line.3856"></a>
<span class="sourceLineNo">3857</span>            @Override<a name="line.3857"></a>
<span class="sourceLineNo">3858</span>            public int compare(final Field f1, final Field f2) {<a name="line.3858"></a>
<span class="sourceLineNo">3859</span>                final Option o1 = f1.getAnnotation(Option.class);<a name="line.3859"></a>
<span class="sourceLineNo">3860</span>                final Option o2 = f2.getAnnotation(Option.class);<a name="line.3860"></a>
<span class="sourceLineNo">3861</span>                if (o1 == null) { return 1; } else if (o2 == null) { return -1; } // options before params<a name="line.3861"></a>
<span class="sourceLineNo">3862</span>                final String[] names1 = ShortestFirst.sort(o1.names());<a name="line.3862"></a>
<span class="sourceLineNo">3863</span>                final String[] names2 = ShortestFirst.sort(o2.names());<a name="line.3863"></a>
<span class="sourceLineNo">3864</span>                int result = names1[0].toUpperCase().compareTo(names2[0].toUpperCase()); // case insensitive sort<a name="line.3864"></a>
<span class="sourceLineNo">3865</span>                result = result == 0 ? -names1[0].compareTo(names2[0]) : result; // lower case before upper case<a name="line.3865"></a>
<span class="sourceLineNo">3866</span>                return o1.help() == o2.help() ? result : o2.help() ? -1 : 1; // help options come last<a name="line.3866"></a>
<span class="sourceLineNo">3867</span>            }<a name="line.3867"></a>
<span class="sourceLineNo">3868</span>        }<a name="line.3868"></a>
<span class="sourceLineNo">3869</span>        /** Sorts {@code Option} instances by their max arity first, then their min arity, then delegates to super class. */<a name="line.3869"></a>
<span class="sourceLineNo">3870</span>        static class SortByOptionArityAndNameAlphabetically extends SortByShortestOptionNameAlphabetically {<a name="line.3870"></a>
<span class="sourceLineNo">3871</span>            @Override<a name="line.3871"></a>
<span class="sourceLineNo">3872</span>            public int compare(final Field f1, final Field f2) {<a name="line.3872"></a>
<span class="sourceLineNo">3873</span>                final Option o1 = f1.getAnnotation(Option.class);<a name="line.3873"></a>
<span class="sourceLineNo">3874</span>                final Option o2 = f2.getAnnotation(Option.class);<a name="line.3874"></a>
<span class="sourceLineNo">3875</span>                final Range arity1 = Range.optionArity(f1);<a name="line.3875"></a>
<span class="sourceLineNo">3876</span>                final Range arity2 = Range.optionArity(f2);<a name="line.3876"></a>
<span class="sourceLineNo">3877</span>                int result = arity1.max - arity2.max;<a name="line.3877"></a>
<span class="sourceLineNo">3878</span>                if (result == 0) {<a name="line.3878"></a>
<span class="sourceLineNo">3879</span>                    result = arity1.min - arity2.min;<a name="line.3879"></a>
<span class="sourceLineNo">3880</span>                }<a name="line.3880"></a>
<span class="sourceLineNo">3881</span>                if (result == 0) { // arity is same<a name="line.3881"></a>
<span class="sourceLineNo">3882</span>                    if (isMultiValue(f1) &amp;&amp; !isMultiValue(f2)) { result = 1; } // f1 &gt; f2<a name="line.3882"></a>
<span class="sourceLineNo">3883</span>                    if (!isMultiValue(f1) &amp;&amp; isMultiValue(f2)) { result = -1; } // f1 &lt; f2<a name="line.3883"></a>
<span class="sourceLineNo">3884</span>                }<a name="line.3884"></a>
<span class="sourceLineNo">3885</span>                return result == 0 ? super.compare(f1, f2) : result;<a name="line.3885"></a>
<span class="sourceLineNo">3886</span>            }<a name="line.3886"></a>
<span class="sourceLineNo">3887</span>        }<a name="line.3887"></a>
<span class="sourceLineNo">3888</span>        /**<a name="line.3888"></a>
<span class="sourceLineNo">3889</span>         * &lt;p&gt;Responsible for spacing out {@link Text} values according to the {@link Column} definitions the table was<a name="line.3889"></a>
<span class="sourceLineNo">3890</span>         * created with. Columns have a width, indentation, and an overflow policy that decides what to do if a value is<a name="line.3890"></a>
<span class="sourceLineNo">3891</span>         * longer than the column's width.&lt;/p&gt;<a name="line.3891"></a>
<span class="sourceLineNo">3892</span>         */<a name="line.3892"></a>
<span class="sourceLineNo">3893</span>        public static class TextTable {<a name="line.3893"></a>
<span class="sourceLineNo">3894</span>            /**<a name="line.3894"></a>
<span class="sourceLineNo">3895</span>             * Helper class to index positions in a {@code Help.TextTable}.<a name="line.3895"></a>
<span class="sourceLineNo">3896</span>             * @since 2.0<a name="line.3896"></a>
<span class="sourceLineNo">3897</span>             */<a name="line.3897"></a>
<span class="sourceLineNo">3898</span>            public static class Cell {<a name="line.3898"></a>
<span class="sourceLineNo">3899</span>                /** Table column index (zero based). */<a name="line.3899"></a>
<span class="sourceLineNo">3900</span>                public final int column;<a name="line.3900"></a>
<span class="sourceLineNo">3901</span>                /** Table row index (zero based). */<a name="line.3901"></a>
<span class="sourceLineNo">3902</span>                public final int row;<a name="line.3902"></a>
<span class="sourceLineNo">3903</span>                /** Constructs a new Cell with the specified coordinates in the table.<a name="line.3903"></a>
<span class="sourceLineNo">3904</span>                 * @param column the zero-based table column<a name="line.3904"></a>
<span class="sourceLineNo">3905</span>                 * @param row the zero-based table row */<a name="line.3905"></a>
<span class="sourceLineNo">3906</span>                public Cell(final int column, final int row) { this.column = column; this.row = row; }<a name="line.3906"></a>
<span class="sourceLineNo">3907</span>            }<a name="line.3907"></a>
<span class="sourceLineNo">3908</span><a name="line.3908"></a>
<span class="sourceLineNo">3909</span>            /** The column definitions of this table. */<a name="line.3909"></a>
<span class="sourceLineNo">3910</span>            public final Column[] columns;<a name="line.3910"></a>
<span class="sourceLineNo">3911</span><a name="line.3911"></a>
<span class="sourceLineNo">3912</span>            /** The {@code char[]} slots of the {@code TextTable} to copy text values into. */<a name="line.3912"></a>
<span class="sourceLineNo">3913</span>            protected final List&lt;Text&gt; columnValues = new ArrayList&lt;Text&gt;();<a name="line.3913"></a>
<span class="sourceLineNo">3914</span><a name="line.3914"></a>
<span class="sourceLineNo">3915</span>            /** By default, indent wrapped lines by 2 spaces. */<a name="line.3915"></a>
<span class="sourceLineNo">3916</span>            public int indentWrappedLines = 2;<a name="line.3916"></a>
<span class="sourceLineNo">3917</span><a name="line.3917"></a>
<span class="sourceLineNo">3918</span>            private final Ansi ansi;<a name="line.3918"></a>
<span class="sourceLineNo">3919</span><a name="line.3919"></a>
<span class="sourceLineNo">3920</span>            /** Constructs a TextTable with five columns as follows:<a name="line.3920"></a>
<span class="sourceLineNo">3921</span>             * &lt;ol&gt;<a name="line.3921"></a>
<span class="sourceLineNo">3922</span>             * &lt;li&gt;required option/parameter marker (width: 2, indent: 0, TRUNCATE on overflow)&lt;/li&gt;<a name="line.3922"></a>
<span class="sourceLineNo">3923</span>             * &lt;li&gt;short option name (width: 2, indent: 0, TRUNCATE on overflow)&lt;/li&gt;<a name="line.3923"></a>
<span class="sourceLineNo">3924</span>             * &lt;li&gt;comma separator (width: 1, indent: 0, TRUNCATE on overflow)&lt;/li&gt;<a name="line.3924"></a>
<span class="sourceLineNo">3925</span>             * &lt;li&gt;long option name(s) (width: 24, indent: 1, SPAN multiple columns on overflow)&lt;/li&gt;<a name="line.3925"></a>
<span class="sourceLineNo">3926</span>             * &lt;li&gt;description line(s) (width: 51, indent: 1, WRAP to next row on overflow)&lt;/li&gt;<a name="line.3926"></a>
<span class="sourceLineNo">3927</span>             * &lt;/ol&gt;<a name="line.3927"></a>
<span class="sourceLineNo">3928</span>             * @param ansi whether to emit ANSI escape codes or not<a name="line.3928"></a>
<span class="sourceLineNo">3929</span>             */<a name="line.3929"></a>
<span class="sourceLineNo">3930</span>            public TextTable(final Ansi ansi) {<a name="line.3930"></a>
<span class="sourceLineNo">3931</span>                // "* -c, --create                Creates a ...."<a name="line.3931"></a>
<span class="sourceLineNo">3932</span>                this(ansi, new Column[] {<a name="line.3932"></a>
<span class="sourceLineNo">3933</span>                            new Column(2,                                        0, TRUNCATE), // "*"<a name="line.3933"></a>
<span class="sourceLineNo">3934</span>                            new Column(2,                                        0, TRUNCATE), // "-c"<a name="line.3934"></a>
<span class="sourceLineNo">3935</span>                            new Column(1,                                        0, TRUNCATE), // ","<a name="line.3935"></a>
<span class="sourceLineNo">3936</span>                            new Column(optionsColumnWidth - 2 - 2 - 1       , 1, SPAN),  // " --create"<a name="line.3936"></a>
<span class="sourceLineNo">3937</span>                            new Column(usageHelpWidth - optionsColumnWidth, 1, WRAP) // " Creates a ..."<a name="line.3937"></a>
<span class="sourceLineNo">3938</span>                    });<a name="line.3938"></a>
<span class="sourceLineNo">3939</span>            }<a name="line.3939"></a>
<span class="sourceLineNo">3940</span><a name="line.3940"></a>
<span class="sourceLineNo">3941</span>            /** Constructs a new TextTable with columns with the specified width, all SPANning  multiple columns on<a name="line.3941"></a>
<span class="sourceLineNo">3942</span>             * overflow except the last column which WRAPS to the next row.<a name="line.3942"></a>
<span class="sourceLineNo">3943</span>             * @param ansi whether to emit ANSI escape codes or not<a name="line.3943"></a>
<span class="sourceLineNo">3944</span>             * @param columnWidths the width of the table columns (all columns have zero indent)<a name="line.3944"></a>
<span class="sourceLineNo">3945</span>             */<a name="line.3945"></a>
<span class="sourceLineNo">3946</span>            public TextTable(final Ansi ansi, final int... columnWidths) {<a name="line.3946"></a>
<span class="sourceLineNo">3947</span>                this.ansi = Assert.notNull(ansi, "ansi");<a name="line.3947"></a>
<span class="sourceLineNo">3948</span>                columns = new Column[columnWidths.length];<a name="line.3948"></a>
<span class="sourceLineNo">3949</span>                for (int i = 0; i &lt; columnWidths.length; i++) {<a name="line.3949"></a>
<span class="sourceLineNo">3950</span>                    columns[i] = new Column(columnWidths[i], 0, i == columnWidths.length - 1 ? SPAN: WRAP);<a name="line.3950"></a>
<span class="sourceLineNo">3951</span>                }<a name="line.3951"></a>
<span class="sourceLineNo">3952</span>            }<a name="line.3952"></a>
<span class="sourceLineNo">3953</span>            /** Constructs a {@code TextTable} with the specified columns.<a name="line.3953"></a>
<span class="sourceLineNo">3954</span>             * @param ansi whether to emit ANSI escape codes or not<a name="line.3954"></a>
<span class="sourceLineNo">3955</span>             * @param columns columns to construct this TextTable with */<a name="line.3955"></a>
<span class="sourceLineNo">3956</span>            public TextTable(final Ansi ansi, final Column... columns) {<a name="line.3956"></a>
<span class="sourceLineNo">3957</span>                this.ansi = Assert.notNull(ansi, "ansi");<a name="line.3957"></a>
<span class="sourceLineNo">3958</span>                this.columns = Assert.notNull(columns, "columns");<a name="line.3958"></a>
<span class="sourceLineNo">3959</span>                if (columns.length == 0) { throw new IllegalArgumentException("At least one column is required"); }<a name="line.3959"></a>
<span class="sourceLineNo">3960</span>            }<a name="line.3960"></a>
<span class="sourceLineNo">3961</span>            /** Returns the {@code Text} slot at the specified row and column to write a text value into.<a name="line.3961"></a>
<span class="sourceLineNo">3962</span>             * @param row the row of the cell whose Text to return<a name="line.3962"></a>
<span class="sourceLineNo">3963</span>             * @param col the column of the cell whose Text to return<a name="line.3963"></a>
<span class="sourceLineNo">3964</span>             * @return the Text object at the specified row and column<a name="line.3964"></a>
<span class="sourceLineNo">3965</span>             * @since 2.0 */<a name="line.3965"></a>
<span class="sourceLineNo">3966</span>            public Text textAt(final int row, final int col) { return columnValues.get(col + (row * columns.length)); }<a name="line.3966"></a>
<span class="sourceLineNo">3967</span><a name="line.3967"></a>
<span class="sourceLineNo">3968</span>            /** Returns the {@code Text} slot at the specified row and column to write a text value into.<a name="line.3968"></a>
<span class="sourceLineNo">3969</span>             * @param row the row of the cell whose Text to return<a name="line.3969"></a>
<span class="sourceLineNo">3970</span>             * @param col the column of the cell whose Text to return<a name="line.3970"></a>
<span class="sourceLineNo">3971</span>             * @return the Text object at the specified row and column<a name="line.3971"></a>
<span class="sourceLineNo">3972</span>             * @deprecated use {@link #textAt(int, int)} instead */<a name="line.3972"></a>
<span class="sourceLineNo">3973</span>            @Deprecated<a name="line.3973"></a>
<span class="sourceLineNo">3974</span>            public Text cellAt(final int row, final int col) { return textAt(row, col); }<a name="line.3974"></a>
<span class="sourceLineNo">3975</span><a name="line.3975"></a>
<span class="sourceLineNo">3976</span>            /** Returns the current number of rows of this {@code TextTable}.<a name="line.3976"></a>
<span class="sourceLineNo">3977</span>             * @return the current number of rows in this TextTable */<a name="line.3977"></a>
<span class="sourceLineNo">3978</span>            public int rowCount() { return columnValues.size() / columns.length; }<a name="line.3978"></a>
<span class="sourceLineNo">3979</span><a name="line.3979"></a>
<span class="sourceLineNo">3980</span>            /** Adds the required {@code char[]} slots for a new row to the {@link #columnValues} field. */<a name="line.3980"></a>
<span class="sourceLineNo">3981</span>            public void addEmptyRow() {<a name="line.3981"></a>
<span class="sourceLineNo">3982</span>                for (int i = 0; i &lt; columns.length; i++) {<a name="line.3982"></a>
<span class="sourceLineNo">3983</span>                    columnValues.add(ansi.new Text(columns[i].width));<a name="line.3983"></a>
<span class="sourceLineNo">3984</span>                }<a name="line.3984"></a>
<span class="sourceLineNo">3985</span>            }<a name="line.3985"></a>
<span class="sourceLineNo">3986</span><a name="line.3986"></a>
<span class="sourceLineNo">3987</span>            /** Delegates to {@link #addRowValues(CommandLine.Help.Ansi.Text...)}.<a name="line.3987"></a>
<span class="sourceLineNo">3988</span>             * @param values the text values to display in each column of the current row */<a name="line.3988"></a>
<span class="sourceLineNo">3989</span>            public void addRowValues(final String... values) {<a name="line.3989"></a>
<span class="sourceLineNo">3990</span>                final Text[] array = new Text[values.length];<a name="line.3990"></a>
<span class="sourceLineNo">3991</span>                for (int i = 0; i &lt; array.length; i++) {<a name="line.3991"></a>
<span class="sourceLineNo">3992</span>                    array[i] = values[i] == null ? Ansi.EMPTY_TEXT : ansi.new Text(values[i]);<a name="line.3992"></a>
<span class="sourceLineNo">3993</span>                }<a name="line.3993"></a>
<span class="sourceLineNo">3994</span>                addRowValues(array);<a name="line.3994"></a>
<span class="sourceLineNo">3995</span>            }<a name="line.3995"></a>
<span class="sourceLineNo">3996</span>            /**<a name="line.3996"></a>
<span class="sourceLineNo">3997</span>             * Adds a new {@linkplain TextTable#addEmptyRow() empty row}, then calls {@link<a name="line.3997"></a>
<span class="sourceLineNo">3998</span>             * TextTable#putValue(int, int, CommandLine.Help.Ansi.Text) putValue} for each of the specified values, adding more empty rows<a name="line.3998"></a>
<span class="sourceLineNo">3999</span>             * if the return value indicates that the value spanned multiple columns or was wrapped to multiple rows.<a name="line.3999"></a>
<span class="sourceLineNo">4000</span>             * @param values the values to write into a new row in this TextTable<a name="line.4000"></a>
<span class="sourceLineNo">4001</span>             * @throws IllegalArgumentException if the number of values exceeds the number of Columns in this table<a name="line.4001"></a>
<span class="sourceLineNo">4002</span>             */<a name="line.4002"></a>
<span class="sourceLineNo">4003</span>            public void addRowValues(final Text... values) {<a name="line.4003"></a>
<span class="sourceLineNo">4004</span>                if (values.length &gt; columns.length) {<a name="line.4004"></a>
<span class="sourceLineNo">4005</span>                    throw new IllegalArgumentException(values.length + " values don't fit in " +<a name="line.4005"></a>
<span class="sourceLineNo">4006</span>                            columns.length + " columns");<a name="line.4006"></a>
<span class="sourceLineNo">4007</span>                }<a name="line.4007"></a>
<span class="sourceLineNo">4008</span>                addEmptyRow();<a name="line.4008"></a>
<span class="sourceLineNo">4009</span>                for (int col = 0; col &lt; values.length; col++) {<a name="line.4009"></a>
<span class="sourceLineNo">4010</span>                    final int row = rowCount() - 1;// write to last row: previous value may have wrapped to next row<a name="line.4010"></a>
<span class="sourceLineNo">4011</span>                    final Cell cell = putValue(row, col, values[col]);<a name="line.4011"></a>
<span class="sourceLineNo">4012</span><a name="line.4012"></a>
<span class="sourceLineNo">4013</span>                    // add row if a value spanned/wrapped and there are still remaining values<a name="line.4013"></a>
<span class="sourceLineNo">4014</span>                    if ((cell.row != row || cell.column != col) &amp;&amp; col != values.length - 1) {<a name="line.4014"></a>
<span class="sourceLineNo">4015</span>                        addEmptyRow();<a name="line.4015"></a>
<span class="sourceLineNo">4016</span>                    }<a name="line.4016"></a>
<span class="sourceLineNo">4017</span>                }<a name="line.4017"></a>
<span class="sourceLineNo">4018</span>            }<a name="line.4018"></a>
<span class="sourceLineNo">4019</span>            /**<a name="line.4019"></a>
<span class="sourceLineNo">4020</span>             * Writes the specified value into the cell at the specified row and column and returns the last row and<a name="line.4020"></a>
<span class="sourceLineNo">4021</span>             * column written to. Depending on the Column's {@link Column#overflow Overflow} policy, the value may span<a name="line.4021"></a>
<span class="sourceLineNo">4022</span>             * multiple columns or wrap to multiple rows when larger than the column width.<a name="line.4022"></a>
<span class="sourceLineNo">4023</span>             * @param row the target row in the table<a name="line.4023"></a>
<span class="sourceLineNo">4024</span>             * @param col the target column in the table to write to<a name="line.4024"></a>
<span class="sourceLineNo">4025</span>             * @param value the value to write<a name="line.4025"></a>
<span class="sourceLineNo">4026</span>             * @return a Cell indicating the position in the table that was last written to (since 2.0)<a name="line.4026"></a>
<span class="sourceLineNo">4027</span>             * @throws IllegalArgumentException if the specified row exceeds the table's {@linkplain<a name="line.4027"></a>
<span class="sourceLineNo">4028</span>             *          TextTable#rowCount() row count}<a name="line.4028"></a>
<span class="sourceLineNo">4029</span>             * @since 2.0 (previous versions returned a {@code java.awt.Point} object)<a name="line.4029"></a>
<span class="sourceLineNo">4030</span>             */<a name="line.4030"></a>
<span class="sourceLineNo">4031</span>            public Cell putValue(int row, int col, Text value) {<a name="line.4031"></a>
<span class="sourceLineNo">4032</span>                if (row &gt; rowCount() - 1) {<a name="line.4032"></a>
<span class="sourceLineNo">4033</span>                    throw new IllegalArgumentException("Cannot write to row " + row + ": rowCount=" + rowCount());<a name="line.4033"></a>
<span class="sourceLineNo">4034</span>                }<a name="line.4034"></a>
<span class="sourceLineNo">4035</span>                if (value == null || value.plain.length() == 0) { return new Cell(col, row); }<a name="line.4035"></a>
<span class="sourceLineNo">4036</span>                final Column column = columns[col];<a name="line.4036"></a>
<span class="sourceLineNo">4037</span>                int indent = column.indent;<a name="line.4037"></a>
<span class="sourceLineNo">4038</span>                switch (column.overflow) {<a name="line.4038"></a>
<span class="sourceLineNo">4039</span>                    case TRUNCATE:<a name="line.4039"></a>
<span class="sourceLineNo">4040</span>                        copy(value, textAt(row, col), indent);<a name="line.4040"></a>
<span class="sourceLineNo">4041</span>                        return new Cell(col, row);<a name="line.4041"></a>
<span class="sourceLineNo">4042</span>                    case SPAN:<a name="line.4042"></a>
<span class="sourceLineNo">4043</span>                        final int startColumn = col;<a name="line.4043"></a>
<span class="sourceLineNo">4044</span>                        do {<a name="line.4044"></a>
<span class="sourceLineNo">4045</span>                            final boolean lastColumn = col == columns.length - 1;<a name="line.4045"></a>
<span class="sourceLineNo">4046</span>                            final int charsWritten = lastColumn<a name="line.4046"></a>
<span class="sourceLineNo">4047</span>                                    ? copy(BreakIterator.getLineInstance(), value, textAt(row, col), indent)<a name="line.4047"></a>
<span class="sourceLineNo">4048</span>                                    : copy(value, textAt(row, col), indent);<a name="line.4048"></a>
<span class="sourceLineNo">4049</span>                            value = value.substring(charsWritten);<a name="line.4049"></a>
<span class="sourceLineNo">4050</span>                            indent = 0;<a name="line.4050"></a>
<span class="sourceLineNo">4051</span>                            if (value.length &gt; 0) { // value did not fit in column<a name="line.4051"></a>
<span class="sourceLineNo">4052</span>                                ++col;                // write remainder of value in next column<a name="line.4052"></a>
<span class="sourceLineNo">4053</span>                            }<a name="line.4053"></a>
<span class="sourceLineNo">4054</span>                            if (value.length &gt; 0 &amp;&amp; col &gt;= columns.length) { // we filled up all columns on this row<a name="line.4054"></a>
<span class="sourceLineNo">4055</span>                                addEmptyRow();<a name="line.4055"></a>
<span class="sourceLineNo">4056</span>                                row++;<a name="line.4056"></a>
<span class="sourceLineNo">4057</span>                                col = startColumn;<a name="line.4057"></a>
<span class="sourceLineNo">4058</span>                                indent = column.indent + indentWrappedLines;<a name="line.4058"></a>
<span class="sourceLineNo">4059</span>                            }<a name="line.4059"></a>
<span class="sourceLineNo">4060</span>                        } while (value.length &gt; 0);<a name="line.4060"></a>
<span class="sourceLineNo">4061</span>                        return new Cell(col, row);<a name="line.4061"></a>
<span class="sourceLineNo">4062</span>                    case WRAP:<a name="line.4062"></a>
<span class="sourceLineNo">4063</span>                        final BreakIterator lineBreakIterator = BreakIterator.getLineInstance();<a name="line.4063"></a>
<span class="sourceLineNo">4064</span>                        do {<a name="line.4064"></a>
<span class="sourceLineNo">4065</span>                            final int charsWritten = copy(lineBreakIterator, value, textAt(row, col), indent);<a name="line.4065"></a>
<span class="sourceLineNo">4066</span>                            value = value.substring(charsWritten);<a name="line.4066"></a>
<span class="sourceLineNo">4067</span>                            indent = column.indent + indentWrappedLines;<a name="line.4067"></a>
<span class="sourceLineNo">4068</span>                            if (value.length &gt; 0) {  // value did not fit in column<a name="line.4068"></a>
<span class="sourceLineNo">4069</span>                                ++row;                 // write remainder of value in next row<a name="line.4069"></a>
<span class="sourceLineNo">4070</span>                                addEmptyRow();<a name="line.4070"></a>
<span class="sourceLineNo">4071</span>                            }<a name="line.4071"></a>
<span class="sourceLineNo">4072</span>                        } while (value.length &gt; 0);<a name="line.4072"></a>
<span class="sourceLineNo">4073</span>                        return new Cell(col, row);<a name="line.4073"></a>
<span class="sourceLineNo">4074</span>                }<a name="line.4074"></a>
<span class="sourceLineNo">4075</span>                throw new IllegalStateException(column.overflow.toString());<a name="line.4075"></a>
<span class="sourceLineNo">4076</span>            }<a name="line.4076"></a>
<span class="sourceLineNo">4077</span>            private static int length(final Text str) {<a name="line.4077"></a>
<span class="sourceLineNo">4078</span>                return str.length; // TODO count some characters as double length<a name="line.4078"></a>
<span class="sourceLineNo">4079</span>            }<a name="line.4079"></a>
<span class="sourceLineNo">4080</span><a name="line.4080"></a>
<span class="sourceLineNo">4081</span>            private int copy(final BreakIterator line, final Text text, final Text columnValue, final int offset) {<a name="line.4081"></a>
<span class="sourceLineNo">4082</span>                // Deceive the BreakIterator to ensure no line breaks after '-' character<a name="line.4082"></a>
<span class="sourceLineNo">4083</span>                line.setText(text.plainString().replace("-", "\u00ff"));<a name="line.4083"></a>
<span class="sourceLineNo">4084</span>                int done = 0;<a name="line.4084"></a>
<span class="sourceLineNo">4085</span>                for (int start = line.first(), end = line.next(); end != BreakIterator.DONE; start = end, end = line.next()) {<a name="line.4085"></a>
<span class="sourceLineNo">4086</span>                    final Text word = text.substring(start, end); //.replace("\u00ff", "-"); // not needed<a name="line.4086"></a>
<span class="sourceLineNo">4087</span>                    if (columnValue.maxLength &gt;= offset + done + length(word)) {<a name="line.4087"></a>
<span class="sourceLineNo">4088</span>                        done += copy(word, columnValue, offset + done); // TODO localized length<a name="line.4088"></a>
<span class="sourceLineNo">4089</span>                    } else {<a name="line.4089"></a>
<span class="sourceLineNo">4090</span>                        break;<a name="line.4090"></a>
<span class="sourceLineNo">4091</span>                    }<a name="line.4091"></a>
<span class="sourceLineNo">4092</span>                }<a name="line.4092"></a>
<span class="sourceLineNo">4093</span>                if (done == 0 &amp;&amp; length(text) &gt; columnValue.maxLength) {<a name="line.4093"></a>
<span class="sourceLineNo">4094</span>                    // The value is a single word that is too big to be written to the column. Write as much as we can.<a name="line.4094"></a>
<span class="sourceLineNo">4095</span>                    done = copy(text, columnValue, offset);<a name="line.4095"></a>
<span class="sourceLineNo">4096</span>                }<a name="line.4096"></a>
<span class="sourceLineNo">4097</span>                return done;<a name="line.4097"></a>
<span class="sourceLineNo">4098</span>            }<a name="line.4098"></a>
<span class="sourceLineNo">4099</span>            private static int copy(final Text value, final Text destination, final int offset) {<a name="line.4099"></a>
<span class="sourceLineNo">4100</span>                final int length = Math.min(value.length, destination.maxLength - offset);<a name="line.4100"></a>
<span class="sourceLineNo">4101</span>                value.getStyledChars(value.from, length, destination, offset);<a name="line.4101"></a>
<span class="sourceLineNo">4102</span>                return length;<a name="line.4102"></a>
<span class="sourceLineNo">4103</span>            }<a name="line.4103"></a>
<span class="sourceLineNo">4104</span><a name="line.4104"></a>
<span class="sourceLineNo">4105</span>            /** Copies the text representation that we built up from the options into the specified StringBuilder.<a name="line.4105"></a>
<span class="sourceLineNo">4106</span>             * @param text the StringBuilder to write into<a name="line.4106"></a>
<span class="sourceLineNo">4107</span>             * @return the specified StringBuilder object (to allow method chaining and a more fluid API) */<a name="line.4107"></a>
<span class="sourceLineNo">4108</span>            public StringBuilder toString(final StringBuilder text) {<a name="line.4108"></a>
<span class="sourceLineNo">4109</span>                final int columnCount = this.columns.length;<a name="line.4109"></a>
<span class="sourceLineNo">4110</span>                final StringBuilder row = new StringBuilder(usageHelpWidth);<a name="line.4110"></a>
<span class="sourceLineNo">4111</span>                for (int i = 0; i &lt; columnValues.size(); i++) {<a name="line.4111"></a>
<span class="sourceLineNo">4112</span>                    final Text column = columnValues.get(i);<a name="line.4112"></a>
<span class="sourceLineNo">4113</span>                    row.append(column.toString());<a name="line.4113"></a>
<span class="sourceLineNo">4114</span>                    row.append(new String(spaces(columns[i % columnCount].width - column.length)));<a name="line.4114"></a>
<span class="sourceLineNo">4115</span>                    if (i % columnCount == columnCount - 1) {<a name="line.4115"></a>
<span class="sourceLineNo">4116</span>                        int lastChar = row.length() - 1;<a name="line.4116"></a>
<span class="sourceLineNo">4117</span>                        while (lastChar &gt;= 0 &amp;&amp; row.charAt(lastChar) == ' ') {lastChar--;} // rtrim<a name="line.4117"></a>
<span class="sourceLineNo">4118</span>                        row.setLength(lastChar + 1);<a name="line.4118"></a>
<span class="sourceLineNo">4119</span>                        text.append(row.toString()).append(System.getProperty("line.separator"));<a name="line.4119"></a>
<span class="sourceLineNo">4120</span>                        row.setLength(0);<a name="line.4120"></a>
<span class="sourceLineNo">4121</span>                    }<a name="line.4121"></a>
<span class="sourceLineNo">4122</span>                }<a name="line.4122"></a>
<span class="sourceLineNo">4123</span>                //if (Ansi.enabled()) { text.append(Style.reset.off()); }<a name="line.4123"></a>
<span class="sourceLineNo">4124</span>                return text;<a name="line.4124"></a>
<span class="sourceLineNo">4125</span>            }<a name="line.4125"></a>
<span class="sourceLineNo">4126</span>            @Override<a name="line.4126"></a>
<span class="sourceLineNo">4127</span>            public String toString() { return toString(new StringBuilder()).toString(); }<a name="line.4127"></a>
<span class="sourceLineNo">4128</span>        }<a name="line.4128"></a>
<span class="sourceLineNo">4129</span>        /** Columns define the width, indent (leading number of spaces in a column before the value) and<a name="line.4129"></a>
<span class="sourceLineNo">4130</span>         * {@linkplain Overflow Overflow} policy of a column in a {@linkplain TextTable TextTable}. */<a name="line.4130"></a>
<span class="sourceLineNo">4131</span>        public static class Column {<a name="line.4131"></a>
<span class="sourceLineNo">4132</span><a name="line.4132"></a>
<span class="sourceLineNo">4133</span>            /** Policy for handling text that is longer than the column width:<a name="line.4133"></a>
<span class="sourceLineNo">4134</span>             *  span multiple columns, wrap to the next row, or simply truncate the portion that doesn't fit. */<a name="line.4134"></a>
<span class="sourceLineNo">4135</span>            public enum Overflow { TRUNCATE, SPAN, WRAP }<a name="line.4135"></a>
<span class="sourceLineNo">4136</span><a name="line.4136"></a>
<span class="sourceLineNo">4137</span>            /** Column width in characters */<a name="line.4137"></a>
<span class="sourceLineNo">4138</span>            public final int width;<a name="line.4138"></a>
<span class="sourceLineNo">4139</span><a name="line.4139"></a>
<span class="sourceLineNo">4140</span>            /** Indent (number of empty spaces at the start of the column preceding the text value) */<a name="line.4140"></a>
<span class="sourceLineNo">4141</span>            public final int indent;<a name="line.4141"></a>
<span class="sourceLineNo">4142</span><a name="line.4142"></a>
<span class="sourceLineNo">4143</span>            /** Policy that determines how to handle values larger than the column width. */<a name="line.4143"></a>
<span class="sourceLineNo">4144</span>            public final Overflow overflow;<a name="line.4144"></a>
<span class="sourceLineNo">4145</span>            public Column(final int width, final int indent, final Overflow overflow) {<a name="line.4145"></a>
<span class="sourceLineNo">4146</span>                this.width = width;<a name="line.4146"></a>
<span class="sourceLineNo">4147</span>                this.indent = indent;<a name="line.4147"></a>
<span class="sourceLineNo">4148</span>                this.overflow = Assert.notNull(overflow, "overflow");<a name="line.4148"></a>
<span class="sourceLineNo">4149</span>            }<a name="line.4149"></a>
<span class="sourceLineNo">4150</span>        }<a name="line.4150"></a>
<span class="sourceLineNo">4151</span><a name="line.4151"></a>
<span class="sourceLineNo">4152</span>        /** All usage help message are generated with a color scheme that assigns certain styles and colors to common<a name="line.4152"></a>
<span class="sourceLineNo">4153</span>         * parts of a usage message: the command name, options, positional parameters and option parameters.<a name="line.4153"></a>
<span class="sourceLineNo">4154</span>         * Users may customize these styles by creating Help with a custom color scheme.<a name="line.4154"></a>
<span class="sourceLineNo">4155</span>         * &lt;p&gt;Note that these options and styles may not be rendered if ANSI escape codes are not<a name="line.4155"></a>
<span class="sourceLineNo">4156</span>         * {@linkplain Ansi#enabled() enabled}.&lt;/p&gt;<a name="line.4156"></a>
<span class="sourceLineNo">4157</span>         * @see Help#defaultColorScheme(Ansi)<a name="line.4157"></a>
<span class="sourceLineNo">4158</span>         */<a name="line.4158"></a>
<span class="sourceLineNo">4159</span>        public static class ColorScheme {<a name="line.4159"></a>
<span class="sourceLineNo">4160</span>            public final List&lt;IStyle&gt; commandStyles = new ArrayList&lt;IStyle&gt;();<a name="line.4160"></a>
<span class="sourceLineNo">4161</span>            public final List&lt;IStyle&gt; optionStyles = new ArrayList&lt;IStyle&gt;();<a name="line.4161"></a>
<span class="sourceLineNo">4162</span>            public final List&lt;IStyle&gt; parameterStyles = new ArrayList&lt;IStyle&gt;();<a name="line.4162"></a>
<span class="sourceLineNo">4163</span>            public final List&lt;IStyle&gt; optionParamStyles = new ArrayList&lt;IStyle&gt;();<a name="line.4163"></a>
<span class="sourceLineNo">4164</span>            private final Ansi ansi;<a name="line.4164"></a>
<span class="sourceLineNo">4165</span><a name="line.4165"></a>
<span class="sourceLineNo">4166</span>            /** Constructs a new ColorScheme with {@link Help.Ansi#AUTO}. */<a name="line.4166"></a>
<span class="sourceLineNo">4167</span>            public ColorScheme() { this(Ansi.AUTO); }<a name="line.4167"></a>
<span class="sourceLineNo">4168</span><a name="line.4168"></a>
<span class="sourceLineNo">4169</span>            /** Constructs a new ColorScheme with the specified Ansi enabled mode.<a name="line.4169"></a>
<span class="sourceLineNo">4170</span>             * @param ansi whether to emit ANSI escape codes or not<a name="line.4170"></a>
<span class="sourceLineNo">4171</span>             */<a name="line.4171"></a>
<span class="sourceLineNo">4172</span>            public ColorScheme(final Ansi ansi) {this.ansi = Assert.notNull(ansi, "ansi"); }<a name="line.4172"></a>
<span class="sourceLineNo">4173</span><a name="line.4173"></a>
<span class="sourceLineNo">4174</span>            /** Adds the specified styles to the registered styles for commands in this color scheme and returns this color scheme.<a name="line.4174"></a>
<span class="sourceLineNo">4175</span>             * @param styles the styles to add to the registered styles for commands in this color scheme<a name="line.4175"></a>
<span class="sourceLineNo">4176</span>             * @return this color scheme to enable method chaining for a more fluent API */<a name="line.4176"></a>
<span class="sourceLineNo">4177</span>            public ColorScheme commands(final IStyle... styles)     { return addAll(commandStyles, styles); }<a name="line.4177"></a>
<span class="sourceLineNo">4178</span>            /** Adds the specified styles to the registered styles for options in this color scheme and returns this color scheme.<a name="line.4178"></a>
<span class="sourceLineNo">4179</span>             * @param styles the styles to add to registered the styles for options in this color scheme<a name="line.4179"></a>
<span class="sourceLineNo">4180</span>             * @return this color scheme to enable method chaining for a more fluent API */<a name="line.4180"></a>
<span class="sourceLineNo">4181</span>            public ColorScheme options(final IStyle... styles)      { return addAll(optionStyles, styles);}<a name="line.4181"></a>
<span class="sourceLineNo">4182</span>            /** Adds the specified styles to the registered styles for positional parameters in this color scheme and returns this color scheme.<a name="line.4182"></a>
<span class="sourceLineNo">4183</span>             * @param styles the styles to add to registered the styles for parameters in this color scheme<a name="line.4183"></a>
<span class="sourceLineNo">4184</span>             * @return this color scheme to enable method chaining for a more fluent API */<a name="line.4184"></a>
<span class="sourceLineNo">4185</span>            public ColorScheme parameters(final IStyle... styles)   { return addAll(parameterStyles, styles);}<a name="line.4185"></a>
<span class="sourceLineNo">4186</span>            /** Adds the specified styles to the registered styles for option parameters in this color scheme and returns this color scheme.<a name="line.4186"></a>
<span class="sourceLineNo">4187</span>             * @param styles the styles to add to the registered styles for option parameters in this color scheme<a name="line.4187"></a>
<span class="sourceLineNo">4188</span>             * @return this color scheme to enable method chaining for a more fluent API */<a name="line.4188"></a>
<span class="sourceLineNo">4189</span>            public ColorScheme optionParams(final IStyle... styles) { return addAll(optionParamStyles, styles);}<a name="line.4189"></a>
<span class="sourceLineNo">4190</span>            /** Returns a Text with all command styles applied to the specified command string.<a name="line.4190"></a>
<span class="sourceLineNo">4191</span>             * @param command the command string to apply the registered command styles to<a name="line.4191"></a>
<span class="sourceLineNo">4192</span>             * @return a Text with all command styles applied to the specified command string */<a name="line.4192"></a>
<span class="sourceLineNo">4193</span>            public Ansi.Text commandText(final String command)         { return ansi().apply(command,     commandStyles); }<a name="line.4193"></a>
<span class="sourceLineNo">4194</span>            /** Returns a Text with all option styles applied to the specified option string.<a name="line.4194"></a>
<span class="sourceLineNo">4195</span>             * @param option the option string to apply the registered option styles to<a name="line.4195"></a>
<span class="sourceLineNo">4196</span>             * @return a Text with all option styles applied to the specified option string */<a name="line.4196"></a>
<span class="sourceLineNo">4197</span>            public Ansi.Text optionText(final String option)           { return ansi().apply(option,      optionStyles); }<a name="line.4197"></a>
<span class="sourceLineNo">4198</span>            /** Returns a Text with all parameter styles applied to the specified parameter string.<a name="line.4198"></a>
<span class="sourceLineNo">4199</span>             * @param parameter the parameter string to apply the registered parameter styles to<a name="line.4199"></a>
<span class="sourceLineNo">4200</span>             * @return a Text with all parameter styles applied to the specified parameter string */<a name="line.4200"></a>
<span class="sourceLineNo">4201</span>            public Ansi.Text parameterText(final String parameter)     { return ansi().apply(parameter,   parameterStyles); }<a name="line.4201"></a>
<span class="sourceLineNo">4202</span>            /** Returns a Text with all optionParam styles applied to the specified optionParam string.<a name="line.4202"></a>
<span class="sourceLineNo">4203</span>             * @param optionParam the option parameter string to apply the registered option parameter styles to<a name="line.4203"></a>
<span class="sourceLineNo">4204</span>             * @return a Text with all option parameter styles applied to the specified option parameter string */<a name="line.4204"></a>
<span class="sourceLineNo">4205</span>            public Ansi.Text optionParamText(final String optionParam) { return ansi().apply(optionParam, optionParamStyles); }<a name="line.4205"></a>
<span class="sourceLineNo">4206</span><a name="line.4206"></a>
<span class="sourceLineNo">4207</span>            /** Replaces colors and styles in this scheme with ones specified in system properties, and returns this scheme.<a name="line.4207"></a>
<span class="sourceLineNo">4208</span>             * Supported property names:&lt;ul&gt;<a name="line.4208"></a>
<span class="sourceLineNo">4209</span>             *     &lt;li&gt;{@code picocli.color.commands}&lt;/li&gt;<a name="line.4209"></a>
<span class="sourceLineNo">4210</span>             *     &lt;li&gt;{@code picocli.color.options}&lt;/li&gt;<a name="line.4210"></a>
<span class="sourceLineNo">4211</span>             *     &lt;li&gt;{@code picocli.color.parameters}&lt;/li&gt;<a name="line.4211"></a>
<span class="sourceLineNo">4212</span>             *     &lt;li&gt;{@code picocli.color.optionParams}&lt;/li&gt;<a name="line.4212"></a>
<span class="sourceLineNo">4213</span>             * &lt;/ul&gt;&lt;p&gt;Property values can be anything that {@link Help.Ansi.Style#parse(String)} can handle.&lt;/p&gt;<a name="line.4213"></a>
<span class="sourceLineNo">4214</span>             * @return this ColorScheme<a name="line.4214"></a>
<span class="sourceLineNo">4215</span>             */<a name="line.4215"></a>
<span class="sourceLineNo">4216</span>            public ColorScheme applySystemProperties() {<a name="line.4216"></a>
<span class="sourceLineNo">4217</span>                replace(commandStyles,     System.getProperty("picocli.color.commands"));<a name="line.4217"></a>
<span class="sourceLineNo">4218</span>                replace(optionStyles,      System.getProperty("picocli.color.options"));<a name="line.4218"></a>
<span class="sourceLineNo">4219</span>                replace(parameterStyles,   System.getProperty("picocli.color.parameters"));<a name="line.4219"></a>
<span class="sourceLineNo">4220</span>                replace(optionParamStyles, System.getProperty("picocli.color.optionParams"));<a name="line.4220"></a>
<span class="sourceLineNo">4221</span>                return this;<a name="line.4221"></a>
<span class="sourceLineNo">4222</span>            }<a name="line.4222"></a>
<span class="sourceLineNo">4223</span>            private void replace(final List&lt;IStyle&gt; styles, final String property) {<a name="line.4223"></a>
<span class="sourceLineNo">4224</span>                if (property != null) {<a name="line.4224"></a>
<span class="sourceLineNo">4225</span>                    styles.clear();<a name="line.4225"></a>
<span class="sourceLineNo">4226</span>                    addAll(styles, Style.parse(property));<a name="line.4226"></a>
<span class="sourceLineNo">4227</span>                }<a name="line.4227"></a>
<span class="sourceLineNo">4228</span>            }<a name="line.4228"></a>
<span class="sourceLineNo">4229</span>            private ColorScheme addAll(final List&lt;IStyle&gt; styles, final IStyle... add) {<a name="line.4229"></a>
<span class="sourceLineNo">4230</span>                styles.addAll(Arrays.asList(add));<a name="line.4230"></a>
<span class="sourceLineNo">4231</span>                return this;<a name="line.4231"></a>
<span class="sourceLineNo">4232</span>            }<a name="line.4232"></a>
<span class="sourceLineNo">4233</span><a name="line.4233"></a>
<span class="sourceLineNo">4234</span>            public Ansi ansi() {<a name="line.4234"></a>
<span class="sourceLineNo">4235</span>                return ansi;<a name="line.4235"></a>
<span class="sourceLineNo">4236</span>            }<a name="line.4236"></a>
<span class="sourceLineNo">4237</span>        }<a name="line.4237"></a>
<span class="sourceLineNo">4238</span><a name="line.4238"></a>
<span class="sourceLineNo">4239</span>        /** Creates and returns a new {@link ColorScheme} initialized with picocli default values: commands are bold,<a name="line.4239"></a>
<span class="sourceLineNo">4240</span>         *  options and parameters use a yellow foreground, and option parameters use italic.<a name="line.4240"></a>
<span class="sourceLineNo">4241</span>         * @param ansi whether the usage help message should contain ANSI escape codes or not<a name="line.4241"></a>
<span class="sourceLineNo">4242</span>         * @return a new default color scheme<a name="line.4242"></a>
<span class="sourceLineNo">4243</span>         */<a name="line.4243"></a>
<span class="sourceLineNo">4244</span>        public static ColorScheme defaultColorScheme(final Ansi ansi) {<a name="line.4244"></a>
<span class="sourceLineNo">4245</span>            return new ColorScheme(ansi)<a name="line.4245"></a>
<span class="sourceLineNo">4246</span>                    .commands(Style.bold)<a name="line.4246"></a>
<span class="sourceLineNo">4247</span>                    .options(Style.fg_yellow)<a name="line.4247"></a>
<span class="sourceLineNo">4248</span>                    .parameters(Style.fg_yellow)<a name="line.4248"></a>
<span class="sourceLineNo">4249</span>                    .optionParams(Style.italic);<a name="line.4249"></a>
<span class="sourceLineNo">4250</span>        }<a name="line.4250"></a>
<span class="sourceLineNo">4251</span><a name="line.4251"></a>
<span class="sourceLineNo">4252</span>        /** Provides methods and inner classes to support using ANSI escape codes in usage help messages. */<a name="line.4252"></a>
<span class="sourceLineNo">4253</span>        public enum Ansi {<a name="line.4253"></a>
<span class="sourceLineNo">4254</span>            /** Only emit ANSI escape codes if the platform supports it and system property {@code "picocli.ansi"}<a name="line.4254"></a>
<span class="sourceLineNo">4255</span>             * is not set to any value other than {@code "true"} (case insensitive). */<a name="line.4255"></a>
<span class="sourceLineNo">4256</span>            AUTO,<a name="line.4256"></a>
<span class="sourceLineNo">4257</span>            /** Forced ON: always emit ANSI escape code regardless of the platform. */<a name="line.4257"></a>
<span class="sourceLineNo">4258</span>            ON,<a name="line.4258"></a>
<span class="sourceLineNo">4259</span>            /** Forced OFF: never emit ANSI escape code regardless of the platform. */<a name="line.4259"></a>
<span class="sourceLineNo">4260</span>            OFF;<a name="line.4260"></a>
<span class="sourceLineNo">4261</span>            static Text EMPTY_TEXT = OFF.new Text(0);<a name="line.4261"></a>
<span class="sourceLineNo">4262</span>            static final boolean isWindows  = System.getProperty("os.name").startsWith("Windows");<a name="line.4262"></a>
<span class="sourceLineNo">4263</span>            static final boolean isXterm    = System.getenv("TERM") != null &amp;&amp; System.getenv("TERM").startsWith("xterm");<a name="line.4263"></a>
<span class="sourceLineNo">4264</span>            static final boolean ISATTY = calcTTY();<a name="line.4264"></a>
<span class="sourceLineNo">4265</span><a name="line.4265"></a>
<span class="sourceLineNo">4266</span>            // http://stackoverflow.com/questions/1403772/how-can-i-check-if-a-java-programs-input-output-streams-are-connected-to-a-term<a name="line.4266"></a>
<span class="sourceLineNo">4267</span>            static final boolean calcTTY() {<a name="line.4267"></a>
<span class="sourceLineNo">4268</span>                if (isWindows &amp;&amp; isXterm) { return true; } // Cygwin uses pseudo-tty and console is always null...<a name="line.4268"></a>
<span class="sourceLineNo">4269</span>                try { return System.class.getDeclaredMethod("console").invoke(null) != null; }<a name="line.4269"></a>
<span class="sourceLineNo">4270</span>                catch (final Throwable reflectionFailed) { return true; }<a name="line.4270"></a>
<span class="sourceLineNo">4271</span>            }<a name="line.4271"></a>
<span class="sourceLineNo">4272</span>            private static boolean ansiPossible() { return ISATTY &amp;&amp; (!isWindows || isXterm); }<a name="line.4272"></a>
<span class="sourceLineNo">4273</span><a name="line.4273"></a>
<span class="sourceLineNo">4274</span>            /** Returns {@code true} if ANSI escape codes should be emitted, {@code false} otherwise.<a name="line.4274"></a>
<span class="sourceLineNo">4275</span>             * @return ON: {@code true}, OFF: {@code false}, AUTO: if system property {@code "picocli.ansi"} is<a name="line.4275"></a>
<span class="sourceLineNo">4276</span>             *      defined then return its boolean value, otherwise return whether the platform supports ANSI escape codes */<a name="line.4276"></a>
<span class="sourceLineNo">4277</span>            public boolean enabled() {<a name="line.4277"></a>
<span class="sourceLineNo">4278</span>                if (this == ON)  { return true; }<a name="line.4278"></a>
<span class="sourceLineNo">4279</span>                if (this == OFF) { return false; }<a name="line.4279"></a>
<span class="sourceLineNo">4280</span>                return (System.getProperty("picocli.ansi") == null ? ansiPossible() : Boolean.getBoolean("picocli.ansi"));<a name="line.4280"></a>
<span class="sourceLineNo">4281</span>            }<a name="line.4281"></a>
<span class="sourceLineNo">4282</span><a name="line.4282"></a>
<span class="sourceLineNo">4283</span>            /** Defines the interface for an ANSI escape sequence. */<a name="line.4283"></a>
<span class="sourceLineNo">4284</span>            public interface IStyle {<a name="line.4284"></a>
<span class="sourceLineNo">4285</span><a name="line.4285"></a>
<span class="sourceLineNo">4286</span>                /** The Control Sequence Introducer (CSI) escape sequence {@value}. */<a name="line.4286"></a>
<span class="sourceLineNo">4287</span>                String CSI = "\u001B[";<a name="line.4287"></a>
<span class="sourceLineNo">4288</span><a name="line.4288"></a>
<span class="sourceLineNo">4289</span>                /** Returns the ANSI escape code for turning this style on.<a name="line.4289"></a>
<span class="sourceLineNo">4290</span>                 * @return the ANSI escape code for turning this style on */<a name="line.4290"></a>
<span class="sourceLineNo">4291</span>                String on();<a name="line.4291"></a>
<span class="sourceLineNo">4292</span><a name="line.4292"></a>
<span class="sourceLineNo">4293</span>                /** Returns the ANSI escape code for turning this style off.<a name="line.4293"></a>
<span class="sourceLineNo">4294</span>                 * @return the ANSI escape code for turning this style off */<a name="line.4294"></a>
<span class="sourceLineNo">4295</span>                String off();<a name="line.4295"></a>
<span class="sourceLineNo">4296</span>            }<a name="line.4296"></a>
<span class="sourceLineNo">4297</span><a name="line.4297"></a>
<span class="sourceLineNo">4298</span>            /**<a name="line.4298"></a>
<span class="sourceLineNo">4299</span>             * A set of pre-defined ANSI escape code styles and colors, and a set of convenience methods for parsing<a name="line.4299"></a>
<span class="sourceLineNo">4300</span>             * text with embedded markup style names, as well as convenience methods for converting<a name="line.4300"></a>
<span class="sourceLineNo">4301</span>             * styles to strings with embedded escape codes.<a name="line.4301"></a>
<span class="sourceLineNo">4302</span>             */<a name="line.4302"></a>
<span class="sourceLineNo">4303</span>            public enum Style implements IStyle {<a name="line.4303"></a>
<span class="sourceLineNo">4304</span>                reset(0, 0), bold(1, 21), faint(2, 22), italic(3, 23), underline(4, 24), blink(5, 25), reverse(7, 27),<a name="line.4304"></a>
<span class="sourceLineNo">4305</span>                fg_black(30, 39), fg_red(31, 39), fg_green(32, 39), fg_yellow(33, 39), fg_blue(34, 39), fg_magenta(35, 39), fg_cyan(36, 39), fg_white(37, 39),<a name="line.4305"></a>
<span class="sourceLineNo">4306</span>                bg_black(40, 49), bg_red(41, 49), bg_green(42, 49), bg_yellow(43, 49), bg_blue(44, 49), bg_magenta(45, 49), bg_cyan(46, 49), bg_white(47, 49),<a name="line.4306"></a>
<span class="sourceLineNo">4307</span>                ;<a name="line.4307"></a>
<span class="sourceLineNo">4308</span>                private final int startCode;<a name="line.4308"></a>
<span class="sourceLineNo">4309</span>                private final int endCode;<a name="line.4309"></a>
<span class="sourceLineNo">4310</span><a name="line.4310"></a>
<span class="sourceLineNo">4311</span>                Style(final int startCode, final int endCode) {this.startCode = startCode; this.endCode = endCode; }<a name="line.4311"></a>
<span class="sourceLineNo">4312</span>                @Override<a name="line.4312"></a>
<span class="sourceLineNo">4313</span>                public String on() { return CSI + startCode + "m"; }<a name="line.4313"></a>
<span class="sourceLineNo">4314</span>                @Override<a name="line.4314"></a>
<span class="sourceLineNo">4315</span>                public String off() { return CSI + endCode + "m"; }<a name="line.4315"></a>
<span class="sourceLineNo">4316</span><a name="line.4316"></a>
<span class="sourceLineNo">4317</span>                                /** Returns the concatenated ANSI escape codes for turning all specified styles on.<a name="line.4317"></a>
<span class="sourceLineNo">4318</span>                 * @param styles the styles to generate ANSI escape codes for<a name="line.4318"></a>
<span class="sourceLineNo">4319</span>                 * @return the concatenated ANSI escape codes for turning all specified styles on */<a name="line.4319"></a>
<span class="sourceLineNo">4320</span>                public static String on(final IStyle... styles) {<a name="line.4320"></a>
<span class="sourceLineNo">4321</span>                    final StringBuilder result = new StringBuilder();<a name="line.4321"></a>
<span class="sourceLineNo">4322</span>                    for (final IStyle style : styles) {<a name="line.4322"></a>
<span class="sourceLineNo">4323</span>                        result.append(style.on());<a name="line.4323"></a>
<span class="sourceLineNo">4324</span>                    }<a name="line.4324"></a>
<span class="sourceLineNo">4325</span>                    return result.toString();<a name="line.4325"></a>
<span class="sourceLineNo">4326</span>                }<a name="line.4326"></a>
<span class="sourceLineNo">4327</span>                                /** Returns the concatenated ANSI escape codes for turning all specified styles off.<a name="line.4327"></a>
<span class="sourceLineNo">4328</span>                 * @param styles the styles to generate ANSI escape codes for<a name="line.4328"></a>
<span class="sourceLineNo">4329</span>                 * @return the concatenated ANSI escape codes for turning all specified styles off */<a name="line.4329"></a>
<span class="sourceLineNo">4330</span>                public static String off(final IStyle... styles) {<a name="line.4330"></a>
<span class="sourceLineNo">4331</span>                    final StringBuilder result = new StringBuilder();<a name="line.4331"></a>
<span class="sourceLineNo">4332</span>                    for (final IStyle style : styles) {<a name="line.4332"></a>
<span class="sourceLineNo">4333</span>                        result.append(style.off());<a name="line.4333"></a>
<span class="sourceLineNo">4334</span>                    }<a name="line.4334"></a>
<span class="sourceLineNo">4335</span>                    return result.toString();<a name="line.4335"></a>
<span class="sourceLineNo">4336</span>                }<a name="line.4336"></a>
<span class="sourceLineNo">4337</span>                                /** Parses the specified style markup and returns the associated style.<a name="line.4337"></a>
<span class="sourceLineNo">4338</span>                                 *  The markup may be one of the Style enum value names, or it may be one of the Style enum value<a name="line.4338"></a>
<span class="sourceLineNo">4339</span>                                 *  names when {@code "fg_"} is prepended, or it may be one of the indexed colors in the 256 color palette.<a name="line.4339"></a>
<span class="sourceLineNo">4340</span>                 * @param str the case-insensitive style markup to convert, e.g. {@code "blue"} or {@code "fg_blue"},<a name="line.4340"></a>
<span class="sourceLineNo">4341</span>                 *          or {@code "46"} (indexed color) or {@code "0;5;0"} (RGB components of an indexed color)<a name="line.4341"></a>
<span class="sourceLineNo">4342</span>                                 * @return the IStyle for the specified converter<a name="line.4342"></a>
<span class="sourceLineNo">4343</span>                                 */<a name="line.4343"></a>
<span class="sourceLineNo">4344</span>                public static IStyle fg(final String str) {<a name="line.4344"></a>
<span class="sourceLineNo">4345</span>                    try { return Style.valueOf(str.toLowerCase(ENGLISH)); } catch (final Exception ignored) {}<a name="line.4345"></a>
<span class="sourceLineNo">4346</span>                    try { return Style.valueOf("fg_" + str.toLowerCase(ENGLISH)); } catch (final Exception ignored) {}<a name="line.4346"></a>
<span class="sourceLineNo">4347</span>                    return new Palette256Color(true, str);<a name="line.4347"></a>
<span class="sourceLineNo">4348</span>                }<a name="line.4348"></a>
<span class="sourceLineNo">4349</span>                                /** Parses the specified style markup and returns the associated style.<a name="line.4349"></a>
<span class="sourceLineNo">4350</span>                                 *  The markup may be one of the Style enum value names, or it may be one of the Style enum value<a name="line.4350"></a>
<span class="sourceLineNo">4351</span>                                 *  names when {@code "bg_"} is prepended, or it may be one of the indexed colors in the 256 color palette.<a name="line.4351"></a>
<span class="sourceLineNo">4352</span>                                 * @param str the case-insensitive style markup to convert, e.g. {@code "blue"} or {@code "bg_blue"},<a name="line.4352"></a>
<span class="sourceLineNo">4353</span>                 *          or {@code "46"} (indexed color) or {@code "0;5;0"} (RGB components of an indexed color)<a name="line.4353"></a>
<span class="sourceLineNo">4354</span>                                 * @return the IStyle for the specified converter<a name="line.4354"></a>
<span class="sourceLineNo">4355</span>                                 */<a name="line.4355"></a>
<span class="sourceLineNo">4356</span>                public static IStyle bg(final String str) {<a name="line.4356"></a>
<span class="sourceLineNo">4357</span>                    try { return Style.valueOf(str.toLowerCase(ENGLISH)); } catch (final Exception ignored) {}<a name="line.4357"></a>
<span class="sourceLineNo">4358</span>                    try { return Style.valueOf("bg_" + str.toLowerCase(ENGLISH)); } catch (final Exception ignored) {}<a name="line.4358"></a>
<span class="sourceLineNo">4359</span>                    return new Palette256Color(false, str);<a name="line.4359"></a>
<span class="sourceLineNo">4360</span>                }<a name="line.4360"></a>
<span class="sourceLineNo">4361</span>                /** Parses the specified comma-separated sequence of style descriptors and returns the associated<a name="line.4361"></a>
<span class="sourceLineNo">4362</span>                 *  styles. For each markup, strings starting with {@code "bg("} are delegated to<a name="line.4362"></a>
<span class="sourceLineNo">4363</span>                 *  {@link #bg(String)}, others are delegated to {@link #bg(String)}.<a name="line.4363"></a>
<span class="sourceLineNo">4364</span>                 * @param commaSeparatedCodes one or more descriptors, e.g. {@code "bg(blue),underline,red"}<a name="line.4364"></a>
<span class="sourceLineNo">4365</span>                 * @return an array with all styles for the specified descriptors<a name="line.4365"></a>
<span class="sourceLineNo">4366</span>                 */<a name="line.4366"></a>
<span class="sourceLineNo">4367</span>                public static IStyle[] parse(final String commaSeparatedCodes) {<a name="line.4367"></a>
<span class="sourceLineNo">4368</span>                    final String[] codes = commaSeparatedCodes.split(",");<a name="line.4368"></a>
<span class="sourceLineNo">4369</span>                    final IStyle[] styles = new IStyle[codes.length];<a name="line.4369"></a>
<span class="sourceLineNo">4370</span>                    for(int i = 0; i &lt; codes.length; ++i) {<a name="line.4370"></a>
<span class="sourceLineNo">4371</span>                        if (codes[i].toLowerCase(ENGLISH).startsWith("fg(")) {<a name="line.4371"></a>
<span class="sourceLineNo">4372</span>                            final int end = codes[i].indexOf(')');<a name="line.4372"></a>
<span class="sourceLineNo">4373</span>                            styles[i] = Style.fg(codes[i].substring(3, end &lt; 0 ? codes[i].length() : end));<a name="line.4373"></a>
<span class="sourceLineNo">4374</span>                        } else if (codes[i].toLowerCase(ENGLISH).startsWith("bg(")) {<a name="line.4374"></a>
<span class="sourceLineNo">4375</span>                            final int end = codes[i].indexOf(')');<a name="line.4375"></a>
<span class="sourceLineNo">4376</span>                            styles[i] = Style.bg(codes[i].substring(3, end &lt; 0 ? codes[i].length() : end));<a name="line.4376"></a>
<span class="sourceLineNo">4377</span>                        } else {<a name="line.4377"></a>
<span class="sourceLineNo">4378</span>                            styles[i] = Style.fg(codes[i]);<a name="line.4378"></a>
<span class="sourceLineNo">4379</span>                        }<a name="line.4379"></a>
<span class="sourceLineNo">4380</span>                    }<a name="line.4380"></a>
<span class="sourceLineNo">4381</span>                    return styles;<a name="line.4381"></a>
<span class="sourceLineNo">4382</span>                }<a name="line.4382"></a>
<span class="sourceLineNo">4383</span>            }<a name="line.4383"></a>
<span class="sourceLineNo">4384</span><a name="line.4384"></a>
<span class="sourceLineNo">4385</span>            /** Defines a palette map of 216 colors: 6 * 6 * 6 cube (216 colors):<a name="line.4385"></a>
<span class="sourceLineNo">4386</span>             * 16 + 36 * r + 6 * g + b (0 &amp;lt;= r, g, b &amp;lt;= 5). */<a name="line.4386"></a>
<span class="sourceLineNo">4387</span>            static class Palette256Color implements IStyle {<a name="line.4387"></a>
<span class="sourceLineNo">4388</span>                private final int fgbg;<a name="line.4388"></a>
<span class="sourceLineNo">4389</span>                private final int color;<a name="line.4389"></a>
<span class="sourceLineNo">4390</span><a name="line.4390"></a>
<span class="sourceLineNo">4391</span>                Palette256Color(final boolean foreground, final String color) {<a name="line.4391"></a>
<span class="sourceLineNo">4392</span>                    this.fgbg = foreground ? 38 : 48;<a name="line.4392"></a>
<span class="sourceLineNo">4393</span>                    final String[] rgb = color.split(";");<a name="line.4393"></a>
<span class="sourceLineNo">4394</span>                    if (rgb.length == 3) {<a name="line.4394"></a>
<span class="sourceLineNo">4395</span>                        this.color = 16 + 36 * Integer.decode(rgb[0]) + 6 * Integer.decode(rgb[1]) + Integer.decode(rgb[2]);<a name="line.4395"></a>
<span class="sourceLineNo">4396</span>                    } else {<a name="line.4396"></a>
<span class="sourceLineNo">4397</span>                        this.color = Integer.decode(color);<a name="line.4397"></a>
<span class="sourceLineNo">4398</span>                    }<a name="line.4398"></a>
<span class="sourceLineNo">4399</span>                }<a name="line.4399"></a>
<span class="sourceLineNo">4400</span>                @Override<a name="line.4400"></a>
<span class="sourceLineNo">4401</span>                public String on() { return String.format(CSI + "%d;5;%dm", fgbg, color); }<a name="line.4401"></a>
<span class="sourceLineNo">4402</span>                @Override<a name="line.4402"></a>
<span class="sourceLineNo">4403</span>                public String off() { return CSI + (fgbg + 1) + "m"; }<a name="line.4403"></a>
<span class="sourceLineNo">4404</span>            }<a name="line.4404"></a>
<span class="sourceLineNo">4405</span>            private static class StyledSection {<a name="line.4405"></a>
<span class="sourceLineNo">4406</span>                int startIndex, length;<a name="line.4406"></a>
<span class="sourceLineNo">4407</span>                String startStyles, endStyles;<a name="line.4407"></a>
<span class="sourceLineNo">4408</span>                StyledSection(final int start, final int len, final String style1, final String style2) {<a name="line.4408"></a>
<span class="sourceLineNo">4409</span>                    startIndex = start; length = len; startStyles = style1; endStyles = style2;<a name="line.4409"></a>
<span class="sourceLineNo">4410</span>                }<a name="line.4410"></a>
<span class="sourceLineNo">4411</span>                StyledSection withStartIndex(final int newStart) {<a name="line.4411"></a>
<span class="sourceLineNo">4412</span>                    return new StyledSection(newStart, length, startStyles, endStyles);<a name="line.4412"></a>
<span class="sourceLineNo">4413</span>                }<a name="line.4413"></a>
<span class="sourceLineNo">4414</span>            }<a name="line.4414"></a>
<span class="sourceLineNo">4415</span><a name="line.4415"></a>
<span class="sourceLineNo">4416</span>            /**<a name="line.4416"></a>
<span class="sourceLineNo">4417</span>             * Returns a new Text object where all the specified styles are applied to the full length of the<a name="line.4417"></a>
<span class="sourceLineNo">4418</span>             * specified plain text.<a name="line.4418"></a>
<span class="sourceLineNo">4419</span>             * @param plainText the string to apply all styles to. Must not contain markup!<a name="line.4419"></a>
<span class="sourceLineNo">4420</span>             * @param styles the styles to apply to the full plain text<a name="line.4420"></a>
<span class="sourceLineNo">4421</span>             * @return a new Text object<a name="line.4421"></a>
<span class="sourceLineNo">4422</span>             */<a name="line.4422"></a>
<span class="sourceLineNo">4423</span>            public Text apply(final String plainText, final List&lt;IStyle&gt; styles) {<a name="line.4423"></a>
<span class="sourceLineNo">4424</span>                if (plainText.length() == 0) { return new Text(0); }<a name="line.4424"></a>
<span class="sourceLineNo">4425</span>                final Text result = new Text(plainText.length());<a name="line.4425"></a>
<span class="sourceLineNo">4426</span>                final IStyle[] all = styles.toArray(new IStyle[styles.size()]);<a name="line.4426"></a>
<span class="sourceLineNo">4427</span>                result.sections.add(new StyledSection(<a name="line.4427"></a>
<span class="sourceLineNo">4428</span>                        0, plainText.length(), Style.on(all), Style.off(reverse(all)) + Style.reset.off()));<a name="line.4428"></a>
<span class="sourceLineNo">4429</span>                result.plain.append(plainText);<a name="line.4429"></a>
<span class="sourceLineNo">4430</span>                result.length = result.plain.length();<a name="line.4430"></a>
<span class="sourceLineNo">4431</span>                return result;<a name="line.4431"></a>
<span class="sourceLineNo">4432</span>            }<a name="line.4432"></a>
<span class="sourceLineNo">4433</span><a name="line.4433"></a>
<span class="sourceLineNo">4434</span>            private static &lt;T&gt; T[] reverse(final T[] all) {<a name="line.4434"></a>
<span class="sourceLineNo">4435</span>                for (int i = 0; i &lt; all.length / 2; i++) {<a name="line.4435"></a>
<span class="sourceLineNo">4436</span>                    final T temp = all[i];<a name="line.4436"></a>
<span class="sourceLineNo">4437</span>                    all[i] = all[all.length - i - 1];<a name="line.4437"></a>
<span class="sourceLineNo">4438</span>                    all[all.length - i - 1] = temp;<a name="line.4438"></a>
<span class="sourceLineNo">4439</span>                }<a name="line.4439"></a>
<span class="sourceLineNo">4440</span>                return all;<a name="line.4440"></a>
<span class="sourceLineNo">4441</span>            }<a name="line.4441"></a>
<span class="sourceLineNo">4442</span>            /** Encapsulates rich text with styles and colors. Text objects may be constructed with Strings containing<a name="line.4442"></a>
<span class="sourceLineNo">4443</span>             * markup like {@code @|bg(red),white,underline some text|@}, and this class converts the markup to ANSI<a name="line.4443"></a>
<span class="sourceLineNo">4444</span>             * escape codes.<a name="line.4444"></a>
<span class="sourceLineNo">4445</span>             * &lt;p&gt;<a name="line.4445"></a>
<span class="sourceLineNo">4446</span>             * Internally keeps both an enriched and a plain text representation to allow layout components to calculate<a name="line.4446"></a>
<span class="sourceLineNo">4447</span>             * text width while remaining unaware of the embedded ANSI escape codes.&lt;/p&gt; */<a name="line.4447"></a>
<span class="sourceLineNo">4448</span>            public class Text implements Cloneable {<a name="line.4448"></a>
<span class="sourceLineNo">4449</span>                private final int maxLength;<a name="line.4449"></a>
<span class="sourceLineNo">4450</span>                private int from;<a name="line.4450"></a>
<span class="sourceLineNo">4451</span>                private int length;<a name="line.4451"></a>
<span class="sourceLineNo">4452</span>                private StringBuilder plain = new StringBuilder();<a name="line.4452"></a>
<span class="sourceLineNo">4453</span>                private List&lt;StyledSection&gt; sections = new ArrayList&lt;StyledSection&gt;();<a name="line.4453"></a>
<span class="sourceLineNo">4454</span><a name="line.4454"></a>
<span class="sourceLineNo">4455</span>                /** Constructs a Text with the specified max length (for use in a TextTable Column).<a name="line.4455"></a>
<span class="sourceLineNo">4456</span>                 * @param maxLength max length of this text */<a name="line.4456"></a>
<span class="sourceLineNo">4457</span>                public Text(final int maxLength) { this.maxLength = maxLength; }<a name="line.4457"></a>
<span class="sourceLineNo">4458</span><a name="line.4458"></a>
<span class="sourceLineNo">4459</span>                /**<a name="line.4459"></a>
<span class="sourceLineNo">4460</span>                 * Constructs a Text with the specified String, which may contain markup like<a name="line.4460"></a>
<span class="sourceLineNo">4461</span>                 * {@code @|bg(red),white,underline some text|@}.<a name="line.4461"></a>
<span class="sourceLineNo">4462</span>                 * @param input the string with markup to parse<a name="line.4462"></a>
<span class="sourceLineNo">4463</span>                 */<a name="line.4463"></a>
<span class="sourceLineNo">4464</span>                public Text(final String input) {<a name="line.4464"></a>
<span class="sourceLineNo">4465</span>                    maxLength = -1;<a name="line.4465"></a>
<span class="sourceLineNo">4466</span>                    plain.setLength(0);<a name="line.4466"></a>
<span class="sourceLineNo">4467</span>                    int i = 0;<a name="line.4467"></a>
<span class="sourceLineNo">4468</span><a name="line.4468"></a>
<span class="sourceLineNo">4469</span>                    while (true) {<a name="line.4469"></a>
<span class="sourceLineNo">4470</span>                        int j = input.indexOf("@|", i);<a name="line.4470"></a>
<span class="sourceLineNo">4471</span>                        if (j == -1) {<a name="line.4471"></a>
<span class="sourceLineNo">4472</span>                            if (i == 0) {<a name="line.4472"></a>
<span class="sourceLineNo">4473</span>                                plain.append(input);<a name="line.4473"></a>
<span class="sourceLineNo">4474</span>                                length = plain.length();<a name="line.4474"></a>
<span class="sourceLineNo">4475</span>                                return;<a name="line.4475"></a>
<span class="sourceLineNo">4476</span>                            }<a name="line.4476"></a>
<span class="sourceLineNo">4477</span>                            plain.append(input.substring(i, input.length()));<a name="line.4477"></a>
<span class="sourceLineNo">4478</span>                            length = plain.length();<a name="line.4478"></a>
<span class="sourceLineNo">4479</span>                            return;<a name="line.4479"></a>
<span class="sourceLineNo">4480</span>                        }<a name="line.4480"></a>
<span class="sourceLineNo">4481</span>                        plain.append(input.substring(i, j));<a name="line.4481"></a>
<span class="sourceLineNo">4482</span>                        final int k = input.indexOf("|@", j);<a name="line.4482"></a>
<span class="sourceLineNo">4483</span>                        if (k == -1) {<a name="line.4483"></a>
<span class="sourceLineNo">4484</span>                            plain.append(input);<a name="line.4484"></a>
<span class="sourceLineNo">4485</span>                            length = plain.length();<a name="line.4485"></a>
<span class="sourceLineNo">4486</span>                            return;<a name="line.4486"></a>
<span class="sourceLineNo">4487</span>                        }<a name="line.4487"></a>
<span class="sourceLineNo">4488</span><a name="line.4488"></a>
<span class="sourceLineNo">4489</span>                        j += 2;<a name="line.4489"></a>
<span class="sourceLineNo">4490</span>                        final String spec = input.substring(j, k);<a name="line.4490"></a>
<span class="sourceLineNo">4491</span>                        final String[] items = spec.split(" ", 2);<a name="line.4491"></a>
<span class="sourceLineNo">4492</span>                        if (items.length == 1) {<a name="line.4492"></a>
<span class="sourceLineNo">4493</span>                            plain.append(input);<a name="line.4493"></a>
<span class="sourceLineNo">4494</span>                            length = plain.length();<a name="line.4494"></a>
<span class="sourceLineNo">4495</span>                            return;<a name="line.4495"></a>
<span class="sourceLineNo">4496</span>                        }<a name="line.4496"></a>
<span class="sourceLineNo">4497</span><a name="line.4497"></a>
<span class="sourceLineNo">4498</span>                        final IStyle[] styles = Style.parse(items[0]);<a name="line.4498"></a>
<span class="sourceLineNo">4499</span>                        addStyledSection(plain.length(), items[1].length(),<a name="line.4499"></a>
<span class="sourceLineNo">4500</span>                                Style.on(styles), Style.off(reverse(styles)) + Style.reset.off());<a name="line.4500"></a>
<span class="sourceLineNo">4501</span>                        plain.append(items[1]);<a name="line.4501"></a>
<span class="sourceLineNo">4502</span>                        i = k + 2;<a name="line.4502"></a>
<span class="sourceLineNo">4503</span>                    }<a name="line.4503"></a>
<span class="sourceLineNo">4504</span>                }<a name="line.4504"></a>
<span class="sourceLineNo">4505</span>                private void addStyledSection(final int start, final int length, final String startStyle, final String endStyle) {<a name="line.4505"></a>
<span class="sourceLineNo">4506</span>                    sections.add(new StyledSection(start, length, startStyle, endStyle));<a name="line.4506"></a>
<span class="sourceLineNo">4507</span>                }<a name="line.4507"></a>
<span class="sourceLineNo">4508</span>                @Override<a name="line.4508"></a>
<span class="sourceLineNo">4509</span>                public Object clone() {<a name="line.4509"></a>
<span class="sourceLineNo">4510</span>                    try { return super.clone(); } catch (final CloneNotSupportedException e) { throw new IllegalStateException(e); }<a name="line.4510"></a>
<span class="sourceLineNo">4511</span>                }<a name="line.4511"></a>
<span class="sourceLineNo">4512</span><a name="line.4512"></a>
<span class="sourceLineNo">4513</span>                public Text[] splitLines() {<a name="line.4513"></a>
<span class="sourceLineNo">4514</span>                    final List&lt;Text&gt; result = new ArrayList&lt;Text&gt;();<a name="line.4514"></a>
<span class="sourceLineNo">4515</span>                    boolean trailingEmptyString = false;<a name="line.4515"></a>
<span class="sourceLineNo">4516</span>                    int start = 0, end = 0;<a name="line.4516"></a>
<span class="sourceLineNo">4517</span>                    for (int i = 0; i &lt; plain.length(); i++, end = i) {<a name="line.4517"></a>
<span class="sourceLineNo">4518</span>                        final char c = plain.charAt(i);<a name="line.4518"></a>
<span class="sourceLineNo">4519</span>                        boolean eol = c == '\n';<a name="line.4519"></a>
<span class="sourceLineNo">4520</span>                        eol |= (c == '\r' &amp;&amp; i + 1 &lt; plain.length() &amp;&amp; plain.charAt(i + 1) == '\n' &amp;&amp; ++i &gt; 0); // \r\n<a name="line.4520"></a>
<span class="sourceLineNo">4521</span>                        eol |= c == '\r';<a name="line.4521"></a>
<span class="sourceLineNo">4522</span>                        if (eol) {<a name="line.4522"></a>
<span class="sourceLineNo">4523</span>                            result.add(this.substring(start, end));<a name="line.4523"></a>
<span class="sourceLineNo">4524</span>                            trailingEmptyString = i == plain.length() - 1;<a name="line.4524"></a>
<span class="sourceLineNo">4525</span>                            start = i + 1;<a name="line.4525"></a>
<span class="sourceLineNo">4526</span>                        }<a name="line.4526"></a>
<span class="sourceLineNo">4527</span>                    }<a name="line.4527"></a>
<span class="sourceLineNo">4528</span>                    if (start &lt; plain.length() || trailingEmptyString) {<a name="line.4528"></a>
<span class="sourceLineNo">4529</span>                        result.add(this.substring(start, plain.length()));<a name="line.4529"></a>
<span class="sourceLineNo">4530</span>                    }<a name="line.4530"></a>
<span class="sourceLineNo">4531</span>                    return result.toArray(new Text[result.size()]);<a name="line.4531"></a>
<span class="sourceLineNo">4532</span>                }<a name="line.4532"></a>
<span class="sourceLineNo">4533</span><a name="line.4533"></a>
<span class="sourceLineNo">4534</span>                /** Returns a new {@code Text} instance that is a substring of this Text. Does not modify this instance!<a name="line.4534"></a>
<span class="sourceLineNo">4535</span>                 * @param start index in the plain text where to start the substring<a name="line.4535"></a>
<span class="sourceLineNo">4536</span>                 * @return a new Text instance that is a substring of this Text */<a name="line.4536"></a>
<span class="sourceLineNo">4537</span>                public Text substring(final int start) {<a name="line.4537"></a>
<span class="sourceLineNo">4538</span>                    return substring(start, length);<a name="line.4538"></a>
<span class="sourceLineNo">4539</span>                }<a name="line.4539"></a>
<span class="sourceLineNo">4540</span><a name="line.4540"></a>
<span class="sourceLineNo">4541</span>                /** Returns a new {@code Text} instance that is a substring of this Text. Does not modify this instance!<a name="line.4541"></a>
<span class="sourceLineNo">4542</span>                 * @param start index in the plain text where to start the substring<a name="line.4542"></a>
<span class="sourceLineNo">4543</span>                 * @param end index in the plain text where to end the substring<a name="line.4543"></a>
<span class="sourceLineNo">4544</span>                 * @return a new Text instance that is a substring of this Text */<a name="line.4544"></a>
<span class="sourceLineNo">4545</span>                public Text substring(final int start, final int end) {<a name="line.4545"></a>
<span class="sourceLineNo">4546</span>                    final Text result = (Text) clone();<a name="line.4546"></a>
<span class="sourceLineNo">4547</span>                    result.from = from + start;<a name="line.4547"></a>
<span class="sourceLineNo">4548</span>                    result.length = end - start;<a name="line.4548"></a>
<span class="sourceLineNo">4549</span>                    return result;<a name="line.4549"></a>
<span class="sourceLineNo">4550</span>                }<a name="line.4550"></a>
<span class="sourceLineNo">4551</span>                /** Returns a new {@code Text} instance with the specified text appended. Does not modify this instance!<a name="line.4551"></a>
<span class="sourceLineNo">4552</span>                 * @param string the text to append<a name="line.4552"></a>
<span class="sourceLineNo">4553</span>                 * @return a new Text instance */<a name="line.4553"></a>
<span class="sourceLineNo">4554</span>                public Text append(final String string) {<a name="line.4554"></a>
<span class="sourceLineNo">4555</span>                    return append(new Text(string));<a name="line.4555"></a>
<span class="sourceLineNo">4556</span>                }<a name="line.4556"></a>
<span class="sourceLineNo">4557</span><a name="line.4557"></a>
<span class="sourceLineNo">4558</span>                /** Returns a new {@code Text} instance with the specified text appended. Does not modify this instance!<a name="line.4558"></a>
<span class="sourceLineNo">4559</span>                 * @param other the text to append<a name="line.4559"></a>
<span class="sourceLineNo">4560</span>                 * @return a new Text instance */<a name="line.4560"></a>
<span class="sourceLineNo">4561</span>                public Text append(final Text other) {<a name="line.4561"></a>
<span class="sourceLineNo">4562</span>                    final Text result = (Text) clone();<a name="line.4562"></a>
<span class="sourceLineNo">4563</span>                    result.plain = new StringBuilder(plain.toString().substring(from, from + length));<a name="line.4563"></a>
<span class="sourceLineNo">4564</span>                    result.from = 0;<a name="line.4564"></a>
<span class="sourceLineNo">4565</span>                    result.sections = new ArrayList&lt;StyledSection&gt;();<a name="line.4565"></a>
<span class="sourceLineNo">4566</span>                    for (final StyledSection section : sections) {<a name="line.4566"></a>
<span class="sourceLineNo">4567</span>                        result.sections.add(section.withStartIndex(section.startIndex - from));<a name="line.4567"></a>
<span class="sourceLineNo">4568</span>                    }<a name="line.4568"></a>
<span class="sourceLineNo">4569</span>                    result.plain.append(other.plain.toString().substring(other.from, other.from + other.length));<a name="line.4569"></a>
<span class="sourceLineNo">4570</span>                    for (final StyledSection section : other.sections) {<a name="line.4570"></a>
<span class="sourceLineNo">4571</span>                        final int index = result.length + section.startIndex - other.from;<a name="line.4571"></a>
<span class="sourceLineNo">4572</span>                        result.sections.add(section.withStartIndex(index));<a name="line.4572"></a>
<span class="sourceLineNo">4573</span>                    }<a name="line.4573"></a>
<span class="sourceLineNo">4574</span>                    result.length = result.plain.length();<a name="line.4574"></a>
<span class="sourceLineNo">4575</span>                    return result;<a name="line.4575"></a>
<span class="sourceLineNo">4576</span>                }<a name="line.4576"></a>
<span class="sourceLineNo">4577</span><a name="line.4577"></a>
<span class="sourceLineNo">4578</span>                /**<a name="line.4578"></a>
<span class="sourceLineNo">4579</span>                 * Copies the specified substring of this Text into the specified destination, preserving the markup.<a name="line.4579"></a>
<span class="sourceLineNo">4580</span>                 * @param from start of the substring<a name="line.4580"></a>
<span class="sourceLineNo">4581</span>                 * @param length length of the substring<a name="line.4581"></a>
<span class="sourceLineNo">4582</span>                 * @param destination destination Text to modify<a name="line.4582"></a>
<span class="sourceLineNo">4583</span>                 * @param offset indentation (padding)<a name="line.4583"></a>
<span class="sourceLineNo">4584</span>                 */<a name="line.4584"></a>
<span class="sourceLineNo">4585</span>                public void getStyledChars(final int from, final int length, final Text destination, final int offset) {<a name="line.4585"></a>
<span class="sourceLineNo">4586</span>                    if (destination.length &lt; offset) {<a name="line.4586"></a>
<span class="sourceLineNo">4587</span>                        for (int i = destination.length; i &lt; offset; i++) {<a name="line.4587"></a>
<span class="sourceLineNo">4588</span>                            destination.plain.append(' ');<a name="line.4588"></a>
<span class="sourceLineNo">4589</span>                        }<a name="line.4589"></a>
<span class="sourceLineNo">4590</span>                        destination.length = offset;<a name="line.4590"></a>
<span class="sourceLineNo">4591</span>                    }<a name="line.4591"></a>
<span class="sourceLineNo">4592</span>                    for (final StyledSection section : sections) {<a name="line.4592"></a>
<span class="sourceLineNo">4593</span>                        destination.sections.add(section.withStartIndex(section.startIndex - from + destination.length));<a name="line.4593"></a>
<span class="sourceLineNo">4594</span>                    }<a name="line.4594"></a>
<span class="sourceLineNo">4595</span>                    destination.plain.append(plain.toString().substring(from, from + length));<a name="line.4595"></a>
<span class="sourceLineNo">4596</span>                    destination.length = destination.plain.length();<a name="line.4596"></a>
<span class="sourceLineNo">4597</span>                }<a name="line.4597"></a>
<span class="sourceLineNo">4598</span>                /** Returns the plain text without any formatting.<a name="line.4598"></a>
<span class="sourceLineNo">4599</span>                 * @return the plain text without any formatting */<a name="line.4599"></a>
<span class="sourceLineNo">4600</span>                public String plainString() {  return plain.toString().substring(from, from + length); }<a name="line.4600"></a>
<span class="sourceLineNo">4601</span><a name="line.4601"></a>
<span class="sourceLineNo">4602</span>                @Override<a name="line.4602"></a>
<span class="sourceLineNo">4603</span>                public boolean equals(final Object obj) { return toString().equals(String.valueOf(obj)); }<a name="line.4603"></a>
<span class="sourceLineNo">4604</span>                @Override<a name="line.4604"></a>
<span class="sourceLineNo">4605</span>                public int hashCode() { return toString().hashCode(); }<a name="line.4605"></a>
<span class="sourceLineNo">4606</span><a name="line.4606"></a>
<span class="sourceLineNo">4607</span>                /** Returns a String representation of the text with ANSI escape codes embedded, unless ANSI is<a name="line.4607"></a>
<span class="sourceLineNo">4608</span>                 * {@linkplain Ansi#enabled()} not enabled}, in which case the plain text is returned.<a name="line.4608"></a>
<span class="sourceLineNo">4609</span>                 * @return a String representation of the text with ANSI escape codes embedded (if enabled) */<a name="line.4609"></a>
<span class="sourceLineNo">4610</span>                @Override<a name="line.4610"></a>
<span class="sourceLineNo">4611</span>                public String toString() {<a name="line.4611"></a>
<span class="sourceLineNo">4612</span>                    if (!Ansi.this.enabled()) {<a name="line.4612"></a>
<span class="sourceLineNo">4613</span>                        return plain.toString().substring(from, from + length);<a name="line.4613"></a>
<span class="sourceLineNo">4614</span>                    }<a name="line.4614"></a>
<span class="sourceLineNo">4615</span>                    if (length == 0) { return ""; }<a name="line.4615"></a>
<span class="sourceLineNo">4616</span>                    final StringBuilder sb = new StringBuilder(plain.length() + 20 * sections.size());<a name="line.4616"></a>
<span class="sourceLineNo">4617</span>                    StyledSection current = null;<a name="line.4617"></a>
<span class="sourceLineNo">4618</span>                    final int end = Math.min(from + length, plain.length());<a name="line.4618"></a>
<span class="sourceLineNo">4619</span>                    for (int i = from; i &lt; end; i++) {<a name="line.4619"></a>
<span class="sourceLineNo">4620</span>                        final StyledSection section = findSectionContaining(i);<a name="line.4620"></a>
<span class="sourceLineNo">4621</span>                        if (section != current) {<a name="line.4621"></a>
<span class="sourceLineNo">4622</span>                            if (current != null) { sb.append(current.endStyles); }<a name="line.4622"></a>
<span class="sourceLineNo">4623</span>                            if (section != null) { sb.append(section.startStyles); }<a name="line.4623"></a>
<span class="sourceLineNo">4624</span>                            current = section;<a name="line.4624"></a>
<span class="sourceLineNo">4625</span>                        }<a name="line.4625"></a>
<span class="sourceLineNo">4626</span>                        sb.append(plain.charAt(i));<a name="line.4626"></a>
<span class="sourceLineNo">4627</span>                    }<a name="line.4627"></a>
<span class="sourceLineNo">4628</span>                    if (current != null) { sb.append(current.endStyles); }<a name="line.4628"></a>
<span class="sourceLineNo">4629</span>                    return sb.toString();<a name="line.4629"></a>
<span class="sourceLineNo">4630</span>                }<a name="line.4630"></a>
<span class="sourceLineNo">4631</span><a name="line.4631"></a>
<span class="sourceLineNo">4632</span>                private StyledSection findSectionContaining(final int index) {<a name="line.4632"></a>
<span class="sourceLineNo">4633</span>                    for (final StyledSection section : sections) {<a name="line.4633"></a>
<span class="sourceLineNo">4634</span>                        if (index &gt;= section.startIndex &amp;&amp; index &lt; section.startIndex + section.length) {<a name="line.4634"></a>
<span class="sourceLineNo">4635</span>                            return section;<a name="line.4635"></a>
<span class="sourceLineNo">4636</span>                        }<a name="line.4636"></a>
<span class="sourceLineNo">4637</span>                    }<a name="line.4637"></a>
<span class="sourceLineNo">4638</span>                    return null;<a name="line.4638"></a>
<span class="sourceLineNo">4639</span>                }<a name="line.4639"></a>
<span class="sourceLineNo">4640</span>            }<a name="line.4640"></a>
<span class="sourceLineNo">4641</span>        }<a name="line.4641"></a>
<span class="sourceLineNo">4642</span>    }<a name="line.4642"></a>
<span class="sourceLineNo">4643</span><a name="line.4643"></a>
<span class="sourceLineNo">4644</span>    /**<a name="line.4644"></a>
<span class="sourceLineNo">4645</span>     * Utility class providing some defensive coding convenience methods.<a name="line.4645"></a>
<span class="sourceLineNo">4646</span>     */<a name="line.4646"></a>
<span class="sourceLineNo">4647</span>    private static final class Assert {<a name="line.4647"></a>
<span class="sourceLineNo">4648</span>        /**<a name="line.4648"></a>
<span class="sourceLineNo">4649</span>         * Throws a NullPointerException if the specified object is null.<a name="line.4649"></a>
<span class="sourceLineNo">4650</span>         * @param object the object to verify<a name="line.4650"></a>
<span class="sourceLineNo">4651</span>         * @param description error message<a name="line.4651"></a>
<span class="sourceLineNo">4652</span>         * @param &lt;T&gt; type of the object to check<a name="line.4652"></a>
<span class="sourceLineNo">4653</span>         * @return the verified object<a name="line.4653"></a>
<span class="sourceLineNo">4654</span>         */<a name="line.4654"></a>
<span class="sourceLineNo">4655</span>        static &lt;T&gt; T notNull(final T object, final String description) {<a name="line.4655"></a>
<span class="sourceLineNo">4656</span>            if (object == null) {<a name="line.4656"></a>
<span class="sourceLineNo">4657</span>                throw new NullPointerException(description);<a name="line.4657"></a>
<span class="sourceLineNo">4658</span>            }<a name="line.4658"></a>
<span class="sourceLineNo">4659</span>            return object;<a name="line.4659"></a>
<span class="sourceLineNo">4660</span>        }<a name="line.4660"></a>
<span class="sourceLineNo">4661</span>        private Assert() {} // private constructor: never instantiate<a name="line.4661"></a>
<span class="sourceLineNo">4662</span>    }<a name="line.4662"></a>
<span class="sourceLineNo">4663</span>    private enum TraceLevel { OFF, WARN, INFO, DEBUG;<a name="line.4663"></a>
<span class="sourceLineNo">4664</span>        public boolean isEnabled(final TraceLevel other) { return ordinal() &gt;= other.ordinal(); }<a name="line.4664"></a>
<span class="sourceLineNo">4665</span>        private void print(final Tracer tracer, final String msg, final Object... params) {<a name="line.4665"></a>
<span class="sourceLineNo">4666</span>            if (tracer.level.isEnabled(this)) { tracer.stream.printf(prefix(msg), params); }<a name="line.4666"></a>
<span class="sourceLineNo">4667</span>        }<a name="line.4667"></a>
<span class="sourceLineNo">4668</span>        private String prefix(final String msg) { return "[picocli " + this + "] " + msg; }<a name="line.4668"></a>
<span class="sourceLineNo">4669</span>        static TraceLevel lookup(final String key) { return key == null ? WARN : empty(key) || "true".equalsIgnoreCase(key) ? INFO : valueOf(key); }<a name="line.4669"></a>
<span class="sourceLineNo">4670</span>    }<a name="line.4670"></a>
<span class="sourceLineNo">4671</span>    private static class Tracer {<a name="line.4671"></a>
<span class="sourceLineNo">4672</span>        TraceLevel level = TraceLevel.lookup(System.getProperty("picocli.trace"));<a name="line.4672"></a>
<span class="sourceLineNo">4673</span>        PrintStream stream = System.err;<a name="line.4673"></a>
<span class="sourceLineNo">4674</span>        void warn (final String msg, final Object... params) { TraceLevel.WARN.print(this, msg, params); }<a name="line.4674"></a>
<span class="sourceLineNo">4675</span>        void info (final String msg, final Object... params) { TraceLevel.INFO.print(this, msg, params); }<a name="line.4675"></a>
<span class="sourceLineNo">4676</span>        void debug(final String msg, final Object... params) { TraceLevel.DEBUG.print(this, msg, params); }<a name="line.4676"></a>
<span class="sourceLineNo">4677</span>        boolean isWarn()  { return level.isEnabled(TraceLevel.WARN); }<a name="line.4677"></a>
<span class="sourceLineNo">4678</span>        boolean isInfo()  { return level.isEnabled(TraceLevel.INFO); }<a name="line.4678"></a>
<span class="sourceLineNo">4679</span>        boolean isDebug() { return level.isEnabled(TraceLevel.DEBUG); }<a name="line.4679"></a>
<span class="sourceLineNo">4680</span>    }<a name="line.4680"></a>
<span class="sourceLineNo">4681</span>    /** Base class of all exceptions thrown by {@code picocli.CommandLine}.<a name="line.4681"></a>
<span class="sourceLineNo">4682</span>     * @since 2.0 */<a name="line.4682"></a>
<span class="sourceLineNo">4683</span>    public static class PicocliException extends RuntimeException {<a name="line.4683"></a>
<span class="sourceLineNo">4684</span>        private static final long serialVersionUID = -2574128880125050818L;<a name="line.4684"></a>
<span class="sourceLineNo">4685</span>        public PicocliException(final String msg) { super(msg); }<a name="line.4685"></a>
<span class="sourceLineNo">4686</span>        public PicocliException(final String msg, final Exception ex) { super(msg, ex); }<a name="line.4686"></a>
<span class="sourceLineNo">4687</span>    }<a name="line.4687"></a>
<span class="sourceLineNo">4688</span>    /** Exception indicating a problem during {@code CommandLine} initialization.<a name="line.4688"></a>
<span class="sourceLineNo">4689</span>     * @since 2.0 */<a name="line.4689"></a>
<span class="sourceLineNo">4690</span>    public static class InitializationException extends PicocliException {<a name="line.4690"></a>
<span class="sourceLineNo">4691</span>        private static final long serialVersionUID = 8423014001666638895L;<a name="line.4691"></a>
<span class="sourceLineNo">4692</span>        public InitializationException(final String msg) { super(msg); }<a name="line.4692"></a>
<span class="sourceLineNo">4693</span>        public InitializationException(final String msg, final Exception ex) { super(msg, ex); }<a name="line.4693"></a>
<span class="sourceLineNo">4694</span>    }<a name="line.4694"></a>
<span class="sourceLineNo">4695</span>    /** Exception indicating a problem while invoking a command or subcommand.<a name="line.4695"></a>
<span class="sourceLineNo">4696</span>     * @since 2.0 */<a name="line.4696"></a>
<span class="sourceLineNo">4697</span>    public static class ExecutionException extends PicocliException {<a name="line.4697"></a>
<span class="sourceLineNo">4698</span>        private static final long serialVersionUID = 7764539594267007998L;<a name="line.4698"></a>
<span class="sourceLineNo">4699</span>        private final CommandLine commandLine;<a name="line.4699"></a>
<span class="sourceLineNo">4700</span>        public ExecutionException(final CommandLine commandLine, final String msg) {<a name="line.4700"></a>
<span class="sourceLineNo">4701</span>            super(msg);<a name="line.4701"></a>
<span class="sourceLineNo">4702</span>            this.commandLine = Assert.notNull(commandLine, "commandLine");<a name="line.4702"></a>
<span class="sourceLineNo">4703</span>        }<a name="line.4703"></a>
<span class="sourceLineNo">4704</span>        public ExecutionException(final CommandLine commandLine, final String msg, final Exception ex) {<a name="line.4704"></a>
<span class="sourceLineNo">4705</span>            super(msg, ex);<a name="line.4705"></a>
<span class="sourceLineNo">4706</span>            this.commandLine = Assert.notNull(commandLine, "commandLine");<a name="line.4706"></a>
<span class="sourceLineNo">4707</span>        }<a name="line.4707"></a>
<span class="sourceLineNo">4708</span>        /** Returns the {@code CommandLine} object for the (sub)command that could not be invoked.<a name="line.4708"></a>
<span class="sourceLineNo">4709</span>         * @return the {@code CommandLine} object for the (sub)command where invocation failed.<a name="line.4709"></a>
<span class="sourceLineNo">4710</span>         */<a name="line.4710"></a>
<span class="sourceLineNo">4711</span>        public CommandLine getCommandLine() { return commandLine; }<a name="line.4711"></a>
<span class="sourceLineNo">4712</span>    }<a name="line.4712"></a>
<span class="sourceLineNo">4713</span><a name="line.4713"></a>
<span class="sourceLineNo">4714</span>    /** Exception thrown by {@link ITypeConverter} implementations to indicate a String could not be converted. */<a name="line.4714"></a>
<span class="sourceLineNo">4715</span>    public static class TypeConversionException extends PicocliException {<a name="line.4715"></a>
<span class="sourceLineNo">4716</span>        private static final long serialVersionUID = 4251973913816346114L;<a name="line.4716"></a>
<span class="sourceLineNo">4717</span>        public TypeConversionException(final String msg) { super(msg); }<a name="line.4717"></a>
<span class="sourceLineNo">4718</span>    }<a name="line.4718"></a>
<span class="sourceLineNo">4719</span>    /** Exception indicating something went wrong while parsing command line options. */<a name="line.4719"></a>
<span class="sourceLineNo">4720</span>    public static class ParameterException extends PicocliException {<a name="line.4720"></a>
<span class="sourceLineNo">4721</span>        private static final long serialVersionUID = 1477112829129763139L;<a name="line.4721"></a>
<span class="sourceLineNo">4722</span>        private final CommandLine commandLine;<a name="line.4722"></a>
<span class="sourceLineNo">4723</span><a name="line.4723"></a>
<span class="sourceLineNo">4724</span>        /** Constructs a new ParameterException with the specified CommandLine and error message.<a name="line.4724"></a>
<span class="sourceLineNo">4725</span>         * @param commandLine the command or subcommand whose input was invalid<a name="line.4725"></a>
<span class="sourceLineNo">4726</span>         * @param msg describes the problem<a name="line.4726"></a>
<span class="sourceLineNo">4727</span>         * @since 2.0 */<a name="line.4727"></a>
<span class="sourceLineNo">4728</span>        public ParameterException(final CommandLine commandLine, final String msg) {<a name="line.4728"></a>
<span class="sourceLineNo">4729</span>            super(msg);<a name="line.4729"></a>
<span class="sourceLineNo">4730</span>            this.commandLine = Assert.notNull(commandLine, "commandLine");<a name="line.4730"></a>
<span class="sourceLineNo">4731</span>        }<a name="line.4731"></a>
<span class="sourceLineNo">4732</span>        /** Constructs a new ParameterException with the specified CommandLine and error message.<a name="line.4732"></a>
<span class="sourceLineNo">4733</span>         * @param commandLine the command or subcommand whose input was invalid<a name="line.4733"></a>
<span class="sourceLineNo">4734</span>         * @param msg describes the problem<a name="line.4734"></a>
<span class="sourceLineNo">4735</span>         * @param ex the exception that caused this ParameterException<a name="line.4735"></a>
<span class="sourceLineNo">4736</span>         * @since 2.0 */<a name="line.4736"></a>
<span class="sourceLineNo">4737</span>        public ParameterException(final CommandLine commandLine, final String msg, final Exception ex) {<a name="line.4737"></a>
<span class="sourceLineNo">4738</span>            super(msg, ex);<a name="line.4738"></a>
<span class="sourceLineNo">4739</span>            this.commandLine = Assert.notNull(commandLine, "commandLine");<a name="line.4739"></a>
<span class="sourceLineNo">4740</span>        }<a name="line.4740"></a>
<span class="sourceLineNo">4741</span><a name="line.4741"></a>
<span class="sourceLineNo">4742</span>        /** Returns the {@code CommandLine} object for the (sub)command whose input could not be parsed.<a name="line.4742"></a>
<span class="sourceLineNo">4743</span>         * @return the {@code CommandLine} object for the (sub)command where parsing failed.<a name="line.4743"></a>
<span class="sourceLineNo">4744</span>         * @since 2.0<a name="line.4744"></a>
<span class="sourceLineNo">4745</span>         */<a name="line.4745"></a>
<span class="sourceLineNo">4746</span>        public CommandLine getCommandLine() { return commandLine; }<a name="line.4746"></a>
<span class="sourceLineNo">4747</span><a name="line.4747"></a>
<span class="sourceLineNo">4748</span>        private static ParameterException create(final CommandLine cmd, final Exception ex, final String arg, final int i, final String[] args) {<a name="line.4748"></a>
<span class="sourceLineNo">4749</span>            final String msg = ex.getClass().getSimpleName() + ": " + ex.getLocalizedMessage()<a name="line.4749"></a>
<span class="sourceLineNo">4750</span>                    + " while processing argument at or before arg[" + i + "] '" + arg + "' in " + Arrays.toString(args) + ": " + ex.toString();<a name="line.4750"></a>
<span class="sourceLineNo">4751</span>            return new ParameterException(cmd, msg, ex);<a name="line.4751"></a>
<span class="sourceLineNo">4752</span>        }<a name="line.4752"></a>
<span class="sourceLineNo">4753</span>    }<a name="line.4753"></a>
<span class="sourceLineNo">4754</span>    /**<a name="line.4754"></a>
<span class="sourceLineNo">4755</span>     * Exception indicating that a required parameter was not specified.<a name="line.4755"></a>
<span class="sourceLineNo">4756</span>     */<a name="line.4756"></a>
<span class="sourceLineNo">4757</span>    public static class MissingParameterException extends ParameterException {<a name="line.4757"></a>
<span class="sourceLineNo">4758</span>        private static final long serialVersionUID = 5075678535706338753L;<a name="line.4758"></a>
<span class="sourceLineNo">4759</span>        public MissingParameterException(final CommandLine commandLine, final String msg) {<a name="line.4759"></a>
<span class="sourceLineNo">4760</span>            super(commandLine, msg);<a name="line.4760"></a>
<span class="sourceLineNo">4761</span>        }<a name="line.4761"></a>
<span class="sourceLineNo">4762</span><a name="line.4762"></a>
<span class="sourceLineNo">4763</span>        private static MissingParameterException create(final CommandLine cmd, final Collection&lt;Field&gt; missing, final String separator) {<a name="line.4763"></a>
<span class="sourceLineNo">4764</span>            if (missing.size() == 1) {<a name="line.4764"></a>
<span class="sourceLineNo">4765</span>                return new MissingParameterException(cmd, "Missing required option '"<a name="line.4765"></a>
<span class="sourceLineNo">4766</span>                        + describe(missing.iterator().next(), separator) + "'");<a name="line.4766"></a>
<span class="sourceLineNo">4767</span>            }<a name="line.4767"></a>
<span class="sourceLineNo">4768</span>            final List&lt;String&gt; names = new ArrayList&lt;String&gt;(missing.size());<a name="line.4768"></a>
<span class="sourceLineNo">4769</span>            for (final Field field : missing) {<a name="line.4769"></a>
<span class="sourceLineNo">4770</span>                names.add(describe(field, separator));<a name="line.4770"></a>
<span class="sourceLineNo">4771</span>            }<a name="line.4771"></a>
<span class="sourceLineNo">4772</span>            return new MissingParameterException(cmd, "Missing required options " + names.toString());<a name="line.4772"></a>
<span class="sourceLineNo">4773</span>        }<a name="line.4773"></a>
<span class="sourceLineNo">4774</span>        private static String describe(final Field field, final String separator) {<a name="line.4774"></a>
<span class="sourceLineNo">4775</span>            final String prefix = (field.isAnnotationPresent(Option.class))<a name="line.4775"></a>
<span class="sourceLineNo">4776</span>                ? field.getAnnotation(Option.class).names()[0] + separator<a name="line.4776"></a>
<span class="sourceLineNo">4777</span>                : "params[" + field.getAnnotation(Parameters.class).index() + "]" + separator;<a name="line.4777"></a>
<span class="sourceLineNo">4778</span>            return prefix + Help.DefaultParamLabelRenderer.renderParameterName(field);<a name="line.4778"></a>
<span class="sourceLineNo">4779</span>        }<a name="line.4779"></a>
<span class="sourceLineNo">4780</span>    }<a name="line.4780"></a>
<span class="sourceLineNo">4781</span><a name="line.4781"></a>
<span class="sourceLineNo">4782</span>    /**<a name="line.4782"></a>
<span class="sourceLineNo">4783</span>     * Exception indicating that multiple fields have been annotated with the same Option name.<a name="line.4783"></a>
<span class="sourceLineNo">4784</span>     */<a name="line.4784"></a>
<span class="sourceLineNo">4785</span>    public static class DuplicateOptionAnnotationsException extends InitializationException {<a name="line.4785"></a>
<span class="sourceLineNo">4786</span>        private static final long serialVersionUID = -3355128012575075641L;<a name="line.4786"></a>
<span class="sourceLineNo">4787</span>        public DuplicateOptionAnnotationsException(final String msg) { super(msg); }<a name="line.4787"></a>
<span class="sourceLineNo">4788</span><a name="line.4788"></a>
<span class="sourceLineNo">4789</span>        private static DuplicateOptionAnnotationsException create(final String name, final Field field1, final Field field2) {<a name="line.4789"></a>
<span class="sourceLineNo">4790</span>            return new DuplicateOptionAnnotationsException("Option name '" + name + "' is used by both " +<a name="line.4790"></a>
<span class="sourceLineNo">4791</span>                    field1.getDeclaringClass().getName() + "." + field1.getName() + " and " +<a name="line.4791"></a>
<span class="sourceLineNo">4792</span>                    field2.getDeclaringClass().getName() + "." + field2.getName());<a name="line.4792"></a>
<span class="sourceLineNo">4793</span>        }<a name="line.4793"></a>
<span class="sourceLineNo">4794</span>    }<a name="line.4794"></a>
<span class="sourceLineNo">4795</span>    /** Exception indicating that there was a gap in the indices of the fields annotated with {@link Parameters}. */<a name="line.4795"></a>
<span class="sourceLineNo">4796</span>    public static class ParameterIndexGapException extends InitializationException {<a name="line.4796"></a>
<span class="sourceLineNo">4797</span>        private static final long serialVersionUID = -1520981133257618319L;<a name="line.4797"></a>
<span class="sourceLineNo">4798</span>        public ParameterIndexGapException(final String msg) { super(msg); }<a name="line.4798"></a>
<span class="sourceLineNo">4799</span>    }<a name="line.4799"></a>
<span class="sourceLineNo">4800</span>    /** Exception indicating that a command line argument could not be mapped to any of the fields annotated with<a name="line.4800"></a>
<span class="sourceLineNo">4801</span>     * {@link Option} or {@link Parameters}. */<a name="line.4801"></a>
<span class="sourceLineNo">4802</span>    public static class UnmatchedArgumentException extends ParameterException {<a name="line.4802"></a>
<span class="sourceLineNo">4803</span>        private static final long serialVersionUID = -8700426380701452440L;<a name="line.4803"></a>
<span class="sourceLineNo">4804</span>        public UnmatchedArgumentException(final CommandLine commandLine, final String msg) { super(commandLine, msg); }<a name="line.4804"></a>
<span class="sourceLineNo">4805</span>        public UnmatchedArgumentException(final CommandLine commandLine, final Stack&lt;String&gt; args) { this(commandLine, new ArrayList&lt;String&gt;(reverse(args))); }<a name="line.4805"></a>
<span class="sourceLineNo">4806</span>        public UnmatchedArgumentException(final CommandLine commandLine, final List&lt;String&gt; args) { this(commandLine, "Unmatched argument" + (args.size() == 1 ? " " : "s ") + args); }<a name="line.4806"></a>
<span class="sourceLineNo">4807</span>    }<a name="line.4807"></a>
<span class="sourceLineNo">4808</span>    /** Exception indicating that more values were specified for an option or parameter than its {@link Option#arity() arity} allows. */<a name="line.4808"></a>
<span class="sourceLineNo">4809</span>    public static class MaxValuesforFieldExceededException extends ParameterException {<a name="line.4809"></a>
<span class="sourceLineNo">4810</span>        private static final long serialVersionUID = 6536145439570100641L;<a name="line.4810"></a>
<span class="sourceLineNo">4811</span>        public MaxValuesforFieldExceededException(final CommandLine commandLine, final String msg) { super(commandLine, msg); }<a name="line.4811"></a>
<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
<span class="sourceLineNo">4813</span>    /** Exception indicating that an option for a single-value option field has been specified multiple times on the command line. */<a name="line.4813"></a>
<span class="sourceLineNo">4814</span>    public static class OverwrittenOptionException extends ParameterException {<a name="line.4814"></a>
<span class="sourceLineNo">4815</span>        private static final long serialVersionUID = 1338029208271055776L;<a name="line.4815"></a>
<span class="sourceLineNo">4816</span>        public OverwrittenOptionException(final CommandLine commandLine, final String msg) { super(commandLine, msg); }<a name="line.4816"></a>
<span class="sourceLineNo">4817</span>    }<a name="line.4817"></a>
<span class="sourceLineNo">4818</span>    /**<a name="line.4818"></a>
<span class="sourceLineNo">4819</span>     * Exception indicating that an annotated field had a type for which no {@link ITypeConverter} was<a name="line.4819"></a>
<span class="sourceLineNo">4820</span>     * {@linkplain #registerConverter(Class, ITypeConverter) registered}.<a name="line.4820"></a>
<span class="sourceLineNo">4821</span>     */<a name="line.4821"></a>
<span class="sourceLineNo">4822</span>    public static class MissingTypeConverterException extends ParameterException {<a name="line.4822"></a>
<span class="sourceLineNo">4823</span>        private static final long serialVersionUID = -6050931703233083760L;<a name="line.4823"></a>
<span class="sourceLineNo">4824</span>        public MissingTypeConverterException(final CommandLine commandLine, final String msg) { super(commandLine, msg); }<a name="line.4824"></a>
<span class="sourceLineNo">4825</span>    }<a name="line.4825"></a>
<span class="sourceLineNo">4826</span>}<a name="line.4826"></a>




























































</pre>
</div>
</body>
</html>
