You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by gi...@apache.org on 2025/12/12 23:52:46 UTC
(juneau) branch asf-staging updated: Deploy documentation staging from 82ea6d092a2319038bf095881a14b2a89f4e8ca7 82ea6d092a2319038bf095881a14b2a89f4e8ca7
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-staging
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/asf-staging by this push:
new 5c74ba32ef Deploy documentation staging from 82ea6d092a2319038bf095881a14b2a89f4e8ca7 82ea6d092a2319038bf095881a14b2a89f4e8ca7
5c74ba32ef is described below
commit 5c74ba32ef29159a4ab547720dbc7019fae8b4fb
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Fri Dec 12 23:52:41 2025 +0000
Deploy documentation staging from 82ea6d092a2319038bf095881a14b2a89f4e8ca7 82ea6d092a2319038bf095881a14b2a89f4e8ca7
---
site/xref/org/apache/juneau/BeanPropertyMeta.html | 2 +-
.../org/apache/juneau/BeanTraverseSession.html | 803 ++++++------
.../org/apache/juneau/collections/JsonMap.html | 2 +-
.../juneau/commons/utils/CollectionUtils.html | 1347 ++++++++++----------
.../apache/juneau/commons/utils/StringUtils.html | 2 +-
site/xref/org/apache/juneau/rest/RestSession.html | 2 +-
.../juneau/rest/httppart/RequestPathParams.html | 2 +-
.../apache/juneau/rest/mock/MockPathResolver.html | 443 +++----
.../org/apache/juneau/rest/util/UrlPathMatch.html | 253 ++--
.../org/apache/juneau/serializer/Serializer.html | 2 +-
10 files changed, 1432 insertions(+), 1426 deletions(-)
diff --git a/site/xref/org/apache/juneau/BeanPropertyMeta.html b/site/xref/org/apache/juneau/BeanPropertyMeta.html
index 0b8f46431e..b95c607084 100644
--- a/site/xref/org/apache/juneau/BeanPropertyMeta.html
+++ b/site/xref/org/apache/juneau/BeanPropertyMeta.html
@@ -838,7 +838,7 @@
<a class="jxr_linenumber" name="L830" href="#L830">830</a> <strong class="jxr_keyword">return</strong> (Map)field.get(bean);
<a class="jxr_linenumber" name="L831" href="#L831">831</a> <strong class="jxr_keyword">throw</strong> bex(beanMeta.getClassMeta(), <span class="jxr_string">"Getter or public field not defined on property ''{0}''"</span>, name);
<a class="jxr_linenumber" name="L832" href="#L832">832</a> }
-<a class="jxr_linenumber" name="L833" href="#L833">833</a> <strong class="jxr_keyword">return</strong> Collections.EMPTY_MAP;
+<a class="jxr_linenumber" name="L833" href="#L833">833</a> <strong class="jxr_keyword">return</strong> mape();
<a class="jxr_linenumber" name="L834" href="#L834">834</a> }
<a class="jxr_linenumber" name="L835" href="#L835">835</a>
<a class="jxr_linenumber" name="L836" href="#L836">836</a> <em class="jxr_javadoccomment">/**</em>
diff --git a/site/xref/org/apache/juneau/BeanTraverseSession.html b/site/xref/org/apache/juneau/BeanTraverseSession.html
index 06268b8a38..a2b62746eb 100644
--- a/site/xref/org/apache/juneau/BeanTraverseSession.html
+++ b/site/xref/org/apache/juneau/BeanTraverseSession.html
@@ -25,407 +25,408 @@
<a class="jxr_linenumber" name="L17" href="#L17">17</a> <strong class="jxr_keyword">package</strong> org.apache.juneau;
<a class="jxr_linenumber" name="L18" href="#L18">18</a>
<a class="jxr_linenumber" name="L19" href="#L19">19</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.collections.JsonMap.*;
-<a class="jxr_linenumber" name="L20" href="#L20">20</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.Utils.*;
-<a class="jxr_linenumber" name="L21" href="#L21">21</a>
-<a class="jxr_linenumber" name="L22" href="#L22">22</a> <strong class="jxr_keyword">import</strong> java.text.*;
-<a class="jxr_linenumber" name="L23" href="#L23">23</a> <strong class="jxr_keyword">import</strong> java.util.*;
-<a class="jxr_linenumber" name="L24" href="#L24">24</a> <strong class="jxr_keyword">import</strong> java.util.function.*;
-<a class="jxr_linenumber" name="L25" href="#L25">25</a>
-<a class="jxr_linenumber" name="L26" href="#L26">26</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.collections.*;
-<a class="jxr_linenumber" name="L27" href="#L27">27</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.commons.utils.*;
-<a class="jxr_linenumber" name="L28" href="#L28">28</a>
-<a class="jxr_linenumber" name="L29" href="#L29">29</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L30" href="#L30">30</a> <em class="jxr_javadoccomment"> * ContextSession that lives for the duration of a single use of {@link BeanTraverseContext}.</em>
-<a class="jxr_linenumber" name="L31" href="#L31">31</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L32" href="#L32">32</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L33" href="#L33">33</a> <em class="jxr_javadoccomment"> * Used by serializers and other classes that traverse POJOs for the following purposes:</em>
-<a class="jxr_linenumber" name="L34" href="#L34">34</a> <em class="jxr_javadoccomment"> * <ul class='spaced-list'></em>
-<a class="jxr_linenumber" name="L35" href="#L35">35</a> <em class="jxr_javadoccomment"> * <li></em>
-<a class="jxr_linenumber" name="L36" href="#L36">36</a> <em class="jxr_javadoccomment"> * Keeping track of how deep it is in a model for indentation purposes.</em>
-<a class="jxr_linenumber" name="L37" href="#L37">37</a> <em class="jxr_javadoccomment"> * <li></em>
-<a class="jxr_linenumber" name="L38" href="#L38">38</a> <em class="jxr_javadoccomment"> * Ensuring infinite loops don't occur by setting a limit on how deep to traverse a model.</em>
-<a class="jxr_linenumber" name="L39" href="#L39">39</a> <em class="jxr_javadoccomment"> * <li></em>
-<a class="jxr_linenumber" name="L40" href="#L40">40</a> <em class="jxr_javadoccomment"> * Ensuring infinite loops don't occur from loops in the model (when detectRecursions is enabled.</em>
-<a class="jxr_linenumber" name="L41" href="#L41">41</a> <em class="jxr_javadoccomment"> * </ul></em>
-<a class="jxr_linenumber" name="L42" href="#L42">42</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L43" href="#L43">43</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Notes:</h5><ul></em>
-<a class="jxr_linenumber" name="L44" href="#L44">44</a> <em class="jxr_javadoccomment"> * <li class='warn'>This class is not thread safe and is typically discarded after one use.</em>
-<a class="jxr_linenumber" name="L45" href="#L45">45</a> <em class="jxr_javadoccomment"> * </ul></em>
-<a class="jxr_linenumber" name="L46" href="#L46">46</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L47" href="#L47">47</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L48" href="#L48">48</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a name="BeanTraverseSession" href="../../../org/apache/juneau/BeanTraverseSession.html#BeanTraverseSession">BeanTraverseSession</a> <strong class="jxr_keyword">extends</strong> BeanSession {
-<a class="jxr_linenumber" name="L49" href="#L49">49</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L50" href="#L50">50</a> <em class="jxr_javadoccomment"> * Builder class.</em>
-<a class="jxr_linenumber" name="L51" href="#L51">51</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L52" href="#L52">52</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">abstract</strong> <strong class="jxr_keyword">class</strong> Builder <strong class="jxr_keyword">extends</strong> BeanSession.Builder {
-<a class="jxr_linenumber" name="L53" href="#L53">53</a>
-<a class="jxr_linenumber" name="L54" href="#L54">54</a> BeanTraverseContext ctx;
-<a class="jxr_linenumber" name="L55" href="#L55">55</a> <strong class="jxr_keyword">int</strong> initialDepth;
-<a class="jxr_linenumber" name="L56" href="#L56">56</a>
-<a class="jxr_linenumber" name="L57" href="#L57">57</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L58" href="#L58">58</a> <em class="jxr_javadoccomment"> * Constructor</em>
-<a class="jxr_linenumber" name="L59" href="#L59">59</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L60" href="#L60">60</a> <em class="jxr_javadoccomment"> * @param ctx The context creating this session.</em>
-<a class="jxr_linenumber" name="L61" href="#L61">61</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L62" href="#L62">62</a> <strong class="jxr_keyword">protected</strong> Builder(<a name="BeanTraverseContext" href="../../../org/apache/juneau/BeanTraverseContext.html#BeanTraverseContext">BeanTraverseContext</a> ctx) {
-<a class="jxr_linenumber" name="L63" href="#L63">63</a> <strong class="jxr_keyword">super</strong>(ctx.getBeanContext());
-<a class="jxr_linenumber" name="L64" href="#L64">64</a> <strong class="jxr_keyword">this</strong>.ctx = ctx;
-<a class="jxr_linenumber" name="L65" href="#L65">65</a> initialDepth = ctx.initialDepth;
-<a class="jxr_linenumber" name="L66" href="#L66">66</a> }
-<a class="jxr_linenumber" name="L67" href="#L67">67</a>
-<a class="jxr_linenumber" name="L68" href="#L68">68</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L69" href="#L69">69</a> <strong class="jxr_keyword">public</strong> <T> Builder apply(Class<T> type, Consumer<T> apply) {
-<a class="jxr_linenumber" name="L70" href="#L70">70</a> <strong class="jxr_keyword">super</strong>.apply(type, apply);
-<a class="jxr_linenumber" name="L71" href="#L71">71</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L72" href="#L72">72</a> }
-<a class="jxr_linenumber" name="L73" href="#L73">73</a>
-<a class="jxr_linenumber" name="L74" href="#L74">74</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L75" href="#L75">75</a> <strong class="jxr_keyword">public</strong> Builder debug(Boolean value) {
-<a class="jxr_linenumber" name="L76" href="#L76">76</a> <strong class="jxr_keyword">super</strong>.debug(value);
-<a class="jxr_linenumber" name="L77" href="#L77">77</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L78" href="#L78">78</a> }
-<a class="jxr_linenumber" name="L79" href="#L79">79</a>
-<a class="jxr_linenumber" name="L80" href="#L80">80</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L81" href="#L81">81</a> <strong class="jxr_keyword">public</strong> Builder locale(Locale value) {
-<a class="jxr_linenumber" name="L82" href="#L82">82</a> <strong class="jxr_keyword">super</strong>.locale(value);
-<a class="jxr_linenumber" name="L83" href="#L83">83</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L84" href="#L84">84</a> }
-<a class="jxr_linenumber" name="L85" href="#L85">85</a>
-<a class="jxr_linenumber" name="L86" href="#L86">86</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L87" href="#L87">87</a> <strong class="jxr_keyword">public</strong> Builder localeDefault(Locale value) {
-<a class="jxr_linenumber" name="L88" href="#L88">88</a> <strong class="jxr_keyword">super</strong>.localeDefault(value);
-<a class="jxr_linenumber" name="L89" href="#L89">89</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L90" href="#L90">90</a> }
-<a class="jxr_linenumber" name="L91" href="#L91">91</a>
-<a class="jxr_linenumber" name="L92" href="#L92">92</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L93" href="#L93">93</a> <strong class="jxr_keyword">public</strong> Builder mediaType(<a name="MediaType" href="../../../org/apache/juneau/MediaType.html#MediaType">MediaType</a> value) {
-<a class="jxr_linenumber" name="L94" href="#L94">94</a> <strong class="jxr_keyword">super</strong>.mediaType(value);
-<a class="jxr_linenumber" name="L95" href="#L95">95</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L96" href="#L96">96</a> }
-<a class="jxr_linenumber" name="L97" href="#L97">97</a>
-<a class="jxr_linenumber" name="L98" href="#L98">98</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L99" href="#L99">99</a> <strong class="jxr_keyword">public</strong> Builder mediaTypeDefault(<a name="MediaType" href="../../../org/apache/juneau/MediaType.html#MediaType">MediaType</a> value) {
-<a class="jxr_linenumber" name="L100" href="#L100">100</a> <strong class="jxr_keyword">super</strong>.mediaTypeDefault(value);
-<a class="jxr_linenumber" name="L101" href="#L101">101</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L102" href="#L102">102</a> }
-<a class="jxr_linenumber" name="L103" href="#L103">103</a>
-<a class="jxr_linenumber" name="L104" href="#L104">104</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L105" href="#L105">105</a> <strong class="jxr_keyword">public</strong> Builder properties(Map<String,Object> value) {
-<a class="jxr_linenumber" name="L106" href="#L106">106</a> <strong class="jxr_keyword">super</strong>.properties(value);
-<a class="jxr_linenumber" name="L107" href="#L107">107</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L108" href="#L108">108</a> }
-<a class="jxr_linenumber" name="L109" href="#L109">109</a>
-<a class="jxr_linenumber" name="L110" href="#L110">110</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L111" href="#L111">111</a> <strong class="jxr_keyword">public</strong> Builder property(String key, Object value) {
-<a class="jxr_linenumber" name="L112" href="#L112">112</a> <strong class="jxr_keyword">super</strong>.property(key, value);
-<a class="jxr_linenumber" name="L113" href="#L113">113</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L114" href="#L114">114</a> }
-<a class="jxr_linenumber" name="L115" href="#L115">115</a>
-<a class="jxr_linenumber" name="L116" href="#L116">116</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L117" href="#L117">117</a> <strong class="jxr_keyword">public</strong> Builder timeZone(TimeZone value) {
-<a class="jxr_linenumber" name="L118" href="#L118">118</a> <strong class="jxr_keyword">super</strong>.timeZone(value);
-<a class="jxr_linenumber" name="L119" href="#L119">119</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L120" href="#L120">120</a> }
-<a class="jxr_linenumber" name="L121" href="#L121">121</a>
-<a class="jxr_linenumber" name="L122" href="#L122">122</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L123" href="#L123">123</a> <strong class="jxr_keyword">public</strong> Builder timeZoneDefault(TimeZone value) {
-<a class="jxr_linenumber" name="L124" href="#L124">124</a> <strong class="jxr_keyword">super</strong>.timeZoneDefault(value);
-<a class="jxr_linenumber" name="L125" href="#L125">125</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L126" href="#L126">126</a> }
-<a class="jxr_linenumber" name="L127" href="#L127">127</a>
-<a class="jxr_linenumber" name="L128" href="#L128">128</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
-<a class="jxr_linenumber" name="L129" href="#L129">129</a> <strong class="jxr_keyword">public</strong> Builder unmodifiable() {
-<a class="jxr_linenumber" name="L130" href="#L130">130</a> <strong class="jxr_keyword">super</strong>.unmodifiable();
-<a class="jxr_linenumber" name="L131" href="#L131">131</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
-<a class="jxr_linenumber" name="L132" href="#L132">132</a> }
-<a class="jxr_linenumber" name="L133" href="#L133">133</a> }
-<a class="jxr_linenumber" name="L134" href="#L134">134</a>
-<a class="jxr_linenumber" name="L135" href="#L135">135</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">class</strong> StackElement {
-<a class="jxr_linenumber" name="L136" href="#L136">136</a> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> depth;
-<a class="jxr_linenumber" name="L137" href="#L137">137</a> <strong class="jxr_keyword">final</strong> String name;
-<a class="jxr_linenumber" name="L138" href="#L138">138</a> <strong class="jxr_keyword">final</strong> Object o;
-<a class="jxr_linenumber" name="L139" href="#L139">139</a> <strong class="jxr_keyword">final</strong> ClassMeta<?> aType;
-<a class="jxr_linenumber" name="L140" href="#L140">140</a>
-<a class="jxr_linenumber" name="L141" href="#L141">141</a> StackElement(<strong class="jxr_keyword">int</strong> depth, String name, Object o, ClassMeta<?> aType) {
-<a class="jxr_linenumber" name="L142" href="#L142">142</a> <strong class="jxr_keyword">this</strong>.depth = depth;
-<a class="jxr_linenumber" name="L143" href="#L143">143</a> <strong class="jxr_keyword">this</strong>.name = name;
-<a class="jxr_linenumber" name="L144" href="#L144">144</a> <strong class="jxr_keyword">this</strong>.o = o;
-<a class="jxr_linenumber" name="L145" href="#L145">145</a> <strong class="jxr_keyword">this</strong>.aType = aType;
-<a class="jxr_linenumber" name="L146" href="#L146">146</a> }
-<a class="jxr_linenumber" name="L147" href="#L147">147</a>
-<a class="jxr_linenumber" name="L148" href="#L148">148</a> String toString(<strong class="jxr_keyword">boolean</strong> simple) {
-<a class="jxr_linenumber" name="L149" href="#L149">149</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder().append('[').append(depth).append(']').append(' ');
-<a class="jxr_linenumber" name="L150" href="#L150">150</a> sb.append(isEmpty(name) ? <span class="jxr_string">"<noname>"</span> : name).append(':');
-<a class="jxr_linenumber" name="L151" href="#L151">151</a> sb.append(aType.toString(simple));
-<a class="jxr_linenumber" name="L152" href="#L152">152</a> <strong class="jxr_keyword">if</strong> (aType != aType.getSerializedClassMeta(BeanTraverseSession.<strong class="jxr_keyword">this</strong>))
-<a class="jxr_linenumber" name="L153" href="#L153">153</a> sb.append('/').append(aType.getSerializedClassMeta(BeanTraverseSession.<strong class="jxr_keyword">this</strong>).toString(simple));
-<a class="jxr_linenumber" name="L154" href="#L154">154</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L155" href="#L155">155</a> }
-<a class="jxr_linenumber" name="L156" href="#L156">156</a> }
-<a class="jxr_linenumber" name="L157" href="#L157">157</a>
-<a class="jxr_linenumber" name="L158" href="#L158">158</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> <a name="BeanTraverseContext" href="../../../org/apache/juneau/BeanTraverseContext.html#BeanTraverseContext">BeanTraverseContext</a> ctx;
-<a class="jxr_linenumber" name="L159" href="#L159">159</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> Map<Object,Object> set; <em class="jxr_comment">// Contains the current objects in the current branch of the model.</em>
-<a class="jxr_linenumber" name="L160" href="#L160">160</a>
-<a class="jxr_linenumber" name="L161" href="#L161">161</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> LinkedList<StackElement> stack = <strong class="jxr_keyword">new</strong> LinkedList<>(); <em class="jxr_comment">// Contains the current objects in the current branch of the model.</em>
-<a class="jxr_linenumber" name="L162" href="#L162">162</a> <em class="jxr_comment">// Writable properties</em>
-<a class="jxr_linenumber" name="L163" href="#L163">163</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">boolean</strong> isBottom; <em class="jxr_comment">// If 'true', then we're at a leaf in the model (i.e. a String, Number, Boolean, or null).</em>
-<a class="jxr_linenumber" name="L164" href="#L164">164</a> <strong class="jxr_keyword">private</strong> BeanPropertyMeta currentProperty;
-<a class="jxr_linenumber" name="L165" href="#L165">165</a>
-<a class="jxr_linenumber" name="L166" href="#L166">166</a> <strong class="jxr_keyword">private</strong> ClassMeta<?> currentClass;
-<a class="jxr_linenumber" name="L167" href="#L167">167</a>
-<a class="jxr_linenumber" name="L168" href="#L168">168</a> <em class="jxr_javadoccomment">/** The current indentation depth into the model. */</em>
-<a class="jxr_linenumber" name="L169" href="#L169">169</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">int</strong> indent;
-<a class="jxr_linenumber" name="L170" href="#L170">170</a>
-<a class="jxr_linenumber" name="L171" href="#L171">171</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">int</strong> depth;
-<a class="jxr_linenumber" name="L172" href="#L172">172</a>
-<a class="jxr_linenumber" name="L173" href="#L173">173</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L174" href="#L174">174</a> <em class="jxr_javadoccomment"> * Constructor.</em>
-<a class="jxr_linenumber" name="L175" href="#L175">175</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L176" href="#L176">176</a> <em class="jxr_javadoccomment"> * @param builder The builder for this object.</em>
-<a class="jxr_linenumber" name="L177" href="#L177">177</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L178" href="#L178">178</a> <strong class="jxr_keyword">protected</strong> <a name="BeanTraverseSession" href="../../../org/apache/juneau/BeanTraverseSession.html#BeanTraverseSession">BeanTraverseSession</a>(Builder builder) {
-<a class="jxr_linenumber" name="L179" href="#L179">179</a> <strong class="jxr_keyword">super</strong>(builder);
-<a class="jxr_linenumber" name="L180" href="#L180">180</a> ctx = builder.ctx;
-<a class="jxr_linenumber" name="L181" href="#L181">181</a> indent = builder.initialDepth;
-<a class="jxr_linenumber" name="L182" href="#L182">182</a> <strong class="jxr_keyword">if</strong> (isDetectRecursions() || isDebug()) {
-<a class="jxr_linenumber" name="L183" href="#L183">183</a> set = <strong class="jxr_keyword">new</strong> IdentityHashMap<>();
-<a class="jxr_linenumber" name="L184" href="#L184">184</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L185" href="#L185">185</a> set = Collections.emptyMap();
-<a class="jxr_linenumber" name="L186" href="#L186">186</a> }
-<a class="jxr_linenumber" name="L187" href="#L187">187</a> }
-<a class="jxr_linenumber" name="L188" href="#L188">188</a>
-<a class="jxr_linenumber" name="L189" href="#L189">189</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L190" href="#L190">190</a> <em class="jxr_javadoccomment"> * Initial depth.</em>
-<a class="jxr_linenumber" name="L191" href="#L191">191</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L192" href="#L192">192</a> <em class="jxr_javadoccomment"> * @see BeanTraverseContext.Builder#initialDepth(int)</em>
-<a class="jxr_linenumber" name="L193" href="#L193">193</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L194" href="#L194">194</a> <em class="jxr_javadoccomment"> * The initial indentation level at the root.</em>
-<a class="jxr_linenumber" name="L195" href="#L195">195</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L196" href="#L196">196</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> getInitialDepth() { <strong class="jxr_keyword">return</strong> ctx.getInitialDepth(); }
-<a class="jxr_linenumber" name="L197" href="#L197">197</a>
-<a class="jxr_linenumber" name="L198" href="#L198">198</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L199" href="#L199">199</a> <em class="jxr_javadoccomment"> * Returns information used to determine at what location in the parse a failure occurred.</em>
-<a class="jxr_linenumber" name="L200" href="#L200">200</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L201" href="#L201">201</a> <em class="jxr_javadoccomment"> * @return A map, typically containing something like <c>{line:123,column:456,currentProperty:"foobar"}</c></em>
-<a class="jxr_linenumber" name="L202" href="#L202">202</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L203" href="#L203">203</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <a name="JsonMap" href="../../../org/apache/juneau/collections/JsonMap.html#JsonMap">JsonMap</a> getLastLocation() {
-<a class="jxr_linenumber" name="L204" href="#L204">204</a> Predicate<Object> nn = Utils::nn;
-<a class="jxr_linenumber" name="L205" href="#L205">205</a> Predicate<Collection<?>> nec = Utils::isNotEmpty;
-<a class="jxr_linenumber" name="L206" href="#L206">206</a> <em class="jxr_comment">// @formatter:off</em>
-<a class="jxr_linenumber" name="L207" href="#L207">207</a> <strong class="jxr_keyword">return</strong> <a name="JsonMap" href="../../../org/apache/juneau/collections/JsonMap.html#JsonMap">JsonMap</a>
-<a class="jxr_linenumber" name="L208" href="#L208">208</a> .create()
-<a class="jxr_linenumber" name="L209" href="#L209">209</a> .appendIf(nn, <span class="jxr_string">"currentClass"</span>, currentClass)
-<a class="jxr_linenumber" name="L210" href="#L210">210</a> .appendIf(nn, <span class="jxr_string">"currentProperty"</span>, currentProperty)
-<a class="jxr_linenumber" name="L211" href="#L211">211</a> .appendIf(nec, <span class="jxr_string">"stack"</span>, stack);
-<a class="jxr_linenumber" name="L212" href="#L212">212</a> <em class="jxr_comment">// @formatter:on</em>
-<a class="jxr_linenumber" name="L213" href="#L213">213</a> }
-<a class="jxr_linenumber" name="L214" href="#L214">214</a>
-<a class="jxr_linenumber" name="L215" href="#L215">215</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L216" href="#L216">216</a> <em class="jxr_javadoccomment"> * Max traversal depth.</em>
-<a class="jxr_linenumber" name="L217" href="#L217">217</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L218" href="#L218">218</a> <em class="jxr_javadoccomment"> * @see BeanTraverseContext.Builder#maxDepth(int)</em>
-<a class="jxr_linenumber" name="L219" href="#L219">219</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L220" href="#L220">220</a> <em class="jxr_javadoccomment"> * The depth at which traversal is aborted if depth is reached in the POJO tree.</em>
-<a class="jxr_linenumber" name="L221" href="#L221">221</a> <em class="jxr_javadoccomment"> * <br>If this depth is exceeded, an exception is thrown.</em>
-<a class="jxr_linenumber" name="L222" href="#L222">222</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L223" href="#L223">223</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> getMaxDepth() { <strong class="jxr_keyword">return</strong> ctx.getMaxDepth(); }
-<a class="jxr_linenumber" name="L224" href="#L224">224</a>
-<a class="jxr_linenumber" name="L225" href="#L225">225</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L226" href="#L226">226</a> <em class="jxr_javadoccomment"> * Automatically detect POJO recursions.</em>
-<a class="jxr_linenumber" name="L227" href="#L227">227</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L228" href="#L228">228</a> <em class="jxr_javadoccomment"> * @see BeanTraverseContext.Builder#detectRecursions()</em>
-<a class="jxr_linenumber" name="L229" href="#L229">229</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L230" href="#L230">230</a> <em class="jxr_javadoccomment"> * <jk>true</jk> if recursions should be checked for during traversal.</em>
-<a class="jxr_linenumber" name="L231" href="#L231">231</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L232" href="#L232">232</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> isDetectRecursions() { <strong class="jxr_keyword">return</strong> ctx.isDetectRecursions(); }
-<a class="jxr_linenumber" name="L233" href="#L233">233</a>
-<a class="jxr_linenumber" name="L234" href="#L234">234</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L235" href="#L235">235</a> <em class="jxr_javadoccomment"> * Ignore recursion errors.</em>
-<a class="jxr_linenumber" name="L236" href="#L236">236</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L237" href="#L237">237</a> <em class="jxr_javadoccomment"> * @see BeanTraverseContext.Builder#ignoreRecursions()</em>
-<a class="jxr_linenumber" name="L238" href="#L238">238</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L239" href="#L239">239</a> <em class="jxr_javadoccomment"> * <jk>true</jk> if when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L240" href="#L240">240</a> <em class="jxr_javadoccomment"> * <br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.</em>
-<a class="jxr_linenumber" name="L241" href="#L241">241</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L242" href="#L242">242</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> isIgnoreRecursions() { <strong class="jxr_keyword">return</strong> ctx.isIgnoreRecursions(); }
-<a class="jxr_linenumber" name="L243" href="#L243">243</a>
-<a class="jxr_linenumber" name="L244" href="#L244">244</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L245" href="#L245">245</a> <em class="jxr_javadoccomment"> * Returns the inner type of an {@link Optional}.</em>
-<a class="jxr_linenumber" name="L246" href="#L246">246</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L247" href="#L247">247</a> <em class="jxr_javadoccomment"> * @param cm The meta to check.</em>
-<a class="jxr_linenumber" name="L248" href="#L248">248</a> <em class="jxr_javadoccomment"> * @return The inner type of an {@link Optional}.</em>
-<a class="jxr_linenumber" name="L249" href="#L249">249</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L250" href="#L250">250</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> ClassMeta<?> getOptionalType(ClassMeta<?> cm) {
-<a class="jxr_linenumber" name="L251" href="#L251">251</a> <strong class="jxr_keyword">if</strong> (cm.isOptional())
-<a class="jxr_linenumber" name="L252" href="#L252">252</a> <strong class="jxr_keyword">return</strong> getOptionalType(cm.getElementType());
-<a class="jxr_linenumber" name="L253" href="#L253">253</a> <strong class="jxr_keyword">return</strong> cm;
-<a class="jxr_linenumber" name="L254" href="#L254">254</a> }
-<a class="jxr_linenumber" name="L255" href="#L255">255</a>
-<a class="jxr_linenumber" name="L256" href="#L256">256</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L257" href="#L257">257</a> <em class="jxr_javadoccomment"> * If the specified object is an {@link Optional}, returns the inner object.</em>
-<a class="jxr_linenumber" name="L258" href="#L258">258</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L259" href="#L259">259</a> <em class="jxr_javadoccomment"> * @param o The object to check.</em>
-<a class="jxr_linenumber" name="L260" href="#L260">260</a> <em class="jxr_javadoccomment"> * @return The inner object if it's an {@link Optional}, <jk>null</jk> if it's <jk>null</jk>, or else the same object.</em>
-<a class="jxr_linenumber" name="L261" href="#L261">261</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L262" href="#L262">262</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> Object getOptionalValue(Object o) {
-<a class="jxr_linenumber" name="L263" href="#L263">263</a> <strong class="jxr_keyword">if</strong> (o == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L264" href="#L264">264</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L265" href="#L265">265</a> <strong class="jxr_keyword">if</strong> (o instanceof Optional<?> o2)
-<a class="jxr_linenumber" name="L266" href="#L266">266</a> <strong class="jxr_keyword">return</strong> getOptionalValue(o2.orElse(<strong class="jxr_keyword">null</strong>));
-<a class="jxr_linenumber" name="L267" href="#L267">267</a> <strong class="jxr_keyword">return</strong> o;
-<a class="jxr_linenumber" name="L268" href="#L268">268</a> }
-<a class="jxr_linenumber" name="L269" href="#L269">269</a>
-<a class="jxr_linenumber" name="L270" href="#L270">270</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L271" href="#L271">271</a> <em class="jxr_javadoccomment"> * Returns the current stack trace.</em>
-<a class="jxr_linenumber" name="L272" href="#L272">272</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L273" href="#L273">273</a> <em class="jxr_javadoccomment"> * @param full</em>
-<a class="jxr_linenumber" name="L274" href="#L274">274</a> <em class="jxr_javadoccomment"> * If <jk>true</jk>, returns a full stack trace.</em>
-<a class="jxr_linenumber" name="L275" href="#L275">275</a> <em class="jxr_javadoccomment"> * @return The current stack trace.</em>
-<a class="jxr_linenumber" name="L276" href="#L276">276</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L277" href="#L277">277</a> <strong class="jxr_keyword">protected</strong> String getStack(<strong class="jxr_keyword">boolean</strong> full) {
-<a class="jxr_linenumber" name="L278" href="#L278">278</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder();
-<a class="jxr_linenumber" name="L279" href="#L279">279</a> stack.forEach(x -> {
-<a class="jxr_linenumber" name="L280" href="#L280">280</a> <strong class="jxr_keyword">if</strong> (full) {
-<a class="jxr_linenumber" name="L281" href="#L281">281</a> sb.append(<span class="jxr_string">"\n\t"</span>);
-<a class="jxr_linenumber" name="L282" href="#L282">282</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 1; i < x.depth; i++)
-<a class="jxr_linenumber" name="L283" href="#L283">283</a> sb.append(<span class="jxr_string">" "</span>);
-<a class="jxr_linenumber" name="L284" href="#L284">284</a> <strong class="jxr_keyword">if</strong> (x.depth > 0)
-<a class="jxr_linenumber" name="L285" href="#L285">285</a> sb.append(<span class="jxr_string">"->"</span>);
-<a class="jxr_linenumber" name="L286" href="#L286">286</a> sb.append(x.toString(false));
-<a class="jxr_linenumber" name="L287" href="#L287">287</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L288" href="#L288">288</a> sb.append(<span class="jxr_string">" > "</span>).append(x.toString(<strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L289" href="#L289">289</a> }
-<a class="jxr_linenumber" name="L290" href="#L290">290</a> });
-<a class="jxr_linenumber" name="L291" href="#L291">291</a> <strong class="jxr_keyword">return</strong> sb.toString();
-<a class="jxr_linenumber" name="L292" href="#L292">292</a> }
-<a class="jxr_linenumber" name="L293" href="#L293">293</a>
-<a class="jxr_linenumber" name="L294" href="#L294">294</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L295" href="#L295">295</a> <em class="jxr_javadoccomment"> * Same as {@link ClassMeta#isOptional()} but gracefully handles a null {@link ClassMeta}.</em>
-<a class="jxr_linenumber" name="L296" href="#L296">296</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L297" href="#L297">297</a> <em class="jxr_javadoccomment"> * @param cm The meta to check.</em>
-<a class="jxr_linenumber" name="L298" href="#L298">298</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if the specified meta is an {@link Optional}.</em>
-<a class="jxr_linenumber" name="L299" href="#L299">299</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L300" href="#L300">300</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">boolean</strong> isOptional(ClassMeta<?> cm) {
-<a class="jxr_linenumber" name="L301" href="#L301">301</a> <strong class="jxr_keyword">return</strong> (nn(cm) && cm.isOptional());
-<a class="jxr_linenumber" name="L302" href="#L302">302</a> }
-<a class="jxr_linenumber" name="L303" href="#L303">303</a>
-<a class="jxr_linenumber" name="L304" href="#L304">304</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L305" href="#L305">305</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if we're processing the root node.</em>
-<a class="jxr_linenumber" name="L306" href="#L306">306</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L307" href="#L307">307</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L308" href="#L308">308</a> <em class="jxr_javadoccomment"> * Must be called after {@link #push(String, Object, ClassMeta)} and before {@link #pop()}.</em>
-<a class="jxr_linenumber" name="L309" href="#L309">309</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L310" href="#L310">310</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if we're processing the root node.</em>
-<a class="jxr_linenumber" name="L311" href="#L311">311</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L312" href="#L312">312</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> isRoot() { <strong class="jxr_keyword">return</strong> depth == 1; }
-<a class="jxr_linenumber" name="L313" href="#L313">313</a>
-<a class="jxr_linenumber" name="L314" href="#L314">314</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L315" href="#L315">315</a> <em class="jxr_javadoccomment"> * Logs a warning message.</em>
-<a class="jxr_linenumber" name="L316" href="#L316">316</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L317" href="#L317">317</a> <em class="jxr_javadoccomment"> * @param t The throwable that was thrown (if there was one).</em>
-<a class="jxr_linenumber" name="L318" href="#L318">318</a> <em class="jxr_javadoccomment"> * @param msg The warning message.</em>
-<a class="jxr_linenumber" name="L319" href="#L319">319</a> <em class="jxr_javadoccomment"> * @param args Optional {@link MessageFormat}-style arguments.</em>
-<a class="jxr_linenumber" name="L320" href="#L320">320</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L321" href="#L321">321</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">void</strong> onError(Throwable t, String msg, Object...args) {
-<a class="jxr_linenumber" name="L322" href="#L322">322</a> <strong class="jxr_keyword">super</strong>.addWarning(msg, args);
-<a class="jxr_linenumber" name="L323" href="#L323">323</a> }
-<a class="jxr_linenumber" name="L324" href="#L324">324</a>
-<a class="jxr_linenumber" name="L325" href="#L325">325</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L326" href="#L326">326</a> <em class="jxr_javadoccomment"> * Pop an object off the stack.</em>
-<a class="jxr_linenumber" name="L327" href="#L327">327</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L328" href="#L328">328</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">void</strong> pop() {
-<a class="jxr_linenumber" name="L329" href="#L329">329</a> indent--;
-<a class="jxr_linenumber" name="L330" href="#L330">330</a> depth--;
-<a class="jxr_linenumber" name="L331" href="#L331">331</a> <strong class="jxr_keyword">if</strong> ((isDetectRecursions() || isDebug()) && ! isBottom) {
-<a class="jxr_linenumber" name="L332" href="#L332">332</a> Object o = stack.removeLast().o;
-<a class="jxr_linenumber" name="L333" href="#L333">333</a> Object o2 = set.remove(o);
-<a class="jxr_linenumber" name="L334" href="#L334">334</a> <strong class="jxr_keyword">if</strong> (o2 == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L335" href="#L335">335</a> onError(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"Couldn't remove object of type ''{0}'' on attribute ''{1}'' from object stack."</span>, cn(o), stack);
-<a class="jxr_linenumber" name="L336" href="#L336">336</a> }
-<a class="jxr_linenumber" name="L337" href="#L337">337</a> isBottom = false;
-<a class="jxr_linenumber" name="L338" href="#L338">338</a> }
-<a class="jxr_linenumber" name="L339" href="#L339">339</a>
-<a class="jxr_linenumber" name="L340" href="#L340">340</a> @Override <em class="jxr_comment">/* Overridden from ContextSession */</em>
-<a class="jxr_linenumber" name="L341" href="#L341">341</a> <strong class="jxr_keyword">protected</strong> <a name="JsonMap" href="../../../org/apache/juneau/collections/JsonMap.html#JsonMap">JsonMap</a> properties() {
-<a class="jxr_linenumber" name="L342" href="#L342">342</a> <strong class="jxr_keyword">return</strong> filteredMap(<span class="jxr_string">"indent"</span>, indent, <span class="jxr_string">"depth"</span>, depth);
-<a class="jxr_linenumber" name="L343" href="#L343">343</a> }
-<a class="jxr_linenumber" name="L344" href="#L344">344</a>
-<a class="jxr_linenumber" name="L345" href="#L345">345</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L346" href="#L346">346</a> <em class="jxr_javadoccomment"> * Push the specified object onto the stack.</em>
-<a class="jxr_linenumber" name="L347" href="#L347">347</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L348" href="#L348">348</a> <em class="jxr_javadoccomment"> * @param attrName The attribute name.</em>
-<a class="jxr_linenumber" name="L349" href="#L349">349</a> <em class="jxr_javadoccomment"> * @param o The current object being traversed.</em>
-<a class="jxr_linenumber" name="L350" href="#L350">350</a> <em class="jxr_javadoccomment"> * @param eType The expected class type.</em>
-<a class="jxr_linenumber" name="L351" href="#L351">351</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L352" href="#L352">352</a> <em class="jxr_javadoccomment"> * The {@link ClassMeta} of the object so that <c>instanceof</c> operations only need to be performed</em>
-<a class="jxr_linenumber" name="L353" href="#L353">353</a> <em class="jxr_javadoccomment"> * once (since they can be expensive).</em>
-<a class="jxr_linenumber" name="L354" href="#L354">354</a> <em class="jxr_javadoccomment"> * @throws BeanRecursionException If recursion occurred.</em>
-<a class="jxr_linenumber" name="L355" href="#L355">355</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L356" href="#L356">356</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> ClassMeta<?> push(String attrName, Object o, ClassMeta<?> eType) <strong class="jxr_keyword">throws</strong> <a name="BeanRecursionException" href="../../../org/apache/juneau/BeanRecursionException.html#BeanRecursionException">BeanRecursionException</a> {
-<a class="jxr_linenumber" name="L357" href="#L357">357</a> indent++;
-<a class="jxr_linenumber" name="L358" href="#L358">358</a> depth++;
-<a class="jxr_linenumber" name="L359" href="#L359">359</a> isBottom = <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="L360" href="#L360">360</a> <strong class="jxr_keyword">if</strong> (o == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L361" href="#L361">361</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L362" href="#L362">362</a> <strong class="jxr_keyword">var</strong> c = o.getClass();
-<a class="jxr_linenumber" name="L363" href="#L363">363</a> <strong class="jxr_keyword">var</strong> cm = (nn(eType) && c == eType.<strong class="jxr_keyword">inner</strong>()) ? eType : ((o instanceof <a name="ClassMeta" href="../../../org/apache/juneau/ClassMeta.html#ClassMeta">ClassMeta</a>) ? (ClassMeta<?>)o : getClassMeta(c));
-<a class="jxr_linenumber" name="L364" href="#L364">364</a> <strong class="jxr_keyword">if</strong> (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
-<a class="jxr_linenumber" name="L365" href="#L365">365</a> <strong class="jxr_keyword">return</strong> cm;
-<a class="jxr_linenumber" name="L366" href="#L366">366</a> <strong class="jxr_keyword">if</strong> (depth > getMaxDepth())
-<a class="jxr_linenumber" name="L367" href="#L367">367</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L368" href="#L368">368</a> <strong class="jxr_keyword">if</strong> (isDetectRecursions() || isDebug()) {
-<a class="jxr_linenumber" name="L369" href="#L369">369</a> <strong class="jxr_keyword">if</strong> (willRecurse(attrName, o, cm))
-<a class="jxr_linenumber" name="L370" href="#L370">370</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L371" href="#L371">371</a> isBottom = false;
-<a class="jxr_linenumber" name="L372" href="#L372">372</a> stack.add(<strong class="jxr_keyword">new</strong> StackElement(stack.size(), attrName, o, cm));
-<a class="jxr_linenumber" name="L373" href="#L373">373</a> set.put(o, o);
-<a class="jxr_linenumber" name="L374" href="#L374">374</a> }
-<a class="jxr_linenumber" name="L375" href="#L375">375</a> <strong class="jxr_keyword">return</strong> cm;
-<a class="jxr_linenumber" name="L376" href="#L376">376</a> }
-<a class="jxr_linenumber" name="L377" href="#L377">377</a>
-<a class="jxr_linenumber" name="L378" href="#L378">378</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L379" href="#L379">379</a> <em class="jxr_javadoccomment"> * Sets the current class being traversed for proper error messages.</em>
-<a class="jxr_linenumber" name="L380" href="#L380">380</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L381" href="#L381">381</a> <em class="jxr_javadoccomment"> * @param currentClass The current class being traversed.</em>
-<a class="jxr_linenumber" name="L382" href="#L382">382</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L383" href="#L383">383</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">void</strong> setCurrentClass(ClassMeta<?> currentClass) { <strong class="jxr_keyword">this</strong>.currentClass = currentClass; }
-<a class="jxr_linenumber" name="L384" href="#L384">384</a>
-<a class="jxr_linenumber" name="L385" href="#L385">385</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L386" href="#L386">386</a> <em class="jxr_javadoccomment"> * Sets the current bean property being traversed for proper error messages.</em>
-<a class="jxr_linenumber" name="L387" href="#L387">387</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L388" href="#L388">388</a> <em class="jxr_javadoccomment"> * @param currentProperty The current property being traversed.</em>
-<a class="jxr_linenumber" name="L389" href="#L389">389</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L390" href="#L390">390</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">void</strong> setCurrentProperty(BeanPropertyMeta currentProperty) { <strong class="jxr_keyword">this</strong>.currentProperty = currentProperty; }
-<a class="jxr_linenumber" name="L391" href="#L391">391</a>
-<a class="jxr_linenumber" name="L392" href="#L392">392</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L393" href="#L393">393</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if we're about to exceed the max depth for the document.</em>
-<a class="jxr_linenumber" name="L394" href="#L394">394</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L395" href="#L395">395</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if we're about to exceed the max depth for the document.</em>
-<a class="jxr_linenumber" name="L396" href="#L396">396</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L397" href="#L397">397</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> willExceedDepth() {
-<a class="jxr_linenumber" name="L398" href="#L398">398</a> <strong class="jxr_keyword">return</strong> (depth >= getMaxDepth());
-<a class="jxr_linenumber" name="L399" href="#L399">399</a> }
-<a class="jxr_linenumber" name="L400" href="#L400">400</a>
-<a class="jxr_linenumber" name="L401" href="#L401">401</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L402" href="#L402">402</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if {@link BeanTraverseContext.Builder#detectRecursions()} is enabled, and the specified</em>
-<a class="jxr_linenumber" name="L403" href="#L403">403</a> <em class="jxr_javadoccomment"> * object is already higher up in the traversal chain.</em>
-<a class="jxr_linenumber" name="L404" href="#L404">404</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L405" href="#L405">405</a> <em class="jxr_javadoccomment"> * @param attrName The bean property attribute name, or some other identifier.</em>
-<a class="jxr_linenumber" name="L406" href="#L406">406</a> <em class="jxr_javadoccomment"> * @param o The object to check for recursion.</em>
-<a class="jxr_linenumber" name="L407" href="#L407">407</a> <em class="jxr_javadoccomment"> * @param cm The metadata on the object class.</em>
-<a class="jxr_linenumber" name="L408" href="#L408">408</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if recursion detected.</em>
-<a class="jxr_linenumber" name="L409" href="#L409">409</a> <em class="jxr_javadoccomment"> * @throws BeanRecursionException If recursion occurred.</em>
-<a class="jxr_linenumber" name="L410" href="#L410">410</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L411" href="#L411">411</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> willRecurse(String attrName, Object o, ClassMeta<?> cm) <strong class="jxr_keyword">throws</strong> <a name="BeanRecursionException" href="../../../org/apache/juneau/BeanRecursionException.html#BeanRecursionException">BeanRecursionException</a> {
-<a class="jxr_linenumber" name="L412" href="#L412">412</a> <strong class="jxr_keyword">if</strong> (! (isDetectRecursions() || isDebug()) || ! set.containsKey(o))
-<a class="jxr_linenumber" name="L413" href="#L413">413</a> <strong class="jxr_keyword">return</strong> false;
-<a class="jxr_linenumber" name="L414" href="#L414">414</a> <strong class="jxr_keyword">if</strong> (isIgnoreRecursions() && ! isDebug())
-<a class="jxr_linenumber" name="L415" href="#L415">415</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="L416" href="#L416">416</a>
-<a class="jxr_linenumber" name="L417" href="#L417">417</a> stack.add(<strong class="jxr_keyword">new</strong> StackElement(stack.size(), attrName, o, cm));
-<a class="jxr_linenumber" name="L418" href="#L418">418</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> <a name="BeanRecursionException" href="../../../org/apache/juneau/BeanRecursionException.html#BeanRecursionException">BeanRecursionException</a>(<span class="jxr_string">"Recursion occurred, stack={0}"</span>, getStack(<strong class="jxr_keyword">true</strong>));
-<a class="jxr_linenumber" name="L419" href="#L419">419</a> }
-<a class="jxr_linenumber" name="L420" href="#L420">420</a> }
+<a class="jxr_linenumber" name="L20" href="#L20">20</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.CollectionUtils.*;
+<a class="jxr_linenumber" name="L21" href="#L21">21</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.Utils.*;
+<a class="jxr_linenumber" name="L22" href="#L22">22</a>
+<a class="jxr_linenumber" name="L23" href="#L23">23</a> <strong class="jxr_keyword">import</strong> java.text.*;
+<a class="jxr_linenumber" name="L24" href="#L24">24</a> <strong class="jxr_keyword">import</strong> java.util.*;
+<a class="jxr_linenumber" name="L25" href="#L25">25</a> <strong class="jxr_keyword">import</strong> java.util.function.*;
+<a class="jxr_linenumber" name="L26" href="#L26">26</a>
+<a class="jxr_linenumber" name="L27" href="#L27">27</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.collections.*;
+<a class="jxr_linenumber" name="L28" href="#L28">28</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.commons.utils.*;
+<a class="jxr_linenumber" name="L29" href="#L29">29</a>
+<a class="jxr_linenumber" name="L30" href="#L30">30</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L31" href="#L31">31</a> <em class="jxr_javadoccomment"> * ContextSession that lives for the duration of a single use of {@link BeanTraverseContext}.</em>
+<a class="jxr_linenumber" name="L32" href="#L32">32</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L33" href="#L33">33</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L34" href="#L34">34</a> <em class="jxr_javadoccomment"> * Used by serializers and other classes that traverse POJOs for the following purposes:</em>
+<a class="jxr_linenumber" name="L35" href="#L35">35</a> <em class="jxr_javadoccomment"> * <ul class='spaced-list'></em>
+<a class="jxr_linenumber" name="L36" href="#L36">36</a> <em class="jxr_javadoccomment"> * <li></em>
+<a class="jxr_linenumber" name="L37" href="#L37">37</a> <em class="jxr_javadoccomment"> * Keeping track of how deep it is in a model for indentation purposes.</em>
+<a class="jxr_linenumber" name="L38" href="#L38">38</a> <em class="jxr_javadoccomment"> * <li></em>
+<a class="jxr_linenumber" name="L39" href="#L39">39</a> <em class="jxr_javadoccomment"> * Ensuring infinite loops don't occur by setting a limit on how deep to traverse a model.</em>
+<a class="jxr_linenumber" name="L40" href="#L40">40</a> <em class="jxr_javadoccomment"> * <li></em>
+<a class="jxr_linenumber" name="L41" href="#L41">41</a> <em class="jxr_javadoccomment"> * Ensuring infinite loops don't occur from loops in the model (when detectRecursions is enabled.</em>
+<a class="jxr_linenumber" name="L42" href="#L42">42</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L43" href="#L43">43</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L44" href="#L44">44</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Notes:</h5><ul></em>
+<a class="jxr_linenumber" name="L45" href="#L45">45</a> <em class="jxr_javadoccomment"> * <li class='warn'>This class is not thread safe and is typically discarded after one use.</em>
+<a class="jxr_linenumber" name="L46" href="#L46">46</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L47" href="#L47">47</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L48" href="#L48">48</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L49" href="#L49">49</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a name="BeanTraverseSession" href="../../../org/apache/juneau/BeanTraverseSession.html#BeanTraverseSession">BeanTraverseSession</a> <strong class="jxr_keyword">extends</strong> BeanSession {
+<a class="jxr_linenumber" name="L50" href="#L50">50</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L51" href="#L51">51</a> <em class="jxr_javadoccomment"> * Builder class.</em>
+<a class="jxr_linenumber" name="L52" href="#L52">52</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L53" href="#L53">53</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">abstract</strong> <strong class="jxr_keyword">class</strong> Builder <strong class="jxr_keyword">extends</strong> BeanSession.Builder {
+<a class="jxr_linenumber" name="L54" href="#L54">54</a>
+<a class="jxr_linenumber" name="L55" href="#L55">55</a> BeanTraverseContext ctx;
+<a class="jxr_linenumber" name="L56" href="#L56">56</a> <strong class="jxr_keyword">int</strong> initialDepth;
+<a class="jxr_linenumber" name="L57" href="#L57">57</a>
+<a class="jxr_linenumber" name="L58" href="#L58">58</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L59" href="#L59">59</a> <em class="jxr_javadoccomment"> * Constructor</em>
+<a class="jxr_linenumber" name="L60" href="#L60">60</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L61" href="#L61">61</a> <em class="jxr_javadoccomment"> * @param ctx The context creating this session.</em>
+<a class="jxr_linenumber" name="L62" href="#L62">62</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L63" href="#L63">63</a> <strong class="jxr_keyword">protected</strong> Builder(<a name="BeanTraverseContext" href="../../../org/apache/juneau/BeanTraverseContext.html#BeanTraverseContext">BeanTraverseContext</a> ctx) {
+<a class="jxr_linenumber" name="L64" href="#L64">64</a> <strong class="jxr_keyword">super</strong>(ctx.getBeanContext());
+<a class="jxr_linenumber" name="L65" href="#L65">65</a> <strong class="jxr_keyword">this</strong>.ctx = ctx;
+<a class="jxr_linenumber" name="L66" href="#L66">66</a> initialDepth = ctx.initialDepth;
+<a class="jxr_linenumber" name="L67" href="#L67">67</a> }
+<a class="jxr_linenumber" name="L68" href="#L68">68</a>
+<a class="jxr_linenumber" name="L69" href="#L69">69</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L70" href="#L70">70</a> <strong class="jxr_keyword">public</strong> <T> Builder apply(Class<T> type, Consumer<T> apply) {
+<a class="jxr_linenumber" name="L71" href="#L71">71</a> <strong class="jxr_keyword">super</strong>.apply(type, apply);
+<a class="jxr_linenumber" name="L72" href="#L72">72</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L73" href="#L73">73</a> }
+<a class="jxr_linenumber" name="L74" href="#L74">74</a>
+<a class="jxr_linenumber" name="L75" href="#L75">75</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L76" href="#L76">76</a> <strong class="jxr_keyword">public</strong> Builder debug(Boolean value) {
+<a class="jxr_linenumber" name="L77" href="#L77">77</a> <strong class="jxr_keyword">super</strong>.debug(value);
+<a class="jxr_linenumber" name="L78" href="#L78">78</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L79" href="#L79">79</a> }
+<a class="jxr_linenumber" name="L80" href="#L80">80</a>
+<a class="jxr_linenumber" name="L81" href="#L81">81</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L82" href="#L82">82</a> <strong class="jxr_keyword">public</strong> Builder locale(Locale value) {
+<a class="jxr_linenumber" name="L83" href="#L83">83</a> <strong class="jxr_keyword">super</strong>.locale(value);
+<a class="jxr_linenumber" name="L84" href="#L84">84</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L85" href="#L85">85</a> }
+<a class="jxr_linenumber" name="L86" href="#L86">86</a>
+<a class="jxr_linenumber" name="L87" href="#L87">87</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L88" href="#L88">88</a> <strong class="jxr_keyword">public</strong> Builder localeDefault(Locale value) {
+<a class="jxr_linenumber" name="L89" href="#L89">89</a> <strong class="jxr_keyword">super</strong>.localeDefault(value);
+<a class="jxr_linenumber" name="L90" href="#L90">90</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L91" href="#L91">91</a> }
+<a class="jxr_linenumber" name="L92" href="#L92">92</a>
+<a class="jxr_linenumber" name="L93" href="#L93">93</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L94" href="#L94">94</a> <strong class="jxr_keyword">public</strong> Builder mediaType(<a name="MediaType" href="../../../org/apache/juneau/MediaType.html#MediaType">MediaType</a> value) {
+<a class="jxr_linenumber" name="L95" href="#L95">95</a> <strong class="jxr_keyword">super</strong>.mediaType(value);
+<a class="jxr_linenumber" name="L96" href="#L96">96</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L97" href="#L97">97</a> }
+<a class="jxr_linenumber" name="L98" href="#L98">98</a>
+<a class="jxr_linenumber" name="L99" href="#L99">99</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L100" href="#L100">100</a> <strong class="jxr_keyword">public</strong> Builder mediaTypeDefault(<a name="MediaType" href="../../../org/apache/juneau/MediaType.html#MediaType">MediaType</a> value) {
+<a class="jxr_linenumber" name="L101" href="#L101">101</a> <strong class="jxr_keyword">super</strong>.mediaTypeDefault(value);
+<a class="jxr_linenumber" name="L102" href="#L102">102</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L103" href="#L103">103</a> }
+<a class="jxr_linenumber" name="L104" href="#L104">104</a>
+<a class="jxr_linenumber" name="L105" href="#L105">105</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L106" href="#L106">106</a> <strong class="jxr_keyword">public</strong> Builder properties(Map<String,Object> value) {
+<a class="jxr_linenumber" name="L107" href="#L107">107</a> <strong class="jxr_keyword">super</strong>.properties(value);
+<a class="jxr_linenumber" name="L108" href="#L108">108</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L109" href="#L109">109</a> }
+<a class="jxr_linenumber" name="L110" href="#L110">110</a>
+<a class="jxr_linenumber" name="L111" href="#L111">111</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L112" href="#L112">112</a> <strong class="jxr_keyword">public</strong> Builder property(String key, Object value) {
+<a class="jxr_linenumber" name="L113" href="#L113">113</a> <strong class="jxr_keyword">super</strong>.property(key, value);
+<a class="jxr_linenumber" name="L114" href="#L114">114</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L115" href="#L115">115</a> }
+<a class="jxr_linenumber" name="L116" href="#L116">116</a>
+<a class="jxr_linenumber" name="L117" href="#L117">117</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L118" href="#L118">118</a> <strong class="jxr_keyword">public</strong> Builder timeZone(TimeZone value) {
+<a class="jxr_linenumber" name="L119" href="#L119">119</a> <strong class="jxr_keyword">super</strong>.timeZone(value);
+<a class="jxr_linenumber" name="L120" href="#L120">120</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L121" href="#L121">121</a> }
+<a class="jxr_linenumber" name="L122" href="#L122">122</a>
+<a class="jxr_linenumber" name="L123" href="#L123">123</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L124" href="#L124">124</a> <strong class="jxr_keyword">public</strong> Builder timeZoneDefault(TimeZone value) {
+<a class="jxr_linenumber" name="L125" href="#L125">125</a> <strong class="jxr_keyword">super</strong>.timeZoneDefault(value);
+<a class="jxr_linenumber" name="L126" href="#L126">126</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L127" href="#L127">127</a> }
+<a class="jxr_linenumber" name="L128" href="#L128">128</a>
+<a class="jxr_linenumber" name="L129" href="#L129">129</a> @Override <em class="jxr_comment">/* Overridden from Builder */</em>
+<a class="jxr_linenumber" name="L130" href="#L130">130</a> <strong class="jxr_keyword">public</strong> Builder unmodifiable() {
+<a class="jxr_linenumber" name="L131" href="#L131">131</a> <strong class="jxr_keyword">super</strong>.unmodifiable();
+<a class="jxr_linenumber" name="L132" href="#L132">132</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">this</strong>;
+<a class="jxr_linenumber" name="L133" href="#L133">133</a> }
+<a class="jxr_linenumber" name="L134" href="#L134">134</a> }
+<a class="jxr_linenumber" name="L135" href="#L135">135</a>
+<a class="jxr_linenumber" name="L136" href="#L136">136</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">class</strong> StackElement {
+<a class="jxr_linenumber" name="L137" href="#L137">137</a> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> depth;
+<a class="jxr_linenumber" name="L138" href="#L138">138</a> <strong class="jxr_keyword">final</strong> String name;
+<a class="jxr_linenumber" name="L139" href="#L139">139</a> <strong class="jxr_keyword">final</strong> Object o;
+<a class="jxr_linenumber" name="L140" href="#L140">140</a> <strong class="jxr_keyword">final</strong> ClassMeta<?> aType;
+<a class="jxr_linenumber" name="L141" href="#L141">141</a>
+<a class="jxr_linenumber" name="L142" href="#L142">142</a> StackElement(<strong class="jxr_keyword">int</strong> depth, String name, Object o, ClassMeta<?> aType) {
+<a class="jxr_linenumber" name="L143" href="#L143">143</a> <strong class="jxr_keyword">this</strong>.depth = depth;
+<a class="jxr_linenumber" name="L144" href="#L144">144</a> <strong class="jxr_keyword">this</strong>.name = name;
+<a class="jxr_linenumber" name="L145" href="#L145">145</a> <strong class="jxr_keyword">this</strong>.o = o;
+<a class="jxr_linenumber" name="L146" href="#L146">146</a> <strong class="jxr_keyword">this</strong>.aType = aType;
+<a class="jxr_linenumber" name="L147" href="#L147">147</a> }
+<a class="jxr_linenumber" name="L148" href="#L148">148</a>
+<a class="jxr_linenumber" name="L149" href="#L149">149</a> String toString(<strong class="jxr_keyword">boolean</strong> simple) {
+<a class="jxr_linenumber" name="L150" href="#L150">150</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder().append('[').append(depth).append(']').append(' ');
+<a class="jxr_linenumber" name="L151" href="#L151">151</a> sb.append(isEmpty(name) ? <span class="jxr_string">"<noname>"</span> : name).append(':');
+<a class="jxr_linenumber" name="L152" href="#L152">152</a> sb.append(aType.toString(simple));
+<a class="jxr_linenumber" name="L153" href="#L153">153</a> <strong class="jxr_keyword">if</strong> (aType != aType.getSerializedClassMeta(BeanTraverseSession.<strong class="jxr_keyword">this</strong>))
+<a class="jxr_linenumber" name="L154" href="#L154">154</a> sb.append('/').append(aType.getSerializedClassMeta(BeanTraverseSession.<strong class="jxr_keyword">this</strong>).toString(simple));
+<a class="jxr_linenumber" name="L155" href="#L155">155</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L156" href="#L156">156</a> }
+<a class="jxr_linenumber" name="L157" href="#L157">157</a> }
+<a class="jxr_linenumber" name="L158" href="#L158">158</a>
+<a class="jxr_linenumber" name="L159" href="#L159">159</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> <a name="BeanTraverseContext" href="../../../org/apache/juneau/BeanTraverseContext.html#BeanTraverseContext">BeanTraverseContext</a> ctx;
+<a class="jxr_linenumber" name="L160" href="#L160">160</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> Map<Object,Object> set; <em class="jxr_comment">// Contains the current objects in the current branch of the model.</em>
+<a class="jxr_linenumber" name="L161" href="#L161">161</a>
+<a class="jxr_linenumber" name="L162" href="#L162">162</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> LinkedList<StackElement> stack = <strong class="jxr_keyword">new</strong> LinkedList<>(); <em class="jxr_comment">// Contains the current objects in the current branch of the model.</em>
+<a class="jxr_linenumber" name="L163" href="#L163">163</a> <em class="jxr_comment">// Writable properties</em>
+<a class="jxr_linenumber" name="L164" href="#L164">164</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">boolean</strong> isBottom; <em class="jxr_comment">// If 'true', then we're at a leaf in the model (i.e. a String, Number, Boolean, or null).</em>
+<a class="jxr_linenumber" name="L165" href="#L165">165</a> <strong class="jxr_keyword">private</strong> BeanPropertyMeta currentProperty;
+<a class="jxr_linenumber" name="L166" href="#L166">166</a>
+<a class="jxr_linenumber" name="L167" href="#L167">167</a> <strong class="jxr_keyword">private</strong> ClassMeta<?> currentClass;
+<a class="jxr_linenumber" name="L168" href="#L168">168</a>
+<a class="jxr_linenumber" name="L169" href="#L169">169</a> <em class="jxr_javadoccomment">/** The current indentation depth into the model. */</em>
+<a class="jxr_linenumber" name="L170" href="#L170">170</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">int</strong> indent;
+<a class="jxr_linenumber" name="L171" href="#L171">171</a>
+<a class="jxr_linenumber" name="L172" href="#L172">172</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">int</strong> depth;
+<a class="jxr_linenumber" name="L173" href="#L173">173</a>
+<a class="jxr_linenumber" name="L174" href="#L174">174</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L175" href="#L175">175</a> <em class="jxr_javadoccomment"> * Constructor.</em>
+<a class="jxr_linenumber" name="L176" href="#L176">176</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L177" href="#L177">177</a> <em class="jxr_javadoccomment"> * @param builder The builder for this object.</em>
+<a class="jxr_linenumber" name="L178" href="#L178">178</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L179" href="#L179">179</a> <strong class="jxr_keyword">protected</strong> <a name="BeanTraverseSession" href="../../../org/apache/juneau/BeanTraverseSession.html#BeanTraverseSession">BeanTraverseSession</a>(Builder builder) {
+<a class="jxr_linenumber" name="L180" href="#L180">180</a> <strong class="jxr_keyword">super</strong>(builder);
+<a class="jxr_linenumber" name="L181" href="#L181">181</a> ctx = builder.ctx;
+<a class="jxr_linenumber" name="L182" href="#L182">182</a> indent = builder.initialDepth;
+<a class="jxr_linenumber" name="L183" href="#L183">183</a> <strong class="jxr_keyword">if</strong> (isDetectRecursions() || isDebug()) {
+<a class="jxr_linenumber" name="L184" href="#L184">184</a> set = <strong class="jxr_keyword">new</strong> IdentityHashMap<>();
+<a class="jxr_linenumber" name="L185" href="#L185">185</a> } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="L186" href="#L186">186</a> set = mape();
+<a class="jxr_linenumber" name="L187" href="#L187">187</a> }
+<a class="jxr_linenumber" name="L188" href="#L188">188</a> }
+<a class="jxr_linenumber" name="L189" href="#L189">189</a>
+<a class="jxr_linenumber" name="L190" href="#L190">190</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L191" href="#L191">191</a> <em class="jxr_javadoccomment"> * Initial depth.</em>
+<a class="jxr_linenumber" name="L192" href="#L192">192</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L193" href="#L193">193</a> <em class="jxr_javadoccomment"> * @see BeanTraverseContext.Builder#initialDepth(int)</em>
+<a class="jxr_linenumber" name="L194" href="#L194">194</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L195" href="#L195">195</a> <em class="jxr_javadoccomment"> * The initial indentation level at the root.</em>
+<a class="jxr_linenumber" name="L196" href="#L196">196</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L197" href="#L197">197</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> getInitialDepth() { <strong class="jxr_keyword">return</strong> ctx.getInitialDepth(); }
+<a class="jxr_linenumber" name="L198" href="#L198">198</a>
+<a class="jxr_linenumber" name="L199" href="#L199">199</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L200" href="#L200">200</a> <em class="jxr_javadoccomment"> * Returns information used to determine at what location in the parse a failure occurred.</em>
+<a class="jxr_linenumber" name="L201" href="#L201">201</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L202" href="#L202">202</a> <em class="jxr_javadoccomment"> * @return A map, typically containing something like <c>{line:123,column:456,currentProperty:"foobar"}</c></em>
+<a class="jxr_linenumber" name="L203" href="#L203">203</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L204" href="#L204">204</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <a name="JsonMap" href="../../../org/apache/juneau/collections/JsonMap.html#JsonMap">JsonMap</a> getLastLocation() {
+<a class="jxr_linenumber" name="L205" href="#L205">205</a> Predicate<Object> nn = Utils::nn;
+<a class="jxr_linenumber" name="L206" href="#L206">206</a> Predicate<Collection<?>> nec = Utils::isNotEmpty;
+<a class="jxr_linenumber" name="L207" href="#L207">207</a> <em class="jxr_comment">// @formatter:off</em>
+<a class="jxr_linenumber" name="L208" href="#L208">208</a> <strong class="jxr_keyword">return</strong> <a name="JsonMap" href="../../../org/apache/juneau/collections/JsonMap.html#JsonMap">JsonMap</a>
+<a class="jxr_linenumber" name="L209" href="#L209">209</a> .create()
+<a class="jxr_linenumber" name="L210" href="#L210">210</a> .appendIf(nn, <span class="jxr_string">"currentClass"</span>, currentClass)
+<a class="jxr_linenumber" name="L211" href="#L211">211</a> .appendIf(nn, <span class="jxr_string">"currentProperty"</span>, currentProperty)
+<a class="jxr_linenumber" name="L212" href="#L212">212</a> .appendIf(nec, <span class="jxr_string">"stack"</span>, stack);
+<a class="jxr_linenumber" name="L213" href="#L213">213</a> <em class="jxr_comment">// @formatter:on</em>
+<a class="jxr_linenumber" name="L214" href="#L214">214</a> }
+<a class="jxr_linenumber" name="L215" href="#L215">215</a>
+<a class="jxr_linenumber" name="L216" href="#L216">216</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L217" href="#L217">217</a> <em class="jxr_javadoccomment"> * Max traversal depth.</em>
+<a class="jxr_linenumber" name="L218" href="#L218">218</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L219" href="#L219">219</a> <em class="jxr_javadoccomment"> * @see BeanTraverseContext.Builder#maxDepth(int)</em>
+<a class="jxr_linenumber" name="L220" href="#L220">220</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L221" href="#L221">221</a> <em class="jxr_javadoccomment"> * The depth at which traversal is aborted if depth is reached in the POJO tree.</em>
+<a class="jxr_linenumber" name="L222" href="#L222">222</a> <em class="jxr_javadoccomment"> * <br>If this depth is exceeded, an exception is thrown.</em>
+<a class="jxr_linenumber" name="L223" href="#L223">223</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L224" href="#L224">224</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> getMaxDepth() { <strong class="jxr_keyword">return</strong> ctx.getMaxDepth(); }
+<a class="jxr_linenumber" name="L225" href="#L225">225</a>
+<a class="jxr_linenumber" name="L226" href="#L226">226</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L227" href="#L227">227</a> <em class="jxr_javadoccomment"> * Automatically detect POJO recursions.</em>
+<a class="jxr_linenumber" name="L228" href="#L228">228</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L229" href="#L229">229</a> <em class="jxr_javadoccomment"> * @see BeanTraverseContext.Builder#detectRecursions()</em>
+<a class="jxr_linenumber" name="L230" href="#L230">230</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L231" href="#L231">231</a> <em class="jxr_javadoccomment"> * <jk>true</jk> if recursions should be checked for during traversal.</em>
+<a class="jxr_linenumber" name="L232" href="#L232">232</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L233" href="#L233">233</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> isDetectRecursions() { <strong class="jxr_keyword">return</strong> ctx.isDetectRecursions(); }
+<a class="jxr_linenumber" name="L234" href="#L234">234</a>
+<a class="jxr_linenumber" name="L235" href="#L235">235</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L236" href="#L236">236</a> <em class="jxr_javadoccomment"> * Ignore recursion errors.</em>
+<a class="jxr_linenumber" name="L237" href="#L237">237</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L238" href="#L238">238</a> <em class="jxr_javadoccomment"> * @see BeanTraverseContext.Builder#ignoreRecursions()</em>
+<a class="jxr_linenumber" name="L239" href="#L239">239</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L240" href="#L240">240</a> <em class="jxr_javadoccomment"> * <jk>true</jk> if when we encounter the same object when traversing a tree, we set the value to <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L241" href="#L241">241</a> <em class="jxr_javadoccomment"> * <br>Otherwise, a {@link BeanRecursionException} is thrown with the message <js>"Recursion occurred, stack=..."</js>.</em>
+<a class="jxr_linenumber" name="L242" href="#L242">242</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L243" href="#L243">243</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> isIgnoreRecursions() { <strong class="jxr_keyword">return</strong> ctx.isIgnoreRecursions(); }
+<a class="jxr_linenumber" name="L244" href="#L244">244</a>
+<a class="jxr_linenumber" name="L245" href="#L245">245</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L246" href="#L246">246</a> <em class="jxr_javadoccomment"> * Returns the inner type of an {@link Optional}.</em>
+<a class="jxr_linenumber" name="L247" href="#L247">247</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L248" href="#L248">248</a> <em class="jxr_javadoccomment"> * @param cm The meta to check.</em>
+<a class="jxr_linenumber" name="L249" href="#L249">249</a> <em class="jxr_javadoccomment"> * @return The inner type of an {@link Optional}.</em>
+<a class="jxr_linenumber" name="L250" href="#L250">250</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L251" href="#L251">251</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> ClassMeta<?> getOptionalType(ClassMeta<?> cm) {
+<a class="jxr_linenumber" name="L252" href="#L252">252</a> <strong class="jxr_keyword">if</strong> (cm.isOptional())
+<a class="jxr_linenumber" name="L253" href="#L253">253</a> <strong class="jxr_keyword">return</strong> getOptionalType(cm.getElementType());
+<a class="jxr_linenumber" name="L254" href="#L254">254</a> <strong class="jxr_keyword">return</strong> cm;
+<a class="jxr_linenumber" name="L255" href="#L255">255</a> }
+<a class="jxr_linenumber" name="L256" href="#L256">256</a>
+<a class="jxr_linenumber" name="L257" href="#L257">257</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L258" href="#L258">258</a> <em class="jxr_javadoccomment"> * If the specified object is an {@link Optional}, returns the inner object.</em>
+<a class="jxr_linenumber" name="L259" href="#L259">259</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L260" href="#L260">260</a> <em class="jxr_javadoccomment"> * @param o The object to check.</em>
+<a class="jxr_linenumber" name="L261" href="#L261">261</a> <em class="jxr_javadoccomment"> * @return The inner object if it's an {@link Optional}, <jk>null</jk> if it's <jk>null</jk>, or else the same object.</em>
+<a class="jxr_linenumber" name="L262" href="#L262">262</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L263" href="#L263">263</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> Object getOptionalValue(Object o) {
+<a class="jxr_linenumber" name="L264" href="#L264">264</a> <strong class="jxr_keyword">if</strong> (o == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L265" href="#L265">265</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L266" href="#L266">266</a> <strong class="jxr_keyword">if</strong> (o instanceof Optional<?> o2)
+<a class="jxr_linenumber" name="L267" href="#L267">267</a> <strong class="jxr_keyword">return</strong> getOptionalValue(o2.orElse(<strong class="jxr_keyword">null</strong>));
+<a class="jxr_linenumber" name="L268" href="#L268">268</a> <strong class="jxr_keyword">return</strong> o;
+<a class="jxr_linenumber" name="L269" href="#L269">269</a> }
+<a class="jxr_linenumber" name="L270" href="#L270">270</a>
+<a class="jxr_linenumber" name="L271" href="#L271">271</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L272" href="#L272">272</a> <em class="jxr_javadoccomment"> * Returns the current stack trace.</em>
+<a class="jxr_linenumber" name="L273" href="#L273">273</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L274" href="#L274">274</a> <em class="jxr_javadoccomment"> * @param full</em>
+<a class="jxr_linenumber" name="L275" href="#L275">275</a> <em class="jxr_javadoccomment"> * If <jk>true</jk>, returns a full stack trace.</em>
+<a class="jxr_linenumber" name="L276" href="#L276">276</a> <em class="jxr_javadoccomment"> * @return The current stack trace.</em>
+<a class="jxr_linenumber" name="L277" href="#L277">277</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L278" href="#L278">278</a> <strong class="jxr_keyword">protected</strong> String getStack(<strong class="jxr_keyword">boolean</strong> full) {
+<a class="jxr_linenumber" name="L279" href="#L279">279</a> <strong class="jxr_keyword">var</strong> sb = <strong class="jxr_keyword">new</strong> StringBuilder();
+<a class="jxr_linenumber" name="L280" href="#L280">280</a> stack.forEach(x -> {
+<a class="jxr_linenumber" name="L281" href="#L281">281</a> <strong class="jxr_keyword">if</strong> (full) {
+<a class="jxr_linenumber" name="L282" href="#L282">282</a> sb.append(<span class="jxr_string">"\n\t"</span>);
+<a class="jxr_linenumber" name="L283" href="#L283">283</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 1; i < x.depth; i++)
+<a class="jxr_linenumber" name="L284" href="#L284">284</a> sb.append(<span class="jxr_string">" "</span>);
+<a class="jxr_linenumber" name="L285" href="#L285">285</a> <strong class="jxr_keyword">if</strong> (x.depth > 0)
+<a class="jxr_linenumber" name="L286" href="#L286">286</a> sb.append(<span class="jxr_string">"->"</span>);
+<a class="jxr_linenumber" name="L287" href="#L287">287</a> sb.append(x.toString(false));
+<a class="jxr_linenumber" name="L288" href="#L288">288</a> } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="L289" href="#L289">289</a> sb.append(<span class="jxr_string">" > "</span>).append(x.toString(<strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L290" href="#L290">290</a> }
+<a class="jxr_linenumber" name="L291" href="#L291">291</a> });
+<a class="jxr_linenumber" name="L292" href="#L292">292</a> <strong class="jxr_keyword">return</strong> sb.toString();
+<a class="jxr_linenumber" name="L293" href="#L293">293</a> }
+<a class="jxr_linenumber" name="L294" href="#L294">294</a>
+<a class="jxr_linenumber" name="L295" href="#L295">295</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L296" href="#L296">296</a> <em class="jxr_javadoccomment"> * Same as {@link ClassMeta#isOptional()} but gracefully handles a null {@link ClassMeta}.</em>
+<a class="jxr_linenumber" name="L297" href="#L297">297</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L298" href="#L298">298</a> <em class="jxr_javadoccomment"> * @param cm The meta to check.</em>
+<a class="jxr_linenumber" name="L299" href="#L299">299</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if the specified meta is an {@link Optional}.</em>
+<a class="jxr_linenumber" name="L300" href="#L300">300</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L301" href="#L301">301</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">boolean</strong> isOptional(ClassMeta<?> cm) {
+<a class="jxr_linenumber" name="L302" href="#L302">302</a> <strong class="jxr_keyword">return</strong> (nn(cm) && cm.isOptional());
+<a class="jxr_linenumber" name="L303" href="#L303">303</a> }
+<a class="jxr_linenumber" name="L304" href="#L304">304</a>
+<a class="jxr_linenumber" name="L305" href="#L305">305</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L306" href="#L306">306</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if we're processing the root node.</em>
+<a class="jxr_linenumber" name="L307" href="#L307">307</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L308" href="#L308">308</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L309" href="#L309">309</a> <em class="jxr_javadoccomment"> * Must be called after {@link #push(String, Object, ClassMeta)} and before {@link #pop()}.</em>
+<a class="jxr_linenumber" name="L310" href="#L310">310</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L311" href="#L311">311</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if we're processing the root node.</em>
+<a class="jxr_linenumber" name="L312" href="#L312">312</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L313" href="#L313">313</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> isRoot() { <strong class="jxr_keyword">return</strong> depth == 1; }
+<a class="jxr_linenumber" name="L314" href="#L314">314</a>
+<a class="jxr_linenumber" name="L315" href="#L315">315</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L316" href="#L316">316</a> <em class="jxr_javadoccomment"> * Logs a warning message.</em>
+<a class="jxr_linenumber" name="L317" href="#L317">317</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L318" href="#L318">318</a> <em class="jxr_javadoccomment"> * @param t The throwable that was thrown (if there was one).</em>
+<a class="jxr_linenumber" name="L319" href="#L319">319</a> <em class="jxr_javadoccomment"> * @param msg The warning message.</em>
+<a class="jxr_linenumber" name="L320" href="#L320">320</a> <em class="jxr_javadoccomment"> * @param args Optional {@link MessageFormat}-style arguments.</em>
+<a class="jxr_linenumber" name="L321" href="#L321">321</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L322" href="#L322">322</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">void</strong> onError(Throwable t, String msg, Object...args) {
+<a class="jxr_linenumber" name="L323" href="#L323">323</a> <strong class="jxr_keyword">super</strong>.addWarning(msg, args);
+<a class="jxr_linenumber" name="L324" href="#L324">324</a> }
+<a class="jxr_linenumber" name="L325" href="#L325">325</a>
+<a class="jxr_linenumber" name="L326" href="#L326">326</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L327" href="#L327">327</a> <em class="jxr_javadoccomment"> * Pop an object off the stack.</em>
+<a class="jxr_linenumber" name="L328" href="#L328">328</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L329" href="#L329">329</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">void</strong> pop() {
+<a class="jxr_linenumber" name="L330" href="#L330">330</a> indent--;
+<a class="jxr_linenumber" name="L331" href="#L331">331</a> depth--;
+<a class="jxr_linenumber" name="L332" href="#L332">332</a> <strong class="jxr_keyword">if</strong> ((isDetectRecursions() || isDebug()) && ! isBottom) {
+<a class="jxr_linenumber" name="L333" href="#L333">333</a> Object o = stack.removeLast().o;
+<a class="jxr_linenumber" name="L334" href="#L334">334</a> Object o2 = set.remove(o);
+<a class="jxr_linenumber" name="L335" href="#L335">335</a> <strong class="jxr_keyword">if</strong> (o2 == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L336" href="#L336">336</a> onError(<strong class="jxr_keyword">null</strong>, <span class="jxr_string">"Couldn't remove object of type ''{0}'' on attribute ''{1}'' from object stack."</span>, cn(o), stack);
+<a class="jxr_linenumber" name="L337" href="#L337">337</a> }
+<a class="jxr_linenumber" name="L338" href="#L338">338</a> isBottom = false;
+<a class="jxr_linenumber" name="L339" href="#L339">339</a> }
+<a class="jxr_linenumber" name="L340" href="#L340">340</a>
+<a class="jxr_linenumber" name="L341" href="#L341">341</a> @Override <em class="jxr_comment">/* Overridden from ContextSession */</em>
+<a class="jxr_linenumber" name="L342" href="#L342">342</a> <strong class="jxr_keyword">protected</strong> <a name="JsonMap" href="../../../org/apache/juneau/collections/JsonMap.html#JsonMap">JsonMap</a> properties() {
+<a class="jxr_linenumber" name="L343" href="#L343">343</a> <strong class="jxr_keyword">return</strong> filteredMap(<span class="jxr_string">"indent"</span>, indent, <span class="jxr_string">"depth"</span>, depth);
+<a class="jxr_linenumber" name="L344" href="#L344">344</a> }
+<a class="jxr_linenumber" name="L345" href="#L345">345</a>
+<a class="jxr_linenumber" name="L346" href="#L346">346</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L347" href="#L347">347</a> <em class="jxr_javadoccomment"> * Push the specified object onto the stack.</em>
+<a class="jxr_linenumber" name="L348" href="#L348">348</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L349" href="#L349">349</a> <em class="jxr_javadoccomment"> * @param attrName The attribute name.</em>
+<a class="jxr_linenumber" name="L350" href="#L350">350</a> <em class="jxr_javadoccomment"> * @param o The current object being traversed.</em>
+<a class="jxr_linenumber" name="L351" href="#L351">351</a> <em class="jxr_javadoccomment"> * @param eType The expected class type.</em>
+<a class="jxr_linenumber" name="L352" href="#L352">352</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L353" href="#L353">353</a> <em class="jxr_javadoccomment"> * The {@link ClassMeta} of the object so that <c>instanceof</c> operations only need to be performed</em>
+<a class="jxr_linenumber" name="L354" href="#L354">354</a> <em class="jxr_javadoccomment"> * once (since they can be expensive).</em>
+<a class="jxr_linenumber" name="L355" href="#L355">355</a> <em class="jxr_javadoccomment"> * @throws BeanRecursionException If recursion occurred.</em>
+<a class="jxr_linenumber" name="L356" href="#L356">356</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L357" href="#L357">357</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> ClassMeta<?> push(String attrName, Object o, ClassMeta<?> eType) <strong class="jxr_keyword">throws</strong> <a name="BeanRecursionException" href="../../../org/apache/juneau/BeanRecursionException.html#BeanRecursionException">BeanRecursionException</a> {
+<a class="jxr_linenumber" name="L358" href="#L358">358</a> indent++;
+<a class="jxr_linenumber" name="L359" href="#L359">359</a> depth++;
+<a class="jxr_linenumber" name="L360" href="#L360">360</a> isBottom = <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="L361" href="#L361">361</a> <strong class="jxr_keyword">if</strong> (o == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L362" href="#L362">362</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L363" href="#L363">363</a> <strong class="jxr_keyword">var</strong> c = o.getClass();
+<a class="jxr_linenumber" name="L364" href="#L364">364</a> <strong class="jxr_keyword">var</strong> cm = (nn(eType) && c == eType.<strong class="jxr_keyword">inner</strong>()) ? eType : ((o instanceof <a name="ClassMeta" href="../../../org/apache/juneau/ClassMeta.html#ClassMeta">ClassMeta</a>) ? (ClassMeta<?>)o : getClassMeta(c));
+<a class="jxr_linenumber" name="L365" href="#L365">365</a> <strong class="jxr_keyword">if</strong> (cm.isCharSequence() || cm.isNumber() || cm.isBoolean())
+<a class="jxr_linenumber" name="L366" href="#L366">366</a> <strong class="jxr_keyword">return</strong> cm;
+<a class="jxr_linenumber" name="L367" href="#L367">367</a> <strong class="jxr_keyword">if</strong> (depth > getMaxDepth())
+<a class="jxr_linenumber" name="L368" href="#L368">368</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L369" href="#L369">369</a> <strong class="jxr_keyword">if</strong> (isDetectRecursions() || isDebug()) {
+<a class="jxr_linenumber" name="L370" href="#L370">370</a> <strong class="jxr_keyword">if</strong> (willRecurse(attrName, o, cm))
+<a class="jxr_linenumber" name="L371" href="#L371">371</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L372" href="#L372">372</a> isBottom = false;
+<a class="jxr_linenumber" name="L373" href="#L373">373</a> stack.add(<strong class="jxr_keyword">new</strong> StackElement(stack.size(), attrName, o, cm));
+<a class="jxr_linenumber" name="L374" href="#L374">374</a> set.put(o, o);
+<a class="jxr_linenumber" name="L375" href="#L375">375</a> }
+<a class="jxr_linenumber" name="L376" href="#L376">376</a> <strong class="jxr_keyword">return</strong> cm;
+<a class="jxr_linenumber" name="L377" href="#L377">377</a> }
+<a class="jxr_linenumber" name="L378" href="#L378">378</a>
+<a class="jxr_linenumber" name="L379" href="#L379">379</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L380" href="#L380">380</a> <em class="jxr_javadoccomment"> * Sets the current class being traversed for proper error messages.</em>
+<a class="jxr_linenumber" name="L381" href="#L381">381</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L382" href="#L382">382</a> <em class="jxr_javadoccomment"> * @param currentClass The current class being traversed.</em>
+<a class="jxr_linenumber" name="L383" href="#L383">383</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L384" href="#L384">384</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">void</strong> setCurrentClass(ClassMeta<?> currentClass) { <strong class="jxr_keyword">this</strong>.currentClass = currentClass; }
+<a class="jxr_linenumber" name="L385" href="#L385">385</a>
+<a class="jxr_linenumber" name="L386" href="#L386">386</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L387" href="#L387">387</a> <em class="jxr_javadoccomment"> * Sets the current bean property being traversed for proper error messages.</em>
+<a class="jxr_linenumber" name="L388" href="#L388">388</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L389" href="#L389">389</a> <em class="jxr_javadoccomment"> * @param currentProperty The current property being traversed.</em>
+<a class="jxr_linenumber" name="L390" href="#L390">390</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L391" href="#L391">391</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">void</strong> setCurrentProperty(BeanPropertyMeta currentProperty) { <strong class="jxr_keyword">this</strong>.currentProperty = currentProperty; }
+<a class="jxr_linenumber" name="L392" href="#L392">392</a>
+<a class="jxr_linenumber" name="L393" href="#L393">393</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L394" href="#L394">394</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if we're about to exceed the max depth for the document.</em>
+<a class="jxr_linenumber" name="L395" href="#L395">395</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L396" href="#L396">396</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if we're about to exceed the max depth for the document.</em>
+<a class="jxr_linenumber" name="L397" href="#L397">397</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L398" href="#L398">398</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> willExceedDepth() {
+<a class="jxr_linenumber" name="L399" href="#L399">399</a> <strong class="jxr_keyword">return</strong> (depth >= getMaxDepth());
+<a class="jxr_linenumber" name="L400" href="#L400">400</a> }
+<a class="jxr_linenumber" name="L401" href="#L401">401</a>
+<a class="jxr_linenumber" name="L402" href="#L402">402</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L403" href="#L403">403</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if {@link BeanTraverseContext.Builder#detectRecursions()} is enabled, and the specified</em>
+<a class="jxr_linenumber" name="L404" href="#L404">404</a> <em class="jxr_javadoccomment"> * object is already higher up in the traversal chain.</em>
+<a class="jxr_linenumber" name="L405" href="#L405">405</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L406" href="#L406">406</a> <em class="jxr_javadoccomment"> * @param attrName The bean property attribute name, or some other identifier.</em>
+<a class="jxr_linenumber" name="L407" href="#L407">407</a> <em class="jxr_javadoccomment"> * @param o The object to check for recursion.</em>
+<a class="jxr_linenumber" name="L408" href="#L408">408</a> <em class="jxr_javadoccomment"> * @param cm The metadata on the object class.</em>
+<a class="jxr_linenumber" name="L409" href="#L409">409</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if recursion detected.</em>
+<a class="jxr_linenumber" name="L410" href="#L410">410</a> <em class="jxr_javadoccomment"> * @throws BeanRecursionException If recursion occurred.</em>
+<a class="jxr_linenumber" name="L411" href="#L411">411</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L412" href="#L412">412</a> <strong class="jxr_keyword">protected</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">boolean</strong> willRecurse(String attrName, Object o, ClassMeta<?> cm) <strong class="jxr_keyword">throws</strong> <a name="BeanRecursionException" href="../../../org/apache/juneau/BeanRecursionException.html#BeanRecursionException">BeanRecursionException</a> {
+<a class="jxr_linenumber" name="L413" href="#L413">413</a> <strong class="jxr_keyword">if</strong> (! (isDetectRecursions() || isDebug()) || ! set.containsKey(o))
+<a class="jxr_linenumber" name="L414" href="#L414">414</a> <strong class="jxr_keyword">return</strong> false;
+<a class="jxr_linenumber" name="L415" href="#L415">415</a> <strong class="jxr_keyword">if</strong> (isIgnoreRecursions() && ! isDebug())
+<a class="jxr_linenumber" name="L416" href="#L416">416</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="L417" href="#L417">417</a>
+<a class="jxr_linenumber" name="L418" href="#L418">418</a> stack.add(<strong class="jxr_keyword">new</strong> StackElement(stack.size(), attrName, o, cm));
+<a class="jxr_linenumber" name="L419" href="#L419">419</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> <a name="BeanRecursionException" href="../../../org/apache/juneau/BeanRecursionException.html#BeanRecursionException">BeanRecursionException</a>(<span class="jxr_string">"Recursion occurred, stack={0}"</span>, getStack(<strong class="jxr_keyword">true</strong>));
+<a class="jxr_linenumber" name="L420" href="#L420">420</a> }
+<a class="jxr_linenumber" name="L421" href="#L421">421</a> }
</pre>
<hr/>
<div id="footer">© 2016–2025 <a href="https://www.apache.org/">The Apache Software Foundation</a></div>
diff --git a/site/xref/org/apache/juneau/collections/JsonMap.html b/site/xref/org/apache/juneau/collections/JsonMap.html
index 9be6799f03..238cba81e4 100644
--- a/site/xref/org/apache/juneau/collections/JsonMap.html
+++ b/site/xref/org/apache/juneau/collections/JsonMap.html
@@ -169,7 +169,7 @@
<a class="jxr_linenumber" name="L161" href="#L161">161</a>
<a class="jxr_linenumber" name="L162" href="#L162">162</a> @Override <em class="jxr_comment">/* Overridden from Map */</em>
<a class="jxr_linenumber" name="L163" href="#L163">163</a> <strong class="jxr_keyword">public</strong> Collection<Object> values() {
-<a class="jxr_linenumber" name="L164" href="#L164">164</a> <strong class="jxr_keyword">return</strong> Collections.emptyMap().values();
+<a class="jxr_linenumber" name="L164" href="#L164">164</a> <strong class="jxr_keyword">return</strong> mape().values();
<a class="jxr_linenumber" name="L165" href="#L165">165</a> }
<a class="jxr_linenumber" name="L166" href="#L166">166</a> };
<a class="jxr_linenumber" name="L167" href="#L167">167</a>
diff --git a/site/xref/org/apache/juneau/commons/utils/CollectionUtils.html b/site/xref/org/apache/juneau/commons/utils/CollectionUtils.html
index 9b4781f4e8..3874d2e6cb 100644
--- a/site/xref/org/apache/juneau/commons/utils/CollectionUtils.html
+++ b/site/xref/org/apache/juneau/commons/utils/CollectionUtils.html
@@ -1592,685 +1592,688 @@
<a class="jxr_linenumber" name="L1584" href="#L1584">1584</a> <strong class="jxr_keyword">return</strong> Collections.emptyMap();
<a class="jxr_linenumber" name="L1585" href="#L1585">1585</a> }
<a class="jxr_linenumber" name="L1586" href="#L1586">1586</a>
-<a class="jxr_linenumber" name="L1587" href="#L1587">1587</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1588" href="#L1588">1588</a> <em class="jxr_javadoccomment"> * Returns a null map.</em>
-<a class="jxr_linenumber" name="L1589" href="#L1589">1589</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1590" href="#L1590">1590</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
-<a class="jxr_linenumber" name="L1591" href="#L1591">1591</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
-<a class="jxr_linenumber" name="L1592" href="#L1592">1592</a> <em class="jxr_javadoccomment"> * @param keyType The key type class.</em>
-<a class="jxr_linenumber" name="L1593" href="#L1593">1593</a> <em class="jxr_javadoccomment"> * @param valueType The value type class.</em>
-<a class="jxr_linenumber" name="L1594" href="#L1594">1594</a> <em class="jxr_javadoccomment"> * @return <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L1595" href="#L1595">1595</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1596" href="#L1596">1596</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> Map<K,V> mapn(Class<K> keyType, Class<V> valueType) {
-<a class="jxr_linenumber" name="L1597" href="#L1597">1597</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L1598" href="#L1598">1598</a> }
-<a class="jxr_linenumber" name="L1599" href="#L1599">1599</a>
-<a class="jxr_linenumber" name="L1600" href="#L1600">1600</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1601" href="#L1601">1601</a> <em class="jxr_javadoccomment"> * Convenience method for creating a {@link LinkedHashMap}.</em>
-<a class="jxr_linenumber" name="L1602" href="#L1602">1602</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1603" href="#L1603">1603</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
-<a class="jxr_linenumber" name="L1604" href="#L1604">1604</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
-<a class="jxr_linenumber" name="L1605" href="#L1605">1605</a> <em class="jxr_javadoccomment"> * @param keyType The key type.</em>
-<a class="jxr_linenumber" name="L1606" href="#L1606">1606</a> <em class="jxr_javadoccomment"> * @param valueType The value type.</em>
-<a class="jxr_linenumber" name="L1607" href="#L1607">1607</a> <em class="jxr_javadoccomment"> * @return A new modifiable map.</em>
-<a class="jxr_linenumber" name="L1608" href="#L1608">1608</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1609" href="#L1609">1609</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> LinkedHashMap<K,V> mapOf(Class<K> keyType, Class<V> valueType) {
-<a class="jxr_linenumber" name="L1610" href="#L1610">1610</a> <strong class="jxr_keyword">return</strong> map();
-<a class="jxr_linenumber" name="L1611" href="#L1611">1611</a> }
-<a class="jxr_linenumber" name="L1612" href="#L1612">1612</a>
-<a class="jxr_linenumber" name="L1613" href="#L1613">1613</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1614" href="#L1614">1614</a> <em class="jxr_javadoccomment"> * Returns <jk>null</jk> for the specified array type.</em>
-<a class="jxr_linenumber" name="L1615" href="#L1615">1615</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1616" href="#L1616">1616</a> <em class="jxr_javadoccomment"> * @param <T> The component type.</em>
-<a class="jxr_linenumber" name="L1617" href="#L1617">1617</a> <em class="jxr_javadoccomment"> * @param type The component type class.</em>
-<a class="jxr_linenumber" name="L1618" href="#L1618">1618</a> <em class="jxr_javadoccomment"> * @return <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L1619" href="#L1619">1619</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1620" href="#L1620">1620</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> T[] na(Class<T> type) {
-<a class="jxr_linenumber" name="L1621" href="#L1621">1621</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L1622" href="#L1622">1622</a> }
-<a class="jxr_linenumber" name="L1623" href="#L1623">1623</a>
-<a class="jxr_linenumber" name="L1624" href="#L1624">1624</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1625" href="#L1625">1625</a> <em class="jxr_javadoccomment"> * Adds all the specified values to the specified collection.</em>
-<a class="jxr_linenumber" name="L1626" href="#L1626">1626</a> <em class="jxr_javadoccomment"> * Creates a new set if the value is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L1627" href="#L1627">1627</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1628" href="#L1628">1628</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1629" href="#L1629">1629</a> <em class="jxr_javadoccomment"> * @param value The collection to add to.</em>
-<a class="jxr_linenumber" name="L1630" href="#L1630">1630</a> <em class="jxr_javadoccomment"> * @param entries The entries to add.</em>
-<a class="jxr_linenumber" name="L1631" href="#L1631">1631</a> <em class="jxr_javadoccomment"> * @return The set.</em>
-<a class="jxr_linenumber" name="L1632" href="#L1632">1632</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1633" href="#L1633">1633</a> @SafeVarargs
-<a class="jxr_linenumber" name="L1634" href="#L1634">1634</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> prependAll(List<E> value, E...entries) {
-<a class="jxr_linenumber" name="L1635" href="#L1635">1635</a> <strong class="jxr_keyword">if</strong> (nn(entries)) {
-<a class="jxr_linenumber" name="L1636" href="#L1636">1636</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L1637" href="#L1637">1637</a> value = list(entries);
-<a class="jxr_linenumber" name="L1638" href="#L1638">1638</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L1639" href="#L1639">1639</a> value.addAll(0, l(entries));
-<a class="jxr_linenumber" name="L1640" href="#L1640">1640</a> }
-<a class="jxr_linenumber" name="L1641" href="#L1641">1641</a> <strong class="jxr_keyword">return</strong> value;
-<a class="jxr_linenumber" name="L1642" href="#L1642">1642</a> }
-<a class="jxr_linenumber" name="L1643" href="#L1643">1643</a>
-<a class="jxr_linenumber" name="L1644" href="#L1644">1644</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1645" href="#L1645">1645</a> <em class="jxr_javadoccomment"> * Reverses the entries in an array.</em>
-<a class="jxr_linenumber" name="L1646" href="#L1646">1646</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1647" href="#L1647">1647</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1648" href="#L1648">1648</a> <em class="jxr_javadoccomment"> * @param array The array to reverse.</em>
-<a class="jxr_linenumber" name="L1649" href="#L1649">1649</a> <em class="jxr_javadoccomment"> * @return The same array.</em>
-<a class="jxr_linenumber" name="L1650" href="#L1650">1650</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1651" href="#L1651">1651</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1652" href="#L1652">1652</a> <em class="jxr_javadoccomment"> * Reverses the elements in the specified array in-place.</em>
-<a class="jxr_linenumber" name="L1653" href="#L1653">1653</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1654" href="#L1654">1654</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1655" href="#L1655">1655</a> <em class="jxr_javadoccomment"> * @param array The array to reverse.</em>
-<a class="jxr_linenumber" name="L1656" href="#L1656">1656</a> <em class="jxr_javadoccomment"> * @return The same array, reversed.</em>
-<a class="jxr_linenumber" name="L1657" href="#L1657">1657</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1658" href="#L1658">1658</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> E[] reverse(E[] array) {
-<a class="jxr_linenumber" name="L1659" href="#L1659">1659</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < array.length / 2; i++) {
-<a class="jxr_linenumber" name="L1660" href="#L1660">1660</a> E temp = array[i];
-<a class="jxr_linenumber" name="L1661" href="#L1661">1661</a> array[i] = array[array.length - i - 1];
-<a class="jxr_linenumber" name="L1662" href="#L1662">1662</a> array[array.length - i - 1] = temp;
-<a class="jxr_linenumber" name="L1663" href="#L1663">1663</a> }
-<a class="jxr_linenumber" name="L1664" href="#L1664">1664</a> <strong class="jxr_keyword">return</strong> array;
-<a class="jxr_linenumber" name="L1665" href="#L1665">1665</a> }
-<a class="jxr_linenumber" name="L1666" href="#L1666">1666</a>
-<a class="jxr_linenumber" name="L1667" href="#L1667">1667</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1668" href="#L1668">1668</a> <em class="jxr_javadoccomment"> * Returns a reversed view of the specified list.</em>
-<a class="jxr_linenumber" name="L1669" href="#L1669">1669</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1670" href="#L1670">1670</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L1671" href="#L1671">1671</a> <em class="jxr_javadoccomment"> * The returned list is a live view that reflects changes to the original list.</em>
+<a class="jxr_linenumber" name="L1587" href="#L1587">1587</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> Map<K,V> mape() {
+<a class="jxr_linenumber" name="L1588" href="#L1588">1588</a> <strong class="jxr_keyword">return</strong> Collections.emptyMap();
+<a class="jxr_linenumber" name="L1589" href="#L1589">1589</a> }
+<a class="jxr_linenumber" name="L1590" href="#L1590">1590</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1591" href="#L1591">1591</a> <em class="jxr_javadoccomment"> * Returns a null map.</em>
+<a class="jxr_linenumber" name="L1592" href="#L1592">1592</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1593" href="#L1593">1593</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
+<a class="jxr_linenumber" name="L1594" href="#L1594">1594</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
+<a class="jxr_linenumber" name="L1595" href="#L1595">1595</a> <em class="jxr_javadoccomment"> * @param keyType The key type class.</em>
+<a class="jxr_linenumber" name="L1596" href="#L1596">1596</a> <em class="jxr_javadoccomment"> * @param valueType The value type class.</em>
+<a class="jxr_linenumber" name="L1597" href="#L1597">1597</a> <em class="jxr_javadoccomment"> * @return <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L1598" href="#L1598">1598</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1599" href="#L1599">1599</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> Map<K,V> mapn(Class<K> keyType, Class<V> valueType) {
+<a class="jxr_linenumber" name="L1600" href="#L1600">1600</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L1601" href="#L1601">1601</a> }
+<a class="jxr_linenumber" name="L1602" href="#L1602">1602</a>
+<a class="jxr_linenumber" name="L1603" href="#L1603">1603</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1604" href="#L1604">1604</a> <em class="jxr_javadoccomment"> * Convenience method for creating a {@link LinkedHashMap}.</em>
+<a class="jxr_linenumber" name="L1605" href="#L1605">1605</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1606" href="#L1606">1606</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
+<a class="jxr_linenumber" name="L1607" href="#L1607">1607</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
+<a class="jxr_linenumber" name="L1608" href="#L1608">1608</a> <em class="jxr_javadoccomment"> * @param keyType The key type.</em>
+<a class="jxr_linenumber" name="L1609" href="#L1609">1609</a> <em class="jxr_javadoccomment"> * @param valueType The value type.</em>
+<a class="jxr_linenumber" name="L1610" href="#L1610">1610</a> <em class="jxr_javadoccomment"> * @return A new modifiable map.</em>
+<a class="jxr_linenumber" name="L1611" href="#L1611">1611</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1612" href="#L1612">1612</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> LinkedHashMap<K,V> mapOf(Class<K> keyType, Class<V> valueType) {
+<a class="jxr_linenumber" name="L1613" href="#L1613">1613</a> <strong class="jxr_keyword">return</strong> map();
+<a class="jxr_linenumber" name="L1614" href="#L1614">1614</a> }
+<a class="jxr_linenumber" name="L1615" href="#L1615">1615</a>
+<a class="jxr_linenumber" name="L1616" href="#L1616">1616</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1617" href="#L1617">1617</a> <em class="jxr_javadoccomment"> * Returns <jk>null</jk> for the specified array type.</em>
+<a class="jxr_linenumber" name="L1618" href="#L1618">1618</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1619" href="#L1619">1619</a> <em class="jxr_javadoccomment"> * @param <T> The component type.</em>
+<a class="jxr_linenumber" name="L1620" href="#L1620">1620</a> <em class="jxr_javadoccomment"> * @param type The component type class.</em>
+<a class="jxr_linenumber" name="L1621" href="#L1621">1621</a> <em class="jxr_javadoccomment"> * @return <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L1622" href="#L1622">1622</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1623" href="#L1623">1623</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> T[] na(Class<T> type) {
+<a class="jxr_linenumber" name="L1624" href="#L1624">1624</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L1625" href="#L1625">1625</a> }
+<a class="jxr_linenumber" name="L1626" href="#L1626">1626</a>
+<a class="jxr_linenumber" name="L1627" href="#L1627">1627</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1628" href="#L1628">1628</a> <em class="jxr_javadoccomment"> * Adds all the specified values to the specified collection.</em>
+<a class="jxr_linenumber" name="L1629" href="#L1629">1629</a> <em class="jxr_javadoccomment"> * Creates a new set if the value is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L1630" href="#L1630">1630</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1631" href="#L1631">1631</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1632" href="#L1632">1632</a> <em class="jxr_javadoccomment"> * @param value The collection to add to.</em>
+<a class="jxr_linenumber" name="L1633" href="#L1633">1633</a> <em class="jxr_javadoccomment"> * @param entries The entries to add.</em>
+<a class="jxr_linenumber" name="L1634" href="#L1634">1634</a> <em class="jxr_javadoccomment"> * @return The set.</em>
+<a class="jxr_linenumber" name="L1635" href="#L1635">1635</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1636" href="#L1636">1636</a> @SafeVarargs
+<a class="jxr_linenumber" name="L1637" href="#L1637">1637</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> prependAll(List<E> value, E...entries) {
+<a class="jxr_linenumber" name="L1638" href="#L1638">1638</a> <strong class="jxr_keyword">if</strong> (nn(entries)) {
+<a class="jxr_linenumber" name="L1639" href="#L1639">1639</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L1640" href="#L1640">1640</a> value = list(entries);
+<a class="jxr_linenumber" name="L1641" href="#L1641">1641</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L1642" href="#L1642">1642</a> value.addAll(0, l(entries));
+<a class="jxr_linenumber" name="L1643" href="#L1643">1643</a> }
+<a class="jxr_linenumber" name="L1644" href="#L1644">1644</a> <strong class="jxr_keyword">return</strong> value;
+<a class="jxr_linenumber" name="L1645" href="#L1645">1645</a> }
+<a class="jxr_linenumber" name="L1646" href="#L1646">1646</a>
+<a class="jxr_linenumber" name="L1647" href="#L1647">1647</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1648" href="#L1648">1648</a> <em class="jxr_javadoccomment"> * Reverses the entries in an array.</em>
+<a class="jxr_linenumber" name="L1649" href="#L1649">1649</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1650" href="#L1650">1650</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1651" href="#L1651">1651</a> <em class="jxr_javadoccomment"> * @param array The array to reverse.</em>
+<a class="jxr_linenumber" name="L1652" href="#L1652">1652</a> <em class="jxr_javadoccomment"> * @return The same array.</em>
+<a class="jxr_linenumber" name="L1653" href="#L1653">1653</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1654" href="#L1654">1654</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1655" href="#L1655">1655</a> <em class="jxr_javadoccomment"> * Reverses the elements in the specified array in-place.</em>
+<a class="jxr_linenumber" name="L1656" href="#L1656">1656</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1657" href="#L1657">1657</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1658" href="#L1658">1658</a> <em class="jxr_javadoccomment"> * @param array The array to reverse.</em>
+<a class="jxr_linenumber" name="L1659" href="#L1659">1659</a> <em class="jxr_javadoccomment"> * @return The same array, reversed.</em>
+<a class="jxr_linenumber" name="L1660" href="#L1660">1660</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1661" href="#L1661">1661</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> E[] reverse(E[] array) {
+<a class="jxr_linenumber" name="L1662" href="#L1662">1662</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < array.length / 2; i++) {
+<a class="jxr_linenumber" name="L1663" href="#L1663">1663</a> E temp = array[i];
+<a class="jxr_linenumber" name="L1664" href="#L1664">1664</a> array[i] = array[array.length - i - 1];
+<a class="jxr_linenumber" name="L1665" href="#L1665">1665</a> array[array.length - i - 1] = temp;
+<a class="jxr_linenumber" name="L1666" href="#L1666">1666</a> }
+<a class="jxr_linenumber" name="L1667" href="#L1667">1667</a> <strong class="jxr_keyword">return</strong> array;
+<a class="jxr_linenumber" name="L1668" href="#L1668">1668</a> }
+<a class="jxr_linenumber" name="L1669" href="#L1669">1669</a>
+<a class="jxr_linenumber" name="L1670" href="#L1670">1670</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1671" href="#L1671">1671</a> <em class="jxr_javadoccomment"> * Returns a reversed view of the specified list.</em>
<a class="jxr_linenumber" name="L1672" href="#L1672">1672</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1673" href="#L1673">1673</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1674" href="#L1674">1674</a> <em class="jxr_javadoccomment"> * @param list The list to reverse.</em>
-<a class="jxr_linenumber" name="L1675" href="#L1675">1675</a> <em class="jxr_javadoccomment"> * @return A reversed view of the list.</em>
-<a class="jxr_linenumber" name="L1676" href="#L1676">1676</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1677" href="#L1677">1677</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> reverse(List<E> list) {
-<a class="jxr_linenumber" name="L1678" href="#L1678">1678</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> ReversedList<>(list);
-<a class="jxr_linenumber" name="L1679" href="#L1679">1679</a> }
-<a class="jxr_linenumber" name="L1680" href="#L1680">1680</a>
-<a class="jxr_linenumber" name="L1681" href="#L1681">1681</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1682" href="#L1682">1682</a> <em class="jxr_javadoccomment"> * Returns a reverse stream of the specified list.</em>
-<a class="jxr_linenumber" name="L1683" href="#L1683">1683</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1684" href="#L1684">1684</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L1685" href="#L1685">1685</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L1686" href="#L1686">1686</a> <em class="jxr_javadoccomment"> * List&lt;String&gt; <jv>list</jv> = <jsm>list</jsm>(<js>"a"</js>, <js>"b"</js>, <js>"c"</js>);</em>
-<a class="jxr_linenumber" name="L1687" href="#L1687">1687</a> <em class="jxr_javadoccomment"> * Stream&lt;String&gt; <jv>reversed</jv> = <jsm>rstream</jsm>(<jv>list</jv>);</em>
-<a class="jxr_linenumber" name="L1688" href="#L1688">1688</a> <em class="jxr_javadoccomment"> * <jc>// Produces stream: "c", "b", "a"</jc></em>
-<a class="jxr_linenumber" name="L1689" href="#L1689">1689</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L1690" href="#L1690">1690</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1691" href="#L1691">1691</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
-<a class="jxr_linenumber" name="L1692" href="#L1692">1692</a> <em class="jxr_javadoccomment"> * @param value The list to stream in reverse order. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L1693" href="#L1693">1693</a> <em class="jxr_javadoccomment"> * @return A stream of the list elements in reverse order, or an empty stream if the list is <jk>null</jk> or empty.</em>
-<a class="jxr_linenumber" name="L1694" href="#L1694">1694</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1695" href="#L1695">1695</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Stream<T> rstream(List<T> value) {
-<a class="jxr_linenumber" name="L1696" href="#L1696">1696</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong> || value.isEmpty())
-<a class="jxr_linenumber" name="L1697" href="#L1697">1697</a> <strong class="jxr_keyword">return</strong> Stream.empty();
-<a class="jxr_linenumber" name="L1698" href="#L1698">1698</a> <strong class="jxr_keyword">return</strong> IntStream.range(0, value.size()).mapToObj(i -> value.get(value.size() - 1 - i));
-<a class="jxr_linenumber" name="L1699" href="#L1699">1699</a> }
-<a class="jxr_linenumber" name="L1700" href="#L1700">1700</a>
-<a class="jxr_linenumber" name="L1701" href="#L1701">1701</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1702" href="#L1702">1702</a> <em class="jxr_javadoccomment"> * Shortcut for creating a modifiable set out of an array of values.</em>
-<a class="jxr_linenumber" name="L1703" href="#L1703">1703</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1704" href="#L1704">1704</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
-<a class="jxr_linenumber" name="L1705" href="#L1705">1705</a> <em class="jxr_javadoccomment"> * @param values The values to add to the set.</em>
-<a class="jxr_linenumber" name="L1706" href="#L1706">1706</a> <em class="jxr_javadoccomment"> * @return A modifiable LinkedHashSet containing the specified values.</em>
-<a class="jxr_linenumber" name="L1707" href="#L1707">1707</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1708" href="#L1708">1708</a> @SafeVarargs
-<a class="jxr_linenumber" name="L1709" href="#L1709">1709</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> LinkedHashSet<T> set(T...values) { <em class="jxr_comment">// NOSONAR</em>
-<a class="jxr_linenumber" name="L1710" href="#L1710">1710</a> assertArgNotNull(<span class="jxr_string">"values"</span>, values);
-<a class="jxr_linenumber" name="L1711" href="#L1711">1711</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> LinkedHashSet<>(Arrays.asList(values));
-<a class="jxr_linenumber" name="L1712" href="#L1712">1712</a> }
-<a class="jxr_linenumber" name="L1713" href="#L1713">1713</a>
-<a class="jxr_linenumber" name="L1714" href="#L1714">1714</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1715" href="#L1715">1715</a> <em class="jxr_javadoccomment"> * Returns an empty immutable set.</em>
-<a class="jxr_linenumber" name="L1716" href="#L1716">1716</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1717" href="#L1717">1717</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L1718" href="#L1718">1718</a> <em class="jxr_javadoccomment"> * This is a convenience method that returns {@link Collections#emptySet()}.</em>
+<a class="jxr_linenumber" name="L1673" href="#L1673">1673</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L1674" href="#L1674">1674</a> <em class="jxr_javadoccomment"> * The returned list is a live view that reflects changes to the original list.</em>
+<a class="jxr_linenumber" name="L1675" href="#L1675">1675</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1676" href="#L1676">1676</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1677" href="#L1677">1677</a> <em class="jxr_javadoccomment"> * @param list The list to reverse.</em>
+<a class="jxr_linenumber" name="L1678" href="#L1678">1678</a> <em class="jxr_javadoccomment"> * @return A reversed view of the list.</em>
+<a class="jxr_linenumber" name="L1679" href="#L1679">1679</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1680" href="#L1680">1680</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> reverse(List<E> list) {
+<a class="jxr_linenumber" name="L1681" href="#L1681">1681</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> ReversedList<>(list);
+<a class="jxr_linenumber" name="L1682" href="#L1682">1682</a> }
+<a class="jxr_linenumber" name="L1683" href="#L1683">1683</a>
+<a class="jxr_linenumber" name="L1684" href="#L1684">1684</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1685" href="#L1685">1685</a> <em class="jxr_javadoccomment"> * Returns a reverse stream of the specified list.</em>
+<a class="jxr_linenumber" name="L1686" href="#L1686">1686</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1687" href="#L1687">1687</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L1688" href="#L1688">1688</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L1689" href="#L1689">1689</a> <em class="jxr_javadoccomment"> * List&lt;String&gt; <jv>list</jv> = <jsm>list</jsm>(<js>"a"</js>, <js>"b"</js>, <js>"c"</js>);</em>
+<a class="jxr_linenumber" name="L1690" href="#L1690">1690</a> <em class="jxr_javadoccomment"> * Stream&lt;String&gt; <jv>reversed</jv> = <jsm>rstream</jsm>(<jv>list</jv>);</em>
+<a class="jxr_linenumber" name="L1691" href="#L1691">1691</a> <em class="jxr_javadoccomment"> * <jc>// Produces stream: "c", "b", "a"</jc></em>
+<a class="jxr_linenumber" name="L1692" href="#L1692">1692</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L1693" href="#L1693">1693</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1694" href="#L1694">1694</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
+<a class="jxr_linenumber" name="L1695" href="#L1695">1695</a> <em class="jxr_javadoccomment"> * @param value The list to stream in reverse order. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L1696" href="#L1696">1696</a> <em class="jxr_javadoccomment"> * @return A stream of the list elements in reverse order, or an empty stream if the list is <jk>null</jk> or empty.</em>
+<a class="jxr_linenumber" name="L1697" href="#L1697">1697</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1698" href="#L1698">1698</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Stream<T> rstream(List<T> value) {
+<a class="jxr_linenumber" name="L1699" href="#L1699">1699</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong> || value.isEmpty())
+<a class="jxr_linenumber" name="L1700" href="#L1700">1700</a> <strong class="jxr_keyword">return</strong> Stream.empty();
+<a class="jxr_linenumber" name="L1701" href="#L1701">1701</a> <strong class="jxr_keyword">return</strong> IntStream.range(0, value.size()).mapToObj(i -> value.get(value.size() - 1 - i));
+<a class="jxr_linenumber" name="L1702" href="#L1702">1702</a> }
+<a class="jxr_linenumber" name="L1703" href="#L1703">1703</a>
+<a class="jxr_linenumber" name="L1704" href="#L1704">1704</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1705" href="#L1705">1705</a> <em class="jxr_javadoccomment"> * Shortcut for creating a modifiable set out of an array of values.</em>
+<a class="jxr_linenumber" name="L1706" href="#L1706">1706</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1707" href="#L1707">1707</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
+<a class="jxr_linenumber" name="L1708" href="#L1708">1708</a> <em class="jxr_javadoccomment"> * @param values The values to add to the set.</em>
+<a class="jxr_linenumber" name="L1709" href="#L1709">1709</a> <em class="jxr_javadoccomment"> * @return A modifiable LinkedHashSet containing the specified values.</em>
+<a class="jxr_linenumber" name="L1710" href="#L1710">1710</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1711" href="#L1711">1711</a> @SafeVarargs
+<a class="jxr_linenumber" name="L1712" href="#L1712">1712</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> LinkedHashSet<T> set(T...values) { <em class="jxr_comment">// NOSONAR</em>
+<a class="jxr_linenumber" name="L1713" href="#L1713">1713</a> assertArgNotNull(<span class="jxr_string">"values"</span>, values);
+<a class="jxr_linenumber" name="L1714" href="#L1714">1714</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> LinkedHashSet<>(Arrays.asList(values));
+<a class="jxr_linenumber" name="L1715" href="#L1715">1715</a> }
+<a class="jxr_linenumber" name="L1716" href="#L1716">1716</a>
+<a class="jxr_linenumber" name="L1717" href="#L1717">1717</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1718" href="#L1718">1718</a> <em class="jxr_javadoccomment"> * Returns an empty immutable set.</em>
<a class="jxr_linenumber" name="L1719" href="#L1719">1719</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1720" href="#L1720">1720</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L1721" href="#L1721">1721</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L1722" href="#L1722">1722</a> <em class="jxr_javadoccomment"> * Set&lt;String&gt; <jv>empty</jv> = CollectionUtils.<jsf>sete</jsf>(); <jc>// Returns Collections.emptySet()</jc></em>
-<a class="jxr_linenumber" name="L1723" href="#L1723">1723</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L1724" href="#L1724">1724</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1725" href="#L1725">1725</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
-<a class="jxr_linenumber" name="L1726" href="#L1726">1726</a> <em class="jxr_javadoccomment"> * @return An empty immutable set.</em>
-<a class="jxr_linenumber" name="L1727" href="#L1727">1727</a> <em class="jxr_javadoccomment"> * @see Collections#emptySet()</em>
-<a class="jxr_linenumber" name="L1728" href="#L1728">1728</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1729" href="#L1729">1729</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Set<T> sete() {
-<a class="jxr_linenumber" name="L1730" href="#L1730">1730</a> <strong class="jxr_keyword">return</strong> Collections.emptySet();
-<a class="jxr_linenumber" name="L1731" href="#L1731">1731</a> }
-<a class="jxr_linenumber" name="L1732" href="#L1732">1732</a>
-<a class="jxr_linenumber" name="L1733" href="#L1733">1733</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1734" href="#L1734">1734</a> <em class="jxr_javadoccomment"> * Convenience factory for a {@link SetBuilder}.</em>
-<a class="jxr_linenumber" name="L1735" href="#L1735">1735</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1736" href="#L1736">1736</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1737" href="#L1737">1737</a> <em class="jxr_javadoccomment"> * @param type The element type.</em>
-<a class="jxr_linenumber" name="L1738" href="#L1738">1738</a> <em class="jxr_javadoccomment"> * @param converters Optional converters to use for converting values.</em>
-<a class="jxr_linenumber" name="L1739" href="#L1739">1739</a> <em class="jxr_javadoccomment"> * @return A new set builder.</em>
-<a class="jxr_linenumber" name="L1740" href="#L1740">1740</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1741" href="#L1741">1741</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> SetBuilder<E> setb(Class<E> type, Converter...converters) {
-<a class="jxr_linenumber" name="L1742" href="#L1742">1742</a> <strong class="jxr_keyword">return</strong> SetBuilder.create(type).converters(converters);
-<a class="jxr_linenumber" name="L1743" href="#L1743">1743</a> }
-<a class="jxr_linenumber" name="L1744" href="#L1744">1744</a>
-<a class="jxr_linenumber" name="L1745" href="#L1745">1745</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1746" href="#L1746">1746</a> <em class="jxr_javadoccomment"> * Convenience method for creating a {@link LinkedHashSet}.</em>
-<a class="jxr_linenumber" name="L1747" href="#L1747">1747</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1748" href="#L1748">1748</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1749" href="#L1749">1749</a> <em class="jxr_javadoccomment"> * @param elementType The element type.</em>
-<a class="jxr_linenumber" name="L1750" href="#L1750">1750</a> <em class="jxr_javadoccomment"> * @param values The values to initialize the set with.</em>
-<a class="jxr_linenumber" name="L1751" href="#L1751">1751</a> <em class="jxr_javadoccomment"> * @return A new modifiable set.</em>
-<a class="jxr_linenumber" name="L1752" href="#L1752">1752</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1753" href="#L1753">1753</a> @SafeVarargs
-<a class="jxr_linenumber" name="L1754" href="#L1754">1754</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> LinkedHashSet<E> setOf(Class<E> elementType, E...values) {
-<a class="jxr_linenumber" name="L1755" href="#L1755">1755</a> <strong class="jxr_keyword">return</strong> set(values);
-<a class="jxr_linenumber" name="L1756" href="#L1756">1756</a> }
-<a class="jxr_linenumber" name="L1757" href="#L1757">1757</a>
-<a class="jxr_linenumber" name="L1758" href="#L1758">1758</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1759" href="#L1759">1759</a> <em class="jxr_javadoccomment"> * Shortcut for creating a short array.</em>
-<a class="jxr_linenumber" name="L1760" href="#L1760">1760</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1761" href="#L1761">1761</a> <em class="jxr_javadoccomment"> * <p>Accepts int values and converts them to shorts, eliminating the need for explicit short casts.</p></em>
-<a class="jxr_linenumber" name="L1762" href="#L1762">1762</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1763" href="#L1763">1763</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L1764" href="#L1764">1764</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L1765" href="#L1765">1765</a> <em class="jxr_javadoccomment"> * <jk>short</jk>[] <jv>myArray</jv> = <jsm>shorts</jsm>(1, 2, 3);</em>
-<a class="jxr_linenumber" name="L1766" href="#L1766">1766</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L1767" href="#L1767">1767</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1768" href="#L1768">1768</a> <em class="jxr_javadoccomment"> * @param value The int values to convert to shorts. Values outside the short range (-32768 to 32767) will be truncated.</em>
-<a class="jxr_linenumber" name="L1769" href="#L1769">1769</a> <em class="jxr_javadoccomment"> * @return A new short array.</em>
-<a class="jxr_linenumber" name="L1770" href="#L1770">1770</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1771" href="#L1771">1771</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">short</strong>[] shorts(<strong class="jxr_keyword">int</strong>...value) {
-<a class="jxr_linenumber" name="L1772" href="#L1772">1772</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> <strong class="jxr_keyword">short</strong>[value.length];
-<a class="jxr_linenumber" name="L1773" href="#L1773">1773</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < value.length; i++) {
-<a class="jxr_linenumber" name="L1774" href="#L1774">1774</a> result[i] = (<strong class="jxr_keyword">short</strong>)value[i];
-<a class="jxr_linenumber" name="L1775" href="#L1775">1775</a> }
-<a class="jxr_linenumber" name="L1776" href="#L1776">1776</a> <strong class="jxr_keyword">return</strong> result;
-<a class="jxr_linenumber" name="L1777" href="#L1777">1777</a> }
-<a class="jxr_linenumber" name="L1778" href="#L1778">1778</a>
-<a class="jxr_linenumber" name="L1779" href="#L1779">1779</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1780" href="#L1780">1780</a> <em class="jxr_javadoccomment"> * Convenience method for creating an {@link ArrayList} and sorting it.</em>
-<a class="jxr_linenumber" name="L1781" href="#L1781">1781</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1782" href="#L1782">1782</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1783" href="#L1783">1783</a> <em class="jxr_javadoccomment"> * @param comparator The comparator to use to sort the list.</em>
-<a class="jxr_linenumber" name="L1784" href="#L1784">1784</a> <em class="jxr_javadoccomment"> * @param value The values to initialize the list with.</em>
-<a class="jxr_linenumber" name="L1785" href="#L1785">1785</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
-<a class="jxr_linenumber" name="L1786" href="#L1786">1786</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1787" href="#L1787">1787</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> ArrayList<E> sortedList(Comparator<E> comparator, Collection<E> value) {
-<a class="jxr_linenumber" name="L1788" href="#L1788">1788</a> ArrayList<E> l = toList(value);
-<a class="jxr_linenumber" name="L1789" href="#L1789">1789</a> Collections.sort(l, comparator);
-<a class="jxr_linenumber" name="L1790" href="#L1790">1790</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L1791" href="#L1791">1791</a> }
-<a class="jxr_linenumber" name="L1792" href="#L1792">1792</a>
-<a class="jxr_linenumber" name="L1793" href="#L1793">1793</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1794" href="#L1794">1794</a> <em class="jxr_javadoccomment"> * Convenience method for creating an {@link ArrayList} and sorting it.</em>
-<a class="jxr_linenumber" name="L1795" href="#L1795">1795</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1796" href="#L1796">1796</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1797" href="#L1797">1797</a> <em class="jxr_javadoccomment"> * @param comparator The comparator to use to sort the list.</em>
-<a class="jxr_linenumber" name="L1798" href="#L1798">1798</a> <em class="jxr_javadoccomment"> * @param values The values to initialize the list with.</em>
-<a class="jxr_linenumber" name="L1799" href="#L1799">1799</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
-<a class="jxr_linenumber" name="L1800" href="#L1800">1800</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1801" href="#L1801">1801</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> sortedList(Comparator<E> comparator, E[] values) {
-<a class="jxr_linenumber" name="L1802" href="#L1802">1802</a> List<E> l = list(values);
-<a class="jxr_linenumber" name="L1803" href="#L1803">1803</a> Collections.sort(l, comparator);
-<a class="jxr_linenumber" name="L1804" href="#L1804">1804</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L1805" href="#L1805">1805</a> }
-<a class="jxr_linenumber" name="L1806" href="#L1806">1806</a>
-<a class="jxr_linenumber" name="L1807" href="#L1807">1807</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1808" href="#L1808">1808</a> <em class="jxr_javadoccomment"> * Convenience method for creating an {@link ArrayList} and sorting it.</em>
-<a class="jxr_linenumber" name="L1809" href="#L1809">1809</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1810" href="#L1810">1810</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1811" href="#L1811">1811</a> <em class="jxr_javadoccomment"> * @param values The values to initialize the list with.</em>
-<a class="jxr_linenumber" name="L1812" href="#L1812">1812</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
-<a class="jxr_linenumber" name="L1813" href="#L1813">1813</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1814" href="#L1814">1814</a> @SuppressWarnings({ <span class="jxr_string">"rawtypes"</span>, <span class="jxr_string">"unchecked"</span> })
-<a class="jxr_linenumber" name="L1815" href="#L1815">1815</a> @SafeVarargs
-<a class="jxr_linenumber" name="L1816" href="#L1816">1816</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> sortedList(E...values) {
-<a class="jxr_linenumber" name="L1817" href="#L1817">1817</a> List<E> l = list(values);
-<a class="jxr_linenumber" name="L1818" href="#L1818">1818</a> Collections.sort((List<Comparable>)l);
-<a class="jxr_linenumber" name="L1819" href="#L1819">1819</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L1820" href="#L1820">1820</a> }
-<a class="jxr_linenumber" name="L1821" href="#L1821">1821</a>
-<a class="jxr_linenumber" name="L1822" href="#L1822">1822</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1823" href="#L1823">1823</a> <em class="jxr_javadoccomment"> * Convenience method for creating a {@link TreeMap}.</em>
-<a class="jxr_linenumber" name="L1824" href="#L1824">1824</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1825" href="#L1825">1825</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
-<a class="jxr_linenumber" name="L1826" href="#L1826">1826</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
-<a class="jxr_linenumber" name="L1827" href="#L1827">1827</a> <em class="jxr_javadoccomment"> * @return A new modifiable set.</em>
-<a class="jxr_linenumber" name="L1828" href="#L1828">1828</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1829" href="#L1829">1829</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> TreeMap<K,V> sortedMap() {
-<a class="jxr_linenumber" name="L1830" href="#L1830">1830</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> TreeMap<>();
-<a class="jxr_linenumber" name="L1831" href="#L1831">1831</a> }
-<a class="jxr_linenumber" name="L1832" href="#L1832">1832</a>
-<a class="jxr_linenumber" name="L1833" href="#L1833">1833</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1834" href="#L1834">1834</a> <em class="jxr_javadoccomment"> * Convenience method for creating a {@link TreeSet}.</em>
-<a class="jxr_linenumber" name="L1835" href="#L1835">1835</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1836" href="#L1836">1836</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1837" href="#L1837">1837</a> <em class="jxr_javadoccomment"> * @param values The values to initialize the set with.</em>
-<a class="jxr_linenumber" name="L1838" href="#L1838">1838</a> <em class="jxr_javadoccomment"> * @return A new modifiable set.</em>
-<a class="jxr_linenumber" name="L1839" href="#L1839">1839</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1840" href="#L1840">1840</a> @SafeVarargs
-<a class="jxr_linenumber" name="L1841" href="#L1841">1841</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> TreeSet<E> sortedSet(E...values) {
-<a class="jxr_linenumber" name="L1842" href="#L1842">1842</a> assertArgNotNull(<span class="jxr_string">"values"</span>, values);
-<a class="jxr_linenumber" name="L1843" href="#L1843">1843</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> TreeSet<E>();
-<a class="jxr_linenumber" name="L1844" href="#L1844">1844</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> v : values)
-<a class="jxr_linenumber" name="L1845" href="#L1845">1845</a> l.add(v);
-<a class="jxr_linenumber" name="L1846" href="#L1846">1846</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L1847" href="#L1847">1847</a> }
-<a class="jxr_linenumber" name="L1848" href="#L1848">1848</a>
-<a class="jxr_linenumber" name="L1849" href="#L1849">1849</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1850" href="#L1850">1850</a> <em class="jxr_javadoccomment"> * Returns a stream of the specified array.</em>
-<a class="jxr_linenumber" name="L1851" href="#L1851">1851</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1852" href="#L1852">1852</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L1853" href="#L1853">1853</a> <em class="jxr_javadoccomment"> * Gracefully handles <jk>null</jk> arrays by returning an empty stream.</em>
+<a class="jxr_linenumber" name="L1720" href="#L1720">1720</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L1721" href="#L1721">1721</a> <em class="jxr_javadoccomment"> * This is a convenience method that returns {@link Collections#emptySet()}.</em>
+<a class="jxr_linenumber" name="L1722" href="#L1722">1722</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1723" href="#L1723">1723</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L1724" href="#L1724">1724</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L1725" href="#L1725">1725</a> <em class="jxr_javadoccomment"> * Set&lt;String&gt; <jv>empty</jv> = CollectionUtils.<jsf>sete</jsf>(); <jc>// Returns Collections.emptySet()</jc></em>
+<a class="jxr_linenumber" name="L1726" href="#L1726">1726</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L1727" href="#L1727">1727</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1728" href="#L1728">1728</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
+<a class="jxr_linenumber" name="L1729" href="#L1729">1729</a> <em class="jxr_javadoccomment"> * @return An empty immutable set.</em>
+<a class="jxr_linenumber" name="L1730" href="#L1730">1730</a> <em class="jxr_javadoccomment"> * @see Collections#emptySet()</em>
+<a class="jxr_linenumber" name="L1731" href="#L1731">1731</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1732" href="#L1732">1732</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Set<T> sete() {
+<a class="jxr_linenumber" name="L1733" href="#L1733">1733</a> <strong class="jxr_keyword">return</strong> Collections.emptySet();
+<a class="jxr_linenumber" name="L1734" href="#L1734">1734</a> }
+<a class="jxr_linenumber" name="L1735" href="#L1735">1735</a>
+<a class="jxr_linenumber" name="L1736" href="#L1736">1736</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1737" href="#L1737">1737</a> <em class="jxr_javadoccomment"> * Convenience factory for a {@link SetBuilder}.</em>
+<a class="jxr_linenumber" name="L1738" href="#L1738">1738</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1739" href="#L1739">1739</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1740" href="#L1740">1740</a> <em class="jxr_javadoccomment"> * @param type The element type.</em>
+<a class="jxr_linenumber" name="L1741" href="#L1741">1741</a> <em class="jxr_javadoccomment"> * @param converters Optional converters to use for converting values.</em>
+<a class="jxr_linenumber" name="L1742" href="#L1742">1742</a> <em class="jxr_javadoccomment"> * @return A new set builder.</em>
+<a class="jxr_linenumber" name="L1743" href="#L1743">1743</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1744" href="#L1744">1744</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> SetBuilder<E> setb(Class<E> type, Converter...converters) {
+<a class="jxr_linenumber" name="L1745" href="#L1745">1745</a> <strong class="jxr_keyword">return</strong> SetBuilder.create(type).converters(converters);
+<a class="jxr_linenumber" name="L1746" href="#L1746">1746</a> }
+<a class="jxr_linenumber" name="L1747" href="#L1747">1747</a>
+<a class="jxr_linenumber" name="L1748" href="#L1748">1748</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1749" href="#L1749">1749</a> <em class="jxr_javadoccomment"> * Convenience method for creating a {@link LinkedHashSet}.</em>
+<a class="jxr_linenumber" name="L1750" href="#L1750">1750</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1751" href="#L1751">1751</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1752" href="#L1752">1752</a> <em class="jxr_javadoccomment"> * @param elementType The element type.</em>
+<a class="jxr_linenumber" name="L1753" href="#L1753">1753</a> <em class="jxr_javadoccomment"> * @param values The values to initialize the set with.</em>
+<a class="jxr_linenumber" name="L1754" href="#L1754">1754</a> <em class="jxr_javadoccomment"> * @return A new modifiable set.</em>
+<a class="jxr_linenumber" name="L1755" href="#L1755">1755</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1756" href="#L1756">1756</a> @SafeVarargs
+<a class="jxr_linenumber" name="L1757" href="#L1757">1757</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> LinkedHashSet<E> setOf(Class<E> elementType, E...values) {
+<a class="jxr_linenumber" name="L1758" href="#L1758">1758</a> <strong class="jxr_keyword">return</strong> set(values);
+<a class="jxr_linenumber" name="L1759" href="#L1759">1759</a> }
+<a class="jxr_linenumber" name="L1760" href="#L1760">1760</a>
+<a class="jxr_linenumber" name="L1761" href="#L1761">1761</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1762" href="#L1762">1762</a> <em class="jxr_javadoccomment"> * Shortcut for creating a short array.</em>
+<a class="jxr_linenumber" name="L1763" href="#L1763">1763</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1764" href="#L1764">1764</a> <em class="jxr_javadoccomment"> * <p>Accepts int values and converts them to shorts, eliminating the need for explicit short casts.</p></em>
+<a class="jxr_linenumber" name="L1765" href="#L1765">1765</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1766" href="#L1766">1766</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L1767" href="#L1767">1767</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L1768" href="#L1768">1768</a> <em class="jxr_javadoccomment"> * <jk>short</jk>[] <jv>myArray</jv> = <jsm>shorts</jsm>(1, 2, 3);</em>
+<a class="jxr_linenumber" name="L1769" href="#L1769">1769</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L1770" href="#L1770">1770</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1771" href="#L1771">1771</a> <em class="jxr_javadoccomment"> * @param value The int values to convert to shorts. Values outside the short range (-32768 to 32767) will be truncated.</em>
+<a class="jxr_linenumber" name="L1772" href="#L1772">1772</a> <em class="jxr_javadoccomment"> * @return A new short array.</em>
+<a class="jxr_linenumber" name="L1773" href="#L1773">1773</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1774" href="#L1774">1774</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">short</strong>[] shorts(<strong class="jxr_keyword">int</strong>...value) {
+<a class="jxr_linenumber" name="L1775" href="#L1775">1775</a> <strong class="jxr_keyword">var</strong> result = <strong class="jxr_keyword">new</strong> <strong class="jxr_keyword">short</strong>[value.length];
+<a class="jxr_linenumber" name="L1776" href="#L1776">1776</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < value.length; i++) {
+<a class="jxr_linenumber" name="L1777" href="#L1777">1777</a> result[i] = (<strong class="jxr_keyword">short</strong>)value[i];
+<a class="jxr_linenumber" name="L1778" href="#L1778">1778</a> }
+<a class="jxr_linenumber" name="L1779" href="#L1779">1779</a> <strong class="jxr_keyword">return</strong> result;
+<a class="jxr_linenumber" name="L1780" href="#L1780">1780</a> }
+<a class="jxr_linenumber" name="L1781" href="#L1781">1781</a>
+<a class="jxr_linenumber" name="L1782" href="#L1782">1782</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1783" href="#L1783">1783</a> <em class="jxr_javadoccomment"> * Convenience method for creating an {@link ArrayList} and sorting it.</em>
+<a class="jxr_linenumber" name="L1784" href="#L1784">1784</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1785" href="#L1785">1785</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1786" href="#L1786">1786</a> <em class="jxr_javadoccomment"> * @param comparator The comparator to use to sort the list.</em>
+<a class="jxr_linenumber" name="L1787" href="#L1787">1787</a> <em class="jxr_javadoccomment"> * @param value The values to initialize the list with.</em>
+<a class="jxr_linenumber" name="L1788" href="#L1788">1788</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
+<a class="jxr_linenumber" name="L1789" href="#L1789">1789</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1790" href="#L1790">1790</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> ArrayList<E> sortedList(Comparator<E> comparator, Collection<E> value) {
+<a class="jxr_linenumber" name="L1791" href="#L1791">1791</a> ArrayList<E> l = toList(value);
+<a class="jxr_linenumber" name="L1792" href="#L1792">1792</a> Collections.sort(l, comparator);
+<a class="jxr_linenumber" name="L1793" href="#L1793">1793</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L1794" href="#L1794">1794</a> }
+<a class="jxr_linenumber" name="L1795" href="#L1795">1795</a>
+<a class="jxr_linenumber" name="L1796" href="#L1796">1796</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1797" href="#L1797">1797</a> <em class="jxr_javadoccomment"> * Convenience method for creating an {@link ArrayList} and sorting it.</em>
+<a class="jxr_linenumber" name="L1798" href="#L1798">1798</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1799" href="#L1799">1799</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1800" href="#L1800">1800</a> <em class="jxr_javadoccomment"> * @param comparator The comparator to use to sort the list.</em>
+<a class="jxr_linenumber" name="L1801" href="#L1801">1801</a> <em class="jxr_javadoccomment"> * @param values The values to initialize the list with.</em>
+<a class="jxr_linenumber" name="L1802" href="#L1802">1802</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
+<a class="jxr_linenumber" name="L1803" href="#L1803">1803</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1804" href="#L1804">1804</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> sortedList(Comparator<E> comparator, E[] values) {
+<a class="jxr_linenumber" name="L1805" href="#L1805">1805</a> List<E> l = list(values);
+<a class="jxr_linenumber" name="L1806" href="#L1806">1806</a> Collections.sort(l, comparator);
+<a class="jxr_linenumber" name="L1807" href="#L1807">1807</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L1808" href="#L1808">1808</a> }
+<a class="jxr_linenumber" name="L1809" href="#L1809">1809</a>
+<a class="jxr_linenumber" name="L1810" href="#L1810">1810</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1811" href="#L1811">1811</a> <em class="jxr_javadoccomment"> * Convenience method for creating an {@link ArrayList} and sorting it.</em>
+<a class="jxr_linenumber" name="L1812" href="#L1812">1812</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1813" href="#L1813">1813</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1814" href="#L1814">1814</a> <em class="jxr_javadoccomment"> * @param values The values to initialize the list with.</em>
+<a class="jxr_linenumber" name="L1815" href="#L1815">1815</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
+<a class="jxr_linenumber" name="L1816" href="#L1816">1816</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1817" href="#L1817">1817</a> @SuppressWarnings({ <span class="jxr_string">"rawtypes"</span>, <span class="jxr_string">"unchecked"</span> })
+<a class="jxr_linenumber" name="L1818" href="#L1818">1818</a> @SafeVarargs
+<a class="jxr_linenumber" name="L1819" href="#L1819">1819</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> sortedList(E...values) {
+<a class="jxr_linenumber" name="L1820" href="#L1820">1820</a> List<E> l = list(values);
+<a class="jxr_linenumber" name="L1821" href="#L1821">1821</a> Collections.sort((List<Comparable>)l);
+<a class="jxr_linenumber" name="L1822" href="#L1822">1822</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L1823" href="#L1823">1823</a> }
+<a class="jxr_linenumber" name="L1824" href="#L1824">1824</a>
+<a class="jxr_linenumber" name="L1825" href="#L1825">1825</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1826" href="#L1826">1826</a> <em class="jxr_javadoccomment"> * Convenience method for creating a {@link TreeMap}.</em>
+<a class="jxr_linenumber" name="L1827" href="#L1827">1827</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1828" href="#L1828">1828</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
+<a class="jxr_linenumber" name="L1829" href="#L1829">1829</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
+<a class="jxr_linenumber" name="L1830" href="#L1830">1830</a> <em class="jxr_javadoccomment"> * @return A new modifiable set.</em>
+<a class="jxr_linenumber" name="L1831" href="#L1831">1831</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1832" href="#L1832">1832</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> TreeMap<K,V> sortedMap() {
+<a class="jxr_linenumber" name="L1833" href="#L1833">1833</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> TreeMap<>();
+<a class="jxr_linenumber" name="L1834" href="#L1834">1834</a> }
+<a class="jxr_linenumber" name="L1835" href="#L1835">1835</a>
+<a class="jxr_linenumber" name="L1836" href="#L1836">1836</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1837" href="#L1837">1837</a> <em class="jxr_javadoccomment"> * Convenience method for creating a {@link TreeSet}.</em>
+<a class="jxr_linenumber" name="L1838" href="#L1838">1838</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1839" href="#L1839">1839</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1840" href="#L1840">1840</a> <em class="jxr_javadoccomment"> * @param values The values to initialize the set with.</em>
+<a class="jxr_linenumber" name="L1841" href="#L1841">1841</a> <em class="jxr_javadoccomment"> * @return A new modifiable set.</em>
+<a class="jxr_linenumber" name="L1842" href="#L1842">1842</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1843" href="#L1843">1843</a> @SafeVarargs
+<a class="jxr_linenumber" name="L1844" href="#L1844">1844</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> TreeSet<E> sortedSet(E...values) {
+<a class="jxr_linenumber" name="L1845" href="#L1845">1845</a> assertArgNotNull(<span class="jxr_string">"values"</span>, values);
+<a class="jxr_linenumber" name="L1846" href="#L1846">1846</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> TreeSet<E>();
+<a class="jxr_linenumber" name="L1847" href="#L1847">1847</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> v : values)
+<a class="jxr_linenumber" name="L1848" href="#L1848">1848</a> l.add(v);
+<a class="jxr_linenumber" name="L1849" href="#L1849">1849</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L1850" href="#L1850">1850</a> }
+<a class="jxr_linenumber" name="L1851" href="#L1851">1851</a>
+<a class="jxr_linenumber" name="L1852" href="#L1852">1852</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1853" href="#L1853">1853</a> <em class="jxr_javadoccomment"> * Returns a stream of the specified array.</em>
<a class="jxr_linenumber" name="L1854" href="#L1854">1854</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1855" href="#L1855">1855</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
-<a class="jxr_linenumber" name="L1856" href="#L1856">1856</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L1857" href="#L1857">1857</a> <em class="jxr_javadoccomment"> * String[] <jv>array</jv> = {<js>"a"</js>, <js>"b"</js>, <js>"c"</js>};</em>
-<a class="jxr_linenumber" name="L1858" href="#L1858">1858</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1859" href="#L1859">1859</a> <em class="jxr_javadoccomment"> * <jc>// Prints "a", "b", "c"</jc></em>
-<a class="jxr_linenumber" name="L1860" href="#L1860">1860</a> <em class="jxr_javadoccomment"> * <jsm>stream</jsm>(<jv>array</jv>).forEach(System.<jk>out</jk>::println);</em>
+<a class="jxr_linenumber" name="L1855" href="#L1855">1855</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L1856" href="#L1856">1856</a> <em class="jxr_javadoccomment"> * Gracefully handles <jk>null</jk> arrays by returning an empty stream.</em>
+<a class="jxr_linenumber" name="L1857" href="#L1857">1857</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1858" href="#L1858">1858</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Example:</h5></em>
+<a class="jxr_linenumber" name="L1859" href="#L1859">1859</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L1860" href="#L1860">1860</a> <em class="jxr_javadoccomment"> * String[] <jv>array</jv> = {<js>"a"</js>, <js>"b"</js>, <js>"c"</js>};</em>
<a class="jxr_linenumber" name="L1861" href="#L1861">1861</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1862" href="#L1862">1862</a> <em class="jxr_javadoccomment"> * <jc>// Handles null gracefully - returns empty stream</jc></em>
-<a class="jxr_linenumber" name="L1863" href="#L1863">1863</a> <em class="jxr_javadoccomment"> * <jsm>stream</jsm>(<jk>null</jk>).forEach(System.<jk>out</jk>::println); <jc>// Prints nothing</jc></em>
-<a class="jxr_linenumber" name="L1864" href="#L1864">1864</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L1865" href="#L1865">1865</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1866" href="#L1866">1866</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
-<a class="jxr_linenumber" name="L1867" href="#L1867">1867</a> <em class="jxr_javadoccomment"> * @param array The array to stream. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L1868" href="#L1868">1868</a> <em class="jxr_javadoccomment"> * @return A stream of the array elements, or an empty stream if the array is <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L1869" href="#L1869">1869</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1870" href="#L1870">1870</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Stream<T> stream(T[] array) {
-<a class="jxr_linenumber" name="L1871" href="#L1871">1871</a> <strong class="jxr_keyword">return</strong> array == <strong class="jxr_keyword">null</strong> ? Stream.empty() : Arrays.stream(array);
-<a class="jxr_linenumber" name="L1872" href="#L1872">1872</a> }
-<a class="jxr_linenumber" name="L1873" href="#L1873">1873</a>
-<a class="jxr_linenumber" name="L1874" href="#L1874">1874</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1875" href="#L1875">1875</a> <em class="jxr_javadoccomment"> * Wraps the specified list in {@link Collections#unmodifiableList(List)}.</em>
-<a class="jxr_linenumber" name="L1876" href="#L1876">1876</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1877" href="#L1877">1877</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1878" href="#L1878">1878</a> <em class="jxr_javadoccomment"> * @param value The list to wrap.</em>
-<a class="jxr_linenumber" name="L1879" href="#L1879">1879</a> <em class="jxr_javadoccomment"> * @return The wrapped list.</em>
-<a class="jxr_linenumber" name="L1880" href="#L1880">1880</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1881" href="#L1881">1881</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> synced(List<E> value) {
-<a class="jxr_linenumber" name="L1882" href="#L1882">1882</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.synchronizedList(value);
-<a class="jxr_linenumber" name="L1883" href="#L1883">1883</a> }
-<a class="jxr_linenumber" name="L1884" href="#L1884">1884</a>
-<a class="jxr_linenumber" name="L1885" href="#L1885">1885</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1886" href="#L1886">1886</a> <em class="jxr_javadoccomment"> * Wraps the specified map in {@link Collections#unmodifiableMap(Map)}.</em>
-<a class="jxr_linenumber" name="L1887" href="#L1887">1887</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1888" href="#L1888">1888</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
-<a class="jxr_linenumber" name="L1889" href="#L1889">1889</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
-<a class="jxr_linenumber" name="L1890" href="#L1890">1890</a> <em class="jxr_javadoccomment"> * @param value The map to wrap.</em>
-<a class="jxr_linenumber" name="L1891" href="#L1891">1891</a> <em class="jxr_javadoccomment"> * @return The wrapped map.</em>
-<a class="jxr_linenumber" name="L1892" href="#L1892">1892</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1893" href="#L1893">1893</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> Map<K,V> synced(Map<K,V> value) {
-<a class="jxr_linenumber" name="L1894" href="#L1894">1894</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.synchronizedMap(value);
-<a class="jxr_linenumber" name="L1895" href="#L1895">1895</a> }
-<a class="jxr_linenumber" name="L1896" href="#L1896">1896</a>
-<a class="jxr_linenumber" name="L1897" href="#L1897">1897</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1898" href="#L1898">1898</a> <em class="jxr_javadoccomment"> * Wraps the specified set in {@link Collections#unmodifiableSet(Set)}.</em>
-<a class="jxr_linenumber" name="L1899" href="#L1899">1899</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1900" href="#L1900">1900</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1901" href="#L1901">1901</a> <em class="jxr_javadoccomment"> * @param value The set to wrap.</em>
-<a class="jxr_linenumber" name="L1902" href="#L1902">1902</a> <em class="jxr_javadoccomment"> * @return The wrapped set.</em>
-<a class="jxr_linenumber" name="L1903" href="#L1903">1903</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1904" href="#L1904">1904</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> Set<E> synced(Set<E> value) {
-<a class="jxr_linenumber" name="L1905" href="#L1905">1905</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.synchronizedSet(value);
-<a class="jxr_linenumber" name="L1906" href="#L1906">1906</a> }
-<a class="jxr_linenumber" name="L1907" href="#L1907">1907</a>
-<a class="jxr_linenumber" name="L1908" href="#L1908">1908</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1909" href="#L1909">1909</a> <em class="jxr_javadoccomment"> * Converts the specified collection to an array.</em>
-<a class="jxr_linenumber" name="L1910" href="#L1910">1910</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1911" href="#L1911">1911</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L1912" href="#L1912">1912</a> <em class="jxr_javadoccomment"> * Works on both object and primitive arrays.</em>
+<a class="jxr_linenumber" name="L1862" href="#L1862">1862</a> <em class="jxr_javadoccomment"> * <jc>// Prints "a", "b", "c"</jc></em>
+<a class="jxr_linenumber" name="L1863" href="#L1863">1863</a> <em class="jxr_javadoccomment"> * <jsm>stream</jsm>(<jv>array</jv>).forEach(System.<jk>out</jk>::println);</em>
+<a class="jxr_linenumber" name="L1864" href="#L1864">1864</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1865" href="#L1865">1865</a> <em class="jxr_javadoccomment"> * <jc>// Handles null gracefully - returns empty stream</jc></em>
+<a class="jxr_linenumber" name="L1866" href="#L1866">1866</a> <em class="jxr_javadoccomment"> * <jsm>stream</jsm>(<jk>null</jk>).forEach(System.<jk>out</jk>::println); <jc>// Prints nothing</jc></em>
+<a class="jxr_linenumber" name="L1867" href="#L1867">1867</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L1868" href="#L1868">1868</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1869" href="#L1869">1869</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
+<a class="jxr_linenumber" name="L1870" href="#L1870">1870</a> <em class="jxr_javadoccomment"> * @param array The array to stream. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L1871" href="#L1871">1871</a> <em class="jxr_javadoccomment"> * @return A stream of the array elements, or an empty stream if the array is <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L1872" href="#L1872">1872</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1873" href="#L1873">1873</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Stream<T> stream(T[] array) {
+<a class="jxr_linenumber" name="L1874" href="#L1874">1874</a> <strong class="jxr_keyword">return</strong> array == <strong class="jxr_keyword">null</strong> ? Stream.empty() : Arrays.stream(array);
+<a class="jxr_linenumber" name="L1875" href="#L1875">1875</a> }
+<a class="jxr_linenumber" name="L1876" href="#L1876">1876</a>
+<a class="jxr_linenumber" name="L1877" href="#L1877">1877</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1878" href="#L1878">1878</a> <em class="jxr_javadoccomment"> * Wraps the specified list in {@link Collections#unmodifiableList(List)}.</em>
+<a class="jxr_linenumber" name="L1879" href="#L1879">1879</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1880" href="#L1880">1880</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1881" href="#L1881">1881</a> <em class="jxr_javadoccomment"> * @param value The list to wrap.</em>
+<a class="jxr_linenumber" name="L1882" href="#L1882">1882</a> <em class="jxr_javadoccomment"> * @return The wrapped list.</em>
+<a class="jxr_linenumber" name="L1883" href="#L1883">1883</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1884" href="#L1884">1884</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> synced(List<E> value) {
+<a class="jxr_linenumber" name="L1885" href="#L1885">1885</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.synchronizedList(value);
+<a class="jxr_linenumber" name="L1886" href="#L1886">1886</a> }
+<a class="jxr_linenumber" name="L1887" href="#L1887">1887</a>
+<a class="jxr_linenumber" name="L1888" href="#L1888">1888</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1889" href="#L1889">1889</a> <em class="jxr_javadoccomment"> * Wraps the specified map in {@link Collections#unmodifiableMap(Map)}.</em>
+<a class="jxr_linenumber" name="L1890" href="#L1890">1890</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1891" href="#L1891">1891</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
+<a class="jxr_linenumber" name="L1892" href="#L1892">1892</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
+<a class="jxr_linenumber" name="L1893" href="#L1893">1893</a> <em class="jxr_javadoccomment"> * @param value The map to wrap.</em>
+<a class="jxr_linenumber" name="L1894" href="#L1894">1894</a> <em class="jxr_javadoccomment"> * @return The wrapped map.</em>
+<a class="jxr_linenumber" name="L1895" href="#L1895">1895</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1896" href="#L1896">1896</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> Map<K,V> synced(Map<K,V> value) {
+<a class="jxr_linenumber" name="L1897" href="#L1897">1897</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.synchronizedMap(value);
+<a class="jxr_linenumber" name="L1898" href="#L1898">1898</a> }
+<a class="jxr_linenumber" name="L1899" href="#L1899">1899</a>
+<a class="jxr_linenumber" name="L1900" href="#L1900">1900</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1901" href="#L1901">1901</a> <em class="jxr_javadoccomment"> * Wraps the specified set in {@link Collections#unmodifiableSet(Set)}.</em>
+<a class="jxr_linenumber" name="L1902" href="#L1902">1902</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1903" href="#L1903">1903</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1904" href="#L1904">1904</a> <em class="jxr_javadoccomment"> * @param value The set to wrap.</em>
+<a class="jxr_linenumber" name="L1905" href="#L1905">1905</a> <em class="jxr_javadoccomment"> * @return The wrapped set.</em>
+<a class="jxr_linenumber" name="L1906" href="#L1906">1906</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1907" href="#L1907">1907</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> Set<E> synced(Set<E> value) {
+<a class="jxr_linenumber" name="L1908" href="#L1908">1908</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.synchronizedSet(value);
+<a class="jxr_linenumber" name="L1909" href="#L1909">1909</a> }
+<a class="jxr_linenumber" name="L1910" href="#L1910">1910</a>
+<a class="jxr_linenumber" name="L1911" href="#L1911">1911</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1912" href="#L1912">1912</a> <em class="jxr_javadoccomment"> * Converts the specified collection to an array.</em>
<a class="jxr_linenumber" name="L1913" href="#L1913">1913</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1914" href="#L1914">1914</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1915" href="#L1915">1915</a> <em class="jxr_javadoccomment"> * @param c The collection to convert to an array.</em>
-<a class="jxr_linenumber" name="L1916" href="#L1916">1916</a> <em class="jxr_javadoccomment"> * @param elementType The component type of the collection.</em>
-<a class="jxr_linenumber" name="L1917" href="#L1917">1917</a> <em class="jxr_javadoccomment"> * @return A new array.</em>
-<a class="jxr_linenumber" name="L1918" href="#L1918">1918</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1919" href="#L1919">1919</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> Object toArray(Collection<?> c, Class<E> elementType) {
-<a class="jxr_linenumber" name="L1920" href="#L1920">1920</a> <strong class="jxr_keyword">var</strong> a = Array.newInstance(elementType, c.size());
-<a class="jxr_linenumber" name="L1921" href="#L1921">1921</a> Iterator<?> it = c.iterator();
-<a class="jxr_linenumber" name="L1922" href="#L1922">1922</a> <strong class="jxr_keyword">int</strong> i = 0;
-<a class="jxr_linenumber" name="L1923" href="#L1923">1923</a> <strong class="jxr_keyword">while</strong> (it.hasNext())
-<a class="jxr_linenumber" name="L1924" href="#L1924">1924</a> Array.set(a, i++, it.next());
-<a class="jxr_linenumber" name="L1925" href="#L1925">1925</a> <strong class="jxr_keyword">return</strong> a;
-<a class="jxr_linenumber" name="L1926" href="#L1926">1926</a> }
-<a class="jxr_linenumber" name="L1927" href="#L1927">1927</a>
-<a class="jxr_linenumber" name="L1928" href="#L1928">1928</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1929" href="#L1929">1929</a> <em class="jxr_javadoccomment"> * Creates an {@link ArrayList} copy from a collection.</em>
-<a class="jxr_linenumber" name="L1930" href="#L1930">1930</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1931" href="#L1931">1931</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1932" href="#L1932">1932</a> <em class="jxr_javadoccomment"> * @param value The collection to copy from.</em>
-<a class="jxr_linenumber" name="L1933" href="#L1933">1933</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
-<a class="jxr_linenumber" name="L1934" href="#L1934">1934</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1935" href="#L1935">1935</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> ArrayList<E> toList(Collection<E> value) {
-<a class="jxr_linenumber" name="L1936" href="#L1936">1936</a> <strong class="jxr_keyword">return</strong> toList(value, false);
-<a class="jxr_linenumber" name="L1937" href="#L1937">1937</a> }
-<a class="jxr_linenumber" name="L1938" href="#L1938">1938</a>
-<a class="jxr_linenumber" name="L1939" href="#L1939">1939</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1940" href="#L1940">1940</a> <em class="jxr_javadoccomment"> * Creates an {@link ArrayList} copy from a collection.</em>
-<a class="jxr_linenumber" name="L1941" href="#L1941">1941</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1942" href="#L1942">1942</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L1943" href="#L1943">1943</a> <em class="jxr_javadoccomment"> * @param value The collection to copy from.</em>
-<a class="jxr_linenumber" name="L1944" href="#L1944">1944</a> <em class="jxr_javadoccomment"> * @param nullIfEmpty If <jk>true</jk> will return <jk>null</jk> if the collection is empty.</em>
-<a class="jxr_linenumber" name="L1945" href="#L1945">1945</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
-<a class="jxr_linenumber" name="L1946" href="#L1946">1946</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L1947" href="#L1947">1947</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> ArrayList<E> toList(Collection<E> value, <strong class="jxr_keyword">boolean</strong> nullIfEmpty) {
-<a class="jxr_linenumber" name="L1948" href="#L1948">1948</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong> || (nullIfEmpty && value.isEmpty()))
-<a class="jxr_linenumber" name="L1949" href="#L1949">1949</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L1950" href="#L1950">1950</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> ArrayList<E>();
-<a class="jxr_linenumber" name="L1951" href="#L1951">1951</a> value.forEach(x -> l.add(x));
-<a class="jxr_linenumber" name="L1952" href="#L1952">1952</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L1953" href="#L1953">1953</a> }
-<a class="jxr_linenumber" name="L1954" href="#L1954">1954</a>
-<a class="jxr_linenumber" name="L1955" href="#L1955">1955</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L1956" href="#L1956">1956</a> <em class="jxr_javadoccomment"> * Converts various collection-like objects to a {@link List}.</em>
-<a class="jxr_linenumber" name="L1957" href="#L1957">1957</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1958" href="#L1958">1958</a> <em class="jxr_javadoccomment"> * <p>This utility method enables testing of any collection-like object by converting it to a List that can be</em>
-<a class="jxr_linenumber" name="L1959" href="#L1959">1959</a> <em class="jxr_javadoccomment"> * passed to methods such as TestUtils.assertList().</p></em>
+<a class="jxr_linenumber" name="L1914" href="#L1914">1914</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L1915" href="#L1915">1915</a> <em class="jxr_javadoccomment"> * Works on both object and primitive arrays.</em>
+<a class="jxr_linenumber" name="L1916" href="#L1916">1916</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1917" href="#L1917">1917</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1918" href="#L1918">1918</a> <em class="jxr_javadoccomment"> * @param c The collection to convert to an array.</em>
+<a class="jxr_linenumber" name="L1919" href="#L1919">1919</a> <em class="jxr_javadoccomment"> * @param elementType The component type of the collection.</em>
+<a class="jxr_linenumber" name="L1920" href="#L1920">1920</a> <em class="jxr_javadoccomment"> * @return A new array.</em>
+<a class="jxr_linenumber" name="L1921" href="#L1921">1921</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1922" href="#L1922">1922</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> Object toArray(Collection<?> c, Class<E> elementType) {
+<a class="jxr_linenumber" name="L1923" href="#L1923">1923</a> <strong class="jxr_keyword">var</strong> a = Array.newInstance(elementType, c.size());
+<a class="jxr_linenumber" name="L1924" href="#L1924">1924</a> Iterator<?> it = c.iterator();
+<a class="jxr_linenumber" name="L1925" href="#L1925">1925</a> <strong class="jxr_keyword">int</strong> i = 0;
+<a class="jxr_linenumber" name="L1926" href="#L1926">1926</a> <strong class="jxr_keyword">while</strong> (it.hasNext())
+<a class="jxr_linenumber" name="L1927" href="#L1927">1927</a> Array.set(a, i++, it.next());
+<a class="jxr_linenumber" name="L1928" href="#L1928">1928</a> <strong class="jxr_keyword">return</strong> a;
+<a class="jxr_linenumber" name="L1929" href="#L1929">1929</a> }
+<a class="jxr_linenumber" name="L1930" href="#L1930">1930</a>
+<a class="jxr_linenumber" name="L1931" href="#L1931">1931</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1932" href="#L1932">1932</a> <em class="jxr_javadoccomment"> * Creates an {@link ArrayList} copy from a collection.</em>
+<a class="jxr_linenumber" name="L1933" href="#L1933">1933</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1934" href="#L1934">1934</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1935" href="#L1935">1935</a> <em class="jxr_javadoccomment"> * @param value The collection to copy from.</em>
+<a class="jxr_linenumber" name="L1936" href="#L1936">1936</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
+<a class="jxr_linenumber" name="L1937" href="#L1937">1937</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1938" href="#L1938">1938</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> ArrayList<E> toList(Collection<E> value) {
+<a class="jxr_linenumber" name="L1939" href="#L1939">1939</a> <strong class="jxr_keyword">return</strong> toList(value, false);
+<a class="jxr_linenumber" name="L1940" href="#L1940">1940</a> }
+<a class="jxr_linenumber" name="L1941" href="#L1941">1941</a>
+<a class="jxr_linenumber" name="L1942" href="#L1942">1942</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1943" href="#L1943">1943</a> <em class="jxr_javadoccomment"> * Creates an {@link ArrayList} copy from a collection.</em>
+<a class="jxr_linenumber" name="L1944" href="#L1944">1944</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1945" href="#L1945">1945</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L1946" href="#L1946">1946</a> <em class="jxr_javadoccomment"> * @param value The collection to copy from.</em>
+<a class="jxr_linenumber" name="L1947" href="#L1947">1947</a> <em class="jxr_javadoccomment"> * @param nullIfEmpty If <jk>true</jk> will return <jk>null</jk> if the collection is empty.</em>
+<a class="jxr_linenumber" name="L1948" href="#L1948">1948</a> <em class="jxr_javadoccomment"> * @return A new modifiable list.</em>
+<a class="jxr_linenumber" name="L1949" href="#L1949">1949</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L1950" href="#L1950">1950</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> ArrayList<E> toList(Collection<E> value, <strong class="jxr_keyword">boolean</strong> nullIfEmpty) {
+<a class="jxr_linenumber" name="L1951" href="#L1951">1951</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong> || (nullIfEmpty && value.isEmpty()))
+<a class="jxr_linenumber" name="L1952" href="#L1952">1952</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L1953" href="#L1953">1953</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> ArrayList<E>();
+<a class="jxr_linenumber" name="L1954" href="#L1954">1954</a> value.forEach(x -> l.add(x));
+<a class="jxr_linenumber" name="L1955" href="#L1955">1955</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L1956" href="#L1956">1956</a> }
+<a class="jxr_linenumber" name="L1957" href="#L1957">1957</a>
+<a class="jxr_linenumber" name="L1958" href="#L1958">1958</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L1959" href="#L1959">1959</a> <em class="jxr_javadoccomment"> * Converts various collection-like objects to a {@link List}.</em>
<a class="jxr_linenumber" name="L1960" href="#L1960">1960</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1961" href="#L1961">1961</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Supported Input Types:</h5></em>
-<a class="jxr_linenumber" name="L1962" href="#L1962">1962</a> <em class="jxr_javadoccomment"> * <ul></em>
-<a class="jxr_linenumber" name="L1963" href="#L1963">1963</a> <em class="jxr_javadoccomment"> * <li><b>List:</b> Returns the input unchanged</li></em>
-<a class="jxr_linenumber" name="L1964" href="#L1964">1964</a> <em class="jxr_javadoccomment"> * <li><b>Iterable:</b> Any collection, set, queue, etc. (converted to List preserving order)</li></em>
-<a class="jxr_linenumber" name="L1965" href="#L1965">1965</a> <em class="jxr_javadoccomment"> * <li><b>Iterator:</b> Converts iterator contents to List</li></em>
-<a class="jxr_linenumber" name="L1966" href="#L1966">1966</a> <em class="jxr_javadoccomment"> * <li><b>Enumeration:</b> Converts enumeration contents to List</li></em>
-<a class="jxr_linenumber" name="L1967" href="#L1967">1967</a> <em class="jxr_javadoccomment"> * <li><b>Stream:</b> Converts stream contents to List (stream is consumed)</li></em>
-<a class="jxr_linenumber" name="L1968" href="#L1968">1968</a> <em class="jxr_javadoccomment"> * <li><b>Map:</b> Converts map entries to List of Map.Entry objects</li></em>
-<a class="jxr_linenumber" name="L1969" href="#L1969">1969</a> <em class="jxr_javadoccomment"> * <li><b>Array:</b> Converts any array type (including primitive arrays) to List</li></em>
-<a class="jxr_linenumber" name="L1970" href="#L1970">1970</a> <em class="jxr_javadoccomment"> * </ul></em>
-<a class="jxr_linenumber" name="L1971" href="#L1971">1971</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1972" href="#L1972">1972</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Usage Examples:</h5></em>
-<a class="jxr_linenumber" name="L1973" href="#L1973">1973</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
-<a class="jxr_linenumber" name="L1974" href="#L1974">1974</a> <em class="jxr_javadoccomment"> * <jc>// Test a Set</jc></em>
-<a class="jxr_linenumber" name="L1975" href="#L1975">1975</a> <em class="jxr_javadoccomment"> * Set&lt;String&gt; <jv>mySet</jv> = Set.of(<js>"a"</js>, <js>"b"</js>, <js>"c"</js>);</em>
-<a class="jxr_linenumber" name="L1976" href="#L1976">1976</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>mySet</jv>), <js>"a"</js>, <js>"b"</js>, <js>"c"</js>);</em>
-<a class="jxr_linenumber" name="L1977" href="#L1977">1977</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1978" href="#L1978">1978</a> <em class="jxr_javadoccomment"> * <jc>// Test an array</jc></em>
-<a class="jxr_linenumber" name="L1979" href="#L1979">1979</a> <em class="jxr_javadoccomment"> * String[] <jv>myArray</jv> = {<js>"x"</js>, <js>"y"</js>, <js>"z"</js>};</em>
-<a class="jxr_linenumber" name="L1980" href="#L1980">1980</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>myArray</jv>), <js>"x"</js>, <js>"y"</js>, <js>"z"</js>);</em>
-<a class="jxr_linenumber" name="L1981" href="#L1981">1981</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1982" href="#L1982">1982</a> <em class="jxr_javadoccomment"> * <jc>// Test a primitive array</jc></em>
-<a class="jxr_linenumber" name="L1983" href="#L1983">1983</a> <em class="jxr_javadoccomment"> * <jk>int</jk>[] <jv>numbers</jv> = {1, 2, 3};</em>
-<a class="jxr_linenumber" name="L1984" href="#L1984">1984</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>numbers</jv>), <js>"1"</js>, <js>"2"</js>, <js>"3"</js>);</em>
-<a class="jxr_linenumber" name="L1985" href="#L1985">1985</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1986" href="#L1986">1986</a> <em class="jxr_javadoccomment"> * <jc>// Test a Stream</jc></em>
-<a class="jxr_linenumber" name="L1987" href="#L1987">1987</a> <em class="jxr_javadoccomment"> * Stream&lt;String&gt; <jv>myStream</jv> = Stream.of(<js>"foo"</js>, <js>"bar"</js>);</em>
-<a class="jxr_linenumber" name="L1988" href="#L1988">1988</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>myStream</jv>), <js>"foo"</js>, <js>"bar"</js>);</em>
-<a class="jxr_linenumber" name="L1989" href="#L1989">1989</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1990" href="#L1990">1990</a> <em class="jxr_javadoccomment"> * <jc>// Test a Map (converted to entries)</jc></em>
-<a class="jxr_linenumber" name="L1991" href="#L1991">1991</a> <em class="jxr_javadoccomment"> * Map&lt;String,Integer&gt; <jv>myMap</jv> = Map.of(<js>"a"</js>, 1, <js>"b"</js>, 2);</em>
-<a class="jxr_linenumber" name="L1992" href="#L1992">1992</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>myMap</jv>), <js>"a=1"</js>, <js>"b=2"</js>);</em>
-<a class="jxr_linenumber" name="L1993" href="#L1993">1993</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1994" href="#L1994">1994</a> <em class="jxr_javadoccomment"> * <jc>// Test any Iterable collection</jc></em>
-<a class="jxr_linenumber" name="L1995" href="#L1995">1995</a> <em class="jxr_javadoccomment"> * Queue&lt;String&gt; <jv>myQueue</jv> = new LinkedList&lt;&gt;(List.of(<js>"first"</js>, <js>"second"</js>));</em>
-<a class="jxr_linenumber" name="L1996" href="#L1996">1996</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>myQueue</jv>), <js>"first"</js>, <js>"second"</js>);</em>
-<a class="jxr_linenumber" name="L1997" href="#L1997">1997</a> <em class="jxr_javadoccomment"> * </p></em>
-<a class="jxr_linenumber" name="L1998" href="#L1998">1998</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L1999" href="#L1999">1999</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Integration with Testing:</h5></em>
-<a class="jxr_linenumber" name="L2000" href="#L2000">2000</a> <em class="jxr_javadoccomment"> * <p>This method is specifically designed to work with testing frameworks to provide</em>
-<a class="jxr_linenumber" name="L2001" href="#L2001">2001</a> <em class="jxr_javadoccomment"> * a unified testing approach for all collection-like types. Instead of having separate assertion methods</em>
-<a class="jxr_linenumber" name="L2002" href="#L2002">2002</a> <em class="jxr_javadoccomment"> * for arrays, sets, and other collections, you can convert them all to Lists and use standard</em>
-<a class="jxr_linenumber" name="L2003" href="#L2003">2003</a> <em class="jxr_javadoccomment"> * list assertion methods.</p></em>
-<a class="jxr_linenumber" name="L2004" href="#L2004">2004</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2005" href="#L2005">2005</a> <em class="jxr_javadoccomment"> * @param o The object to convert to a List. Must not be null and must be a supported collection-like type.</em>
-<a class="jxr_linenumber" name="L2006" href="#L2006">2006</a> <em class="jxr_javadoccomment"> * @return A {@link List} containing the elements from the input object.</em>
-<a class="jxr_linenumber" name="L2007" href="#L2007">2007</a> <em class="jxr_javadoccomment"> * @throws IllegalArgumentException if the input object cannot be converted to a List.</em>
-<a class="jxr_linenumber" name="L2008" href="#L2008">2008</a> <em class="jxr_javadoccomment"> * @see arrayToList</em>
-<a class="jxr_linenumber" name="L2009" href="#L2009">2009</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2010" href="#L2010">2010</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> List<?> toList(Object o) { <em class="jxr_comment">// NOSONAR</em>
-<a class="jxr_linenumber" name="L2011" href="#L2011">2011</a> assertArgNotNull(<span class="jxr_string">"o"</span>, o);
-<a class="jxr_linenumber" name="L2012" href="#L2012">2012</a> <strong class="jxr_keyword">if</strong> (o instanceof List<?> o2)
-<a class="jxr_linenumber" name="L2013" href="#L2013">2013</a> <strong class="jxr_keyword">return</strong> o2;
-<a class="jxr_linenumber" name="L2014" href="#L2014">2014</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterable<?> o2)
-<a class="jxr_linenumber" name="L2015" href="#L2015">2015</a> <strong class="jxr_keyword">return</strong> StreamSupport.stream(o2.spliterator(), false).toList();
-<a class="jxr_linenumber" name="L2016" href="#L2016">2016</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterator<?> o2)
-<a class="jxr_linenumber" name="L2017" href="#L2017">2017</a> <strong class="jxr_keyword">return</strong> StreamSupport.stream(Spliterators.spliteratorUnknownSize(o2, 0), false).toList();
-<a class="jxr_linenumber" name="L2018" href="#L2018">2018</a> <strong class="jxr_keyword">if</strong> (o instanceof Enumeration<?> o2)
-<a class="jxr_linenumber" name="L2019" href="#L2019">2019</a> <strong class="jxr_keyword">return</strong> Collections.list(o2);
-<a class="jxr_linenumber" name="L2020" href="#L2020">2020</a> <strong class="jxr_keyword">if</strong> (o instanceof Stream<?> o2)
-<a class="jxr_linenumber" name="L2021" href="#L2021">2021</a> <strong class="jxr_keyword">return</strong> o2.toList();
-<a class="jxr_linenumber" name="L2022" href="#L2022">2022</a> <strong class="jxr_keyword">if</strong> (o instanceof Map<?,?> o2)
-<a class="jxr_linenumber" name="L2023" href="#L2023">2023</a> <strong class="jxr_keyword">return</strong> toList(o2.entrySet());
-<a class="jxr_linenumber" name="L2024" href="#L2024">2024</a> <strong class="jxr_keyword">if</strong> (o instanceof Optional<?> o2)
-<a class="jxr_linenumber" name="L2025" href="#L2025">2025</a> <strong class="jxr_keyword">return</strong> o2.isEmpty() ? Collections.emptyList() : Collections.singletonList(o2.get());
-<a class="jxr_linenumber" name="L2026" href="#L2026">2026</a> <strong class="jxr_keyword">if</strong> (isArray(o))
-<a class="jxr_linenumber" name="L2027" href="#L2027">2027</a> <strong class="jxr_keyword">return</strong> arrayToList(o);
-<a class="jxr_linenumber" name="L2028" href="#L2028">2028</a> <strong class="jxr_keyword">throw</strong> rex(<span class="jxr_string">"Could not convert object of type {0} to a list"</span>, cn(o));
-<a class="jxr_linenumber" name="L2029" href="#L2029">2029</a> }
-<a class="jxr_linenumber" name="L2030" href="#L2030">2030</a>
-<a class="jxr_linenumber" name="L2031" href="#L2031">2031</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2032" href="#L2032">2032</a> <em class="jxr_javadoccomment"> * Converts the specified array to an <c>ArrayList</c></em>
-<a class="jxr_linenumber" name="L2033" href="#L2033">2033</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2034" href="#L2034">2034</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L2035" href="#L2035">2035</a> <em class="jxr_javadoccomment"> * @param array The array to convert.</em>
-<a class="jxr_linenumber" name="L2036" href="#L2036">2036</a> <em class="jxr_javadoccomment"> * @param elementType</em>
-<a class="jxr_linenumber" name="L2037" href="#L2037">2037</a> <em class="jxr_javadoccomment"> * The type of objects in the array.</em>
-<a class="jxr_linenumber" name="L2038" href="#L2038">2038</a> <em class="jxr_javadoccomment"> * It must match the actual component type in the array.</em>
-<a class="jxr_linenumber" name="L2039" href="#L2039">2039</a> <em class="jxr_javadoccomment"> * @return A new {@link ArrayList}</em>
-<a class="jxr_linenumber" name="L2040" href="#L2040">2040</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2041" href="#L2041">2041</a> @SuppressWarnings(<span class="jxr_string">"unchecked"</span>)
-<a class="jxr_linenumber" name="L2042" href="#L2042">2042</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> toList(Object array, Class<E> elementType) {
-<a class="jxr_linenumber" name="L2043" href="#L2043">2043</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> ArrayList<E>(Array.getLength(array));
-<a class="jxr_linenumber" name="L2044" href="#L2044">2044</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < Array.getLength(array); i++)
-<a class="jxr_linenumber" name="L2045" href="#L2045">2045</a> l.add((E)Array.get(array, i));
-<a class="jxr_linenumber" name="L2046" href="#L2046">2046</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L2047" href="#L2047">2047</a> }
-<a class="jxr_linenumber" name="L2048" href="#L2048">2048</a>
-<a class="jxr_linenumber" name="L2049" href="#L2049">2049</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2050" href="#L2050">2050</a> <em class="jxr_javadoccomment"> * Recursively converts the specified array into a list of objects.</em>
-<a class="jxr_linenumber" name="L2051" href="#L2051">2051</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2052" href="#L2052">2052</a> <em class="jxr_javadoccomment"> * @param array The array to convert.</em>
-<a class="jxr_linenumber" name="L2053" href="#L2053">2053</a> <em class="jxr_javadoccomment"> * @return A new {@link ArrayList}</em>
-<a class="jxr_linenumber" name="L2054" href="#L2054">2054</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2055" href="#L2055">2055</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<Object> toObjectList(Object array) {
-<a class="jxr_linenumber" name="L2056" href="#L2056">2056</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> ArrayList<>(Array.getLength(array));
-<a class="jxr_linenumber" name="L2057" href="#L2057">2057</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < Array.getLength(array); i++) {
-<a class="jxr_linenumber" name="L2058" href="#L2058">2058</a> <strong class="jxr_keyword">var</strong> o = Array.get(array, i);
-<a class="jxr_linenumber" name="L2059" href="#L2059">2059</a> <strong class="jxr_keyword">if</strong> (isArray(o))
-<a class="jxr_linenumber" name="L2060" href="#L2060">2060</a> o = toObjectList(o);
-<a class="jxr_linenumber" name="L2061" href="#L2061">2061</a> l.add(o);
-<a class="jxr_linenumber" name="L2062" href="#L2062">2062</a> }
-<a class="jxr_linenumber" name="L2063" href="#L2063">2063</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L2064" href="#L2064">2064</a> }
-<a class="jxr_linenumber" name="L2065" href="#L2065">2065</a>
-<a class="jxr_linenumber" name="L2066" href="#L2066">2066</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2067" href="#L2067">2067</a> <em class="jxr_javadoccomment"> * Creates a new set from the specified collection.</em>
-<a class="jxr_linenumber" name="L2068" href="#L2068">2068</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2069" href="#L2069">2069</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L2070" href="#L2070">2070</a> <em class="jxr_javadoccomment"> * @param val The value to copy from.</em>
-<a class="jxr_linenumber" name="L2071" href="#L2071">2071</a> <em class="jxr_javadoccomment"> * @return A new {@link LinkedHashSet}, or <jk>null</jk> if the input was null.</em>
-<a class="jxr_linenumber" name="L2072" href="#L2072">2072</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2073" href="#L2073">2073</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> Set<E> toSet(Collection<E> val) {
-<a class="jxr_linenumber" name="L2074" href="#L2074">2074</a> <strong class="jxr_keyword">return</strong> val == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : <strong class="jxr_keyword">new</strong> LinkedHashSet<>(val);
-<a class="jxr_linenumber" name="L2075" href="#L2075">2075</a> }
-<a class="jxr_linenumber" name="L2076" href="#L2076">2076</a>
-<a class="jxr_linenumber" name="L2077" href="#L2077">2077</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2078" href="#L2078">2078</a> <em class="jxr_javadoccomment"> * Converts the specified array to a <c>Set</c>.</em>
-<a class="jxr_linenumber" name="L2079" href="#L2079">2079</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2080" href="#L2080">2080</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L2081" href="#L2081">2081</a> <em class="jxr_javadoccomment"> * The order of the entries in the set are the same as the array.</em>
+<a class="jxr_linenumber" name="L1961" href="#L1961">1961</a> <em class="jxr_javadoccomment"> * <p>This utility method enables testing of any collection-like object by converting it to a List that can be</em>
+<a class="jxr_linenumber" name="L1962" href="#L1962">1962</a> <em class="jxr_javadoccomment"> * passed to methods such as TestUtils.assertList().</p></em>
+<a class="jxr_linenumber" name="L1963" href="#L1963">1963</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1964" href="#L1964">1964</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Supported Input Types:</h5></em>
+<a class="jxr_linenumber" name="L1965" href="#L1965">1965</a> <em class="jxr_javadoccomment"> * <ul></em>
+<a class="jxr_linenumber" name="L1966" href="#L1966">1966</a> <em class="jxr_javadoccomment"> * <li><b>List:</b> Returns the input unchanged</li></em>
+<a class="jxr_linenumber" name="L1967" href="#L1967">1967</a> <em class="jxr_javadoccomment"> * <li><b>Iterable:</b> Any collection, set, queue, etc. (converted to List preserving order)</li></em>
+<a class="jxr_linenumber" name="L1968" href="#L1968">1968</a> <em class="jxr_javadoccomment"> * <li><b>Iterator:</b> Converts iterator contents to List</li></em>
+<a class="jxr_linenumber" name="L1969" href="#L1969">1969</a> <em class="jxr_javadoccomment"> * <li><b>Enumeration:</b> Converts enumeration contents to List</li></em>
+<a class="jxr_linenumber" name="L1970" href="#L1970">1970</a> <em class="jxr_javadoccomment"> * <li><b>Stream:</b> Converts stream contents to List (stream is consumed)</li></em>
+<a class="jxr_linenumber" name="L1971" href="#L1971">1971</a> <em class="jxr_javadoccomment"> * <li><b>Map:</b> Converts map entries to List of Map.Entry objects</li></em>
+<a class="jxr_linenumber" name="L1972" href="#L1972">1972</a> <em class="jxr_javadoccomment"> * <li><b>Array:</b> Converts any array type (including primitive arrays) to List</li></em>
+<a class="jxr_linenumber" name="L1973" href="#L1973">1973</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L1974" href="#L1974">1974</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1975" href="#L1975">1975</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Usage Examples:</h5></em>
+<a class="jxr_linenumber" name="L1976" href="#L1976">1976</a> <em class="jxr_javadoccomment"> * <p class='bjava'></em>
+<a class="jxr_linenumber" name="L1977" href="#L1977">1977</a> <em class="jxr_javadoccomment"> * <jc>// Test a Set</jc></em>
+<a class="jxr_linenumber" name="L1978" href="#L1978">1978</a> <em class="jxr_javadoccomment"> * Set&lt;String&gt; <jv>mySet</jv> = Set.of(<js>"a"</js>, <js>"b"</js>, <js>"c"</js>);</em>
+<a class="jxr_linenumber" name="L1979" href="#L1979">1979</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>mySet</jv>), <js>"a"</js>, <js>"b"</js>, <js>"c"</js>);</em>
+<a class="jxr_linenumber" name="L1980" href="#L1980">1980</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1981" href="#L1981">1981</a> <em class="jxr_javadoccomment"> * <jc>// Test an array</jc></em>
+<a class="jxr_linenumber" name="L1982" href="#L1982">1982</a> <em class="jxr_javadoccomment"> * String[] <jv>myArray</jv> = {<js>"x"</js>, <js>"y"</js>, <js>"z"</js>};</em>
+<a class="jxr_linenumber" name="L1983" href="#L1983">1983</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>myArray</jv>), <js>"x"</js>, <js>"y"</js>, <js>"z"</js>);</em>
+<a class="jxr_linenumber" name="L1984" href="#L1984">1984</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1985" href="#L1985">1985</a> <em class="jxr_javadoccomment"> * <jc>// Test a primitive array</jc></em>
+<a class="jxr_linenumber" name="L1986" href="#L1986">1986</a> <em class="jxr_javadoccomment"> * <jk>int</jk>[] <jv>numbers</jv> = {1, 2, 3};</em>
+<a class="jxr_linenumber" name="L1987" href="#L1987">1987</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>numbers</jv>), <js>"1"</js>, <js>"2"</js>, <js>"3"</js>);</em>
+<a class="jxr_linenumber" name="L1988" href="#L1988">1988</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1989" href="#L1989">1989</a> <em class="jxr_javadoccomment"> * <jc>// Test a Stream</jc></em>
+<a class="jxr_linenumber" name="L1990" href="#L1990">1990</a> <em class="jxr_javadoccomment"> * Stream&lt;String&gt; <jv>myStream</jv> = Stream.of(<js>"foo"</js>, <js>"bar"</js>);</em>
+<a class="jxr_linenumber" name="L1991" href="#L1991">1991</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>myStream</jv>), <js>"foo"</js>, <js>"bar"</js>);</em>
+<a class="jxr_linenumber" name="L1992" href="#L1992">1992</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1993" href="#L1993">1993</a> <em class="jxr_javadoccomment"> * <jc>// Test a Map (converted to entries)</jc></em>
+<a class="jxr_linenumber" name="L1994" href="#L1994">1994</a> <em class="jxr_javadoccomment"> * Map&lt;String,Integer&gt; <jv>myMap</jv> = Map.of(<js>"a"</js>, 1, <js>"b"</js>, 2);</em>
+<a class="jxr_linenumber" name="L1995" href="#L1995">1995</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>myMap</jv>), <js>"a=1"</js>, <js>"b=2"</js>);</em>
+<a class="jxr_linenumber" name="L1996" href="#L1996">1996</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L1997" href="#L1997">1997</a> <em class="jxr_javadoccomment"> * <jc>// Test any Iterable collection</jc></em>
+<a class="jxr_linenumber" name="L1998" href="#L1998">1998</a> <em class="jxr_javadoccomment"> * Queue&lt;String&gt; <jv>myQueue</jv> = new LinkedList&lt;&gt;(List.of(<js>"first"</js>, <js>"second"</js>));</em>
+<a class="jxr_linenumber" name="L1999" href="#L1999">1999</a> <em class="jxr_javadoccomment"> * assertList(toList(<jv>myQueue</jv>), <js>"first"</js>, <js>"second"</js>);</em>
+<a class="jxr_linenumber" name="L2000" href="#L2000">2000</a> <em class="jxr_javadoccomment"> * </p></em>
+<a class="jxr_linenumber" name="L2001" href="#L2001">2001</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2002" href="#L2002">2002</a> <em class="jxr_javadoccomment"> * <h5 class='section'>Integration with Testing:</h5></em>
+<a class="jxr_linenumber" name="L2003" href="#L2003">2003</a> <em class="jxr_javadoccomment"> * <p>This method is specifically designed to work with testing frameworks to provide</em>
+<a class="jxr_linenumber" name="L2004" href="#L2004">2004</a> <em class="jxr_javadoccomment"> * a unified testing approach for all collection-like types. Instead of having separate assertion methods</em>
+<a class="jxr_linenumber" name="L2005" href="#L2005">2005</a> <em class="jxr_javadoccomment"> * for arrays, sets, and other collections, you can convert them all to Lists and use standard</em>
+<a class="jxr_linenumber" name="L2006" href="#L2006">2006</a> <em class="jxr_javadoccomment"> * list assertion methods.</p></em>
+<a class="jxr_linenumber" name="L2007" href="#L2007">2007</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2008" href="#L2008">2008</a> <em class="jxr_javadoccomment"> * @param o The object to convert to a List. Must not be null and must be a supported collection-like type.</em>
+<a class="jxr_linenumber" name="L2009" href="#L2009">2009</a> <em class="jxr_javadoccomment"> * @return A {@link List} containing the elements from the input object.</em>
+<a class="jxr_linenumber" name="L2010" href="#L2010">2010</a> <em class="jxr_javadoccomment"> * @throws IllegalArgumentException if the input object cannot be converted to a List.</em>
+<a class="jxr_linenumber" name="L2011" href="#L2011">2011</a> <em class="jxr_javadoccomment"> * @see arrayToList</em>
+<a class="jxr_linenumber" name="L2012" href="#L2012">2012</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2013" href="#L2013">2013</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <strong class="jxr_keyword">final</strong> List<?> toList(Object o) { <em class="jxr_comment">// NOSONAR</em>
+<a class="jxr_linenumber" name="L2014" href="#L2014">2014</a> assertArgNotNull(<span class="jxr_string">"o"</span>, o);
+<a class="jxr_linenumber" name="L2015" href="#L2015">2015</a> <strong class="jxr_keyword">if</strong> (o instanceof List<?> o2)
+<a class="jxr_linenumber" name="L2016" href="#L2016">2016</a> <strong class="jxr_keyword">return</strong> o2;
+<a class="jxr_linenumber" name="L2017" href="#L2017">2017</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterable<?> o2)
+<a class="jxr_linenumber" name="L2018" href="#L2018">2018</a> <strong class="jxr_keyword">return</strong> StreamSupport.stream(o2.spliterator(), false).toList();
+<a class="jxr_linenumber" name="L2019" href="#L2019">2019</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterator<?> o2)
+<a class="jxr_linenumber" name="L2020" href="#L2020">2020</a> <strong class="jxr_keyword">return</strong> StreamSupport.stream(Spliterators.spliteratorUnknownSize(o2, 0), false).toList();
+<a class="jxr_linenumber" name="L2021" href="#L2021">2021</a> <strong class="jxr_keyword">if</strong> (o instanceof Enumeration<?> o2)
+<a class="jxr_linenumber" name="L2022" href="#L2022">2022</a> <strong class="jxr_keyword">return</strong> Collections.list(o2);
+<a class="jxr_linenumber" name="L2023" href="#L2023">2023</a> <strong class="jxr_keyword">if</strong> (o instanceof Stream<?> o2)
+<a class="jxr_linenumber" name="L2024" href="#L2024">2024</a> <strong class="jxr_keyword">return</strong> o2.toList();
+<a class="jxr_linenumber" name="L2025" href="#L2025">2025</a> <strong class="jxr_keyword">if</strong> (o instanceof Map<?,?> o2)
+<a class="jxr_linenumber" name="L2026" href="#L2026">2026</a> <strong class="jxr_keyword">return</strong> toList(o2.entrySet());
+<a class="jxr_linenumber" name="L2027" href="#L2027">2027</a> <strong class="jxr_keyword">if</strong> (o instanceof Optional<?> o2)
+<a class="jxr_linenumber" name="L2028" href="#L2028">2028</a> <strong class="jxr_keyword">return</strong> o2.isEmpty() ? Collections.emptyList() : Collections.singletonList(o2.get());
+<a class="jxr_linenumber" name="L2029" href="#L2029">2029</a> <strong class="jxr_keyword">if</strong> (isArray(o))
+<a class="jxr_linenumber" name="L2030" href="#L2030">2030</a> <strong class="jxr_keyword">return</strong> arrayToList(o);
+<a class="jxr_linenumber" name="L2031" href="#L2031">2031</a> <strong class="jxr_keyword">throw</strong> rex(<span class="jxr_string">"Could not convert object of type {0} to a list"</span>, cn(o));
+<a class="jxr_linenumber" name="L2032" href="#L2032">2032</a> }
+<a class="jxr_linenumber" name="L2033" href="#L2033">2033</a>
+<a class="jxr_linenumber" name="L2034" href="#L2034">2034</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2035" href="#L2035">2035</a> <em class="jxr_javadoccomment"> * Converts the specified array to an <c>ArrayList</c></em>
+<a class="jxr_linenumber" name="L2036" href="#L2036">2036</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2037" href="#L2037">2037</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L2038" href="#L2038">2038</a> <em class="jxr_javadoccomment"> * @param array The array to convert.</em>
+<a class="jxr_linenumber" name="L2039" href="#L2039">2039</a> <em class="jxr_javadoccomment"> * @param elementType</em>
+<a class="jxr_linenumber" name="L2040" href="#L2040">2040</a> <em class="jxr_javadoccomment"> * The type of objects in the array.</em>
+<a class="jxr_linenumber" name="L2041" href="#L2041">2041</a> <em class="jxr_javadoccomment"> * It must match the actual component type in the array.</em>
+<a class="jxr_linenumber" name="L2042" href="#L2042">2042</a> <em class="jxr_javadoccomment"> * @return A new {@link ArrayList}</em>
+<a class="jxr_linenumber" name="L2043" href="#L2043">2043</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2044" href="#L2044">2044</a> @SuppressWarnings(<span class="jxr_string">"unchecked"</span>)
+<a class="jxr_linenumber" name="L2045" href="#L2045">2045</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> List<E> toList(Object array, Class<E> elementType) {
+<a class="jxr_linenumber" name="L2046" href="#L2046">2046</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> ArrayList<E>(Array.getLength(array));
+<a class="jxr_linenumber" name="L2047" href="#L2047">2047</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < Array.getLength(array); i++)
+<a class="jxr_linenumber" name="L2048" href="#L2048">2048</a> l.add((E)Array.get(array, i));
+<a class="jxr_linenumber" name="L2049" href="#L2049">2049</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L2050" href="#L2050">2050</a> }
+<a class="jxr_linenumber" name="L2051" href="#L2051">2051</a>
+<a class="jxr_linenumber" name="L2052" href="#L2052">2052</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2053" href="#L2053">2053</a> <em class="jxr_javadoccomment"> * Recursively converts the specified array into a list of objects.</em>
+<a class="jxr_linenumber" name="L2054" href="#L2054">2054</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2055" href="#L2055">2055</a> <em class="jxr_javadoccomment"> * @param array The array to convert.</em>
+<a class="jxr_linenumber" name="L2056" href="#L2056">2056</a> <em class="jxr_javadoccomment"> * @return A new {@link ArrayList}</em>
+<a class="jxr_linenumber" name="L2057" href="#L2057">2057</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2058" href="#L2058">2058</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> List<Object> toObjectList(Object array) {
+<a class="jxr_linenumber" name="L2059" href="#L2059">2059</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> ArrayList<>(Array.getLength(array));
+<a class="jxr_linenumber" name="L2060" href="#L2060">2060</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = 0; i < Array.getLength(array); i++) {
+<a class="jxr_linenumber" name="L2061" href="#L2061">2061</a> <strong class="jxr_keyword">var</strong> o = Array.get(array, i);
+<a class="jxr_linenumber" name="L2062" href="#L2062">2062</a> <strong class="jxr_keyword">if</strong> (isArray(o))
+<a class="jxr_linenumber" name="L2063" href="#L2063">2063</a> o = toObjectList(o);
+<a class="jxr_linenumber" name="L2064" href="#L2064">2064</a> l.add(o);
+<a class="jxr_linenumber" name="L2065" href="#L2065">2065</a> }
+<a class="jxr_linenumber" name="L2066" href="#L2066">2066</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L2067" href="#L2067">2067</a> }
+<a class="jxr_linenumber" name="L2068" href="#L2068">2068</a>
+<a class="jxr_linenumber" name="L2069" href="#L2069">2069</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2070" href="#L2070">2070</a> <em class="jxr_javadoccomment"> * Creates a new set from the specified collection.</em>
+<a class="jxr_linenumber" name="L2071" href="#L2071">2071</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2072" href="#L2072">2072</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L2073" href="#L2073">2073</a> <em class="jxr_javadoccomment"> * @param val The value to copy from.</em>
+<a class="jxr_linenumber" name="L2074" href="#L2074">2074</a> <em class="jxr_javadoccomment"> * @return A new {@link LinkedHashSet}, or <jk>null</jk> if the input was null.</em>
+<a class="jxr_linenumber" name="L2075" href="#L2075">2075</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2076" href="#L2076">2076</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> Set<E> toSet(Collection<E> val) {
+<a class="jxr_linenumber" name="L2077" href="#L2077">2077</a> <strong class="jxr_keyword">return</strong> val == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : <strong class="jxr_keyword">new</strong> LinkedHashSet<>(val);
+<a class="jxr_linenumber" name="L2078" href="#L2078">2078</a> }
+<a class="jxr_linenumber" name="L2079" href="#L2079">2079</a>
+<a class="jxr_linenumber" name="L2080" href="#L2080">2080</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2081" href="#L2081">2081</a> <em class="jxr_javadoccomment"> * Converts the specified array to a <c>Set</c>.</em>
<a class="jxr_linenumber" name="L2082" href="#L2082">2082</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2083" href="#L2083">2083</a> <em class="jxr_javadoccomment"> * @param <T> The entry type of the array.</em>
-<a class="jxr_linenumber" name="L2084" href="#L2084">2084</a> <em class="jxr_javadoccomment"> * @param array The array being wrapped in a <c>Set</c> interface.</em>
-<a class="jxr_linenumber" name="L2085" href="#L2085">2085</a> <em class="jxr_javadoccomment"> * @return The new set.</em>
-<a class="jxr_linenumber" name="L2086" href="#L2086">2086</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2087" href="#L2087">2087</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Set<T> toSet(T[] array) {
-<a class="jxr_linenumber" name="L2088" href="#L2088">2088</a> assertArgNotNull(<span class="jxr_string">"array"</span>, array);
-<a class="jxr_linenumber" name="L2089" href="#L2089">2089</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> AbstractSet<>() {
-<a class="jxr_linenumber" name="L2090" href="#L2090">2090</a>
-<a class="jxr_linenumber" name="L2091" href="#L2091">2091</a> @Override <em class="jxr_comment">/* Overridden from Set */</em>
-<a class="jxr_linenumber" name="L2092" href="#L2092">2092</a> <strong class="jxr_keyword">public</strong> Iterator<T> iterator() {
-<a class="jxr_linenumber" name="L2093" href="#L2093">2093</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> Iterator<>() {
-<a class="jxr_linenumber" name="L2094" href="#L2094">2094</a> <strong class="jxr_keyword">int</strong> i = 0;
-<a class="jxr_linenumber" name="L2095" href="#L2095">2095</a>
-<a class="jxr_linenumber" name="L2096" href="#L2096">2096</a> @Override <em class="jxr_comment">/* Overridden from Iterator */</em>
-<a class="jxr_linenumber" name="L2097" href="#L2097">2097</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">boolean</strong> hasNext() {
-<a class="jxr_linenumber" name="L2098" href="#L2098">2098</a> <strong class="jxr_keyword">return</strong> i < array.length;
-<a class="jxr_linenumber" name="L2099" href="#L2099">2099</a> }
-<a class="jxr_linenumber" name="L2100" href="#L2100">2100</a>
-<a class="jxr_linenumber" name="L2101" href="#L2101">2101</a> @Override <em class="jxr_comment">/* Overridden from Iterator */</em>
-<a class="jxr_linenumber" name="L2102" href="#L2102">2102</a> <strong class="jxr_keyword">public</strong> T next() {
-<a class="jxr_linenumber" name="L2103" href="#L2103">2103</a> <strong class="jxr_keyword">if</strong> (i >= array.length)
-<a class="jxr_linenumber" name="L2104" href="#L2104">2104</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> NoSuchElementException();
-<a class="jxr_linenumber" name="L2105" href="#L2105">2105</a> T t = array[i];
-<a class="jxr_linenumber" name="L2106" href="#L2106">2106</a> i++;
-<a class="jxr_linenumber" name="L2107" href="#L2107">2107</a> <strong class="jxr_keyword">return</strong> t;
-<a class="jxr_linenumber" name="L2108" href="#L2108">2108</a> }
-<a class="jxr_linenumber" name="L2109" href="#L2109">2109</a>
-<a class="jxr_linenumber" name="L2110" href="#L2110">2110</a> @Override <em class="jxr_comment">/* Overridden from Iterator */</em>
-<a class="jxr_linenumber" name="L2111" href="#L2111">2111</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> remove() {
-<a class="jxr_linenumber" name="L2112" href="#L2112">2112</a> <strong class="jxr_keyword">throw</strong> unsupportedOp();
-<a class="jxr_linenumber" name="L2113" href="#L2113">2113</a> }
-<a class="jxr_linenumber" name="L2114" href="#L2114">2114</a> };
-<a class="jxr_linenumber" name="L2115" href="#L2115">2115</a> }
-<a class="jxr_linenumber" name="L2116" href="#L2116">2116</a>
-<a class="jxr_linenumber" name="L2117" href="#L2117">2117</a> @Override <em class="jxr_comment">/* Overridden from Set */</em>
-<a class="jxr_linenumber" name="L2118" href="#L2118">2118</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">int</strong> size() {
-<a class="jxr_linenumber" name="L2119" href="#L2119">2119</a> <strong class="jxr_keyword">return</strong> array.length;
-<a class="jxr_linenumber" name="L2120" href="#L2120">2120</a> }
-<a class="jxr_linenumber" name="L2121" href="#L2121">2121</a> };
-<a class="jxr_linenumber" name="L2122" href="#L2122">2122</a> }
-<a class="jxr_linenumber" name="L2123" href="#L2123">2123</a>
-<a class="jxr_linenumber" name="L2124" href="#L2124">2124</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
-<a class="jxr_linenumber" name="L2125" href="#L2125">2125</a> <em class="jxr_comment">// Primitive array creation methods</em>
-<a class="jxr_linenumber" name="L2126" href="#L2126">2126</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
-<a class="jxr_linenumber" name="L2127" href="#L2127">2127</a>
-<a class="jxr_linenumber" name="L2128" href="#L2128">2128</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2129" href="#L2129">2129</a> <em class="jxr_javadoccomment"> * Creates a new {@link TreeSet} from the specified collection.</em>
-<a class="jxr_linenumber" name="L2130" href="#L2130">2130</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2131" href="#L2131">2131</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L2132" href="#L2132">2132</a> <em class="jxr_javadoccomment"> * @param value The value to copy from.</em>
-<a class="jxr_linenumber" name="L2133" href="#L2133">2133</a> <em class="jxr_javadoccomment"> * @return A new {@link TreeSet}, or <jk>null</jk> if the input was null.</em>
-<a class="jxr_linenumber" name="L2134" href="#L2134">2134</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2135" href="#L2135">2135</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> TreeSet<E> toSortedSet(Collection<E> value) {
-<a class="jxr_linenumber" name="L2136" href="#L2136">2136</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L2137" href="#L2137">2137</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L2138" href="#L2138">2138</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> TreeSet<E>();
-<a class="jxr_linenumber" name="L2139" href="#L2139">2139</a> value.forEach(x -> l.add(x));
-<a class="jxr_linenumber" name="L2140" href="#L2140">2140</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L2141" href="#L2141">2141</a> }
-<a class="jxr_linenumber" name="L2142" href="#L2142">2142</a>
-<a class="jxr_linenumber" name="L2143" href="#L2143">2143</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2144" href="#L2144">2144</a> <em class="jxr_javadoccomment"> * Creates a new {@link TreeSet} from the specified collection.</em>
-<a class="jxr_linenumber" name="L2145" href="#L2145">2145</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2146" href="#L2146">2146</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
-<a class="jxr_linenumber" name="L2147" href="#L2147">2147</a> <em class="jxr_javadoccomment"> * @param value The value to copy from.</em>
-<a class="jxr_linenumber" name="L2148" href="#L2148">2148</a> <em class="jxr_javadoccomment"> * @param nullIfEmpty If <jk>true</jk> returns <jk>null</jk> if the collection is empty.</em>
-<a class="jxr_linenumber" name="L2149" href="#L2149">2149</a> <em class="jxr_javadoccomment"> * @return A new {@link TreeSet}, or <jk>null</jk> if the input was null.</em>
-<a class="jxr_linenumber" name="L2150" href="#L2150">2150</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2151" href="#L2151">2151</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> TreeSet<E> toSortedSet(Collection<E> value, <strong class="jxr_keyword">boolean</strong> nullIfEmpty) {
-<a class="jxr_linenumber" name="L2152" href="#L2152">2152</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong> || (nullIfEmpty && value.isEmpty()))
-<a class="jxr_linenumber" name="L2153" href="#L2153">2153</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L2154" href="#L2154">2154</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> TreeSet<E>();
-<a class="jxr_linenumber" name="L2155" href="#L2155">2155</a> value.forEach(x -> l.add(x));
-<a class="jxr_linenumber" name="L2156" href="#L2156">2156</a> <strong class="jxr_keyword">return</strong> l;
-<a class="jxr_linenumber" name="L2157" href="#L2157">2157</a> }
-<a class="jxr_linenumber" name="L2158" href="#L2158">2158</a>
-<a class="jxr_linenumber" name="L2159" href="#L2159">2159</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2160" href="#L2160">2160</a> <em class="jxr_javadoccomment"> * Creates a new {@link TreeSet} containing a copy of the specified set.</em>
-<a class="jxr_linenumber" name="L2161" href="#L2161">2161</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2162" href="#L2162">2162</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
-<a class="jxr_linenumber" name="L2163" href="#L2163">2163</a> <em class="jxr_javadoccomment"> * @param copyFrom The set to copy from.</em>
-<a class="jxr_linenumber" name="L2164" href="#L2164">2164</a> <em class="jxr_javadoccomment"> * @return A new {@link TreeSet}, or <jk>null</jk> if the set was <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L2165" href="#L2165">2165</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2166" href="#L2166">2166</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> TreeSet<T> toSortedSet(Set<T> copyFrom) {
-<a class="jxr_linenumber" name="L2167" href="#L2167">2167</a> <strong class="jxr_keyword">return</strong> copyFrom == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : <strong class="jxr_keyword">new</strong> TreeSet<>(copyFrom);
-<a class="jxr_linenumber" name="L2168" href="#L2168">2168</a> }
-<a class="jxr_linenumber" name="L2169" href="#L2169">2169</a>
-<a class="jxr_linenumber" name="L2170" href="#L2170">2170</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2171" href="#L2171">2171</a> <em class="jxr_javadoccomment"> * Converts an array to a stream of objects.</em>
-<a class="jxr_linenumber" name="L2172" href="#L2172">2172</a> <em class="jxr_javadoccomment"> * @param array The array to convert.</em>
-<a class="jxr_linenumber" name="L2173" href="#L2173">2173</a> <em class="jxr_javadoccomment"> * @return A new stream.</em>
-<a class="jxr_linenumber" name="L2174" href="#L2174">2174</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2175" href="#L2175">2175</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Stream<Object> toStream(Object array) {
-<a class="jxr_linenumber" name="L2176" href="#L2176">2176</a> assertArg(isArray(array), <span class="jxr_string">"Arg was not an array. Type: {0}"</span>, cn(array));
-<a class="jxr_linenumber" name="L2177" href="#L2177">2177</a> <strong class="jxr_keyword">var</strong> length = Array.getLength(array);
-<a class="jxr_linenumber" name="L2178" href="#L2178">2178</a> <strong class="jxr_keyword">return</strong> IntStream.range(0, length).mapToObj(i -> Array.get(array, i));
-<a class="jxr_linenumber" name="L2179" href="#L2179">2179</a> }
-<a class="jxr_linenumber" name="L2180" href="#L2180">2180</a>
-<a class="jxr_linenumber" name="L2181" href="#L2181">2181</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2182" href="#L2182">2182</a> <em class="jxr_javadoccomment"> * Converts the specified collection to an array of strings.</em>
-<a class="jxr_linenumber" name="L2183" href="#L2183">2183</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2184" href="#L2184">2184</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L2185" href="#L2185">2185</a> <em class="jxr_javadoccomment"> * Entries are converted to strings using {@link #toString()}.</em>
-<a class="jxr_linenumber" name="L2186" href="#L2186">2186</a> <em class="jxr_javadoccomment"> * <jk>null</jk> values remain <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L2187" href="#L2187">2187</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2188" href="#L2188">2188</a> <em class="jxr_javadoccomment"> * @param c The collection to convert.</em>
-<a class="jxr_linenumber" name="L2189" href="#L2189">2189</a> <em class="jxr_javadoccomment"> * @return The collection as a string array.</em>
-<a class="jxr_linenumber" name="L2190" href="#L2190">2190</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2191" href="#L2191">2191</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] toStringArray(Collection<?> c) {
-<a class="jxr_linenumber" name="L2192" href="#L2192">2192</a> <strong class="jxr_keyword">var</strong> r = <strong class="jxr_keyword">new</strong> String[c.size()];
-<a class="jxr_linenumber" name="L2193" href="#L2193">2193</a> <strong class="jxr_keyword">var</strong> i = 0;
-<a class="jxr_linenumber" name="L2194" href="#L2194">2194</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> o : c)
-<a class="jxr_linenumber" name="L2195" href="#L2195">2195</a> r[i++] = s(o);
-<a class="jxr_linenumber" name="L2196" href="#L2196">2196</a> <strong class="jxr_keyword">return</strong> r;
-<a class="jxr_linenumber" name="L2197" href="#L2197">2197</a> }
-<a class="jxr_linenumber" name="L2198" href="#L2198">2198</a>
-<a class="jxr_linenumber" name="L2199" href="#L2199">2199</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2200" href="#L2200">2200</a> <em class="jxr_javadoccomment"> * Traverses all elements in the specified object and executes a consumer for it.</em>
-<a class="jxr_linenumber" name="L2201" href="#L2201">2201</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2202" href="#L2202">2202</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
-<a class="jxr_linenumber" name="L2203" href="#L2203">2203</a> <em class="jxr_javadoccomment"> * @param o The object to traverse.</em>
-<a class="jxr_linenumber" name="L2204" href="#L2204">2204</a> <em class="jxr_javadoccomment"> * @param c The consumer of the objects.</em>
-<a class="jxr_linenumber" name="L2205" href="#L2205">2205</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2206" href="#L2206">2206</a> @SuppressWarnings(<span class="jxr_string">"unchecked"</span>)
-<a class="jxr_linenumber" name="L2207" href="#L2207">2207</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> <strong class="jxr_keyword">void</strong> traverse(Object o, Consumer<T> c) {
-<a class="jxr_linenumber" name="L2208" href="#L2208">2208</a> <strong class="jxr_keyword">if</strong> (o == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L2209" href="#L2209">2209</a> <strong class="jxr_keyword">return</strong>;
-<a class="jxr_linenumber" name="L2210" href="#L2210">2210</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterable<?> o2)
-<a class="jxr_linenumber" name="L2211" href="#L2211">2211</a> o2.forEach(x -> traverse(x, c));
-<a class="jxr_linenumber" name="L2212" href="#L2212">2212</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (o instanceof Stream<?> o2)
-<a class="jxr_linenumber" name="L2213" href="#L2213">2213</a> o2.forEach(x -> traverse(x, c));
-<a class="jxr_linenumber" name="L2214" href="#L2214">2214</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (isArray(o))
-<a class="jxr_linenumber" name="L2215" href="#L2215">2215</a> toStream(o).forEach(x -> traverse(x, c));
-<a class="jxr_linenumber" name="L2216" href="#L2216">2216</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L2217" href="#L2217">2217</a> c.accept((T)o);
-<a class="jxr_linenumber" name="L2218" href="#L2218">2218</a> }
-<a class="jxr_linenumber" name="L2219" href="#L2219">2219</a>
-<a class="jxr_linenumber" name="L2220" href="#L2220">2220</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2221" href="#L2221">2221</a> <em class="jxr_javadoccomment"> * Creates an unmodifiable view of the specified list.</em>
-<a class="jxr_linenumber" name="L2222" href="#L2222">2222</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2223" href="#L2223">2223</a> <em class="jxr_javadoccomment"> * <p>This is a null-safe wrapper around {@link Collections#unmodifiableList(List)}.</p></em>
-<a class="jxr_linenumber" name="L2224" href="#L2224">2224</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2225" href="#L2225">2225</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
-<a class="jxr_linenumber" name="L2226" href="#L2226">2226</a> <em class="jxr_javadoccomment"> * @param value The list to make unmodifiable. Can be null.</em>
-<a class="jxr_linenumber" name="L2227" href="#L2227">2227</a> <em class="jxr_javadoccomment"> * @return An unmodifiable view of the list, or null if the input was null.</em>
-<a class="jxr_linenumber" name="L2228" href="#L2228">2228</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2229" href="#L2229">2229</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> List<T> u(List<? <strong class="jxr_keyword">extends</strong> T> value) {
-<a class="jxr_linenumber" name="L2230" href="#L2230">2230</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.unmodifiableList(value);
-<a class="jxr_linenumber" name="L2231" href="#L2231">2231</a> }
-<a class="jxr_linenumber" name="L2232" href="#L2232">2232</a>
-<a class="jxr_linenumber" name="L2233" href="#L2233">2233</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2234" href="#L2234">2234</a> <em class="jxr_javadoccomment"> * Creates an unmodifiable view of the specified map.</em>
-<a class="jxr_linenumber" name="L2235" href="#L2235">2235</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2236" href="#L2236">2236</a> <em class="jxr_javadoccomment"> * <p>This is a null-safe wrapper around {@link Collections#unmodifiableMap(Map)}.</p></em>
-<a class="jxr_linenumber" name="L2237" href="#L2237">2237</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2238" href="#L2238">2238</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
-<a class="jxr_linenumber" name="L2239" href="#L2239">2239</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
-<a class="jxr_linenumber" name="L2240" href="#L2240">2240</a> <em class="jxr_javadoccomment"> * @param value The map to make unmodifiable. Can be null.</em>
-<a class="jxr_linenumber" name="L2241" href="#L2241">2241</a> <em class="jxr_javadoccomment"> * @return An unmodifiable view of the map, or null if the input was null.</em>
-<a class="jxr_linenumber" name="L2242" href="#L2242">2242</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2243" href="#L2243">2243</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> Map<K,V> u(Map<? <strong class="jxr_keyword">extends</strong> K,? <strong class="jxr_keyword">extends</strong> V> value) {
-<a class="jxr_linenumber" name="L2244" href="#L2244">2244</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.unmodifiableMap(value);
-<a class="jxr_linenumber" name="L2245" href="#L2245">2245</a> }
-<a class="jxr_linenumber" name="L2246" href="#L2246">2246</a>
-<a class="jxr_linenumber" name="L2247" href="#L2247">2247</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
-<a class="jxr_linenumber" name="L2248" href="#L2248">2248</a> <em class="jxr_comment">// Stream utilities</em>
-<a class="jxr_linenumber" name="L2249" href="#L2249">2249</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
-<a class="jxr_linenumber" name="L2250" href="#L2250">2250</a>
-<a class="jxr_linenumber" name="L2251" href="#L2251">2251</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L2252" href="#L2252">2252</a> <em class="jxr_javadoccomment"> * Creates an unmodifiable view of the specified set.</em>
-<a class="jxr_linenumber" name="L2253" href="#L2253">2253</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2254" href="#L2254">2254</a> <em class="jxr_javadoccomment"> * <p>This is a null-safe wrapper around {@link Collections#unmodifiableSet(Set)}.</p></em>
-<a class="jxr_linenumber" name="L2255" href="#L2255">2255</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L2256" href="#L2256">2256</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
-<a class="jxr_linenumber" name="L2257" href="#L2257">2257</a> <em class="jxr_javadoccomment"> * @param value The set to make unmodifiable. Can be null.</em>
-<a class="jxr_linenumber" name="L2258" href="#L2258">2258</a> <em class="jxr_javadoccomment"> * @return An unmodifiable view of the set, or null if the input was null.</em>
-<a class="jxr_linenumber" name="L2259" href="#L2259">2259</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L2260" href="#L2260">2260</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Set<T> u(Set<? <strong class="jxr_keyword">extends</strong> T> value) {
-<a class="jxr_linenumber" name="L2261" href="#L2261">2261</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.unmodifiableSet(value);
-<a class="jxr_linenumber" name="L2262" href="#L2262">2262</a> }
-<a class="jxr_linenumber" name="L2263" href="#L2263">2263</a>
-<a class="jxr_linenumber" name="L2264" href="#L2264">2264</a> <strong class="jxr_keyword">private</strong> <a name="CollectionUtils" href="../../../../../org/apache/juneau/commons/utils/CollectionUtils.html#CollectionUtils">CollectionUtils</a>() {}
-<a class="jxr_linenumber" name="L2265" href="#L2265">2265</a> }
+<a class="jxr_linenumber" name="L2083" href="#L2083">2083</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L2084" href="#L2084">2084</a> <em class="jxr_javadoccomment"> * The order of the entries in the set are the same as the array.</em>
+<a class="jxr_linenumber" name="L2085" href="#L2085">2085</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2086" href="#L2086">2086</a> <em class="jxr_javadoccomment"> * @param <T> The entry type of the array.</em>
+<a class="jxr_linenumber" name="L2087" href="#L2087">2087</a> <em class="jxr_javadoccomment"> * @param array The array being wrapped in a <c>Set</c> interface.</em>
+<a class="jxr_linenumber" name="L2088" href="#L2088">2088</a> <em class="jxr_javadoccomment"> * @return The new set.</em>
+<a class="jxr_linenumber" name="L2089" href="#L2089">2089</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2090" href="#L2090">2090</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Set<T> toSet(T[] array) {
+<a class="jxr_linenumber" name="L2091" href="#L2091">2091</a> assertArgNotNull(<span class="jxr_string">"array"</span>, array);
+<a class="jxr_linenumber" name="L2092" href="#L2092">2092</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> AbstractSet<>() {
+<a class="jxr_linenumber" name="L2093" href="#L2093">2093</a>
+<a class="jxr_linenumber" name="L2094" href="#L2094">2094</a> @Override <em class="jxr_comment">/* Overridden from Set */</em>
+<a class="jxr_linenumber" name="L2095" href="#L2095">2095</a> <strong class="jxr_keyword">public</strong> Iterator<T> iterator() {
+<a class="jxr_linenumber" name="L2096" href="#L2096">2096</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">new</strong> Iterator<>() {
+<a class="jxr_linenumber" name="L2097" href="#L2097">2097</a> <strong class="jxr_keyword">int</strong> i = 0;
+<a class="jxr_linenumber" name="L2098" href="#L2098">2098</a>
+<a class="jxr_linenumber" name="L2099" href="#L2099">2099</a> @Override <em class="jxr_comment">/* Overridden from Iterator */</em>
+<a class="jxr_linenumber" name="L2100" href="#L2100">2100</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">boolean</strong> hasNext() {
+<a class="jxr_linenumber" name="L2101" href="#L2101">2101</a> <strong class="jxr_keyword">return</strong> i < array.length;
+<a class="jxr_linenumber" name="L2102" href="#L2102">2102</a> }
+<a class="jxr_linenumber" name="L2103" href="#L2103">2103</a>
+<a class="jxr_linenumber" name="L2104" href="#L2104">2104</a> @Override <em class="jxr_comment">/* Overridden from Iterator */</em>
+<a class="jxr_linenumber" name="L2105" href="#L2105">2105</a> <strong class="jxr_keyword">public</strong> T next() {
+<a class="jxr_linenumber" name="L2106" href="#L2106">2106</a> <strong class="jxr_keyword">if</strong> (i >= array.length)
+<a class="jxr_linenumber" name="L2107" href="#L2107">2107</a> <strong class="jxr_keyword">throw</strong> <strong class="jxr_keyword">new</strong> NoSuchElementException();
+<a class="jxr_linenumber" name="L2108" href="#L2108">2108</a> T t = array[i];
+<a class="jxr_linenumber" name="L2109" href="#L2109">2109</a> i++;
+<a class="jxr_linenumber" name="L2110" href="#L2110">2110</a> <strong class="jxr_keyword">return</strong> t;
+<a class="jxr_linenumber" name="L2111" href="#L2111">2111</a> }
+<a class="jxr_linenumber" name="L2112" href="#L2112">2112</a>
+<a class="jxr_linenumber" name="L2113" href="#L2113">2113</a> @Override <em class="jxr_comment">/* Overridden from Iterator */</em>
+<a class="jxr_linenumber" name="L2114" href="#L2114">2114</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">void</strong> remove() {
+<a class="jxr_linenumber" name="L2115" href="#L2115">2115</a> <strong class="jxr_keyword">throw</strong> unsupportedOp();
+<a class="jxr_linenumber" name="L2116" href="#L2116">2116</a> }
+<a class="jxr_linenumber" name="L2117" href="#L2117">2117</a> };
+<a class="jxr_linenumber" name="L2118" href="#L2118">2118</a> }
+<a class="jxr_linenumber" name="L2119" href="#L2119">2119</a>
+<a class="jxr_linenumber" name="L2120" href="#L2120">2120</a> @Override <em class="jxr_comment">/* Overridden from Set */</em>
+<a class="jxr_linenumber" name="L2121" href="#L2121">2121</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">int</strong> size() {
+<a class="jxr_linenumber" name="L2122" href="#L2122">2122</a> <strong class="jxr_keyword">return</strong> array.length;
+<a class="jxr_linenumber" name="L2123" href="#L2123">2123</a> }
+<a class="jxr_linenumber" name="L2124" href="#L2124">2124</a> };
+<a class="jxr_linenumber" name="L2125" href="#L2125">2125</a> }
+<a class="jxr_linenumber" name="L2126" href="#L2126">2126</a>
+<a class="jxr_linenumber" name="L2127" href="#L2127">2127</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
+<a class="jxr_linenumber" name="L2128" href="#L2128">2128</a> <em class="jxr_comment">// Primitive array creation methods</em>
+<a class="jxr_linenumber" name="L2129" href="#L2129">2129</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
+<a class="jxr_linenumber" name="L2130" href="#L2130">2130</a>
+<a class="jxr_linenumber" name="L2131" href="#L2131">2131</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2132" href="#L2132">2132</a> <em class="jxr_javadoccomment"> * Creates a new {@link TreeSet} from the specified collection.</em>
+<a class="jxr_linenumber" name="L2133" href="#L2133">2133</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2134" href="#L2134">2134</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L2135" href="#L2135">2135</a> <em class="jxr_javadoccomment"> * @param value The value to copy from.</em>
+<a class="jxr_linenumber" name="L2136" href="#L2136">2136</a> <em class="jxr_javadoccomment"> * @return A new {@link TreeSet}, or <jk>null</jk> if the input was null.</em>
+<a class="jxr_linenumber" name="L2137" href="#L2137">2137</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2138" href="#L2138">2138</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> TreeSet<E> toSortedSet(Collection<E> value) {
+<a class="jxr_linenumber" name="L2139" href="#L2139">2139</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L2140" href="#L2140">2140</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L2141" href="#L2141">2141</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> TreeSet<E>();
+<a class="jxr_linenumber" name="L2142" href="#L2142">2142</a> value.forEach(x -> l.add(x));
+<a class="jxr_linenumber" name="L2143" href="#L2143">2143</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L2144" href="#L2144">2144</a> }
+<a class="jxr_linenumber" name="L2145" href="#L2145">2145</a>
+<a class="jxr_linenumber" name="L2146" href="#L2146">2146</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2147" href="#L2147">2147</a> <em class="jxr_javadoccomment"> * Creates a new {@link TreeSet} from the specified collection.</em>
+<a class="jxr_linenumber" name="L2148" href="#L2148">2148</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2149" href="#L2149">2149</a> <em class="jxr_javadoccomment"> * @param <E> The element type.</em>
+<a class="jxr_linenumber" name="L2150" href="#L2150">2150</a> <em class="jxr_javadoccomment"> * @param value The value to copy from.</em>
+<a class="jxr_linenumber" name="L2151" href="#L2151">2151</a> <em class="jxr_javadoccomment"> * @param nullIfEmpty If <jk>true</jk> returns <jk>null</jk> if the collection is empty.</em>
+<a class="jxr_linenumber" name="L2152" href="#L2152">2152</a> <em class="jxr_javadoccomment"> * @return A new {@link TreeSet}, or <jk>null</jk> if the input was null.</em>
+<a class="jxr_linenumber" name="L2153" href="#L2153">2153</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2154" href="#L2154">2154</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <E> TreeSet<E> toSortedSet(Collection<E> value, <strong class="jxr_keyword">boolean</strong> nullIfEmpty) {
+<a class="jxr_linenumber" name="L2155" href="#L2155">2155</a> <strong class="jxr_keyword">if</strong> (value == <strong class="jxr_keyword">null</strong> || (nullIfEmpty && value.isEmpty()))
+<a class="jxr_linenumber" name="L2156" href="#L2156">2156</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L2157" href="#L2157">2157</a> <strong class="jxr_keyword">var</strong> l = <strong class="jxr_keyword">new</strong> TreeSet<E>();
+<a class="jxr_linenumber" name="L2158" href="#L2158">2158</a> value.forEach(x -> l.add(x));
+<a class="jxr_linenumber" name="L2159" href="#L2159">2159</a> <strong class="jxr_keyword">return</strong> l;
+<a class="jxr_linenumber" name="L2160" href="#L2160">2160</a> }
+<a class="jxr_linenumber" name="L2161" href="#L2161">2161</a>
+<a class="jxr_linenumber" name="L2162" href="#L2162">2162</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2163" href="#L2163">2163</a> <em class="jxr_javadoccomment"> * Creates a new {@link TreeSet} containing a copy of the specified set.</em>
+<a class="jxr_linenumber" name="L2164" href="#L2164">2164</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2165" href="#L2165">2165</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
+<a class="jxr_linenumber" name="L2166" href="#L2166">2166</a> <em class="jxr_javadoccomment"> * @param copyFrom The set to copy from.</em>
+<a class="jxr_linenumber" name="L2167" href="#L2167">2167</a> <em class="jxr_javadoccomment"> * @return A new {@link TreeSet}, or <jk>null</jk> if the set was <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L2168" href="#L2168">2168</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2169" href="#L2169">2169</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> TreeSet<T> toSortedSet(Set<T> copyFrom) {
+<a class="jxr_linenumber" name="L2170" href="#L2170">2170</a> <strong class="jxr_keyword">return</strong> copyFrom == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : <strong class="jxr_keyword">new</strong> TreeSet<>(copyFrom);
+<a class="jxr_linenumber" name="L2171" href="#L2171">2171</a> }
+<a class="jxr_linenumber" name="L2172" href="#L2172">2172</a>
+<a class="jxr_linenumber" name="L2173" href="#L2173">2173</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2174" href="#L2174">2174</a> <em class="jxr_javadoccomment"> * Converts an array to a stream of objects.</em>
+<a class="jxr_linenumber" name="L2175" href="#L2175">2175</a> <em class="jxr_javadoccomment"> * @param array The array to convert.</em>
+<a class="jxr_linenumber" name="L2176" href="#L2176">2176</a> <em class="jxr_javadoccomment"> * @return A new stream.</em>
+<a class="jxr_linenumber" name="L2177" href="#L2177">2177</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2178" href="#L2178">2178</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> Stream<Object> toStream(Object array) {
+<a class="jxr_linenumber" name="L2179" href="#L2179">2179</a> assertArg(isArray(array), <span class="jxr_string">"Arg was not an array. Type: {0}"</span>, cn(array));
+<a class="jxr_linenumber" name="L2180" href="#L2180">2180</a> <strong class="jxr_keyword">var</strong> length = Array.getLength(array);
+<a class="jxr_linenumber" name="L2181" href="#L2181">2181</a> <strong class="jxr_keyword">return</strong> IntStream.range(0, length).mapToObj(i -> Array.get(array, i));
+<a class="jxr_linenumber" name="L2182" href="#L2182">2182</a> }
+<a class="jxr_linenumber" name="L2183" href="#L2183">2183</a>
+<a class="jxr_linenumber" name="L2184" href="#L2184">2184</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2185" href="#L2185">2185</a> <em class="jxr_javadoccomment"> * Converts the specified collection to an array of strings.</em>
+<a class="jxr_linenumber" name="L2186" href="#L2186">2186</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2187" href="#L2187">2187</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L2188" href="#L2188">2188</a> <em class="jxr_javadoccomment"> * Entries are converted to strings using {@link #toString()}.</em>
+<a class="jxr_linenumber" name="L2189" href="#L2189">2189</a> <em class="jxr_javadoccomment"> * <jk>null</jk> values remain <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L2190" href="#L2190">2190</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2191" href="#L2191">2191</a> <em class="jxr_javadoccomment"> * @param c The collection to convert.</em>
+<a class="jxr_linenumber" name="L2192" href="#L2192">2192</a> <em class="jxr_javadoccomment"> * @return The collection as a string array.</em>
+<a class="jxr_linenumber" name="L2193" href="#L2193">2193</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2194" href="#L2194">2194</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> String[] toStringArray(Collection<?> c) {
+<a class="jxr_linenumber" name="L2195" href="#L2195">2195</a> <strong class="jxr_keyword">var</strong> r = <strong class="jxr_keyword">new</strong> String[c.size()];
+<a class="jxr_linenumber" name="L2196" href="#L2196">2196</a> <strong class="jxr_keyword">var</strong> i = 0;
+<a class="jxr_linenumber" name="L2197" href="#L2197">2197</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> o : c)
+<a class="jxr_linenumber" name="L2198" href="#L2198">2198</a> r[i++] = s(o);
+<a class="jxr_linenumber" name="L2199" href="#L2199">2199</a> <strong class="jxr_keyword">return</strong> r;
+<a class="jxr_linenumber" name="L2200" href="#L2200">2200</a> }
+<a class="jxr_linenumber" name="L2201" href="#L2201">2201</a>
+<a class="jxr_linenumber" name="L2202" href="#L2202">2202</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2203" href="#L2203">2203</a> <em class="jxr_javadoccomment"> * Traverses all elements in the specified object and executes a consumer for it.</em>
+<a class="jxr_linenumber" name="L2204" href="#L2204">2204</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2205" href="#L2205">2205</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
+<a class="jxr_linenumber" name="L2206" href="#L2206">2206</a> <em class="jxr_javadoccomment"> * @param o The object to traverse.</em>
+<a class="jxr_linenumber" name="L2207" href="#L2207">2207</a> <em class="jxr_javadoccomment"> * @param c The consumer of the objects.</em>
+<a class="jxr_linenumber" name="L2208" href="#L2208">2208</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2209" href="#L2209">2209</a> @SuppressWarnings(<span class="jxr_string">"unchecked"</span>)
+<a class="jxr_linenumber" name="L2210" href="#L2210">2210</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> <strong class="jxr_keyword">void</strong> traverse(Object o, Consumer<T> c) {
+<a class="jxr_linenumber" name="L2211" href="#L2211">2211</a> <strong class="jxr_keyword">if</strong> (o == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L2212" href="#L2212">2212</a> <strong class="jxr_keyword">return</strong>;
+<a class="jxr_linenumber" name="L2213" href="#L2213">2213</a> <strong class="jxr_keyword">if</strong> (o instanceof Iterable<?> o2)
+<a class="jxr_linenumber" name="L2214" href="#L2214">2214</a> o2.forEach(x -> traverse(x, c));
+<a class="jxr_linenumber" name="L2215" href="#L2215">2215</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (o instanceof Stream<?> o2)
+<a class="jxr_linenumber" name="L2216" href="#L2216">2216</a> o2.forEach(x -> traverse(x, c));
+<a class="jxr_linenumber" name="L2217" href="#L2217">2217</a> <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (isArray(o))
+<a class="jxr_linenumber" name="L2218" href="#L2218">2218</a> toStream(o).forEach(x -> traverse(x, c));
+<a class="jxr_linenumber" name="L2219" href="#L2219">2219</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L2220" href="#L2220">2220</a> c.accept((T)o);
+<a class="jxr_linenumber" name="L2221" href="#L2221">2221</a> }
+<a class="jxr_linenumber" name="L2222" href="#L2222">2222</a>
+<a class="jxr_linenumber" name="L2223" href="#L2223">2223</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2224" href="#L2224">2224</a> <em class="jxr_javadoccomment"> * Creates an unmodifiable view of the specified list.</em>
+<a class="jxr_linenumber" name="L2225" href="#L2225">2225</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2226" href="#L2226">2226</a> <em class="jxr_javadoccomment"> * <p>This is a null-safe wrapper around {@link Collections#unmodifiableList(List)}.</p></em>
+<a class="jxr_linenumber" name="L2227" href="#L2227">2227</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2228" href="#L2228">2228</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
+<a class="jxr_linenumber" name="L2229" href="#L2229">2229</a> <em class="jxr_javadoccomment"> * @param value The list to make unmodifiable. Can be null.</em>
+<a class="jxr_linenumber" name="L2230" href="#L2230">2230</a> <em class="jxr_javadoccomment"> * @return An unmodifiable view of the list, or null if the input was null.</em>
+<a class="jxr_linenumber" name="L2231" href="#L2231">2231</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2232" href="#L2232">2232</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> List<T> u(List<? <strong class="jxr_keyword">extends</strong> T> value) {
+<a class="jxr_linenumber" name="L2233" href="#L2233">2233</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.unmodifiableList(value);
+<a class="jxr_linenumber" name="L2234" href="#L2234">2234</a> }
+<a class="jxr_linenumber" name="L2235" href="#L2235">2235</a>
+<a class="jxr_linenumber" name="L2236" href="#L2236">2236</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2237" href="#L2237">2237</a> <em class="jxr_javadoccomment"> * Creates an unmodifiable view of the specified map.</em>
+<a class="jxr_linenumber" name="L2238" href="#L2238">2238</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2239" href="#L2239">2239</a> <em class="jxr_javadoccomment"> * <p>This is a null-safe wrapper around {@link Collections#unmodifiableMap(Map)}.</p></em>
+<a class="jxr_linenumber" name="L2240" href="#L2240">2240</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2241" href="#L2241">2241</a> <em class="jxr_javadoccomment"> * @param <K> The key type.</em>
+<a class="jxr_linenumber" name="L2242" href="#L2242">2242</a> <em class="jxr_javadoccomment"> * @param <V> The value type.</em>
+<a class="jxr_linenumber" name="L2243" href="#L2243">2243</a> <em class="jxr_javadoccomment"> * @param value The map to make unmodifiable. Can be null.</em>
+<a class="jxr_linenumber" name="L2244" href="#L2244">2244</a> <em class="jxr_javadoccomment"> * @return An unmodifiable view of the map, or null if the input was null.</em>
+<a class="jxr_linenumber" name="L2245" href="#L2245">2245</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2246" href="#L2246">2246</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <K,V> Map<K,V> u(Map<? <strong class="jxr_keyword">extends</strong> K,? <strong class="jxr_keyword">extends</strong> V> value) {
+<a class="jxr_linenumber" name="L2247" href="#L2247">2247</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.unmodifiableMap(value);
+<a class="jxr_linenumber" name="L2248" href="#L2248">2248</a> }
+<a class="jxr_linenumber" name="L2249" href="#L2249">2249</a>
+<a class="jxr_linenumber" name="L2250" href="#L2250">2250</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
+<a class="jxr_linenumber" name="L2251" href="#L2251">2251</a> <em class="jxr_comment">// Stream utilities</em>
+<a class="jxr_linenumber" name="L2252" href="#L2252">2252</a> <em class="jxr_comment">//-----------------------------------------------------------------------------------------------------------------</em>
+<a class="jxr_linenumber" name="L2253" href="#L2253">2253</a>
+<a class="jxr_linenumber" name="L2254" href="#L2254">2254</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L2255" href="#L2255">2255</a> <em class="jxr_javadoccomment"> * Creates an unmodifiable view of the specified set.</em>
+<a class="jxr_linenumber" name="L2256" href="#L2256">2256</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2257" href="#L2257">2257</a> <em class="jxr_javadoccomment"> * <p>This is a null-safe wrapper around {@link Collections#unmodifiableSet(Set)}.</p></em>
+<a class="jxr_linenumber" name="L2258" href="#L2258">2258</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L2259" href="#L2259">2259</a> <em class="jxr_javadoccomment"> * @param <T> The element type.</em>
+<a class="jxr_linenumber" name="L2260" href="#L2260">2260</a> <em class="jxr_javadoccomment"> * @param value The set to make unmodifiable. Can be null.</em>
+<a class="jxr_linenumber" name="L2261" href="#L2261">2261</a> <em class="jxr_javadoccomment"> * @return An unmodifiable view of the set, or null if the input was null.</em>
+<a class="jxr_linenumber" name="L2262" href="#L2262">2262</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L2263" href="#L2263">2263</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">static</strong> <T> Set<T> u(Set<? <strong class="jxr_keyword">extends</strong> T> value) {
+<a class="jxr_linenumber" name="L2264" href="#L2264">2264</a> <strong class="jxr_keyword">return</strong> value == <strong class="jxr_keyword">null</strong> ? <strong class="jxr_keyword">null</strong> : Collections.unmodifiableSet(value);
+<a class="jxr_linenumber" name="L2265" href="#L2265">2265</a> }
+<a class="jxr_linenumber" name="L2266" href="#L2266">2266</a>
+<a class="jxr_linenumber" name="L2267" href="#L2267">2267</a> <strong class="jxr_keyword">private</strong> <a name="CollectionUtils" href="../../../../../org/apache/juneau/commons/utils/CollectionUtils.html#CollectionUtils">CollectionUtils</a>() {}
+<a class="jxr_linenumber" name="L2268" href="#L2268">2268</a> }
</pre>
<hr/>
<div id="footer">© 2016–2025 <a href="https://www.apache.org/">The Apache Software Foundation</a></div>
diff --git a/site/xref/org/apache/juneau/commons/utils/StringUtils.html b/site/xref/org/apache/juneau/commons/utils/StringUtils.html
index 08b8d06c5f..947557dc40 100644
--- a/site/xref/org/apache/juneau/commons/utils/StringUtils.html
+++ b/site/xref/org/apache/juneau/commons/utils/StringUtils.html
@@ -6417,7 +6417,7 @@
<a class="jxr_linenumber" name="L6409" href="#L6409">6409</a> <strong class="jxr_keyword">if</strong> (s == <strong class="jxr_keyword">null</strong>)
<a class="jxr_linenumber" name="L6410" href="#L6410">6410</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>; <em class="jxr_comment">// NOSONAR - Intentional.</em>
<a class="jxr_linenumber" name="L6411" href="#L6411">6411</a> <strong class="jxr_keyword">if</strong> (isEmpty(s))
-<a class="jxr_linenumber" name="L6412" href="#L6412">6412</a> <strong class="jxr_keyword">return</strong> Collections.emptyMap();
+<a class="jxr_linenumber" name="L6412" href="#L6412">6412</a> <strong class="jxr_keyword">return</strong> mape();
<a class="jxr_linenumber" name="L6413" href="#L6413">6413</a>
<a class="jxr_linenumber" name="L6414" href="#L6414">6414</a> <strong class="jxr_keyword">var</strong> m = <strong class="jxr_keyword">new</strong> LinkedHashMap<String,String>();
<a class="jxr_linenumber" name="L6415" href="#L6415">6415</a>
diff --git a/site/xref/org/apache/juneau/rest/RestSession.html b/site/xref/org/apache/juneau/rest/RestSession.html
index f89761880b..1765d4a985 100644
--- a/site/xref/org/apache/juneau/rest/RestSession.html
+++ b/site/xref/org/apache/juneau/rest/RestSession.html
@@ -388,7 +388,7 @@
<a class="jxr_linenumber" name="L380" href="#L380">380</a> @SuppressWarnings(<span class="jxr_string">"unchecked"</span>)
<a class="jxr_linenumber" name="L381" href="#L381">381</a> <strong class="jxr_keyword">public</strong> Map<String,String> getPathVars() {
<a class="jxr_linenumber" name="L382" href="#L382">382</a> <strong class="jxr_keyword">var</strong> m = (Map<String,String>)req.getAttribute(REST_PATHVARS_ATTR);
-<a class="jxr_linenumber" name="L383" href="#L383">383</a> <strong class="jxr_keyword">return</strong> m == <strong class="jxr_keyword">null</strong> ? Collections.emptyMap() : m;
+<a class="jxr_linenumber" name="L383" href="#L383">383</a> <strong class="jxr_keyword">return</strong> m == <strong class="jxr_keyword">null</strong> ? mape() : m;
<a class="jxr_linenumber" name="L384" href="#L384">384</a> }
<a class="jxr_linenumber" name="L385" href="#L385">385</a>
<a class="jxr_linenumber" name="L386" href="#L386">386</a> <em class="jxr_javadoccomment">/**</em>
diff --git a/site/xref/org/apache/juneau/rest/httppart/RequestPathParams.html b/site/xref/org/apache/juneau/rest/httppart/RequestPathParams.html
index 0587ff9cc7..1f6d0e94ec 100644
--- a/site/xref/org/apache/juneau/rest/httppart/RequestPathParams.html
+++ b/site/xref/org/apache/juneau/rest/httppart/RequestPathParams.html
@@ -136,7 +136,7 @@
<a class="jxr_linenumber" name="L128" href="#L128">128</a>
<a class="jxr_linenumber" name="L129" href="#L129">129</a> <em class="jxr_comment">// Add parameters from parent context if any.</em>
<a class="jxr_linenumber" name="L130" href="#L130">130</a> @SuppressWarnings(<span class="jxr_string">"unchecked"</span>)
-<a class="jxr_linenumber" name="L131" href="#L131">131</a> <strong class="jxr_keyword">var</strong> parentVars = (Map<String,String>)req.getAttribute(<span class="jxr_string">"juneau.pathVars"</span>).orElse(Collections.emptyMap());
+<a class="jxr_linenumber" name="L131" href="#L131">131</a> <strong class="jxr_keyword">var</strong> parentVars = (Map<String,String>)req.getAttribute(<span class="jxr_string">"juneau.pathVars"</span>).orElse(mape());
<a class="jxr_linenumber" name="L132" href="#L132">132</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> e : parentVars.entrySet())
<a class="jxr_linenumber" name="L133" href="#L133">133</a> add(e.getKey(), e.getValue());
<a class="jxr_linenumber" name="L134" href="#L134">134</a>
diff --git a/site/xref/org/apache/juneau/rest/mock/MockPathResolver.html b/site/xref/org/apache/juneau/rest/mock/MockPathResolver.html
index bd598d8f6f..789753e514 100644
--- a/site/xref/org/apache/juneau/rest/mock/MockPathResolver.html
+++ b/site/xref/org/apache/juneau/rest/mock/MockPathResolver.html
@@ -24,227 +24,228 @@
<a class="jxr_linenumber" name="L16" href="#L16">16</a> <em class="jxr_comment"> */</em>
<a class="jxr_linenumber" name="L17" href="#L17">17</a> <strong class="jxr_keyword">package</strong> org.apache.juneau.<strong class="jxr_keyword">rest</strong>.mock;
<a class="jxr_linenumber" name="L18" href="#L18">18</a>
-<a class="jxr_linenumber" name="L19" href="#L19">19</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.StateEnum.*;
-<a class="jxr_linenumber" name="L20" href="#L20">20</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.StringUtils.*;
-<a class="jxr_linenumber" name="L21" href="#L21">21</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.ThrowableUtils.*;
-<a class="jxr_linenumber" name="L22" href="#L22">22</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.Utils.*;
-<a class="jxr_linenumber" name="L23" href="#L23">23</a>
-<a class="jxr_linenumber" name="L24" href="#L24">24</a> <strong class="jxr_keyword">import</strong> java.util.*;
-<a class="jxr_linenumber" name="L25" href="#L25">25</a>
-<a class="jxr_linenumber" name="L26" href="#L26">26</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.collections.*;
-<a class="jxr_linenumber" name="L27" href="#L27">27</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.commons.utils.*;
-<a class="jxr_linenumber" name="L28" href="#L28">28</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.<strong class="jxr_keyword">rest</strong>.util.*;
-<a class="jxr_linenumber" name="L29" href="#L29">29</a>
-<a class="jxr_linenumber" name="L30" href="#L30">30</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L31" href="#L31">31</a> <em class="jxr_javadoccomment"> * Used to resolve incoming URLS to the various URL artifacts of <l>HttpServletRequest</l>.</em>
-<a class="jxr_linenumber" name="L32" href="#L32">32</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L33" href="#L33">33</a> <em class="jxr_javadoccomment"> * <h5 class='section'>See Also:</h5><ul></em>
-<a class="jxr_linenumber" name="L34" href="#L34">34</a> <em class="jxr_javadoccomment"> * <li class='link'><a class="doclink" href="<a href="https://juneau.apache.org/docs/topics/JuneauRestMockBasics" target="alexandria_uri">https://juneau.apache.org/docs/topics/JuneauRestMockBasics</a>">juneau-rest-mock Basics</a></em>
-<a class="jxr_linenumber" name="L35" href="#L35">35</a> <em class="jxr_javadoccomment"> * </ul></em>
-<a class="jxr_linenumber" name="L36" href="#L36">36</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L37" href="#L37">37</a> <strong class="jxr_keyword">class</strong> <a name="MockPathResolver" href="../../../../../org/apache/juneau/rest/mock/MockPathResolver.html#MockPathResolver">MockPathResolver</a> {
-<a class="jxr_linenumber" name="L38" href="#L38">38</a>
-<a class="jxr_linenumber" name="L39" href="#L39">39</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> String fixSegment(String s, Map<String,Object> pathVars) {
-<a class="jxr_linenumber" name="L40" href="#L40">40</a> s = formatNamed(emptyIfNull(s), pathVars);
-<a class="jxr_linenumber" name="L41" href="#L41">41</a> <strong class="jxr_keyword">if</strong> (s.isEmpty() || s.equals(<span class="jxr_string">"/"</span>))
-<a class="jxr_linenumber" name="L42" href="#L42">42</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L43" href="#L43">43</a> s = trimTrailingSlashes(s);
-<a class="jxr_linenumber" name="L44" href="#L44">44</a> <strong class="jxr_keyword">if</strong> (s.charAt(0) != '/')
-<a class="jxr_linenumber" name="L45" href="#L45">45</a> s = '/' + s;
-<a class="jxr_linenumber" name="L46" href="#L46">46</a> <strong class="jxr_keyword">return</strong> s;
-<a class="jxr_linenumber" name="L47" href="#L47">47</a>
-<a class="jxr_linenumber" name="L48" href="#L48">48</a> }
-<a class="jxr_linenumber" name="L49" href="#L49">49</a>
-<a class="jxr_linenumber" name="L50" href="#L50">50</a> <strong class="jxr_keyword">private</strong> String uri, target, contextPath, servletPath, remainder;
-<a class="jxr_linenumber" name="L51" href="#L51">51</a>
-<a class="jxr_linenumber" name="L52" href="#L52">52</a> <strong class="jxr_keyword">private</strong> String error;
-<a class="jxr_linenumber" name="L53" href="#L53">53</a>
-<a class="jxr_linenumber" name="L54" href="#L54">54</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L55" href="#L55">55</a> <em class="jxr_javadoccomment"> * Constructor.</em>
-<a class="jxr_linenumber" name="L56" href="#L56">56</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L57" href="#L57">57</a> <em class="jxr_javadoccomment"> * @param target</em>
-<a class="jxr_linenumber" name="L58" href="#L58">58</a> <em class="jxr_javadoccomment"> * The target portion of the URL (e.g. <js>"<a href="http://localhost" target="alexandria_uri">http://localhost</a>"</js>).</em>
-<a class="jxr_linenumber" name="L59" href="#L59">59</a> <em class="jxr_javadoccomment"> * <br>If <jk>null</jk>, <js>"<a href="http://localhost" target="alexandria_uri">http://localhost</a>"</js> is assumed.</em>
-<a class="jxr_linenumber" name="L60" href="#L60">60</a> <em class="jxr_javadoccomment"> * @param contextPath</em>
-<a class="jxr_linenumber" name="L61" href="#L61">61</a> <em class="jxr_javadoccomment"> * The context path of the servlet, or <jk>null</jk> if unknown or doesn't have one.</em>
-<a class="jxr_linenumber" name="L62" href="#L62">62</a> <em class="jxr_javadoccomment"> * @param servletPath</em>
-<a class="jxr_linenumber" name="L63" href="#L63">63</a> <em class="jxr_javadoccomment"> * The servlet path of the servlet, or <jk>null</jk> if unknown or doesn't have one.</em>
-<a class="jxr_linenumber" name="L64" href="#L64">64</a> <em class="jxr_javadoccomment"> * @param pathToResolve</em>
-<a class="jxr_linenumber" name="L65" href="#L65">65</a> <em class="jxr_javadoccomment"> * The path to resolve.</em>
-<a class="jxr_linenumber" name="L66" href="#L66">66</a> <em class="jxr_javadoccomment"> * <br>Can be relative to servlet or an absolute path.</em>
-<a class="jxr_linenumber" name="L67" href="#L67">67</a> <em class="jxr_javadoccomment"> * @param pathVars</em>
-<a class="jxr_linenumber" name="L68" href="#L68">68</a> <em class="jxr_javadoccomment"> * Optional path variables to resolve in the context path or servlet path.</em>
-<a class="jxr_linenumber" name="L69" href="#L69">69</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L70" href="#L70">70</a> <strong class="jxr_keyword">public</strong> <a name="MockPathResolver" href="../../../../../org/apache/juneau/rest/mock/MockPathResolver.html#MockPathResolver">MockPathResolver</a>(String target, String contextPath, String servletPath, String pathToResolve, Map<String,Object> pathVars) {
-<a class="jxr_linenumber" name="L71" href="#L71">71</a> <strong class="jxr_keyword">try</strong> {
-<a class="jxr_linenumber" name="L72" href="#L72">72</a> init(target, contextPath, servletPath, pathToResolve, pathVars);
-<a class="jxr_linenumber" name="L73" href="#L73">73</a> } <strong class="jxr_keyword">catch</strong> (Exception e) {
-<a class="jxr_linenumber" name="L74" href="#L74">74</a> error = lm(e);
-<a class="jxr_linenumber" name="L75" href="#L75">75</a> }
-<a class="jxr_linenumber" name="L76" href="#L76">76</a> }
-<a class="jxr_linenumber" name="L77" href="#L77">77</a>
-<a class="jxr_linenumber" name="L78" href="#L78">78</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L79" href="#L79">79</a> <em class="jxr_javadoccomment"> * Returns the context path of the URL.</em>
-<a class="jxr_linenumber" name="L80" href="#L80">80</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L81" href="#L81">81</a> <em class="jxr_javadoccomment"> * @return The context path of the URL always starting with <js>'/'</js>, or an empty string if it doesn't exist.</em>
-<a class="jxr_linenumber" name="L82" href="#L82">82</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L83" href="#L83">83</a> <strong class="jxr_keyword">public</strong> String getContextPath() { <strong class="jxr_keyword">return</strong> contextPath; }
-<a class="jxr_linenumber" name="L84" href="#L84">84</a>
-<a class="jxr_linenumber" name="L85" href="#L85">85</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L86" href="#L86">86</a> <em class="jxr_javadoccomment"> * Returns any parsing errors.</em>
-<a class="jxr_linenumber" name="L87" href="#L87">87</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L88" href="#L88">88</a> <em class="jxr_javadoccomment"> * @return Any parsing errors.</em>
-<a class="jxr_linenumber" name="L89" href="#L89">89</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L90" href="#L90">90</a> <strong class="jxr_keyword">public</strong> String getError() { <strong class="jxr_keyword">return</strong> error; }
-<a class="jxr_linenumber" name="L91" href="#L91">91</a>
-<a class="jxr_linenumber" name="L92" href="#L92">92</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L93" href="#L93">93</a> <em class="jxr_javadoccomment"> * Returns the remainder of the URL following the context and servlet paths.</em>
-<a class="jxr_linenumber" name="L94" href="#L94">94</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L95" href="#L95">95</a> <em class="jxr_javadoccomment"> * @return The remainder of the URL.</em>
-<a class="jxr_linenumber" name="L96" href="#L96">96</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L97" href="#L97">97</a> <strong class="jxr_keyword">public</strong> String getRemainder() { <strong class="jxr_keyword">return</strong> remainder; }
-<a class="jxr_linenumber" name="L98" href="#L98">98</a>
-<a class="jxr_linenumber" name="L99" href="#L99">99</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L100" href="#L100">100</a> <em class="jxr_javadoccomment"> * Returns the servlet path of the URL.</em>
-<a class="jxr_linenumber" name="L101" href="#L101">101</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L102" href="#L102">102</a> <em class="jxr_javadoccomment"> * @return The servlet path of the URL always starting with <js>'/'</js>, or an empty string if it doesn't exist.</em>
-<a class="jxr_linenumber" name="L103" href="#L103">103</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L104" href="#L104">104</a> <strong class="jxr_keyword">public</strong> String getServletPath() { <strong class="jxr_keyword">return</strong> servletPath; }
-<a class="jxr_linenumber" name="L105" href="#L105">105</a>
-<a class="jxr_linenumber" name="L106" href="#L106">106</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L107" href="#L107">107</a> <em class="jxr_javadoccomment"> * Returns just the hostname portion of the URL.</em>
-<a class="jxr_linenumber" name="L108" href="#L108">108</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L109" href="#L109">109</a> <em class="jxr_javadoccomment"> * @return The hostname portion of the URL.</em>
-<a class="jxr_linenumber" name="L110" href="#L110">110</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L111" href="#L111">111</a> <strong class="jxr_keyword">public</strong> String getTarget() { <strong class="jxr_keyword">return</strong> target; }
-<a class="jxr_linenumber" name="L112" href="#L112">112</a>
-<a class="jxr_linenumber" name="L113" href="#L113">113</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L114" href="#L114">114</a> <em class="jxr_javadoccomment"> * Returns the fully-qualified URL.</em>
-<a class="jxr_linenumber" name="L115" href="#L115">115</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L116" href="#L116">116</a> <em class="jxr_javadoccomment"> * @return The fully-qualified URL.</em>
-<a class="jxr_linenumber" name="L117" href="#L117">117</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L118" href="#L118">118</a> <strong class="jxr_keyword">public</strong> String getURI() { <strong class="jxr_keyword">return</strong> uri; }
-<a class="jxr_linenumber" name="L119" href="#L119">119</a>
-<a class="jxr_linenumber" name="L120" href="#L120">120</a> @Override
-<a class="jxr_linenumber" name="L121" href="#L121">121</a> <strong class="jxr_keyword">public</strong> String toString() {
-<a class="jxr_linenumber" name="L122" href="#L122">122</a> <em class="jxr_comment">// @formatter:off</em>
-<a class="jxr_linenumber" name="L123" href="#L123">123</a> <strong class="jxr_keyword">return</strong> JsonMap.create()
-<a class="jxr_linenumber" name="L124" href="#L124">124</a> .append(<span class="jxr_string">"uri"</span>, uri)
-<a class="jxr_linenumber" name="L125" href="#L125">125</a> .append(<span class="jxr_string">"contextPath"</span>, contextPath)
-<a class="jxr_linenumber" name="L126" href="#L126">126</a> .append(<span class="jxr_string">"servletPath"</span>, servletPath)
-<a class="jxr_linenumber" name="L127" href="#L127">127</a> .append(<span class="jxr_string">"remainder"</span>, remainder)
-<a class="jxr_linenumber" name="L128" href="#L128">128</a> .append(<span class="jxr_string">"target"</span>, target)
-<a class="jxr_linenumber" name="L129" href="#L129">129</a> .append(<span class="jxr_string">"error"</span>, error)
-<a class="jxr_linenumber" name="L130" href="#L130">130</a> .toString();
-<a class="jxr_linenumber" name="L131" href="#L131">131</a> <em class="jxr_comment">// @formatter:on</em>
-<a class="jxr_linenumber" name="L132" href="#L132">132</a> }
-<a class="jxr_linenumber" name="L133" href="#L133">133</a>
-<a class="jxr_linenumber" name="L134" href="#L134">134</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> init(String target, String contextPath, String servletPath, String pathToResolve, Map<String,Object> pathVars) {
-<a class="jxr_linenumber" name="L135" href="#L135">135</a>
-<a class="jxr_linenumber" name="L136" href="#L136">136</a> target = trimTrailingSlashes(emptyIfNull(target));
-<a class="jxr_linenumber" name="L137" href="#L137">137</a> <strong class="jxr_keyword">if</strong> (target.isEmpty())
-<a class="jxr_linenumber" name="L138" href="#L138">138</a> target = <span class="jxr_string">"http://localhost"</span>;
-<a class="jxr_linenumber" name="L139" href="#L139">139</a>
-<a class="jxr_linenumber" name="L140" href="#L140">140</a> contextPath = fixSegment(contextPath, pathVars);
-<a class="jxr_linenumber" name="L141" href="#L141">141</a> servletPath = fixSegment(servletPath, pathVars);
-<a class="jxr_linenumber" name="L142" href="#L142">142</a> pathToResolve = emptyIfNull(pathToResolve);
-<a class="jxr_linenumber" name="L143" href="#L143">143</a>
-<a class="jxr_linenumber" name="L144" href="#L144">144</a> <strong class="jxr_keyword">if</strong> (! (pathToResolve.startsWith(<span class="jxr_string">"http://"</span>) || pathToResolve.startsWith(<span class="jxr_string">"https://"</span>))) {
-<a class="jxr_linenumber" name="L145" href="#L145">145</a> pathToResolve = fixSegment(pathToResolve, Collections.emptyMap());
-<a class="jxr_linenumber" name="L146" href="#L146">146</a> <strong class="jxr_keyword">this</strong>.uri = target + contextPath + servletPath + pathToResolve;
-<a class="jxr_linenumber" name="L147" href="#L147">147</a> <strong class="jxr_keyword">this</strong>.target = target;
-<a class="jxr_linenumber" name="L148" href="#L148">148</a> <strong class="jxr_keyword">this</strong>.contextPath = contextPath;
-<a class="jxr_linenumber" name="L149" href="#L149">149</a> <strong class="jxr_keyword">this</strong>.servletPath = servletPath;
-<a class="jxr_linenumber" name="L150" href="#L150">150</a> <strong class="jxr_keyword">this</strong>.remainder = pathToResolve;
-<a class="jxr_linenumber" name="L151" href="#L151">151</a> <strong class="jxr_keyword">return</strong>;
-<a class="jxr_linenumber" name="L152" href="#L152">152</a> }
-<a class="jxr_linenumber" name="L153" href="#L153">153</a>
-<a class="jxr_linenumber" name="L154" href="#L154">154</a> <em class="jxr_comment">// Path starts with http[s]: so we have to parse it to resolve variables.</em>
-<a class="jxr_linenumber" name="L155" href="#L155">155</a> <strong class="jxr_keyword">this</strong>.uri = pathToResolve;
-<a class="jxr_linenumber" name="L156" href="#L156">156</a>
-<a class="jxr_linenumber" name="L157" href="#L157">157</a> <em class="jxr_comment">// S3 - Found "http://", looking for any character other than '/' (end of target).</em>
-<a class="jxr_linenumber" name="L158" href="#L158">158</a> <em class="jxr_comment">// S4 - Found any character, looking for 3rd '/' (end of target).</em>
-<a class="jxr_linenumber" name="L159" href="#L159">159</a> <em class="jxr_comment">// S5 - Found 3rd '/', resolving contextPath.</em>
-<a class="jxr_linenumber" name="L160" href="#L160">160</a> <em class="jxr_comment">// S6 - Resolved contextPath, resolving servletPath.</em>
-<a class="jxr_linenumber" name="L161" href="#L161">161</a> <em class="jxr_comment">// S7 - Resolved servletPath.</em>
-<a class="jxr_linenumber" name="L162" href="#L162">162</a> StateEnum state = S3;
-<a class="jxr_linenumber" name="L163" href="#L163">163</a>
-<a class="jxr_linenumber" name="L164" href="#L164">164</a> <strong class="jxr_keyword">int</strong> cpSegments = countChars(contextPath, '/');
-<a class="jxr_linenumber" name="L165" href="#L165">165</a> <strong class="jxr_keyword">int</strong> spSegments = countChars(servletPath, '/');
-<a class="jxr_linenumber" name="L166" href="#L166">166</a>
-<a class="jxr_linenumber" name="L167" href="#L167">167</a> <strong class="jxr_keyword">this</strong>.contextPath = <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L168" href="#L168">168</a> <strong class="jxr_keyword">this</strong>.servletPath = <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L169" href="#L169">169</a> <strong class="jxr_keyword">this</strong>.remainder = <span class="jxr_string">""</span>;
-<a class="jxr_linenumber" name="L170" href="#L170">170</a>
-<a class="jxr_linenumber" name="L171" href="#L171">171</a> <strong class="jxr_keyword">int</strong> mark = 0;
-<a class="jxr_linenumber" name="L172" href="#L172">172</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = uri.indexOf(<span class="jxr_string">"://"</span>) + 3; i < uri.length(); i++) {
-<a class="jxr_linenumber" name="L173" href="#L173">173</a> <strong class="jxr_keyword">var</strong> c = uri.charAt(i);
-<a class="jxr_linenumber" name="L174" href="#L174">174</a> <strong class="jxr_keyword">if</strong> (state == S3) {
-<a class="jxr_linenumber" name="L175" href="#L175">175</a> <strong class="jxr_keyword">if</strong> (c != '/')
-<a class="jxr_linenumber" name="L176" href="#L176">176</a> state = S4;
-<a class="jxr_linenumber" name="L177" href="#L177">177</a> <strong class="jxr_keyword">else</strong>
-<a class="jxr_linenumber" name="L178" href="#L178">178</a> <strong class="jxr_keyword">break</strong>;
-<a class="jxr_linenumber" name="L179" href="#L179">179</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S4) {
-<a class="jxr_linenumber" name="L180" href="#L180">180</a> <strong class="jxr_keyword">if</strong> (c == '/') {
-<a class="jxr_linenumber" name="L181" href="#L181">181</a> <strong class="jxr_keyword">this</strong>.target = uri.substring(0, i);
-<a class="jxr_linenumber" name="L182" href="#L182">182</a> state = S5;
-<a class="jxr_linenumber" name="L183" href="#L183">183</a> <strong class="jxr_keyword">if</strong> (contextPath.isEmpty()) {
-<a class="jxr_linenumber" name="L184" href="#L184">184</a> state = S6;
-<a class="jxr_linenumber" name="L185" href="#L185">185</a> <strong class="jxr_keyword">if</strong> (servletPath.isEmpty()) {
-<a class="jxr_linenumber" name="L186" href="#L186">186</a> state = S7;
-<a class="jxr_linenumber" name="L187" href="#L187">187</a> }
-<a class="jxr_linenumber" name="L188" href="#L188">188</a> }
-<a class="jxr_linenumber" name="L189" href="#L189">189</a> mark = i;
-<a class="jxr_linenumber" name="L190" href="#L190">190</a> }
-<a class="jxr_linenumber" name="L191" href="#L191">191</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S5) {
-<a class="jxr_linenumber" name="L192" href="#L192">192</a> <strong class="jxr_keyword">if</strong> (c == '/') {
-<a class="jxr_linenumber" name="L193" href="#L193">193</a> cpSegments--;
-<a class="jxr_linenumber" name="L194" href="#L194">194</a> <strong class="jxr_keyword">if</strong> (cpSegments == 0) {
-<a class="jxr_linenumber" name="L195" href="#L195">195</a> <strong class="jxr_keyword">this</strong>.contextPath = uri.substring(mark, i);
-<a class="jxr_linenumber" name="L196" href="#L196">196</a> mark = i;
-<a class="jxr_linenumber" name="L197" href="#L197">197</a> state = S6;
-<a class="jxr_linenumber" name="L198" href="#L198">198</a> <strong class="jxr_keyword">if</strong> (servletPath.isEmpty()) {
-<a class="jxr_linenumber" name="L199" href="#L199">199</a> state = S7;
-<a class="jxr_linenumber" name="L200" href="#L200">200</a> }
-<a class="jxr_linenumber" name="L201" href="#L201">201</a> }
-<a class="jxr_linenumber" name="L202" href="#L202">202</a> }
-<a class="jxr_linenumber" name="L203" href="#L203">203</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S6) {
-<a class="jxr_linenumber" name="L204" href="#L204">204</a> <strong class="jxr_keyword">if</strong> (c == '/') {
-<a class="jxr_linenumber" name="L205" href="#L205">205</a> spSegments--;
-<a class="jxr_linenumber" name="L206" href="#L206">206</a> <strong class="jxr_keyword">if</strong> (spSegments == 0) {
-<a class="jxr_linenumber" name="L207" href="#L207">207</a> <strong class="jxr_keyword">this</strong>.servletPath = uri.substring(mark, i);
-<a class="jxr_linenumber" name="L208" href="#L208">208</a> mark = i;
-<a class="jxr_linenumber" name="L209" href="#L209">209</a> state = S7;
-<a class="jxr_linenumber" name="L210" href="#L210">210</a> }
-<a class="jxr_linenumber" name="L211" href="#L211">211</a> }
-<a class="jxr_linenumber" name="L212" href="#L212">212</a> }
-<a class="jxr_linenumber" name="L213" href="#L213">213</a> }
-<a class="jxr_linenumber" name="L214" href="#L214">214</a>
-<a class="jxr_linenumber" name="L215" href="#L215">215</a> <strong class="jxr_keyword">if</strong> (state == S4) {
-<a class="jxr_linenumber" name="L216" href="#L216">216</a> <strong class="jxr_keyword">this</strong>.target = uri;
-<a class="jxr_linenumber" name="L217" href="#L217">217</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S5) {
-<a class="jxr_linenumber" name="L218" href="#L218">218</a> <strong class="jxr_keyword">this</strong>.contextPath = uri.substring(mark);
-<a class="jxr_linenumber" name="L219" href="#L219">219</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S6) {
-<a class="jxr_linenumber" name="L220" href="#L220">220</a> <strong class="jxr_keyword">this</strong>.servletPath = uri.substring(mark);
-<a class="jxr_linenumber" name="L221" href="#L221">221</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S7) {
-<a class="jxr_linenumber" name="L222" href="#L222">222</a> <strong class="jxr_keyword">this</strong>.remainder = uri.substring(mark);
-<a class="jxr_linenumber" name="L223" href="#L223">223</a> } <strong class="jxr_keyword">else</strong> {
-<a class="jxr_linenumber" name="L224" href="#L224">224</a> <strong class="jxr_keyword">throw</strong> rex(<span class="jxr_string">"Invalid URI pattern encountered: {0}"</span>, uri);
-<a class="jxr_linenumber" name="L225" href="#L225">225</a> }
-<a class="jxr_linenumber" name="L226" href="#L226">226</a>
-<a class="jxr_linenumber" name="L227" href="#L227">227</a> <strong class="jxr_keyword">if</strong> (! contextPath.isEmpty()) {
-<a class="jxr_linenumber" name="L228" href="#L228">228</a> <strong class="jxr_keyword">var</strong> p = UrlPathMatcher.of(contextPath);
-<a class="jxr_linenumber" name="L229" href="#L229">229</a> <strong class="jxr_keyword">if</strong> (p.match(UrlPath.of(<strong class="jxr_keyword">this</strong>.contextPath)) == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L230" href="#L230">230</a> <strong class="jxr_keyword">throw</strong> rex(<span class="jxr_string">"Context path [{0}] not found in URI: {1}"</span>, contextPath, uri);
-<a class="jxr_linenumber" name="L231" href="#L231">231</a> }
-<a class="jxr_linenumber" name="L232" href="#L232">232</a>
-<a class="jxr_linenumber" name="L233" href="#L233">233</a> <strong class="jxr_keyword">if</strong> (! servletPath.isEmpty()) {
-<a class="jxr_linenumber" name="L234" href="#L234">234</a> <strong class="jxr_keyword">var</strong> p = UrlPathMatcher.of(servletPath);
-<a class="jxr_linenumber" name="L235" href="#L235">235</a> <strong class="jxr_keyword">if</strong> (p.match(UrlPath.of(<strong class="jxr_keyword">this</strong>.servletPath)) == <strong class="jxr_keyword">null</strong>)
-<a class="jxr_linenumber" name="L236" href="#L236">236</a> <strong class="jxr_keyword">throw</strong> rex(<span class="jxr_string">"Servlet path [{0}] not found in URI: {1}"</span>, servletPath, uri);
-<a class="jxr_linenumber" name="L237" href="#L237">237</a> }
-<a class="jxr_linenumber" name="L238" href="#L238">238</a> }
-<a class="jxr_linenumber" name="L239" href="#L239">239</a> }
+<a class="jxr_linenumber" name="L19" href="#L19">19</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.CollectionUtils.*;
+<a class="jxr_linenumber" name="L20" href="#L20">20</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.StateEnum.*;
+<a class="jxr_linenumber" name="L21" href="#L21">21</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.StringUtils.*;
+<a class="jxr_linenumber" name="L22" href="#L22">22</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.ThrowableUtils.*;
+<a class="jxr_linenumber" name="L23" href="#L23">23</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.Utils.*;
+<a class="jxr_linenumber" name="L24" href="#L24">24</a>
+<a class="jxr_linenumber" name="L25" href="#L25">25</a> <strong class="jxr_keyword">import</strong> java.util.*;
+<a class="jxr_linenumber" name="L26" href="#L26">26</a>
+<a class="jxr_linenumber" name="L27" href="#L27">27</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.collections.*;
+<a class="jxr_linenumber" name="L28" href="#L28">28</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.commons.utils.*;
+<a class="jxr_linenumber" name="L29" href="#L29">29</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.<strong class="jxr_keyword">rest</strong>.util.*;
+<a class="jxr_linenumber" name="L30" href="#L30">30</a>
+<a class="jxr_linenumber" name="L31" href="#L31">31</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L32" href="#L32">32</a> <em class="jxr_javadoccomment"> * Used to resolve incoming URLS to the various URL artifacts of <l>HttpServletRequest</l>.</em>
+<a class="jxr_linenumber" name="L33" href="#L33">33</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L34" href="#L34">34</a> <em class="jxr_javadoccomment"> * <h5 class='section'>See Also:</h5><ul></em>
+<a class="jxr_linenumber" name="L35" href="#L35">35</a> <em class="jxr_javadoccomment"> * <li class='link'><a class="doclink" href="<a href="https://juneau.apache.org/docs/topics/JuneauRestMockBasics" target="alexandria_uri">https://juneau.apache.org/docs/topics/JuneauRestMockBasics</a>">juneau-rest-mock Basics</a></em>
+<a class="jxr_linenumber" name="L36" href="#L36">36</a> <em class="jxr_javadoccomment"> * </ul></em>
+<a class="jxr_linenumber" name="L37" href="#L37">37</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L38" href="#L38">38</a> <strong class="jxr_keyword">class</strong> <a name="MockPathResolver" href="../../../../../org/apache/juneau/rest/mock/MockPathResolver.html#MockPathResolver">MockPathResolver</a> {
+<a class="jxr_linenumber" name="L39" href="#L39">39</a>
+<a class="jxr_linenumber" name="L40" href="#L40">40</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">static</strong> String fixSegment(String s, Map<String,Object> pathVars) {
+<a class="jxr_linenumber" name="L41" href="#L41">41</a> s = formatNamed(emptyIfNull(s), pathVars);
+<a class="jxr_linenumber" name="L42" href="#L42">42</a> <strong class="jxr_keyword">if</strong> (s.isEmpty() || s.equals(<span class="jxr_string">"/"</span>))
+<a class="jxr_linenumber" name="L43" href="#L43">43</a> <strong class="jxr_keyword">return</strong> <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L44" href="#L44">44</a> s = trimTrailingSlashes(s);
+<a class="jxr_linenumber" name="L45" href="#L45">45</a> <strong class="jxr_keyword">if</strong> (s.charAt(0) != '/')
+<a class="jxr_linenumber" name="L46" href="#L46">46</a> s = '/' + s;
+<a class="jxr_linenumber" name="L47" href="#L47">47</a> <strong class="jxr_keyword">return</strong> s;
+<a class="jxr_linenumber" name="L48" href="#L48">48</a>
+<a class="jxr_linenumber" name="L49" href="#L49">49</a> }
+<a class="jxr_linenumber" name="L50" href="#L50">50</a>
+<a class="jxr_linenumber" name="L51" href="#L51">51</a> <strong class="jxr_keyword">private</strong> String uri, target, contextPath, servletPath, remainder;
+<a class="jxr_linenumber" name="L52" href="#L52">52</a>
+<a class="jxr_linenumber" name="L53" href="#L53">53</a> <strong class="jxr_keyword">private</strong> String error;
+<a class="jxr_linenumber" name="L54" href="#L54">54</a>
+<a class="jxr_linenumber" name="L55" href="#L55">55</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L56" href="#L56">56</a> <em class="jxr_javadoccomment"> * Constructor.</em>
+<a class="jxr_linenumber" name="L57" href="#L57">57</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L58" href="#L58">58</a> <em class="jxr_javadoccomment"> * @param target</em>
+<a class="jxr_linenumber" name="L59" href="#L59">59</a> <em class="jxr_javadoccomment"> * The target portion of the URL (e.g. <js>"<a href="http://localhost" target="alexandria_uri">http://localhost</a>"</js>).</em>
+<a class="jxr_linenumber" name="L60" href="#L60">60</a> <em class="jxr_javadoccomment"> * <br>If <jk>null</jk>, <js>"<a href="http://localhost" target="alexandria_uri">http://localhost</a>"</js> is assumed.</em>
+<a class="jxr_linenumber" name="L61" href="#L61">61</a> <em class="jxr_javadoccomment"> * @param contextPath</em>
+<a class="jxr_linenumber" name="L62" href="#L62">62</a> <em class="jxr_javadoccomment"> * The context path of the servlet, or <jk>null</jk> if unknown or doesn't have one.</em>
+<a class="jxr_linenumber" name="L63" href="#L63">63</a> <em class="jxr_javadoccomment"> * @param servletPath</em>
+<a class="jxr_linenumber" name="L64" href="#L64">64</a> <em class="jxr_javadoccomment"> * The servlet path of the servlet, or <jk>null</jk> if unknown or doesn't have one.</em>
+<a class="jxr_linenumber" name="L65" href="#L65">65</a> <em class="jxr_javadoccomment"> * @param pathToResolve</em>
+<a class="jxr_linenumber" name="L66" href="#L66">66</a> <em class="jxr_javadoccomment"> * The path to resolve.</em>
+<a class="jxr_linenumber" name="L67" href="#L67">67</a> <em class="jxr_javadoccomment"> * <br>Can be relative to servlet or an absolute path.</em>
+<a class="jxr_linenumber" name="L68" href="#L68">68</a> <em class="jxr_javadoccomment"> * @param pathVars</em>
+<a class="jxr_linenumber" name="L69" href="#L69">69</a> <em class="jxr_javadoccomment"> * Optional path variables to resolve in the context path or servlet path.</em>
+<a class="jxr_linenumber" name="L70" href="#L70">70</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L71" href="#L71">71</a> <strong class="jxr_keyword">public</strong> <a name="MockPathResolver" href="../../../../../org/apache/juneau/rest/mock/MockPathResolver.html#MockPathResolver">MockPathResolver</a>(String target, String contextPath, String servletPath, String pathToResolve, Map<String,Object> pathVars) {
+<a class="jxr_linenumber" name="L72" href="#L72">72</a> <strong class="jxr_keyword">try</strong> {
+<a class="jxr_linenumber" name="L73" href="#L73">73</a> init(target, contextPath, servletPath, pathToResolve, pathVars);
+<a class="jxr_linenumber" name="L74" href="#L74">74</a> } <strong class="jxr_keyword">catch</strong> (Exception e) {
+<a class="jxr_linenumber" name="L75" href="#L75">75</a> error = lm(e);
+<a class="jxr_linenumber" name="L76" href="#L76">76</a> }
+<a class="jxr_linenumber" name="L77" href="#L77">77</a> }
+<a class="jxr_linenumber" name="L78" href="#L78">78</a>
+<a class="jxr_linenumber" name="L79" href="#L79">79</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L80" href="#L80">80</a> <em class="jxr_javadoccomment"> * Returns the context path of the URL.</em>
+<a class="jxr_linenumber" name="L81" href="#L81">81</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L82" href="#L82">82</a> <em class="jxr_javadoccomment"> * @return The context path of the URL always starting with <js>'/'</js>, or an empty string if it doesn't exist.</em>
+<a class="jxr_linenumber" name="L83" href="#L83">83</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L84" href="#L84">84</a> <strong class="jxr_keyword">public</strong> String getContextPath() { <strong class="jxr_keyword">return</strong> contextPath; }
+<a class="jxr_linenumber" name="L85" href="#L85">85</a>
+<a class="jxr_linenumber" name="L86" href="#L86">86</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L87" href="#L87">87</a> <em class="jxr_javadoccomment"> * Returns any parsing errors.</em>
+<a class="jxr_linenumber" name="L88" href="#L88">88</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L89" href="#L89">89</a> <em class="jxr_javadoccomment"> * @return Any parsing errors.</em>
+<a class="jxr_linenumber" name="L90" href="#L90">90</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L91" href="#L91">91</a> <strong class="jxr_keyword">public</strong> String getError() { <strong class="jxr_keyword">return</strong> error; }
+<a class="jxr_linenumber" name="L92" href="#L92">92</a>
+<a class="jxr_linenumber" name="L93" href="#L93">93</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L94" href="#L94">94</a> <em class="jxr_javadoccomment"> * Returns the remainder of the URL following the context and servlet paths.</em>
+<a class="jxr_linenumber" name="L95" href="#L95">95</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L96" href="#L96">96</a> <em class="jxr_javadoccomment"> * @return The remainder of the URL.</em>
+<a class="jxr_linenumber" name="L97" href="#L97">97</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L98" href="#L98">98</a> <strong class="jxr_keyword">public</strong> String getRemainder() { <strong class="jxr_keyword">return</strong> remainder; }
+<a class="jxr_linenumber" name="L99" href="#L99">99</a>
+<a class="jxr_linenumber" name="L100" href="#L100">100</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L101" href="#L101">101</a> <em class="jxr_javadoccomment"> * Returns the servlet path of the URL.</em>
+<a class="jxr_linenumber" name="L102" href="#L102">102</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L103" href="#L103">103</a> <em class="jxr_javadoccomment"> * @return The servlet path of the URL always starting with <js>'/'</js>, or an empty string if it doesn't exist.</em>
+<a class="jxr_linenumber" name="L104" href="#L104">104</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L105" href="#L105">105</a> <strong class="jxr_keyword">public</strong> String getServletPath() { <strong class="jxr_keyword">return</strong> servletPath; }
+<a class="jxr_linenumber" name="L106" href="#L106">106</a>
+<a class="jxr_linenumber" name="L107" href="#L107">107</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L108" href="#L108">108</a> <em class="jxr_javadoccomment"> * Returns just the hostname portion of the URL.</em>
+<a class="jxr_linenumber" name="L109" href="#L109">109</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L110" href="#L110">110</a> <em class="jxr_javadoccomment"> * @return The hostname portion of the URL.</em>
+<a class="jxr_linenumber" name="L111" href="#L111">111</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L112" href="#L112">112</a> <strong class="jxr_keyword">public</strong> String getTarget() { <strong class="jxr_keyword">return</strong> target; }
+<a class="jxr_linenumber" name="L113" href="#L113">113</a>
+<a class="jxr_linenumber" name="L114" href="#L114">114</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L115" href="#L115">115</a> <em class="jxr_javadoccomment"> * Returns the fully-qualified URL.</em>
+<a class="jxr_linenumber" name="L116" href="#L116">116</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L117" href="#L117">117</a> <em class="jxr_javadoccomment"> * @return The fully-qualified URL.</em>
+<a class="jxr_linenumber" name="L118" href="#L118">118</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L119" href="#L119">119</a> <strong class="jxr_keyword">public</strong> String getURI() { <strong class="jxr_keyword">return</strong> uri; }
+<a class="jxr_linenumber" name="L120" href="#L120">120</a>
+<a class="jxr_linenumber" name="L121" href="#L121">121</a> @Override
+<a class="jxr_linenumber" name="L122" href="#L122">122</a> <strong class="jxr_keyword">public</strong> String toString() {
+<a class="jxr_linenumber" name="L123" href="#L123">123</a> <em class="jxr_comment">// @formatter:off</em>
+<a class="jxr_linenumber" name="L124" href="#L124">124</a> <strong class="jxr_keyword">return</strong> JsonMap.create()
+<a class="jxr_linenumber" name="L125" href="#L125">125</a> .append(<span class="jxr_string">"uri"</span>, uri)
+<a class="jxr_linenumber" name="L126" href="#L126">126</a> .append(<span class="jxr_string">"contextPath"</span>, contextPath)
+<a class="jxr_linenumber" name="L127" href="#L127">127</a> .append(<span class="jxr_string">"servletPath"</span>, servletPath)
+<a class="jxr_linenumber" name="L128" href="#L128">128</a> .append(<span class="jxr_string">"remainder"</span>, remainder)
+<a class="jxr_linenumber" name="L129" href="#L129">129</a> .append(<span class="jxr_string">"target"</span>, target)
+<a class="jxr_linenumber" name="L130" href="#L130">130</a> .append(<span class="jxr_string">"error"</span>, error)
+<a class="jxr_linenumber" name="L131" href="#L131">131</a> .toString();
+<a class="jxr_linenumber" name="L132" href="#L132">132</a> <em class="jxr_comment">// @formatter:on</em>
+<a class="jxr_linenumber" name="L133" href="#L133">133</a> }
+<a class="jxr_linenumber" name="L134" href="#L134">134</a>
+<a class="jxr_linenumber" name="L135" href="#L135">135</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">void</strong> init(String target, String contextPath, String servletPath, String pathToResolve, Map<String,Object> pathVars) {
+<a class="jxr_linenumber" name="L136" href="#L136">136</a>
+<a class="jxr_linenumber" name="L137" href="#L137">137</a> target = trimTrailingSlashes(emptyIfNull(target));
+<a class="jxr_linenumber" name="L138" href="#L138">138</a> <strong class="jxr_keyword">if</strong> (target.isEmpty())
+<a class="jxr_linenumber" name="L139" href="#L139">139</a> target = <span class="jxr_string">"http://localhost"</span>;
+<a class="jxr_linenumber" name="L140" href="#L140">140</a>
+<a class="jxr_linenumber" name="L141" href="#L141">141</a> contextPath = fixSegment(contextPath, pathVars);
+<a class="jxr_linenumber" name="L142" href="#L142">142</a> servletPath = fixSegment(servletPath, pathVars);
+<a class="jxr_linenumber" name="L143" href="#L143">143</a> pathToResolve = emptyIfNull(pathToResolve);
+<a class="jxr_linenumber" name="L144" href="#L144">144</a>
+<a class="jxr_linenumber" name="L145" href="#L145">145</a> <strong class="jxr_keyword">if</strong> (! (pathToResolve.startsWith(<span class="jxr_string">"http://"</span>) || pathToResolve.startsWith(<span class="jxr_string">"https://"</span>))) {
+<a class="jxr_linenumber" name="L146" href="#L146">146</a> pathToResolve = fixSegment(pathToResolve, mape());
+<a class="jxr_linenumber" name="L147" href="#L147">147</a> <strong class="jxr_keyword">this</strong>.uri = target + contextPath + servletPath + pathToResolve;
+<a class="jxr_linenumber" name="L148" href="#L148">148</a> <strong class="jxr_keyword">this</strong>.target = target;
+<a class="jxr_linenumber" name="L149" href="#L149">149</a> <strong class="jxr_keyword">this</strong>.contextPath = contextPath;
+<a class="jxr_linenumber" name="L150" href="#L150">150</a> <strong class="jxr_keyword">this</strong>.servletPath = servletPath;
+<a class="jxr_linenumber" name="L151" href="#L151">151</a> <strong class="jxr_keyword">this</strong>.remainder = pathToResolve;
+<a class="jxr_linenumber" name="L152" href="#L152">152</a> <strong class="jxr_keyword">return</strong>;
+<a class="jxr_linenumber" name="L153" href="#L153">153</a> }
+<a class="jxr_linenumber" name="L154" href="#L154">154</a>
+<a class="jxr_linenumber" name="L155" href="#L155">155</a> <em class="jxr_comment">// Path starts with http[s]: so we have to parse it to resolve variables.</em>
+<a class="jxr_linenumber" name="L156" href="#L156">156</a> <strong class="jxr_keyword">this</strong>.uri = pathToResolve;
+<a class="jxr_linenumber" name="L157" href="#L157">157</a>
+<a class="jxr_linenumber" name="L158" href="#L158">158</a> <em class="jxr_comment">// S3 - Found "http://", looking for any character other than '/' (end of target).</em>
+<a class="jxr_linenumber" name="L159" href="#L159">159</a> <em class="jxr_comment">// S4 - Found any character, looking for 3rd '/' (end of target).</em>
+<a class="jxr_linenumber" name="L160" href="#L160">160</a> <em class="jxr_comment">// S5 - Found 3rd '/', resolving contextPath.</em>
+<a class="jxr_linenumber" name="L161" href="#L161">161</a> <em class="jxr_comment">// S6 - Resolved contextPath, resolving servletPath.</em>
+<a class="jxr_linenumber" name="L162" href="#L162">162</a> <em class="jxr_comment">// S7 - Resolved servletPath.</em>
+<a class="jxr_linenumber" name="L163" href="#L163">163</a> StateEnum state = S3;
+<a class="jxr_linenumber" name="L164" href="#L164">164</a>
+<a class="jxr_linenumber" name="L165" href="#L165">165</a> <strong class="jxr_keyword">int</strong> cpSegments = countChars(contextPath, '/');
+<a class="jxr_linenumber" name="L166" href="#L166">166</a> <strong class="jxr_keyword">int</strong> spSegments = countChars(servletPath, '/');
+<a class="jxr_linenumber" name="L167" href="#L167">167</a>
+<a class="jxr_linenumber" name="L168" href="#L168">168</a> <strong class="jxr_keyword">this</strong>.contextPath = <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L169" href="#L169">169</a> <strong class="jxr_keyword">this</strong>.servletPath = <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L170" href="#L170">170</a> <strong class="jxr_keyword">this</strong>.remainder = <span class="jxr_string">""</span>;
+<a class="jxr_linenumber" name="L171" href="#L171">171</a>
+<a class="jxr_linenumber" name="L172" href="#L172">172</a> <strong class="jxr_keyword">int</strong> mark = 0;
+<a class="jxr_linenumber" name="L173" href="#L173">173</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> i = uri.indexOf(<span class="jxr_string">"://"</span>) + 3; i < uri.length(); i++) {
+<a class="jxr_linenumber" name="L174" href="#L174">174</a> <strong class="jxr_keyword">var</strong> c = uri.charAt(i);
+<a class="jxr_linenumber" name="L175" href="#L175">175</a> <strong class="jxr_keyword">if</strong> (state == S3) {
+<a class="jxr_linenumber" name="L176" href="#L176">176</a> <strong class="jxr_keyword">if</strong> (c != '/')
+<a class="jxr_linenumber" name="L177" href="#L177">177</a> state = S4;
+<a class="jxr_linenumber" name="L178" href="#L178">178</a> <strong class="jxr_keyword">else</strong>
+<a class="jxr_linenumber" name="L179" href="#L179">179</a> <strong class="jxr_keyword">break</strong>;
+<a class="jxr_linenumber" name="L180" href="#L180">180</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S4) {
+<a class="jxr_linenumber" name="L181" href="#L181">181</a> <strong class="jxr_keyword">if</strong> (c == '/') {
+<a class="jxr_linenumber" name="L182" href="#L182">182</a> <strong class="jxr_keyword">this</strong>.target = uri.substring(0, i);
+<a class="jxr_linenumber" name="L183" href="#L183">183</a> state = S5;
+<a class="jxr_linenumber" name="L184" href="#L184">184</a> <strong class="jxr_keyword">if</strong> (contextPath.isEmpty()) {
+<a class="jxr_linenumber" name="L185" href="#L185">185</a> state = S6;
+<a class="jxr_linenumber" name="L186" href="#L186">186</a> <strong class="jxr_keyword">if</strong> (servletPath.isEmpty()) {
+<a class="jxr_linenumber" name="L187" href="#L187">187</a> state = S7;
+<a class="jxr_linenumber" name="L188" href="#L188">188</a> }
+<a class="jxr_linenumber" name="L189" href="#L189">189</a> }
+<a class="jxr_linenumber" name="L190" href="#L190">190</a> mark = i;
+<a class="jxr_linenumber" name="L191" href="#L191">191</a> }
+<a class="jxr_linenumber" name="L192" href="#L192">192</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S5) {
+<a class="jxr_linenumber" name="L193" href="#L193">193</a> <strong class="jxr_keyword">if</strong> (c == '/') {
+<a class="jxr_linenumber" name="L194" href="#L194">194</a> cpSegments--;
+<a class="jxr_linenumber" name="L195" href="#L195">195</a> <strong class="jxr_keyword">if</strong> (cpSegments == 0) {
+<a class="jxr_linenumber" name="L196" href="#L196">196</a> <strong class="jxr_keyword">this</strong>.contextPath = uri.substring(mark, i);
+<a class="jxr_linenumber" name="L197" href="#L197">197</a> mark = i;
+<a class="jxr_linenumber" name="L198" href="#L198">198</a> state = S6;
+<a class="jxr_linenumber" name="L199" href="#L199">199</a> <strong class="jxr_keyword">if</strong> (servletPath.isEmpty()) {
+<a class="jxr_linenumber" name="L200" href="#L200">200</a> state = S7;
+<a class="jxr_linenumber" name="L201" href="#L201">201</a> }
+<a class="jxr_linenumber" name="L202" href="#L202">202</a> }
+<a class="jxr_linenumber" name="L203" href="#L203">203</a> }
+<a class="jxr_linenumber" name="L204" href="#L204">204</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S6) {
+<a class="jxr_linenumber" name="L205" href="#L205">205</a> <strong class="jxr_keyword">if</strong> (c == '/') {
+<a class="jxr_linenumber" name="L206" href="#L206">206</a> spSegments--;
+<a class="jxr_linenumber" name="L207" href="#L207">207</a> <strong class="jxr_keyword">if</strong> (spSegments == 0) {
+<a class="jxr_linenumber" name="L208" href="#L208">208</a> <strong class="jxr_keyword">this</strong>.servletPath = uri.substring(mark, i);
+<a class="jxr_linenumber" name="L209" href="#L209">209</a> mark = i;
+<a class="jxr_linenumber" name="L210" href="#L210">210</a> state = S7;
+<a class="jxr_linenumber" name="L211" href="#L211">211</a> }
+<a class="jxr_linenumber" name="L212" href="#L212">212</a> }
+<a class="jxr_linenumber" name="L213" href="#L213">213</a> }
+<a class="jxr_linenumber" name="L214" href="#L214">214</a> }
+<a class="jxr_linenumber" name="L215" href="#L215">215</a>
+<a class="jxr_linenumber" name="L216" href="#L216">216</a> <strong class="jxr_keyword">if</strong> (state == S4) {
+<a class="jxr_linenumber" name="L217" href="#L217">217</a> <strong class="jxr_keyword">this</strong>.target = uri;
+<a class="jxr_linenumber" name="L218" href="#L218">218</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S5) {
+<a class="jxr_linenumber" name="L219" href="#L219">219</a> <strong class="jxr_keyword">this</strong>.contextPath = uri.substring(mark);
+<a class="jxr_linenumber" name="L220" href="#L220">220</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S6) {
+<a class="jxr_linenumber" name="L221" href="#L221">221</a> <strong class="jxr_keyword">this</strong>.servletPath = uri.substring(mark);
+<a class="jxr_linenumber" name="L222" href="#L222">222</a> } <strong class="jxr_keyword">else</strong> <strong class="jxr_keyword">if</strong> (state == S7) {
+<a class="jxr_linenumber" name="L223" href="#L223">223</a> <strong class="jxr_keyword">this</strong>.remainder = uri.substring(mark);
+<a class="jxr_linenumber" name="L224" href="#L224">224</a> } <strong class="jxr_keyword">else</strong> {
+<a class="jxr_linenumber" name="L225" href="#L225">225</a> <strong class="jxr_keyword">throw</strong> rex(<span class="jxr_string">"Invalid URI pattern encountered: {0}"</span>, uri);
+<a class="jxr_linenumber" name="L226" href="#L226">226</a> }
+<a class="jxr_linenumber" name="L227" href="#L227">227</a>
+<a class="jxr_linenumber" name="L228" href="#L228">228</a> <strong class="jxr_keyword">if</strong> (! contextPath.isEmpty()) {
+<a class="jxr_linenumber" name="L229" href="#L229">229</a> <strong class="jxr_keyword">var</strong> p = UrlPathMatcher.of(contextPath);
+<a class="jxr_linenumber" name="L230" href="#L230">230</a> <strong class="jxr_keyword">if</strong> (p.match(UrlPath.of(<strong class="jxr_keyword">this</strong>.contextPath)) == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L231" href="#L231">231</a> <strong class="jxr_keyword">throw</strong> rex(<span class="jxr_string">"Context path [{0}] not found in URI: {1}"</span>, contextPath, uri);
+<a class="jxr_linenumber" name="L232" href="#L232">232</a> }
+<a class="jxr_linenumber" name="L233" href="#L233">233</a>
+<a class="jxr_linenumber" name="L234" href="#L234">234</a> <strong class="jxr_keyword">if</strong> (! servletPath.isEmpty()) {
+<a class="jxr_linenumber" name="L235" href="#L235">235</a> <strong class="jxr_keyword">var</strong> p = UrlPathMatcher.of(servletPath);
+<a class="jxr_linenumber" name="L236" href="#L236">236</a> <strong class="jxr_keyword">if</strong> (p.match(UrlPath.of(<strong class="jxr_keyword">this</strong>.servletPath)) == <strong class="jxr_keyword">null</strong>)
+<a class="jxr_linenumber" name="L237" href="#L237">237</a> <strong class="jxr_keyword">throw</strong> rex(<span class="jxr_string">"Servlet path [{0}] not found in URI: {1}"</span>, servletPath, uri);
+<a class="jxr_linenumber" name="L238" href="#L238">238</a> }
+<a class="jxr_linenumber" name="L239" href="#L239">239</a> }
+<a class="jxr_linenumber" name="L240" href="#L240">240</a> }
</pre>
<hr/>
<div id="footer">© 2016–2025 <a href="https://www.apache.org/">The Apache Software Foundation</a></div>
diff --git a/site/xref/org/apache/juneau/rest/util/UrlPathMatch.html b/site/xref/org/apache/juneau/rest/util/UrlPathMatch.html
index 74a9469e5d..278d5ac35a 100644
--- a/site/xref/org/apache/juneau/rest/util/UrlPathMatch.html
+++ b/site/xref/org/apache/juneau/rest/util/UrlPathMatch.html
@@ -25,132 +25,133 @@
<a class="jxr_linenumber" name="L17" href="#L17">17</a> <strong class="jxr_keyword">package</strong> org.apache.juneau.<strong class="jxr_keyword">rest</strong>.util;
<a class="jxr_linenumber" name="L18" href="#L18">18</a>
<a class="jxr_linenumber" name="L19" href="#L19">19</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.collections.JsonMap.*;
-<a class="jxr_linenumber" name="L20" href="#L20">20</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.StringUtils.*;
-<a class="jxr_linenumber" name="L21" href="#L21">21</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.Utils.*;
-<a class="jxr_linenumber" name="L22" href="#L22">22</a>
-<a class="jxr_linenumber" name="L23" href="#L23">23</a> <strong class="jxr_keyword">import</strong> java.util.*;
-<a class="jxr_linenumber" name="L24" href="#L24">24</a>
-<a class="jxr_linenumber" name="L25" href="#L25">25</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.commons.collections.*;
-<a class="jxr_linenumber" name="L26" href="#L26">26</a>
-<a class="jxr_linenumber" name="L27" href="#L27">27</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L28" href="#L28">28</a> <em class="jxr_javadoccomment"> * Represents a URL path pattern match.</em>
-<a class="jxr_linenumber" name="L29" href="#L29">29</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L30" href="#L30">30</a> <em class="jxr_javadoccomment"> * For example, given the pattern <js>"/foo/{bar}/*"</js> and the path <js>"/foo/123/baz/qux"</js>, this match gives</em>
-<a class="jxr_linenumber" name="L31" href="#L31">31</a> <em class="jxr_javadoccomment"> * you a map containing <js>"{bar:123}"</js> and a remainder string containing <js>"baz/qux"</js>.</em>
-<a class="jxr_linenumber" name="L32" href="#L32">32</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L33" href="#L33">33</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L34" href="#L34">34</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a name="UrlPathMatch" href="../../../../../org/apache/juneau/rest/util/UrlPathMatch.html#UrlPathMatch">UrlPathMatch</a> {
-<a class="jxr_linenumber" name="L35" href="#L35">35</a>
-<a class="jxr_linenumber" name="L36" href="#L36">36</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> matchedParts;
-<a class="jxr_linenumber" name="L37" href="#L37">37</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> String path;
-<a class="jxr_linenumber" name="L38" href="#L38">38</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> Map<String,String> vars;
-<a class="jxr_linenumber" name="L39" href="#L39">39</a>
-<a class="jxr_linenumber" name="L40" href="#L40">40</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L41" href="#L41">41</a> <em class="jxr_javadoccomment"> * Constructor.</em>
-<a class="jxr_linenumber" name="L42" href="#L42">42</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L43" href="#L43">43</a> <em class="jxr_javadoccomment"> * @param path The path being matched against. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L44" href="#L44">44</a> <em class="jxr_javadoccomment"> * @param matchedParts The number of parts that were matched against the path.</em>
-<a class="jxr_linenumber" name="L45" href="#L45">45</a> <em class="jxr_javadoccomment"> * @param keys The variable keys. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L46" href="#L46">46</a> <em class="jxr_javadoccomment"> * @param values The variable values. Can be <jk>null</jk>.</em>
-<a class="jxr_linenumber" name="L47" href="#L47">47</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L48" href="#L48">48</a> <strong class="jxr_keyword">protected</strong> <a name="UrlPathMatch" href="../../../../../org/apache/juneau/rest/util/UrlPathMatch.html#UrlPathMatch">UrlPathMatch</a>(String path, <strong class="jxr_keyword">int</strong> matchedParts, String[] keys, String[] values) {
-<a class="jxr_linenumber" name="L49" href="#L49">49</a> <strong class="jxr_keyword">this</strong>.path = path;
-<a class="jxr_linenumber" name="L50" href="#L50">50</a> <strong class="jxr_keyword">this</strong>.matchedParts = matchedParts;
-<a class="jxr_linenumber" name="L51" href="#L51">51</a> <strong class="jxr_keyword">this</strong>.vars = keys == <strong class="jxr_keyword">null</strong> ? Collections.emptyMap() : <strong class="jxr_keyword">new</strong> SimpleMap<>(keys, values);
-<a class="jxr_linenumber" name="L52" href="#L52">52</a> }
-<a class="jxr_linenumber" name="L53" href="#L53">53</a>
-<a class="jxr_linenumber" name="L54" href="#L54">54</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L55" href="#L55">55</a> <em class="jxr_javadoccomment"> * Returns the part of the URL that the pattern matched against.</em>
-<a class="jxr_linenumber" name="L56" href="#L56">56</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L57" href="#L57">57</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L58" href="#L58">58</a> <em class="jxr_javadoccomment"> * The part of the URL that the pattern matched against.</em>
-<a class="jxr_linenumber" name="L59" href="#L59">59</a> <em class="jxr_javadoccomment"> * <br>Can be <jk>null</jk> if nothing matched.</em>
-<a class="jxr_linenumber" name="L60" href="#L60">60</a> <em class="jxr_javadoccomment"> * <br>Otherwise, always starts with <js>'/'</js>.</em>
-<a class="jxr_linenumber" name="L61" href="#L61">61</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L62" href="#L62">62</a> <strong class="jxr_keyword">public</strong> String getPrefix() {
-<a class="jxr_linenumber" name="L63" href="#L63">63</a> <strong class="jxr_keyword">var</strong> c = 0;
-<a class="jxr_linenumber" name="L64" href="#L64">64</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> j = 0; j < matchedParts; j++) {
-<a class="jxr_linenumber" name="L65" href="#L65">65</a> c = path.indexOf('/', c + 1);
-<a class="jxr_linenumber" name="L66" href="#L66">66</a> <strong class="jxr_keyword">if</strong> (c == -1)
-<a class="jxr_linenumber" name="L67" href="#L67">67</a> c = path.length();
-<a class="jxr_linenumber" name="L68" href="#L68">68</a> }
-<a class="jxr_linenumber" name="L69" href="#L69">69</a> <strong class="jxr_keyword">return</strong> nullIfEmpty(path.substring(0, c));
-<a class="jxr_linenumber" name="L70" href="#L70">70</a> }
-<a class="jxr_linenumber" name="L71" href="#L71">71</a>
-<a class="jxr_linenumber" name="L72" href="#L72">72</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L73" href="#L73">73</a> <em class="jxr_javadoccomment"> * Returns the remainder of the path after the pattern match has been made.</em>
-<a class="jxr_linenumber" name="L74" href="#L74">74</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L75" href="#L75">75</a> <em class="jxr_javadoccomment"> * <p></em>
-<a class="jxr_linenumber" name="L76" href="#L76">76</a> <em class="jxr_javadoccomment"> * Same as {#link {@link #getSuffix()} but trims the leading slash if there is one.</em>
-<a class="jxr_linenumber" name="L77" href="#L77">77</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L78" href="#L78">78</a> <em class="jxr_javadoccomment"> * @return The remainder of the path after the pattern match has been made.</em>
-<a class="jxr_linenumber" name="L79" href="#L79">79</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L80" href="#L80">80</a> <strong class="jxr_keyword">public</strong> String getRemainder() {
-<a class="jxr_linenumber" name="L81" href="#L81">81</a> <strong class="jxr_keyword">var</strong> suffix = getSuffix();
-<a class="jxr_linenumber" name="L82" href="#L82">82</a> <strong class="jxr_keyword">if</strong> (isNotEmpty(suffix) && suffix.charAt(0) == '/')
-<a class="jxr_linenumber" name="L83" href="#L83">83</a> suffix = suffix.substring(1);
-<a class="jxr_linenumber" name="L84" href="#L84">84</a> <strong class="jxr_keyword">return</strong> suffix;
-<a class="jxr_linenumber" name="L85" href="#L85">85</a> }
-<a class="jxr_linenumber" name="L86" href="#L86">86</a>
-<a class="jxr_linenumber" name="L87" href="#L87">87</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L88" href="#L88">88</a> <em class="jxr_javadoccomment"> * Returns the remainder of the URL after the pattern was matched.</em>
-<a class="jxr_linenumber" name="L89" href="#L89">89</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L90" href="#L90">90</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L91" href="#L91">91</a> <em class="jxr_javadoccomment"> * The remainder of the URL after the pattern was matched.</em>
-<a class="jxr_linenumber" name="L92" href="#L92">92</a> <em class="jxr_javadoccomment"> * <br>Can be <jk>null</jk> if nothing remains to be matched.</em>
-<a class="jxr_linenumber" name="L93" href="#L93">93</a> <em class="jxr_javadoccomment"> * <br>Otherwise, always starts with <js>'/'</js>.</em>
-<a class="jxr_linenumber" name="L94" href="#L94">94</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L95" href="#L95">95</a> <strong class="jxr_keyword">public</strong> String getSuffix() {
-<a class="jxr_linenumber" name="L96" href="#L96">96</a> <strong class="jxr_keyword">var</strong> s = path;
-<a class="jxr_linenumber" name="L97" href="#L97">97</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> j = 0; j < matchedParts; j++) {
-<a class="jxr_linenumber" name="L98" href="#L98">98</a> <strong class="jxr_keyword">var</strong> k = s.indexOf('/', 1);
-<a class="jxr_linenumber" name="L99" href="#L99">99</a> <strong class="jxr_keyword">if</strong> (k == -1)
-<a class="jxr_linenumber" name="L100" href="#L100">100</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
-<a class="jxr_linenumber" name="L101" href="#L101">101</a> s = s.substring(k);
-<a class="jxr_linenumber" name="L102" href="#L102">102</a> }
-<a class="jxr_linenumber" name="L103" href="#L103">103</a> <strong class="jxr_keyword">return</strong> s;
-<a class="jxr_linenumber" name="L104" href="#L104">104</a> }
-<a class="jxr_linenumber" name="L105" href="#L105">105</a>
-<a class="jxr_linenumber" name="L106" href="#L106">106</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L107" href="#L107">107</a> <em class="jxr_javadoccomment"> * Returns a map of the path variables and values.</em>
-<a class="jxr_linenumber" name="L108" href="#L108">108</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L109" href="#L109">109</a> <em class="jxr_javadoccomment"> * @return</em>
-<a class="jxr_linenumber" name="L110" href="#L110">110</a> <em class="jxr_javadoccomment"> * An unmodifiable map of variable keys/values.</em>
-<a class="jxr_linenumber" name="L111" href="#L111">111</a> <em class="jxr_javadoccomment"> * <br>Returns an empty map if no variables were found in the path.</em>
-<a class="jxr_linenumber" name="L112" href="#L112">112</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L113" href="#L113">113</a> <strong class="jxr_keyword">public</strong> Map<String,String> getVars() { <strong class="jxr_keyword">return</strong> vars; }
-<a class="jxr_linenumber" name="L114" href="#L114">114</a>
-<a class="jxr_linenumber" name="L115" href="#L115">115</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L116" href="#L116">116</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if any of the variable values are blank.</em>
-<a class="jxr_linenumber" name="L117" href="#L117">117</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L118" href="#L118">118</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if any of the variable values are blank.</em>
-<a class="jxr_linenumber" name="L119" href="#L119">119</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L120" href="#L120">120</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">boolean</strong> hasEmptyVars() {
-<a class="jxr_linenumber" name="L121" href="#L121">121</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> v : vars.values())
-<a class="jxr_linenumber" name="L122" href="#L122">122</a> <strong class="jxr_keyword">if</strong> (isEmpty(v))
-<a class="jxr_linenumber" name="L123" href="#L123">123</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">true</strong>;
-<a class="jxr_linenumber" name="L124" href="#L124">124</a> <strong class="jxr_keyword">return</strong> false;
-<a class="jxr_linenumber" name="L125" href="#L125">125</a> }
-<a class="jxr_linenumber" name="L126" href="#L126">126</a>
-<a class="jxr_linenumber" name="L127" href="#L127">127</a> <em class="jxr_javadoccomment">/**</em>
-<a class="jxr_linenumber" name="L128" href="#L128">128</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if this match contains one or more variables.</em>
-<a class="jxr_linenumber" name="L129" href="#L129">129</a> <em class="jxr_javadoccomment"> *</em>
-<a class="jxr_linenumber" name="L130" href="#L130">130</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if this match contains one or more variables.</em>
-<a class="jxr_linenumber" name="L131" href="#L131">131</a> <em class="jxr_javadoccomment"> */</em>
-<a class="jxr_linenumber" name="L132" href="#L132">132</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">boolean</strong> hasVars() {
-<a class="jxr_linenumber" name="L133" href="#L133">133</a> <strong class="jxr_keyword">return</strong> ! vars.isEmpty();
-<a class="jxr_linenumber" name="L134" href="#L134">134</a> }
-<a class="jxr_linenumber" name="L135" href="#L135">135</a>
-<a class="jxr_linenumber" name="L136" href="#L136">136</a> @Override <em class="jxr_comment">/* Overridden from Object */</em>
-<a class="jxr_linenumber" name="L137" href="#L137">137</a> <strong class="jxr_keyword">public</strong> String toString() {
-<a class="jxr_linenumber" name="L138" href="#L138">138</a> <em class="jxr_comment">// @formatter:off</em>
-<a class="jxr_linenumber" name="L139" href="#L139">139</a> <strong class="jxr_keyword">return</strong> filteredMap()
-<a class="jxr_linenumber" name="L140" href="#L140">140</a> .append(<span class="jxr_string">"v"</span>, getVars())
-<a class="jxr_linenumber" name="L141" href="#L141">141</a> .append(<span class="jxr_string">"r"</span>, getRemainder())
-<a class="jxr_linenumber" name="L142" href="#L142">142</a> .asString();
-<a class="jxr_linenumber" name="L143" href="#L143">143</a> <em class="jxr_comment">// @formatter:on</em>
-<a class="jxr_linenumber" name="L144" href="#L144">144</a> }
-<a class="jxr_linenumber" name="L145" href="#L145">145</a> }
+<a class="jxr_linenumber" name="L20" href="#L20">20</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.CollectionUtils.*;
+<a class="jxr_linenumber" name="L21" href="#L21">21</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.StringUtils.*;
+<a class="jxr_linenumber" name="L22" href="#L22">22</a> <strong class="jxr_keyword">import</strong> <strong class="jxr_keyword">static</strong> org.apache.juneau.commons.utils.Utils.*;
+<a class="jxr_linenumber" name="L23" href="#L23">23</a>
+<a class="jxr_linenumber" name="L24" href="#L24">24</a> <strong class="jxr_keyword">import</strong> java.util.*;
+<a class="jxr_linenumber" name="L25" href="#L25">25</a>
+<a class="jxr_linenumber" name="L26" href="#L26">26</a> <strong class="jxr_keyword">import</strong> org.apache.juneau.commons.collections.*;
+<a class="jxr_linenumber" name="L27" href="#L27">27</a>
+<a class="jxr_linenumber" name="L28" href="#L28">28</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L29" href="#L29">29</a> <em class="jxr_javadoccomment"> * Represents a URL path pattern match.</em>
+<a class="jxr_linenumber" name="L30" href="#L30">30</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L31" href="#L31">31</a> <em class="jxr_javadoccomment"> * For example, given the pattern <js>"/foo/{bar}/*"</js> and the path <js>"/foo/123/baz/qux"</js>, this match gives</em>
+<a class="jxr_linenumber" name="L32" href="#L32">32</a> <em class="jxr_javadoccomment"> * you a map containing <js>"{bar:123}"</js> and a remainder string containing <js>"baz/qux"</js>.</em>
+<a class="jxr_linenumber" name="L33" href="#L33">33</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L34" href="#L34">34</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L35" href="#L35">35</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">class</strong> <a name="UrlPathMatch" href="../../../../../org/apache/juneau/rest/util/UrlPathMatch.html#UrlPathMatch">UrlPathMatch</a> {
+<a class="jxr_linenumber" name="L36" href="#L36">36</a>
+<a class="jxr_linenumber" name="L37" href="#L37">37</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> <strong class="jxr_keyword">int</strong> matchedParts;
+<a class="jxr_linenumber" name="L38" href="#L38">38</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> String path;
+<a class="jxr_linenumber" name="L39" href="#L39">39</a> <strong class="jxr_keyword">private</strong> <strong class="jxr_keyword">final</strong> Map<String,String> vars;
+<a class="jxr_linenumber" name="L40" href="#L40">40</a>
+<a class="jxr_linenumber" name="L41" href="#L41">41</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L42" href="#L42">42</a> <em class="jxr_javadoccomment"> * Constructor.</em>
+<a class="jxr_linenumber" name="L43" href="#L43">43</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L44" href="#L44">44</a> <em class="jxr_javadoccomment"> * @param path The path being matched against. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L45" href="#L45">45</a> <em class="jxr_javadoccomment"> * @param matchedParts The number of parts that were matched against the path.</em>
+<a class="jxr_linenumber" name="L46" href="#L46">46</a> <em class="jxr_javadoccomment"> * @param keys The variable keys. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L47" href="#L47">47</a> <em class="jxr_javadoccomment"> * @param values The variable values. Can be <jk>null</jk>.</em>
+<a class="jxr_linenumber" name="L48" href="#L48">48</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L49" href="#L49">49</a> <strong class="jxr_keyword">protected</strong> <a name="UrlPathMatch" href="../../../../../org/apache/juneau/rest/util/UrlPathMatch.html#UrlPathMatch">UrlPathMatch</a>(String path, <strong class="jxr_keyword">int</strong> matchedParts, String[] keys, String[] values) {
+<a class="jxr_linenumber" name="L50" href="#L50">50</a> <strong class="jxr_keyword">this</strong>.path = path;
+<a class="jxr_linenumber" name="L51" href="#L51">51</a> <strong class="jxr_keyword">this</strong>.matchedParts = matchedParts;
+<a class="jxr_linenumber" name="L52" href="#L52">52</a> <strong class="jxr_keyword">this</strong>.vars = keys == <strong class="jxr_keyword">null</strong> ? mape() : <strong class="jxr_keyword">new</strong> SimpleMap<>(keys, values);
+<a class="jxr_linenumber" name="L53" href="#L53">53</a> }
+<a class="jxr_linenumber" name="L54" href="#L54">54</a>
+<a class="jxr_linenumber" name="L55" href="#L55">55</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L56" href="#L56">56</a> <em class="jxr_javadoccomment"> * Returns the part of the URL that the pattern matched against.</em>
+<a class="jxr_linenumber" name="L57" href="#L57">57</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L58" href="#L58">58</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L59" href="#L59">59</a> <em class="jxr_javadoccomment"> * The part of the URL that the pattern matched against.</em>
+<a class="jxr_linenumber" name="L60" href="#L60">60</a> <em class="jxr_javadoccomment"> * <br>Can be <jk>null</jk> if nothing matched.</em>
+<a class="jxr_linenumber" name="L61" href="#L61">61</a> <em class="jxr_javadoccomment"> * <br>Otherwise, always starts with <js>'/'</js>.</em>
+<a class="jxr_linenumber" name="L62" href="#L62">62</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L63" href="#L63">63</a> <strong class="jxr_keyword">public</strong> String getPrefix() {
+<a class="jxr_linenumber" name="L64" href="#L64">64</a> <strong class="jxr_keyword">var</strong> c = 0;
+<a class="jxr_linenumber" name="L65" href="#L65">65</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> j = 0; j < matchedParts; j++) {
+<a class="jxr_linenumber" name="L66" href="#L66">66</a> c = path.indexOf('/', c + 1);
+<a class="jxr_linenumber" name="L67" href="#L67">67</a> <strong class="jxr_keyword">if</strong> (c == -1)
+<a class="jxr_linenumber" name="L68" href="#L68">68</a> c = path.length();
+<a class="jxr_linenumber" name="L69" href="#L69">69</a> }
+<a class="jxr_linenumber" name="L70" href="#L70">70</a> <strong class="jxr_keyword">return</strong> nullIfEmpty(path.substring(0, c));
+<a class="jxr_linenumber" name="L71" href="#L71">71</a> }
+<a class="jxr_linenumber" name="L72" href="#L72">72</a>
+<a class="jxr_linenumber" name="L73" href="#L73">73</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L74" href="#L74">74</a> <em class="jxr_javadoccomment"> * Returns the remainder of the path after the pattern match has been made.</em>
+<a class="jxr_linenumber" name="L75" href="#L75">75</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L76" href="#L76">76</a> <em class="jxr_javadoccomment"> * <p></em>
+<a class="jxr_linenumber" name="L77" href="#L77">77</a> <em class="jxr_javadoccomment"> * Same as {#link {@link #getSuffix()} but trims the leading slash if there is one.</em>
+<a class="jxr_linenumber" name="L78" href="#L78">78</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L79" href="#L79">79</a> <em class="jxr_javadoccomment"> * @return The remainder of the path after the pattern match has been made.</em>
+<a class="jxr_linenumber" name="L80" href="#L80">80</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L81" href="#L81">81</a> <strong class="jxr_keyword">public</strong> String getRemainder() {
+<a class="jxr_linenumber" name="L82" href="#L82">82</a> <strong class="jxr_keyword">var</strong> suffix = getSuffix();
+<a class="jxr_linenumber" name="L83" href="#L83">83</a> <strong class="jxr_keyword">if</strong> (isNotEmpty(suffix) && suffix.charAt(0) == '/')
+<a class="jxr_linenumber" name="L84" href="#L84">84</a> suffix = suffix.substring(1);
+<a class="jxr_linenumber" name="L85" href="#L85">85</a> <strong class="jxr_keyword">return</strong> suffix;
+<a class="jxr_linenumber" name="L86" href="#L86">86</a> }
+<a class="jxr_linenumber" name="L87" href="#L87">87</a>
+<a class="jxr_linenumber" name="L88" href="#L88">88</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L89" href="#L89">89</a> <em class="jxr_javadoccomment"> * Returns the remainder of the URL after the pattern was matched.</em>
+<a class="jxr_linenumber" name="L90" href="#L90">90</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L91" href="#L91">91</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L92" href="#L92">92</a> <em class="jxr_javadoccomment"> * The remainder of the URL after the pattern was matched.</em>
+<a class="jxr_linenumber" name="L93" href="#L93">93</a> <em class="jxr_javadoccomment"> * <br>Can be <jk>null</jk> if nothing remains to be matched.</em>
+<a class="jxr_linenumber" name="L94" href="#L94">94</a> <em class="jxr_javadoccomment"> * <br>Otherwise, always starts with <js>'/'</js>.</em>
+<a class="jxr_linenumber" name="L95" href="#L95">95</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L96" href="#L96">96</a> <strong class="jxr_keyword">public</strong> String getSuffix() {
+<a class="jxr_linenumber" name="L97" href="#L97">97</a> <strong class="jxr_keyword">var</strong> s = path;
+<a class="jxr_linenumber" name="L98" href="#L98">98</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> j = 0; j < matchedParts; j++) {
+<a class="jxr_linenumber" name="L99" href="#L99">99</a> <strong class="jxr_keyword">var</strong> k = s.indexOf('/', 1);
+<a class="jxr_linenumber" name="L100" href="#L100">100</a> <strong class="jxr_keyword">if</strong> (k == -1)
+<a class="jxr_linenumber" name="L101" href="#L101">101</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">null</strong>;
+<a class="jxr_linenumber" name="L102" href="#L102">102</a> s = s.substring(k);
+<a class="jxr_linenumber" name="L103" href="#L103">103</a> }
+<a class="jxr_linenumber" name="L104" href="#L104">104</a> <strong class="jxr_keyword">return</strong> s;
+<a class="jxr_linenumber" name="L105" href="#L105">105</a> }
+<a class="jxr_linenumber" name="L106" href="#L106">106</a>
+<a class="jxr_linenumber" name="L107" href="#L107">107</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L108" href="#L108">108</a> <em class="jxr_javadoccomment"> * Returns a map of the path variables and values.</em>
+<a class="jxr_linenumber" name="L109" href="#L109">109</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L110" href="#L110">110</a> <em class="jxr_javadoccomment"> * @return</em>
+<a class="jxr_linenumber" name="L111" href="#L111">111</a> <em class="jxr_javadoccomment"> * An unmodifiable map of variable keys/values.</em>
+<a class="jxr_linenumber" name="L112" href="#L112">112</a> <em class="jxr_javadoccomment"> * <br>Returns an empty map if no variables were found in the path.</em>
+<a class="jxr_linenumber" name="L113" href="#L113">113</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L114" href="#L114">114</a> <strong class="jxr_keyword">public</strong> Map<String,String> getVars() { <strong class="jxr_keyword">return</strong> vars; }
+<a class="jxr_linenumber" name="L115" href="#L115">115</a>
+<a class="jxr_linenumber" name="L116" href="#L116">116</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L117" href="#L117">117</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if any of the variable values are blank.</em>
+<a class="jxr_linenumber" name="L118" href="#L118">118</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L119" href="#L119">119</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if any of the variable values are blank.</em>
+<a class="jxr_linenumber" name="L120" href="#L120">120</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L121" href="#L121">121</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">boolean</strong> hasEmptyVars() {
+<a class="jxr_linenumber" name="L122" href="#L122">122</a> <strong class="jxr_keyword">for</strong> (<strong class="jxr_keyword">var</strong> v : vars.values())
+<a class="jxr_linenumber" name="L123" href="#L123">123</a> <strong class="jxr_keyword">if</strong> (isEmpty(v))
+<a class="jxr_linenumber" name="L124" href="#L124">124</a> <strong class="jxr_keyword">return</strong> <strong class="jxr_keyword">true</strong>;
+<a class="jxr_linenumber" name="L125" href="#L125">125</a> <strong class="jxr_keyword">return</strong> false;
+<a class="jxr_linenumber" name="L126" href="#L126">126</a> }
+<a class="jxr_linenumber" name="L127" href="#L127">127</a>
+<a class="jxr_linenumber" name="L128" href="#L128">128</a> <em class="jxr_javadoccomment">/**</em>
+<a class="jxr_linenumber" name="L129" href="#L129">129</a> <em class="jxr_javadoccomment"> * Returns <jk>true</jk> if this match contains one or more variables.</em>
+<a class="jxr_linenumber" name="L130" href="#L130">130</a> <em class="jxr_javadoccomment"> *</em>
+<a class="jxr_linenumber" name="L131" href="#L131">131</a> <em class="jxr_javadoccomment"> * @return <jk>true</jk> if this match contains one or more variables.</em>
+<a class="jxr_linenumber" name="L132" href="#L132">132</a> <em class="jxr_javadoccomment"> */</em>
+<a class="jxr_linenumber" name="L133" href="#L133">133</a> <strong class="jxr_keyword">public</strong> <strong class="jxr_keyword">boolean</strong> hasVars() {
+<a class="jxr_linenumber" name="L134" href="#L134">134</a> <strong class="jxr_keyword">return</strong> ! vars.isEmpty();
+<a class="jxr_linenumber" name="L135" href="#L135">135</a> }
+<a class="jxr_linenumber" name="L136" href="#L136">136</a>
+<a class="jxr_linenumber" name="L137" href="#L137">137</a> @Override <em class="jxr_comment">/* Overridden from Object */</em>
+<a class="jxr_linenumber" name="L138" href="#L138">138</a> <strong class="jxr_keyword">public</strong> String toString() {
+<a class="jxr_linenumber" name="L139" href="#L139">139</a> <em class="jxr_comment">// @formatter:off</em>
+<a class="jxr_linenumber" name="L140" href="#L140">140</a> <strong class="jxr_keyword">return</strong> filteredMap()
+<a class="jxr_linenumber" name="L141" href="#L141">141</a> .append(<span class="jxr_string">"v"</span>, getVars())
+<a class="jxr_linenumber" name="L142" href="#L142">142</a> .append(<span class="jxr_string">"r"</span>, getRemainder())
+<a class="jxr_linenumber" name="L143" href="#L143">143</a> .asString();
+<a class="jxr_linenumber" name="L144" href="#L144">144</a> <em class="jxr_comment">// @formatter:on</em>
+<a class="jxr_linenumber" name="L145" href="#L145">145</a> }
+<a class="jxr_linenumber" name="L146" href="#L146">146</a> }
</pre>
<hr/>
<div id="footer">© 2016–2025 <a href="https://www.apache.org/">The Apache Software Foundation</a></div>
diff --git a/site/xref/org/apache/juneau/serializer/Serializer.html b/site/xref/org/apache/juneau/serializer/Serializer.html
index 7502cd16bc..1bda8b36f2 100644
--- a/site/xref/org/apache/juneau/serializer/Serializer.html
+++ b/site/xref/org/apache/juneau/serializer/Serializer.html
@@ -1387,7 +1387,7 @@
<a class="jxr_linenumber" name="L1379" href="#L1379">1379</a> <em class="jxr_javadoccomment"> * Never <jk>null</jk>.</em>
<a class="jxr_linenumber" name="L1380" href="#L1380">1380</a> <em class="jxr_javadoccomment"> */</em>
<a class="jxr_linenumber" name="L1381" href="#L1381">1381</a> <strong class="jxr_keyword">public</strong> Map<String,String> getResponseHeaders(<a name="SerializerSession" href="../../../../org/apache/juneau/serializer/SerializerSession.html#SerializerSession">SerializerSession</a> session) {
-<a class="jxr_linenumber" name="L1382" href="#L1382">1382</a> <strong class="jxr_keyword">return</strong> Collections.emptyMap();
+<a class="jxr_linenumber" name="L1382" href="#L1382">1382</a> <strong class="jxr_keyword">return</strong> mape();
<a class="jxr_linenumber" name="L1383" href="#L1383">1383</a> }
<a class="jxr_linenumber" name="L1384" href="#L1384">1384</a>
<a class="jxr_linenumber" name="L1385" href="#L1385">1385</a> @Override <em class="jxr_comment">/* Overridden from Context */</em>