You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2019/01/13 21:10:08 UTC

[juneau-website] branch asf-site updated: Javadocs.

This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/juneau-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new a45a2d8  Javadocs.
a45a2d8 is described below

commit a45a2d8f3f9d30da9108ec1e70580d2ca82ec35c
Author: JamesBognar <ja...@apache.org>
AuthorDate: Sun Jan 13 16:09:49 2019 -0500

    Javadocs.
---
 content/site/apidocs-8.0.1/index-all.html          |   12 +-
 .../apidocs-8.0.1/org/apache/juneau/BeanMeta.html  |   42 +-
 .../org/apache/juneau/config/Config.html           |  167 +-
 .../juneau/examples/core/dto/DtoExample.html       |    2 +-
 .../juneau/examples/core/dto/atom/AtomFeed.html    |    2 +-
 .../examples/core/dto/atom/AtomHtmlExample.html    |    2 +-
 .../examples/core/dto/atom/AtomJsonExample.html    |    2 +-
 .../examples/core/dto/atom/AtomXmlExample.html     |    2 +-
 .../examples/core/html/HtmlComplexExample.html     |    2 +-
 .../examples/core/html/HtmlSimpleExample.html      |    2 +-
 .../examples/core/json/JsonComplexExample.html     |    2 +-
 .../core/json/JsonConfigurationExample.html        |    2 +-
 .../examples/core/json/JsonSimpleExample.html      |    2 +-
 .../juneau/examples/core/oapi/OapiExample.html     |    2 +-
 .../org/apache/juneau/examples/core/pojo/Pojo.html |    2 +-
 .../juneau/examples/core/pojo/PojoComplex.html     |    2 +-
 .../examples/core/rdf/RdfComplexExample.html       |    2 +-
 .../juneau/examples/core/rdf/RdfExample.html       |    2 +-
 .../juneau/examples/core/svl/SvlExample.html       |    2 +-
 .../examples/core/uon/UONComplexExample.html       |    2 +-
 .../juneau/examples/core/uon/UONExample.html       |    2 +-
 .../examples/core/xml/XmlComplexExample.html       |    2 +-
 .../examples/core/xml/XmlConfigurationExample.html |    2 +-
 .../juneau/examples/core/xml/XmlSimpleExample.html |    2 +-
 .../apache/juneau/examples/rest/AdminGuard.html    |    2 +-
 .../juneau/examples/rest/HelloWorldResource.html   |    2 +-
 .../juneau/examples/rest/RequestEchoResource.html  |    2 +-
 .../apache/juneau/examples/rest/RootResources.html |    2 +-
 .../juneau/examples/rest/command/EchoCommand.html  |    2 +-
 .../juneau/examples/rest/dto/AtomFeedResource.html |    2 +-
 .../juneau/examples/rest/dto/DtoExamples.html      |    2 +-
 .../examples/rest/dto/JsonSchemaResource.html      |    2 +-
 .../rest/dto/PredefinedLabelsResource.html         |    2 +-
 .../org/apache/juneau/examples/rest/jetty/App.html |    2 +-
 .../rest/petstore/AbstractPersistenceService.html  |    2 +-
 .../examples/rest/petstore/ExpiresAfter.html       |    2 +-
 .../juneau/examples/rest/petstore/IdConflict.html  |    2 +-
 .../juneau/examples/rest/petstore/IdNotFound.html  |    2 +-
 .../juneau/examples/rest/petstore/InvalidId.html   |    2 +-
 .../examples/rest/petstore/InvalidLogin.html       |    2 +-
 .../examples/rest/petstore/InvalidSpecies.html     |    2 +-
 .../juneau/examples/rest/petstore/InvalidTag.html  |    2 +-
 .../examples/rest/petstore/InvalidUsername.html    |    2 +-
 .../examples/rest/petstore/PetStoreService.html    |    2 +-
 .../examples/rest/petstore/dto/CreateOrder.html    |    2 +-
 .../examples/rest/petstore/dto/CreatePet.html      |    2 +-
 .../juneau/examples/rest/petstore/dto/Order.html   |    2 +-
 .../examples/rest/petstore/dto/OrderStatus.html    |    2 +-
 .../juneau/examples/rest/petstore/dto/Pet.html     |    2 +-
 .../examples/rest/petstore/dto/PetStatus.html      |    2 +-
 .../juneau/examples/rest/petstore/dto/PetTag.html  |    2 +-
 .../examples/rest/petstore/dto/PetTagNameSwap.html |    2 +-
 .../juneau/examples/rest/petstore/dto/Species.html |    2 +-
 .../examples/rest/petstore/dto/UpdatePet.html      |    2 +-
 .../juneau/examples/rest/petstore/dto/User.html    |    2 +-
 .../examples/rest/petstore/dto/UserStatus.html     |    2 +-
 .../rest/petstore/rest/AddOrderMenuItem.html       |    2 +-
 .../rest/petstore/rest/AddPetMenuItem.html         |    2 +-
 .../examples/rest/petstore/rest/PetStore.html      |    2 +-
 .../rest/petstore/rest/PetStoreResource.html       |    2 +-
 .../rest/petstore/rest/PhotosResource.html         |    2 +-
 .../rest/petstore/rest/SqlQueryResource.html       |    2 +-
 .../rest/petstore/rest/UploadPhotoMenuItem.html    |    2 +-
 .../juneau/examples/rest/springboot/App.html       |    2 +-
 .../apache/juneau/microservice/Microservice.html   |   44 +-
 .../org/apache/juneau/rest/BasicRest.html          |   12 +-
 .../org/apache/juneau/rest/BasicRestGroup.html     |   17 +-
 .../org/apache/juneau/rest/BasicRestJena.html      |    6 +-
 .../org/apache/juneau/rest/BasicRestJenaGroup.html |    6 +-
 .../apache/juneau/rest/BasicRestServletGroup.html  |    2 +-
 .../org/apache/juneau/rest/package-summary.html    |   12 +-
 content/site/apidocs-8.0.1/overview-summary.html   |  151 +-
 .../src-html/org/apache/juneau/BeanMeta.html       | 1754 +++++-----
 .../src-html/org/apache/juneau/config/Config.html  | 3672 ++++++++++----------
 .../apache/juneau/microservice/Microservice.html   | 1205 ++++---
 .../src-html/org/apache/juneau/rest/BasicRest.html |  166 +-
 .../org/apache/juneau/rest/BasicRestGroup.html     |   63 +-
 .../org/apache/juneau/rest/BasicRestJena.html      |   52 +-
 .../org/apache/juneau/rest/BasicRestJenaGroup.html |   52 +-
 .../apache/juneau/rest/BasicRestServletGroup.html  |    2 +-
 80 files changed, 3790 insertions(+), 3769 deletions(-)

diff --git a/content/site/apidocs-8.0.1/index-all.html b/content/site/apidocs-8.0.1/index-all.html
index eaebe56..c604b8b 100644
--- a/content/site/apidocs-8.0.1/index-all.html
+++ b/content/site/apidocs-8.0.1/index-all.html
@@ -2701,7 +2701,9 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/juneau/rest/BasicRest.html" title="class in org.apache.juneau.rest"><span class="typeNameLink">BasicRest</span></a> - Class in <a href="org/apache/juneau/rest/package-summary.html">org.apache.juneau.rest</a></dt>
 <dd>
-<div class="block"><h5 class='section'>See Also:</div>
+<div class="block">Identical to <a href="org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest"><code>BasicRestServlet</code></a> but doesn't extend from <code>HttpServlet</code>
+
+ <h5 class='section'>See Also:</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/juneau/rest/BasicRest.html#BasicRest--">BasicRest()</a></span> - Constructor for class org.apache.juneau.rest.<a href="org/apache/juneau/rest/BasicRest.html" title="class in org.apache.juneau.rest">BasicRest</a></dt>
 <dd>&nbsp;</dd>
@@ -2719,7 +2721,9 @@
 </dd>
 <dt><a href="org/apache/juneau/rest/BasicRestGroup.html" title="class in org.apache.juneau.rest"><span class="typeNameLink">BasicRestGroup</span></a> - Class in <a href="org/apache/juneau/rest/package-summary.html">org.apache.juneau.rest</a></dt>
 <dd>
-<div class="block">Specialized subclass of <a href="org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest"><code>BasicRestServlet</code></a> for showing "group" pages.</div>
+<div class="block">Identical to <a href="org/apache/juneau/rest/BasicRestServletGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestServletGroup</code></a> but doesn't extend from <code>HttpServlet</code>
+
+ <h5 class='section'>See Also:</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/juneau/rest/BasicRestGroup.html#BasicRestGroup--">BasicRestGroup()</a></span> - Constructor for class org.apache.juneau.rest.<a href="org/apache/juneau/rest/BasicRestGroup.html" title="class in org.apache.juneau.rest">BasicRestGroup</a></dt>
 <dd>&nbsp;</dd>
@@ -2733,13 +2737,13 @@
 </dd>
 <dt><a href="org/apache/juneau/rest/BasicRestJena.html" title="class in org.apache.juneau.rest"><span class="typeNameLink">BasicRestJena</span></a> - Class in <a href="org/apache/juneau/rest/package-summary.html">org.apache.juneau.rest</a></dt>
 <dd>
-<div class="block">Resource servlet with additional RDF support.</div>
+<div class="block">Identical to <a href="org/apache/juneau/rest/BasicRestServletJena.html" title="class in org.apache.juneau.rest"><code>BasicRestServletJena</code></a> but doesn't extend from <code>HttpServlet</code></div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/juneau/rest/BasicRestJena.html#BasicRestJena--">BasicRestJena()</a></span> - Constructor for class org.apache.juneau.rest.<a href="org/apache/juneau/rest/BasicRestJena.html" title="class in org.apache.juneau.rest">BasicRestJena</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/juneau/rest/BasicRestJenaGroup.html" title="class in org.apache.juneau.rest"><span class="typeNameLink">BasicRestJenaGroup</span></a> - Class in <a href="org/apache/juneau/rest/package-summary.html">org.apache.juneau.rest</a></dt>
 <dd>
-<div class="block">Resource group with additional RDF support.</div>
+<div class="block">Identical to <a href="org/apache/juneau/rest/BasicRestServletJenaGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestServletJenaGroup</code></a> but doesn't extend from <code>HttpServlet</code></div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/juneau/rest/BasicRestJenaGroup.html#BasicRestJenaGroup--">BasicRestJenaGroup()</a></span> - Constructor for class org.apache.juneau.rest.<a href="org/apache/juneau/rest/BasicRestJenaGroup.html" title="class in org.apache.juneau.rest">BasicRestJenaGroup</a></dt>
 <dd>&nbsp;</dd>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/BeanMeta.html b/content/site/apidocs-8.0.1/org/apache/juneau/BeanMeta.html
index ace6218..0b0980b 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/BeanMeta.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/BeanMeta.html
@@ -116,7 +116,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.61">BeanMeta</a>&lt;T&gt;
+<pre>public class <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.63">BeanMeta</a>&lt;T&gt;
 extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Encapsulates all access to the properties of a bean class (like a souped-up <a href="http://docs.oracle.com/javase/8/docs/api/java/beans/BeanInfo.html?is-external=true" title="class or interface in java.beans"><code>BeanInfo</code></a>).
 
@@ -343,7 +343,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>classMeta</h4>
-<pre>protected final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="class in org.apache.juneau">ClassMeta</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt; <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.64">classMeta</a></pre>
+<pre>protected final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="class in org.apache.juneau">ClassMeta</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt; <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.66">classMeta</a></pre>
 <div class="block">The target class type that this meta object describes.</div>
 </li>
 </ul>
@@ -353,7 +353,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>c</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt; <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.67">c</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt; <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.69">c</a></pre>
 <div class="block">The target class that this meta object describes.</div>
 </li>
 </ul>
@@ -363,7 +363,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>properties</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&gt; <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.70"> [...]
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&gt; <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.72"> [...]
 <div class="block">The properties on the target class.</div>
 </li>
 </ul>
@@ -373,7 +373,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>getterProps</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../src-html [...]
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../src-html [...]
 <div class="block">The getter properties on the target class.</div>
 </li>
 </ul>
@@ -383,7 +383,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>setterProps</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../src-html [...]
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html?is-external=true" title="class or interface in java.lang.reflect">Method</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt; <a href="../../../src-html [...]
 <div class="block">The setter properties on the target class.</div>
 </li>
 </ul>
@@ -393,7 +393,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>ctx</h4>
-<pre>protected final&nbsp;<a href="../../../org/apache/juneau/BeanContext.html" title="class in org.apache.juneau">BeanContext</a> <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.79">ctx</a></pre>
+<pre>protected final&nbsp;<a href="../../../org/apache/juneau/BeanContext.html" title="class in org.apache.juneau">BeanContext</a> <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.81">ctx</a></pre>
 <div class="block">The bean context that created this metadata object.</div>
 </li>
 </ul>
@@ -403,7 +403,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>beanFilter</h4>
-<pre>protected final&nbsp;<a href="../../../org/apache/juneau/transform/BeanFilter.html" title="class in org.apache.juneau.transform">BeanFilter</a> <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.82">beanFilter</a></pre>
+<pre>protected final&nbsp;<a href="../../../org/apache/juneau/transform/BeanFilter.html" title="class in org.apache.juneau.transform">BeanFilter</a> <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.84">beanFilter</a></pre>
 <div class="block">Optional bean filter associated with the target class.</div>
 </li>
 </ul>
@@ -413,7 +413,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>typeVarImpls</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;[]&gt; <a href="../../../src-html [...]
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;[]&gt; <a href="../../../src-html [...]
 <div class="block">Type variables implemented by this bean.</div>
 </li>
 </ul>
@@ -423,7 +423,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockList">
 <li class="blockList">
 <h4>constructor</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html?is-external=true" title="class or interface in java.lang.reflect">Constructor</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt; <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.88">constructor</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html?is-external=true" title="class or interface in java.lang.reflect">Constructor</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt; <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.90">constructor</a></pre>
 <div class="block">The constructor for this bean.</div>
 </li>
 </ul>
@@ -433,7 +433,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>constructorArgs</h4>
-<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.91">constructorArgs</a></pre>
+<pre>protected final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[] <a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.93">constructorArgs</a></pre>
 <div class="block">For beans with constructors with BeanConstructor annotation, this is the list of constructor arg properties.</div>
 </li>
 </ul>
@@ -451,7 +451,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BeanMeta</h4>
-<pre>protected&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.113">BeanMeta</a>(<a href="../../../org/apache/juneau/ClassMeta.html" title="class in org.apache.juneau">ClassMeta</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt;&nbsp;classMeta,
+<pre>protected&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.115">BeanMeta</a>(<a href="../../../org/apache/juneau/ClassMeta.html" title="class in org.apache.juneau">ClassMeta</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt;&nbsp;classMeta,
                    <a href="../../../org/apache/juneau/BeanContext.html" title="class in org.apache.juneau">BeanContext</a>&nbsp;ctx,
                    <a href="../../../org/apache/juneau/transform/BeanFilter.html" title="class in org.apache.juneau.transform">BeanFilter</a>&nbsp;beanFilter,
                    <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;pNames)</pre>
@@ -480,7 +480,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 <li class="blockList">
 <h4>getClassMeta</h4>
 <pre><a href="../../../org/apache/juneau/annotation/BeanIgnore.html" title="annotation in org.apache.juneau.annotation">@BeanIgnore</a>
-public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="class in org.apache.juneau">ClassMeta</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt;&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.495">getClassMeta</a>()</pre>
+public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="class in org.apache.juneau">ClassMeta</a>&lt;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&gt;&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.497">getClassMeta</a>()</pre>
 <div class="block">Returns the <a href="../../../org/apache/juneau/ClassMeta.html" title="class in org.apache.juneau"><code>ClassMeta</code></a> of this bean.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -494,7 +494,7 @@ public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="cla
 <ul class="blockList">
 <li class="blockList">
 <h4>getDictionaryName</h4>
-<pre>public final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.504">getDictionaryName</a>()</pre>
+<pre>public final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.506">getDictionaryName</a>()</pre>
 <div class="block">Returns the dictionary name for this bean as defined through the <a href="../../../org/apache/juneau/annotation/Bean.html#typeName--"><code>@Bean(typeName)</code></a> annotation.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -508,7 +508,7 @@ public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="cla
 <ul class="blockList">
 <li class="blockList">
 <h4>getTypeProperty</h4>
-<pre>public final&nbsp;<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.514">getTypeProperty</a>()</pre>
+<pre>public final&nbsp;<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.516">getTypeProperty</a>()</pre>
 <div class="block">Returns a mock bean property that resolves to the name <js>"_type"</js> and whose value always resolves to the
  dictionary name of the bean.</div>
 <dl>
@@ -523,7 +523,7 @@ public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="cla
 <ul class="blockList">
 <li class="blockList">
 <h4>getPropertyMetas</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&gt;&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.764">getPropertyMetas</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&gt;&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.766">getPropertyMetas</a>()</pre>
 <div class="block">Returns the metadata on all properties associated with this bean.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -537,7 +537,7 @@ public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="cla
 <ul class="blockList">
 <li class="blockList">
 <h4>getPropertyMetas</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&gt;&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.774">getPropertyMetas</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or int [...]
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&gt;&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.776">getPropertyMetas</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or int [...]
 <div class="block">Returns the metadata on the specified list of properties.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -553,7 +553,7 @@ public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="cla
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtendedMeta</h4>
-<pre>public&nbsp;&lt;M extends <a href="../../../org/apache/juneau/BeanMetaExtended.html" title="class in org.apache.juneau">BeanMetaExtended</a>&gt;&nbsp;M&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.789">getExtendedMeta</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;metaDataClass)</pre>
+<pre>public&nbsp;&lt;M extends <a href="../../../org/apache/juneau/BeanMetaExtended.html" title="class in org.apache.juneau">BeanMetaExtended</a>&gt;&nbsp;M&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.791">getExtendedMeta</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;M&gt;&nbsp;metaDataClass)</pre>
 <div class="block">Returns the language-specified extended metadata on this bean class.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -569,7 +569,7 @@ public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="cla
 <ul class="blockList">
 <li class="blockList">
 <h4>getPropertyMeta</h4>
-<pre>public&nbsp;<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.799">getPropertyMeta</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public&nbsp;<a href="../../../org/apache/juneau/BeanPropertyMeta.html" title="class in org.apache.juneau">BeanPropertyMeta</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.801">getPropertyMeta</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns metadata about the specified property.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -585,7 +585,7 @@ public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="cla
 <ul class="blockList">
 <li class="blockList">
 <h4>newBean</h4>
-<pre>protected&nbsp;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.817">newBean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;outer)
+<pre>protected&nbsp;<a href="../../../org/apache/juneau/BeanMeta.html" title="type parameter in BeanMeta">T</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.819">newBean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;outer)
              throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/IllegalArgumentException.html?is-external=true" title="class or interface in java.lang">IllegalArgumentException</a>,
                     <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/InstantiationException.html?is-external=true" title="class or interface in java.lang">InstantiationException</a>,
                     <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/IllegalAccessException.html?is-external=true" title="class or interface in java.lang">IllegalAccessException</a>,
@@ -610,7 +610,7 @@ public final&nbsp;<a href="../../../org/apache/juneau/ClassMeta.html" title="cla
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.904">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../src-html/org/apache/juneau/BeanMeta.html#line.906">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/config/Config.html b/content/site/apidocs-8.0.1/org/apache/juneau/config/Config.html
index e708299..795494a 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/config/Config.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/config/Config.html
@@ -125,7 +125,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
    <li class='link'><a class='doclink' href='../../../../overview-summary.html#juneau-config'>Overview &gt; juneau-config</a>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/Config.java'>Source</a>
  </ul></div>
 </li>
 </ul>
@@ -765,7 +765,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_name</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.163">CONFIG_name</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.169">CONFIG_name</a></pre>
 <div class="block">Configuration property:  Configuration name.
 
  <h5 class='section'>Property:</h5>
@@ -796,7 +796,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_store</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.183">CONFIG_store</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.189">CONFIG_store</a></pre>
 <div class="block">Configuration property:  Configuration store.
 
  <h5 class='section'>Property:</h5>
@@ -825,7 +825,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_serializer</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.204">CONFIG_serializer</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.210">CONFIG_serializer</a></pre>
 <div class="block">Configuration property:  POJO serializer.
 
  <h5 class='section'>Property:</h5>
@@ -855,7 +855,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_parser</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.225">CONFIG_parser</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.231">CONFIG_parser</a></pre>
 <div class="block">Configuration property:  POJO parser.
 
  <h5 class='section'>Property:</h5>
@@ -885,7 +885,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_encoder</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.246">CONFIG_encoder</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.252">CONFIG_encoder</a></pre>
 <div class="block">Configuration property:  Value encoder.
 
  <h5 class='section'>Property:</h5>
@@ -915,7 +915,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_varResolver</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.267">CONFIG_varResolver</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.273">CONFIG_varResolver</a></pre>
 <div class="block">Configuration property:  SVL variable resolver.
 
  <h5 class='section'>Property:</h5>
@@ -945,7 +945,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_binaryLineLength</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.288">CONFIG_binaryLineLength</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.294">CONFIG_binaryLineLength</a></pre>
 <div class="block">Configuration property:  Binary value line length.
 
  <h5 class='section'>Property:</h5>
@@ -975,7 +975,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_binaryFormat</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.316">CONFIG_binaryFormat</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.322">CONFIG_binaryFormat</a></pre>
 <div class="block">Configuration property:  Binary value format.
 
  <h5 class='section'>Property:</h5>
@@ -1012,7 +1012,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>CONFIG_multiLineValuesOnSeparateLines</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.336">CONFIG_multiLineValuesOnSeparateLines</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.342">CONFIG_multiLineValuesOnSeparateLines</a></pre>
 <div class="block">Configuration property:  Multi-line values should always be on separate lines.
 
  <h5 class='section'>Property:</h5>
@@ -1041,7 +1041,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CONFIG_readOnly</h4>
-<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.356">CONFIG_readOnly</a></pre>
+<pre>public static final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/juneau/config/Config.html#line.362">CONFIG_readOnly</a></pre>
 <div class="block">Configuration property:  Read-only.
 
  <h5 class='section'>Property:</h5>
@@ -1078,7 +1078,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Config</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.413">Config</a>(<a href="../../../../org/apache/juneau/PropertyStore.html" title="class in org.apache.juneau">PropertyStore</a>&nbsp;ps)
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.419">Config</a>(<a href="../../../../org/apache/juneau/PropertyStore.html" title="class in org.apache.juneau">PropertyStore</a>&nbsp;ps)
        throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Constructor.</div>
 <dl>
@@ -1131,7 +1131,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getCandidateSystemDefaultConfigNames</h4>
-<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.99">getCandidateSystemDefaultConfigNames</a>()</pre>
+<pre>public static&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.102">getCandidateSystemDefaultConfigNames</a>()</pre>
 <div class="block">Returns the list of candidate system default configuration file names.
 
  <p>
@@ -1142,6 +1142,9 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
    <li>Any file ending in <js>".cfg"</js> in the home directory (names ordered alphabetically).
    <li><js>"juneau.cfg"</js>
    <li><js>"default.cfg"</js>
+   <li><js>"application.cfg"</js>
+   <li><js>"app.cfg"</js>
+   <li><js>"settings.cfg"</js>
  </ol>
  <p></div>
 <dl>
@@ -1158,7 +1161,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>create</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/juneau/config/ConfigBuilder.html" title="class in org.apache.juneau.config">ConfigBuilder</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.384">create</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/juneau/config/ConfigBuilder.html" title="class in org.apache.juneau.config">ConfigBuilder</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.390">create</a>()</pre>
 <div class="block">Instantiates a new clean-slate <a href="../../../../org/apache/juneau/config/ConfigBuilder.html" title="class in org.apache.juneau.config"><code>ConfigBuilder</code></a> object.
 
  <p>
@@ -1175,7 +1178,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>create</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/juneau/config/ConfigBuilder.html" title="class in org.apache.juneau.config">ConfigBuilder</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.397">create</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/juneau/config/ConfigBuilder.html" title="class in org.apache.juneau.config">ConfigBuilder</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.403">create</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Same as <a href="../../../../org/apache/juneau/config/Config.html#create--"><code>create()</code></a> but initializes the builder with the specified config name.
 
  <p>
@@ -1194,7 +1197,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>builder</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/ConfigBuilder.html" title="class in org.apache.juneau.config">ConfigBuilder</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.402">builder</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/ConfigBuilder.html" title="class in org.apache.juneau.config">ConfigBuilder</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.408">builder</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../org/apache/juneau/Context.html#builder--">Context</a></code></span></div>
 <div class="block">Creates a builder from this context object.
 
@@ -1214,7 +1217,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>resolving</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.462">resolving</a>(<a href="../../../../org/apache/juneau/svl/VarResolverSession.html" title="class in org.apache.juneau.svl">VarResolverSession</a>&nbsp;varSession)</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.468">resolving</a>(<a href="../../../../org/apache/juneau/svl/VarResolverSession.html" title="class in org.apache.juneau.svl">VarResolverSession</a>&nbsp;varSession)</pre>
 <div class="block">Creates a copy of this config using the specified var session for resolving variables.
 
  <p>
@@ -1233,7 +1236,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getName</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.471">getName</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.477">getName</a>()</pre>
 <div class="block">Returns the name associated with this config (usually a file name).</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1247,7 +1250,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>get</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.488">get</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.494">get</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Returns the specified value as a string from the config file.
 
  <p>
@@ -1266,7 +1269,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>set</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.522">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.528">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;value)</pre>
 <div class="block">Sets a value in this config.</div>
 <dl>
@@ -1286,7 +1289,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>set</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.559">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.565">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;value)
            throws <a href="../../../../org/apache/juneau/serializer/SerializeException.html" title="class in org.apache.juneau.serializer">SerializeException</a></pre>
 <div class="block">Adds or replaces an entry with the specified key with a POJO serialized to a string using the registered
@@ -1312,7 +1315,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>set</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.577">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.583">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;value,
                   <a href="../../../../org/apache/juneau/serializer/Serializer.html" title="class in org.apache.juneau.serializer">Serializer</a>&nbsp;serializer)
            throws <a href="../../../../org/apache/juneau/serializer/SerializeException.html" title="class in org.apache.juneau.serializer">SerializeException</a></pre>
@@ -1338,7 +1341,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>set</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.603">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.609">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;value,
                   <a href="../../../../org/apache/juneau/serializer/Serializer.html" title="class in org.apache.juneau.serializer">Serializer</a>&nbsp;serializer,
                   <a href="../../../../org/apache/juneau/config/ConfigMod.html" title="enum in org.apache.juneau.config">ConfigMod</a>&nbsp;modifier,
@@ -1372,7 +1375,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>set</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.629">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.635">set</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;value,
                   <a href="../../../../org/apache/juneau/serializer/Serializer.html" title="class in org.apache.juneau.serializer">Serializer</a>&nbsp;serializer,
                   <a href="../../../../org/apache/juneau/config/ConfigMod.html" title="enum in org.apache.juneau.config">ConfigMod</a>[]&nbsp;modifiers,
@@ -1406,7 +1409,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>remove</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.655">remove</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.661">remove</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Removes an entry with the specified key.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1424,7 +1427,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>encodeEntries</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.673">encodeEntries</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.679">encodeEntries</a>()</pre>
 <div class="block">Encodes and unencoded entries in this config.
 
  <p>
@@ -1444,7 +1447,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.706">getString</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.712">getString</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Gets the entry with the specified key.
 
  <p>
@@ -1469,7 +1472,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.731">getString</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.737">getString</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                         <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;def)</pre>
 <div class="block">Gets the entry with the specified key.
 
@@ -1496,7 +1499,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getStringArray</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.746">getStringArray</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.752">getStringArray</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Gets the entry with the specified key, splits the value on commas, and returns the values as trimmed strings.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1512,7 +1515,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getStringArray</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.757">getStringArray</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.763">getStringArray</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                                <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;def)</pre>
 <div class="block">Same as <a href="../../../../org/apache/juneau/config/Config.html#getStringArray-java.lang.String-"><code>getStringArray(String)</code></a> but returns a default value if the value cannot be found.</div>
 <dl>
@@ -1530,7 +1533,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getInt</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.791">getInt</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.797">getInt</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Convenience method for getting int config values.
 
  <p>
@@ -1566,7 +1569,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getInt</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.802">getInt</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.808">getInt</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                   int&nbsp;def)</pre>
 <div class="block">Same as <a href="../../../../org/apache/juneau/config/Config.html#getInt-java.lang.String-"><code>getInt(String)</code></a> but returns a default value if not set.</div>
 <dl>
@@ -1584,7 +1587,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getBoolean</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.815">getBoolean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.821">getBoolean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Convenience method for getting boolean config values.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1600,7 +1603,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getBoolean</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.826">getBoolean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.832">getBoolean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                           boolean&nbsp;def)</pre>
 <div class="block">Convenience method for getting boolean config values.</div>
 <dl>
@@ -1618,7 +1621,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getLong</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.857">getLong</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.863">getLong</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Convenience method for getting long config values.
 
  <p>
@@ -1654,7 +1657,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getLong</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.868">getLong</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.874">getLong</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                     long&nbsp;def)</pre>
 <div class="block">Same as <a href="../../../../org/apache/juneau/config/Config.html#getLong-java.lang.String-"><code>getLong(String)</code></a> but returns a default value if not set.</div>
 <dl>
@@ -1672,7 +1675,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getDouble</h4>
-<pre>public&nbsp;double&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.890">getDouble</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;double&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.896">getDouble</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Convenience method for getting double config values.
 
  <p>
@@ -1697,7 +1700,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getDouble</h4>
-<pre>public&nbsp;double&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.901">getDouble</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;double&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.907">getDouble</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                         double&nbsp;def)</pre>
 <div class="block">Same as <a href="../../../../org/apache/juneau/config/Config.html#getDouble-java.lang.String-"><code>getDouble(String)</code></a> but returns a default value if not set.</div>
 <dl>
@@ -1715,7 +1718,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getFloat</h4>
-<pre>public&nbsp;float&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.923">getFloat</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;float&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.929">getFloat</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Convenience method for getting float config values.
 
  <p>
@@ -1740,7 +1743,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getFloat</h4>
-<pre>public&nbsp;float&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.934">getFloat</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;float&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.940">getFloat</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                       float&nbsp;def)</pre>
 <div class="block">Same as <a href="../../../../org/apache/juneau/config/Config.html#getFloat-java.lang.String-"><code>getFloat(String)</code></a> but returns a default value if not set.</div>
 <dl>
@@ -1758,7 +1761,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getBytes</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.956">getBytes</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.962">getBytes</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
                 throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Convenience method for getting byte array config values.
 
@@ -1785,7 +1788,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getBytes</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.973">getBytes</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.979">getBytes</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                        byte[]&nbsp;def)
                 throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Same as <a href="../../../../org/apache/juneau/config/Config.html#getBytes-java.lang.String-"><code>getBytes(String)</code></a> but with a default value if the entry doesn't exist.</div>
@@ -1806,7 +1809,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObject</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1047">getObject</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1053">getObject</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                        <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html?is-external=true" title="class or interface in java.lang.reflect">Type</a>&nbsp;type,
                        <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html?is-external=true" title="class or interface in java.lang.reflect">Type</a>...&nbsp;args)
                 throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
@@ -1883,7 +1886,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObject</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1068">getObject</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1074">getObject</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                        <a href="../../../../org/apache/juneau/parser/Parser.html" title="class in org.apache.juneau.parser">Parser</a>&nbsp;parser,
                        <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html?is-external=true" title="class or interface in java.lang.reflect">Type</a>&nbsp;type,
                        <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html?is-external=true" title="class or interface in java.lang.reflect">Type</a>...&nbsp;args)
@@ -1912,7 +1915,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObject</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1107">getObject</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1113">getObject</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                        <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;type)
                 throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Same as <a href="../../../../org/apache/juneau/config/Config.html#getObject-java.lang.String-java.lang.reflect.Type-java.lang.reflect.Type...-"><code>getObject(String, Type, Type...)</code></a> except optimized for a non-parameterized class.
@@ -1960,7 +1963,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObject</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1125">getObject</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1131">getObject</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                        <a href="../../../../org/apache/juneau/parser/Parser.html" title="class in org.apache.juneau.parser">Parser</a>&nbsp;parser,
                        <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;type)
                 throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
@@ -1990,7 +1993,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObjectWithDefault</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1142">getObjectWithDefault</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1148">getObjectWithDefault</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                                   T&nbsp;def,
                                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;type)
                            throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
@@ -2018,7 +2021,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObjectWithDefault</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1159">getObjectWithDefault</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1165">getObjectWithDefault</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                                   <a href="../../../../org/apache/juneau/parser/Parser.html" title="class in org.apache.juneau.parser">Parser</a>&nbsp;parser,
                                   T&nbsp;def,
                                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;type)
@@ -2047,7 +2050,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObjectWithDefault</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1183">getObjectWithDefault</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1189">getObjectWithDefault</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                                   T&nbsp;def,
                                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html?is-external=true" title="class or interface in java.lang.reflect">Type</a>&nbsp;type,
                                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html?is-external=true" title="class or interface in java.lang.reflect">Type</a>...&nbsp;args)
@@ -2080,7 +2083,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObjectWithDefault</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1206">getObjectWithDefault</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1212">getObjectWithDefault</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                                   <a href="../../../../org/apache/juneau/parser/Parser.html" title="class in org.apache.juneau.parser">Parser</a>&nbsp;parser,
                                   T&nbsp;def,
                                   <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Type.html?is-external=true" title="class or interface in java.lang.reflect">Type</a>&nbsp;type,
@@ -2112,7 +2115,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObjectMap</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1219">getObjectMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1225">getObjectMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
                        throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Convenience method for returning a config entry as an <a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau"><code>ObjectMap</code></a>.</div>
 <dl>
@@ -2131,7 +2134,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObjectMap</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1231">getObjectMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1237">getObjectMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                               <a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;def)
                        throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Convenience method for returning a config entry as an <a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau"><code>ObjectMap</code></a>.</div>
@@ -2152,7 +2155,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObjectList</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectList.html" title="class in org.apache.juneau">ObjectList</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1242">getObjectList</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectList.html" title="class in org.apache.juneau">ObjectList</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1248">getObjectList</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)
                          throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Convenience method for returning a config entry as an <a href="../../../../org/apache/juneau/ObjectList.html" title="class in org.apache.juneau"><code>ObjectList</code></a>.</div>
 <dl>
@@ -2171,7 +2174,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getObjectList</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectList.html" title="class in org.apache.juneau">ObjectList</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1254">getObjectList</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectList.html" title="class in org.apache.juneau">ObjectList</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1260">getObjectList</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                                 <a href="../../../../org/apache/juneau/ObjectList.html" title="class in org.apache.juneau">ObjectList</a>&nbsp;def)
                          throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Convenience method for returning a config entry as an <a href="../../../../org/apache/juneau/ObjectList.html" title="class in org.apache.juneau"><code>ObjectList</code></a>.</div>
@@ -2192,7 +2195,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getKeys</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1268">getKeys</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title=" [...]
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1274">getKeys</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title=" [...]
 <div class="block">Returns the keys of the entries in the specified section.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2210,7 +2213,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>writeProperties</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1290">writeProperties</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1296">writeProperties</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section,
                               <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&nbsp;bean,
                               boolean&nbsp;ignoreUnknownProperties)
                        throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a>,
@@ -2243,7 +2246,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getSectionAsBean</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1324">getSectionAsBean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1330">getSectionAsBean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section,
                               <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;c)
                        throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Shortcut for calling <code>getSectionAsBean(sectionName, c, <jk>false</jk>)</code>.</div>
@@ -2266,7 +2269,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getSectionAsBean</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1370">getSectionAsBean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1376">getSectionAsBean</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section,
                               <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;c,
                               boolean&nbsp;ignoreUnknownProperties)
                        throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
@@ -2320,7 +2323,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getSectionAsMap</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1403">getSectionAsMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section)
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1409">getSectionAsMap</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section)
                           throws <a href="../../../../org/apache/juneau/parser/ParseException.html" title="class in org.apache.juneau.parser">ParseException</a></pre>
 <div class="block">Returns a section of this config copied into an <a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau"><code>ObjectMap</code></a>.</div>
 <dl>
@@ -2341,7 +2344,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getSectionAsInterface</h4>
-<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1483">getSectionAsInterface</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section,
+<pre>public&nbsp;&lt;T&gt;&nbsp;T&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1489">getSectionAsInterface</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;section,
                                    <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;T&gt;&nbsp;c)</pre>
 <div class="block">Wraps a config file section inside a Java interface so that values in the section can be read and
  write using getters and setters.
@@ -2415,7 +2418,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>exists</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1515">exists</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1521">exists</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key)</pre>
 <div class="block">Returns <jk>true</jk> if this section contains the specified key and the key has a non-blank value.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2431,7 +2434,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>setSection</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1535">setSection</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1541">setSection</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                          <a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;preLines)</pre>
 <div class="block">Creates the specified section if it doesn't exist.
 
@@ -2457,7 +2460,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>setSection</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1560">setSection</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1566">setSection</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                          <a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;preLines,
                          <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>&gt;&nbsp;contents)
                   throws <a href="../../../../org/apache/juneau/serializer/SerializeException.html" title="class in org.apache.juneau.serializer">SerializeException</a></pre>
@@ -2485,7 +2488,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>removeSection</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1578">removeSection</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1584">removeSection</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Removes the section with the specified name.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2503,7 +2506,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>setImport</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1600">setImport</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;sectionName,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1606">setImport</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;sectionName,
                         <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;importName,
                         <a href="http://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;preLines)</pre>
 <div class="block">Creates the specified import statement if it doesn't exist.</div>
@@ -2529,7 +2532,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>removeImport</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1619">removeImport</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;sectionName,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1625">removeImport</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;sectionName,
                            <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;importName)</pre>
 <div class="block">Removes the import statement with the specified name from the specified section.</div>
 <dl>
@@ -2552,7 +2555,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1632">load</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">Str [...]
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1638">load</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">Str [...]
             throws <a href="../../../../org/apache/juneau/serializer/SerializeException.html" title="class in org.apache.juneau.serializer">SerializeException</a></pre>
 <div class="block">Loads the contents of the specified map of maps into this config.</div>
 <dl>
@@ -2571,7 +2574,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>commit</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1647">commit</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1653">commit</a>()
               throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Commit the changes in this config to the store.</div>
 <dl>
@@ -2589,7 +2592,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>writeTo</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1664">writeTo</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;w)
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1670">writeTo</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/io/Writer.html?is-external=true" title="class or interface in java.io">Writer</a>&nbsp;w)
                throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Saves this config file to the specified writer as an INI file.
 
@@ -2613,7 +2616,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>addListener</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1677">addListener</a>(<a href="../../../../org/apache/juneau/config/event/ConfigEventListener.html" title="interface in org.apache.juneau.config.event">ConfigEventListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1683">addListener</a>(<a href="../../../../org/apache/juneau/config/event/ConfigEventListener.html" title="interface in org.apache.juneau.config.event">ConfigEventListener</a>&nbsp;listener)</pre>
 <div class="block">Add a listener to this config to react to modification events.
 
  <p>
@@ -2632,7 +2635,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>removeListener</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1688">removeListener</a>(<a href="../../../../org/apache/juneau/config/event/ConfigEventListener.html" title="interface in org.apache.juneau.config.event">ConfigEventListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1694">removeListener</a>(<a href="../../../../org/apache/juneau/config/event/ConfigEventListener.html" title="interface in org.apache.juneau.config.event">ConfigEventListener</a>&nbsp;listener)</pre>
 <div class="block">Removes a listener from this config.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2648,7 +2651,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1698">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1704">close</a>()
            throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Closes this configuration object by unregistering it from the underlying config map.</div>
 <dl>
@@ -2663,7 +2666,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1712">load</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html?is-external=true" title="class or interface in java.io">Reader</a>&nbsp;contents,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1718">load</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/io/Reader.html?is-external=true" title="class or interface in java.io">Reader</a>&nbsp;contents,
                    boolean&nbsp;synchronous)
             throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                    <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -2687,7 +2690,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1728">load</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contents,
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1734">load</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;contents,
                    boolean&nbsp;synchronous)
             throws <a href="http://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                    <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -2711,7 +2714,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>rollback</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1740">rollback</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1746">rollback</a>()</pre>
 <div class="block">Does a rollback of any changes on this config currently in memory.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -2727,7 +2730,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>asMap</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1758">asMap</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau">ObjectMap</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1764">asMap</a>()</pre>
 <div class="block">Returns the values in this config map as a map of maps.
 
  <p>
@@ -2749,7 +2752,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>createSession</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/Session.html" title="class in org.apache.juneau">Session</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1784">createSession</a>(<a href="../../../../org/apache/juneau/SessionArgs.html" title="class in org.apache.juneau">SessionArgs</a>&nbsp;args)</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/Session.html" title="class in org.apache.juneau">Session</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1790">createSession</a>(<a href="../../../../org/apache/juneau/SessionArgs.html" title="class in org.apache.juneau">SessionArgs</a>&nbsp;args)</pre>
 <div class="block">Unused.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -2767,7 +2770,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>createDefaultSessionArgs</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/SessionArgs.html" title="class in org.apache.juneau">SessionArgs</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1792">createDefaultSessionArgs</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/SessionArgs.html" title="class in org.apache.juneau">SessionArgs</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1798">createDefaultSessionArgs</a>()</pre>
 <div class="block">Unused.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -2783,7 +2786,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>onConfigChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1797">onConfigChange</a>(<a href="../../../../org/apache/juneau/config/event/ConfigEvents.html" title="class in org.apache.juneau.config.event">ConfigEvents</a>&nbsp;events)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1803">onConfigChange</a>(<a href="../../../../org/apache/juneau/config/event/ConfigEvents.html" title="class in org.apache.juneau.config.event">ConfigEvents</a>&nbsp;events)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../org/apache/juneau/config/event/ConfigEventListener.html#onConfigChange-org.apache.juneau.config.event.ConfigEvents-">ConfigEventListener</a></code></span></div>
 <div class="block">Gets called immediately after a config file has been loaded.</div>
 <dl>
@@ -2800,7 +2803,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getMediaType</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/http/MediaType.html" title="class in org.apache.juneau.http">MediaType</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1803">getMediaType</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/http/MediaType.html" title="class in org.apache.juneau.http">MediaType</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1809">getMediaType</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../org/apache/juneau/Writable.html#getMediaType--">Writable</a></code></span></div>
 <div class="block">Returns the serialized media type for this resource (e.g. <js>"text/html"</js>)</div>
 <dl>
@@ -2817,7 +2820,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1943">toString</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1949">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/juneau/Context.html#toString--">toString</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/juneau/Context.html" title="class in org.apache.juneau">Context</a></code></dd>
@@ -2830,7 +2833,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockListLast">
 <li class="blockList">
 <h4>finalize</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1948">finalize</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/config/Config.html#line.1954">finalize</a>()
                  throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/DtoExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/DtoExample.html
index 7ce8492..83b18bf 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/DtoExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/DtoExample.html
@@ -115,7 +115,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/DtoExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/DtoExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomFeed.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomFeed.html
index ce9d6a9..68e9f46 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomFeed.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomFeed.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/atom/AtomFeed.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/atom/AtomFeed.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomHtmlExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomHtmlExample.html
index 79a0085..ebc45c5 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomHtmlExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomHtmlExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/atom/AtomHtmlExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/atom/AtomHtmlExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomJsonExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomJsonExample.html
index 3a0f821..86a85cc 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomJsonExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomJsonExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/atom/AtomJsonExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/atom/AtomJsonExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomXmlExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomXmlExample.html
index 71c67b7..74f39e7 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomXmlExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/dto/atom/AtomXmlExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/atom/AtomXmlExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/dto/atom/AtomXmlExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/html/HtmlComplexExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/html/HtmlComplexExample.html
index 367e00b..b52c9fb 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/html/HtmlComplexExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/html/HtmlComplexExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/html/HtmlComplexExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/html/HtmlComplexExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/html/HtmlSimpleExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/html/HtmlSimpleExample.html
index 8931c6e..3cb7498 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/html/HtmlSimpleExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/html/HtmlSimpleExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/html/HtmlSimpleExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/html/HtmlSimpleExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonComplexExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonComplexExample.html
index 47fd79f..63fdfaf 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonComplexExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonComplexExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/json/JsonComplexExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/json/JsonComplexExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonConfigurationExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonConfigurationExample.html
index 3be0e59..4f0db46 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonConfigurationExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonConfigurationExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/json/JsonConfigurationExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/json/JsonConfigurationExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonSimpleExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonSimpleExample.html
index dd10765..9e30b79 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonSimpleExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/json/JsonSimpleExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/json/JsonSimpleExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/json/JsonSimpleExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/oapi/OapiExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/oapi/OapiExample.html
index c88afce..c93093e 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/oapi/OapiExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/oapi/OapiExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/oapi/OapiExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/oapi/OapiExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/pojo/Pojo.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/pojo/Pojo.html
index 67631bc..c7a23b5 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/pojo/Pojo.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/pojo/Pojo.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/pojo/Pojo.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/pojo/Pojo.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/pojo/PojoComplex.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/pojo/PojoComplex.html
index 46a1973..5217f9c 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/pojo/PojoComplex.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/pojo/PojoComplex.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/pojo/PojoComplex.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/pojo/PojoComplex.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/rdf/RdfComplexExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/rdf/RdfComplexExample.html
index d25367b..f122723 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/rdf/RdfComplexExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/rdf/RdfComplexExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/rdf/RdfComplexExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/rdf/RdfComplexExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/rdf/RdfExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/rdf/RdfExample.html
index 8234d1c..b4034ce 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/rdf/RdfExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/rdf/RdfExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/rdf/RdfExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/rdf/RdfExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/svl/SvlExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/svl/SvlExample.html
index 1fa8fec..3119777 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/svl/SvlExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/svl/SvlExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/svl/SvlExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/svl/SvlExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/uon/UONComplexExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/uon/UONComplexExample.html
index d804ec8..4cbc8ee 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/uon/UONComplexExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/uon/UONComplexExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/uon/UONComplexExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/uon/UONComplexExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/uon/UONExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/uon/UONExample.html
index d879503..8aaf574 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/uon/UONExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/uon/UONExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/uon/UONExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/uon/UONExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlComplexExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlComplexExample.html
index bb377f6..a156ac7 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlComplexExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlComplexExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlComplexExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlComplexExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlConfigurationExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlConfigurationExample.html
index f3de4c0..f8ed408 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlConfigurationExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlConfigurationExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlConfigurationExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlSimpleExample.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlSimpleExample.html
index 5cfe0a0..e85b463 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlSimpleExample.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/core/xml/XmlSimpleExample.html
@@ -114,7 +114,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlSimpleExample.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-core/src/main/java/org/apache/juneau/examples/core/xml/XmlSimpleExample.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/AdminGuard.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/AdminGuard.html
index d4a069e..f681475 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/AdminGuard.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/AdminGuard.html
@@ -119,7 +119,7 @@ extends <a href="../../../../../org/apache/juneau/rest/RestGuard.html" title="cl
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AdminGuard.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AdminGuard.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/HelloWorldResource.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/HelloWorldResource.html
index 4305216..f5747c8 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/HelloWorldResource.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/HelloWorldResource.html
@@ -123,7 +123,7 @@ implements <a href="../../../../../org/apache/juneau/rest/BasicRestConfig.html"
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/HelloWorldResource.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/HelloWorldResource.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/RequestEchoResource.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/RequestEchoResource.html
index 08fed82..1925ad2 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/RequestEchoResource.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/RequestEchoResource.html
@@ -124,7 +124,7 @@ extends <a href="../../../../../org/apache/juneau/rest/BasicRest.html" title="cl
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/RootResources.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/RootResources.html
index cb81c1d..9ee4466 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/RootResources.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/RootResources.html
@@ -148,7 +148,7 @@ extends <a href="../../../../../org/apache/juneau/rest/BasicRestServletJenaGroup
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/command/EchoCommand.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/command/EchoCommand.html
index b195ce2..6cbabc3 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/command/EchoCommand.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/command/EchoCommand.html
@@ -119,7 +119,7 @@ extends <a href="../../../../../../org/apache/juneau/microservice/console/Consol
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/command/EchoCommand.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/command/EchoCommand.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/AtomFeedResource.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/AtomFeedResource.html
index 0ff76f7..b0c6128 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/AtomFeedResource.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/AtomFeedResource.html
@@ -144,7 +144,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/BasicRestServletJena.h
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/AtomFeedResource.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/AtomFeedResource.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/DtoExamples.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/DtoExamples.html
index 3ed9c3d..53fe6ec 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/DtoExamples.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/DtoExamples.html
@@ -148,7 +148,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/BasicRestServletJenaGr
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/DtoExamples.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/DtoExamples.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/JsonSchemaResource.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/JsonSchemaResource.html
index f9a08e6..54eadb9 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/JsonSchemaResource.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/JsonSchemaResource.html
@@ -150,7 +150,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/BasicRestServletJena.h
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/JsonSchemaResource.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/JsonSchemaResource.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.html
index c744a1b..d7da707 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.html
@@ -143,7 +143,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/BasicRestServlet.html"
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/dto/PredefinedLabelsResource.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/jetty/App.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/jetty/App.html
index 5091575..e7b152a 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/jetty/App.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/jetty/App.html
@@ -122,7 +122,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest-jetty/src/main/java/org/apache/juneau/examples/rest/jetty/App.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest-jetty/src/main/java/org/apache/juneau/examples/rest/jetty/App.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.html
index c753fbd..7d617e2 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.html
@@ -118,7 +118,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/AbstractPersistenceService.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/ExpiresAfter.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/ExpiresAfter.html
index 2770da4..b23e2d6 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/ExpiresAfter.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/ExpiresAfter.html
@@ -119,7 +119,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/ExpiresAfter.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/IdConflict.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/IdConflict.html
index 02ecca9..715519b 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/IdConflict.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/IdConflict.html
@@ -138,7 +138,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/exception/Conflict.htm
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdConflict.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdConflict.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/IdNotFound.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/IdNotFound.html
index 66cfe4a..56e284c 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/IdNotFound.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/IdNotFound.html
@@ -138,7 +138,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/exception/NotFound.htm
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdNotFound.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/IdNotFound.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidId.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidId.html
index 4b4378b..38793a0 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidId.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidId.html
@@ -138,7 +138,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/exception/BadRequest.h
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidId.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidId.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidLogin.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidLogin.html
index efc7956..09db6ef 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidLogin.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidLogin.html
@@ -138,7 +138,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/exception/Unauthorized
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidLogin.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidSpecies.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidSpecies.html
index 6788131..2da773a 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidSpecies.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidSpecies.html
@@ -138,7 +138,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/exception/BadRequest.h
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidSpecies.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidSpecies.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidTag.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidTag.html
index 7981ef2..86b7a45 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidTag.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidTag.html
@@ -138,7 +138,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/exception/BadRequest.h
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidTag.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidTag.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidUsername.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidUsername.html
index 7d16b72..6917e46 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidUsername.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/InvalidUsername.html
@@ -138,7 +138,7 @@ extends <a href="../../../../../../org/apache/juneau/rest/exception/BadRequest.h
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidUsername.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/InvalidUsername.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/PetStoreService.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/PetStoreService.html
index 15e285c..a1a68f8 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/PetStoreService.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/PetStoreService.html
@@ -122,7 +122,7 @@ extends <a href="../../../../../../org/apache/juneau/examples/rest/petstore/Abst
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreService.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreService.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.html
index f46f91b..a1b5e67 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.html
@@ -116,7 +116,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreateOrder.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/CreatePet.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/CreatePet.html
index aa8472e..f0dafc6 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/CreatePet.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/CreatePet.html
@@ -120,7 +120,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreatePet.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/CreatePet.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Order.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Order.html
index 3a9db1f..65e831f 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Order.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Order.html
@@ -118,7 +118,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Order.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Order.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.html
index 97bfc18..4c38e30 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.html
@@ -124,7 +124,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/OrderStatus.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Pet.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Pet.html
index 6437a2c..22a9fdb 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Pet.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Pet.html
@@ -118,7 +118,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Pet.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Pet.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetStatus.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetStatus.html
index 7f808b5..1d5f749 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetStatus.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetStatus.html
@@ -124,7 +124,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetStatus.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetStatus.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetTag.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetTag.html
index e8a6ea2..b83abc8 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetTag.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetTag.html
@@ -117,7 +117,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTag.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTag.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.html
index eeaa190..3fa2744 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.html
@@ -119,7 +119,7 @@ extends <a href="../../../../../../../org/apache/juneau/transform/PojoSwap.html"
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/PetTagNameSwap.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Species.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Species.html
index a9d5455..501c978 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Species.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/Species.html
@@ -124,7 +124,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Species.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/Species.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.html
index 1b6c825..9a0b62e 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.html
@@ -121,7 +121,7 @@ extends <a href="../../../../../../../org/apache/juneau/examples/rest/petstore/d
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UpdatePet.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/User.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/User.html
index 6ae5250..0ad224c 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/User.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/User.html
@@ -118,7 +118,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/User.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/User.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/UserStatus.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/UserStatus.html
index ef9c0e7..c5b81eb 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/UserStatus.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/dto/UserStatus.html
@@ -124,7 +124,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UserStatus.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/dto/UserStatus.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.html
index 6ebff2e..9ba1228 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.html
@@ -124,7 +124,7 @@ extends <a href="../../../../../../../org/apache/juneau/rest/widget/MenuItemWidg
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddOrderMenuItem.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.html
index bfbad57..d2b6824 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.html
@@ -124,7 +124,7 @@ extends <a href="../../../../../../../org/apache/juneau/rest/widget/MenuItemWidg
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/AddPetMenuItem.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PetStore.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PetStore.html
index 4f3e8d4..438225b 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PetStore.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PetStore.html
@@ -110,7 +110,7 @@ public interface <a href="../../../../../../../src-html/org/apache/juneau/exampl
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStore.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStore.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.html
index 60f2c5a..6bf3b80 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.html
@@ -152,7 +152,7 @@ implements <a href="../../../../../../../org/apache/juneau/examples/rest/petstor
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PetStoreResource.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.html
index 4e463bb..a42013f 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.html
@@ -145,7 +145,7 @@ extends <a href="../../../../../../../org/apache/juneau/rest/BasicRestServlet.ht
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/PhotosResource.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.html
index b63f579..74b6646 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.html
@@ -143,7 +143,7 @@ extends <a href="../../../../../../../org/apache/juneau/rest/BasicRestServlet.ht
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/SqlQueryResource.java'>Source</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.html
index 43d3e07..ebdf2c5 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.html
@@ -124,7 +124,7 @@ extends <a href="../../../../../../../org/apache/juneau/rest/widget/MenuItemWidg
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/rest/UploadPhotoMenuItem.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/springboot/App.html b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/springboot/App.html
index 8f188d9..0bc92a4 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/springboot/App.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/examples/rest/springboot/App.html
@@ -116,7 +116,7 @@ extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?
 
  <h5 class='section'>See Also:</h5>
  <ul class='doctree'>
-   <li class='extlink'><a class='doclink' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest-springboot/src/main/java/org/apache/juneau/examples/rest/springboot/App.java'>Source</a>
+   <li class='extlink'><a class='doclink' target='_blank' href='https://github.com/apache/juneau/blob/master/juneau-examples/juneau-examples-rest-springboot/src/main/java/org/apache/juneau/examples/rest/springboot/App.java'>Source</a>
  </ul></div>
 </li>
 </ul>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/microservice/Microservice.html b/content/site/apidocs-8.0.1/org/apache/juneau/microservice/Microservice.html
index 1933579..a770aa0 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/microservice/Microservice.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/microservice/Microservice.html
@@ -439,7 +439,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.309">init</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.308">init</a>()
                   throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Initializes this microservice.
 
@@ -462,7 +462,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.376">start</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.375">start</a>()
                    throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Start this application.
 
@@ -482,7 +482,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>startConsole</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.408">startConsole</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.407">startConsole</a>()
                           throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Starts the console thread for this microservice.</div>
 <dl>
@@ -499,7 +499,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>stopConsole</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.420">stopConsole</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.419">stopConsole</a>()
                          throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Stops the console thread for this microservice.</div>
 <dl>
@@ -516,7 +516,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getArgs</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/utils/Args.html" title="class in org.apache.juneau.utils">Args</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.437">getArgs</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/utils/Args.html" title="class in org.apache.juneau.utils">Args</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.436">getArgs</a>()</pre>
 <div class="block">Returns the command-line arguments passed into the application.
 
  <p>
@@ -536,7 +536,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getConfig</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.538">getConfig</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config">Config</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.537">getConfig</a>()</pre>
 <div class="block">Returns the external INI-style configuration file that can be used to configure your microservice.
 
  <p>
@@ -642,7 +642,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getManifest</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/utils/ManifestFile.html" title="class in org.apache.juneau.utils">ManifestFile</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.562">getManifest</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/utils/ManifestFile.html" title="class in org.apache.juneau.utils">ManifestFile</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.561">getManifest</a>()</pre>
 <div class="block">Returns the main jar manifest file contents as a simple <a href="../../../../org/apache/juneau/ObjectMap.html" title="class in org.apache.juneau"><code>ObjectMap</code></a>.
 
  <p>
@@ -671,7 +671,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getVarResolver</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/svl/VarResolver.html" title="class in org.apache.juneau.svl">VarResolver</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.578">getVarResolver</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/svl/VarResolver.html" title="class in org.apache.juneau.svl">VarResolver</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.577">getVarResolver</a>()</pre>
 <div class="block">Returns the variable resolver for resolving variables in strings and files.
 
  <p>
@@ -692,7 +692,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogger</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html?is-external=true" title="class or interface in java.util.logging">Logger</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.587">getLogger</a>()</pre>
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html?is-external=true" title="class or interface in java.util.logging">Logger</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.586">getLogger</a>()</pre>
 <div class="block">Returns the logger for this microservice.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -706,7 +706,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>executeCommand</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.601">executeCommand</a>(<a href="../../../../org/apache/juneau/utils/Args.html" title="class in org.apache.juneau.utils">Args</a>&nbsp;args,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.600">executeCommand</a>(<a href="../../../../org/apache/juneau/utils/Args.html" title="class in org.apache.juneau.utils">Args</a>&nbsp;args,
                               <a href="http://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html?is-external=true" title="class or interface in java.util">Scanner</a>&nbsp;in,
                               <a href="http://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html?is-external=true" title="class or interface in java.io">PrintWriter</a>&nbsp;out)</pre>
 <div class="block">Executes a console command.</div>
@@ -727,7 +727,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>executeCommand</h4>
-<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.626">executeCommand</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;command,
+<pre>public&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.625">executeCommand</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;command,
                              <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;input,
                              <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>...&nbsp;args)</pre>
 <div class="block">Convenience method for executing a console command directly.
@@ -750,7 +750,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>join</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.648">join</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.647">join</a>()
                   throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Joins the application with the current thread.
 
@@ -770,7 +770,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.661">stop</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/juneau/microservice/Microservice.html" title="class in org.apache.juneau.microservice">Microservice</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.660">stop</a>()
                   throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Stop this application.
 
@@ -790,7 +790,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>exit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.671">exit</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.670">exit</a>()
           throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Stops the console (if it's started) and calls <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/System.html?is-external=true#exit-int-" title="class or interface in java.lang"><code>System.exit(int)</code></a>.</div>
 <dl>
@@ -805,7 +805,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>kill</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.683">kill</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.682">kill</a>()</pre>
 <div class="block">Kill the JVM by calling <code>System.exit(2);</code>.</div>
 </li>
 </ul>
@@ -815,7 +815,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getConsoleCommands</h4>
-<pre>public final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../org/apache/juneau/microservice/console/ConsoleCommand.html" title="class in org.apache.juneau.microservice.console">ConsoleCommand</a>&gt;&nbsp;<a href="../../../../src- [...]
+<pre>public final&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../org/apache/juneau/microservice/console/ConsoleCommand.html" title="class in org.apache.juneau.microservice.console">ConsoleCommand</a>&gt;&nbsp;<a href="../../../../src- [...]
 <div class="block">Returns the console commands associated with this microservice.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -829,7 +829,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getConsoleReader</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html?is-external=true" title="class or interface in java.util">Scanner</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.710">getConsoleReader</a>()</pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html?is-external=true" title="class or interface in java.util">Scanner</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.709">getConsoleReader</a>()</pre>
 <div class="block">Returns the console reader.
 
  <p>
@@ -846,7 +846,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>getConsoleWriter</h4>
-<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html?is-external=true" title="class or interface in java.io">PrintWriter</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.722">getConsoleWriter</a>()</pre>
+<pre>protected&nbsp;<a href="http://docs.oracle.com/javase/8/docs/api/java/io/PrintWriter.html?is-external=true" title="class or interface in java.io">PrintWriter</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.721">getConsoleWriter</a>()</pre>
 <div class="block">Returns the console writer.
 
  <p>
@@ -863,7 +863,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>out</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.736">out</a>(<a href="../../../../org/apache/juneau/utils/MessageBundle.html" title="class in org.apache.juneau.utils">MessageBundle</a>&nbsp;mb,
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.735">out</a>(<a href="../../../../org/apache/juneau/utils/MessageBundle.html" title="class in org.apache.juneau.utils">MessageBundle</a>&nbsp;mb,
                 <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;messageKey,
                 <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>...&nbsp;args)</pre>
 <div class="block">Prints a localized message to the console writer.
@@ -884,7 +884,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>err</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.753">err</a>(<a href="../../../../org/apache/juneau/utils/MessageBundle.html" title="class in org.apache.juneau.utils">MessageBundle</a>&nbsp;mb,
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.752">err</a>(<a href="../../../../org/apache/juneau/utils/MessageBundle.html" title="class in org.apache.juneau.utils">MessageBundle</a>&nbsp;mb,
                 <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;messageKey,
                 <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>...&nbsp;args)</pre>
 <div class="block">Prints a localized message to STDERR.
@@ -905,7 +905,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockList">
 <li class="blockList">
 <h4>log</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.767">log</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/logging/Level.html?is-external=true" title="class or interface in java.util.logging">Level</a>&nbsp;level,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.766">log</a>(<a href="http://docs.oracle.com/javase/8/docs/api/java/util/logging/Level.html?is-external=true" title="class or interface in java.util.logging">Level</a>&nbsp;level,
                    <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message,
                    <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>...&nbsp;args)</pre>
 <div class="block">Logs a message to the log file.</div>
@@ -923,7 +923,7 @@ implements <a href="../../../../org/apache/juneau/config/event/ConfigEventListen
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onConfigChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.773">onConfigChange</a>(<a href="../../../../org/apache/juneau/config/event/ConfigEvents.html" title="class in org.apache.juneau.config.event">ConfigEvents</a>&nbsp;events)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/juneau/microservice/Microservice.html#line.772">onConfigChange</a>(<a href="../../../../org/apache/juneau/config/event/ConfigEvents.html" title="class in org.apache.juneau.config.event">ConfigEvents</a>&nbsp;events)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../org/apache/juneau/config/event/ConfigEventListener.html#onConfigChange-org.apache.juneau.config.event.ConfigEvents-">ConfigEventListener</a></code></span></div>
 <div class="block">Gets called immediately after a config file has been loaded.</div>
 <dl>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRest.html b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRest.html
index 99608c3..9429e90 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRest.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRest.html
@@ -118,12 +118,14 @@ var activeTableTab = "activeTableTab";
 <br>
 <pre><a href="../../../../org/apache/juneau/rest/annotation/RestResource.html" title="annotation in org.apache.juneau.rest.annotation">@RestResource</a>(<a href="../../../../org/apache/juneau/rest/annotation/RestResource.html#allowedMethodParams--">allowedMethodParams</a>="OPTIONS",
               <a href="../../../../org/apache/juneau/rest/annotation/RestResource.html#htmldoc--">htmldoc</a>=)
-public abstract class <a href="../../../../src-html/org/apache/juneau/rest/BasicRest.html#line.44">BasicRest</a>
+public abstract class <a href="../../../../src-html/org/apache/juneau/rest/BasicRest.html#line.46">BasicRest</a>
 extends <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="../../../../org/apache/juneau/rest/BasicRestConfig.html" title="interface in org.apache.juneau.rest">BasicRestConfig</a></pre>
-<div class="block"><h5 class='section'>See Also:</h5>
+<div class="block">Identical to <a href="../../../../org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest"><code>BasicRestServlet</code></a> but doesn't extend from <code>HttpServlet</code>
+
+ <h5 class='section'>See Also:</h5>
  <ul>
-   <li class='link'><a class='doclink' href='../../../../overview-summary.html#juneau-rest-server.Instantiation.BasicRestServlet'>Overview &gt; juneau-rest-server &gt; Instantiation &gt; BasicRestServlet</a>
+   <li class='link'><a class='doclink' href='../../../../overview-summary.html#juneau-rest-server.Instantiation.BasicRest'>Overview &gt; juneau-rest-server &gt; Instantiation &gt; BasicRest</a>
  </ul></div>
 </li>
 </ul>
@@ -194,7 +196,7 @@ implements <a href="../../../../org/apache/juneau/rest/BasicRestConfig.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BasicRest</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRest.html#line.44">BasicRest</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRest.html#line.46">BasicRest</a>()</pre>
 </li>
 </ul>
 </li>
@@ -212,7 +214,7 @@ implements <a href="../../../../org/apache/juneau/rest/BasicRestConfig.html" tit
 <li class="blockList">
 <h4>getOptions</h4>
 <pre><a href="../../../../org/apache/juneau/rest/annotation/RestMethod.html" title="annotation in org.apache.juneau.rest.annotation">@RestMethod</a>(<a href="../../../../org/apache/juneau/rest/annotation/RestMethod.html#name--">name</a>="OPTIONS",<a href="../../../../org/apache/juneau/rest/annotation/RestMethod.html#path--">path</a>="/*",<a href="../../../../org/apache/juneau/rest/annotation/RestMethod.html#summary--">summary</a>="Swagger documentation",<a href="../../../../org/apache/ju [...]
-public&nbsp;<a href="../../../../org/apache/juneau/dto/swagger/Swagger.html" title="class in org.apache.juneau.dto.swagger">Swagger</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRest.html#line.95">getOptions</a>(<a href="../../../../org/apache/juneau/rest/RestRequest.html" title="class in org.apache.juneau.rest">RestRequest</a>&nbsp;req)</pre>
+public&nbsp;<a href="../../../../org/apache/juneau/dto/swagger/Swagger.html" title="class in org.apache.juneau.dto.swagger">Swagger</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRest.html#line.97">getOptions</a>(<a href="../../../../org/apache/juneau/rest/RestRequest.html" title="class in org.apache.juneau.rest">RestRequest</a>&nbsp;req)</pre>
 <div class="block">[OPTIONS /*] - Show resource options.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestGroup.html b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestGroup.html
index 44ca7ef..4244463 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestGroup.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestGroup.html
@@ -118,20 +118,13 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre><a href="../../../../org/apache/juneau/rest/annotation/RestResource.html" title="annotation in org.apache.juneau.rest.annotation">@RestResource</a>
-public abstract class <a href="../../../../src-html/org/apache/juneau/rest/BasicRestGroup.html#line.36">BasicRestGroup</a>
+public abstract class <a href="../../../../src-html/org/apache/juneau/rest/BasicRestGroup.html#line.31">BasicRestGroup</a>
 extends <a href="../../../../org/apache/juneau/rest/BasicRest.html" title="class in org.apache.juneau.rest">BasicRest</a></pre>
-<div class="block">Specialized subclass of <a href="../../../../org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest"><code>BasicRestServlet</code></a> for showing "group" pages.
-
- <p>
- Group pages consist of simple lists of child resource URLs and their labels.
- They're meant to be used as jumping-off points for child resources.
-
- <p>
- Child resources are specified using the <a href="../../../../org/apache/juneau/rest/annotation/RestResource.html#children--"><code>@RestResource(children)</code></a> annotation.
+<div class="block">Identical to <a href="../../../../org/apache/juneau/rest/BasicRestServletGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestServletGroup</code></a> but doesn't extend from <code>HttpServlet</code>
 
  <h5 class='section'>See Also:</h5>
  <ul>
-   <li class='link'>juneau-rest-server.Instantiation.RouterPages
+   <li class='link'><a class='doclink' href='../../../../overview-summary.html#juneau-rest-server.Instantiation.BasicRestGroup'>Overview &gt; juneau-rest-server &gt; Instantiation &gt; BasicRestGroup</a>
  </ul></div>
 </li>
 </ul>
@@ -209,7 +202,7 @@ extends <a href="../../../../org/apache/juneau/rest/BasicRest.html" title="class
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BasicRestGroup</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRestGroup.html#line.36">BasicRestGroup</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRestGroup.html#line.31">BasicRestGroup</a>()</pre>
 </li>
 </ul>
 </li>
@@ -229,7 +222,7 @@ extends <a href="../../../../org/apache/juneau/rest/BasicRest.html" title="class
 <pre><a href="../../../../org/apache/juneau/rest/annotation/RestMethod.html" title="annotation in org.apache.juneau.rest.annotation">@RestMethod</a>(<a href="../../../../org/apache/juneau/rest/annotation/RestMethod.html#name--">name</a>="GET",
             <a href="../../../../org/apache/juneau/rest/annotation/RestMethod.html#path--">path</a>="/",
             <a href="../../../../org/apache/juneau/rest/annotation/RestMethod.html#summary--">summary</a>="Navigation page")
-public&nbsp;<a href="../../../../org/apache/juneau/rest/helper/ChildResourceDescriptions.html" title="class in org.apache.juneau.rest.helper">ChildResourceDescriptions</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRestGroup.html#line.46">getChildren</a>(<a href="../../../../org/apache/juneau/rest/RestRequest.html" title="class in org.apache.juneau.rest">RestRequest</a>&nbsp;req)
+public&nbsp;<a href="../../../../org/apache/juneau/rest/helper/ChildResourceDescriptions.html" title="class in org.apache.juneau.rest.helper">ChildResourceDescriptions</a>&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRestGroup.html#line.41">getChildren</a>(<a href="../../../../org/apache/juneau/rest/RestRequest.html" title="class in org.apache.juneau.rest">RestRequest</a>&nbsp;req)
                                                                                                                            throws <a href="http://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">[GET /] - Get child resources.</div>
 <dl>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestJena.html b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestJena.html
index 5600cbd..0840825 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestJena.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestJena.html
@@ -132,9 +132,9 @@
 <br>
 <pre><a href="../../../../org/apache/juneau/rest/annotation/RestResource.html" title="annotation in org.apache.juneau.rest.annotation">@RestResource</a>(<a href="../../../../org/apache/juneau/rest/annotation/RestResource.html#serializers--">serializers</a>={<a href="../../../../org/apache/juneau/rest/Inherit.html" title="class in org.apache.juneau.rest">Inherit.class</a>,<a href="../../../../org/apache/juneau/jena/RdfXmlSerializer.html" title="class in org.apache.juneau.jena">RdfXmlSeria [...]
               <a href="../../../../org/apache/juneau/rest/annotation/RestResource.html#parsers--">parsers</a>={<a href="../../../../org/apache/juneau/rest/Inherit.html" title="class in org.apache.juneau.rest">Inherit.class</a>,<a href="../../../../org/apache/juneau/jena/RdfXmlParser.html" title="class in org.apache.juneau.jena">RdfXmlParser.class</a>,<a href="../../../../org/apache/juneau/jena/TurtleParser.html" title="class in org.apache.juneau.jena">TurtleParser.class</a>,<a href="../. [...]
-public abstract class <a href="../../../../src-html/org/apache/juneau/rest/BasicRestJena.html#line.39">BasicRestJena</a>
+public abstract class <a href="../../../../src-html/org/apache/juneau/rest/BasicRestJena.html#line.41">BasicRestJena</a>
 extends <a href="../../../../org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest">BasicRestServlet</a></pre>
-<div class="block">Resource servlet with additional RDF support.</div>
+<div class="block">Identical to <a href="../../../../org/apache/juneau/rest/BasicRestServletJena.html" title="class in org.apache.juneau.rest"><code>BasicRestServletJena</code></a> but doesn't extend from <code>HttpServlet</code></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../serialized-form.html#org.apache.juneau.rest.BasicRestJena">Serialized Form</a></dd>
@@ -223,7 +223,7 @@ extends <a href="../../../../org/apache/juneau/rest/BasicRestServlet.html" title
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BasicRestJena</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRestJena.html#line.39">BasicRestJena</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRestJena.html#line.41">BasicRestJena</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestJenaGroup.html b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestJenaGroup.html
index 21ac5e0..f52e239 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestJenaGroup.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestJenaGroup.html
@@ -133,9 +133,9 @@
 <br>
 <pre><a href="../../../../org/apache/juneau/rest/annotation/RestResource.html" title="annotation in org.apache.juneau.rest.annotation">@RestResource</a>(<a href="../../../../org/apache/juneau/rest/annotation/RestResource.html#serializers--">serializers</a>={<a href="../../../../org/apache/juneau/rest/Inherit.html" title="class in org.apache.juneau.rest">Inherit.class</a>,<a href="../../../../org/apache/juneau/jena/RdfXmlSerializer.html" title="class in org.apache.juneau.jena">RdfXmlSeria [...]
               <a href="../../../../org/apache/juneau/rest/annotation/RestResource.html#parsers--">parsers</a>={<a href="../../../../org/apache/juneau/rest/Inherit.html" title="class in org.apache.juneau.rest">Inherit.class</a>,<a href="../../../../org/apache/juneau/jena/RdfXmlParser.html" title="class in org.apache.juneau.jena">RdfXmlParser.class</a>,<a href="../../../../org/apache/juneau/jena/TurtleParser.html" title="class in org.apache.juneau.jena">TurtleParser.class</a>,<a href="../. [...]
-public abstract class <a href="../../../../src-html/org/apache/juneau/rest/BasicRestJenaGroup.html#line.39">BasicRestJenaGroup</a>
+public abstract class <a href="../../../../src-html/org/apache/juneau/rest/BasicRestJenaGroup.html#line.41">BasicRestJenaGroup</a>
 extends <a href="../../../../org/apache/juneau/rest/BasicRestServletGroup.html" title="class in org.apache.juneau.rest">BasicRestServletGroup</a></pre>
-<div class="block">Resource group with additional RDF support.</div>
+<div class="block">Identical to <a href="../../../../org/apache/juneau/rest/BasicRestServletJenaGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestServletJenaGroup</code></a> but doesn't extend from <code>HttpServlet</code></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../serialized-form.html#org.apache.juneau.rest.BasicRestJenaGroup">Serialized Form</a></dd>
@@ -231,7 +231,7 @@ extends <a href="../../../../org/apache/juneau/rest/BasicRestServletGroup.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BasicRestJenaGroup</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRestJenaGroup.html#line.39">BasicRestJenaGroup</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/juneau/rest/BasicRestJenaGroup.html#line.41">BasicRestJenaGroup</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestServletGroup.html b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestServletGroup.html
index b744819..1612411 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestServletGroup.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/rest/BasicRestServletGroup.html
@@ -150,7 +150,7 @@ extends <a href="../../../../org/apache/juneau/rest/BasicRestServlet.html" title
 
  <h5 class='section'>See Also:</h5>
  <ul>
-   <li class='link'>juneau-rest-server.Instantiation.RouterPages
+   <li class='link'><a class='doclink' href='../../../../overview-summary.html#juneau-rest-server.Instantiation.BasicRestServletGroup'>Overview &gt; juneau-rest-server &gt; Instantiation &gt; BasicRestServletGroup</a>
  </ul></div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
diff --git a/content/site/apidocs-8.0.1/org/apache/juneau/rest/package-summary.html b/content/site/apidocs-8.0.1/org/apache/juneau/rest/package-summary.html
index fd9c3c8..0c55b8b 100644
--- a/content/site/apidocs-8.0.1/org/apache/juneau/rest/package-summary.html
+++ b/content/site/apidocs-8.0.1/org/apache/juneau/rest/package-summary.html
@@ -165,7 +165,9 @@
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/juneau/rest/BasicRest.html" title="class in org.apache.juneau.rest">BasicRest</a></td>
 <td class="colLast">
-<div class="block"><h5 class='section'>See Also:</div>
+<div class="block">Identical to <a href="../../../../org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest"><code>BasicRestServlet</code></a> but doesn't extend from <code>HttpServlet</code>
+
+ <h5 class='section'>See Also:</div>
 </td>
 </tr>
 <tr class="rowColor">
@@ -177,7 +179,9 @@
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/juneau/rest/BasicRestGroup.html" title="class in org.apache.juneau.rest">BasicRestGroup</a></td>
 <td class="colLast">
-<div class="block">Specialized subclass of <a href="../../../../org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest"><code>BasicRestServlet</code></a> for showing "group" pages.</div>
+<div class="block">Identical to <a href="../../../../org/apache/juneau/rest/BasicRestServletGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestServletGroup</code></a> but doesn't extend from <code>HttpServlet</code>
+
+ <h5 class='section'>See Also:</div>
 </td>
 </tr>
 <tr class="rowColor">
@@ -189,13 +193,13 @@
 <tr class="altColor">
 <td class="colFirst"><a href="../../../../org/apache/juneau/rest/BasicRestJena.html" title="class in org.apache.juneau.rest">BasicRestJena</a></td>
 <td class="colLast">
-<div class="block">Resource servlet with additional RDF support.</div>
+<div class="block">Identical to <a href="../../../../org/apache/juneau/rest/BasicRestServletJena.html" title="class in org.apache.juneau.rest"><code>BasicRestServletJena</code></a> but doesn't extend from <code>HttpServlet</code></div>
 </td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a href="../../../../org/apache/juneau/rest/BasicRestJenaGroup.html" title="class in org.apache.juneau.rest">BasicRestJenaGroup</a></td>
 <td class="colLast">
-<div class="block">Resource group with additional RDF support.</div>
+<div class="block">Identical to <a href="../../../../org/apache/juneau/rest/BasicRestServletJenaGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestServletJenaGroup</code></a> but doesn't extend from <code>HttpServlet</code></div>
 </td>
 </tr>
 <tr class="altColor">
diff --git a/content/site/apidocs-8.0.1/overview-summary.html b/content/site/apidocs-8.0.1/overview-summary.html
index 55e9682..9ea0b91 100644
--- a/content/site/apidocs-8.0.1/overview-summary.html
+++ b/content/site/apidocs-8.0.1/overview-summary.html
@@ -73,7 +73,7 @@
 </div>
 <div class="header">
 <div class="subTitle">
-<div class="block"><h1 class='title'>Apache Juneau 8.0.0 Documentation</div>
+<div class="block"><h1 class='title'>Apache Juneau 8.0.1 Documentation</div>
 </div>
 <p>See: <a href="#overview.description">Description</a></p>
 </div>
@@ -655,11 +655,11 @@
 <div class="contentContainer"><a name="overview.description">
 <!--   -->
 </a>
-<div class="block"><h1 class='title'>Apache Juneau 8.0.0 Documentation</h1>
-<h1 class='preview-title'>Apache Juneau 8.0.0 Documentation Preview</h1>
+<div class="block"><h1 class='title'>Apache Juneau 8.0.1 Documentation</h1>
+<h1 class='preview-title'>Apache Juneau 8.0.1 Documentation Preview</h1>
 <h2 class='preview-section todo'>Documentation in progress</h2>
-<h2 class='preview-section new'>New documentation in 8.0.0</h2>
-<h2 class='preview-section updated'>Updated documentation in 8.0.0</h2>
+<h2 class='preview-section new'>New documentation in 8.0.1</h2>
+<h2 class='preview-section updated'>Updated documentation in 8.0.1</h2>
 
 <script type='text/javascript'>
    function toggle(x) {
@@ -1424,18 +1424,18 @@
 </table>
 
 <p>
-   The current version of Juneau is <code>8.0.0</code>.
+   The current version of Juneau is <code>8.0.1</code>.
    The easiest way to pull in the library is through the following maven dependency:
 </p>
 <p class='bpcode w800'>
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-all<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 <p>
-   If you would like to work with the bleeding-edge code, you can access the <code>8.0.1</code>
+   If you would like to work with the bleeding-edge code, you can access the <code>8.0.2</code>
    version through the following repository:
 </p>
 <p class='bpcode w800'>
@@ -1465,18 +1465,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-marshall<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-marshall-8.0.0.jar 
+   juneau-marshall-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.marshall_8.0.0.jar 
+   org.apache.juneau.marshall_8.0.1.jar 
 </p>  
 
 <p>
@@ -10389,16 +10389,16 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-marshall-rdf<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-marshall-rdf-8.0.0.jar 
+   juneau-marshall-rdf-8.0.1.jar 
 </p>  
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.marshall.rdf_8.0.0.jar 
+   org.apache.juneau.marshall.rdf_8.0.1.jar 
 </p>  
 <p>
    The <code>juneau-marshall-rdf</code> library provides additional serializers and parsers for RDF.
@@ -11004,16 +11004,16 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-dto<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-dto-8.0.0.jar 
+   juneau-dto-8.0.1.jar 
 </p>  
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.dto_8.0.0.jar 
+   org.apache.juneau.dto_8.0.1.jar 
 </p>  
 <p>
    The <code>juneau-dto</code> library contains several predefined POJOs for generating commonly-used document types.
@@ -11529,18 +11529,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-svl<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-svl-8.0.0.jar 
+   juneau-svl-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.svl_8.0.0.jar 
+   org.apache.juneau.svl_8.0.1.jar 
 </p>
 
 <!-- ==================================================================================================== -->
@@ -11882,18 +11882,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-config<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-config-8.0.0.jar 
+   juneau-config-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.config_8.0.0.jar 
+   org.apache.juneau.config_8.0.1.jar 
 </p>
 
 <!-- ==================================================================================================== -->
@@ -11921,7 +11921,7 @@
    <ck>key4</ck> = <cv>http://bar</cv>
 </p>
 <p>
-   Config files are access through the <a href="org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config"><code>Config</code></a> class which
+   Config files are accessed through the <a href="org/apache/juneau/config/Config.html" title="class in org.apache.juneau.config"><code>Config</code></a> class which
    are created through the <a href="org/apache/juneau/config/ConfigBuilder.html" title="class in org.apache.juneau.config"><code>ConfigBuilder</code></a> class.
    Builder creator methods are provided on the <code>Config</code> class:
 </p>
@@ -12267,7 +12267,7 @@
    <ck>key1</ck> = <cv>['foo','bar','baz']</cv>
 </p>
 <p class='bpcode w800'>
-   String[] key1 = c.getObject(<js>"key1"</js>, String.<jk>class</jk>);
+   String[] key1 = c.getObject(<js>"key1"</js>, String[].<jk>class</jk>);
 </p>
 <p>
    Primitive arrays can also be retrieved using the <code>getObject()</code> methods:
@@ -13240,7 +13240,7 @@
       <jk>public synchronized</jk> String write(String name, String expectedContents, String newContents) {
    
          <jc>// This is a no-op.</jc>
-         <jk>if</jk> (isEquals(expectedContents, newContents))
+         <jk>if</jk> (<jsm>isEquals</jsm>(expectedContents, newContents))
             <jk>return null</jk>;
          
          String currentContents = read(name);
@@ -13333,7 +13333,7 @@
          <jk>this</jk>.<jf>nameColumn</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_nameColumn</jsf>);
          <jk>this</jk>.<jf>valueColumn</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_valueColumn</jsf>);     
 
-         <jk>int</jk> pollInterval = getStringProperty(<jsf>CONFIGSQLSTORE_pollInterval</jsf>, 600);
+         <jk>int</jk> pollInterval = getStringProperty(<jsf>CONFIGSQLSTORE_pollInterval</jsf>, 600);  <jc>// Time in seconds.</jc>
          
          TimerTask timerTask = <jk>new</jk> TimerTask() {
             <ja>@Override</ja>
@@ -13343,7 +13343,7 @@
          };
 
          <jk>this</jk>.<jf>watcher</jf> = <jk>new</jk> Timer(<js>"MyTimer"</js>);
-         <jf>watcher</jf>.scheduleAtFixedRate(timerTask, 0, pollInterval * 10000);
+         <jf>watcher</jf>.scheduleAtFixedRate(timerTask, 0, pollInterval * 1000);
       }
       
       <jk>private synchronized void</jk> poll() {
@@ -13380,7 +13380,7 @@
       <jk>public synchronized</jk> String write(String name, String expectedContents, String newContents) {
    
          <jc>// This is a no-op.</jc>
-         <jk>if</jk> (isEquals(expectedContents, newContents))
+         <jk>if</jk> (<jsm>isEquals</jsm>(expectedContents, newContents))
             <jk>return null</jk>;
          
          String currentContents = read(name);
@@ -13559,11 +13559,14 @@
          <li>Any file that end with <code>.cfg</code>.  First one matched alphabetically is used.
       </ol>
    <li>
-      In the context classpath (i.e. inside the jar itself):
+      In the context classpath root package (i.e. inside the jar itself):
       <ol>
          <li><code>&lt;jar-name&gt;.cfg</code>
          <li><code>juneau.cfg</code>
          <li><code>default.cfg</code>
+         <li><code>application.cfg</code>
+         <li><code>app.cfg</code>
+         <li><code>settings.cfg</code>
       </ol>
 </ol>
 <p>
@@ -13590,18 +13593,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-rest-server<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-rest-server-8.0.0.jar 
+   juneau-rest-server-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.rest.server_8.0.0.jar 
+   org.apache.juneau.rest.server_8.0.1.jar 
 </p>  
 
 <p>
@@ -14133,14 +14136,14 @@
 <h4 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRest' id='juneau-rest-server.Instantiation.BasicRest'>7.3.3 - BasicRest</a></h4>
 <div class='topic'><!-- START: 7.3.3 - juneau-rest-server.Instantiation.BasicRest -->
 <p>
-   The <a href="org/apache/juneau/rest/BasicRest.html" title="class in org.apache.juneau.rest"><code>BasicRest</code></a> class is identical to the <code>org.apache.juneau.BasicRestServlet</code> class except that
+   The <a href="org/apache/juneau/rest/BasicRest.html" title="class in org.apache.juneau.rest"><code>BasicRest</code></a> class is identical to the <a href="org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest"><code>BasicRestServlet</code></a> class except that
    it does not extend from <code>HttpServlet</code>.
    It defines the exact same set of serializers, parsers, etc., but it cannot be deployed as a top-level
    servlet.  It can however be used for child resources registered via the <a href="org/apache/juneau/rest/annotation/RestResource.html#children--"><code>@RestResource(children)</code></a> 
    annotation. 
 </p>
 <p>
-   The code for this class is virtually identical to <code>org.apache.juneau.BasicRestServlet</code> but lacks a parent class:
+   The code for this class is virtually identical to <a href="org/apache/juneau/rest/BasicRestServlet.html" title="class in org.apache.juneau.rest"><code>BasicRestServlet</code></a> but lacks a parent class:
 </p>
 <p class='bpcode w800'>
    <ja>@RestResource</ja>(
@@ -14274,12 +14277,9 @@
       children={
          HelloWorldResource.<jk>class</jk>,
          PetStoreResource.<jk>class</jk>,
-         PhotosResource.<jk>class</jk>,
          DtoExamples.<jk>class</jk>,
-         SqlQueryResource.<jk>class</jk>,
          ConfigResource.<jk>class</jk>,
          LogsResource.<jk>class</jk>,
-         DebugResource.<jk>class</jk>,
          ShutdownResource.<jk>class</jk>
       }
    )
@@ -14319,7 +14319,7 @@
 <h4 class='topic new' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestGroup' id='juneau-rest-server.Instantiation.BasicRestGroup'>7.3.6 - BasicRestGroup</a></h4>
 <div class='topic'><!-- START: 7.3.6 - juneau-rest-server.Instantiation.BasicRestGroup -->
 <p>
-   The <a href="org/apache/juneau/rest/BasicRestGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestGroup</code></a> class is identical to the <code>org.apache.juneau.BasicRestServletGroup</code> class except that
+   The <a href="org/apache/juneau/rest/BasicRestGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestGroup</code></a> class is identical to the <a href="org/apache/juneau/rest/BasicRestServletGroup.html" title="class in org.apache.juneau.rest"><code>BasicRestServletGroup</code></a> class except that
    it does not extend from <code>HttpServlet</code>.
    It defines the exact same set of serializers, parsers, etc., but it cannot be deployed as a top-level
    servlet.  It can however be used for child resources registered via the <a href="org/apache/juneau/rest/annotation/RestResource.html#children--"><code>@RestResource(children)</code></a> 
@@ -22242,18 +22242,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-rest-server-jaxrs<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-rest-server-jaxrs-8.0.0.jar 
+   juneau-rest-server-jaxrs-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.rest.server_8.0.0.jar 
+   org.apache.juneau.rest.server_8.0.1.jar 
 </p>  
 
 <p>
@@ -22339,18 +22339,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-rest-server-springboot<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-rest-server-springboot-8.0.0.jar 
+   juneau-rest-server-springboot-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.rest.server.springboot_8.0.0.jar 
+   org.apache.juneau.rest.server.springboot_8.0.1.jar 
 </p>  
 
 <p>
@@ -22505,18 +22505,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-rest-client<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-rest-client-8.0.0.jar 
+   juneau-rest-client-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.rest.client_8.0.0.jar 
+   org.apache.juneau.rest.client_8.0.1.jar 
 </p>  
 
 <p>
@@ -23715,7 +23715,7 @@
       title=<js>"Petstore application"</js>,
       ...
    )
-   <jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestServletJena <jk>implements</jk> PetStore {
+   <jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena <jk>implements</jk> PetStore {
    
       ...
    
@@ -24505,18 +24505,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-microservice-core<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-microservice-core-8.0.0.jar 
+   juneau-microservice-core-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.microservice.core_8.0.0.jar 
+   org.apache.juneau.microservice.core_8.0.1.jar 
 </p>  
 
 <p>
@@ -24854,7 +24854,14 @@
    <li>
       Resolve any <js>"*.cfg"</js> file that can be found in the working directory.
    <li>
-      Resolve any of the following files in the classpath:  <js>"juneau.cfg"</js>, <js>"system.cfg"</js>
+      Resolve any of the following files in the classpath:
+      <ol>
+         <li><code>juneau.cfg</code>
+         <li><code>default.cfg</code>
+         <li><code>application.cfg</code>
+         <li><code>app.cfg</code>
+         <li><code>settings.cfg</code>
+      </ol>
 </ol>
 <p>
    If no configuration file is found, and empty in-memory configuration is used.
@@ -25325,18 +25332,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-microservice-jetty<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-microservice-jetty-8.0.0.jar 
+   juneau-microservice-jetty-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.microservice.jetty_8.0.0.jar 
+   org.apache.juneau.microservice.jetty_8.0.1.jar 
 </p>  
 
 <p>
@@ -26150,7 +26157,7 @@
 <div class='topic'><!-- START: 13 - my-jetty-microservice -->
 <h5 class='figure'>Starter Project Zip</h5>
 <p class='bpcode w500'>
-   my-jetty-microservice-8.0.0.zip 
+   my-jetty-microservice-8.0.1.zip 
 </p>  
 
 <p>
@@ -26170,7 +26177,7 @@
 </p>     
 <ol class='spaced-list'>
    <li>
-      Download the <code>my-jetty-microservice-8.0.0.zip</code> file from the downloads page
+      Download the <code>my-jetty-microservice-8.0.1.zip</code> file from the downloads page
       (located in the binaries) and import it into your workspace as an existing project:
       <br><br>
       <img class='bordered' src='doc-files/my-jetty-microservice.Installing.1.png' style='width:524px'>
@@ -26508,7 +26515,7 @@
 <div class='topic'><!-- START: 14 - my-springboot-microservice -->
 <h5 class='figure'>Starter Project Zip</h5>
 <p class='bpcode w500'>
-   my-springboot-microservice-8.0.0.zip 
+   my-springboot-microservice-8.0.1.zip 
 </p>  
 
 <p>
@@ -26532,7 +26539,7 @@
 </p>     
 <ol class='spaced-list'>
    <li>
-      Download the <code>my-springboot-microservice-8.0.0.zip</code> file from the downloads page
+      Download the <code>my-springboot-microservice-8.0.1.zip</code> file from the downloads page
       (located in the binaries) and import it into your workspace as an existing project:
       <br><br>
       <img class='bordered' src='doc-files/my-springboot-microservice.Installing.1.png' style='width:524px'>
@@ -26742,7 +26749,7 @@
 <div class='topic'><!-- START: 15 - juneau-examples-core -->
 <h5 class='figure'>Archive File</h5>
 <p class='bpcode w500'>
-   juneau-examples-core-8.0.0.zip 
+   juneau-examples-core-8.0.1.zip 
 </p>  
 
 <p>
@@ -26758,7 +26765,7 @@
 </p>     
 <ol class='spaced-list'>
    <li>
-      Download the <code>juneau-examples-core-8.0.0.zip</code> file from the downloads page
+      Download the <code>juneau-examples-core-8.0.1.zip</code> file from the downloads page
       (located in the binaries) and import it into your workspace as an existing project:
       <br><br>
       <img class='bordered' src='doc-files/juneau-examples-core.Installing.1.png' style='width:524px'>
@@ -26829,18 +26836,18 @@
    <xt>&lt;dependency&gt;</xt>
       <xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
       <xt>&lt;artifactId&gt;</xt>juneau-examples-rest<xt>&lt;/artifactId&gt;</xt>
-      <xt>&lt;version&gt;</xt>8.0.0<xt>&lt;/version&gt;</xt>
+      <xt>&lt;version&gt;</xt>8.0.1<xt>&lt;/version&gt;</xt>
    <xt>&lt;/dependency&gt;</xt>
 </p>  
 
 <h5 class='figure'>Java Library</h5>
 <p class='bpcode w500'>
-   juneau-examples-rest-8.0.0.jar 
+   juneau-examples-rest-8.0.1.jar 
 </p>  
 
 <h5 class='figure'>OSGi Module</h5>
 <p class='bpcode w500'>
-   org.apache.juneau.examples.rest_8.0.0.jar 
+   org.apache.juneau.examples.rest_8.0.1.jar 
 </p>  
 
 <p>
@@ -27141,7 +27148,7 @@
          PhotosResource.<jk>class</jk>
       }
    )
-   <jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestServletJena {
+   <jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena {
 </p>
 <p>
    The inner contents of the page are generated from this method which is used to define a jumping-off
@@ -27307,7 +27314,7 @@
 </p>
 <h5 class='figure'>PetStoreResource.java</h5>
 <p class='bpcode w800'>
-   <jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestServletJena <jk>implements</jk> PetStore {
+   <jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena <jk>implements</jk> PetStore {
    
       <jk>private</jk> PetStoreService <jf>store</jf>;
    
@@ -27507,7 +27514,7 @@
 </p>
 <h5 class='figure'>PetStoreResource.java</h5>
 <p class='bpcode w800'>
-   <jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestServletJena <jk>implements</jk> PetStore {
+   <jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena <jk>implements</jk> PetStore {
    
       <ja>@Override</ja> <jc>/* PetStore */</jc>
       <ja>@RestMethod</ja>(
@@ -28841,7 +28848,7 @@
 <div class='topic'><!-- START: 17 - juneau-examples-rest-jetty -->
 <h5 class='figure'>Starter Project Zip</h5>
 <p class='bpcode w500'>
-   juneau-examples-rest-jetty-8.0.0.zip 
+   juneau-examples-rest-jetty-8.0.1.zip 
 </p>  
 
 <p>
@@ -28858,7 +28865,7 @@
 </p>     
 <ol class='spaced-list'>
    <li>
-      Download the <code>juneau-examples-rest-jetty-8.0.0.zip</code> file from the downloads page
+      Download the <code>juneau-examples-rest-jetty-8.0.1.zip</code> file from the downloads page
       (located in the binaries) and import it into your workspace as an existing project:
       <br><br>
       <img class='bordered' src='doc-files/juneau-examples-rest-jetty.Installing.1.png' style='width:524px'>
@@ -29218,7 +29225,7 @@
 <div class='topic'><!-- START: 18 - juneau-examples-rest-springboot -->
 <h5 class='figure'>Starter Project Zip</h5>
 <p class='bpcode w500'>
-   juneau-examples-rest-springboot-8.0.0.zip 
+   juneau-examples-rest-springboot-8.0.1.zip 
 </p>  
 
 <p>
@@ -29245,7 +29252,7 @@
 </p>     
 <ol class='spaced-list'>
    <li>
-      Download the <code>juneau-examples-rest-springboot-8.0.0.zip</code> file from the downloads page
+      Download the <code>juneau-examples-rest-springboot-8.0.1.zip</code> file from the downloads page
       (located in the binaries) and import it into your workspace as an existing project:
       <br><br>
       <img class='bordered' src='doc-files/juneau-examples-rest-springboot.Installing.1.png' style='width:524px'>
diff --git a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/BeanMeta.html b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/BeanMeta.html
index 8a371b9..01660e5 100644
--- a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/BeanMeta.html
+++ b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/BeanMeta.html
@@ -26,898 +26,900 @@
 <span class="sourceLineNo">018</span>import static org.apache.juneau.internal.StringUtils.*;<a name="line.18"></a>
 <span class="sourceLineNo">019</span>import static org.apache.juneau.BeanMeta.MethodType.*;<a name="line.19"></a>
 <span class="sourceLineNo">020</span><a name="line.20"></a>
-<span class="sourceLineNo">021</span>import java.beans.*;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.io.*;<a name="line.22"></a>
-<span class="sourceLineNo">023</span>import java.lang.reflect.*;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import java.util.*;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.juneau.annotation.*;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.juneau.transform.*;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.juneau.utils.*;<a name="line.28"></a>
-<span class="sourceLineNo">029</span><a name="line.29"></a>
-<span class="sourceLineNo">030</span>/**<a name="line.30"></a>
-<span class="sourceLineNo">031</span> * Encapsulates all access to the properties of a bean class (like a souped-up {@link java.beans.BeanInfo}).<a name="line.31"></a>
-<span class="sourceLineNo">032</span> *<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * &lt;h5 class='topic'&gt;Description&lt;/h5&gt;<a name="line.33"></a>
+<span class="sourceLineNo">021</span>import java.beans.BeanInfo;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.beans.Introspector;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.beans.PropertyDescriptor;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.io.*;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.lang.reflect.*;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.util.*;<a name="line.26"></a>
+<span class="sourceLineNo">027</span><a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.apache.juneau.annotation.*;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.apache.juneau.transform.*;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.juneau.utils.*;<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>/**<a name="line.32"></a>
+<span class="sourceLineNo">033</span> * Encapsulates all access to the properties of a bean class (like a souped-up {@link java.beans.BeanInfo}).<a name="line.33"></a>
 <span class="sourceLineNo">034</span> *<a name="line.34"></a>
-<span class="sourceLineNo">035</span> * Uses introspection to find all the properties associated with this class.  If the {@link Bean @Bean} annotation<a name="line.35"></a>
-<span class="sourceLineNo">036</span> *    is present on the class, or the class has a {@link BeanFilter} registered with it in the bean context,<a name="line.36"></a>
-<span class="sourceLineNo">037</span> *    then that information is used to determine the properties on the class.<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * Otherwise, the {@code BeanInfo} functionality in Java is used to determine the properties on the class.<a name="line.38"></a>
-<span class="sourceLineNo">039</span> *<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * &lt;h5 class='topic'&gt;Bean property ordering&lt;/h5&gt;<a name="line.40"></a>
+<span class="sourceLineNo">035</span> * &lt;h5 class='topic'&gt;Description&lt;/h5&gt;<a name="line.35"></a>
+<span class="sourceLineNo">036</span> *<a name="line.36"></a>
+<span class="sourceLineNo">037</span> * Uses introspection to find all the properties associated with this class.  If the {@link Bean @Bean} annotation<a name="line.37"></a>
+<span class="sourceLineNo">038</span> *    is present on the class, or the class has a {@link BeanFilter} registered with it in the bean context,<a name="line.38"></a>
+<span class="sourceLineNo">039</span> *    then that information is used to determine the properties on the class.<a name="line.39"></a>
+<span class="sourceLineNo">040</span> * Otherwise, the {@code BeanInfo} functionality in Java is used to determine the properties on the class.<a name="line.40"></a>
 <span class="sourceLineNo">041</span> *<a name="line.41"></a>
-<span class="sourceLineNo">042</span> * The order of the properties are as follows:<a name="line.42"></a>
-<span class="sourceLineNo">043</span> * &lt;ul class='spaced-list'&gt;<a name="line.43"></a>
-<span class="sourceLineNo">044</span> *    &lt;li&gt;<a name="line.44"></a>
-<span class="sourceLineNo">045</span> *       If {@link Bean @Bean} annotation is specified on class, then the order is the same as the list of properties<a name="line.45"></a>
-<span class="sourceLineNo">046</span> *       in the annotation.<a name="line.46"></a>
-<span class="sourceLineNo">047</span> *    &lt;li&gt;<a name="line.47"></a>
-<span class="sourceLineNo">048</span> *       If {@link Bean @Bean} annotation is not specified on the class, then the order is based on the following.<a name="line.48"></a>
-<span class="sourceLineNo">049</span> *       &lt;ul&gt;<a name="line.49"></a>
-<span class="sourceLineNo">050</span> *          &lt;li&gt;Public fields (same order as {@code Class.getFields()}).<a name="line.50"></a>
-<span class="sourceLineNo">051</span> *          &lt;li&gt;Properties returned by {@code BeanInfo.getPropertyDescriptors()}.<a name="line.51"></a>
-<span class="sourceLineNo">052</span> *          &lt;li&gt;Non-standard getters/setters with {@link BeanProperty @BeanProperty} annotation defined on them.<a name="line.52"></a>
-<span class="sourceLineNo">053</span> *       &lt;/ul&gt;<a name="line.53"></a>
-<span class="sourceLineNo">054</span> * &lt;/ul&gt;<a name="line.54"></a>
-<span class="sourceLineNo">055</span> *<a name="line.55"></a>
-<span class="sourceLineNo">056</span> * &lt;p&gt;<a name="line.56"></a>
-<span class="sourceLineNo">057</span> * The order can also be overridden through the use of an {@link BeanFilter}.<a name="line.57"></a>
-<span class="sourceLineNo">058</span> *<a name="line.58"></a>
-<span class="sourceLineNo">059</span> * @param &lt;T&gt; The class type that this metadata applies to.<a name="line.59"></a>
-<span class="sourceLineNo">060</span> */<a name="line.60"></a>
-<span class="sourceLineNo">061</span>public class BeanMeta&lt;T&gt; {<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>   /** The target class type that this meta object describes. */<a name="line.63"></a>
-<span class="sourceLineNo">064</span>   protected final ClassMeta&lt;T&gt; classMeta;<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>   /** The target class that this meta object describes. */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>   protected final Class&lt;T&gt; c;<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>   /** The properties on the target class. */<a name="line.69"></a>
-<span class="sourceLineNo">070</span>   protected final Map&lt;String,BeanPropertyMeta&gt; properties;<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>   /** The getter properties on the target class. */<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   protected final Map&lt;Method,String&gt; getterProps;<a name="line.73"></a>
-<span class="sourceLineNo">074</span><a name="line.74"></a>
-<span class="sourceLineNo">075</span>   /** The setter properties on the target class. */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   protected final Map&lt;Method,String&gt; setterProps;<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>   /** The bean context that created this metadata object. */<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   protected final BeanContext ctx;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>   /** Optional bean filter associated with the target class. */<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   protected final BeanFilter beanFilter;<a name="line.82"></a>
-<span class="sourceLineNo">083</span><a name="line.83"></a>
-<span class="sourceLineNo">084</span>   /** Type variables implemented by this bean. */<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   protected final Map&lt;Class&lt;?&gt;,Class&lt;?&gt;[]&gt; typeVarImpls;<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>   /** The constructor for this bean. */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   protected final Constructor&lt;T&gt; constructor;<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>   /** For beans with constructors with BeanConstructor annotation, this is the list of constructor arg properties. */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>   protected final String[] constructorArgs;<a name="line.91"></a>
-<span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>   private final MetadataMap extMeta;  // Extended metadata<a name="line.93"></a>
+<span class="sourceLineNo">042</span> * &lt;h5 class='topic'&gt;Bean property ordering&lt;/h5&gt;<a name="line.42"></a>
+<span class="sourceLineNo">043</span> *<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * The order of the properties are as follows:<a name="line.44"></a>
+<span class="sourceLineNo">045</span> * &lt;ul class='spaced-list'&gt;<a name="line.45"></a>
+<span class="sourceLineNo">046</span> *    &lt;li&gt;<a name="line.46"></a>
+<span class="sourceLineNo">047</span> *       If {@link Bean @Bean} annotation is specified on class, then the order is the same as the list of properties<a name="line.47"></a>
+<span class="sourceLineNo">048</span> *       in the annotation.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> *    &lt;li&gt;<a name="line.49"></a>
+<span class="sourceLineNo">050</span> *       If {@link Bean @Bean} annotation is not specified on the class, then the order is based on the following.<a name="line.50"></a>
+<span class="sourceLineNo">051</span> *       &lt;ul&gt;<a name="line.51"></a>
+<span class="sourceLineNo">052</span> *          &lt;li&gt;Public fields (same order as {@code Class.getFields()}).<a name="line.52"></a>
+<span class="sourceLineNo">053</span> *          &lt;li&gt;Properties returned by {@code BeanInfo.getPropertyDescriptors()}.<a name="line.53"></a>
+<span class="sourceLineNo">054</span> *          &lt;li&gt;Non-standard getters/setters with {@link BeanProperty @BeanProperty} annotation defined on them.<a name="line.54"></a>
+<span class="sourceLineNo">055</span> *       &lt;/ul&gt;<a name="line.55"></a>
+<span class="sourceLineNo">056</span> * &lt;/ul&gt;<a name="line.56"></a>
+<span class="sourceLineNo">057</span> *<a name="line.57"></a>
+<span class="sourceLineNo">058</span> * &lt;p&gt;<a name="line.58"></a>
+<span class="sourceLineNo">059</span> * The order can also be overridden through the use of an {@link BeanFilter}.<a name="line.59"></a>
+<span class="sourceLineNo">060</span> *<a name="line.60"></a>
+<span class="sourceLineNo">061</span> * @param &lt;T&gt; The class type that this metadata applies to.<a name="line.61"></a>
+<span class="sourceLineNo">062</span> */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>public class BeanMeta&lt;T&gt; {<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>   /** The target class type that this meta object describes. */<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   protected final ClassMeta&lt;T&gt; classMeta;<a name="line.66"></a>
+<span class="sourceLineNo">067</span><a name="line.67"></a>
+<span class="sourceLineNo">068</span>   /** The target class that this meta object describes. */<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   protected final Class&lt;T&gt; c;<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>   /** The properties on the target class. */<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   protected final Map&lt;String,BeanPropertyMeta&gt; properties;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>   /** The getter properties on the target class. */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   protected final Map&lt;Method,String&gt; getterProps;<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>   /** The setter properties on the target class. */<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   protected final Map&lt;Method,String&gt; setterProps;<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>   /** The bean context that created this metadata object. */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   protected final BeanContext ctx;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>   /** Optional bean filter associated with the target class. */<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   protected final BeanFilter beanFilter;<a name="line.84"></a>
+<span class="sourceLineNo">085</span><a name="line.85"></a>
+<span class="sourceLineNo">086</span>   /** Type variables implemented by this bean. */<a name="line.86"></a>
+<span class="sourceLineNo">087</span>   protected final Map&lt;Class&lt;?&gt;,Class&lt;?&gt;[]&gt; typeVarImpls;<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>   /** The constructor for this bean. */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   protected final Constructor&lt;T&gt; constructor;<a name="line.90"></a>
+<span class="sourceLineNo">091</span><a name="line.91"></a>
+<span class="sourceLineNo">092</span>   /** For beans with constructors with BeanConstructor annotation, this is the list of constructor arg properties. */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   protected final String[] constructorArgs;<a name="line.93"></a>
 <span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>   // Other fields<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   final String typePropertyName;                         // "_type" property actual name.<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   private final BeanPropertyMeta typeProperty;           // "_type" mock bean property.<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   final BeanPropertyMeta dynaProperty;                   // "extras" property.<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   private final String dictionaryName;                   // The @Bean(typeName) annotation defined on this bean class.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   final String notABeanReason;                           // Readable string explaining why this class wasn't a bean.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>   final BeanRegistry beanRegistry;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   final boolean sortProperties;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   final boolean fluentSetters;<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>   /**<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    * Constructor.<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    *<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    * @param classMeta The target class.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    * @param ctx The bean context that created this object.<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    * @param beanFilter Optional bean filter associated with the target class.  Can be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    * @param pNames Explicit list of property names and order of properties.  If &lt;jk&gt;null&lt;/jk&gt;, determine automatically.<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    */<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   protected BeanMeta(final ClassMeta&lt;T&gt; classMeta, BeanContext ctx, BeanFilter beanFilter, String[] pNames) {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      this.classMeta = classMeta;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>      this.ctx = ctx;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      this.c = classMeta.getInnerClass();<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>      Builder&lt;T&gt; b = new Builder&lt;&gt;(classMeta, ctx, beanFilter, pNames);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      this.notABeanReason = b.init(this);<a name="line.119"></a>
-<span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>      this.beanFilter = beanFilter;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      this.dictionaryName = b.dictionaryName;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      this.properties = unmodifiableMap(b.properties);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      this.getterProps = unmodifiableMap(b.getterProps);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.setterProps = unmodifiableMap(b.setterProps);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>      this.dynaProperty = b.dynaProperty;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      this.typeVarImpls = unmodifiableMap(b.typeVarImpls);<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      this.constructor = b.constructor;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>      this.constructorArgs = b.constructorArgs;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      this.extMeta = b.extMeta;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      this.beanRegistry = b.beanRegistry;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      this.typePropertyName = b.typePropertyName;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      this.typeProperty = BeanPropertyMeta.builder(this, typePropertyName).canRead().canWrite().rawMetaType(ctx.string()).beanRegistry(beanRegistry).build();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      this.sortProperties = b.sortProperties;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      this.fluentSetters = b.fluentSetters;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>   private static final class Builder&lt;T&gt; {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      ClassMeta&lt;T&gt; classMeta;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      BeanContext ctx;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      BeanFilter beanFilter;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      String[] pNames;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>      Map&lt;String,BeanPropertyMeta&gt; properties;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      Map&lt;Method,String&gt; getterProps = new HashMap&lt;&gt;();<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      Map&lt;Method,String&gt; setterProps = new HashMap&lt;&gt;();<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      BeanPropertyMeta dynaProperty;<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>      Map&lt;Class&lt;?&gt;,Class&lt;?&gt;[]&gt; typeVarImpls;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>      Constructor&lt;T&gt; constructor;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>      String[] constructorArgs = new String[0];<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      MetadataMap extMeta = new MetadataMap();<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      PropertyNamer propertyNamer;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>      BeanRegistry beanRegistry;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      String dictionaryName, typePropertyName;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      boolean sortProperties, fluentSetters;<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>      Builder(ClassMeta&lt;T&gt; classMeta, BeanContext ctx, BeanFilter beanFilter, String[] pNames) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>         this.classMeta = classMeta;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>         this.ctx = ctx;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>         this.beanFilter = beanFilter;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>         this.pNames = pNames;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      }<a name="line.162"></a>
-<span class="sourceLineNo">163</span><a name="line.163"></a>
-<span class="sourceLineNo">164</span>      @SuppressWarnings("unchecked")<a name="line.164"></a>
-<span class="sourceLineNo">165</span>      String init(BeanMeta&lt;T&gt; beanMeta) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>         Class&lt;?&gt; c = classMeta.getInnerClass();<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>         try {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>            Visibility<a name="line.169"></a>
-<span class="sourceLineNo">170</span>               conVis = ctx.getBeanConstructorVisibility(),<a name="line.170"></a>
-<span class="sourceLineNo">171</span>               cVis = ctx.getBeanClassVisibility(),<a name="line.171"></a>
-<span class="sourceLineNo">172</span>               mVis = ctx.getBeanMethodVisibility(),<a name="line.172"></a>
-<span class="sourceLineNo">173</span>               fVis = ctx.getBeanFieldVisibility();<a name="line.173"></a>
-<span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>            List&lt;Class&lt;?&gt;&gt; bdClasses = new ArrayList&lt;&gt;();<a name="line.175"></a>
-<span class="sourceLineNo">176</span>            if (beanFilter != null &amp;&amp; beanFilter.getBeanDictionary() != null)<a name="line.176"></a>
-<span class="sourceLineNo">177</span>               bdClasses.addAll(Arrays.asList(beanFilter.getBeanDictionary()));<a name="line.177"></a>
-<span class="sourceLineNo">178</span>            Bean bean = classMeta.innerClass.getAnnotation(Bean.class);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>            if (bean != null) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>               if (! bean.typeName().isEmpty())<a name="line.180"></a>
-<span class="sourceLineNo">181</span>                  bdClasses.add(classMeta.innerClass);<a name="line.181"></a>
-<span class="sourceLineNo">182</span>            }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>            this.beanRegistry = new BeanRegistry(ctx, null, bdClasses.toArray(new Class&lt;?&gt;[bdClasses.size()]));<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>            for (Bean b : getAnnotationsParentFirst(Bean.class, classMeta.innerClass))<a name="line.185"></a>
-<span class="sourceLineNo">186</span>               if (! b.typePropertyName().isEmpty())<a name="line.186"></a>
-<span class="sourceLineNo">187</span>                  typePropertyName = b.typePropertyName();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>            if (typePropertyName == null)<a name="line.188"></a>
-<span class="sourceLineNo">189</span>               typePropertyName = ctx.getBeanTypePropertyName();<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>            fluentSetters = (ctx.isFluentSetters() || (beanFilter != null &amp;&amp; beanFilter.isFluentSetters()));<a name="line.191"></a>
+<span class="sourceLineNo">095</span>   private final MetadataMap extMeta;  // Extended metadata<a name="line.95"></a>
+<span class="sourceLineNo">096</span><a name="line.96"></a>
+<span class="sourceLineNo">097</span>   // Other fields<a name="line.97"></a>
+<span class="sourceLineNo">098</span>   final String typePropertyName;                         // "_type" property actual name.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   private final BeanPropertyMeta typeProperty;           // "_type" mock bean property.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   final BeanPropertyMeta dynaProperty;                   // "extras" property.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   private final String dictionaryName;                   // The @Bean(typeName) annotation defined on this bean class.<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   final String notABeanReason;                           // Readable string explaining why this class wasn't a bean.<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   final BeanRegistry beanRegistry;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   final boolean sortProperties;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>   final boolean fluentSetters;<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>   /**<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    * Constructor.<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    *<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    * @param classMeta The target class.<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    * @param ctx The bean context that created this object.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    * @param beanFilter Optional bean filter associated with the target class.  Can be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.112"></a>
+<span class="sourceLineNo">113</span>    * @param pNames Explicit list of property names and order of properties.  If &lt;jk&gt;null&lt;/jk&gt;, determine automatically.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    */<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   protected BeanMeta(final ClassMeta&lt;T&gt; classMeta, BeanContext ctx, BeanFilter beanFilter, String[] pNames) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>      this.classMeta = classMeta;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      this.ctx = ctx;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>      this.c = classMeta.getInnerClass();<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>      Builder&lt;T&gt; b = new Builder&lt;&gt;(classMeta, ctx, beanFilter, pNames);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      this.notABeanReason = b.init(this);<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>      this.beanFilter = beanFilter;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      this.dictionaryName = b.dictionaryName;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      this.properties = unmodifiableMap(b.properties);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      this.getterProps = unmodifiableMap(b.getterProps);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      this.setterProps = unmodifiableMap(b.setterProps);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      this.dynaProperty = b.dynaProperty;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      this.typeVarImpls = unmodifiableMap(b.typeVarImpls);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      this.constructor = b.constructor;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      this.constructorArgs = b.constructorArgs;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      this.extMeta = b.extMeta;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      this.beanRegistry = b.beanRegistry;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      this.typePropertyName = b.typePropertyName;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      this.typeProperty = BeanPropertyMeta.builder(this, typePropertyName).canRead().canWrite().rawMetaType(ctx.string()).beanRegistry(beanRegistry).build();<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      this.sortProperties = b.sortProperties;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>      this.fluentSetters = b.fluentSetters;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   }<a name="line.138"></a>
+<span class="sourceLineNo">139</span><a name="line.139"></a>
+<span class="sourceLineNo">140</span>   private static final class Builder&lt;T&gt; {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      ClassMeta&lt;T&gt; classMeta;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      BeanContext ctx;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      BeanFilter beanFilter;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      String[] pNames;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      Map&lt;String,BeanPropertyMeta&gt; properties;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      Map&lt;Method,String&gt; getterProps = new HashMap&lt;&gt;();<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      Map&lt;Method,String&gt; setterProps = new HashMap&lt;&gt;();<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      BeanPropertyMeta dynaProperty;<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>      Map&lt;Class&lt;?&gt;,Class&lt;?&gt;[]&gt; typeVarImpls;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      Constructor&lt;T&gt; constructor;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      String[] constructorArgs = new String[0];<a name="line.152"></a>
+<span class="sourceLineNo">153</span>      MetadataMap extMeta = new MetadataMap();<a name="line.153"></a>
+<span class="sourceLineNo">154</span>      PropertyNamer propertyNamer;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      BeanRegistry beanRegistry;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      String dictionaryName, typePropertyName;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      boolean sortProperties, fluentSetters;<a name="line.157"></a>
+<span class="sourceLineNo">158</span><a name="line.158"></a>
+<span class="sourceLineNo">159</span>      Builder(ClassMeta&lt;T&gt; classMeta, BeanContext ctx, BeanFilter beanFilter, String[] pNames) {<a name="line.159"></a>
+<span class="sourceLineNo">160</span>         this.classMeta = classMeta;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>         this.ctx = ctx;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>         this.beanFilter = beanFilter;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>         this.pNames = pNames;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      }<a name="line.164"></a>
+<span class="sourceLineNo">165</span><a name="line.165"></a>
+<span class="sourceLineNo">166</span>      @SuppressWarnings("unchecked")<a name="line.166"></a>
+<span class="sourceLineNo">167</span>      String init(BeanMeta&lt;T&gt; beanMeta) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>         Class&lt;?&gt; c = classMeta.getInnerClass();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>         try {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>            Visibility<a name="line.171"></a>
+<span class="sourceLineNo">172</span>               conVis = ctx.getBeanConstructorVisibility(),<a name="line.172"></a>
+<span class="sourceLineNo">173</span>               cVis = ctx.getBeanClassVisibility(),<a name="line.173"></a>
+<span class="sourceLineNo">174</span>               mVis = ctx.getBeanMethodVisibility(),<a name="line.174"></a>
+<span class="sourceLineNo">175</span>               fVis = ctx.getBeanFieldVisibility();<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>            List&lt;Class&lt;?&gt;&gt; bdClasses = new ArrayList&lt;&gt;();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>            if (beanFilter != null &amp;&amp; beanFilter.getBeanDictionary() != null)<a name="line.178"></a>
+<span class="sourceLineNo">179</span>               bdClasses.addAll(Arrays.asList(beanFilter.getBeanDictionary()));<a name="line.179"></a>
+<span class="sourceLineNo">180</span>            Bean bean = classMeta.innerClass.getAnnotation(Bean.class);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>            if (bean != null) {<a name="line.181"></a>
+<span class="sourceLineNo">182</span>               if (! bean.typeName().isEmpty())<a name="line.182"></a>
+<span class="sourceLineNo">183</span>                  bdClasses.add(classMeta.innerClass);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>            }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>            this.beanRegistry = new BeanRegistry(ctx, null, bdClasses.toArray(new Class&lt;?&gt;[bdClasses.size()]));<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>            for (Bean b : getAnnotationsParentFirst(Bean.class, classMeta.innerClass))<a name="line.187"></a>
+<span class="sourceLineNo">188</span>               if (! b.typePropertyName().isEmpty())<a name="line.188"></a>
+<span class="sourceLineNo">189</span>                  typePropertyName = b.typePropertyName();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>            if (typePropertyName == null)<a name="line.190"></a>
+<span class="sourceLineNo">191</span>               typePropertyName = ctx.getBeanTypePropertyName();<a name="line.191"></a>
 <span class="sourceLineNo">192</span><a name="line.192"></a>
-<span class="sourceLineNo">193</span>            // If @Bean.interfaceClass is specified on the parent class, then we want<a name="line.193"></a>
-<span class="sourceLineNo">194</span>            // to use the properties defined on that class, not the subclass.<a name="line.194"></a>
-<span class="sourceLineNo">195</span>            Class&lt;?&gt; c2 = (beanFilter != null &amp;&amp; beanFilter.getInterfaceClass() != null ? beanFilter.getInterfaceClass() : c);<a name="line.195"></a>
-<span class="sourceLineNo">196</span><a name="line.196"></a>
-<span class="sourceLineNo">197</span>            Class&lt;?&gt; stopClass = (beanFilter != null ? beanFilter.getStopClass() : Object.class);<a name="line.197"></a>
-<span class="sourceLineNo">198</span>            if (stopClass == null)<a name="line.198"></a>
-<span class="sourceLineNo">199</span>               stopClass = Object.class;<a name="line.199"></a>
-<span class="sourceLineNo">200</span><a name="line.200"></a>
-<span class="sourceLineNo">201</span>            Map&lt;String,BeanPropertyMeta.Builder&gt; normalProps = new LinkedHashMap&lt;&gt;();<a name="line.201"></a>
+<span class="sourceLineNo">193</span>            fluentSetters = (ctx.isFluentSetters() || (beanFilter != null &amp;&amp; beanFilter.isFluentSetters()));<a name="line.193"></a>
+<span class="sourceLineNo">194</span><a name="line.194"></a>
+<span class="sourceLineNo">195</span>            // If @Bean.interfaceClass is specified on the parent class, then we want<a name="line.195"></a>
+<span class="sourceLineNo">196</span>            // to use the properties defined on that class, not the subclass.<a name="line.196"></a>
+<span class="sourceLineNo">197</span>            Class&lt;?&gt; c2 = (beanFilter != null &amp;&amp; beanFilter.getInterfaceClass() != null ? beanFilter.getInterfaceClass() : c);<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>            Class&lt;?&gt; stopClass = (beanFilter != null ? beanFilter.getStopClass() : Object.class);<a name="line.199"></a>
+<span class="sourceLineNo">200</span>            if (stopClass == null)<a name="line.200"></a>
+<span class="sourceLineNo">201</span>               stopClass = Object.class;<a name="line.201"></a>
 <span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>            /// See if this class matches one the patterns in the exclude-class list.<a name="line.203"></a>
-<span class="sourceLineNo">204</span>            if (ctx.isNotABean(c))<a name="line.204"></a>
-<span class="sourceLineNo">205</span>               return "Class matches exclude-class list";<a name="line.205"></a>
-<span class="sourceLineNo">206</span><a name="line.206"></a>
-<span class="sourceLineNo">207</span>            if (! (cVis.isVisible(c.getModifiers()) || c.isAnonymousClass()))<a name="line.207"></a>
-<span class="sourceLineNo">208</span>               return "Class is not public";<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>            if (c.isAnnotationPresent(BeanIgnore.class))<a name="line.210"></a>
-<span class="sourceLineNo">211</span>               return "Class is annotated with @BeanIgnore";<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>            // Make sure it's serializable.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>            if (beanFilter == null &amp;&amp; ctx.isBeansRequireSerializable() &amp;&amp; ! isParentClass(Serializable.class, c))<a name="line.214"></a>
-<span class="sourceLineNo">215</span>               return "Class is not serializable";<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>            // Look for @BeanConstructor constructor.<a name="line.217"></a>
-<span class="sourceLineNo">218</span>            for (Constructor&lt;?&gt; x : c.getConstructors()) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>               if (x.isAnnotationPresent(BeanConstructor.class)) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>                  if (constructor != null)<a name="line.220"></a>
-<span class="sourceLineNo">221</span>                     throw new BeanRuntimeException(c, "Multiple instances of '@BeanConstructor' found.");<a name="line.221"></a>
-<span class="sourceLineNo">222</span>                  constructor = (Constructor&lt;T&gt;)x;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>                  constructorArgs = split(x.getAnnotation(BeanConstructor.class).properties());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>                  if (constructorArgs.length != x.getParameterTypes().length)<a name="line.224"></a>
-<span class="sourceLineNo">225</span>                     throw new BeanRuntimeException(c, "Number of properties defined in '@BeanConstructor' annotation does not match number of parameters in constructor.");<a name="line.225"></a>
-<span class="sourceLineNo">226</span>                  setAccessible(constructor, false);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>               }<a name="line.227"></a>
-<span class="sourceLineNo">228</span>            }<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>            // If this is an interface, look for impl classes defined in the context.<a name="line.230"></a>
-<span class="sourceLineNo">231</span>            if (constructor == null)<a name="line.231"></a>
-<span class="sourceLineNo">232</span>               constructor = (Constructor&lt;T&gt;)ctx.getImplClassConstructor(c, conVis);<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>            if (constructor == null)<a name="line.234"></a>
-<span class="sourceLineNo">235</span>               constructor = (Constructor&lt;T&gt;)findNoArgConstructor(c, conVis);<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>            if (constructor == null &amp;&amp; beanFilter == null &amp;&amp; ctx.isBeansRequireDefaultConstructor())<a name="line.237"></a>
-<span class="sourceLineNo">238</span>               return "Class does not have the required no-arg constructor";<a name="line.238"></a>
-<span class="sourceLineNo">239</span><a name="line.239"></a>
-<span class="sourceLineNo">240</span>            setAccessible(constructor, false);<a name="line.240"></a>
+<span class="sourceLineNo">203</span>            Map&lt;String,BeanPropertyMeta.Builder&gt; normalProps = new LinkedHashMap&lt;&gt;();<a name="line.203"></a>
+<span class="sourceLineNo">204</span><a name="line.204"></a>
+<span class="sourceLineNo">205</span>            /// See if this class matches one the patterns in the exclude-class list.<a name="line.205"></a>
+<span class="sourceLineNo">206</span>            if (ctx.isNotABean(c))<a name="line.206"></a>
+<span class="sourceLineNo">207</span>               return "Class matches exclude-class list";<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>            if (! (cVis.isVisible(c.getModifiers()) || c.isAnonymousClass()))<a name="line.209"></a>
+<span class="sourceLineNo">210</span>               return "Class is not public";<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>            if (c.isAnnotationPresent(BeanIgnore.class))<a name="line.212"></a>
+<span class="sourceLineNo">213</span>               return "Class is annotated with @BeanIgnore";<a name="line.213"></a>
+<span class="sourceLineNo">214</span><a name="line.214"></a>
+<span class="sourceLineNo">215</span>            // Make sure it's serializable.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>            if (beanFilter == null &amp;&amp; ctx.isBeansRequireSerializable() &amp;&amp; ! isParentClass(Serializable.class, c))<a name="line.216"></a>
+<span class="sourceLineNo">217</span>               return "Class is not serializable";<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>            // Look for @BeanConstructor constructor.<a name="line.219"></a>
+<span class="sourceLineNo">220</span>            for (Constructor&lt;?&gt; x : c.getConstructors()) {<a name="line.220"></a>
+<span class="sourceLineNo">221</span>               if (x.isAnnotationPresent(BeanConstructor.class)) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                  if (constructor != null)<a name="line.222"></a>
+<span class="sourceLineNo">223</span>                     throw new BeanRuntimeException(c, "Multiple instances of '@BeanConstructor' found.");<a name="line.223"></a>
+<span class="sourceLineNo">224</span>                  constructor = (Constructor&lt;T&gt;)x;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>                  constructorArgs = split(x.getAnnotation(BeanConstructor.class).properties());<a name="line.225"></a>
+<span class="sourceLineNo">226</span>                  if (constructorArgs.length != x.getParameterTypes().length)<a name="line.226"></a>
+<span class="sourceLineNo">227</span>                     throw new BeanRuntimeException(c, "Number of properties defined in '@BeanConstructor' annotation does not match number of parameters in constructor.");<a name="line.227"></a>
+<span class="sourceLineNo">228</span>                  setAccessible(constructor, false);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>               }<a name="line.229"></a>
+<span class="sourceLineNo">230</span>            }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>            // If this is an interface, look for impl classes defined in the context.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>            if (constructor == null)<a name="line.233"></a>
+<span class="sourceLineNo">234</span>               constructor = (Constructor&lt;T&gt;)ctx.getImplClassConstructor(c, conVis);<a name="line.234"></a>
+<span class="sourceLineNo">235</span><a name="line.235"></a>
+<span class="sourceLineNo">236</span>            if (constructor == null)<a name="line.236"></a>
+<span class="sourceLineNo">237</span>               constructor = (Constructor&lt;T&gt;)findNoArgConstructor(c, conVis);<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>            if (constructor == null &amp;&amp; beanFilter == null &amp;&amp; ctx.isBeansRequireDefaultConstructor())<a name="line.239"></a>
+<span class="sourceLineNo">240</span>               return "Class does not have the required no-arg constructor";<a name="line.240"></a>
 <span class="sourceLineNo">241</span><a name="line.241"></a>
-<span class="sourceLineNo">242</span>            // Explicitly defined property names in @Bean annotation.<a name="line.242"></a>
-<span class="sourceLineNo">243</span>            Set&lt;String&gt; fixedBeanProps = new LinkedHashSet&lt;&gt;();<a name="line.243"></a>
-<span class="sourceLineNo">244</span>            String[] includeProperties = ctx.getIncludeProperties(c);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            String[] excludeProperties = ctx.getExcludeProperties(c);<a name="line.245"></a>
-<span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>            Set&lt;String&gt; filterProps = new HashSet&lt;&gt;();  // Names of properties defined in @Bean(properties)<a name="line.247"></a>
+<span class="sourceLineNo">242</span>            setAccessible(constructor, false);<a name="line.242"></a>
+<span class="sourceLineNo">243</span><a name="line.243"></a>
+<span class="sourceLineNo">244</span>            // Explicitly defined property names in @Bean annotation.<a name="line.244"></a>
+<span class="sourceLineNo">245</span>            Set&lt;String&gt; fixedBeanProps = new LinkedHashSet&lt;&gt;();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            String[] includeProperties = ctx.getIncludeProperties(c);<a name="line.246"></a>
+<span class="sourceLineNo">247</span>            String[] excludeProperties = ctx.getExcludeProperties(c);<a name="line.247"></a>
 <span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>            if (beanFilter != null) {<a name="line.249"></a>
+<span class="sourceLineNo">249</span>            Set&lt;String&gt; filterProps = new HashSet&lt;&gt;();  // Names of properties defined in @Bean(properties)<a name="line.249"></a>
 <span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>               if (beanFilter.getProperties() != null)<a name="line.251"></a>
-<span class="sourceLineNo">252</span>                  filterProps.addAll(Arrays.asList(beanFilter.getProperties()));<a name="line.252"></a>
-<span class="sourceLineNo">253</span><a name="line.253"></a>
-<span class="sourceLineNo">254</span>               // Get the 'properties' attribute if specified.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>               if (beanFilter.getProperties() != null &amp;&amp; includeProperties == null)<a name="line.255"></a>
-<span class="sourceLineNo">256</span>                  for (String p : beanFilter.getProperties())<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                     fixedBeanProps.add(p);<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>               if (beanFilter.getPropertyNamer() != null)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>                  propertyNamer = beanFilter.getPropertyNamer();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>            }<a name="line.261"></a>
-<span class="sourceLineNo">262</span><a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (includeProperties != null)<a name="line.263"></a>
-<span class="sourceLineNo">264</span>               fixedBeanProps.addAll(Arrays.asList(includeProperties));<a name="line.264"></a>
-<span class="sourceLineNo">265</span><a name="line.265"></a>
-<span class="sourceLineNo">266</span>            if (propertyNamer == null)<a name="line.266"></a>
-<span class="sourceLineNo">267</span>               propertyNamer = ctx.getPropertyNamer();<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>            // First populate the properties with those specified in the bean annotation to<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            // ensure that ordering first.<a name="line.270"></a>
-<span class="sourceLineNo">271</span>            for (String name : fixedBeanProps)<a name="line.271"></a>
-<span class="sourceLineNo">272</span>               normalProps.put(name, BeanPropertyMeta.builder(beanMeta, name));<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>            if (ctx.isUseJavaBeanIntrospector()) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>               BeanInfo bi = null;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>               if (! c2.isInterface())<a name="line.276"></a>
-<span class="sourceLineNo">277</span>                  bi = Introspector.getBeanInfo(c2, stopClass);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>               else<a name="line.278"></a>
-<span class="sourceLineNo">279</span>                  bi = Introspector.getBeanInfo(c2, null);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>               if (bi != null) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>                  for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>                     String name = pd.getName();<a name="line.282"></a>
-<span class="sourceLineNo">283</span>                     if (! normalProps.containsKey(name))<a name="line.283"></a>
-<span class="sourceLineNo">284</span>                        normalProps.put(name, BeanPropertyMeta.builder(beanMeta, name));<a name="line.284"></a>
-<span class="sourceLineNo">285</span>                     normalProps.get(name).setGetter(pd.getReadMethod()).setSetter(pd.getWriteMethod());<a name="line.285"></a>
-<span class="sourceLineNo">286</span>                  }<a name="line.286"></a>
-<span class="sourceLineNo">287</span>               }<a name="line.287"></a>
-<span class="sourceLineNo">288</span><a name="line.288"></a>
-<span class="sourceLineNo">289</span>            } else /* Use 'better' introspection */ {<a name="line.289"></a>
+<span class="sourceLineNo">251</span>            if (beanFilter != null) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>               if (beanFilter.getProperties() != null)<a name="line.253"></a>
+<span class="sourceLineNo">254</span>                  filterProps.addAll(Arrays.asList(beanFilter.getProperties()));<a name="line.254"></a>
+<span class="sourceLineNo">255</span><a name="line.255"></a>
+<span class="sourceLineNo">256</span>               // Get the 'properties' attribute if specified.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>               if (beanFilter.getProperties() != null &amp;&amp; includeProperties == null)<a name="line.257"></a>
+<span class="sourceLineNo">258</span>                  for (String p : beanFilter.getProperties())<a name="line.258"></a>
+<span class="sourceLineNo">259</span>                     fixedBeanProps.add(p);<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>               if (beanFilter.getPropertyNamer() != null)<a name="line.261"></a>
+<span class="sourceLineNo">262</span>                  propertyNamer = beanFilter.getPropertyNamer();<a name="line.262"></a>
+<span class="sourceLineNo">263</span>            }<a name="line.263"></a>
+<span class="sourceLineNo">264</span><a name="line.264"></a>
+<span class="sourceLineNo">265</span>            if (includeProperties != null)<a name="line.265"></a>
+<span class="sourceLineNo">266</span>               fixedBeanProps.addAll(Arrays.asList(includeProperties));<a name="line.266"></a>
+<span class="sourceLineNo">267</span><a name="line.267"></a>
+<span class="sourceLineNo">268</span>            if (propertyNamer == null)<a name="line.268"></a>
+<span class="sourceLineNo">269</span>               propertyNamer = ctx.getPropertyNamer();<a name="line.269"></a>
+<span class="sourceLineNo">270</span><a name="line.270"></a>
+<span class="sourceLineNo">271</span>            // First populate the properties with those specified in the bean annotation to<a name="line.271"></a>
+<span class="sourceLineNo">272</span>            // ensure that ordering first.<a name="line.272"></a>
+<span class="sourceLineNo">273</span>            for (String name : fixedBeanProps)<a name="line.273"></a>
+<span class="sourceLineNo">274</span>               normalProps.put(name, BeanPropertyMeta.builder(beanMeta, name));<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>            if (ctx.isUseJavaBeanIntrospector()) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>               BeanInfo bi = null;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>               if (! c2.isInterface())<a name="line.278"></a>
+<span class="sourceLineNo">279</span>                  bi = Introspector.getBeanInfo(c2, stopClass);<a name="line.279"></a>
+<span class="sourceLineNo">280</span>               else<a name="line.280"></a>
+<span class="sourceLineNo">281</span>                  bi = Introspector.getBeanInfo(c2, null);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>               if (bi != null) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>                  for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>                     String name = pd.getName();<a name="line.284"></a>
+<span class="sourceLineNo">285</span>                     if (! normalProps.containsKey(name))<a name="line.285"></a>
+<span class="sourceLineNo">286</span>                        normalProps.put(name, BeanPropertyMeta.builder(beanMeta, name));<a name="line.286"></a>
+<span class="sourceLineNo">287</span>                     normalProps.get(name).setGetter(pd.getReadMethod()).setSetter(pd.getWriteMethod());<a name="line.287"></a>
+<span class="sourceLineNo">288</span>                  }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>               }<a name="line.289"></a>
 <span class="sourceLineNo">290</span><a name="line.290"></a>
-<span class="sourceLineNo">291</span>               for (Field f : findBeanFields(c2, stopClass, fVis, filterProps)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>                  String name = findPropertyName(f, fixedBeanProps);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>                  if (name != null) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                     if (! normalProps.containsKey(name))<a name="line.294"></a>
-<span class="sourceLineNo">295</span>                        normalProps.put(name, BeanPropertyMeta.builder(beanMeta, name));<a name="line.295"></a>
-<span class="sourceLineNo">296</span>                     normalProps.get(name).setField(f);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>                  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>               }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>               List&lt;BeanMethod&gt; bms = findBeanMethods(c2, stopClass, mVis, fixedBeanProps, filterProps, propertyNamer, fluentSetters);<a name="line.300"></a>
+<span class="sourceLineNo">291</span>            } else /* Use 'better' introspection */ {<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>               for (Field f : findBeanFields(c2, stopClass, fVis, filterProps)) {<a name="line.293"></a>
+<span class="sourceLineNo">294</span>                  String name = findPropertyName(f, fixedBeanProps);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>                  if (name != null) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>                     if (! normalProps.containsKey(name))<a name="line.296"></a>
+<span class="sourceLineNo">297</span>                        normalProps.put(name, BeanPropertyMeta.builder(beanMeta, name));<a name="line.297"></a>
+<span class="sourceLineNo">298</span>                     normalProps.get(name).setField(f);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>                  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span>               }<a name="line.300"></a>
 <span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>               // Iterate through all the getters.<a name="line.302"></a>
-<span class="sourceLineNo">303</span>               for (BeanMethod bm : bms) {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>                  String pn = bm.propertyName;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>                  Method m = bm.method;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>                  if (! normalProps.containsKey(pn))<a name="line.306"></a>
-<span class="sourceLineNo">307</span>                     normalProps.put(pn, new BeanPropertyMeta.Builder(beanMeta, pn));<a name="line.307"></a>
-<span class="sourceLineNo">308</span>                  BeanPropertyMeta.Builder bpm = normalProps.get(pn);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>                  if (bm.methodType == GETTER) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>                     // Two getters.  Pick the best.<a name="line.310"></a>
-<span class="sourceLineNo">311</span>                     if (bpm.getter != null) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>                        if (m.getAnnotation(BeanProperty.class) == null &amp;&amp; bpm.getter.getAnnotation(BeanProperty.class) != null)<a name="line.313"></a>
-<span class="sourceLineNo">314</span>                           m = bpm.getter;  // @BeanProperty annotated method takes precedence.<a name="line.314"></a>
-<span class="sourceLineNo">315</span><a name="line.315"></a>
-<span class="sourceLineNo">316</span>                        else if (m.getName().startsWith("is") &amp;&amp; bpm.getter.getName().startsWith("get"))<a name="line.316"></a>
-<span class="sourceLineNo">317</span>                           m = bpm.getter;  // getX() overrides isX().<a name="line.317"></a>
-<span class="sourceLineNo">318</span>                     }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>                     bpm.setGetter(m);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>                  }<a name="line.320"></a>
-<span class="sourceLineNo">321</span>               }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>               // Now iterate through all the setters.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>               for (BeanMethod bm : bms) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                  if (bm.methodType == SETTER) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>                     BeanPropertyMeta.Builder bpm = normalProps.get(bm.propertyName);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>                     if (bm.matchesPropertyType(bpm))<a name="line.327"></a>
-<span class="sourceLineNo">328</span>                        bpm.setSetter(bm.method);<a name="line.328"></a>
-<span class="sourceLineNo">329</span>                  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span>               }<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>               // Now iterate through all the extraKeys.<a name="line.332"></a>
-<span class="sourceLineNo">333</span>               for (BeanMethod bm : bms) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>                  if (bm.methodType == EXTRAKEYS) {<a name="line.334"></a>
-<span class="sourceLineNo">335</span>                     BeanPropertyMeta.Builder bpm = normalProps.get(bm.propertyName);<a name="line.335"></a>
-<span class="sourceLineNo">336</span>                     bpm.setExtraKeys(bm.method);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>                  }<a name="line.337"></a>
-<span class="sourceLineNo">338</span>               }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>            typeVarImpls = new HashMap&lt;&gt;();<a name="line.341"></a>
-<span class="sourceLineNo">342</span>            findTypeVarImpls(c, typeVarImpls);<a name="line.342"></a>
-<span class="sourceLineNo">343</span>            if (typeVarImpls.isEmpty())<a name="line.343"></a>
-<span class="sourceLineNo">344</span>               typeVarImpls = null;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>            // Eliminate invalid properties, and set the contents of getterProps and setterProps.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            for (Iterator&lt;BeanPropertyMeta.Builder&gt; i = normalProps.values().iterator(); i.hasNext();) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>               BeanPropertyMeta.Builder p = i.next();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>               try {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>                  if (p.field == null)<a name="line.350"></a>
-<span class="sourceLineNo">351</span>                     p.setInnerField(findInnerBeanField(c, stopClass, p.name));<a name="line.351"></a>
-<span class="sourceLineNo">352</span><a name="line.352"></a>
-<span class="sourceLineNo">353</span>                  if (p.validate(ctx, beanRegistry, typeVarImpls)) {<a name="line.353"></a>
+<span class="sourceLineNo">302</span>               List&lt;BeanMethod&gt; bms = findBeanMethods(c2, stopClass, mVis, fixedBeanProps, filterProps, propertyNamer, fluentSetters);<a name="line.302"></a>
+<span class="sourceLineNo">303</span><a name="line.303"></a>
+<span class="sourceLineNo">304</span>               // Iterate through all the getters.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>               for (BeanMethod bm : bms) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>                  String pn = bm.propertyName;<a name="line.306"></a>
+<span class="sourceLineNo">307</span>                  Method m = bm.method;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>                  if (! normalProps.containsKey(pn))<a name="line.308"></a>
+<span class="sourceLineNo">309</span>                     normalProps.put(pn, new BeanPropertyMeta.Builder(beanMeta, pn));<a name="line.309"></a>
+<span class="sourceLineNo">310</span>                  BeanPropertyMeta.Builder bpm = normalProps.get(pn);<a name="line.310"></a>
+<span class="sourceLineNo">311</span>                  if (bm.methodType == GETTER) {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>                     // Two getters.  Pick the best.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>                     if (bpm.getter != null) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>                        if (m.getAnnotation(BeanProperty.class) == null &amp;&amp; bpm.getter.getAnnotation(BeanProperty.class) != null)<a name="line.315"></a>
+<span class="sourceLineNo">316</span>                           m = bpm.getter;  // @BeanProperty annotated method takes precedence.<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>                        else if (m.getName().startsWith("is") &amp;&amp; bpm.getter.getName().startsWith("get"))<a name="line.318"></a>
+<span class="sourceLineNo">319</span>                           m = bpm.getter;  // getX() overrides isX().<a name="line.319"></a>
+<span class="sourceLineNo">320</span>                     }<a name="line.320"></a>
+<span class="sourceLineNo">321</span>                     bpm.setGetter(m);<a name="line.321"></a>
+<span class="sourceLineNo">322</span>                  }<a name="line.322"></a>
+<span class="sourceLineNo">323</span>               }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>               // Now iterate through all the setters.<a name="line.325"></a>
+<span class="sourceLineNo">326</span>               for (BeanMethod bm : bms) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>                  if (bm.methodType == SETTER) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>                     BeanPropertyMeta.Builder bpm = normalProps.get(bm.propertyName);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>                     if (bm.matchesPropertyType(bpm))<a name="line.329"></a>
+<span class="sourceLineNo">330</span>                        bpm.setSetter(bm.method);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>                  }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>               }<a name="line.332"></a>
+<span class="sourceLineNo">333</span><a name="line.333"></a>
+<span class="sourceLineNo">334</span>               // Now iterate through all the extraKeys.<a name="line.334"></a>
+<span class="sourceLineNo">335</span>               for (BeanMethod bm : bms) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>                  if (bm.methodType == EXTRAKEYS) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>                     BeanPropertyMeta.Builder bpm = normalProps.get(bm.propertyName);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>                     bpm.setExtraKeys(bm.method);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>                  }<a name="line.339"></a>
+<span class="sourceLineNo">340</span>               }<a name="line.340"></a>
+<span class="sourceLineNo">341</span>            }<a name="line.341"></a>
+<span class="sourceLineNo">342</span><a name="line.342"></a>
+<span class="sourceLineNo">343</span>            typeVarImpls = new HashMap&lt;&gt;();<a name="line.343"></a>
+<span class="sourceLineNo">344</span>            findTypeVarImpls(c, typeVarImpls);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            if (typeVarImpls.isEmpty())<a name="line.345"></a>
+<span class="sourceLineNo">346</span>               typeVarImpls = null;<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>            // Eliminate invalid properties, and set the contents of getterProps and setterProps.<a name="line.348"></a>
+<span class="sourceLineNo">349</span>            for (Iterator&lt;BeanPropertyMeta.Builder&gt; i = normalProps.values().iterator(); i.hasNext();) {<a name="line.349"></a>
+<span class="sourceLineNo">350</span>               BeanPropertyMeta.Builder p = i.next();<a name="line.350"></a>
+<span class="sourceLineNo">351</span>               try {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                  if (p.field == null)<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                     p.setInnerField(findInnerBeanField(c, stopClass, p.name));<a name="line.353"></a>
 <span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>                     if (p.getter != null)<a name="line.355"></a>
-<span class="sourceLineNo">356</span>                        getterProps.put(p.getter, p.name);<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>                     if (p.setter != null)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                        setterProps.put(p.setter, p.name);<a name="line.359"></a>
-<span class="sourceLineNo">360</span><a name="line.360"></a>
-<span class="sourceLineNo">361</span>                  } else {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>                     i.remove();<a name="line.362"></a>
-<span class="sourceLineNo">363</span>                  }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>               } catch (ClassNotFoundException e) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>                  throw new BeanRuntimeException(c, e.getLocalizedMessage());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>               }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>            }<a name="line.367"></a>
-<span class="sourceLineNo">368</span><a name="line.368"></a>
-<span class="sourceLineNo">369</span>            // Check for missing properties.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>            for (String fp : fixedBeanProps)<a name="line.370"></a>
-<span class="sourceLineNo">371</span>               if (! normalProps.containsKey(fp))<a name="line.371"></a>
-<span class="sourceLineNo">372</span>                  throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @Bean(properties=X) annotation but was not found on the class definition.", fp);<a name="line.372"></a>
-<span class="sourceLineNo">373</span><a name="line.373"></a>
-<span class="sourceLineNo">374</span>            // Mark constructor arg properties.<a name="line.374"></a>
-<span class="sourceLineNo">375</span>            for (String fp : constructorArgs) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>               BeanPropertyMeta.Builder m = normalProps.get(fp);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>               if (m == null)<a name="line.377"></a>
-<span class="sourceLineNo">378</span>                  throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @BeanConstructor(properties=X) annotation but was not found on the class definition.", fp);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>               m.setAsConstructorArg();<a name="line.379"></a>
-<span class="sourceLineNo">380</span>            }<a name="line.380"></a>
-<span class="sourceLineNo">381</span><a name="line.381"></a>
-<span class="sourceLineNo">382</span>            // Make sure at least one property was found.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>            if (beanFilter == null &amp;&amp; ctx.isBeansRequireSomeProperties() &amp;&amp; normalProps.size() == 0)<a name="line.383"></a>
-<span class="sourceLineNo">384</span>               return "No properties detected on bean class";<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>            sortProperties = (ctx.isSortProperties() || (beanFilter != null &amp;&amp; beanFilter.isSortProperties())) &amp;&amp; fixedBeanProps.isEmpty();<a name="line.386"></a>
+<span class="sourceLineNo">355</span>                  if (p.validate(ctx, beanRegistry, typeVarImpls)) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span><a name="line.356"></a>
+<span class="sourceLineNo">357</span>                     if (p.getter != null)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>                        getterProps.put(p.getter, p.name);<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>                     if (p.setter != null)<a name="line.360"></a>
+<span class="sourceLineNo">361</span>                        setterProps.put(p.setter, p.name);<a name="line.361"></a>
+<span class="sourceLineNo">362</span><a name="line.362"></a>
+<span class="sourceLineNo">363</span>                  } else {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>                     i.remove();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>                  }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>               } catch (ClassNotFoundException e) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>                  throw new BeanRuntimeException(c, e.getLocalizedMessage());<a name="line.367"></a>
+<span class="sourceLineNo">368</span>               }<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            }<a name="line.369"></a>
+<span class="sourceLineNo">370</span><a name="line.370"></a>
+<span class="sourceLineNo">371</span>            // Check for missing properties.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>            for (String fp : fixedBeanProps)<a name="line.372"></a>
+<span class="sourceLineNo">373</span>               if (! normalProps.containsKey(fp))<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                  throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @Bean(properties=X) annotation but was not found on the class definition.", fp);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>            // Mark constructor arg properties.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>            for (String fp : constructorArgs) {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>               BeanPropertyMeta.Builder m = normalProps.get(fp);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>               if (m == null)<a name="line.379"></a>
+<span class="sourceLineNo">380</span>                  throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @BeanConstructor(properties=X) annotation but was not found on the class definition.", fp);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>               m.setAsConstructorArg();<a name="line.381"></a>
+<span class="sourceLineNo">382</span>            }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>            // Make sure at least one property was found.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>            if (beanFilter == null &amp;&amp; ctx.isBeansRequireSomeProperties() &amp;&amp; normalProps.size() == 0)<a name="line.385"></a>
+<span class="sourceLineNo">386</span>               return "No properties detected on bean class";<a name="line.386"></a>
 <span class="sourceLineNo">387</span><a name="line.387"></a>
-<span class="sourceLineNo">388</span>            if (sortProperties)<a name="line.388"></a>
-<span class="sourceLineNo">389</span>               properties = new TreeMap&lt;&gt;();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>            else<a name="line.390"></a>
-<span class="sourceLineNo">391</span>               properties = new LinkedHashMap&lt;&gt;();<a name="line.391"></a>
-<span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>            if (beanFilter != null &amp;&amp; beanFilter.getTypeName() != null)<a name="line.393"></a>
-<span class="sourceLineNo">394</span>               dictionaryName = beanFilter.getTypeName();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>            if (dictionaryName == null)<a name="line.395"></a>
-<span class="sourceLineNo">396</span>               dictionaryName = findDictionaryName(this.classMeta);<a name="line.396"></a>
-<span class="sourceLineNo">397</span><a name="line.397"></a>
-<span class="sourceLineNo">398</span>            for (Map.Entry&lt;String,BeanPropertyMeta.Builder&gt; e : normalProps.entrySet()) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>               BeanPropertyMeta pMeta = e.getValue().build();<a name="line.399"></a>
-<span class="sourceLineNo">400</span>               if (pMeta.isDyna())<a name="line.400"></a>
-<span class="sourceLineNo">401</span>                  dynaProperty = pMeta;<a name="line.401"></a>
-<span class="sourceLineNo">402</span>               properties.put(e.getKey(), pMeta);<a name="line.402"></a>
-<span class="sourceLineNo">403</span>            }<a name="line.403"></a>
-<span class="sourceLineNo">404</span><a name="line.404"></a>
-<span class="sourceLineNo">405</span>            // If a beanFilter is defined, look for inclusion and exclusion lists.<a name="line.405"></a>
-<span class="sourceLineNo">406</span>            if (beanFilter != null) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>               // Eliminated excluded properties if BeanFilter.excludeKeys is specified.<a name="line.408"></a>
-<span class="sourceLineNo">409</span>               String[] includeKeys = beanFilter.getProperties();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>               String[] excludeKeys = beanFilter.getExcludeProperties();<a name="line.410"></a>
-<span class="sourceLineNo">411</span>               if (excludeKeys != null &amp;&amp; excludeProperties == null) {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>                  for (String k : excludeKeys)<a name="line.412"></a>
-<span class="sourceLineNo">413</span>                     properties.remove(k);<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>               // Only include specified properties if BeanFilter.includeKeys is specified.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>               // Note that the order must match includeKeys.<a name="line.416"></a>
-<span class="sourceLineNo">417</span>               } else if (includeKeys != null) {<a name="line.417"></a>
-<span class="sourceLineNo">418</span>                  Map&lt;String,BeanPropertyMeta&gt; properties2 = new LinkedHashMap&lt;&gt;();<a name="line.418"></a>
-<span class="sourceLineNo">419</span>                  for (String k : includeKeys) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>                     if (properties.containsKey(k))<a name="line.420"></a>
-<span class="sourceLineNo">421</span>                        properties2.put(k, properties.get(k));<a name="line.421"></a>
-<span class="sourceLineNo">422</span>                  }<a name="line.422"></a>
-<span class="sourceLineNo">423</span>                  properties = properties2;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>               }<a name="line.424"></a>
-<span class="sourceLineNo">425</span>            }<a name="line.425"></a>
-<span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>            if (excludeProperties != null)<a name="line.427"></a>
-<span class="sourceLineNo">428</span>               for (String ep : excludeProperties)<a name="line.428"></a>
-<span class="sourceLineNo">429</span>                  properties.remove(ep);<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>            if (pNames != null) {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>               Map&lt;String,BeanPropertyMeta&gt; properties2 = new LinkedHashMap&lt;&gt;();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>               for (String k : pNames) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>                  if (properties.containsKey(k))<a name="line.434"></a>
-<span class="sourceLineNo">435</span>                     properties2.put(k, properties.get(k));<a name="line.435"></a>
-<span class="sourceLineNo">436</span>               }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>               properties = properties2;<a name="line.437"></a>
-<span class="sourceLineNo">438</span>            }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>         } catch (BeanRuntimeException e) {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            throw e;<a name="line.441"></a>
-<span class="sourceLineNo">442</span>         } catch (Exception e) {<a name="line.442"></a>
-<span class="sourceLineNo">443</span>            return "Exception:  " + getStackTrace(e);<a name="line.443"></a>
-<span class="sourceLineNo">444</span>         }<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>         return null;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      }<a name="line.447"></a>
-<span class="sourceLineNo">448</span><a name="line.448"></a>
-<span class="sourceLineNo">449</span>      private String findDictionaryName(ClassMeta&lt;?&gt; cm) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>         BeanRegistry br = cm.getBeanRegistry();<a name="line.450"></a>
-<span class="sourceLineNo">451</span>         if (br != null) {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>            String s = br.getTypeName(this.classMeta);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            if (s != null)<a name="line.453"></a>
-<span class="sourceLineNo">454</span>               return s;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>         }<a name="line.455"></a>
-<span class="sourceLineNo">456</span>         Class&lt;?&gt; pcm = cm.innerClass.getSuperclass();<a name="line.456"></a>
-<span class="sourceLineNo">457</span>         if (pcm != null) {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            String s = findDictionaryName(ctx.getClassMeta(pcm));<a name="line.458"></a>
-<span class="sourceLineNo">459</span>            if (s != null)<a name="line.459"></a>
-<span class="sourceLineNo">460</span>               return s;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>         }<a name="line.461"></a>
-<span class="sourceLineNo">462</span>         for (Class&lt;?&gt; icm : cm.innerClass.getInterfaces()) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>            String s = findDictionaryName(ctx.getClassMeta(icm));<a name="line.463"></a>
-<span class="sourceLineNo">464</span>            if (s != null)<a name="line.464"></a>
-<span class="sourceLineNo">465</span>               return s;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>         }<a name="line.466"></a>
-<span class="sourceLineNo">467</span>         return null;<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      }<a name="line.468"></a>
-<span class="sourceLineNo">469</span><a name="line.469"></a>
-<span class="sourceLineNo">470</span>      /*<a name="line.470"></a>
-<span class="sourceLineNo">471</span>       * Returns the property name of the specified field if it's a valid property.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>       * Returns null if the field isn't a valid property.<a name="line.472"></a>
-<span class="sourceLineNo">473</span>       */<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      private String findPropertyName(Field f, Set&lt;String&gt; fixedBeanProps) {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>         BeanProperty bp = f.getAnnotation(BeanProperty.class);<a name="line.475"></a>
-<span class="sourceLineNo">476</span>         String name = bpName(bp);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>         if (isNotEmpty(name)) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>            if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name))<a name="line.478"></a>
-<span class="sourceLineNo">479</span>               return name;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>            return null;  // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties.<a name="line.480"></a>
-<span class="sourceLineNo">481</span>         }<a name="line.481"></a>
-<span class="sourceLineNo">482</span>         name = propertyNamer.getPropertyName(f.getName());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>         if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name))<a name="line.483"></a>
-<span class="sourceLineNo">484</span>            return name;<a name="line.484"></a>
-<span class="sourceLineNo">485</span>         return null;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      }<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   }<a name="line.487"></a>
-<span class="sourceLineNo">488</span><a name="line.488"></a>
-<span class="sourceLineNo">489</span>   /**<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    * Returns the {@link ClassMeta} of this bean.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    *<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    * @return The {@link ClassMeta} of this bean.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    */<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   @BeanIgnore<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   public final ClassMeta&lt;T&gt; getClassMeta() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      return classMeta;<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   }<a name="line.497"></a>
-<span class="sourceLineNo">498</span><a name="line.498"></a>
-<span class="sourceLineNo">499</span>   /**<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    * Returns the dictionary name for this bean as defined through the {@link Bean#typeName() @Bean(typeName)} annotation.<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    *<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    * @return The dictionary name for this bean, or &lt;jk&gt;null&lt;/jk&gt; if it has no dictionary name defined.<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    */<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   public final String getDictionaryName() {<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return dictionaryName;<a name="line.505"></a>
-<span class="sourceLineNo">506</span>   }<a name="line.506"></a>
-<span class="sourceLineNo">507</span><a name="line.507"></a>
-<span class="sourceLineNo">508</span>   /**<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    * Returns a mock bean property that resolves to the name &lt;js&gt;"_type"&lt;/js&gt; and whose value always resolves to the<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    * dictionary name of the bean.<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    *<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    * @return The type name property.<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    */<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   public final BeanPropertyMeta getTypeProperty() {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      return typeProperty;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   }<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>   /**<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    * Possible property method types.<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    */<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   static enum MethodType {<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      UNKNOWN,<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      GETTER,<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      SETTER,<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      EXTRAKEYS;<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   }<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>   /*<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    * Temporary getter/setter method struct.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    */<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   private static final class BeanMethod {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      String propertyName;<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      MethodType methodType;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      Method method;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      Class&lt;?&gt; type;<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>      BeanMethod(String propertyName, MethodType type, Method method) {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>         this.propertyName = propertyName;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>         this.methodType = type;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>         this.method = method;<a name="line.540"></a>
-<span class="sourceLineNo">541</span>         if (type == MethodType.SETTER)<a name="line.541"></a>
-<span class="sourceLineNo">542</span>            this.type = method.getParameterTypes()[0];<a name="line.542"></a>
-<span class="sourceLineNo">543</span>         else<a name="line.543"></a>
-<span class="sourceLineNo">544</span>            this.type = method.getReturnType();<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>      /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>       * Returns true if this method matches the class type of the specified property.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>       * Only meant to be used for setters.<a name="line.549"></a>
-<span class="sourceLineNo">550</span>       */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      boolean matchesPropertyType(BeanPropertyMeta.Builder b) {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>         if (b == null)<a name="line.552"></a>
-<span class="sourceLineNo">553</span>            return false;<a name="line.553"></a>
-<span class="sourceLineNo">554</span><a name="line.554"></a>
-<span class="sourceLineNo">555</span>         // Don't do further validation if this is the "*" bean property.<a name="line.555"></a>
-<span class="sourceLineNo">556</span>         if ("*".equals(b.name))<a name="line.556"></a>
-<span class="sourceLineNo">557</span>            return true;<a name="line.557"></a>
-<span class="sourceLineNo">558</span><a name="line.558"></a>
-<span class="sourceLineNo">559</span>         // Get the bean property type from the getter/field.<a name="line.559"></a>
-<span class="sourceLineNo">560</span>         Class&lt;?&gt; pt = null;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>         if (b.getter != null)<a name="line.561"></a>
-<span class="sourceLineNo">562</span>            pt = b.getter.getReturnType();<a name="line.562"></a>
-<span class="sourceLineNo">563</span>         else if (b.field != null)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>            pt = b.field.getType();<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>         // Matches if only a setter is defined.<a name="line.566"></a>
-<span class="sourceLineNo">567</span>         if (pt == null)<a name="line.567"></a>
-<span class="sourceLineNo">568</span>            return true;<a name="line.568"></a>
-<span class="sourceLineNo">569</span><a name="line.569"></a>
-<span class="sourceLineNo">570</span>         // Doesn't match if not same type or super type as getter/field.<a name="line.570"></a>
-<span class="sourceLineNo">571</span>         if (! isParentClass(type, pt))<a name="line.571"></a>
-<span class="sourceLineNo">572</span>            return false;<a name="line.572"></a>
-<span class="sourceLineNo">573</span><a name="line.573"></a>
-<span class="sourceLineNo">574</span>         // If a setter was previously set, only use this setter if it's a closer<a name="line.574"></a>
-<span class="sourceLineNo">575</span>         // match (e.g. prev type is a superclass of this type).<a name="line.575"></a>
-<span class="sourceLineNo">576</span>         if (b.setter == null)<a name="line.576"></a>
-<span class="sourceLineNo">577</span>            return true;<a name="line.577"></a>
-<span class="sourceLineNo">578</span><a name="line.578"></a>
-<span class="sourceLineNo">579</span>         Class&lt;?&gt; prevType = b.setter.getParameterTypes()[0];<a name="line.579"></a>
-<span class="sourceLineNo">580</span>         return isParentClass(prevType, type, true);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      }<a name="line.581"></a>
-<span class="sourceLineNo">582</span><a name="line.582"></a>
-<span class="sourceLineNo">583</span>      @Override /* Object */<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      public String toString() {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>         return method.toString();<a name="line.585"></a>
-<span class="sourceLineNo">586</span>      }<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   }<a name="line.587"></a>
-<span class="sourceLineNo">588</span><a name="line.588"></a>
-<span class="sourceLineNo">589</span>   /*<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    * Find all the bean methods on this class.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    *<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    * @param c The transformed class.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    * @param stopClass Don't look above this class in the hierarchy.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    * @param v The minimum method visibility.<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    * @param fixedBeanProps Only include methods whose properties are in this list.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    * @param pn Use this property namer to determine property names from the method names.<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    */<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   static final List&lt;BeanMethod&gt; findBeanMethods(Class&lt;?&gt; c, Class&lt;?&gt; stopClass, Visibility v, Set&lt;String&gt; fixedBeanProps, Set&lt;String&gt; filterProps, PropertyNamer pn, boolean fluentSetters) {<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      List&lt;BeanMethod&gt; l = new LinkedList&lt;&gt;();<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      for (Class&lt;?&gt; c2 : findClasses(c, stopClass)) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>         for (Method m : c2.getDeclaredMethods()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>            if (isStatic(m))<a name="line.603"></a>
-<span class="sourceLineNo">604</span>               continue;<a name="line.604"></a>
-<span class="sourceLineNo">605</span>            if (m.isBridge())   // This eliminates methods with covariant return types from parent classes on child classes.<a name="line.605"></a>
+<span class="sourceLineNo">388</span>            sortProperties = (ctx.isSortProperties() || (beanFilter != null &amp;&amp; beanFilter.isSortProperties())) &amp;&amp; fixedBeanProps.isEmpty();<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>            if (sortProperties)<a name="line.390"></a>
+<span class="sourceLineNo">391</span>               properties = new TreeMap&lt;&gt;();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            else<a name="line.392"></a>
+<span class="sourceLineNo">393</span>               properties = new LinkedHashMap&lt;&gt;();<a name="line.393"></a>
+<span class="sourceLineNo">394</span><a name="line.394"></a>
+<span class="sourceLineNo">395</span>            if (beanFilter != null &amp;&amp; beanFilter.getTypeName() != null)<a name="line.395"></a>
+<span class="sourceLineNo">396</span>               dictionaryName = beanFilter.getTypeName();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>            if (dictionaryName == null)<a name="line.397"></a>
+<span class="sourceLineNo">398</span>               dictionaryName = findDictionaryName(this.classMeta);<a name="line.398"></a>
+<span class="sourceLineNo">399</span><a name="line.399"></a>
+<span class="sourceLineNo">400</span>            for (Map.Entry&lt;String,BeanPropertyMeta.Builder&gt; e : normalProps.entrySet()) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>               BeanPropertyMeta pMeta = e.getValue().build();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>               if (pMeta.isDyna())<a name="line.402"></a>
+<span class="sourceLineNo">403</span>                  dynaProperty = pMeta;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>               properties.put(e.getKey(), pMeta);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>            }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>            // If a beanFilter is defined, look for inclusion and exclusion lists.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>            if (beanFilter != null) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>               // Eliminated excluded properties if BeanFilter.excludeKeys is specified.<a name="line.410"></a>
+<span class="sourceLineNo">411</span>               String[] includeKeys = beanFilter.getProperties();<a name="line.411"></a>
+<span class="sourceLineNo">412</span>               String[] excludeKeys = beanFilter.getExcludeProperties();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>               if (excludeKeys != null &amp;&amp; excludeProperties == null) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>                  for (String k : excludeKeys)<a name="line.414"></a>
+<span class="sourceLineNo">415</span>                     properties.remove(k);<a name="line.415"></a>
+<span class="sourceLineNo">416</span><a name="line.416"></a>
+<span class="sourceLineNo">417</span>               // Only include specified properties if BeanFilter.includeKeys is specified.<a name="line.417"></a>
+<span class="sourceLineNo">418</span>               // Note that the order must match includeKeys.<a name="line.418"></a>
+<span class="sourceLineNo">419</span>               } else if (includeKeys != null) {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>                  Map&lt;String,BeanPropertyMeta&gt; properties2 = new LinkedHashMap&lt;&gt;();<a name="line.420"></a>
+<span class="sourceLineNo">421</span>                  for (String k : includeKeys) {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>                     if (properties.containsKey(k))<a name="line.422"></a>
+<span class="sourceLineNo">423</span>                        properties2.put(k, properties.get(k));<a name="line.423"></a>
+<span class="sourceLineNo">424</span>                  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span>                  properties = properties2;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>               }<a name="line.426"></a>
+<span class="sourceLineNo">427</span>            }<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>            if (excludeProperties != null)<a name="line.429"></a>
+<span class="sourceLineNo">430</span>               for (String ep : excludeProperties)<a name="line.430"></a>
+<span class="sourceLineNo">431</span>                  properties.remove(ep);<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>            if (pNames != null) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>               Map&lt;String,BeanPropertyMeta&gt; properties2 = new LinkedHashMap&lt;&gt;();<a name="line.434"></a>
+<span class="sourceLineNo">435</span>               for (String k : pNames) {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>                  if (properties.containsKey(k))<a name="line.436"></a>
+<span class="sourceLineNo">437</span>                     properties2.put(k, properties.get(k));<a name="line.437"></a>
+<span class="sourceLineNo">438</span>               }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>               properties = properties2;<a name="line.439"></a>
+<span class="sourceLineNo">440</span>            }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>         } catch (BeanRuntimeException e) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>            throw e;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>         } catch (Exception e) {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>            return "Exception:  " + getStackTrace(e);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>         }<a name="line.446"></a>
+<span class="sourceLineNo">447</span><a name="line.447"></a>
+<span class="sourceLineNo">448</span>         return null;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      }<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>      private String findDictionaryName(ClassMeta&lt;?&gt; cm) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>         BeanRegistry br = cm.getBeanRegistry();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>         if (br != null) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>            String s = br.getTypeName(this.classMeta);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>            if (s != null)<a name="line.455"></a>
+<span class="sourceLineNo">456</span>               return s;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>         }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>         Class&lt;?&gt; pcm = cm.innerClass.getSuperclass();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>         if (pcm != null) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            String s = findDictionaryName(ctx.getClassMeta(pcm));<a name="line.460"></a>
+<span class="sourceLineNo">461</span>            if (s != null)<a name="line.461"></a>
+<span class="sourceLineNo">462</span>               return s;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>         }<a name="line.463"></a>
+<span class="sourceLineNo">464</span>         for (Class&lt;?&gt; icm : cm.innerClass.getInterfaces()) {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            String s = findDictionaryName(ctx.getClassMeta(icm));<a name="line.465"></a>
+<span class="sourceLineNo">466</span>            if (s != null)<a name="line.466"></a>
+<span class="sourceLineNo">467</span>               return s;<a name="line.467"></a>
+<span class="sourceLineNo">468</span>         }<a name="line.468"></a>
+<span class="sourceLineNo">469</span>         return null;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>      /*<a name="line.472"></a>
+<span class="sourceLineNo">473</span>       * Returns the property name of the specified field if it's a valid property.<a name="line.473"></a>
+<span class="sourceLineNo">474</span>       * Returns null if the field isn't a valid property.<a name="line.474"></a>
+<span class="sourceLineNo">475</span>       */<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      private String findPropertyName(Field f, Set&lt;String&gt; fixedBeanProps) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>         BeanProperty bp = f.getAnnotation(BeanProperty.class);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>         String name = bpName(bp);<a name="line.478"></a>
+<span class="sourceLineNo">479</span>         if (isNotEmpty(name)) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>            if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name))<a name="line.480"></a>
+<span class="sourceLineNo">481</span>               return name;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>            return null;  // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties.<a name="line.482"></a>
+<span class="sourceLineNo">483</span>         }<a name="line.483"></a>
+<span class="sourceLineNo">484</span>         name = propertyNamer.getPropertyName(f.getName());<a name="line.484"></a>
+<span class="sourceLineNo">485</span>         if (fixedBeanProps.isEmpty() || fixedBeanProps.contains(name))<a name="line.485"></a>
+<span class="sourceLineNo">486</span>            return name;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>         return null;<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      }<a name="line.488"></a>
+<span class="sourceLineNo">489</span>   }<a name="line.489"></a>
+<span class="sourceLineNo">490</span><a name="line.490"></a>
+<span class="sourceLineNo">491</span>   /**<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    * Returns the {@link ClassMeta} of this bean.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    *<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    * @return The {@link ClassMeta} of this bean.<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    */<a name="line.495"></a>
+<span class="sourceLineNo">496</span>   @BeanIgnore<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   public final ClassMeta&lt;T&gt; getClassMeta() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      return classMeta;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>   }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>   /**<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    * Returns the dictionary name for this bean as defined through the {@link Bean#typeName() @Bean(typeName)} annotation.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    *<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    * @return The dictionary name for this bean, or &lt;jk&gt;null&lt;/jk&gt; if it has no dictionary name defined.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    */<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   public final String getDictionaryName() {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>      return dictionaryName;<a name="line.507"></a>
+<span class="sourceLineNo">508</span>   }<a name="line.508"></a>
+<span class="sourceLineNo">509</span><a name="line.509"></a>
+<span class="sourceLineNo">510</span>   /**<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    * Returns a mock bean property that resolves to the name &lt;js&gt;"_type"&lt;/js&gt; and whose value always resolves to the<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    * dictionary name of the bean.<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    *<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    * @return The type name property.<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    */<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   public final BeanPropertyMeta getTypeProperty() {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>      return typeProperty;<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   }<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>   /**<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    * Possible property method types.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    */<a name="line.522"></a>
+<span class="sourceLineNo">523</span>   static enum MethodType {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      UNKNOWN,<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      GETTER,<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      SETTER,<a name="line.526"></a>
+<span class="sourceLineNo">527</span>      EXTRAKEYS;<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   }<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>   /*<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    * Temporary getter/setter method struct.<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    */<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   private static final class BeanMethod {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>      String propertyName;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      MethodType methodType;<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      Method method;<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      Class&lt;?&gt; type;<a name="line.537"></a>
+<span class="sourceLineNo">538</span><a name="line.538"></a>
+<span class="sourceLineNo">539</span>      BeanMethod(String propertyName, MethodType type, Method method) {<a name="line.539"></a>
+<span class="sourceLineNo">540</span>         this.propertyName = propertyName;<a name="line.540"></a>
+<span class="sourceLineNo">541</span>         this.methodType = type;<a name="line.541"></a>
+<span class="sourceLineNo">542</span>         this.method = method;<a name="line.542"></a>
+<span class="sourceLineNo">543</span>         if (type == MethodType.SETTER)<a name="line.543"></a>
+<span class="sourceLineNo">544</span>            this.type = method.getParameterTypes()[0];<a name="line.544"></a>
+<span class="sourceLineNo">545</span>         else<a name="line.545"></a>
+<span class="sourceLineNo">546</span>            this.type = method.getReturnType();<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      }<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>      /*<a name="line.549"></a>
+<span class="sourceLineNo">550</span>       * Returns true if this method matches the class type of the specified property.<a name="line.550"></a>
+<span class="sourceLineNo">551</span>       * Only meant to be used for setters.<a name="line.551"></a>
+<span class="sourceLineNo">552</span>       */<a name="line.552"></a>
+<span class="sourceLineNo">553</span>      boolean matchesPropertyType(BeanPropertyMeta.Builder b) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>         if (b == null)<a name="line.554"></a>
+<span class="sourceLineNo">555</span>            return false;<a name="line.555"></a>
+<span class="sourceLineNo">556</span><a name="line.556"></a>
+<span class="sourceLineNo">557</span>         // Don't do further validation if this is the "*" bean property.<a name="line.557"></a>
+<span class="sourceLineNo">558</span>         if ("*".equals(b.name))<a name="line.558"></a>
+<span class="sourceLineNo">559</span>            return true;<a name="line.559"></a>
+<span class="sourceLineNo">560</span><a name="line.560"></a>
+<span class="sourceLineNo">561</span>         // Get the bean property type from the getter/field.<a name="line.561"></a>
+<span class="sourceLineNo">562</span>         Class&lt;?&gt; pt = null;<a name="line.562"></a>
+<span class="sourceLineNo">563</span>         if (b.getter != null)<a name="line.563"></a>
+<span class="sourceLineNo">564</span>            pt = b.getter.getReturnType();<a name="line.564"></a>
+<span class="sourceLineNo">565</span>         else if (b.field != null)<a name="line.565"></a>
+<span class="sourceLineNo">566</span>            pt = b.field.getType();<a name="line.566"></a>
+<span class="sourceLineNo">567</span><a name="line.567"></a>
+<span class="sourceLineNo">568</span>         // Matches if only a setter is defined.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>         if (pt == null)<a name="line.569"></a>
+<span class="sourceLineNo">570</span>            return true;<a name="line.570"></a>
+<span class="sourceLineNo">571</span><a name="line.571"></a>
+<span class="sourceLineNo">572</span>         // Doesn't match if not same type or super type as getter/field.<a name="line.572"></a>
+<span class="sourceLineNo">573</span>         if (! isParentClass(type, pt))<a name="line.573"></a>
+<span class="sourceLineNo">574</span>            return false;<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>         // If a setter was previously set, only use this setter if it's a closer<a name="line.576"></a>
+<span class="sourceLineNo">577</span>         // match (e.g. prev type is a superclass of this type).<a name="line.577"></a>
+<span class="sourceLineNo">578</span>         if (b.setter == null)<a name="line.578"></a>
+<span class="sourceLineNo">579</span>            return true;<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>         Class&lt;?&gt; prevType = b.setter.getParameterTypes()[0];<a name="line.581"></a>
+<span class="sourceLineNo">582</span>         return isParentClass(prevType, type, true);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>      }<a name="line.583"></a>
+<span class="sourceLineNo">584</span><a name="line.584"></a>
+<span class="sourceLineNo">585</span>      @Override /* Object */<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      public String toString() {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>         return method.toString();<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
+<span class="sourceLineNo">589</span>   }<a name="line.589"></a>
+<span class="sourceLineNo">590</span><a name="line.590"></a>
+<span class="sourceLineNo">591</span>   /*<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    * Find all the bean methods on this class.<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    *<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    * @param c The transformed class.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    * @param stopClass Don't look above this class in the hierarchy.<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    * @param v The minimum method visibility.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    * @param fixedBeanProps Only include methods whose properties are in this list.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    * @param pn Use this property namer to determine property names from the method names.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>   static final List&lt;BeanMethod&gt; findBeanMethods(Class&lt;?&gt; c, Class&lt;?&gt; stopClass, Visibility v, Set&lt;String&gt; fixedBeanProps, Set&lt;String&gt; filterProps, PropertyNamer pn, boolean fluentSetters) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      List&lt;BeanMethod&gt; l = new LinkedList&lt;&gt;();<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      for (Class&lt;?&gt; c2 : findClasses(c, stopClass)) {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>         for (Method m : c2.getDeclaredMethods()) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>            if (isStatic(m))<a name="line.605"></a>
 <span class="sourceLineNo">606</span>               continue;<a name="line.606"></a>
-<span class="sourceLineNo">607</span><a name="line.607"></a>
-<span class="sourceLineNo">608</span>            BeanIgnore bi = getAnnotation(BeanIgnore.class, m);<a name="line.608"></a>
-<span class="sourceLineNo">609</span>            if (bi != null)<a name="line.609"></a>
-<span class="sourceLineNo">610</span>               continue;<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>            BeanProperty bp = getAnnotation(BeanProperty.class, m);<a name="line.612"></a>
-<span class="sourceLineNo">613</span>            if (! (v.isVisible(m) || bp != null))<a name="line.613"></a>
-<span class="sourceLineNo">614</span>               continue;<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>            String n = m.getName();<a name="line.616"></a>
+<span class="sourceLineNo">607</span>            if (m.isBridge())   // This eliminates methods with covariant return types from parent classes on child classes.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>               continue;<a name="line.608"></a>
+<span class="sourceLineNo">609</span><a name="line.609"></a>
+<span class="sourceLineNo">610</span>            BeanIgnore bi = getAnnotation(BeanIgnore.class, m);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>            if (bi != null)<a name="line.611"></a>
+<span class="sourceLineNo">612</span>               continue;<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>            BeanProperty bp = getAnnotation(BeanProperty.class, m);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>            if (! (v.isVisible(m) || bp != null))<a name="line.615"></a>
+<span class="sourceLineNo">616</span>               continue;<a name="line.616"></a>
 <span class="sourceLineNo">617</span><a name="line.617"></a>
-<span class="sourceLineNo">618</span>            Class&lt;?&gt;[] pt = m.getParameterTypes();<a name="line.618"></a>
-<span class="sourceLineNo">619</span>            Class&lt;?&gt; rt = m.getReturnType();<a name="line.619"></a>
-<span class="sourceLineNo">620</span>            MethodType methodType = UNKNOWN;<a name="line.620"></a>
-<span class="sourceLineNo">621</span>            String bpName = bpName(bp);<a name="line.621"></a>
-<span class="sourceLineNo">622</span><a name="line.622"></a>
-<span class="sourceLineNo">623</span>            if (! (isEmpty(bpName) || filterProps.isEmpty() || filterProps.contains(bpName)))<a name="line.623"></a>
-<span class="sourceLineNo">624</span>               throw new BeanRuntimeException(c, "Found @BeanProperty(\"{0}\") but name was not found in @Bean(properties)", bpName);<a name="line.624"></a>
-<span class="sourceLineNo">625</span><a name="line.625"></a>
-<span class="sourceLineNo">626</span>            if (pt.length == 0) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>               if ("*".equals(bpName)) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>                  if (isParentClass(Collection.class, rt)) {<a name="line.628"></a>
-<span class="sourceLineNo">629</span>                     methodType = EXTRAKEYS;<a name="line.629"></a>
-<span class="sourceLineNo">630</span>                  } else if (isParentClass(Map.class, rt)) {<a name="line.630"></a>
-<span class="sourceLineNo">631</span>                     methodType = GETTER;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>                  }<a name="line.632"></a>
-<span class="sourceLineNo">633</span>                  n = bpName;<a name="line.633"></a>
-<span class="sourceLineNo">634</span>               } else if (n.startsWith("get") &amp;&amp; (! rt.equals(Void.TYPE))) {<a name="line.634"></a>
-<span class="sourceLineNo">635</span>                  methodType = GETTER;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>                  n = n.substring(3);<a name="line.636"></a>
-<span class="sourceLineNo">637</span>               } else if (n.startsWith("is") &amp;&amp; (rt.equals(Boolean.TYPE) || rt.equals(Boolean.class))) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>                  methodType = GETTER;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>                  n = n.substring(2);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>               } else if (bpName != null) {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>                  methodType = GETTER;<a name="line.641"></a>
-<span class="sourceLineNo">642</span>                  if (bpName.isEmpty()) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>                     if (n.startsWith("get"))<a name="line.643"></a>
-<span class="sourceLineNo">644</span>                        n = n.substring(3);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>                     else if (n.startsWith("is"))<a name="line.645"></a>
-<span class="sourceLineNo">646</span>                        n = n.substring(2);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>                     bpName = n;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>                  } else {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>                     n = bpName;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>                  }<a name="line.650"></a>
-<span class="sourceLineNo">651</span>               }<a name="line.651"></a>
-<span class="sourceLineNo">652</span>            } else if (pt.length == 1) {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>               if ("*".equals(bpName)) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>                  if (isParentClass(Map.class, pt[0])) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>                     methodType = SETTER;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>                     n = bpName;<a name="line.656"></a>
-<span class="sourceLineNo">657</span>                  } else if (pt[0] == String.class) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>                     methodType = GETTER;<a name="line.658"></a>
-<span class="sourceLineNo">659</span>                     n = bpName;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>                  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span>               } else if (n.startsWith("set") &amp;&amp; (isParentClass(rt, c) || rt.equals(Void.TYPE))) {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>                  methodType = SETTER;<a name="line.662"></a>
-<span class="sourceLineNo">663</span>                  n = n.substring(3);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>               } else if (bpName != null) {<a name="line.664"></a>
-<span class="sourceLineNo">665</span>                  methodType = SETTER;<a name="line.665"></a>
-<span class="sourceLineNo">666</span>                  if (bpName.isEmpty()) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>                     if (n.startsWith("set"))<a name="line.667"></a>
-<span class="sourceLineNo">668</span>                        n = n.substring(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>                     bpName = n;<a name="line.669"></a>
-<span class="sourceLineNo">670</span>                  } else {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>                     n = bpName;<a name="line.671"></a>
-<span class="sourceLineNo">672</span>                  }<a name="line.672"></a>
-<span class="sourceLineNo">673</span>               } else if (fluentSetters &amp;&amp; isParentClass(rt, c)) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>                  methodType = SETTER;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>               }<a name="line.675"></a>
-<span class="sourceLineNo">676</span>            } else if (pt.length == 2) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>               if ("*".equals(bpName) &amp;&amp; pt[0] == String.class) {<a name="line.677"></a>
-<span class="sourceLineNo">678</span>                  if (n.startsWith("set") &amp;&amp; (isParentClass(rt, c) || rt.equals(Void.TYPE))) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>                     methodType = SETTER;<a name="line.679"></a>
-<span class="sourceLineNo">680</span>                  } else {<a name="line.680"></a>
-<span class="sourceLineNo">681</span>                     methodType = GETTER;<a name="line.681"></a>
-<span class="sourceLineNo">682</span>                  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span>                  n = bpName;<a name="line.683"></a>
-<span class="sourceLineNo">684</span>               }<a name="line.684"></a>
-<span class="sourceLineNo">685</span>            }<a name="line.685"></a>
-<span class="sourceLineNo">686</span>            n = pn.getPropertyName(n);<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>            if ("*".equals(bpName) &amp;&amp; methodType == UNKNOWN)<a name="line.688"></a>
-<span class="sourceLineNo">689</span>               throw new BeanRuntimeException(c, "Found @BeanProperty(\"*\") but could not determine method type on method ''{0}''.", m.getName());<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>            if (methodType != UNKNOWN) {<a name="line.691"></a>
-<span class="sourceLineNo">692</span>               if (bpName != null &amp;&amp; ! bpName.isEmpty()) {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>                  n = bpName;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>                  if (! fixedBeanProps.isEmpty())<a name="line.694"></a>
-<span class="sourceLineNo">695</span>                     if (! fixedBeanProps.contains(n))<a name="line.695"></a>
-<span class="sourceLineNo">696</span>                        n = null;  // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties<a name="line.696"></a>
-<span class="sourceLineNo">697</span>               }<a name="line.697"></a>
-<span class="sourceLineNo">698</span>               if (n != null)<a name="line.698"></a>
-<span class="sourceLineNo">699</span>                  l.add(new BeanMethod(n, methodType, m));<a name="line.699"></a>
-<span class="sourceLineNo">700</span>            }<a name="line.700"></a>
-<span class="sourceLineNo">701</span>         }<a name="line.701"></a>
-<span class="sourceLineNo">702</span>      }<a name="line.702"></a>
-<span class="sourceLineNo">703</span>      return l;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>   static final Collection&lt;Field&gt; findBeanFields(Class&lt;?&gt; c, Class&lt;?&gt; stopClass, Visibility v, Set&lt;String&gt; filterProps) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      List&lt;Field&gt; l = new LinkedList&lt;&gt;();<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      for (Class&lt;?&gt; c2 : findClasses(c, stopClass)) {<a name="line.708"></a>
-<span class="sourceLineNo">709</span>         for (Field f : c2.getDeclaredFields()) {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>            if (isAny(f, STATIC, TRANSIENT))<a name="line.710"></a>
-<span class="sourceLineNo">711</span>               continue;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>            if (f.isAnnotationPresent(BeanIgnore.class))<a name="line.712"></a>
+<span class="sourceLineNo">618</span>            String n = m.getName();<a name="line.618"></a>
+<span class="sourceLineNo">619</span><a name="line.619"></a>
+<span class="sourceLineNo">620</span>            Class&lt;?&gt;[] pt = m.getParameterTypes();<a name="line.620"></a>
+<span class="sourceLineNo">621</span>            Class&lt;?&gt; rt = m.getReturnType();<a name="line.621"></a>
+<span class="sourceLineNo">622</span>            MethodType methodType = UNKNOWN;<a name="line.622"></a>
+<span class="sourceLineNo">623</span>            String bpName = bpName(bp);<a name="line.623"></a>
+<span class="sourceLineNo">624</span><a name="line.624"></a>
+<span class="sourceLineNo">625</span>            if (! (isEmpty(bpName) || filterProps.isEmpty() || filterProps.contains(bpName)))<a name="line.625"></a>
+<span class="sourceLineNo">626</span>               throw new BeanRuntimeException(c, "Found @BeanProperty(\"{0}\") but name was not found in @Bean(properties)", bpName);<a name="line.626"></a>
+<span class="sourceLineNo">627</span><a name="line.627"></a>
+<span class="sourceLineNo">628</span>            if (pt.length == 0) {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>               if ("*".equals(bpName)) {<a name="line.629"></a>
+<span class="sourceLineNo">630</span>                  if (isParentClass(Collection.class, rt)) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>                     methodType = EXTRAKEYS;<a name="line.631"></a>
+<span class="sourceLineNo">632</span>                  } else if (isParentClass(Map.class, rt)) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>                     methodType = GETTER;<a name="line.633"></a>
+<span class="sourceLineNo">634</span>                  }<a name="line.634"></a>
+<span class="sourceLineNo">635</span>                  n = bpName;<a name="line.635"></a>
+<span class="sourceLineNo">636</span>               } else if (n.startsWith("get") &amp;&amp; (! rt.equals(Void.TYPE))) {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>                  methodType = GETTER;<a name="line.637"></a>
+<span class="sourceLineNo">638</span>                  n = n.substring(3);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>               } else if (n.startsWith("is") &amp;&amp; (rt.equals(Boolean.TYPE) || rt.equals(Boolean.class))) {<a name="line.639"></a>
+<span class="sourceLineNo">640</span>                  methodType = GETTER;<a name="line.640"></a>
+<span class="sourceLineNo">641</span>                  n = n.substring(2);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>               } else if (bpName != null) {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>                  methodType = GETTER;<a name="line.643"></a>
+<span class="sourceLineNo">644</span>                  if (bpName.isEmpty()) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>                     if (n.startsWith("get"))<a name="line.645"></a>
+<span class="sourceLineNo">646</span>                        n = n.substring(3);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>                     else if (n.startsWith("is"))<a name="line.647"></a>
+<span class="sourceLineNo">648</span>                        n = n.substring(2);<a name="line.648"></a>
+<span class="sourceLineNo">649</span>                     bpName = n;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>                  } else {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>                     n = bpName;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>                  }<a name="line.652"></a>
+<span class="sourceLineNo">653</span>               }<a name="line.653"></a>
+<span class="sourceLineNo">654</span>            } else if (pt.length == 1) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>               if ("*".equals(bpName)) {<a name="line.655"></a>
+<span class="sourceLineNo">656</span>                  if (isParentClass(Map.class, pt[0])) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>                     methodType = SETTER;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>                     n = bpName;<a name="line.658"></a>
+<span class="sourceLineNo">659</span>                  } else if (pt[0] == String.class) {<a name="line.659"></a>
+<span class="sourceLineNo">660</span>                     methodType = GETTER;<a name="line.660"></a>
+<span class="sourceLineNo">661</span>                     n = bpName;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>                  }<a name="line.662"></a>
+<span class="sourceLineNo">663</span>               } else if (n.startsWith("set") &amp;&amp; (isParentClass(rt, c) || rt.equals(Void.TYPE))) {<a name="line.663"></a>
+<span class="sourceLineNo">664</span>                  methodType = SETTER;<a name="line.664"></a>
+<span class="sourceLineNo">665</span>                  n = n.substring(3);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>               } else if (bpName != null) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>                  methodType = SETTER;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>                  if (bpName.isEmpty()) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>                     if (n.startsWith("set"))<a name="line.669"></a>
+<span class="sourceLineNo">670</span>                        n = n.substring(3);<a name="line.670"></a>
+<span class="sourceLineNo">671</span>                     bpName = n;<a name="line.671"></a>
+<span class="sourceLineNo">672</span>                  } else {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>                     n = bpName;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>                  }<a name="line.674"></a>
+<span class="sourceLineNo">675</span>               } else if (fluentSetters &amp;&amp; isParentClass(rt, c)) {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>                  methodType = SETTER;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>               }<a name="line.677"></a>
+<span class="sourceLineNo">678</span>            } else if (pt.length == 2) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>               if ("*".equals(bpName) &amp;&amp; pt[0] == String.class) {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>                  if (n.startsWith("set") &amp;&amp; (isParentClass(rt, c) || rt.equals(Void.TYPE))) {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>                     methodType = SETTER;<a name="line.681"></a>
+<span class="sourceLineNo">682</span>                  } else {<a name="line.682"></a>
+<span class="sourceLineNo">683</span>                     methodType = GETTER;<a name="line.683"></a>
+<span class="sourceLineNo">684</span>                  }<a name="line.684"></a>
+<span class="sourceLineNo">685</span>                  n = bpName;<a name="line.685"></a>
+<span class="sourceLineNo">686</span>               }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>            }<a name="line.687"></a>
+<span class="sourceLineNo">688</span>            n = pn.getPropertyName(n);<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>            if ("*".equals(bpName) &amp;&amp; methodType == UNKNOWN)<a name="line.690"></a>
+<span class="sourceLineNo">691</span>               throw new BeanRuntimeException(c, "Found @BeanProperty(\"*\") but could not determine method type on method ''{0}''.", m.getName());<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>            if (methodType != UNKNOWN) {<a name="line.693"></a>
+<span class="sourceLineNo">694</span>               if (bpName != null &amp;&amp; ! bpName.isEmpty()) {<a name="line.694"></a>
+<span class="sourceLineNo">695</span>                  n = bpName;<a name="line.695"></a>
+<span class="sourceLineNo">696</span>                  if (! fixedBeanProps.isEmpty())<a name="line.696"></a>
+<span class="sourceLineNo">697</span>                     if (! fixedBeanProps.contains(n))<a name="line.697"></a>
+<span class="sourceLineNo">698</span>                        n = null;  // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties<a name="line.698"></a>
+<span class="sourceLineNo">699</span>               }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>               if (n != null)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>                  l.add(new BeanMethod(n, methodType, m));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>            }<a name="line.702"></a>
+<span class="sourceLineNo">703</span>         }<a name="line.703"></a>
+<span class="sourceLineNo">704</span>      }<a name="line.704"></a>
+<span class="sourceLineNo">705</span>      return l;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>   }<a name="line.706"></a>
+<span class="sourceLineNo">707</span><a name="line.707"></a>
+<span class="sourceLineNo">708</span>   static final Collection&lt;Field&gt; findBeanFields(Class&lt;?&gt; c, Class&lt;?&gt; stopClass, Visibility v, Set&lt;String&gt; filterProps) {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>      List&lt;Field&gt; l = new LinkedList&lt;&gt;();<a name="line.709"></a>
+<span class="sourceLineNo">710</span>      for (Class&lt;?&gt; c2 : findClasses(c, stopClass)) {<a name="line.710"></a>
+<span class="sourceLineNo">711</span>         for (Field f : c2.getDeclaredFields()) {<a name="line.711"></a>
+<span class="sourceLineNo">712</span>            if (isAny(f, STATIC, TRANSIENT))<a name="line.712"></a>
 <span class="sourceLineNo">713</span>               continue;<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>            BeanProperty bp = f.getAnnotation(BeanProperty.class);<a name="line.715"></a>
-<span class="sourceLineNo">716</span>            String bpName = bpName(bp);<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>            if (! (v.isVisible(f) || bp != null))<a name="line.718"></a>
-<span class="sourceLineNo">719</span>               continue;<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>            if (! (isEmpty(bpName) || filterProps.isEmpty() || filterProps.contains(bpName)))<a name="line.721"></a>
-<span class="sourceLineNo">722</span>               throw new BeanRuntimeException(c, "Found @BeanProperty(\"{0}\") but name was not found in @Bean(properties)", bpName);<a name="line.722"></a>
-<span class="sourceLineNo">723</span><a name="line.723"></a>
-<span class="sourceLineNo">724</span>            l.add(f);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>         }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      }<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      return l;<a name="line.727"></a>
-<span class="sourceLineNo">728</span>   }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>   static final Field findInnerBeanField(Class&lt;?&gt; c, Class&lt;?&gt; stopClass, String name) {<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      for (Class&lt;?&gt; c2 : findClasses(c, stopClass)) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>         for (Field f : c2.getDeclaredFields()) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>            if (isAny(f, STATIC, TRANSIENT))<a name="line.733"></a>
-<span class="sourceLineNo">734</span>               continue;<a name="line.734"></a>
-<span class="sourceLineNo">735</span>            if (f.isAnnotationPresent(BeanIgnore.class))<a name="line.735"></a>
+<span class="sourceLineNo">714</span>            if (f.isAnnotationPresent(BeanIgnore.class))<a name="line.714"></a>
+<span class="sourceLineNo">715</span>               continue;<a name="line.715"></a>
+<span class="sourceLineNo">716</span><a name="line.716"></a>
+<span class="sourceLineNo">717</span>            BeanProperty bp = f.getAnnotation(BeanProperty.class);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>            String bpName = bpName(bp);<a name="line.718"></a>
+<span class="sourceLineNo">719</span><a name="line.719"></a>
+<span class="sourceLineNo">720</span>            if (! (v.isVisible(f) || bp != null))<a name="line.720"></a>
+<span class="sourceLineNo">721</span>               continue;<a name="line.721"></a>
+<span class="sourceLineNo">722</span><a name="line.722"></a>
+<span class="sourceLineNo">723</span>            if (! (isEmpty(bpName) || filterProps.isEmpty() || filterProps.contains(bpName)))<a name="line.723"></a>
+<span class="sourceLineNo">724</span>               throw new BeanRuntimeException(c, "Found @BeanProperty(\"{0}\") but name was not found in @Bean(properties)", bpName);<a name="line.724"></a>
+<span class="sourceLineNo">725</span><a name="line.725"></a>
+<span class="sourceLineNo">726</span>            l.add(f);<a name="line.726"></a>
+<span class="sourceLineNo">727</span>         }<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      return l;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>   }<a name="line.730"></a>
+<span class="sourceLineNo">731</span><a name="line.731"></a>
+<span class="sourceLineNo">732</span>   static final Field findInnerBeanField(Class&lt;?&gt; c, Class&lt;?&gt; stopClass, String name) {<a name="line.732"></a>
+<span class="sourceLineNo">733</span>      for (Class&lt;?&gt; c2 : findClasses(c, stopClass)) {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>         for (Field f : c2.getDeclaredFields()) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>            if (isAny(f, STATIC, TRANSIENT))<a name="line.735"></a>
 <span class="sourceLineNo">736</span>               continue;<a name="line.736"></a>
-<span class="sourceLineNo">737</span>            if (f.getName().equals(name))<a name="line.737"></a>
-<span class="sourceLineNo">738</span>               return f;<a name="line.738"></a>
-<span class="sourceLineNo">739</span>         }<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      }<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      return null;<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   }<a name="line.742"></a>
-<span class="sourceLineNo">743</span><a name="line.743"></a>
-<span class="sourceLineNo">744</span>   private static List&lt;Class&lt;?&gt;&gt; findClasses(Class&lt;?&gt; c, Class&lt;?&gt; stopClass) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      LinkedList&lt;Class&lt;?&gt;&gt; l = new LinkedList&lt;&gt;();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>      findClasses(c, l, stopClass);<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      return l;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>   private static void findClasses(Class&lt;?&gt; c, LinkedList&lt;Class&lt;?&gt;&gt; l, Class&lt;?&gt; stopClass) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      while (c != null &amp;&amp; stopClass != c) {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>         l.addFirst(c);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>         for (Class&lt;?&gt; ci : c.getInterfaces())<a name="line.753"></a>
-<span class="sourceLineNo">754</span>            findClasses(ci, l, stopClass);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>         c = c.getSuperclass();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   }<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>   /**<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    * Returns the metadata on all properties associated with this bean.<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    *<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    * @return Metadata on all properties associated with this bean.<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    */<a name="line.763"></a>
-<span class="sourceLineNo">764</span>   public Collection&lt;BeanPropertyMeta&gt; getPropertyMetas() {<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      return this.properties.values();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>   }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>   /**<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    * Returns the metadata on the specified list of properties.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    *<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    * @param pNames The list of properties to retrieve.  If &lt;jk&gt;null&lt;/jk&gt;, returns all properties.<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    * @return The metadata on the specified list of properties.<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    */<a name="line.773"></a>
-<span class="sourceLineNo">774</span>   public Collection&lt;BeanPropertyMeta&gt; getPropertyMetas(final String...pNames) {<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      if (pNames == null)<a name="line.775"></a>
-<span class="sourceLineNo">776</span>         return getPropertyMetas();<a name="line.776"></a>
-<span class="sourceLineNo">777</span>      List&lt;BeanPropertyMeta&gt; l = new ArrayList&lt;&gt;(pNames.length);<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      for (int i = 0; i &lt; pNames.length; i++)<a name="line.778"></a>
-<span class="sourceLineNo">779</span>         l.add(getPropertyMeta(pNames[i]));<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      return l;<a name="line.780"></a>
-<span class="sourceLineNo">781</span>   }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>   /**<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    * Returns the language-specified extended metadata on this bean class.<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    *<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    * @param metaDataClass The name of the metadata class to create.<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    * @return Extended metadata on this bean class.  Never &lt;jk&gt;null&lt;/jk&gt;.<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    */<a name="line.788"></a>
-<span class="sourceLineNo">789</span>   public &lt;M extends BeanMetaExtended&gt; M getExtendedMeta(Class&lt;M&gt; metaDataClass) {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      return extMeta.get(metaDataClass, this);<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   }<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>   /**<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    * Returns metadata about the specified property.<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    *<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    * @param name The name of the property on this bean.<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    * @return The metadata about the property, or &lt;jk&gt;null&lt;/jk&gt; if no such property exists on this bean.<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    */<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   public BeanPropertyMeta getPropertyMeta(String name) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      BeanPropertyMeta bpm = properties.get(name);<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      if (bpm == null)<a name="line.801"></a>
-<span class="sourceLineNo">802</span>         bpm = dynaProperty;<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      return bpm;<a name="line.803"></a>
-<span class="sourceLineNo">804</span>   }<a name="line.804"></a>
-<span class="sourceLineNo">805</span><a name="line.805"></a>
-<span class="sourceLineNo">806</span>   /**<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    * Creates a new instance of this bean.<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    *<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    * @param outer The outer object if bean class is a non-static inner member class.<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    * @return A new instance of this bean if possible, or &lt;jk&gt;null&lt;/jk&gt; if not.<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    * @throws IllegalArgumentException Thrown by constructor.<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    * @throws InstantiationException Thrown by constructor.<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    * @throws IllegalAccessException Thrown by constructor.<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    * @throws InvocationTargetException Thrown by constructor.<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    */<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   @SuppressWarnings("unchecked")<a name="line.816"></a>
-<span class="sourceLineNo">817</span>   protected T newBean(Object outer) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {<a name="line.817"></a>
-<span class="sourceLineNo">818</span>      if (classMeta.isMemberClass()) {<a name="line.818"></a>
-<span class="sourceLineNo">819</span>         if (constructor != null)<a name="line.819"></a>
-<span class="sourceLineNo">820</span>            return constructor.newInstance(outer);<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      } else {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>         if (constructor != null)<a name="line.822"></a>
-<span class="sourceLineNo">823</span>            return constructor.newInstance((Object[])null);<a name="line.823"></a>
-<span class="sourceLineNo">824</span>         InvocationHandler h = classMeta.getProxyInvocationHandler();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>         if (h != null) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>            ClassLoader cl = classMeta.innerClass.getClassLoader();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            return (T)Proxy.newProxyInstance(cl, new Class[] { classMeta.innerClass, java.io.Serializable.class }, h);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>         }<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      }<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      return null;<a name="line.830"></a>
-<span class="sourceLineNo">831</span>   }<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>   /**<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    * Recursively determines the classes represented by parameterized types in the class hierarchy of the specified<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    * type, and puts the results in the specified map.<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    *<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    * &lt;p&gt;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    * For example, given the following classes...<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    * &lt;p class='bcode w800'&gt;<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    *    public static class BeanA&amp;lt;T&amp;gt; {<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    *       public T x;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    *    }<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    *    public static class BeanB extends BeanA&amp;lt;Integer&gt;} {...}<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    * &lt;/p&gt;<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    * &lt;p&gt;<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    *    ...calling this method on {@code BeanB.class} will load the following data into {@code m} indicating<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    *    that the {@code T} parameter on the BeanA class is implemented with an {@code Integer}:<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    * &lt;p class='bcode w800'&gt;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    *    {BeanA.class:[Integer.class]}<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    * &lt;/p&gt;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    *<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    * &lt;p&gt;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    * TODO:  This code doesn't currently properly handle the following situation:<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    * &lt;p class='bcode w800'&gt;<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    *    public static class BeanB&amp;lt;T extends Number&amp;gt; extends BeanA&amp;lt;T&amp;gt;;<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    *    public static class BeanC extends BeanB&amp;lt;Integer&amp;gt;;<a name="line.856"></a>
-<span class="sourceLineNo">857</span>    * &lt;/p&gt;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>    *<a name="line.858"></a>
-<span class="sourceLineNo">859</span>    * &lt;p&gt;<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    * When called on {@code BeanC}, the variable will be detected as a {@code Number}, not an {@code Integer}.<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    * If anyone can figure out a better way of doing this, please do so!<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    *<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    * @param t The type we're recursing.<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    * @param m Where the results are loaded.<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    */<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   static final void findTypeVarImpls(Type t, Map&lt;Class&lt;?&gt;,Class&lt;?&gt;[]&gt; m) {<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      if (t instanceof Class) {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>         Class&lt;?&gt; c = (Class&lt;?&gt;)t;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>         findTypeVarImpls(c.getGenericSuperclass(), m);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>         for (Type ci : c.getGenericInterfaces())<a name="line.870"></a>
-<span class="sourceLineNo">871</span>            findTypeVarImpls(ci, m);<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      } else if (t instanceof ParameterizedType) {<a name="line.872"></a>
-<span class="sourceLineNo">873</span>         ParameterizedType pt = (ParameterizedType)t;<a name="line.873"></a>
-<span class="sourceLineNo">874</span>         Type rt = pt.getRawType();<a name="line.874"></a>
-<span class="sourceLineNo">875</span>         if (rt instanceof Class) {<a name="line.875"></a>
-<span class="sourceLineNo">876</span>            Type[] gImpls = pt.getActualTypeArguments();<a name="line.876"></a>
-<span class="sourceLineNo">877</span>            Class&lt;?&gt;[] gTypes = new Class[gImpls.length];<a name="line.877"></a>
-<span class="sourceLineNo">878</span>            for (int i = 0; i &lt; gImpls.length; i++) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>               Type gt = gImpls[i];<a name="line.879"></a>
-<span class="sourceLineNo">880</span>               if (gt instanceof Class)<a name="line.880"></a>
-<span class="sourceLineNo">881</span>                  gTypes[i] = (Class&lt;?&gt;)gt;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>               else if (gt instanceof TypeVariable) {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>                  TypeVariable&lt;?&gt; tv = (TypeVariable&lt;?&gt;)gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>                  for (Type upperBound : tv.getBounds())<a name="line.884"></a>
-<span class="sourceLineNo">885</span>                     if (upperBound instanceof Class)<a name="line.885"></a>
-<span class="sourceLineNo">886</span>                        gTypes[i] = (Class&lt;?&gt;)upperBound;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>               }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>            }<a name="line.888"></a>
-<span class="sourceLineNo">889</span>            m.put((Class&lt;?&gt;)rt, gTypes);<a name="line.889"></a>
-<span class="sourceLineNo">890</span>            findTypeVarImpls(pt.getRawType(), m);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>         }<a name="line.891"></a>
-<span class="sourceLineNo">892</span>      }<a name="line.892"></a>
-<span class="sourceLineNo">893</span>   }<a name="line.893"></a>
-<span class="sourceLineNo">894</span><a name="line.894"></a>
-<span class="sourceLineNo">895</span>   static final String bpName(BeanProperty bp) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>      if (bp == null)<a name="line.896"></a>
-<span class="sourceLineNo">897</span>         return null;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      if (! bp.name().isEmpty())<a name="line.898"></a>
-<span class="sourceLineNo">899</span>         return bp.name();<a name="line.899"></a>
-<span class="sourceLineNo">900</span>      return bp.value();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>   @Override /* Object */<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   public String toString() {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      StringBuilder sb = new StringBuilder(c.getName());<a name="line.905"></a>
-<span class="sourceLineNo">906</span>      sb.append(" {\n");<a name="line.906"></a>
-<span class="sourceLineNo">907</span>      for (BeanPropertyMeta pm : this.properties.values())<a name="line.907"></a>
-<span class="sourceLineNo">908</span>         sb.append('\t').append(pm.toString()).append(",\n");<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      sb.append('}');<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      return sb.toString();<a name="line.910"></a>
-<span class="sourceLineNo">911</span>   }<a name="line.911"></a>
-<span class="sourceLineNo">912</span>}<a name="line.912"></a>
+<span class="sourceLineNo">737</span>            if (f.isAnnotationPresent(BeanIgnore.class))<a name="line.737"></a>
+<span class="sourceLineNo">738</span>               continue;<a name="line.738"></a>
+<span class="sourceLineNo">739</span>            if (f.getName().equals(name))<a name="line.739"></a>
+<span class="sourceLineNo">740</span>               return f;<a name="line.740"></a>
+<span class="sourceLineNo">741</span>         }<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      }<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      return null;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>   }<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>   private static List&lt;Class&lt;?&gt;&gt; findClasses(Class&lt;?&gt; c, Class&lt;?&gt; stopClass) {<a name="line.746"></a>
+<span class="sourceLineNo">747</span>      LinkedList&lt;Class&lt;?&gt;&gt; l = new LinkedList&lt;&gt;();<a name="line.747"></a>
+<span class="sourceLineNo">748</span>      findClasses(c, l, stopClass);<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      return l;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>   }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>   private static void findClasses(Class&lt;?&gt; c, LinkedList&lt;Class&lt;?&gt;&gt; l, Class&lt;?&gt; stopClass) {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      while (c != null &amp;&amp; stopClass != c) {<a name="line.753"></a>
+<span class="sourceLineNo">754</span>         l.addFirst(c);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>         for (Class&lt;?&gt; ci : c.getInterfaces())<a name="line.755"></a>
+<span class="sourceLineNo">756</span>            findClasses(ci, l, stopClass);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>         c = c.getSuperclass();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      }<a name="line.758"></a>
+<span class="sourceLineNo">759</span>   }<a name="line.759"></a>
+<span class="sourceLineNo">760</span><a name="line.760"></a>
+<span class="sourceLineNo">761</span>   /**<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    * Returns the metadata on all properties associated with this bean.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    *<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    * @return Metadata on all properties associated with this bean.<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    */<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   public Collection&lt;BeanPropertyMeta&gt; getPropertyMetas() {<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      return this.properties.values();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>   }<a name="line.768"></a>
+<span class="sourceLineNo">769</span><a name="line.769"></a>
+<span class="sourceLineNo">770</span>   /**<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    * Returns the metadata on the specified list of properties.<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    *<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    * @param pNames The list of properties to retrieve.  If &lt;jk&gt;null&lt;/jk&gt;, returns all properties.<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    * @return The metadata on the specified list of properties.<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    */<a name="line.775"></a>
+<span class="sourceLineNo">776</span>   public Collection&lt;BeanPropertyMeta&gt; getPropertyMetas(final String...pNames) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>      if (pNames == null)<a name="line.777"></a>
+<span class="sourceLineNo">778</span>         return getPropertyMetas();<a name="line.778"></a>
+<span class="sourceLineNo">779</span>      List&lt;BeanPropertyMeta&gt; l = new ArrayList&lt;&gt;(pNames.length);<a name="line.779"></a>
+<span class="sourceLineNo">780</span>      for (int i = 0; i &lt; pNames.length; i++)<a name="line.780"></a>
+<span class="sourceLineNo">781</span>         l.add(getPropertyMeta(pNames[i]));<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      return l;<a name="line.782"></a>
+<span class="sourceLineNo">783</span>   }<a name="line.783"></a>
+<span class="sourceLineNo">784</span><a name="line.784"></a>
+<span class="sourceLineNo">785</span>   /**<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    * Returns the language-specified extended metadata on this bean class.<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    *<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    * @param metaDataClass The name of the metadata class to create.<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    * @return Extended metadata on this bean class.  Never &lt;jk&gt;null&lt;/jk&gt;.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>   public &lt;M extends BeanMetaExtended&gt; M getExtendedMeta(Class&lt;M&gt; metaDataClass) {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>      return extMeta.get(metaDataClass, this);<a name="line.792"></a>
+<span class="sourceLineNo">793</span>   }<a name="line.793"></a>
+<span class="sourceLineNo">794</span><a name="line.794"></a>
+<span class="sourceLineNo">795</span>   /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    * Returns metadata about the specified property.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    *<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    * @param name The name of the property on this bean.<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    * @return The metadata about the property, or &lt;jk&gt;null&lt;/jk&gt; if no such property exists on this bean.<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    */<a name="line.800"></a>
+<span class="sourceLineNo">801</span>   public BeanPropertyMeta getPropertyMeta(String name) {<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      BeanPropertyMeta bpm = properties.get(name);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      if (bpm == null)<a name="line.803"></a>
+<span class="sourceLineNo">804</span>         bpm = dynaProperty;<a name="line.804"></a>
+<span class="sourceLineNo">805</span>      return bpm;<a name="line.805"></a>
+<span class="sourceLineNo">806</span>   }<a name="line.806"></a>
+<span class="sourceLineNo">807</span><a name="line.807"></a>
+<span class="sourceLineNo">808</span>   /**<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    * Creates a new instance of this bean.<a name="line.809"></a>
+<span class="sourceLineNo">810</span>    *<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    * @param outer The outer object if bean class is a non-static inner member class.<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    * @return A new instance of this bean if possible, or &lt;jk&gt;null&lt;/jk&gt; if not.<a name="line.812"></a>
+<span class="sourceLineNo">813</span>    * @throws IllegalArgumentException Thrown by constructor.<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    * @throws InstantiationException Thrown by constructor.<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    * @throws IllegalAccessException Thrown by constructor.<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    * @throws InvocationTargetException Thrown by constructor.<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    */<a name="line.817"></a>
+<span class="sourceLineNo">818</span>   @SuppressWarnings("unchecked")<a name="line.818"></a>
+<span class="sourceLineNo">819</span>   protected T newBean(Object outer) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException {<a name="line.819"></a>
+<span class="sourceLineNo">820</span>      if (classMeta.isMemberClass()) {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>         if (constructor != null)<a name="line.821"></a>
+<span class="sourceLineNo">822</span>            return constructor.newInstance(outer);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      } else {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>         if (constructor != null)<a name="line.824"></a>
+<span class="sourceLineNo">825</span>            return constructor.newInstance((Object[])null);<a name="line.825"></a>
+<span class="sourceLineNo">826</span>         InvocationHandler h = classMeta.getProxyInvocationHandler();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>         if (h != null) {<a name="line.827"></a>
+<span class="sourceLineNo">828</span>            ClassLoader cl = classMeta.innerClass.getClassLoader();<a name="line.828"></a>
+<span class="sourceLineNo">829</span>            return (T)Proxy.newProxyInstance(cl, new Class[] { classMeta.innerClass, java.io.Serializable.class }, h);<a name="line.829"></a>
+<span class="sourceLineNo">830</span>         }<a name="line.830"></a>
+<span class="sourceLineNo">831</span>      }<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      return null;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   }<a name="line.833"></a>
+<span class="sourceLineNo">834</span><a name="line.834"></a>
+<span class="sourceLineNo">835</span>   /**<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    * Recursively determines the classes represented by parameterized types in the class hierarchy of the specified<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    * type, and puts the results in the specified map.<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    *<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    * &lt;p&gt;<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    * For example, given the following classes...<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    * &lt;p class='bcode w800'&gt;<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    *    public static class BeanA&amp;lt;T&amp;gt; {<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    *       public T x;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    *    }<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    *    public static class BeanB extends BeanA&amp;lt;Integer&gt;} {...}<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    * &lt;/p&gt;<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    * &lt;p&gt;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    *    ...calling this method on {@code BeanB.class} will load the following data into {@code m} indicating<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    *    that the {@code T} parameter on the BeanA class is implemented with an {@code Integer}:<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    * &lt;p class='bcode w800'&gt;<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    *    {BeanA.class:[Integer.class]}<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    * &lt;/p&gt;<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    *<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    * &lt;p&gt;<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    * TODO:  This code doesn't currently properly handle the following situation:<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    * &lt;p class='bcode w800'&gt;<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    *    public static class BeanB&amp;lt;T extends Number&amp;gt; extends BeanA&amp;lt;T&amp;gt;;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    *    public static class BeanC extends BeanB&amp;lt;Integer&amp;gt;;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    * &lt;/p&gt;<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    *<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    * &lt;p&gt;<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    * When called on {@code BeanC}, the variable will be detected as a {@code Number}, not an {@code Integer}.<a name="line.862"></a>
+<span class="sourceLineNo">863</span>    * If anyone can figure out a better way of doing this, please do so!<a name="line.863"></a>
+<span class="sourceLineNo">864</span>    *<a name="line.864"></a>
+<span class="sourceLineNo">865</span>    * @param t The type we're recursing.<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    * @param m Where the results are loaded.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>    */<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   static final void findTypeVarImpls(Type t, Map&lt;Class&lt;?&gt;,Class&lt;?&gt;[]&gt; m) {<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      if (t instanceof Class) {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>         Class&lt;?&gt; c = (Class&lt;?&gt;)t;<a name="line.870"></a>
+<span class="sourceLineNo">871</span>         findTypeVarImpls(c.getGenericSuperclass(), m);<a name="line.871"></a>
+<span class="sourceLineNo">872</span>         for (Type ci : c.getGenericInterfaces())<a name="line.872"></a>
+<span class="sourceLineNo">873</span>            findTypeVarImpls(ci, m);<a name="line.873"></a>
+<span class="sourceLineNo">874</span>      } else if (t instanceof ParameterizedType) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>         ParameterizedType pt = (ParameterizedType)t;<a name="line.875"></a>
+<span class="sourceLineNo">876</span>         Type rt = pt.getRawType();<a name="line.876"></a>
+<span class="sourceLineNo">877</span>         if (rt instanceof Class) {<a name="line.877"></a>
+<span class="sourceLineNo">878</span>            Type[] gImpls = pt.getActualTypeArguments();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>            Class&lt;?&gt;[] gTypes = new Class[gImpls.length];<a name="line.879"></a>
+<span class="sourceLineNo">880</span>            for (int i = 0; i &lt; gImpls.length; i++) {<a name="line.880"></a>
+<span class="sourceLineNo">881</span>               Type gt = gImpls[i];<a name="line.881"></a>
+<span class="sourceLineNo">882</span>               if (gt instanceof Class)<a name="line.882"></a>
+<span class="sourceLineNo">883</span>                  gTypes[i] = (Class&lt;?&gt;)gt;<a name="line.883"></a>
+<span class="sourceLineNo">884</span>               else if (gt instanceof TypeVariable) {<a name="line.884"></a>
+<span class="sourceLineNo">885</span>                  TypeVariable&lt;?&gt; tv = (TypeVariable&lt;?&gt;)gt;<a name="line.885"></a>
+<span class="sourceLineNo">886</span>                  for (Type upperBound : tv.getBounds())<a name="line.886"></a>
+<span class="sourceLineNo">887</span>                     if (upperBound instanceof Class)<a name="line.887"></a>
+<span class="sourceLineNo">888</span>                        gTypes[i] = (Class&lt;?&gt;)upperBound;<a name="line.888"></a>
+<span class="sourceLineNo">889</span>               }<a name="line.889"></a>
+<span class="sourceLineNo">890</span>            }<a name="line.890"></a>
+<span class="sourceLineNo">891</span>            m.put((Class&lt;?&gt;)rt, gTypes);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>            findTypeVarImpls(pt.getRawType(), m);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>         }<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      }<a name="line.894"></a>
+<span class="sourceLineNo">895</span>   }<a name="line.895"></a>
+<span class="sourceLineNo">896</span><a name="line.896"></a>
+<span class="sourceLineNo">897</span>   static final String bpName(BeanProperty bp) {<a name="line.897"></a>
+<span class="sourceLineNo">898</span>      if (bp == null)<a name="line.898"></a>
+<span class="sourceLineNo">899</span>         return null;<a name="line.899"></a>
+<span class="sourceLineNo">900</span>      if (! bp.name().isEmpty())<a name="line.900"></a>
+<span class="sourceLineNo">901</span>         return bp.name();<a name="line.901"></a>
+<span class="sourceLineNo">902</span>      return bp.value();<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   }<a name="line.903"></a>
+<span class="sourceLineNo">904</span><a name="line.904"></a>
+<span class="sourceLineNo">905</span>   @Override /* Object */<a name="line.905"></a>
+<span class="sourceLineNo">906</span>   public String toString() {<a name="line.906"></a>
+<span class="sourceLineNo">907</span>      StringBuilder sb = new StringBuilder(c.getName());<a name="line.907"></a>
+<span class="sourceLineNo">908</span>      sb.append(" {\n");<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      for (BeanPropertyMeta pm : this.properties.values())<a name="line.909"></a>
+<span class="sourceLineNo">910</span>         sb.append('\t').append(pm.toString()).append(",\n");<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      sb.append('}');<a name="line.911"></a>
+<span class="sourceLineNo">912</span>      return sb.toString();<a name="line.912"></a>
+<span class="sourceLineNo">913</span>   }<a name="line.913"></a>
+<span class="sourceLineNo">914</span>}<a name="line.914"></a>
 
 
 
diff --git a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/config/Config.html b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/config/Config.html
index e23eb8a..0e6151a 100644
--- a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/config/Config.html
+++ b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/config/Config.html
@@ -96,1867 +96,1873 @@
 <span class="sourceLineNo">088</span>    *    &lt;li&gt;Any file ending in &lt;js&gt;".cfg"&lt;/js&gt; in the home directory (names ordered alphabetically).<a name="line.88"></a>
 <span class="sourceLineNo">089</span>    *    &lt;li&gt;&lt;js&gt;"juneau.cfg"&lt;/js&gt;<a name="line.89"></a>
 <span class="sourceLineNo">090</span>    *    &lt;li&gt;&lt;js&gt;"default.cfg"&lt;/js&gt;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    * &lt;/ol&gt;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    * &lt;p&gt;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    *<a name="line.93"></a>
-<span class="sourceLineNo">094</span>    * @return<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    *    A list of candidate file names.<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    *    &lt;br&gt;The returned list is modifiable.<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    *    &lt;br&gt;Each call constructs a new list.<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    */<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   public synchronized static List&lt;String&gt; getCandidateSystemDefaultConfigNames() {<a name="line.99"></a>
-<span class="sourceLineNo">100</span>      List&lt;String&gt; l = new ArrayList&lt;&gt;();<a name="line.100"></a>
-<span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>      String s = System.getProperty("juneau.configFile");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      if (s != null) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>         l.add(s);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>         return l;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>      }<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>      String cmd = System.getProperty("sun.java.command", "not_found").split("\\s+")[0];<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      if (cmd.endsWith(".jar") &amp;&amp; ! cmd.contains("surefirebooter")) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>         cmd = cmd.replaceAll(".*?([^\\\\\\/]+)\\.jar$", "$1");<a name="line.110"></a>
-<span class="sourceLineNo">111</span>         l.add(cmd + ".cfg");<a name="line.111"></a>
-<span class="sourceLineNo">112</span>         cmd = cmd.replaceAll("[\\.\\_].*$", "");  // Try also without version in jar name.<a name="line.112"></a>
-<span class="sourceLineNo">113</span>         l.add(cmd + ".cfg");<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      }<a name="line.114"></a>
-<span class="sourceLineNo">115</span><a name="line.115"></a>
-<span class="sourceLineNo">116</span>      Set&lt;File&gt; files = new TreeSet&lt;&gt;(Arrays.asList(new File(".").listFiles()));<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      for (File f : files)<a name="line.117"></a>
-<span class="sourceLineNo">118</span>         if (f.getName().endsWith(".cfg"))<a name="line.118"></a>
-<span class="sourceLineNo">119</span>            l.add(f.getName());<a name="line.119"></a>
-<span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>      l.add("juneau.cfg");<a name="line.121"></a>
-<span class="sourceLineNo">122</span>      l.add("default.cfg");<a name="line.122"></a>
+<span class="sourceLineNo">091</span>    *    &lt;li&gt;&lt;js&gt;"application.cfg"&lt;/js&gt;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    *    &lt;li&gt;&lt;js&gt;"app.cfg"&lt;/js&gt;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    *    &lt;li&gt;&lt;js&gt;"settings.cfg"&lt;/js&gt;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    * &lt;/ol&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    * &lt;p&gt;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    *<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    * @return<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    *    A list of candidate file names.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    *    &lt;br&gt;The returned list is modifiable.<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    *    &lt;br&gt;Each call constructs a new list.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   public synchronized static List&lt;String&gt; getCandidateSystemDefaultConfigNames() {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      List&lt;String&gt; l = new ArrayList&lt;&gt;();<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>      String s = System.getProperty("juneau.configFile");<a name="line.105"></a>
+<span class="sourceLineNo">106</span>      if (s != null) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>         l.add(s);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>         return l;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>      String cmd = System.getProperty("sun.java.command", "not_found").split("\\s+")[0];<a name="line.111"></a>
+<span class="sourceLineNo">112</span>      if (cmd.endsWith(".jar") &amp;&amp; ! cmd.contains("surefirebooter")) {<a name="line.112"></a>
+<span class="sourceLineNo">113</span>         cmd = cmd.replaceAll(".*?([^\\\\\\/]+)\\.jar$", "$1");<a name="line.113"></a>
+<span class="sourceLineNo">114</span>         l.add(cmd + ".cfg");<a name="line.114"></a>
+<span class="sourceLineNo">115</span>         cmd = cmd.replaceAll("[\\.\\_].*$", "");  // Try also without version in jar name.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>         l.add(cmd + ".cfg");<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>      Set&lt;File&gt; files = new TreeSet&lt;&gt;(Arrays.asList(new File(".").listFiles()));<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      for (File f : files)<a name="line.120"></a>
+<span class="sourceLineNo">121</span>         if (f.getName().endsWith(".cfg"))<a name="line.121"></a>
+<span class="sourceLineNo">122</span>            l.add(f.getName());<a name="line.122"></a>
 <span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>      return l;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>   private synchronized static Config find(String name) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      if (name == null)<a name="line.128"></a>
-<span class="sourceLineNo">129</span>         return null;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      if (ConfigFileStore.DEFAULT.exists(name))<a name="line.130"></a>
-<span class="sourceLineNo">131</span>         return Config.create(name).store(ConfigFileStore.DEFAULT).build();<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      if (ConfigClasspathStore.DEFAULT.exists(name))<a name="line.132"></a>
-<span class="sourceLineNo">133</span>         return Config.create(name).store(ConfigClasspathStore.DEFAULT).build();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      return null;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>   //-------------------------------------------------------------------------------------------------------------------<a name="line.137"></a>
-<span class="sourceLineNo">138</span>   // Configurable properties<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   //-------------------------------------------------------------------------------------------------------------------<a name="line.139"></a>
-<span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>   private static final String PREFIX = "Config.";<a name="line.141"></a>
+<span class="sourceLineNo">124</span>      l.add("juneau.cfg");<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      l.add("default.cfg");<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      l.add("application.cfg");<a name="line.126"></a>
+<span class="sourceLineNo">127</span>      l.add("app.cfg");<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      l.add("settings.cfg");<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>      return l;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>   }<a name="line.131"></a>
+<span class="sourceLineNo">132</span><a name="line.132"></a>
+<span class="sourceLineNo">133</span>   private synchronized static Config find(String name) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      if (name == null)<a name="line.134"></a>
+<span class="sourceLineNo">135</span>         return null;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>      if (ConfigFileStore.DEFAULT.exists(name))<a name="line.136"></a>
+<span class="sourceLineNo">137</span>         return Config.create(name).store(ConfigFileStore.DEFAULT).build();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>      if (ConfigClasspathStore.DEFAULT.exists(name))<a name="line.138"></a>
+<span class="sourceLineNo">139</span>         return Config.create(name).store(ConfigClasspathStore.DEFAULT).build();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      return null;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   }<a name="line.141"></a>
 <span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>   /**<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    * Configuration property:  Configuration name.<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    *<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    * &lt;ul&gt;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.name.s"&lt;/js&gt;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  &lt;code&gt;String&lt;/code&gt;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  &lt;js&gt;"Configuration.cfg"&lt;/js&gt;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    *       &lt;ul&gt;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#name(String)}<a name="line.153"></a>
-<span class="sourceLineNo">154</span>    *       &lt;/ul&gt;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    * &lt;/ul&gt;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    *<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    * &lt;p&gt;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    * Specifies the configuration name.<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    * &lt;br&gt;This is typically the configuration file name, although<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    * the name can be anything identifiable by the {@link ConfigStore} used for retrieving and storing the configuration.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   public static final String CONFIG_name = PREFIX + "name.s";<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>   /**<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    * Configuration property:  Configuration store.<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    *<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    * &lt;ul&gt;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.store.o"&lt;/js&gt;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link ConfigStore}<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link ConfigFileStore#DEFAULT}<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    *       &lt;ul&gt;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#store(ConfigStore)}<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    *       &lt;/ul&gt;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    * &lt;/ul&gt;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    *<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    * &lt;p&gt;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    * The configuration store used for retrieving and storing configurations.<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    */<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   public static final String CONFIG_store = PREFIX + "store.o";<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>   /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    * Configuration property:  POJO serializer.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    *<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    * &lt;ul&gt;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.serializer.o"&lt;/js&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link WriterSerializer}<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link SimpleJsonSerializer#DEFAULT}<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    *       &lt;ul&gt;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#serializer(Class)}<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#serializer(WriterSerializer)}<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    *       &lt;/ul&gt;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    * &lt;/ul&gt;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    *<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    * &lt;p&gt;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    * The serializer to use for serializing POJO values.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    */<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   public static final String CONFIG_serializer = PREFIX + "serializer.o";<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>   /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    * Configuration property:  POJO parser.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    *<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    * &lt;ul&gt;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.parser.o"&lt;/js&gt;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link ReaderParser}<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link JsonParser#DEFAULT}<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    *       &lt;ul&gt;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#parser(Class)}<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#parser(ReaderParser)}<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    *       &lt;/ul&gt;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    * &lt;/ul&gt;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    *<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    * &lt;p&gt;<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    * The parser to use for parsing values to POJOs.<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    */<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   public static final String CONFIG_parser = PREFIX + "parser.o";<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>   /**<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    * Configuration property:  Value encoder.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    *<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    * &lt;ul&gt;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.encoder.o"&lt;/js&gt;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link ConfigEncoder}<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link ConfigXorEncoder#INSTANCE}<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    *       &lt;ul&gt;<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#encoder(Class)}<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#encoder(ConfigEncoder)}<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    *       &lt;/ul&gt;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    * &lt;/ul&gt;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    *<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    * &lt;p&gt;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    * The encoder to use for encoding encoded configuration values.<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    */<a name="line.245"></a>
-<span class="sourceLineNo">246</span>   public static final String CONFIG_encoder = PREFIX + "encoder.o";<a name="line.246"></a>
-<span class="sourceLineNo">247</span><a name="line.247"></a>
-<span class="sourceLineNo">248</span>   /**<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    * Configuration property:  SVL variable resolver.<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    *<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    * &lt;ul&gt;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.varResolver.o"&lt;/js&gt;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link VarResolver}<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link VarResolver#DEFAULT}<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    *       &lt;ul&gt;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#varResolver(Class)}<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#varResolver(VarResolver)}<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    *       &lt;/ul&gt;<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    * &lt;/ul&gt;<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    *<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    * &lt;p&gt;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    * The resolver to use for resolving SVL variables.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    */<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   public static final String CONFIG_varResolver = PREFIX + "varResolver.o";<a name="line.267"></a>
-<span class="sourceLineNo">268</span><a name="line.268"></a>
-<span class="sourceLineNo">269</span>   /**<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    * Configuration property:  Binary value line length.<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    *<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    * &lt;ul&gt;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.binaryLineLength.i"&lt;/js&gt;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  &lt;code&gt;Integer&lt;/code&gt;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  &lt;code&gt;-1&lt;/code&gt;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    *       &lt;ul&gt;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#binaryLineLength(int)}<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    *       &lt;/ul&gt;<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    * &lt;/ul&gt;<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    *<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    * &lt;p&gt;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    * When serializing binary values, lines will be split after this many characters.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    * &lt;br&gt;Use &lt;code&gt;-1&lt;/code&gt; to represent no line splitting.<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    */<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   public static final String CONFIG_binaryLineLength = PREFIX + "binaryLineLength.i";<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>   /**<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    * Configuration property:  Binary value format.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    *<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    * &lt;ul&gt;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.binaryFormat.s"&lt;/js&gt;<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link BinaryFormat}<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link BinaryFormat#BASE64}<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    *       &lt;ul&gt;<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#binaryFormat(BinaryFormat)}<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    *       &lt;/ul&gt;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    * &lt;/ul&gt;<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    *<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    * &lt;p&gt;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    * The format to use when persisting byte arrays.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    *<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    * &lt;p&gt;<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    * Possible values:<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    * &lt;ul&gt;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    *    &lt;li&gt;{@link BinaryFormat#BASE64} - BASE64-encoded string.<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    *    &lt;li&gt;{@link BinaryFormat#HEX} - Hexadecimal.<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    *    &lt;li&gt;{@link BinaryFormat#SPACED_HEX} - Hexadecimal with spaces between bytes.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    * &lt;/ul&gt;<a name="line.314"></a>
-<span class="sourceLineNo">315</span>    */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>   public static final String CONFIG_binaryFormat = PREFIX + "binaryFormat.s";<a name="line.316"></a>
-<span class="sourceLineNo">317</span><a name="line.317"></a>
-<span class="sourceLineNo">318</span>   /**<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    * Configuration property:  Multi-line values should always be on separate lines.<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    *<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    * &lt;ul&gt;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.multiLineValuesOnSeparateLines.b"&lt;/js&gt;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  &lt;code&gt;Boolean&lt;/code&gt;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  &lt;jk&gt;false&lt;/jk&gt;<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    *       &lt;ul&gt;<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#multiLineValuesOnSeparateLines()}<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    *       &lt;/ul&gt;<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    * &lt;/ul&gt;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    *<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    * &lt;p&gt;<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    * When enabled, multi-line values will always be placed on a separate line from the key.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   public static final String CONFIG_multiLineValuesOnSeparateLines = PREFIX + "multiLineValuesOnSeparateLines.b";<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>   /**<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    * Configuration property:  Read-only.<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    *<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    * &lt;ul&gt;<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.readOnly.b"&lt;/js&gt;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  &lt;code&gt;Boolean&lt;/code&gt;<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  &lt;jk&gt;false&lt;/jk&gt;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    *       &lt;ul&gt;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#readOnly()}<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    *       &lt;/ul&gt;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    * &lt;/ul&gt;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    *<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    * &lt;p&gt;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    * When enabled, attempts to call any setters on this object will throw an {@link UnsupportedOperationException}.<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    */<a name="line.355"></a>
-<span class="sourceLineNo">356</span>   public static final String CONFIG_readOnly = PREFIX + "readOnly.b";<a name="line.356"></a>
-<span class="sourceLineNo">357</span><a name="line.357"></a>
-<span class="sourceLineNo">358</span>   //-------------------------------------------------------------------------------------------------------------------<a name="line.358"></a>
-<span class="sourceLineNo">359</span>   // Instance<a name="line.359"></a>
-<span class="sourceLineNo">360</span>   //-------------------------------------------------------------------------------------------------------------------<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>   private final String name;<a name="line.362"></a>
-<span class="sourceLineNo">363</span>   private final ConfigStore store;<a name="line.363"></a>
-<span class="sourceLineNo">364</span>   private final WriterSerializer serializer;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   private final ReaderParser parser;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>   private final ConfigEncoder encoder;<a name="line.366"></a>
-<span class="sourceLineNo">367</span>   private final VarResolverSession varSession;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>   private final int binaryLineLength;<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   private final BinaryFormat binaryFormat;<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   private final boolean multiLineValuesOnSeparateLines, readOnly;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   private final ConfigMap configMap;<a name="line.371"></a>
-<span class="sourceLineNo">372</span>   private final BeanSession beanSession;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>   private final List&lt;ConfigEventListener&gt; listeners = Collections.synchronizedList(new LinkedList&lt;ConfigEventListener&gt;());<a name="line.373"></a>
-<span class="sourceLineNo">374</span><a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>   /**<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    * Instantiates a new clean-slate {@link ConfigBuilder} object.<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    *<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    * &lt;p&gt;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>    * This is equivalent to simply calling &lt;code&gt;&lt;jk&gt;new&lt;/jk&gt; ConfigBuilder()&lt;/code&gt;.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    *<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    * @return A new {@link ConfigBuilder} object.<a name="line.382"></a>
-<span class="sourceLineNo">383</span>    */<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   public static ConfigBuilder create() {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      return new ConfigBuilder();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   }<a name="line.386"></a>
-<span class="sourceLineNo">387</span><a name="line.387"></a>
-<span class="sourceLineNo">388</span>   /**<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    * Same as {@link #create()} but initializes the builder with the specified config name.<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    *<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    * &lt;p&gt;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    * This is equivalent to simply calling &lt;code&gt;&lt;jk&gt;new&lt;/jk&gt; ConfigBuilder().name(name)&lt;/code&gt;.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    *<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    * @param name The configuration name.<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    * @return A new {@link ConfigBuilder} object.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    */<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   public static ConfigBuilder create(String name) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      return new ConfigBuilder().name(name);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>   @Override /* Context */<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   public ConfigBuilder builder() {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      return new ConfigBuilder(getPropertyStore());<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   }<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>   /**<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    * Constructor.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    *<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    * @param ps<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    *    The property store containing all the settings for this object.<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    * @throws IOException<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    */<a name="line.412"></a>
-<span class="sourceLineNo">413</span>   public Config(PropertyStore ps) throws IOException {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      super(ps, true);<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>      name = getStringProperty(CONFIG_name, "Configuration.cfg");<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      store = getInstanceProperty(CONFIG_store, ConfigStore.class, ConfigFileStore.DEFAULT);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>      configMap = store.getMap(name);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>      configMap.register(this);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      serializer = getInstanceProperty(CONFIG_serializer, WriterSerializer.class, SimpleJsonSerializer.DEFAULT);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      parser = getInstanceProperty(CONFIG_parser, ReaderParser.class, JsonParser.DEFAULT);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>      beanSession = parser.createBeanSession();<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      encoder = getInstanceProperty(CONFIG_encoder, ConfigEncoder.class, ConfigXorEncoder.INSTANCE);<a name="line.423"></a>
-<span class="sourceLineNo">424</span>      varSession = getInstanceProperty(CONFIG_varResolver, VarResolver.class, VarResolver.DEFAULT)<a name="line.424"></a>
-<span class="sourceLineNo">425</span>         .builder()<a name="line.425"></a>
-<span class="sourceLineNo">426</span>         .vars(ConfigVar.class)<a name="line.426"></a>
-<span class="sourceLineNo">427</span>         .contextObject(ConfigVar.SESSION_config, this)<a name="line.427"></a>
-<span class="sourceLineNo">428</span>         .build()<a name="line.428"></a>
-<span class="sourceLineNo">429</span>         .createSession();<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      binaryLineLength = getIntegerProperty(CONFIG_binaryLineLength, -1);<a name="line.430"></a>
-<span class="sourceLineNo">431</span>      binaryFormat = getProperty(CONFIG_binaryFormat, BinaryFormat.class, BinaryFormat.BASE64);<a name="line.431"></a>
-<span class="sourceLineNo">432</span>      multiLineValuesOnSeparateLines = getBooleanProperty(CONFIG_multiLineValuesOnSeparateLines, false);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      readOnly = getBooleanProperty(CONFIG_readOnly, false);<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   }<a name="line.434"></a>
-<span class="sourceLineNo">435</span><a name="line.435"></a>
-<span class="sourceLineNo">436</span>   Config(Config copyFrom, VarResolverSession varSession) {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      super(null, true);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      name = copyFrom.name;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      store = copyFrom.store;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>      configMap = copyFrom.configMap;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>      configMap.register(this);<a name="line.441"></a>
-<span class="sourceLineNo">442</span>      serializer = copyFrom.serializer;<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      parser = copyFrom.parser;<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      encoder = copyFrom.encoder;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      this.varSession = varSession;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      binaryLineLength = copyFrom.binaryLineLength;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      binaryFormat = copyFrom.binaryFormat;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      multiLineValuesOnSeparateLines = copyFrom.multiLineValuesOnSeparateLines;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      readOnly = copyFrom.readOnly;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      beanSession = copyFrom.beanSession;<a name="line.450"></a>
-<span class="sourceLineNo">451</span>   }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>   /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    * Creates a copy of this config using the specified var session for resolving variables.<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    *<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    * &lt;p&gt;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    * This creates a shallow copy of the config but replacing the variable resolver.<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    *<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    * @param varSession The var session used for resolving string variables.<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    * @return A new config object.<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    */<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   public Config resolving(VarResolverSession varSession) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      return new Config(this, varSession);<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   }<a name="line.464"></a>
-<span class="sourceLineNo">465</span><a name="line.465"></a>
-<span class="sourceLineNo">466</span>   /**<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    * Returns the name associated with this config (usually a file name).<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    *<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    * @return The name associated with this config, or &lt;jk&gt;null&lt;/jk&gt; if it has no name.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    */<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   public String getName() {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>      return name;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   }<a name="line.473"></a>
-<span class="sourceLineNo">474</span><a name="line.474"></a>
-<span class="sourceLineNo">475</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   // Workhorse getters<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.477"></a>
-<span class="sourceLineNo">478</span><a name="line.478"></a>
-<span class="sourceLineNo">479</span>   /**<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    * Returns the specified value as a string from the config file.<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    *<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    * &lt;p&gt;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    * Unlike {@link #getString(String)}, this method doesn't replace SVL variables.<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    *<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    * @param key The key.<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or value doesn't exist.<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    */<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   public String get(String key) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>      String sname = sname(key);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      String skey = skey(key);<a name="line.491"></a>
-<span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>      ConfigEntry ce = configMap.getEntry(sname, skey);<a name="line.493"></a>
-<span class="sourceLineNo">494</span><a name="line.494"></a>
-<span class="sourceLineNo">495</span>      if (ce == null || ce.getValue() == null)<a name="line.495"></a>
-<span class="sourceLineNo">496</span>         return null;<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>      String val = ce.getValue();<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      for (ConfigMod m : ConfigMod.asModifiersReverse(ce.getModifiers())) {<a name="line.499"></a>
-<span class="sourceLineNo">500</span>         if (m == ENCODED) {<a name="line.500"></a>
-<span class="sourceLineNo">501</span>            if (encoder.isEncoded(val))<a name="line.501"></a>
-<span class="sourceLineNo">502</span>               val = encoder.decode(key, val);<a name="line.502"></a>
-<span class="sourceLineNo">503</span>         }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      }<a name="line.504"></a>
-<span class="sourceLineNo">505</span><a name="line.505"></a>
-<span class="sourceLineNo">506</span>      return val;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>   }<a name="line.507"></a>
-<span class="sourceLineNo">508</span><a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.510"></a>
-<span class="sourceLineNo">511</span>   // Workhorse setters<a name="line.511"></a>
-<span class="sourceLineNo">512</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>   /**<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    * Sets a value in this config.<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    *<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    * @param key The key.<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    * @param value The value.<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    * @return This object (for method chaining).<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    */<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   public Config set(String key, String value) {<a name="line.522"></a>
-<span class="sourceLineNo">523</span>      checkWrite();<a name="line.523"></a>
-<span class="sourceLineNo">524</span>      assertFieldNotNull(key, "key");<a name="line.524"></a>
-<span class="sourceLineNo">525</span>      String sname = sname(key);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      String skey = skey(key);<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>      ConfigEntry ce = configMap.getEntry(sname, skey);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      if (ce == null &amp;&amp; value == null)<a name="line.529"></a>
-<span class="sourceLineNo">530</span>         return this;<a name="line.530"></a>
-<span class="sourceLineNo">531</span><a name="line.531"></a>
-<span class="sourceLineNo">532</span>      String mod = ce == null ? "" : ce.getModifiers();<a name="line.532"></a>
+<span class="sourceLineNo">143</span>   //-------------------------------------------------------------------------------------------------------------------<a name="line.143"></a>
+<span class="sourceLineNo">144</span>   // Configurable properties<a name="line.144"></a>
+<span class="sourceLineNo">145</span>   //-------------------------------------------------------------------------------------------------------------------<a name="line.145"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>   private static final String PREFIX = "Config.";<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>   /**<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    * Configuration property:  Configuration name.<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    *<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    * &lt;ul&gt;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.name.s"&lt;/js&gt;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  &lt;code&gt;String&lt;/code&gt;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  &lt;js&gt;"Configuration.cfg"&lt;/js&gt;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    *       &lt;ul&gt;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#name(String)}<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    *       &lt;/ul&gt;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    * &lt;/ul&gt;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    *<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    * &lt;p&gt;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    * Specifies the configuration name.<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    * &lt;br&gt;This is typically the configuration file name, although<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    * the name can be anything identifiable by the {@link ConfigStore} used for retrieving and storing the configuration.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    */<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   public static final String CONFIG_name = PREFIX + "name.s";<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>   /**<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    * Configuration property:  Configuration store.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    *<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    * &lt;ul&gt;<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.store.o"&lt;/js&gt;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link ConfigStore}<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link ConfigFileStore#DEFAULT}<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    *       &lt;ul&gt;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#store(ConfigStore)}<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    *       &lt;/ul&gt;<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    * &lt;/ul&gt;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    *<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    * &lt;p&gt;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    * The configuration store used for retrieving and storing configurations.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   public static final String CONFIG_store = PREFIX + "store.o";<a name="line.189"></a>
+<span class="sourceLineNo">190</span><a name="line.190"></a>
+<span class="sourceLineNo">191</span>   /**<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    * Configuration property:  POJO serializer.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    *<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    * &lt;ul&gt;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.serializer.o"&lt;/js&gt;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link WriterSerializer}<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link SimpleJsonSerializer#DEFAULT}<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>    *       &lt;ul&gt;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#serializer(Class)}<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#serializer(WriterSerializer)}<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    *       &lt;/ul&gt;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    * &lt;/ul&gt;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    *<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    * &lt;p&gt;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    * The serializer to use for serializing POJO values.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    */<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   public static final String CONFIG_serializer = PREFIX + "serializer.o";<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>   /**<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    * Configuration property:  POJO parser.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    *<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    * &lt;ul&gt;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.parser.o"&lt;/js&gt;<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link ReaderParser}<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link JsonParser#DEFAULT}<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    *       &lt;ul&gt;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#parser(Class)}<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#parser(ReaderParser)}<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    *       &lt;/ul&gt;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    * &lt;/ul&gt;<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    * &lt;p&gt;<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    * The parser to use for parsing values to POJOs.<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    */<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   public static final String CONFIG_parser = PREFIX + "parser.o";<a name="line.231"></a>
+<span class="sourceLineNo">232</span><a name="line.232"></a>
+<span class="sourceLineNo">233</span>   /**<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    * Configuration property:  Value encoder.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    *<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    * &lt;ul&gt;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.encoder.o"&lt;/js&gt;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link ConfigEncoder}<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link ConfigXorEncoder#INSTANCE}<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    *       &lt;ul&gt;<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#encoder(Class)}<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#encoder(ConfigEncoder)}<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    *       &lt;/ul&gt;<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    * &lt;/ul&gt;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    *<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    * &lt;p&gt;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    * The encoder to use for encoding encoded configuration values.<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    */<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   public static final String CONFIG_encoder = PREFIX + "encoder.o";<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>   /**<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    * Configuration property:  SVL variable resolver.<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    *<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    * &lt;ul&gt;<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.varResolver.o"&lt;/js&gt;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link VarResolver}<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link VarResolver#DEFAULT}<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    *       &lt;ul&gt;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#varResolver(Class)}<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#varResolver(VarResolver)}<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    *       &lt;/ul&gt;<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    * &lt;/ul&gt;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    *<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    * &lt;p&gt;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    * The resolver to use for resolving SVL variables.<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    */<a name="line.272"></a>
+<span class="sourceLineNo">273</span>   public static final String CONFIG_varResolver = PREFIX + "varResolver.o";<a name="line.273"></a>
+<span class="sourceLineNo">274</span><a name="line.274"></a>
+<span class="sourceLineNo">275</span>   /**<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    * Configuration property:  Binary value line length.<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    *<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    * &lt;ul&gt;<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.binaryLineLength.i"&lt;/js&gt;<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  &lt;code&gt;Integer&lt;/code&gt;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  &lt;code&gt;-1&lt;/code&gt;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    *       &lt;ul&gt;<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#binaryLineLength(int)}<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    *       &lt;/ul&gt;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    * &lt;/ul&gt;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    *<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    * &lt;p&gt;<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    * When serializing binary values, lines will be split after this many characters.<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    * &lt;br&gt;Use &lt;code&gt;-1&lt;/code&gt; to represent no line splitting.<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    */<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   public static final String CONFIG_binaryLineLength = PREFIX + "binaryLineLength.i";<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>   /**<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    * Configuration property:  Binary value format.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    *<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    * &lt;ul&gt;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.binaryFormat.s"&lt;/js&gt;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  {@link BinaryFormat}<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  {@link BinaryFormat#BASE64}<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    *       &lt;ul&gt;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#binaryFormat(BinaryFormat)}<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    *       &lt;/ul&gt;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    * &lt;/ul&gt;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    *<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    * &lt;p&gt;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    * The format to use when persisting byte arrays.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    *<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    * &lt;p&gt;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    * Possible values:<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    * &lt;ul&gt;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    *    &lt;li&gt;{@link BinaryFormat#BASE64} - BASE64-encoded string.<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    *    &lt;li&gt;{@link BinaryFormat#HEX} - Hexadecimal.<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    *    &lt;li&gt;{@link BinaryFormat#SPACED_HEX} - Hexadecimal with spaces between bytes.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    * &lt;/ul&gt;<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    */<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   public static final String CONFIG_binaryFormat = PREFIX + "binaryFormat.s";<a name="line.322"></a>
+<span class="sourceLineNo">323</span><a name="line.323"></a>
+<span class="sourceLineNo">324</span>   /**<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    * Configuration property:  Multi-line values should always be on separate lines.<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    *<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    * &lt;ul&gt;<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.multiLineValuesOnSeparateLines.b"&lt;/js&gt;<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  &lt;code&gt;Boolean&lt;/code&gt;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  &lt;jk&gt;false&lt;/jk&gt;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    *       &lt;ul&gt;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#multiLineValuesOnSeparateLines()}<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    *       &lt;/ul&gt;<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    * &lt;/ul&gt;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    *<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    * &lt;p&gt;<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    * When enabled, multi-line values will always be placed on a separate line from the key.<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   public static final String CONFIG_multiLineValuesOnSeparateLines = PREFIX + "multiLineValuesOnSeparateLines.b";<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>   /**<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    * Configuration property:  Read-only.<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    *<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    * &lt;h5 class='section'&gt;Property:&lt;/h5&gt;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    * &lt;ul&gt;<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    *    &lt;li&gt;&lt;b&gt;Name:&lt;/b&gt;  &lt;js&gt;"Config.readOnly.b"&lt;/js&gt;<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    *    &lt;li&gt;&lt;b&gt;Data type:&lt;/b&gt;  &lt;code&gt;Boolean&lt;/code&gt;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    *    &lt;li&gt;&lt;b&gt;Default:&lt;/b&gt;  &lt;jk&gt;false&lt;/jk&gt;<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    *    &lt;li&gt;&lt;b&gt;Methods:&lt;/b&gt;<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    *       &lt;ul&gt;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    *          &lt;li class='jm'&gt;{@link ConfigBuilder#readOnly()}<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    *       &lt;/ul&gt;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    * &lt;/ul&gt;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    *<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    * &lt;h5 class='section'&gt;Description:&lt;/h5&gt;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    * &lt;p&gt;<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    * When enabled, attempts to call any setters on this object will throw an {@link UnsupportedOperationException}.<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>   public static final String CONFIG_readOnly = PREFIX + "readOnly.b";<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>   //-------------------------------------------------------------------------------------------------------------------<a name="line.364"></a>
+<span class="sourceLineNo">365</span>   // Instance<a name="line.365"></a>
+<span class="sourceLineNo">366</span>   //-------------------------------------------------------------------------------------------------------------------<a name="line.366"></a>
+<span class="sourceLineNo">367</span><a name="line.367"></a>
+<span class="sourceLineNo">368</span>   private final String name;<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   private final ConfigStore store;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   private final WriterSerializer serializer;<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   private final ReaderParser parser;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   private final ConfigEncoder encoder;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   private final VarResolverSession varSession;<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   private final int binaryLineLength;<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   private final BinaryFormat binaryFormat;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   private final boolean multiLineValuesOnSeparateLines, readOnly;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   private final ConfigMap configMap;<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   private final BeanSession beanSession;<a name="line.378"></a>
+<span class="sourceLineNo">379</span>   private final List&lt;ConfigEventListener&gt; listeners = Collections.synchronizedList(new LinkedList&lt;ConfigEventListener&gt;());<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>   /**<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    * Instantiates a new clean-slate {@link ConfigBuilder} object.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    *<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    * &lt;p&gt;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    * This is equivalent to simply calling &lt;code&gt;&lt;jk&gt;new&lt;/jk&gt; ConfigBuilder()&lt;/code&gt;.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    *<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    * @return A new {@link ConfigBuilder} object.<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>   public static ConfigBuilder create() {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      return new ConfigBuilder();<a name="line.391"></a>
+<span class="sourceLineNo">392</span>   }<a name="line.392"></a>
+<span class="sourceLineNo">393</span><a name="line.393"></a>
+<span class="sourceLineNo">394</span>   /**<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    * Same as {@link #create()} but initializes the builder with the specified config name.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    *<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    * &lt;p&gt;<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    * This is equivalent to simply calling &lt;code&gt;&lt;jk&gt;new&lt;/jk&gt; ConfigBuilder().name(name)&lt;/code&gt;.<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    *<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    * @param name The configuration name.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    * @return A new {@link ConfigBuilder} object.<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    */<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   public static ConfigBuilder create(String name) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      return new ConfigBuilder().name(name);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>   }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>   @Override /* Context */<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   public ConfigBuilder builder() {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      return new ConfigBuilder(getPropertyStore());<a name="line.409"></a>
+<span class="sourceLineNo">410</span>   }<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>   /**<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    * Constructor.<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    *<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    * @param ps<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    *    The property store containing all the settings for this object.<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    * @throws IOException<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    */<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   public Config(PropertyStore ps) throws IOException {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      super(ps, true);<a name="line.420"></a>
+<span class="sourceLineNo">421</span><a name="line.421"></a>
+<span class="sourceLineNo">422</span>      name = getStringProperty(CONFIG_name, "Configuration.cfg");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      store = getInstanceProperty(CONFIG_store, ConfigStore.class, ConfigFileStore.DEFAULT);<a name="line.423"></a>
+<span class="sourceLineNo">424</span>      configMap = store.getMap(name);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      configMap.register(this);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>      serializer = getInstanceProperty(CONFIG_serializer, WriterSerializer.class, SimpleJsonSerializer.DEFAULT);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>      parser = getInstanceProperty(CONFIG_parser, ReaderParser.class, JsonParser.DEFAULT);<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      beanSession = parser.createBeanSession();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      encoder = getInstanceProperty(CONFIG_encoder, ConfigEncoder.class, ConfigXorEncoder.INSTANCE);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>      varSession = getInstanceProperty(CONFIG_varResolver, VarResolver.class, VarResolver.DEFAULT)<a name="line.430"></a>
+<span class="sourceLineNo">431</span>         .builder()<a name="line.431"></a>
+<span class="sourceLineNo">432</span>         .vars(ConfigVar.class)<a name="line.432"></a>
+<span class="sourceLineNo">433</span>         .contextObject(ConfigVar.SESSION_config, this)<a name="line.433"></a>
+<span class="sourceLineNo">434</span>         .build()<a name="line.434"></a>
+<span class="sourceLineNo">435</span>         .createSession();<a name="line.435"></a>
+<span class="sourceLineNo">436</span>      binaryLineLength = getIntegerProperty(CONFIG_binaryLineLength, -1);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      binaryFormat = getProperty(CONFIG_binaryFormat, BinaryFormat.class, BinaryFormat.BASE64);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      multiLineValuesOnSeparateLines = getBooleanProperty(CONFIG_multiLineValuesOnSeparateLines, false);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      readOnly = getBooleanProperty(CONFIG_readOnly, false);<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   }<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>   Config(Config copyFrom, VarResolverSession varSession) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      super(null, true);<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      name = copyFrom.name;<a name="line.444"></a>
+<span class="sourceLineNo">445</span>      store = copyFrom.store;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      configMap = copyFrom.configMap;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>      configMap.register(this);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      serializer = copyFrom.serializer;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      parser = copyFrom.parser;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>      encoder = copyFrom.encoder;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      this.varSession = varSession;<a name="line.451"></a>
+<span class="sourceLineNo">452</span>      binaryLineLength = copyFrom.binaryLineLength;<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      binaryFormat = copyFrom.binaryFormat;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      multiLineValuesOnSeparateLines = copyFrom.multiLineValuesOnSeparateLines;<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      readOnly = copyFrom.readOnly;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      beanSession = copyFrom.beanSession;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>   }<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>   /**<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    * Creates a copy of this config using the specified var session for resolving variables.<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    *<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    * &lt;p&gt;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    * This creates a shallow copy of the config but replacing the variable resolver.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    *<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    * @param varSession The var session used for resolving string variables.<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    * @return A new config object.<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    */<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   public Config resolving(VarResolverSession varSession) {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      return new Config(this, varSession);<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   }<a name="line.470"></a>
+<span class="sourceLineNo">471</span><a name="line.471"></a>
+<span class="sourceLineNo">472</span>   /**<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    * Returns the name associated with this config (usually a file name).<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    *<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    * @return The name associated with this config, or &lt;jk&gt;null&lt;/jk&gt; if it has no name.<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    */<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   public String getName() {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      return name;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   }<a name="line.479"></a>
+<span class="sourceLineNo">480</span><a name="line.480"></a>
+<span class="sourceLineNo">481</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   // Workhorse getters<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.483"></a>
+<span class="sourceLineNo">484</span><a name="line.484"></a>
+<span class="sourceLineNo">485</span>   /**<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    * Returns the specified value as a string from the config file.<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    *<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    * &lt;p&gt;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    * Unlike {@link #getString(String)}, this method doesn't replace SVL variables.<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    *<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    * @param key The key.<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or value doesn't exist.<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    */<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   public String get(String key) {<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>      String sname = sname(key);<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      String skey = skey(key);<a name="line.497"></a>
+<span class="sourceLineNo">498</span><a name="line.498"></a>
+<span class="sourceLineNo">499</span>      ConfigEntry ce = configMap.getEntry(sname, skey);<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>      if (ce == null || ce.getValue() == null)<a name="line.501"></a>
+<span class="sourceLineNo">502</span>         return null;<a name="line.502"></a>
+<span class="sourceLineNo">503</span><a name="line.503"></a>
+<span class="sourceLineNo">504</span>      String val = ce.getValue();<a name="line.504"></a>
+<span class="sourceLineNo">505</span>      for (ConfigMod m : ConfigMod.asModifiersReverse(ce.getModifiers())) {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>         if (m == ENCODED) {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>            if (encoder.isEncoded(val))<a name="line.507"></a>
+<span class="sourceLineNo">508</span>               val = encoder.decode(key, val);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>         }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>      return val;<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   }<a name="line.513"></a>
+<span class="sourceLineNo">514</span><a name="line.514"></a>
+<span class="sourceLineNo">515</span><a name="line.515"></a>
+<span class="sourceLineNo">516</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   // Workhorse setters<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.518"></a>
+<span class="sourceLineNo">519</span><a name="line.519"></a>
+<span class="sourceLineNo">520</span>   /**<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    * Sets a value in this config.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    *<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    * @param key The key.<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    * @param value The value.<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    * @return This object (for method chaining).<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    */<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   public Config set(String key, String value) {<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      checkWrite();<a name="line.529"></a>
+<span class="sourceLineNo">530</span>      assertFieldNotNull(key, "key");<a name="line.530"></a>
+<span class="sourceLineNo">531</span>      String sname = sname(key);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>      String skey = skey(key);<a name="line.532"></a>
 <span class="sourceLineNo">533</span><a name="line.533"></a>
-<span class="sourceLineNo">534</span>      String s = asString(value);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      for (ConfigMod m : ConfigMod.asModifiers(mod)) {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>         if (m == ENCODED) {<a name="line.536"></a>
-<span class="sourceLineNo">537</span>            s = encoder.encode(key, s);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>         }<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>      configMap.setEntry(sname, skey, s, null, null, null);<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      return this;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   }<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>   /**<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    * Adds or replaces an entry with the specified key with a POJO serialized to a string using the registered<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    * serializer.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    *<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    * &lt;p&gt;<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    * Equivalent to calling &lt;code&gt;put(key, value, isEncoded(key))&lt;/code&gt;.<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    *<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    * @param key The key.<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    * @param value The new value POJO.<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    * @throws SerializeException<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    *    If serializer could not serialize the value or if a serializer is not registered with this config file.<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    */<a name="line.558"></a>
-<span class="sourceLineNo">559</span>   public Config set(String key, Object value) throws SerializeException {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      return set(key, value, null);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>   }<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>   /**<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    * Same as {@link #set(String, Object)} but allows you to specify the serializer to use to serialize the<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    * value.<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    *<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    * @param key The key.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    * @param value The new value.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    * @param serializer<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    *    The serializer to use for serializing the object.<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined serializer on the config file.<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    * @throws SerializeException<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    *    If serializer could not serialize the value or if a serializer is not registered with this config file.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    */<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   public Config set(String key, Object value, Serializer serializer) throws SerializeException {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      return set(key, serialize(value, serializer));<a name="line.578"></a>
-<span class="sourceLineNo">579</span>   }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>   /**<a name="line.581"></a>
-<span class="sourceLineNo">582</span>    * Same as {@link #set(String, Object)} but allows you to specify all aspects of a value.<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    *<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    * @param key The key.<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    * @param value The new value.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    * @param serializer<a name="line.586"></a>
-<span class="sourceLineNo">587</span>    *    The serializer to use for serializing the object.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined serializer on the config file.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    * @param modifier<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    *    Optional modifier to apply to the value.<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    * @param comment<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    *    Optional same-line comment to add to this value.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    * @param preLines<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    *    Optional comment or blank lines to add before this entry.<a name="line.596"></a>
+<span class="sourceLineNo">534</span>      ConfigEntry ce = configMap.getEntry(sname, skey);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>      if (ce == null &amp;&amp; value == null)<a name="line.535"></a>
+<span class="sourceLineNo">536</span>         return this;<a name="line.536"></a>
+<span class="sourceLineNo">537</span><a name="line.537"></a>
+<span class="sourceLineNo">538</span>      String mod = ce == null ? "" : ce.getModifiers();<a name="line.538"></a>
+<span class="sourceLineNo">539</span><a name="line.539"></a>
+<span class="sourceLineNo">540</span>      String s = asString(value);<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      for (ConfigMod m : ConfigMod.asModifiers(mod)) {<a name="line.541"></a>
+<span class="sourceLineNo">542</span>         if (m == ENCODED) {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>            s = encoder.encode(key, s);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>         }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>      configMap.setEntry(sname, skey, s, null, null, null);<a name="line.547"></a>
+<span class="sourceLineNo">548</span>      return this;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>   }<a name="line.549"></a>
+<span class="sourceLineNo">550</span><a name="line.550"></a>
+<span class="sourceLineNo">551</span>   /**<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    * Adds or replaces an entry with the specified key with a POJO serialized to a string using the registered<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    * serializer.<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    *<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    * &lt;p&gt;<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    * Equivalent to calling &lt;code&gt;put(key, value, isEncoded(key))&lt;/code&gt;.<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    *<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    * @param key The key.<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    * @param value The new value POJO.<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    * @throws SerializeException<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    *    If serializer could not serialize the value or if a serializer is not registered with this config file.<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.563"></a>
+<span class="sourceLineNo">564</span>    */<a name="line.564"></a>
+<span class="sourceLineNo">565</span>   public Config set(String key, Object value) throws SerializeException {<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      return set(key, value, null);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   }<a name="line.567"></a>
+<span class="sourceLineNo">568</span><a name="line.568"></a>
+<span class="sourceLineNo">569</span>   /**<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    * Same as {@link #set(String, Object)} but allows you to specify the serializer to use to serialize the<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    * value.<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    *<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    * @param key The key.<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    * @param value The new value.<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    * @param serializer<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    *    The serializer to use for serializing the object.<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined serializer on the config file.<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    * @throws SerializeException<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    *    If serializer could not serialize the value or if a serializer is not registered with this config file.<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    */<a name="line.582"></a>
+<span class="sourceLineNo">583</span>   public Config set(String key, Object value, Serializer serializer) throws SerializeException {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      return set(key, serialize(value, serializer));<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   }<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>   /**<a name="line.587"></a>
+<span class="sourceLineNo">588</span>    * Same as {@link #set(String, Object)} but allows you to specify all aspects of a value.<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    *<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    * @param key The key.<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    * @param value The new value.<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    * @param serializer<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    *    The serializer to use for serializing the object.<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined serializer on the config file.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    * @param modifier<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    *    Optional modifier to apply to the value.<a name="line.596"></a>
 <span class="sourceLineNo">597</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    * @throws SerializeException<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    *    If serializer could not serialize the value or if a serializer is not registered with this config file.<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    */<a name="line.602"></a>
-<span class="sourceLineNo">603</span>   public Config set(String key, Object value, Serializer serializer, ConfigMod modifier, String comment, List&lt;String&gt; preLines) throws SerializeException {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      return set(key, value, serializer, modifier == null ? null : new ConfigMod[]{modifier}, comment, preLines);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>   }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>   /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    * Same as {@link #set(String, Object)} but allows you to specify all aspects of a value.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    *<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    * @param key The key.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    * @param value The new value.<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    * @param serializer<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    *    The serializer to use for serializing the object.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined serializer on the config file.<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    * @param modifiers<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    *    Optional modifiers to apply to the value.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    * @param comment<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    *    Optional same-line comment to add to this value.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    * @param preLines<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    *    Optional comment or blank lines to add before this entry.<a name="line.622"></a>
+<span class="sourceLineNo">598</span>    * @param comment<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    *    Optional same-line comment to add to this value.<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.600"></a>
+<span class="sourceLineNo">601</span>    * @param preLines<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    *    Optional comment or blank lines to add before this entry.<a name="line.602"></a>
+<span class="sourceLineNo">603</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.603"></a>
+<span class="sourceLineNo">604</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.604"></a>
+<span class="sourceLineNo">605</span>    * @throws SerializeException<a name="line.605"></a>
+<span class="sourceLineNo">606</span>    *    If serializer could not serialize the value or if a serializer is not registered with this config file.<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    */<a name="line.608"></a>
+<span class="sourceLineNo">609</span>   public Config set(String key, Object value, Serializer serializer, ConfigMod modifier, String comment, List&lt;String&gt; preLines) throws SerializeException {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      return set(key, value, serializer, modifier == null ? null : new ConfigMod[]{modifier}, comment, preLines);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>   }<a name="line.611"></a>
+<span class="sourceLineNo">612</span><a name="line.612"></a>
+<span class="sourceLineNo">613</span>   /**<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    * Same as {@link #set(String, Object)} but allows you to specify all aspects of a value.<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    *<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    * @param key The key.<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    * @param value The new value.<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    * @param serializer<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    *    The serializer to use for serializing the object.<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined serializer on the config file.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    * @param modifiers<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    *    Optional modifiers to apply to the value.<a name="line.622"></a>
 <span class="sourceLineNo">623</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    * @throws SerializeException<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    *    If serializer could not serialize the value or if a serializer is not registered with this config file.<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.627"></a>
-<span class="sourceLineNo">628</span>    */<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   public Config set(String key, Object value, Serializer serializer, ConfigMod[] modifiers, String comment, List&lt;String&gt; preLines) throws SerializeException {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      checkWrite();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>      assertFieldNotNull(key, "key");<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      String sname = sname(key);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      String skey = skey(key);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>      String s = serialize(value, serializer);<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      if (modifiers != null) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>         for (ConfigMod m : modifiers) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>            if (m == ENCODED) {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>               s = encoder.encode(key, s);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>            }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>         }<a name="line.641"></a>
-<span class="sourceLineNo">642</span>      }<a name="line.642"></a>
-<span class="sourceLineNo">643</span><a name="line.643"></a>
-<span class="sourceLineNo">644</span>      configMap.setEntry(sname, skey, s, modifiers == null ? null : ConfigMod.asString(modifiers), comment, preLines);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      return this;<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   }<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>   /**<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    * Removes an entry with the specified key.<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    *<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    * @param key The key.<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    */<a name="line.654"></a>
-<span class="sourceLineNo">655</span>   public Config remove(String key) {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      checkWrite();<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      String sname = sname(key);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>      String skey = skey(key);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      configMap.removeEntry(sname, skey);<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      return this;<a name="line.660"></a>
-<span class="sourceLineNo">661</span>   }<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>   /**<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    * Encodes and unencoded entries in this config.<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    *<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    * &lt;p&gt;<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    * If any entries in the config are marked as encoded but not actually encoded,<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    * this will encode them.<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    *<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    * @return This object (for method chaining).<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    */<a name="line.672"></a>
-<span class="sourceLineNo">673</span>   public Config encodeEntries() {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      checkWrite();<a name="line.674"></a>
-<span class="sourceLineNo">675</span>      for (String section : configMap.getSections()) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>         for (String key : configMap.getKeys(section)) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>            ConfigEntry ce = configMap.getEntry(section, key);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>            if (ce != null &amp;&amp; ce.hasModifier('*') &amp;&amp; ! encoder.isEncoded(ce.getValue())) {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>               configMap.setEntry(section, key, encoder.encode(section + '/' + key, ce.getValue()), null, null, null);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>            }<a name="line.680"></a>
-<span class="sourceLineNo">681</span>         }<a name="line.681"></a>
-<span class="sourceLineNo">682</span>      }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>      return this;<a name="line.684"></a>
-<span class="sourceLineNo">685</span>   }<a name="line.685"></a>
-<span class="sourceLineNo">686</span><a name="line.686"></a>
-<span class="sourceLineNo">687</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.687"></a>
-<span class="sourceLineNo">688</span>   // API methods<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>   /**<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    * Gets the entry with the specified key.<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    *<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    * &lt;p&gt;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    * The key can be in one of the following formats...<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    * &lt;ul class='spaced-list'&gt;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    *    &lt;li&gt;<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    *       &lt;js&gt;"key"&lt;/js&gt; - A value in the default section (i.e. defined above any &lt;code&gt;[section]&lt;/code&gt; header).<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    *    &lt;li&gt;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    *       &lt;js&gt;"section/key"&lt;/js&gt; - A value from the specified section.<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    * &lt;/ul&gt;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    *<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    * @param key The key.<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    */<a name="line.705"></a>
-<span class="sourceLineNo">706</span>   public String getString(String key) {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>      String s = get(key);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      if (s == null)<a name="line.708"></a>
-<span class="sourceLineNo">709</span>         return null;<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      if (varSession != null)<a name="line.710"></a>
-<span class="sourceLineNo">711</span>         s = varSession.resolve(s);<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      return s;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>   }<a name="line.713"></a>
-<span class="sourceLineNo">714</span><a name="line.714"></a>
-<span class="sourceLineNo">715</span>   /**<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    * Gets the entry with the specified key.<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    *<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    * &lt;p&gt;<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    * The key can be in one of the following formats...<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    * &lt;ul class='spaced-list'&gt;<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    *    &lt;li&gt;<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    *       &lt;js&gt;"key"&lt;/js&gt; - A value in the default section (i.e. defined above any &lt;code&gt;[section]&lt;/code&gt; header).<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    *    &lt;li&gt;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    *       &lt;js&gt;"section/key"&lt;/js&gt; - A value from the specified section.<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    * &lt;/ul&gt;<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    *<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    * @param key The key.<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    * @param def The default value if the value does not exist.<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    * @return The value, or the default value if the section or key does not exist.<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    */<a name="line.730"></a>
-<span class="sourceLineNo">731</span>   public String getString(String key, String def) {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      String s = get(key);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      if (isEmpty(s))<a name="line.733"></a>
-<span class="sourceLineNo">734</span>         return def;<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      if (varSession != null)<a name="line.735"></a>
-<span class="sourceLineNo">736</span>         s = varSession.resolve(s);<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return s;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>   }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>   /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    * Gets the entry with the specified key, splits the value on commas, and returns the values as trimmed strings.<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    *<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    * @param key The key.<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    * @return The value, or an empty array if the section or key does not exist.<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    */<a name="line.745"></a>
-<span class="sourceLineNo">746</span>   public String[] getStringArray(String key) {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>      return getStringArray(key, new String[0]);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>   /**<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    * Same as {@link #getStringArray(String)} but returns a default value if the value cannot be found.<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    *<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    * @param key The key.<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    * @param def The default value if the value does not exist.<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    * @return The value, or the default value if the section or key does not exist or is blank.<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    */<a name="line.756"></a>
-<span class="sourceLineNo">757</span>   public String[] getStringArray(String key, String[] def) {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>      String s = getString(key);<a name="line.758"></a>
-<span class="sourceLineNo">759</span>      if (isEmpty(s))<a name="line.759"></a>
-<span class="sourceLineNo">760</span>         return def;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      String[] r = split(s);<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      return r.length == 0 ? def : r;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>   }<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>   /**<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    * Convenience method for getting int config values.<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    *<a name="line.767"></a>
-<span class="sourceLineNo">768</span>    * &lt;p&gt;<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    * &lt;js&gt;"K"&lt;/js&gt;, &lt;js&gt;"M"&lt;/js&gt;, and &lt;js&gt;"G"&lt;/js&gt; can be used to identify kilo, mega, and giga.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    *<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    * &lt;ul class='spaced-list'&gt;<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    *    &lt;li&gt;<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    *       &lt;code&gt;&lt;js&gt;"100K"&lt;/js&gt; =&gt; 1024000&lt;/code&gt;<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    *    &lt;li&gt;<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    *       &lt;code&gt;&lt;js&gt;"100M"&lt;/js&gt; =&gt; 104857600&lt;/code&gt;<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    * &lt;/ul&gt;<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    *<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    * &lt;p&gt;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    * Uses {@link Integer#decode(String)} underneath, so any of the following integer formats are supported:<a name="line.780"></a>
-<span class="sourceLineNo">781</span>    * &lt;ul&gt;<a name="line.781"></a>
-<span class="sourceLineNo">782</span>    *    &lt;li&gt;&lt;js&gt;"0x..."&lt;/js&gt;<a name="line.782"></a>
-<span class="sourceLineNo">783</span>    *    &lt;li&gt;&lt;js&gt;"0X..."&lt;/js&gt;<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    *    &lt;li&gt;&lt;js&gt;"#..."&lt;/js&gt;<a name="line.784"></a>
-<span class="sourceLineNo">785</span>    *    &lt;li&gt;&lt;js&gt;"0..."&lt;/js&gt;<a name="line.785"></a>
-<span class="sourceLineNo">786</span>    * &lt;/ul&gt;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    *<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    * @param key The key.<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    * @return The value, or &lt;code&gt;0&lt;/code&gt; if the value does not exist or the value is empty.<a name="line.789"></a>
-<span class="sourceLineNo">790</span>    */<a name="line.790"></a>
-<span class="sourceLineNo">791</span>   public int getInt(String key) {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>      return getInt(key, 0);<a name="line.792"></a>
-<span class="sourceLineNo">793</span>   }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>   /**<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    * Same as {@link #getInt(String)} but returns a default value if not set.<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    *<a name="line.797"></a>
-<span class="sourceLineNo">798</span>    * @param key The key.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    * @param def The default value if the value does not exist.<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    * @return The value, or the default value if the value does not exist or the value is empty.<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    */<a name="line.801"></a>
-<span class="sourceLineNo">802</span>   public int getInt(String key, int def) {<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      String s = getString(key);<a name="line.803"></a>
-<span class="sourceLineNo">804</span>      if (isEmpty(s))<a name="line.804"></a>
-<span class="sourceLineNo">805</span>         return def;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>      return parseIntWithSuffix(s);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   }<a name="line.807"></a>
-<span class="sourceLineNo">808</span><a name="line.808"></a>
-<span class="sourceLineNo">809</span>   /**<a name="line.809"></a>
-<span class="sourceLineNo">810</span>    * Convenience method for getting boolean config values.<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    *<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    * @param key The key.<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    * @return The value, or &lt;jk&gt;false&lt;/jk&gt; if the section or key does not exist or cannot be parsed as a boolean.<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    */<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   public boolean getBoolean(String key) {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>      return getBoolean(key, false);<a name="line.816"></a>
-<span class="sourceLineNo">817</span>   }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>   /**<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    * Convenience method for getting boolean config values.<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    *<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    * @param key The key.<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    * @param def The default value if the value does not exist.<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    * @return The value, or the default value if the section or key does not exist or cannot be parsed as a boolean.<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    */<a name="line.825"></a>
-<span class="sourceLineNo">826</span>   public boolean getBoolean(String key, boolean def) {<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      String s = getString(key);<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      return isEmpty(s) ? def : Boolean.parseBoolean(s);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>   }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>   /**<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    * Convenience method for getting long config values.<a name="line.832"></a>
-<span class="sourceLineNo">833</span>    *<a name="line.833"></a>
-<span class="sourceLineNo">834</span>    * &lt;p&gt;<a name="line.834"></a>
-<span class="sourceLineNo">835</span>    * &lt;js&gt;"K"&lt;/js&gt;, &lt;js&gt;"M"&lt;/js&gt;, and &lt;js&gt;"G"&lt;/js&gt; can be used to identify kilo, mega, and giga.<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    *<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    * &lt;ul class='spaced-list'&gt;<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    *    &lt;li&gt;<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    *       &lt;code&gt;&lt;js&gt;"100K"&lt;/js&gt; =&gt; 1024000&lt;/code&gt;<a name="line.840"></a>
-<span class="sourceLineNo">841</span>    *    &lt;li&gt;<a name="line.841"></a>
-<span class="sourceLineNo">842</span>    *       &lt;code&gt;&lt;js&gt;"100M"&lt;/js&gt; =&gt; 104857600&lt;/code&gt;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>    * &lt;/ul&gt;<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    *<a name="line.844"></a>
-<span class="sourceLineNo">845</span>    * &lt;p&gt;<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    * Uses {@link Long#decode(String)} underneath, so any of the following number formats are supported:<a name="line.846"></a>
-<span class="sourceLineNo">847</span>    * &lt;ul&gt;<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    *    &lt;li&gt;&lt;js&gt;"0x..."&lt;/js&gt;<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    *    &lt;li&gt;&lt;js&gt;"0X..."&lt;/js&gt;<a name="line.849"></a>
-<span class="sourceLineNo">850</span>    *    &lt;li&gt;&lt;js&gt;"#..."&lt;/js&gt;<a name="line.850"></a>
-<span class="sourceLineNo">851</span>    *    &lt;li&gt;&lt;js&gt;"0..."&lt;/js&gt;<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    * &lt;/ul&gt;<a name="line.852"></a>
-<span class="sourceLineNo">853</span>    *<a name="line.853"></a>
-<span class="sourceLineNo">854</span>    * @param key The key.<a name="line.854"></a>
-<span class="sourceLineNo">855</span>    * @return The value, or &lt;code&gt;0&lt;/code&gt; if the value does not exist or the value is empty.<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    */<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   public long getLong(String key) {<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      return getLong(key, 0);<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   }<a name="line.859"></a>
-<span class="sourceLineNo">860</span><a name="line.860"></a>
-<span class="sourceLineNo">861</span>   /**<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    * Same as {@link #getLong(String)} but returns a default value if not set.<a name="line.862"></a>
-<span class="sourceLineNo">863</span>    *<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    * @param key The key.<a name="line.864"></a>
-<span class="sourceLineNo">865</span>    * @param def The default value if the value does not exist.<a name="line.865"></a>
-<span class="sourceLineNo">866</span>    * @return The value, or the default value if the value does not exist or the value is empty.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>    */<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   public long getLong(String key, long def) {<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      String s = getString(key);<a name="line.869"></a>
-<span class="sourceLineNo">870</span>      if (isEmpty(s))<a name="line.870"></a>
-<span class="sourceLineNo">871</span>         return def;<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      return parseLongWithSuffix(s);<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   }<a name="line.873"></a>
-<span class="sourceLineNo">874</span><a name="line.874"></a>
-<span class="sourceLineNo">875</span>   /**<a name="line.875"></a>
-<span class="sourceLineNo">876</span>    * Convenience method for getting double config values.<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    *<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    * &lt;p&gt;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    * Uses {@link Double#valueOf(String)} underneath, so any of the following number formats are supported:<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    * &lt;ul&gt;<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    *    &lt;li&gt;&lt;js&gt;"0x..."&lt;/js&gt;<a name="line.881"></a>
-<span class="sourceLineNo">882</span>    *    &lt;li&gt;&lt;js&gt;"0X..."&lt;/js&gt;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    *    &lt;li&gt;&lt;js&gt;"#..."&lt;/js&gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    *    &lt;li&gt;&lt;js&gt;"0..."&lt;/js&gt;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>    * &lt;/ul&gt;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>    *<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    * @param key The key.<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    * @return The value, or &lt;code&gt;0&lt;/code&gt; if the value does not exist or the value is empty.<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    */<a name="line.889"></a>
-<span class="sourceLineNo">890</span>   public double getDouble(String key) {<a name="line.890"></a>
-<span class="sourceLineNo">891</span>      return getDouble(key, 0);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>   }<a name="line.892"></a>
-<span class="sourceLineNo">893</span><a name="line.893"></a>
-<span class="sourceLineNo">894</span>   /**<a name="line.894"></a>
-<span class="sourceLineNo">895</span>    * Same as {@link #getDouble(String)} but returns a default value if not set.<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    *<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    * @param key The key.<a name="line.897"></a>
-<span class="sourceLineNo">898</span>    * @param def The default value if the value does not exist.<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    * @return The value, or the default value if the value does not exist or the value is empty.<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    */<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   public double getDouble(String key, double def) {<a name="line.901"></a>
-<span class="sourceLineNo">902</span>      String s = getString(key);<a name="line.902"></a>
-<span class="sourceLineNo">903</span>      if (isEmpty(s))<a name="line.903"></a>
-<span class="sourceLineNo">904</span>         return def;<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      return Double.valueOf(s);<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>   /**<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    * Convenience method for getting float config values.<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    *<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    * &lt;p&gt;<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    * Uses {@link Float#valueOf(String)} underneath, so any of the following number formats are supported:<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    * &lt;ul&gt;<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    *    &lt;li&gt;&lt;js&gt;"0x..."&lt;/js&gt;<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    *    &lt;li&gt;&lt;js&gt;"0X..."&lt;/js&gt;<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    *    &lt;li&gt;&lt;js&gt;"#..."&lt;/js&gt;<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    *    &lt;li&gt;&lt;js&gt;"0..."&lt;/js&gt;<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    * &lt;/ul&gt;<a name="line.918"></a>
-<span class="sourceLineNo">919</span>    *<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    * @param key The key.<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    * @return The value, or &lt;code&gt;0&lt;/code&gt; if the value does not exist or the value is empty.<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    */<a name="line.922"></a>
-<span class="sourceLineNo">923</span>   public float getFloat(String key) {<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      return getFloat(key, 0);<a name="line.924"></a>
-<span class="sourceLineNo">925</span>   }<a name="line.925"></a>
-<span class="sourceLineNo">926</span><a name="line.926"></a>
-<span class="sourceLineNo">927</span>   /**<a name="line.927"></a>
-<span class="sourceLineNo">928</span>    * Same as {@link #getFloat(String)} but returns a default value if not set.<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    *<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    * @param key The key.<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    * @param def The default value if the value does not exist.<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    * @return The value, or the default value if the value does not exist or the value is empty.<a name="line.932"></a>
-<span class="sourceLineNo">933</span>    */<a name="line.933"></a>
-<span class="sourceLineNo">934</span>   public float getFloat(String key, float def) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      String s = getString(key);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>      if (isEmpty(s))<a name="line.936"></a>
-<span class="sourceLineNo">937</span>         return def;<a name="line.937"></a>
-<span class="sourceLineNo">938</span>      return Float.valueOf(s);<a name="line.938"></a>
-<span class="sourceLineNo">939</span>   }<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>   /**<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    * Convenience method for getting byte array config values.<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    *<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    * &lt;p&gt;<a name="line.944"></a>
-<span class="sourceLineNo">945</span>    * This is equivalent to calling the following:<a name="line.945"></a>
-<span class="sourceLineNo">946</span>    * &lt;p class='bcode w800'&gt;<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    *    &lt;jk&gt;byte&lt;/jk&gt;[] b = config.getObject(key, &lt;jk&gt;byte&lt;/jk&gt;[].&lt;jk&gt;class&lt;/jk&gt;);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    * &lt;/p&gt;<a name="line.948"></a>
+<span class="sourceLineNo">624</span>    * @param comment<a name="line.624"></a>
+<span class="sourceLineNo">625</span>    *    Optional same-line comment to add to this value.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    * @param preLines<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    *    Optional comment or blank lines to add before this entry.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, then previous value will not be replaced.<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    * @throws SerializeException<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    *    If serializer could not serialize the value or if a serializer is not registered with this config file.<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    */<a name="line.634"></a>
+<span class="sourceLineNo">635</span>   public Config set(String key, Object value, Serializer serializer, ConfigMod[] modifiers, String comment, List&lt;String&gt; preLines) throws SerializeException {<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      checkWrite();<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      assertFieldNotNull(key, "key");<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      String sname = sname(key);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>      String skey = skey(key);<a name="line.639"></a>
+<span class="sourceLineNo">640</span><a name="line.640"></a>
+<span class="sourceLineNo">641</span>      String s = serialize(value, serializer);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      if (modifiers != null) {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>         for (ConfigMod m : modifiers) {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>            if (m == ENCODED) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>               s = encoder.encode(key, s);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>            }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>         }<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      }<a name="line.648"></a>
+<span class="sourceLineNo">649</span><a name="line.649"></a>
+<span class="sourceLineNo">650</span>      configMap.setEntry(sname, skey, s, modifiers == null ? null : ConfigMod.asString(modifiers), comment, preLines);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      return this;<a name="line.651"></a>
+<span class="sourceLineNo">652</span>   }<a name="line.652"></a>
+<span class="sourceLineNo">653</span><a name="line.653"></a>
+<span class="sourceLineNo">654</span>   /**<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    * Removes an entry with the specified key.<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    *<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    * @param key The key.<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    * @return The previous value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key did not previously exist.<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    */<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   public Config remove(String key) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      checkWrite();<a name="line.662"></a>
+<span class="sourceLineNo">663</span>      String sname = sname(key);<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      String skey = skey(key);<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      configMap.removeEntry(sname, skey);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      return this;<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   }<a name="line.667"></a>
+<span class="sourceLineNo">668</span><a name="line.668"></a>
+<span class="sourceLineNo">669</span>   /**<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    * Encodes and unencoded entries in this config.<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    *<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    * &lt;p&gt;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    * If any entries in the config are marked as encoded but not actually encoded,<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    * this will encode them.<a name="line.674"></a>
+<span class="sourceLineNo">675</span>    *<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    * @return This object (for method chaining).<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    */<a name="line.678"></a>
+<span class="sourceLineNo">679</span>   public Config encodeEntries() {<a name="line.679"></a>
+<span class="sourceLineNo">680</span>      checkWrite();<a name="line.680"></a>
+<span class="sourceLineNo">681</span>      for (String section : configMap.getSections()) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>         for (String key : configMap.getKeys(section)) {<a name="line.682"></a>
+<span class="sourceLineNo">683</span>            ConfigEntry ce = configMap.getEntry(section, key);<a name="line.683"></a>
+<span class="sourceLineNo">684</span>            if (ce != null &amp;&amp; ce.hasModifier('*') &amp;&amp; ! encoder.isEncoded(ce.getValue())) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>               configMap.setEntry(section, key, encoder.encode(section + '/' + key, ce.getValue()), null, null, null);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>            }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>         }<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      }<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>      return this;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   }<a name="line.691"></a>
+<span class="sourceLineNo">692</span><a name="line.692"></a>
+<span class="sourceLineNo">693</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   // API methods<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>   /**<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    * Gets the entry with the specified key.<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    *<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    * &lt;p&gt;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    * The key can be in one of the following formats...<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    * &lt;ul class='spaced-list'&gt;<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    *    &lt;li&gt;<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    *       &lt;js&gt;"key"&lt;/js&gt; - A value in the default section (i.e. defined above any &lt;code&gt;[section]&lt;/code&gt; header).<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    *    &lt;li&gt;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    *       &lt;js&gt;"section/key"&lt;/js&gt; - A value from the specified section.<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    * &lt;/ul&gt;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    *<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    * @param key The key.<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    */<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   public String getString(String key) {<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      String s = get(key);<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      if (s == null)<a name="line.714"></a>
+<span class="sourceLineNo">715</span>         return null;<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      if (varSession != null)<a name="line.716"></a>
+<span class="sourceLineNo">717</span>         s = varSession.resolve(s);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      return s;<a name="line.718"></a>
+<span class="sourceLineNo">719</span>   }<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>   /**<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    * Gets the entry with the specified key.<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    *<a name="line.723"></a>
+<span class="sourceLineNo">724</span>    * &lt;p&gt;<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    * The key can be in one of the following formats...<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    * &lt;ul class='spaced-list'&gt;<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    *    &lt;li&gt;<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    *       &lt;js&gt;"key"&lt;/js&gt; - A value in the default section (i.e. defined above any &lt;code&gt;[section]&lt;/code&gt; header).<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    *    &lt;li&gt;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    *       &lt;js&gt;"section/key"&lt;/js&gt; - A value from the specified section.<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    * &lt;/ul&gt;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    *<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    * @param key The key.<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    * @param def The default value if the value does not exist.<a name="line.734"></a>
+<span class="sourceLineNo">735</span>    * @return The value, or the default value if the section or key does not exist.<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    */<a name="line.736"></a>
+<span class="sourceLineNo">737</span>   public String getString(String key, String def) {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>      String s = get(key);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      if (isEmpty(s))<a name="line.739"></a>
+<span class="sourceLineNo">740</span>         return def;<a name="line.740"></a>
+<span class="sourceLineNo">741</span>      if (varSession != null)<a name="line.741"></a>
+<span class="sourceLineNo">742</span>         s = varSession.resolve(s);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      return s;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>   }<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>   /**<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    * Gets the entry with the specified key, splits the value on commas, and returns the values as trimmed strings.<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    *<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    * @param key The key.<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    * @return The value, or an empty array if the section or key does not exist.<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    */<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   public String[] getStringArray(String key) {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      return getStringArray(key, new String[0]);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>   }<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>   /**<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    * Same as {@link #getStringArray(String)} but returns a default value if the value cannot be found.<a name="line.757"></a>
+<span class="sourceLineNo">758</span>    *<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    * @param key The key.<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    * @param def The default value if the value does not exist.<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    * @return The value, or the default value if the section or key does not exist or is blank.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    */<a name="line.762"></a>
+<span class="sourceLineNo">763</span>   public String[] getStringArray(String key, String[] def) {<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      String s = getString(key);<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      if (isEmpty(s))<a name="line.765"></a>
+<span class="sourceLineNo">766</span>         return def;<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      String[] r = split(s);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      return r.length == 0 ? def : r;<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   }<a name="line.769"></a>
+<span class="sourceLineNo">770</span><a name="line.770"></a>
+<span class="sourceLineNo">771</span>   /**<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    * Convenience method for getting int config values.<a name="line.772"></a>
+<span class="sourceLineNo">773</span>    *<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    * &lt;p&gt;<a name="line.774"></a>
+<span class="sourceLineNo">775</span>    * &lt;js&gt;"K"&lt;/js&gt;, &lt;js&gt;"M"&lt;/js&gt;, and &lt;js&gt;"G"&lt;/js&gt; can be used to identify kilo, mega, and giga.<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    *<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>    * &lt;ul class='spaced-list'&gt;<a name="line.778"></a>
+<span class="sourceLineNo">779</span>    *    &lt;li&gt;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>    *       &lt;code&gt;&lt;js&gt;"100K"&lt;/js&gt; =&gt; 1024000&lt;/code&gt;<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    *    &lt;li&gt;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>    *       &lt;code&gt;&lt;js&gt;"100M"&lt;/js&gt; =&gt; 104857600&lt;/code&gt;<a name="line.782"></a>
+<span class="sourceLineNo">783</span>    * &lt;/ul&gt;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    *<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    * &lt;p&gt;<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    * Uses {@link Integer#decode(String)} underneath, so any of the following integer formats are supported:<a name="line.786"></a>
+<span class="sourceLineNo">787</span>    * &lt;ul&gt;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>    *    &lt;li&gt;&lt;js&gt;"0x..."&lt;/js&gt;<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    *    &lt;li&gt;&lt;js&gt;"0X..."&lt;/js&gt;<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    *    &lt;li&gt;&lt;js&gt;"#..."&lt;/js&gt;<a name="line.790"></a>
+<span class="sourceLineNo">791</span>    *    &lt;li&gt;&lt;js&gt;"0..."&lt;/js&gt;<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    * &lt;/ul&gt;<a name="line.792"></a>
+<span class="sourceLineNo">793</span>    *<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    * @param key The key.<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    * @return The value, or &lt;code&gt;0&lt;/code&gt; if the value does not exist or the value is empty.<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    */<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   public int getInt(String key) {<a name="line.797"></a>
+<span class="sourceLineNo">798</span>      return getInt(key, 0);<a name="line.798"></a>
+<span class="sourceLineNo">799</span>   }<a name="line.799"></a>
+<span class="sourceLineNo">800</span><a name="line.800"></a>
+<span class="sourceLineNo">801</span>   /**<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    * Same as {@link #getInt(String)} but returns a default value if not set.<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    *<a name="line.803"></a>
+<span class="sourceLineNo">804</span>    * @param key The key.<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    * @param def The default value if the value does not exist.<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    * @return The value, or the default value if the value does not exist or the value is empty.<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    */<a name="line.807"></a>
+<span class="sourceLineNo">808</span>   public int getInt(String key, int def) {<a name="line.808"></a>
+<span class="sourceLineNo">809</span>      String s = getString(key);<a name="line.809"></a>
+<span class="sourceLineNo">810</span>      if (isEmpty(s))<a name="line.810"></a>
+<span class="sourceLineNo">811</span>         return def;<a name="line.811"></a>
+<span class="sourceLineNo">812</span>      return parseIntWithSuffix(s);<a name="line.812"></a>
+<span class="sourceLineNo">813</span>   }<a name="line.813"></a>
+<span class="sourceLineNo">814</span><a name="line.814"></a>
+<span class="sourceLineNo">815</span>   /**<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    * Convenience method for getting boolean config values.<a name="line.816"></a>
+<span class="sourceLineNo">817</span>    *<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    * @param key The key.<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    * @return The value, or &lt;jk&gt;false&lt;/jk&gt; if the section or key does not exist or cannot be parsed as a boolean.<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    */<a name="line.820"></a>
+<span class="sourceLineNo">821</span>   public boolean getBoolean(String key) {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>      return getBoolean(key, false);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>   }<a name="line.823"></a>
+<span class="sourceLineNo">824</span><a name="line.824"></a>
+<span class="sourceLineNo">825</span>   /**<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    * Convenience method for getting boolean config values.<a name="line.826"></a>
+<span class="sourceLineNo">827</span>    *<a name="line.827"></a>
+<span class="sourceLineNo">828</span>    * @param key The key.<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    * @param def The default value if the value does not exist.<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    * @return The value, or the default value if the section or key does not exist or cannot be parsed as a boolean.<a name="line.830"></a>
+<span class="sourceLineNo">831</span>    */<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   public boolean getBoolean(String key, boolean def) {<a name="line.832"></a>
+<span class="sourceLineNo">833</span>      String s = getString(key);<a name="line.833"></a>
+<span class="sourceLineNo">834</span>      return isEmpty(s) ? def : Boolean.parseBoolean(s);<a name="line.834"></a>
+<span class="sourceLineNo">835</span>   }<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>   /**<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    * Convenience method for getting long config values.<a name="line.838"></a>
+<span class="sourceLineNo">839</span>    *<a name="line.839"></a>
+<span class="sourceLineNo">840</span>    * &lt;p&gt;<a name="line.840"></a>
+<span class="sourceLineNo">841</span>    * &lt;js&gt;"K"&lt;/js&gt;, &lt;js&gt;"M"&lt;/js&gt;, and &lt;js&gt;"G"&lt;/js&gt; can be used to identify kilo, mega, and giga.<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    *<a name="line.842"></a>
+<span class="sourceLineNo">843</span>    * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>    * &lt;ul class='spaced-list'&gt;<a name="line.844"></a>
+<span class="sourceLineNo">845</span>    *    &lt;li&gt;<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    *       &lt;code&gt;&lt;js&gt;"100K"&lt;/js&gt; =&gt; 1024000&lt;/code&gt;<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    *    &lt;li&gt;<a name="line.847"></a>
+<span class="sourceLineNo">848</span>    *       &lt;code&gt;&lt;js&gt;"100M"&lt;/js&gt; =&gt; 104857600&lt;/code&gt;<a name="line.848"></a>
+<span class="sourceLineNo">849</span>    * &lt;/ul&gt;<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    *<a name="line.850"></a>
+<span class="sourceLineNo">851</span>    * &lt;p&gt;<a name="line.851"></a>
+<span class="sourceLineNo">852</span>    * Uses {@link Long#decode(String)} underneath, so any of the following number formats are supported:<a name="line.852"></a>
+<span class="sourceLineNo">853</span>    * &lt;ul&gt;<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    *    &lt;li&gt;&lt;js&gt;"0x..."&lt;/js&gt;<a name="line.854"></a>
+<span class="sourceLineNo">855</span>    *    &lt;li&gt;&lt;js&gt;"0X..."&lt;/js&gt;<a name="line.855"></a>
+<span class="sourceLineNo">856</span>    *    &lt;li&gt;&lt;js&gt;"#..."&lt;/js&gt;<a name="line.856"></a>
+<span class="sourceLineNo">857</span>    *    &lt;li&gt;&lt;js&gt;"0..."&lt;/js&gt;<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    * &lt;/ul&gt;<a name="line.858"></a>
+<span class="sourceLineNo">859</span>    *<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    * @param key The key.<a name="line.860"></a>
+<span class="sourceLineNo">861</span>    * @return The value, or &lt;code&gt;0&lt;/code&gt; if the value does not exist or the value is empty.<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    */<a name="line.862"></a>
+<span class="sourceLineNo">863</span>   public long getLong(String key) {<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      return getLong(key, 0);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   }<a name="line.865"></a>
+<span class="sourceLineNo">866</span><a name="line.866"></a>
+<span class="sourceLineNo">867</span>   /**<a name="line.867"></a>
+<span class="sourceLineNo">868</span>    * Same as {@link #getLong(String)} but returns a default value if not set.<a name="line.868"></a>
+<span class="sourceLineNo">869</span>    *<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    * @param key The key.<a name="line.870"></a>
+<span class="sourceLineNo">871</span>    * @param def The default value if the value does not exist.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>    * @return The value, or the default value if the value does not exist or the value is empty.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>    */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>   public long getLong(String key, long def) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>      String s = getString(key);<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      if (isEmpty(s))<a name="line.876"></a>
+<span class="sourceLineNo">877</span>         return def;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      return parseLongWithSuffix(s);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>   }<a name="line.879"></a>
+<span class="sourceLineNo">880</span><a name="line.880"></a>
+<span class="sourceLineNo">881</span>   /**<a name="line.881"></a>
+<span class="sourceLineNo">882</span>    * Convenience method for getting double config values.<a name="line.882"></a>
+<span class="sourceLineNo">883</span>    *<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    * &lt;p&gt;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    * Uses {@link Double#valueOf(String)} underneath, so any of the following number formats are supported:<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    * &lt;ul&gt;<a name="line.886"></a>
+<span class="sourceLineNo">887</span>    *    &lt;li&gt;&lt;js&gt;"0x..."&lt;/js&gt;<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    *    &lt;li&gt;&lt;js&gt;"0X..."&lt;/js&gt;<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    *    &lt;li&gt;&lt;js&gt;"#..."&lt;/js&gt;<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    *    &lt;li&gt;&lt;js&gt;"0..."&lt;/js&gt;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    * &lt;/ul&gt;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    *<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    * @param key The key.<a name="line.893"></a>
+<span class="sourceLineNo">894</span>    * @return The value, or &lt;code&gt;0&lt;/code&gt; if the value does not exist or the value is empty.<a name="line.894"></a>
+<span class="sourceLineNo">895</span>    */<a name="line.895"></a>
+<span class="sourceLineNo">896</span>   public double getDouble(String key) {<a name="line.896"></a>
+<span class="sourceLineNo">897</span>      return getDouble(key, 0);<a name="line.897"></a>
+<span class="sourceLineNo">898</span>   }<a name="line.898"></a>
+<span class="sourceLineNo">899</span><a name="line.899"></a>
+<span class="sourceLineNo">900</span>   /**<a name="line.900"></a>
+<span class="sourceLineNo">901</span>    * Same as {@link #getDouble(String)} but returns a default value if not set.<a name="line.901"></a>
+<span class="sourceLineNo">902</span>    *<a name="line.902"></a>
+<span class="sourceLineNo">903</span>    * @param key The key.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>    * @param def The default value if the value does not exist.<a name="line.904"></a>
+<span class="sourceLineNo">905</span>    * @return The value, or the default value if the value does not exist or the value is empty.<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    */<a name="line.906"></a>
+<span class="sourceLineNo">907</span>   public double getDouble(String key, double def) {<a name="line.907"></a>
+<span class="sourceLineNo">908</span>      String s = getString(key);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      if (isEmpty(s))<a name="line.909"></a>
+<span class="sourceLineNo">910</span>         return def;<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      return Double.valueOf(s);<a name="line.911"></a>
+<span class="sourceLineNo">912</span>   }<a name="line.912"></a>
+<span class="sourceLineNo">913</span><a name="line.913"></a>
+<span class="sourceLineNo">914</span>   /**<a name="line.914"></a>
+<span class="sourceLineNo">915</span>    * Convenience method for getting float config values.<a name="line.915"></a>
+<span class="sourceLineNo">916</span>    *<a name="line.916"></a>
+<span class="sourceLineNo">917</span>    * &lt;p&gt;<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    * Uses {@link Float#valueOf(String)} underneath, so any of the following number formats are supported:<a name="line.918"></a>
+<span class="sourceLineNo">919</span>    * &lt;ul&gt;<a name="line.919"></a>
+<span class="sourceLineNo">920</span>    *    &lt;li&gt;&lt;js&gt;"0x..."&lt;/js&gt;<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    *    &lt;li&gt;&lt;js&gt;"0X..."&lt;/js&gt;<a name="line.921"></a>
+<span class="sourceLineNo">922</span>    *    &lt;li&gt;&lt;js&gt;"#..."&lt;/js&gt;<a name="line.922"></a>
+<span class="sourceLineNo">923</span>    *    &lt;li&gt;&lt;js&gt;"0..."&lt;/js&gt;<a name="line.923"></a>
+<span class="sourceLineNo">924</span>    * &lt;/ul&gt;<a name="line.924"></a>
+<span class="sourceLineNo">925</span>    *<a name="line.925"></a>
+<span class="sourceLineNo">926</span>    * @param key The key.<a name="line.926"></a>
+<span class="sourceLineNo">927</span>    * @return The value, or &lt;code&gt;0&lt;/code&gt; if the value does not exist or the value is empty.<a name="line.927"></a>
+<span class="sourceLineNo">928</span>    */<a name="line.928"></a>
+<span class="sourceLineNo">929</span>   public float getFloat(String key) {<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      return getFloat(key, 0);<a name="line.930"></a>
+<span class="sourceLineNo">931</span>   }<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>   /**<a name="line.933"></a>
+<span class="sourceLineNo">934</span>    * Same as {@link #getFloat(String)} but returns a default value if not set.<a name="line.934"></a>
+<span class="sourceLineNo">935</span>    *<a name="line.935"></a>
+<span class="sourceLineNo">936</span>    * @param key The key.<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    * @param def The default value if the value does not exist.<a name="line.937"></a>
+<span class="sourceLineNo">938</span>    * @return The value, or the default value if the value does not exist or the value is empty.<a name="line.938"></a>
+<span class="sourceLineNo">939</span>    */<a name="line.939"></a>
+<span class="sourceLineNo">940</span>   public float getFloat(String key, float def) {<a name="line.940"></a>
+<span class="sourceLineNo">941</span>      String s = getString(key);<a name="line.941"></a>
+<span class="sourceLineNo">942</span>      if (isEmpty(s))<a name="line.942"></a>
+<span class="sourceLineNo">943</span>         return def;<a name="line.943"></a>
+<span class="sourceLineNo">944</span>      return Float.valueOf(s);<a name="line.944"></a>
+<span class="sourceLineNo">945</span>   }<a name="line.945"></a>
+<span class="sourceLineNo">946</span><a name="line.946"></a>
+<span class="sourceLineNo">947</span>   /**<a name="line.947"></a>
+<span class="sourceLineNo">948</span>    * Convenience method for getting byte array config values.<a name="line.948"></a>
 <span class="sourceLineNo">949</span>    *<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    * Byte arrays are stored as encoded strings, typically BASE64, but dependent on the {@link #CONFIG_binaryFormat} setting.<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    *<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    * @param key The key.<a name="line.952"></a>
-<span class="sourceLineNo">953</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    * @throws ParseException If value could not be converted to a byte array.<a name="line.954"></a>
-<span class="sourceLineNo">955</span>    */<a name="line.955"></a>
-<span class="sourceLineNo">956</span>   public byte[] getBytes(String key) throws ParseException {<a name="line.956"></a>
-<span class="sourceLineNo">957</span>      String s = get(key);<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      if (s == null)<a name="line.958"></a>
-<span class="sourceLineNo">959</span>         return null;<a name="line.959"></a>
-<span class="sourceLineNo">960</span>      if (s.isEmpty())<a name="line.960"></a>
-<span class="sourceLineNo">961</span>         return new byte[0];<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      return getObject(key, byte[].class);<a name="line.962"></a>
-<span class="sourceLineNo">963</span>   }<a name="line.963"></a>
-<span class="sourceLineNo">964</span><a name="line.964"></a>
-<span class="sourceLineNo">965</span>   /**<a name="line.965"></a>
-<span class="sourceLineNo">966</span>    * Same as {@link #getBytes(String)} but with a default value if the entry doesn't exist.<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    *<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    * @param key The key.<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    * @param def The default value if the value does not exist.<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    * @return The value, or the default value if the section or key does not exist.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    * @throws ParseException If value could not be converted to a byte array.<a name="line.971"></a>
-<span class="sourceLineNo">972</span>    */<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   public byte[] getBytes(String key, byte[] def) throws ParseException {<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      String s = get(key);<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (s == null)<a name="line.975"></a>
-<span class="sourceLineNo">976</span>         return def;<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      if (s.isEmpty())<a name="line.977"></a>
-<span class="sourceLineNo">978</span>         return def;<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      return getObjectWithDefault(key, def, byte[].class);<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   }<a name="line.980"></a>
-<span class="sourceLineNo">981</span><a name="line.981"></a>
-<span class="sourceLineNo">982</span>   /**<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    * Gets the entry with the specified key and converts it to the specified value.<a name="line.983"></a>
-<span class="sourceLineNo">984</span>    *<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    * &lt;p&gt;<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    * The key can be in one of the following formats...<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    * &lt;ul class='spaced-list'&gt;<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    *    &lt;li&gt;<a name="line.988"></a>
-<span class="sourceLineNo">989</span>    *       &lt;js&gt;"key"&lt;/js&gt; - A value in the default section (i.e. defined above any &lt;code&gt;[section]&lt;/code&gt; header).<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    *    &lt;li&gt;<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    *       &lt;js&gt;"section/key"&lt;/js&gt; - A value from the specified section.<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    * &lt;/ul&gt;<a name="line.992"></a>
-<span class="sourceLineNo">993</span>    *<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    * &lt;p&gt;<a name="line.994"></a>
-<span class="sourceLineNo">995</span>    * The type can be a simple type (e.g. beans, strings, numbers) or parameterized type (collections/maps).<a name="line.995"></a>
-<span class="sourceLineNo">996</span>    *<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    * &lt;h5 class='section'&gt;Examples:&lt;/h5&gt;<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    * &lt;p class='bcode w800'&gt;<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    *    Config cf = Config.&lt;jsm&gt;create&lt;/jsm&gt;().name(&lt;js&gt;"MyConfig.cfg"&lt;/js&gt;).build();<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    *<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    *    &lt;jc&gt;// Parse into a linked-list of strings.&lt;/jc&gt;<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    *    List l = cf.getObject(&lt;js&gt;"MySection/myListOfStrings"&lt;/js&gt;, LinkedList.&lt;jk&gt;class&lt;/jk&gt;, String.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    *<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>    *    &lt;jc&gt;// Parse into a linked-list of beans.&lt;/jc&gt;<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    *    List l = cf.getObject(&lt;js&gt;"MySection/myListOfBeans"&lt;/js&gt;, LinkedList.&lt;jk&gt;class&lt;/jk&gt;, MyBean.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1005"></a>
+<span class="sourceLineNo">950</span>    * &lt;p&gt;<a name="line.950"></a>
+<span class="sourceLineNo">951</span>    * This is equivalent to calling the following:<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    * &lt;p class='bcode w800'&gt;<a name="line.952"></a>
+<span class="sourceLineNo">953</span>    *    &lt;jk&gt;byte&lt;/jk&gt;[] b = config.getObject(key, &lt;jk&gt;byte&lt;/jk&gt;[].&lt;jk&gt;class&lt;/jk&gt;);<a name="line.953"></a>
+<span class="sourceLineNo">954</span>    * &lt;/p&gt;<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    *<a name="line.955"></a>
+<span class="sourceLineNo">956</span>    * Byte arrays are stored as encoded strings, typically BASE64, but dependent on the {@link #CONFIG_binaryFormat} setting.<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    *<a name="line.957"></a>
+<span class="sourceLineNo">958</span>    * @param key The key.<a name="line.958"></a>
+<span class="sourceLineNo">959</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    * @throws ParseException If value could not be converted to a byte array.<a name="line.960"></a>
+<span class="sourceLineNo">961</span>    */<a name="line.961"></a>
+<span class="sourceLineNo">962</span>   public byte[] getBytes(String key) throws ParseException {<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      String s = get(key);<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      if (s == null)<a name="line.964"></a>
+<span class="sourceLineNo">965</span>         return null;<a name="line.965"></a>
+<span class="sourceLineNo">966</span>      if (s.isEmpty())<a name="line.966"></a>
+<span class="sourceLineNo">967</span>         return new byte[0];<a name="line.967"></a>
+<span class="sourceLineNo">968</span>      return getObject(key, byte[].class);<a name="line.968"></a>
+<span class="sourceLineNo">969</span>   }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>   /**<a name="line.971"></a>
+<span class="sourceLineNo">972</span>    * Same as {@link #getBytes(String)} but with a default value if the entry doesn't exist.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>    *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>    * @param key The key.<a name="line.974"></a>
+<span class="sourceLineNo">975</span>    * @param def The default value if the value does not exist.<a name="line.975"></a>
+<span class="sourceLineNo">976</span>    * @return The value, or the default value if the section or key does not exist.<a name="line.976"></a>
+<span class="sourceLineNo">977</span>    * @throws ParseException If value could not be converted to a byte array.<a name="line.977"></a>
+<span class="sourceLineNo">978</span>    */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>   public byte[] getBytes(String key, byte[] def) throws ParseException {<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      String s = get(key);<a name="line.980"></a>
+<span class="sourceLineNo">981</span>      if (s == null)<a name="line.981"></a>
+<span class="sourceLineNo">982</span>         return def;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>      if (s.isEmpty())<a name="line.983"></a>
+<span class="sourceLineNo">984</span>         return def;<a name="line.984"></a>
+<span class="sourceLineNo">985</span>      return getObjectWithDefault(key, def, byte[].class);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>   }<a name="line.986"></a>
+<span class="sourceLineNo">987</span><a name="line.987"></a>
+<span class="sourceLineNo">988</span>   /**<a name="line.988"></a>
+<span class="sourceLineNo">989</span>    * Gets the entry with the specified key and converts it to the specified value.<a name="line.989"></a>
+<span class="sourceLineNo">990</span>    *<a name="line.990"></a>
+<span class="sourceLineNo">991</span>    * &lt;p&gt;<a name="line.991"></a>
+<span class="sourceLineNo">992</span>    * The key can be in one of the following formats...<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    * &lt;ul class='spaced-list'&gt;<a name="line.993"></a>
+<span class="sourceLineNo">994</span>    *    &lt;li&gt;<a name="line.994"></a>
+<span class="sourceLineNo">995</span>    *       &lt;js&gt;"key"&lt;/js&gt; - A value in the default section (i.e. defined above any &lt;code&gt;[section]&lt;/code&gt; header).<a name="line.995"></a>
+<span class="sourceLineNo">996</span>    *    &lt;li&gt;<a name="line.996"></a>
+<span class="sourceLineNo">997</span>    *       &lt;js&gt;"section/key"&lt;/js&gt; - A value from the specified section.<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    * &lt;/ul&gt;<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    *<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    * &lt;p&gt;<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    * The type can be a simple type (e.g. beans, strings, numbers) or parameterized type (collections/maps).<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    *<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    * &lt;h5 class='section'&gt;Examples:&lt;/h5&gt;<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    * &lt;p class='bcode w800'&gt;<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span>    *    Config cf = Config.&lt;jsm&gt;create&lt;/jsm&gt;().name(&lt;js&gt;"MyConfig.cfg"&lt;/js&gt;).build();<a name="line.1005"></a>
 <span class="sourceLineNo">1006</span>    *<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    *    &lt;jc&gt;// Parse into a linked-list of linked-lists of strings.&lt;/jc&gt;<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>    *    List l = cf.getObject(&lt;js&gt;"MySection/my2dListOfStrings"&lt;/js&gt;, LinkedList.&lt;jk&gt;class&lt;/jk&gt;,<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>    *       LinkedList.&lt;jk&gt;class&lt;/jk&gt;, String.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>    *<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>    *    &lt;jc&gt;// Parse into a map of string keys/values.&lt;/jc&gt;<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>    *    Map m = cf.getObject(&lt;js&gt;"MySection/myMap"&lt;/js&gt;, TreeMap.&lt;jk&gt;class&lt;/jk&gt;, String.&lt;jk&gt;class&lt;/jk&gt;,<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>    *       String.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>    *<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>    *    &lt;jc&gt;// Parse into a map containing string keys and values of lists containing beans.&lt;/jc&gt;<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>    *    Map m = cf.getObject(&lt;js&gt;"MySection/myMapOfListsOfBeans"&lt;/js&gt;, TreeMap.&lt;jk&gt;class&lt;/jk&gt;, String.&lt;jk&gt;class&lt;/jk&gt;,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>    *       List.&lt;jk&gt;class&lt;/jk&gt;, MyBean.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>    * &lt;/p&gt;<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>    *<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>    * &lt;p&gt;<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>    * &lt;code&gt;Collection&lt;/code&gt; classes are assumed to be followed by zero or one objects indicating the element type.<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>    *<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>    * &lt;p&gt;<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>    * &lt;code&gt;Map&lt;/code&gt; classes are assumed to be followed by zero or two meta objects indicating the key and value<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>    * types.<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>    *<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>    * &lt;p&gt;<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>    * The array can be arbitrarily long to indicate arbitrarily complex data structures.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>    *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>    * &lt;h5 class='section'&gt;Notes:&lt;/h5&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>    * &lt;ul class='spaced-list'&gt;<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>    *    &lt;li&gt;<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>    *       Use the {@link #getObject(String, Class)} method instead if you don't need a parameterized map/collection.<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>    * &lt;/ul&gt;<a name="line.1034"></a>
+<span class="sourceLineNo">1007</span>    *    &lt;jc&gt;// Parse into a linked-list of strings.&lt;/jc&gt;<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    *    List l = cf.getObject(&lt;js&gt;"MySection/myListOfStrings"&lt;/js&gt;, LinkedList.&lt;jk&gt;class&lt;/jk&gt;, String.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>    *<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>    *    &lt;jc&gt;// Parse into a linked-list of beans.&lt;/jc&gt;<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>    *    List l = cf.getObject(&lt;js&gt;"MySection/myListOfBeans"&lt;/js&gt;, LinkedList.&lt;jk&gt;class&lt;/jk&gt;, MyBean.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span>    *<a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>    *    &lt;jc&gt;// Parse into a linked-list of linked-lists of strings.&lt;/jc&gt;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>    *    List l = cf.getObject(&lt;js&gt;"MySection/my2dListOfStrings"&lt;/js&gt;, LinkedList.&lt;jk&gt;class&lt;/jk&gt;,<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span>    *       LinkedList.&lt;jk&gt;class&lt;/jk&gt;, String.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>    *<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>    *    &lt;jc&gt;// Parse into a map of string keys/values.&lt;/jc&gt;<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>    *    Map m = cf.getObject(&lt;js&gt;"MySection/myMap"&lt;/js&gt;, TreeMap.&lt;jk&gt;class&lt;/jk&gt;, String.&lt;jk&gt;class&lt;/jk&gt;,<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>    *       String.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>    *<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>    *    &lt;jc&gt;// Parse into a map containing string keys and values of lists containing beans.&lt;/jc&gt;<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span>    *    Map m = cf.getObject(&lt;js&gt;"MySection/myMapOfListsOfBeans"&lt;/js&gt;, TreeMap.&lt;jk&gt;class&lt;/jk&gt;, String.&lt;jk&gt;class&lt;/jk&gt;,<a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>    *       List.&lt;jk&gt;class&lt;/jk&gt;, MyBean.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>    * &lt;/p&gt;<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>    *<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>    * &lt;p&gt;<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>    * &lt;code&gt;Collection&lt;/code&gt; classes are assumed to be followed by zero or one objects indicating the element type.<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>    *<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span>    * &lt;p&gt;<a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>    * &lt;code&gt;Map&lt;/code&gt; classes are assumed to be followed by zero or two meta objects indicating the key and value<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>    * types.<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>    *<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>    * &lt;p&gt;<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>    * The array can be arbitrarily long to indicate arbitrarily complex data structures.<a name="line.1034"></a>
 <span class="sourceLineNo">1035</span>    *<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>    * @param key The key.<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>    * @param type<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>    *    The object type to create.<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>    * @param args<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>    *    The type arguments of the class if it's a collection or map.<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>    *    &lt;br&gt;Ignored if the main type is not a map or collection.<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>    */<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>   public &lt;T&gt; T getObject(String key, Type type, Type...args) throws ParseException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>      return getObject(key, (Parser)null, type, args);<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>   }<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span><a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>   /**<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    * Same as {@link #getObject(String, Type, Type...)} but allows you to specify the parser to use to parse the value.<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>    *<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>    * @param key The key.<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>    * @param parser<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>    *    The parser to use for parsing the object.<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined parser on the config file.<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    * @param type<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    *    The object type to create.<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>    * @param args<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    *    The type arguments of the class if it's a collection or map.<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    *    &lt;br&gt;Ignored if the main type is not a map or collection.<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    */<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>   public &lt;T&gt; T getObject(String key, Parser parser, Type type, Type...args) throws ParseException {<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>      assertFieldNotNull(type, "type");<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return parse(getString(key), parser, type, args);<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>   }<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span><a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>   /**<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    * Same as {@link #getObject(String, Type, Type...)} except optimized for a non-parameterized class.<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    *<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>    * &lt;p&gt;<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>    * This is the preferred parse method for simple types since you don't need to cast the results.<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>    *<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>    * &lt;h5 class='section'&gt;Examples:&lt;/h5&gt;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>    * &lt;p class='bcode w800'&gt;<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>    *    Config cf = Config.&lt;jsm&gt;create&lt;/jsm&gt;().name(&lt;js&gt;"MyConfig.cfg"&lt;/js&gt;).build();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>    *<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>    *    &lt;jc&gt;// Parse into a string.&lt;/jc&gt;<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>    *    String s = cf.getObject(&lt;js&gt;"MySection/mySimpleString"&lt;/js&gt;, String.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>    *<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>    *    &lt;jc&gt;// Parse into a bean.&lt;/jc&gt;<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>    *    MyBean b = cf.getObject(&lt;js&gt;"MySection/myBean"&lt;/js&gt;, MyBean.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1087"></a>
+<span class="sourceLineNo">1036</span>    * &lt;h5 class='section'&gt;Notes:&lt;/h5&gt;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>    * &lt;ul class='spaced-list'&gt;<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>    *    &lt;li&gt;<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>    *       Use the {@link #getObject(String, Class)} method instead if you don't need a parameterized map/collection.<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>    * &lt;/ul&gt;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>    *<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>    * @param key The key.<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>    * @param type<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>    *    The object type to create.<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>    * @param args<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>    *    The type arguments of the class if it's a collection or map.<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>    *    &lt;br&gt;Ignored if the main type is not a map or collection.<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>    */<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>   public &lt;T&gt; T getObject(String key, Type type, Type...args) throws ParseException {<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>      return getObject(key, (Parser)null, type, args);<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>   }<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span><a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>   /**<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>    * Same as {@link #getObject(String, Type, Type...)} but allows you to specify the parser to use to parse the value.<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>    *<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>    * @param key The key.<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>    * @param parser<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>    *    The parser to use for parsing the object.<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined parser on the config file.<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span>    * @param type<a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>    *    The object type to create.<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>    * @param args<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span>    *    The type arguments of the class if it's a collection or map.<a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span>    *    &lt;br&gt;Ignored if the main type is not a map or collection.<a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>    */<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span>   public &lt;T&gt; T getObject(String key, Parser parser, Type type, Type...args) throws ParseException {<a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>      assertFieldNotNull(type, "type");<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>      return parse(getString(key), parser, type, args);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>   }<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>   /**<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>    * Same as {@link #getObject(String, Type, Type...)} except optimized for a non-parameterized class.<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>    *<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>    * &lt;p&gt;<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>    * This is the preferred parse method for simple types since you don't need to cast the results.<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>    *<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>    * &lt;h5 class='section'&gt;Examples:&lt;/h5&gt;<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>    * &lt;p class='bcode w800'&gt;<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>    *    Config cf = Config.&lt;jsm&gt;create&lt;/jsm&gt;().name(&lt;js&gt;"MyConfig.cfg"&lt;/js&gt;).build();<a name="line.1087"></a>
 <span class="sourceLineNo">1088</span>    *<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>    *    &lt;jc&gt;// Parse into a bean array.&lt;/jc&gt;<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>    *    MyBean[] b = cf.getObject(&lt;js&gt;"MySection/myBeanArray"&lt;/js&gt;, MyBean[].&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1090"></a>
+<span class="sourceLineNo">1089</span>    *    &lt;jc&gt;// Parse into a string.&lt;/jc&gt;<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>    *    String s = cf.getObject(&lt;js&gt;"MySection/mySimpleString"&lt;/js&gt;, String.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1090"></a>
 <span class="sourceLineNo">1091</span>    *<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span>    *    &lt;jc&gt;// Parse into a linked-list of objects.&lt;/jc&gt;<a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>    *    List l = cf.getObject(&lt;js&gt;"MySection/myList"&lt;/js&gt;, LinkedList.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1093"></a>
+<span class="sourceLineNo">1092</span>    *    &lt;jc&gt;// Parse into a bean.&lt;/jc&gt;<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span>    *    MyBean b = cf.getObject(&lt;js&gt;"MySection/myBean"&lt;/js&gt;, MyBean.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1093"></a>
 <span class="sourceLineNo">1094</span>    *<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>    *    &lt;jc&gt;// Parse into a map of object keys/values.&lt;/jc&gt;<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span>    *    Map m = cf.getObject(&lt;js&gt;"MySection/myMap"&lt;/js&gt;, TreeMap.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>    * &lt;/p&gt;<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>    *<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>    * @param &lt;T&gt; The class type of the object being created.<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>    * @param key The key.<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>    * @param type The object type to create.<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>    * @return The parsed object.<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>    * @throws ParseException<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    *    If the input contains a syntax error or is malformed, or is not valid for the specified type.<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>    * @see BeanSession#getClassMeta(Type,Type...) for argument syntax for maps and collections.<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>    */<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>   public &lt;T&gt; T getObject(String key, Class&lt;T&gt; type) throws ParseException {<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>      return getObject(key, (Parser)null, type);<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>   }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>   /**<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    * Same as {@link #getObject(String, Class)} but allows you to specify the parser to use to parse the value.<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    *<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>    * @param &lt;T&gt; The class type of the object being created.<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    * @param key The key.<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    * @param parser<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    *    The parser to use for parsing the object.<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined parser on the config file.<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>    * @param type The object type to create.<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>    * @return The parsed object.<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>    * @throws ParseException<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>    *    If the input contains a syntax error or is malformed, or is not valid for the specified type.<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>    * @see BeanSession#getClassMeta(Type,Type...) for argument syntax for maps and collections.<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>    */<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>   public &lt;T&gt; T getObject(String key, Parser parser, Class&lt;T&gt; type) throws ParseException {<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>      assertFieldNotNull(type, "c");<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>      return parse(getString(key), parser, type);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>   }<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span><a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>   /**<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>    * Gets the entry with the specified key and converts it to the specified value.<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>    *<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>    * &lt;p&gt;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>    * Same as {@link #getObject(String, Class)}, but with a default value.<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>    *<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>    * @param key The key.<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>    * @param def The default value if the value does not exist.<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>    * @param type The class to convert the value to.<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>    */<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>   public &lt;T&gt; T getObjectWithDefault(String key, T def, Class&lt;T&gt; type) throws ParseException {<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>      return getObjectWithDefault(key, null, def, type);<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>   }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>   /**<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>    * Same as {@link #getObjectWithDefault(String, Object, Class)} but allows you to specify the parser to use to parse<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    * the value.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    *<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span>    * @param key The key.<a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    * @param parser<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    *    The parser to use for parsing the object.<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined parser on the config file.<a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    * @param def The default value if the value does not exist.<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    * @param type The class to convert the value to.<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>    */<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span>   public &lt;T&gt; T getObjectWithDefault(String key, Parser parser, T def, Class&lt;T&gt; type) throws ParseException {<a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      assertFieldNotNull(type, "c");<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      T t = parse(getString(key), parser, type);<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>      return (t == null ? def : t);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>   }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>   /**<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>    * Gets the entry with the specified key and converts it to the specified value.<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>    *<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>    * &lt;p&gt;<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>    * Same as {@link #getObject(String, Type, Type...)}, but with a default value.<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>    *<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>    * @param key The key.<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>    * @param def The default value if the value does not exist.<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span>    * @param type<a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>    *    The object type to create.<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>    * @param args<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>    *    The type arguments of the class if it's a collection or map.<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>    *    &lt;br&gt;Ignored if the main type is not a map or collection.<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>    */<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>   public &lt;T&gt; T getObjectWithDefault(String key, T def, Type type, Type...args) throws ParseException {<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>      return getObjectWithDefault(key, null, def, type, args);<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>   }<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span><a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>   /**<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>    * Same as {@link #getObjectWithDefault(String, Object, Type, Type...)} but allows you to specify the parser to use<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>    * to parse the value.<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>    *<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>    * @param key The key.<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>    * @param parser<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>    *    The parser to use for parsing the object.<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined parser on the config file.<a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>    * @param def The default value if the value does not exist.<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>    * @param type<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>    *    The object type to create.<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>    * @param args<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>    *    The type arguments of the class if it's a collection or map.<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    *    &lt;br&gt;Ignored if the main type is not a map or collection.<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    */<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>   public &lt;T&gt; T getObjectWithDefault(String key, Parser parser, T def, Type type, Type...args) throws ParseException {<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      assertFieldNotNull(type, "type");<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>      T t = parse(getString(key), parser, type, args);<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>      return (t == null ? def : t);<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>   }<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span><a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>   /**<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span>    * Convenience method for returning a config entry as an {@link ObjectMap}.<a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    *<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    * @param key The key.<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    * @throws ParseException<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    */<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>   public ObjectMap getObjectMap(String key) throws ParseException {<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      return getObject(key, ObjectMap.class);<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>   }<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span><a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>   /**<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    * Convenience method for returning a config entry as an {@link ObjectMap}.<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>    *<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    * @param key The key.<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    * @param def The default value.<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    * @return The value, or the default value if the section or key does not exist.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    * @throws ParseException<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    */<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span>   public ObjectMap getObjectMap(String key, ObjectMap def) throws ParseException {<a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>      return getObjectWithDefault(key, def, ObjectMap.class);<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>   }<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span><a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>   /**<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    * Convenience method for returning a config entry as an {@link ObjectList}.<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    *<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>    * @param key The key.<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span>    * @throws ParseException<a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    */<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>   public ObjectList getObjectList(String key) throws ParseException {<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>      return getObject(key, ObjectList.class);<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>   }<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>   /**<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>    * Convenience method for returning a config entry as an {@link ObjectList}.<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>    *<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    * @param key The key.<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>    * @param def The default value.<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>    * @return The value, or the default value if the section or key does not exist.<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    * @throws ParseException<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>    */<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>   public ObjectList getObjectList(String key, ObjectList def) throws ParseException {<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>      return getObjectWithDefault(key, def, ObjectList.class);<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span>   }<a name="line.1256"></a>
-<span class="sourceLineNo">1257</span><a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>   /**<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    * Returns the keys of the entries in the specified section.<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    *<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    * @param section<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span>    *    The section name to write from.<a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    * @return<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    *    An unmodifiable set of keys, or an empty set if the section doesn't exist.<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    */<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>   public Set&lt;String&gt; getKeys(String section) {<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>      return configMap.getKeys(section(section));<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>   }<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span><a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>   /**<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    * Copies the entries in a section to the specified bean by calling the public setters on that bean.<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>    *<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>    * @param section<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>    *    The section name to write from.<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>    * @param bean The bean to set the properties on.<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>    * @param ignoreUnknownProperties<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>    *    If &lt;jk&gt;true&lt;/jk&gt;, don't throw an {@link IllegalArgumentException} if this section contains a key that doesn't<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>    *    correspond to a setter method.<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>    * @return An object map of the changes made to the bean.<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>    * @throws ParseException If parser was not set on this config file or invalid properties were found in the section.<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>    * @throws IllegalArgumentException<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>    * @throws IllegalAccessException<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>    * @throws InvocationTargetException<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>    */<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>   public Config writeProperties(String section, Object bean, boolean ignoreUnknownProperties) throws ParseException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>      checkWrite();<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      assertFieldNotNull(bean, "bean");<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>      section = section(section);<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span><a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>      Set&lt;String&gt; keys = configMap.getKeys(section);<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      if (keys == null)<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>         throw new IllegalArgumentException("Section '"+section+"' not found in configuration.");<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span><a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>      BeanMap&lt;?&gt; bm = beanSession.toBeanMap(bean);<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      for (String k : keys) {<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>         BeanPropertyMeta bpm = bm.getPropertyMeta(k);<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>         if (bpm == null) {<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>            if (! ignoreUnknownProperties)<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>               throw new ParseException("Unknown property ''{0}'' encountered in configuration section ''{1}''.", k, section);<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>         } else {<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>            bm.put(k, getObject(section + '/' + k, bpm.getClassMeta().getInnerClass()));<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span>         }<a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>      }<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span><a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>      return this;<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   }<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span><a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>   /**<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    * Shortcut for calling &lt;code&gt;getSectionAsBean(sectionName, c, &lt;jk&gt;false&lt;/jk&gt;)&lt;/code&gt;.<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    *<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    * @param section<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span>    *    The section name to write from.<a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>    * @param c The bean class to create.<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>    * @return A new bean instance.<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>    * @throws ParseException<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>    */<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>   public &lt;T&gt; T getSectionAsBean(String section, Class&lt;T&gt;c) throws ParseException {<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span>      return getSectionAsBean(section, c, false);<a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>   }<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span><a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>   /**<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>    * Converts this config file section to the specified bean instance.<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>    *<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>    * &lt;p&gt;<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>    * Key/value pairs in the config file section get copied as bean property values to the specified bean class.<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>    *<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>    * &lt;h5 class='figure'&gt;Example config file&lt;/h5&gt;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>    * &lt;p class='bcode w800'&gt;<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>    *    &lt;cs&gt;[MyAddress]&lt;/cs&gt;<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    *    &lt;ck&gt;name&lt;/ck&gt; = &lt;cv&gt;John Smith&lt;/cv&gt;<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>    *    &lt;ck&gt;street&lt;/ck&gt; = &lt;cv&gt;123 Main Street&lt;/cv&gt;<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span>    *    &lt;ck&gt;city&lt;/ck&gt; = &lt;cv&gt;Anywhere&lt;/cv&gt;<a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>    *    &lt;ck&gt;state&lt;/ck&gt; = &lt;cv&gt;NY&lt;/cv&gt;<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>    *    &lt;ck&gt;zip&lt;/ck&gt; = &lt;cv&gt;12345&lt;/cv&gt;<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>    * &lt;/p&gt;<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>    *<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>    * &lt;h5 class='figure'&gt;Example bean&lt;/h5&gt;<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    * &lt;p class='bcode w800'&gt;<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    *    &lt;jk&gt;public class&lt;/jk&gt; Address {<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>    *       public String name, street, city;<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    *       public StateEnum state;<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    *       public int zip;<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    *    }<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    * &lt;/p&gt;<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    *<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    * &lt;h5 class='figure'&gt;Example usage&lt;/h5&gt;<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    * &lt;p class='bcode w800'&gt;<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    *    Config cf = Config.&lt;jsm&gt;create&lt;/jsm&gt;().name(&lt;js&gt;"MyConfig.cfg"&lt;/js&gt;).build();<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    *    Address myAddress = cf.getSectionAsBean(&lt;js&gt;"MySection"&lt;/js&gt;, Address.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1356"></a>
+<span class="sourceLineNo">1095</span>    *    &lt;jc&gt;// Parse into a bean array.&lt;/jc&gt;<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>    *    MyBean[] b = cf.getObject(&lt;js&gt;"MySection/myBeanArray"&lt;/js&gt;, MyBean[].&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span>    *<a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>    *    &lt;jc&gt;// Parse into a linked-list of objects.&lt;/jc&gt;<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>    *    List l = cf.getObject(&lt;js&gt;"MySection/myList"&lt;/js&gt;, LinkedList.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>    *<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>    *    &lt;jc&gt;// Parse into a map of object keys/values.&lt;/jc&gt;<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>    *    Map m = cf.getObject(&lt;js&gt;"MySection/myMap"&lt;/js&gt;, TreeMap.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>    * &lt;/p&gt;<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>    *<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    * @param &lt;T&gt; The class type of the object being created.<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>    * @param key The key.<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>    * @param type The object type to create.<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>    * @return The parsed object.<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    * @throws ParseException<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>    *    If the input contains a syntax error or is malformed, or is not valid for the specified type.<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>    * @see BeanSession#getClassMeta(Type,Type...) for argument syntax for maps and collections.<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>    */<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>   public &lt;T&gt; T getObject(String key, Class&lt;T&gt; type) throws ParseException {<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>      return getObject(key, (Parser)null, type);<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>   }<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span><a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>   /**<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    * Same as {@link #getObject(String, Class)} but allows you to specify the parser to use to parse the value.<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>    *<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>    * @param &lt;T&gt; The class type of the object being created.<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>    * @param key The key.<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>    * @param parser<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>    *    The parser to use for parsing the object.<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined parser on the config file.<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>    * @param type The object type to create.<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>    * @return The parsed object.<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>    * @throws ParseException<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>    *    If the input contains a syntax error or is malformed, or is not valid for the specified type.<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>    * @see BeanSession#getClassMeta(Type,Type...) for argument syntax for maps and collections.<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>    */<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>   public &lt;T&gt; T getObject(String key, Parser parser, Class&lt;T&gt; type) throws ParseException {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>      assertFieldNotNull(type, "c");<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>      return parse(getString(key), parser, type);<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>   }<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span><a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>   /**<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>    * Gets the entry with the specified key and converts it to the specified value.<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>    *<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>    * &lt;p&gt;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    * Same as {@link #getObject(String, Class)}, but with a default value.<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    *<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>    * @param key The key.<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>    * @param def The default value if the value does not exist.<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    * @param type The class to convert the value to.<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>    */<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>   public &lt;T&gt; T getObjectWithDefault(String key, T def, Class&lt;T&gt; type) throws ParseException {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>      return getObjectWithDefault(key, null, def, type);<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>   }<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>   /**<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    * Same as {@link #getObjectWithDefault(String, Object, Class)} but allows you to specify the parser to use to parse<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span>    * the value.<a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    *<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    * @param key The key.<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    * @param parser<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    *    The parser to use for parsing the object.<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined parser on the config file.<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span>    * @param def The default value if the value does not exist.<a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>    * @param type The class to convert the value to.<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>    */<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span>   public &lt;T&gt; T getObjectWithDefault(String key, Parser parser, T def, Class&lt;T&gt; type) throws ParseException {<a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      assertFieldNotNull(type, "c");<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      T t = parse(getString(key), parser, type);<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>      return (t == null ? def : t);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>   }<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span><a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>   /**<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>    * Gets the entry with the specified key and converts it to the specified value.<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>    *<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span>    * &lt;p&gt;<a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>    * Same as {@link #getObject(String, Type, Type...)}, but with a default value.<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>    *<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>    * @param key The key.<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>    * @param def The default value if the value does not exist.<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span>    * @param type<a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>    *    The object type to create.<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>    * @param args<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>    *    The type arguments of the class if it's a collection or map.<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>    *    &lt;br&gt;Ignored if the main type is not a map or collection.<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>    */<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>   public &lt;T&gt; T getObjectWithDefault(String key, T def, Type type, Type...args) throws ParseException {<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>      return getObjectWithDefault(key, null, def, type, args);<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>   }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span><a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>   /**<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>    * Same as {@link #getObjectWithDefault(String, Object, Type, Type...)} but allows you to specify the parser to use<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span>    * to parse the value.<a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>    *<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>    * @param key The key.<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>    * @param parser<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>    *    The parser to use for parsing the object.<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>    *    If &lt;jk&gt;null&lt;/jk&gt;, then uses the predefined parser on the config file.<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>    * @param def The default value if the value does not exist.<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    * @param type<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    *    The object type to create.<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>    * @param args<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    *    The type arguments of the class if it's a collection or map.<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    *    &lt;br&gt;Can be any of the following: {@link ClassMeta}, {@link Class}, {@link ParameterizedType}, {@link GenericArrayType}<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>    *    &lt;br&gt;Ignored if the main type is not a map or collection.<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    * @throws ParseException If parser could not parse the value or if a parser is not registered with this config file.<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    */<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>   public &lt;T&gt; T getObjectWithDefault(String key, Parser parser, T def, Type type, Type...args) throws ParseException {<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>      assertFieldNotNull(type, "type");<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span>      T t = parse(getString(key), parser, type, args);<a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>      return (t == null ? def : t);<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>   }<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>   /**<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    * Convenience method for returning a config entry as an {@link ObjectMap}.<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>    *<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>    * @param key The key.<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>    * @throws ParseException<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>    */<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>   public ObjectMap getObjectMap(String key) throws ParseException {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      return getObject(key, ObjectMap.class);<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>   }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span><a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>   /**<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    * Convenience method for returning a config entry as an {@link ObjectMap}.<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    *<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span>    * @param key The key.<a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    * @param def The default value.<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    * @return The value, or the default value if the section or key does not exist.<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    * @throws ParseException<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>    */<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>   public ObjectMap getObjectMap(String key, ObjectMap def) throws ParseException {<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>      return getObjectWithDefault(key, def, ObjectMap.class);<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>   }<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span><a name="line.1240"></a>
+<span class="sourceLineNo">1241</span>   /**<a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    * Convenience method for returning a config entry as an {@link ObjectList}.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    *<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    * @param key The key.<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    * @return The value, or &lt;jk&gt;null&lt;/jk&gt; if the section or key does not exist.<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span>    * @throws ParseException<a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    */<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>   public ObjectList getObjectList(String key) throws ParseException {<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      return getObject(key, ObjectList.class);<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>   }<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span><a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>   /**<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    * Convenience method for returning a config entry as an {@link ObjectList}.<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>    *<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    * @param key The key.<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>    * @param def The default value.<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span>    * @return The value, or the default value if the section or key does not exist.<a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>    * @throws ParseException<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>    */<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>   public ObjectList getObjectList(String key, ObjectList def) throws ParseException {<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>      return getObjectWithDefault(key, def, ObjectList.class);<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>   }<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>   /**<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    * Returns the keys of the entries in the specified section.<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    *<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    * @param section<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    *    The section name to write from.<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    * @return<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    *    An unmodifiable set of keys, or an empty set if the section doesn't exist.<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    */<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>   public Set&lt;String&gt; getKeys(String section) {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      return configMap.getKeys(section(section));<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>   }<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span><a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>   /**<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>    * Copies the entries in a section to the specified bean by calling the public setters on that bean.<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>    *<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>    * @param section<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>    *    The section name to write from.<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>    * @param bean The bean to set the properties on.<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>    * @param ignoreUnknownProperties<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>    *    If &lt;jk&gt;true&lt;/jk&gt;, don't throw an {@link IllegalArgumentException} if this section contains a key that doesn't<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>    *    correspond to a setter method.<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    * @return An object map of the changes made to the bean.<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>    * @throws ParseException If parser was not set on this config file or invalid properties were found in the section.<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>    * @throws IllegalArgumentException<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>    * @throws IllegalAccessException<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>    * @throws InvocationTargetException<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    */<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>   public Config writeProperties(String section, Object bean, boolean ignoreUnknownProperties) throws ParseException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      checkWrite();<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>      assertFieldNotNull(bean, "bean");<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      section = section(section);<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span><a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      Set&lt;String&gt; keys = configMap.getKeys(section);<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (keys == null)<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>         throw new IllegalArgumentException("Section '"+section+"' not found in configuration.");<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span><a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      BeanMap&lt;?&gt; bm = beanSession.toBeanMap(bean);<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>      for (String k : keys) {<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>         BeanPropertyMeta bpm = bm.getPropertyMeta(k);<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span>         if (bpm == null) {<a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>            if (! ignoreUnknownProperties)<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>               throw new ParseException("Unknown property ''{0}'' encountered in configuration section ''{1}''.", k, section);<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>         } else {<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>            bm.put(k, getObject(section + '/' + k, bpm.getClassMeta().getInnerClass()));<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>         }<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>      }<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span><a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>      return this;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>   }<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>   /**<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>    * Shortcut for calling &lt;code&gt;getSectionAsBean(sectionName, c, &lt;jk&gt;false&lt;/jk&gt;)&lt;/code&gt;.<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>    *<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>    * @param section<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>    *    The section name to write from.<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span>    * @param c The bean class to create.<a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    * @return A new bean instance.<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    * @throws ParseException<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>    */<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>   public &lt;T&gt; T getSectionAsBean(String section, Class&lt;T&gt;c) throws ParseException {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>      return getSectionAsBean(section, c, false);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>   }<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span><a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>   /**<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>    * Converts this config file section to the specified bean instance.<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>    *<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>    * &lt;p&gt;<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    * Key/value pairs in the config file section get copied as bean property values to the specified bean class.<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>    *<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span>    * &lt;h5 class='figure'&gt;Example config file&lt;/h5&gt;<a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>    * &lt;p class='bcode w800'&gt;<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>    *    &lt;cs&gt;[MyAddress]&lt;/cs&gt;<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>    *    &lt;ck&gt;name&lt;/ck&gt; = &lt;cv&gt;John Smith&lt;/cv&gt;<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>    *    &lt;ck&gt;street&lt;/ck&gt; = &lt;cv&gt;123 Main Street&lt;/cv&gt;<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>    *    &lt;ck&gt;city&lt;/ck&gt; = &lt;cv&gt;Anywhere&lt;/cv&gt;<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    *    &lt;ck&gt;state&lt;/ck&gt; = &lt;cv&gt;NY&lt;/cv&gt;<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    *    &lt;ck&gt;zip&lt;/ck&gt; = &lt;cv&gt;12345&lt;/cv&gt;<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>    * &lt;/p&gt;<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    *<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    * &lt;h5 class='figure'&gt;Example bean&lt;/h5&gt;<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    * &lt;p class='bcode w800'&gt;<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    *    &lt;jk&gt;public class&lt;/jk&gt; Address {<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    *       public String name, street, city;<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    *       public StateEnum state;<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    *       public int zip;<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    *    }<a name="line.1356"></a>
 <span class="sourceLineNo">1357</span>    * &lt;/p&gt;<a name="line.1357"></a>
 <span class="sourceLineNo">1358</span>    *<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    * @param section<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    *    The section name to write from.<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    * @param c The bean class to create.<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    * @param ignoreUnknownProperties<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>    *    If &lt;jk&gt;false&lt;/jk&gt;, throws a {@link ParseException} if the section contains an entry that isn't a bean property<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    *    name.<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    * @return A new bean instance, or &lt;jk&gt;null&lt;/jk&gt; if the section doesn't exist.<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>    * @throws ParseException<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    */<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>   public &lt;T&gt; T getSectionAsBean(String section, Class&lt;T&gt; c, boolean ignoreUnknownProperties) throws ParseException {<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>      assertFieldNotNull(c, "c");<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>      section = section(section);<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span><a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>      if (! configMap.hasSection(section))<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>         return null;<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span><a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>      Set&lt;String&gt; keys = configMap.getKeys(section);<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span><a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>      BeanMap&lt;T&gt; bm = beanSession.newBeanMap(c);<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span>      for (String k : keys) {<a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>         BeanPropertyMeta bpm = bm.getPropertyMeta(k);<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>         if (bpm == null) {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>            if (! ignoreUnknownProperties)<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>               throw new ParseException("Unknown property ''{0}'' encountered in configuration section ''{1}''.", k, section);<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>         } else {<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>            bm.put(k, getObject(section + '/' + k, bpm.getClassMeta().getInnerClass()));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>         }<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>      }<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span><a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>      return bm.getBean();<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>   }<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span><a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>   /**<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    * Returns a section of this config copied into an {@link ObjectMap}.<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    *<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>    * @param section<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span>    *    The section name to write from.<a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    * @return A new {@link ObjectMap}, or &lt;jk&gt;null&lt;/jk&gt; if the section doesn't exist.<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    * @throws ParseException<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    */<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>   public ObjectMap getSectionAsMap(String section) throws ParseException {<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>      section = section(section);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span><a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>      if (! configMap.hasSection(section))<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>         return null;<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span><a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      Set&lt;String&gt; keys = configMap.getKeys(section);<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span><a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>      ObjectMap om = new ObjectMap();<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>      for (String k : keys)<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span>         om.put(k, getObject(section + '/' + k, Object.class));<a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>      return om;<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>   }<a name="line.1415"></a>
+<span class="sourceLineNo">1359</span>    * &lt;h5 class='figure'&gt;Example usage&lt;/h5&gt;<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    * &lt;p class='bcode w800'&gt;<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    *    Config cf = Config.&lt;jsm&gt;create&lt;/jsm&gt;().name(&lt;js&gt;"MyConfig.cfg"&lt;/js&gt;).build();<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    *    Address myAddress = cf.getSectionAsBean(&lt;js&gt;"MySection"&lt;/js&gt;, Address.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>    * &lt;/p&gt;<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    *<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    * @param section<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>    *    The section name to write from.<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>    * @param c The bean class to create.<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    * @param ignoreUnknownProperties<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    *    If &lt;jk&gt;false&lt;/jk&gt;, throws a {@link ParseException} if the section contains an entry that isn't a bean property<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    *    name.<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    * @return A new bean instance, or &lt;jk&gt;null&lt;/jk&gt; if the section doesn't exist.<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    * @throws ParseException<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>    */<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>   public &lt;T&gt; T getSectionAsBean(String section, Class&lt;T&gt; c, boolean ignoreUnknownProperties) throws ParseException {<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>      assertFieldNotNull(c, "c");<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>      section = section(section);<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span><a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>      if (! configMap.hasSection(section))<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span>         return null;<a name="line.1381"></a>
+<span class="sourceLineNo">1382</span><a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>      Set&lt;String&gt; keys = configMap.getKeys(section);<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span><a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>      BeanMap&lt;T&gt; bm = beanSession.newBeanMap(c);<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>      for (String k : keys) {<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>         BeanPropertyMeta bpm = bm.getPropertyMeta(k);<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>         if (bpm == null) {<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>            if (! ignoreUnknownProperties)<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>               throw new ParseException("Unknown property ''{0}'' encountered in configuration section ''{1}''.", k, section);<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>         } else {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>            bm.put(k, getObject(section + '/' + k, bpm.getClassMeta().getInnerClass()));<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>         }<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      }<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span><a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>      return bm.getBean();<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>   }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>   /**<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>    * Returns a section of this config copied into an {@link ObjectMap}.<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    *<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    * @param section<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    *    The section name to write from.<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    * @return A new {@link ObjectMap}, or &lt;jk&gt;null&lt;/jk&gt; if the section doesn't exist.<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    * @throws ParseException<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>    */<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>   public ObjectMap getSectionAsMap(String section) throws ParseException {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      section = section(section);<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span><a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>      if (! configMap.hasSection(section))<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>         return null;<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>      Set&lt;String&gt; keys = configMap.getKeys(section);<a name="line.1415"></a>
 <span class="sourceLineNo">1416</span><a name="line.1416"></a>
-<span class="sourceLineNo">1417</span><a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>   /**<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    * Wraps a config file section inside a Java interface so that values in the section can be read and<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>    * write using getters and setters.<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>    *<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>    * &lt;h5 class='figure'&gt;Example config file&lt;/h5&gt;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>    * &lt;p class='bcode w800'&gt;<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>    *    &lt;cs&gt;[MySection]&lt;/cs&gt;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>    *    &lt;ck&gt;string&lt;/ck&gt; = &lt;cv&gt;foo&lt;/cv&gt;<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>    *    &lt;ck&gt;int&lt;/ck&gt; = &lt;cv&gt;123&lt;/cv&gt;<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>    *    &lt;ck&gt;enum&lt;/ck&gt; = &lt;cv&gt;ONE&lt;/cv&gt;<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>    *    &lt;ck&gt;bean&lt;/ck&gt; = &lt;cv&gt;{foo:'bar',baz:123}&lt;/cv&gt;<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    *    &lt;ck&gt;int3dArray&lt;/ck&gt; = &lt;cv&gt;[[[123,null],null],null]&lt;/cv&gt;<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    *    &lt;ck&gt;bean1d3dListMap&lt;/ck&gt; = &lt;cv&gt;{key:[[[[{foo:'bar',baz:123}]]]]}&lt;/cv&gt;<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>    * &lt;/p&gt;<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span>    *<a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>    * &lt;h5 class='figure'&gt;Example interface&lt;/h5&gt;<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    * &lt;p class='bcode w800'&gt;<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    *    &lt;jk&gt;public interface&lt;/jk&gt; MyConfigInterface {<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    *<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    *       String getString();<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    *       &lt;jk&gt;void&lt;/jk&gt; setString(String x);<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>    *<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>    *       &lt;jk&gt;int&lt;/jk&gt; getInt();<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>    *       &lt;jk&gt;void&lt;/jk&gt; setInt(&lt;jk&gt;int&lt;/jk&gt; x);<a name="line.1441"></a>
+<span class="sourceLineNo">1417</span>      ObjectMap om = new ObjectMap();<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>      for (String k : keys)<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>         om.put(k, getObject(section + '/' + k, Object.class));<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>      return om;<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>   }<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span><a name="line.1422"></a>
+<span class="sourceLineNo">1423</span><a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>   /**<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>    * Wraps a config file section inside a Java interface so that values in the section can be read and<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>    * write using getters and setters.<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>    *<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>    * &lt;h5 class='figure'&gt;Example config file&lt;/h5&gt;<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>    * &lt;p class='bcode w800'&gt;<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    *    &lt;cs&gt;[MySection]&lt;/cs&gt;<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    *    &lt;ck&gt;string&lt;/ck&gt; = &lt;cv&gt;foo&lt;/cv&gt;<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>    *    &lt;ck&gt;int&lt;/ck&gt; = &lt;cv&gt;123&lt;/cv&gt;<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span>    *    &lt;ck&gt;enum&lt;/ck&gt; = &lt;cv&gt;ONE&lt;/cv&gt;<a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>    *    &lt;ck&gt;bean&lt;/ck&gt; = &lt;cv&gt;{foo:'bar',baz:123}&lt;/cv&gt;<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    *    &lt;ck&gt;int3dArray&lt;/ck&gt; = &lt;cv&gt;[[[123,null],null],null]&lt;/cv&gt;<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    *    &lt;ck&gt;bean1d3dListMap&lt;/ck&gt; = &lt;cv&gt;{key:[[[[{foo:'bar',baz:123}]]]]}&lt;/cv&gt;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    * &lt;/p&gt;<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    *<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    * &lt;h5 class='figure'&gt;Example interface&lt;/h5&gt;<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>    * &lt;p class='bcode w800'&gt;<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>    *    &lt;jk&gt;public interface&lt;/jk&gt; MyConfigInterface {<a name="line.1441"></a>
 <span class="sourceLineNo">1442</span>    *<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>    *       MyEnum getEnum();<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>    *       &lt;jk&gt;void&lt;/jk&gt; setEnum(MyEnum x);<a name="line.1444"></a>
+<span class="sourceLineNo">1443</span>    *       String getString();<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>    *       &lt;jk&gt;void&lt;/jk&gt; setString(String x);<a name="line.1444"></a>
 <span class="sourceLineNo">1445</span>    *<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>    *       MyBean getBean();<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>    *       &lt;jk&gt;void&lt;/jk&gt; setBean(MyBean x);<a name="line.1447"></a>
+<span class="sourceLineNo">1446</span>    *       &lt;jk&gt;int&lt;/jk&gt; getInt();<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>    *       &lt;jk&gt;void&lt;/jk&gt; setInt(&lt;jk&gt;int&lt;/jk&gt; x);<a name="line.1447"></a>
 <span class="sourceLineNo">1448</span>    *<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    *       &lt;jk&gt;int&lt;/jk&gt;[][][] getInt3dArray();<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>    *       &lt;jk&gt;void&lt;/jk&gt; setInt3dArray(&lt;jk&gt;int&lt;/jk&gt;[][][] x);<a name="line.1450"></a>
+<span class="sourceLineNo">1449</span>    *       MyEnum getEnum();<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    *       &lt;jk&gt;void&lt;/jk&gt; setEnum(MyEnum x);<a name="line.1450"></a>
 <span class="sourceLineNo">1451</span>    *<a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>    *       Map&amp;lt;String,List&amp;lt;MyBean[][][]&amp;gt;&amp;gt; getBean1d3dListMap();<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>    *       &lt;jk&gt;void&lt;/jk&gt; setBean1d3dListMap(Map&amp;lt;String,List&amp;lt;MyBean[][][]&amp;gt;&amp;gt; x);<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    *    }<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    * &lt;/p&gt;<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    *<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    * &lt;h5 class='figure'&gt;Example usage&lt;/h5&gt;<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    * &lt;p class='bcode w800'&gt;<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>    *    Config cf = Config.&lt;jsm&gt;create&lt;/jsm&gt;().name(&lt;js&gt;"MyConfig.cfg"&lt;/js&gt;).build();<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    *<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    *    MyConfigInterface ci = cf.getSectionAsInterface(&lt;js&gt;"MySection"&lt;/js&gt;, MyConfigInterface.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1461"></a>
+<span class="sourceLineNo">1452</span>    *       MyBean getBean();<a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>    *       &lt;jk&gt;void&lt;/jk&gt; setBean(MyBean x);<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>    *<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    *       &lt;jk&gt;int&lt;/jk&gt;[][][] getInt3dArray();<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    *       &lt;jk&gt;void&lt;/jk&gt; setInt3dArray(&lt;jk&gt;int&lt;/jk&gt;[][][] x);<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    *<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    *       Map&amp;lt;String,List&amp;lt;MyBean[][][]&amp;gt;&amp;gt; getBean1d3dListMap();<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    *       &lt;jk&gt;void&lt;/jk&gt; setBean1d3dListMap(Map&amp;lt;String,List&amp;lt;MyBean[][][]&amp;gt;&amp;gt; x);<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>    *    }<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    * &lt;/p&gt;<a name="line.1461"></a>
 <span class="sourceLineNo">1462</span>    *<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    *    &lt;jk&gt;int&lt;/jk&gt; myInt = ci.getInt();<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    *<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    *    ci.setBean(&lt;jk&gt;new&lt;/jk&gt; MyBean());<a name="line.1465"></a>
+<span class="sourceLineNo">1463</span>    * &lt;h5 class='figure'&gt;Example usage&lt;/h5&gt;<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    * &lt;p class='bcode w800'&gt;<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    *    Config cf = Config.&lt;jsm&gt;create&lt;/jsm&gt;().name(&lt;js&gt;"MyConfig.cfg"&lt;/js&gt;).build();<a name="line.1465"></a>
 <span class="sourceLineNo">1466</span>    *<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    *    cf.save();<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    * &lt;/p&gt;<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    *<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>    * &lt;h5 class='section'&gt;Notes&lt;/h5&gt;<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span>    * &lt;ul class='spaced-list'&gt;<a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>    *    &lt;li&gt;Calls to setters when the configuration is read-only will cause {@link UnsupportedOperationException} to be thrown.<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    * &lt;/ul&gt;<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>    *<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>    * @param section<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>    *    The section name to write from.<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>    * @param c The proxy interface class.<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>    * @return The proxy interface.<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>    */<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>   @SuppressWarnings("unchecked")<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>   public &lt;T&gt; T getSectionAsInterface(String section, final Class&lt;T&gt; c) {<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>      assertFieldNotNull(c, "c");<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>      final String section2 = section(section);<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>      if (! c.isInterface())<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>         throw new IllegalArgumentException("Class '"+c.getName()+"' passed to getSectionAsInterface() is not an interface.");<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span><a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>      InvocationHandler h = new InvocationHandler() {<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span><a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>         @Override<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>            BeanInfo bi = Introspector.getBeanInfo(c, null);<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>            for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>               Method rm = pd.getReadMethod(), wm = pd.getWriteMethod();<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>               if (method.equals(rm))<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>                  return Config.this.getObject(section2 + '/' + pd.getName(), rm.getGenericReturnType());<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>               if (method.equals(wm))<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>                  return Config.this.set(section2 + '/' + pd.getName(), args[0]);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>            }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span>            throw new UnsupportedOperationException("Unsupported interface method.  method='" + method + "'");<a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>         }<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>      };<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span><a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>      return (T)Proxy.newProxyInstance(c.getClassLoader(), new Class[] { c }, h);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>   }<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>   /**<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    * Returns &lt;jk&gt;true&lt;/jk&gt; if this section contains the specified key and the key has a non-blank value.<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    *<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>    * @param key The key.<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    * @return &lt;jk&gt;true&lt;/jk&gt; if this section contains the specified key and the key has a non-blank value.<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    */<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span>   public boolean exists(String key) {<a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>      return isNotEmpty(getString(key, null));<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>   }<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span><a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>   /**<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    * Creates the specified section if it doesn't exist.<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>    *<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>    * &lt;p&gt;<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    * Returns the existing section if it already exists.<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span>    *<a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    * @param name<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>    *    The section name.<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>    *    &lt;br&gt;Use blank for the default section.<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>    * @param preLines<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    *    Optional comment and blank lines to add immediately before the section.<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, previous pre-lines will not be replaced.<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    * @return The appended or existing section.<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    */<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span>   public Config setSection(String name, List&lt;String&gt; preLines) {<a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>      try {<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>         return setSection(section(name), preLines, null);<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>      } catch (SerializeException e) {<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>         throw new RuntimeException(e);  // Impossible.<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>      }<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span>   }<a name="line.1541"></a>
-<span class="sourceLineNo">1542</span><a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>   /**<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    * Creates the specified section if it doesn't exist.<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    *<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    * @param name<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>    *    The section name.<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>    *    &lt;br&gt;Use blank for the default section.<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>    * @param preLines<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>    *    Optional comment and blank lines to add immediately before the section.<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, previous pre-lines will not be replaced.<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    * @param contents<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    *    Values to set in the new section.<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    *    &lt;br&gt;Can be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span>    * @return The appended or existing section.<a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    * @throws SerializeException<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    */<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>   public Config setSection(String name, List&lt;String&gt; preLines, Map&lt;String,Object&gt; contents) throws SerializeException {<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>      checkWrite();<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>      configMap.setSection(section(name), preLines);<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span><a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      if (contents != null)<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>         for (Map.Entry&lt;String,Object&gt; e : contents.entrySet())<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>            set(section(name) + '/' + e.getKey(), e.getValue());<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span><a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>      return this;<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>   }<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span><a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>   /**<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>    * Removes the section with the specified name.<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>    *<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>    * @param name The name of the section to remove<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>    * @return This object (for method chaining).<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>    */<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>   public Config removeSection(String name) {<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>      checkWrite();<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>      configMap.removeSection(name);<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span>      return this;<a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>   }<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span><a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>   /**<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    * Creates the specified import statement if it doesn't exist.<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    *<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    * @param sectionName<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    *    The section name where to place the import statement.<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span>    *    &lt;br&gt;Use blank for the default section.<a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    * @param importName<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    *    The import name.<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span>    * @param preLines<a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    *    Optional comment and blank lines to add immediately before the import statement.<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, previous pre-lines will not be replaced.<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>    * @return The appended or existing import statement.<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    */<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>   public Config setImport(String sectionName, String importName, List&lt;String&gt; preLines) {<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>      checkWrite();<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span>      configMap.setImport(section(name), importName, preLines);<a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>      return this;<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>   }<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span><a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>   /**<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    * Removes the import statement with the specified name from the specified section.<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>    *<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>    * @param sectionName<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>    *    The section name where to place the import statement.<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>    *    &lt;br&gt;Use blank for the default section.<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    * @param importName<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>    *    The import name.<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>    * @return This object (for method chaining).<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    */<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>   public Config removeImport(String sectionName, String importName) {<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>      checkWrite();<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span>      configMap.removeImport(sectionName, importName);<a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>      return this;<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>   }<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span><a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>   /**<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    * Loads the contents of the specified map of maps into this config.<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    *<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>    * @param m The maps to load.<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    * @return This object (for method chaining).<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    * @throws SerializeException<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span>    */<a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>   public Config load(Map&lt;String,Map&lt;String,Object&gt;&gt; m) throws SerializeException {<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>      if (m != null)<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>         for (Map.Entry&lt;String,Map&lt;String,Object&gt;&gt; e : m.entrySet()) {<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>            setSection(e.getKey(), null, e.getValue());<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>         }<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>      return this;<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>   }<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span><a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>   /**<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>    * Commit the changes in this config to the store.<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>    *<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    * @return This object (for method chaining).<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>    * @throws IOException<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>    */<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>   public Config commit() throws IOException {<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>      checkWrite();<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>      configMap.commit();<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>      return this;<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>   }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span><a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>   /**<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    * Saves this config file to the specified writer as an INI file.<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    *<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    * &lt;p&gt;<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    * The writer will automatically be closed.<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    *<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    * @param w The writer to send the output to.<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>    * @return This object (for method chaining).<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    * @throws IOException If a problem occurred trying to send contents to the writer.<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>    */<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>   @Override /* Writable */<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>   public Writer writeTo(Writer w) throws IOException {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>      return configMap.writeTo(w);<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>   }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span><a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>   /**<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    * Add a listener to this config to react to modification events.<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span>    *<a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    * &lt;p&gt;<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    * Listeners should be removed using {@link #removeListener(ConfigEventListener)}.<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    *<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    * @param listener The new listener to add.<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>    * @return This object (for method chaining).<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    */<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>   public synchronized Config addListener(ConfigEventListener listener) {<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>      listeners.add(listener);<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span>      return this;<a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>   }<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span><a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>   /**<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    * Removes a listener from this config.<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    *<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    * @param listener The listener to remove.<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span>    * @return This object (for method chaining).<a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    */<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span>   public synchronized Config removeListener(ConfigEventListener listener) {<a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>      listeners.remove(listener);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>      return this;<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>   }<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span><a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>   /**<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    * Closes this configuration object by unregistering it from the underlying config map.<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>    *<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span>    * @throws IOException<a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>    */<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   public void close() throws IOException {<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>      configMap.unregister(this);<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>   }<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span><a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>   /**<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span>    * Overwrites the contents of the config file.<a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    *<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    * @param contents The new contents of the config file.<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>    * @param synchronous Wait until the change has been persisted before returning this map.<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>    * @return This object (for method chaining).<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>    * @throws IOException<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    * @throws InterruptedException<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    */<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>   public Config load(Reader contents, boolean synchronous) throws IOException, InterruptedException {<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>      checkWrite();<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>      configMap.load(IOUtils.read(contents), synchronous);<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span>      return this;<a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>   }<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span><a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>   /**<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>    * Overwrites the contents of the config file.<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>    *<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    * @param contents The new contents of the config file.<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    * @param synchronous Wait until the change has been persisted before returning this map.<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    * @return This object (for method chaining).<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    * @throws IOException<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    * @throws InterruptedException<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    */<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>   public Config load(String contents, boolean synchronous) throws IOException, InterruptedException {<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>      checkWrite();<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      configMap.load(contents, synchronous);<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      return this;<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>   }<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>   /**<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    * Does a rollback of any changes on this config currently in memory.<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>    *<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    * @return This object (for method chaining).<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    */<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>   public Config rollback() {<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>      checkWrite();<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>      configMap.rollback();<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>      return this;<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>   }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span><a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>   /**<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span>    * Returns the values in this config map as a map of maps.<a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    *<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    * &lt;p&gt;<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>    * This is considered a snapshot copy of the config map.<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    *<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>    * &lt;p&gt;<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    * The returned map is modifiable, but modifications to the returned map are not reflected in the config map.<a name="line.1753"></a>
+<span class="sourceLineNo">1467</span>    *    MyConfigInterface ci = cf.getSectionAsInterface(&lt;js&gt;"MySection"&lt;/js&gt;, MyConfigInterface.&lt;jk&gt;class&lt;/jk&gt;);<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    *<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    *    &lt;jk&gt;int&lt;/jk&gt; myInt = ci.getInt();<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    *<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>    *    ci.setBean(&lt;jk&gt;new&lt;/jk&gt; MyBean());<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span>    *<a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>    *    cf.save();<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    * &lt;/p&gt;<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>    *<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>    * &lt;h5 class='section'&gt;Notes&lt;/h5&gt;<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>    * &lt;ul class='spaced-list'&gt;<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>    *    &lt;li&gt;Calls to setters when the configuration is read-only will cause {@link UnsupportedOperationException} to be thrown.<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>    * &lt;/ul&gt;<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>    *<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>    * @param section<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>    *    The section name to write from.<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>    *    &lt;br&gt;If empty, refers to the default section.<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    * @param c The proxy interface class.<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>    * @return The proxy interface.<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span>    */<a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>   @SuppressWarnings("unchecked")<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>   public &lt;T&gt; T getSectionAsInterface(String section, final Class&lt;T&gt; c) {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>      assertFieldNotNull(c, "c");<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>      final String section2 = section(section);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span><a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>      if (! c.isInterface())<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>         throw new IllegalArgumentException("Class '"+c.getName()+"' passed to getSectionAsInterface() is not an interface.");<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span><a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>      InvocationHandler h = new InvocationHandler() {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span><a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>         @Override<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>         public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>            BeanInfo bi = Introspector.getBeanInfo(c, null);<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>            for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>               Method rm = pd.getReadMethod(), wm = pd.getWriteMethod();<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span>               if (method.equals(rm))<a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>                  return Config.this.getObject(section2 + '/' + pd.getName(), rm.getGenericReturnType());<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>               if (method.equals(wm))<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>                  return Config.this.set(section2 + '/' + pd.getName(), args[0]);<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>            }<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>            throw new UnsupportedOperationException("Unsupported interface method.  method='" + method + "'");<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span>         }<a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>      };<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span><a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>      return (T)Proxy.newProxyInstance(c.getClassLoader(), new Class[] { c }, h);<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>   }<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span><a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>   /**<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span>    * Returns &lt;jk&gt;true&lt;/jk&gt; if this section contains the specified key and the key has a non-blank value.<a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    *<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    * @param key The key.<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    * @return &lt;jk&gt;true&lt;/jk&gt; if this section contains the specified key and the key has a non-blank value.<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    */<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>   public boolean exists(String key) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      return isNotEmpty(getString(key, null));<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>   }<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span><a name="line.1524"></a>
+<span class="sourceLineNo">1525</span>   /**<a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    * Creates the specified section if it doesn't exist.<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>    *<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span>    * &lt;p&gt;<a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>    * Returns the existing section if it already exists.<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>    *<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    * @param name<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    *    The section name.<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span>    *    &lt;br&gt;Use blank for the default section.<a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    * @param preLines<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span>    *    Optional comment and blank lines to add immediately before the section.<a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, previous pre-lines will not be replaced.<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    * @return The appended or existing section.<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    */<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>   public Config setSection(String name, List&lt;String&gt; preLines) {<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span>      try {<a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>         return setSection(section(name), preLines, null);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>      } catch (SerializeException e) {<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>         throw new RuntimeException(e);  // Impossible.<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>      }<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>   }<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span><a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>   /**<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>    * Creates the specified section if it doesn't exist.<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>    *<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>    * @param name<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    *    The section name.<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    *    &lt;br&gt;Use blank for the default section.<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    * @param preLines<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span>    *    Optional comment and blank lines to add immediately before the section.<a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, previous pre-lines will not be replaced.<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    * @param contents<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    *    Values to set in the new section.<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    *    &lt;br&gt;Can be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    * @return The appended or existing section.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    * @throws SerializeException<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>    */<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>   public Config setSection(String name, List&lt;String&gt; preLines, Map&lt;String,Object&gt; contents) throws SerializeException {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>      checkWrite();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>      configMap.setSection(section(name), preLines);<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span><a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>      if (contents != null)<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>         for (Map.Entry&lt;String,Object&gt; e : contents.entrySet())<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>            set(section(name) + '/' + e.getKey(), e.getValue());<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span><a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>      return this;<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>   }<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span><a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>   /**<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>    * Removes the section with the specified name.<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>    *<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    * @param name The name of the section to remove<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    * @return This object (for method chaining).<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    */<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>   public Config removeSection(String name) {<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>      checkWrite();<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>      configMap.removeSection(name);<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>      return this;<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>   }<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span><a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>   /**<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span>    * Creates the specified import statement if it doesn't exist.<a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    *<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    * @param sectionName<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    *    The section name where to place the import statement.<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    *    &lt;br&gt;Use blank for the default section.<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    * @param importName<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>    *    The import name.<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    * @param preLines<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    *    Optional comment and blank lines to add immediately before the import statement.<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>    *    &lt;br&gt;If &lt;jk&gt;null&lt;/jk&gt;, previous pre-lines will not be replaced.<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span>    * @return The appended or existing import statement.<a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>    */<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>   public Config setImport(String sectionName, String importName, List&lt;String&gt; preLines) {<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>      checkWrite();<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>      configMap.setImport(section(name), importName, preLines);<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      return this;<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>   }<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span><a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>   /**<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>    * Removes the import statement with the specified name from the specified section.<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    *<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>    * @param sectionName<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span>    *    The section name where to place the import statement.<a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>    *    &lt;br&gt;Use blank for the default section.<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    * @param importName<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    *    The import name.<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    *    &lt;br&gt;Must not be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span>    * @return This object (for method chaining).<a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    */<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>   public Config removeImport(String sectionName, String importName) {<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>      checkWrite();<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>      configMap.removeImport(sectionName, importName);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>      return this;<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>   }<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span><a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>   /**<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span>    * Loads the contents of the specified map of maps into this config.<a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    *<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    * @param m The maps to load.<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    * @return This object (for method chaining).<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    * @throws SerializeException<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    */<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>   public Config load(Map&lt;String,Map&lt;String,Object&gt;&gt; m) throws SerializeException {<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>      if (m != null)<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>         for (Map.Entry&lt;String,Map&lt;String,Object&gt;&gt; e : m.entrySet()) {<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>            setSection(e.getKey(), null, e.getValue());<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>         }<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>      return this;<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>   }<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span><a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>   /**<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>    * Commit the changes in this config to the store.<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>    *<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>    * @return This object (for method chaining).<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>    * @throws IOException<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>    */<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>   public Config commit() throws IOException {<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      checkWrite();<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>      configMap.commit();<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>      return this;<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>   }<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span><a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>   /**<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    * Saves this config file to the specified writer as an INI file.<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>    *<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    * &lt;p&gt;<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>    * The writer will automatically be closed.<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    *<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>    * @param w The writer to send the output to.<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>    * @return This object (for method chaining).<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>    * @throws IOException If a problem occurred trying to send contents to the writer.<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    */<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>   @Override /* Writable */<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>   public Writer writeTo(Writer w) throws IOException {<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span>      return configMap.writeTo(w);<a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>   }<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span><a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>   /**<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    * Add a listener to this config to react to modification events.<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>    *<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    * &lt;p&gt;<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    * Listeners should be removed using {@link #removeListener(ConfigEventListener)}.<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>    *<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span>    * @param listener The new listener to add.<a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>    * @return This object (for method chaining).<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>    */<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>   public synchronized Config addListener(ConfigEventListener listener) {<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>      listeners.add(listener);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>      return this;<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>   }<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>   /**<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span>    * Removes a listener from this config.<a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    *<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    * @param listener The listener to remove.<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    * @return This object (for method chaining).<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>    */<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>   public synchronized Config removeListener(ConfigEventListener listener) {<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>      listeners.remove(listener);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>      return this;<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span>   }<a name="line.1697"></a>
+<span class="sourceLineNo">1698</span><a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   /**<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>    * Closes this configuration object by unregistering it from the underlying config map.<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>    *<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>    * @throws IOException<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    */<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span>   public void close() throws IOException {<a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>      configMap.unregister(this);<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>   }<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span><a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>   /**<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>    * Overwrites the contents of the config file.<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    *<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span>    * @param contents The new contents of the config file.<a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    * @param synchronous Wait until the change has been persisted before returning this map.<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    * @return This object (for method chaining).<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    * @throws IOException<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>    * @throws InterruptedException<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>    */<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>   public Config load(Reader contents, boolean synchronous) throws IOException, InterruptedException {<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>      checkWrite();<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>      configMap.load(IOUtils.read(contents), synchronous);<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>      return this;<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>   }<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span><a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>   /**<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    * Overwrites the contents of the config file.<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    *<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    * @param contents The new contents of the config file.<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>    * @param synchronous Wait until the change has been persisted before returning this map.<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    * @return This object (for method chaining).<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    * @throws IOException<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    * @throws InterruptedException<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    */<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span>   public Config load(String contents, boolean synchronous) throws IOException, InterruptedException {<a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>      checkWrite();<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>      configMap.load(contents, synchronous);<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>      return this;<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>   }<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>   /**<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    * Does a rollback of any changes on this config currently in memory.<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    *<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>    * @return This object (for method chaining).<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    * @throws UnsupportedOperationException If configuration is read only.<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    */<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>   public Config rollback() {<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>      checkWrite();<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span>      configMap.rollback();<a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>      return this;<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>   }<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span><a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>   /**<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>    * Returns the values in this config map as a map of maps.<a name="line.1753"></a>
 <span class="sourceLineNo">1754</span>    *<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    * @return A copy of this config as a map of maps.<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    */<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>   @Override /* Context */<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>   public ObjectMap asMap() {<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>      return configMap.asMap();<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>   }<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span><a name="line.1761"></a>
-<span class="sourceLineNo">1762</span><a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>   // Test methods<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span><a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>   ConfigMap getConfigMap() {<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>      return configMap;<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>   }<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span><a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>   List&lt;ConfigEventListener&gt; getListeners() {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>      return Collections.unmodifiableList(listeners);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>   }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span><a name="line.1774"></a>
-<span class="sourceLineNo">1775</span><a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>   // Interface methods<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span><a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>   /**<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    * Unused.<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>    */<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>   @Override /* Context */<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>   public Session createSession(SessionArgs args) {<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>      throw new UnsupportedOperationException();<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>   }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>   /**<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>    * Unused.<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    */<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>   @Override /* Context */<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>   public SessionArgs createDefaultSessionArgs() {<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>      throw new UnsupportedOperationException();<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>   }<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span><a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>   @Override /* ConfigEventListener */<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span>   public void onConfigChange(ConfigEvents events) {<a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>      for (ConfigEventListener l : listeners)<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>         l.onConfigChange(events);<a name="line.1799"></a>
+<span class="sourceLineNo">1755</span>    * &lt;p&gt;<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    * This is considered a snapshot copy of the config map.<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>    *<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    * &lt;p&gt;<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span>    * The returned map is modifiable, but modifications to the returned map are not reflected in the config map.<a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    *<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    * @return A copy of this config as a map of maps.<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    */<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>   @Override /* Context */<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>   public ObjectMap asMap() {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>      return configMap.asMap();<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>   }<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span><a name="line.1767"></a>
+<span class="sourceLineNo">1768</span><a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>   // Test methods<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span><a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>   ConfigMap getConfigMap() {<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>      return configMap;<a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>   }<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span><a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>   List&lt;ConfigEventListener&gt; getListeners() {<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>      return Collections.unmodifiableList(listeners);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>   }<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span><a name="line.1780"></a>
+<span class="sourceLineNo">1781</span><a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>   // Interface methods<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span><a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>   /**<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>    * Unused.<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span>    */<a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>   @Override /* Context */<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>   public Session createSession(SessionArgs args) {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>      throw new UnsupportedOperationException();<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>   }<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span><a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>   /**<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    * Unused.<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    */<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>   @Override /* Context */<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span>   public SessionArgs createDefaultSessionArgs() {<a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>      throw new UnsupportedOperationException();<a name="line.1799"></a>
 <span class="sourceLineNo">1800</span>   }<a name="line.1800"></a>
 <span class="sourceLineNo">1801</span><a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>   @Override /* Writable */<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>   public MediaType getMediaType() {<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span>      return MediaType.PLAIN;<a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>   }<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span><a name="line.1806"></a>
+<span class="sourceLineNo">1802</span>   @Override /* ConfigEventListener */<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>   public void onConfigChange(ConfigEvents events) {<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>      for (ConfigEventListener l : listeners)<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span>         l.onConfigChange(events);<a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>   }<a name="line.1806"></a>
 <span class="sourceLineNo">1807</span><a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span>   // Private methods<a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span><a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>   private String serialize(Object value, Serializer serializer) throws SerializeException {<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>      if (value == null)<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>         return "";<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>      if (serializer == null)<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span>         serializer = this.serializer;<a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>      Class&lt;?&gt; c = value.getClass();<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>      if (value instanceof CharSequence)<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>         return nlIfMl((CharSequence)value);<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>      if (isSimpleType(c))<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span>         return value.toString();<a name="line.1821"></a>
-<span class="sourceLineNo">1822</span><a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>      if (value instanceof byte[]) {<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>         String s = null;<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>         byte[] b = (byte[])value;<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>         if (binaryFormat == BinaryFormat.HEX)<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span>            s = toHex(b);<a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>         else if (binaryFormat == BinaryFormat.SPACED_HEX)<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>            s = toSpacedHex(b);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>         else<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>            s = base64Encode(b);<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>         int l = binaryLineLength;<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>         if (l &lt;= 0 || s.length() &lt;= l)<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>            return s;<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>         StringBuilder sb = new StringBuilder();<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span>         for (int i = 0; i &lt; s.length(); i += l)<a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>            sb.append(binaryLineLength &gt; 0 ? "\n" : "").append(s.substring(i, Math.min(s.length(), i + l)));<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>         return sb.toString();<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>      }<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span><a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>      String r = null;<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>      if (multiLineValuesOnSeparateLines)<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>         r = "\n" + (String)serializer.serialize(value);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span>      else<a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>         r = (String)serializer.serialize(value);<a name="line.1845"></a>
+<span class="sourceLineNo">1808</span>   @Override /* Writable */<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>   public MediaType getMediaType() {<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span>      return MediaType.PLAIN;<a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>   }<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span><a name="line.1812"></a>
+<span class="sourceLineNo">1813</span><a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>   // Private methods<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>   private String serialize(Object value, Serializer serializer) throws SerializeException {<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>      if (value == null)<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>         return "";<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>      if (serializer == null)<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span>         serializer = this.serializer;<a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>      Class&lt;?&gt; c = value.getClass();<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>      if (value instanceof CharSequence)<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>         return nlIfMl((CharSequence)value);<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>      if (isSimpleType(c))<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>         return value.toString();<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>      if (value instanceof byte[]) {<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>         String s = null;<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>         byte[] b = (byte[])value;<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>         if (binaryFormat == BinaryFormat.HEX)<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>            s = toHex(b);<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>         else if (binaryFormat == BinaryFormat.SPACED_HEX)<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>            s = toSpacedHex(b);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>         else<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span>            s = base64Encode(b);<a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>         int l = binaryLineLength;<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>         if (l &lt;= 0 || s.length() &lt;= l)<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>            return s;<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>         StringBuilder sb = new StringBuilder();<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>         for (int i = 0; i &lt; s.length(); i += l)<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>            sb.append(binaryLineLength &gt; 0 ? "\n" : "").append(s.substring(i, Math.min(s.length(), i + l)));<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>         return sb.toString();<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span>      }<a name="line.1845"></a>
 <span class="sourceLineNo">1846</span><a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>      if (r.startsWith("'"))<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>         return r.substring(1, r.length()-1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>      return r;<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>   }<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>   private String nlIfMl(CharSequence cs) {<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>      String s = cs.toString();<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>      if (s.indexOf('\n') != -1 &amp;&amp; multiLineValuesOnSeparateLines)<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>         return "\n" + s;<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span>      return s;<a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>   }<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span><a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>   @SuppressWarnings({ "unchecked" })<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>   private &lt;T&gt; T parse(String s, Parser parser, Type type, Type...args) throws ParseException {<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span><a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>      if (isEmpty(s))<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span>         return null;<a name="line.1863"></a>
+<span class="sourceLineNo">1847</span>      String r = null;<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>      if (multiLineValuesOnSeparateLines)<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>         r = "\n" + (String)serializer.serialize(value);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>      else<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>         r = (String)serializer.serialize(value);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>      if (r.startsWith("'"))<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>         return r.substring(1, r.length()-1);<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>      return r;<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>   }<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>   private String nlIfMl(CharSequence cs) {<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>      String s = cs.toString();<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>      if (s.indexOf('\n') != -1 &amp;&amp; multiLineValuesOnSeparateLines)<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>         return "\n" + s;<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>      return s;<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>   }<a name="line.1863"></a>
 <span class="sourceLineNo">1864</span><a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>      if (isSimpleType(type))<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>         return (T)beanSession.convertToType(s, (Class&lt;?&gt;)type);<a name="line.1866"></a>
+<span class="sourceLineNo">1865</span>   @SuppressWarnings({ "unchecked" })<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>   private &lt;T&gt; T parse(String s, Parser parser, Type type, Type...args) throws ParseException {<a name="line.1866"></a>
 <span class="sourceLineNo">1867</span><a name="line.1867"></a>
-<span class="sourceLineNo">1868</span>      if (type == byte[].class) {<a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>         if (s.indexOf('\n') != -1)<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>            s = s.replaceAll("\n", "");<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>         try {<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            switch (binaryFormat) {<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>               case HEX: return (T)fromHex(s);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span>               case SPACED_HEX: return (T)fromSpacedHex(s);<a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>               default: return (T)base64Decode(s);<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>            }<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>         } catch (Exception e) {<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>            throw new ParseException(e, "Value could not be converted to a byte array.");<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>         }<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>      }<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span><a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>      if (parser == null)<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span>         parser = this.parser;<a name="line.1883"></a>
-<span class="sourceLineNo">1884</span><a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>      if (parser instanceof JsonParser) {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>         char s1 = firstNonWhitespaceChar(s);<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>         if (isArray(type) &amp;&amp; s1 != '[')<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>            s = '[' + s + ']';<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>         else if (s1 != '[' &amp;&amp; s1 != '{' &amp;&amp; ! "null".equals(s))<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>            s = '\'' + s + '\'';<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>      }<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span><a name="line.1892"></a>
-<span class="sourceLineNo">1893</span>      return parser.parse(s, type, args);<a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>   }<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span><a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>   private boolean isSimpleType(Type t) {<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>      if (! (t instanceof Class))<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>         return false;<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>      Class&lt;?&gt; c = (Class&lt;?&gt;)t;<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span>      return (c == String.class || c.isPrimitive() || c.isAssignableFrom(Number.class) || c == Boolean.class || c.isEnum());<a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>   }<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span><a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>   private boolean isArray(Type t) {<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>      if (! (t instanceof Class))<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span>         return false;<a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>      Class&lt;?&gt; c = (Class&lt;?&gt;)t;<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>      return (c.isArray());<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>   }<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span><a name="line.1909"></a>
-<span class="sourceLineNo">1910</span>   private String sname(String key) {<a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>      assertFieldNotNull(key, "key");<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>      int i = key.indexOf('/');<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>      if (i == -1)<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>         return "";<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>      return key.substring(0, i);<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>   }<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span><a name="line.1917"></a>
-<span class="sourceLineNo">1918</span>   private String skey(String key) {<a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>      int i = key.indexOf('/');<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>      if (i == -1)<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>         return key;<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>      return key.substring(i+1);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span>   }<a name="line.1923"></a>
-<span class="sourceLineNo">1924</span><a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>   private String section(String section) {<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>      assertFieldNotNull(section, "section");<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>      if (isEmpty(section))<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>         return "";<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span>      return section;<a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>   }<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span><a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>   private void checkWrite() {<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>      if (readOnly)<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>         throw new UnsupportedOperationException("Cannot call this method on a read-only configuration.");<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>   }<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span><a name="line.1936"></a>
+<span class="sourceLineNo">1868</span>      if (isEmpty(s))<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span>         return null;<a name="line.1869"></a>
+<span class="sourceLineNo">1870</span><a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>      if (isSimpleType(type))<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>         return (T)beanSession.convertToType(s, (Class&lt;?&gt;)type);<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span><a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>      if (type == byte[].class) {<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span>         if (s.indexOf('\n') != -1)<a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>            s = s.replaceAll("\n", "");<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>         try {<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>            switch (binaryFormat) {<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>               case HEX: return (T)fromHex(s);<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>               case SPACED_HEX: return (T)fromSpacedHex(s);<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>               default: return (T)base64Decode(s);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>            }<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>         } catch (Exception e) {<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span>            throw new ParseException(e, "Value could not be converted to a byte array.");<a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>         }<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>      }<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span><a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>      if (parser == null)<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>         parser = this.parser;<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span><a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>      if (parser instanceof JsonParser) {<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>         char s1 = firstNonWhitespaceChar(s);<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>         if (isArray(type) &amp;&amp; s1 != '[')<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span>            s = '[' + s + ']';<a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>         else if (s1 != '[' &amp;&amp; s1 != '{' &amp;&amp; ! "null".equals(s))<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>            s = '\'' + s + '\'';<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>      }<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span><a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>      return parser.parse(s, type, args);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>   }<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>   private boolean isSimpleType(Type t) {<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>      if (! (t instanceof Class))<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>         return false;<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>      Class&lt;?&gt; c = (Class&lt;?&gt;)t;<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span>      return (c == String.class || c.isPrimitive() || c.isAssignableFrom(Number.class) || c == Boolean.class || c.isEnum());<a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>   }<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span><a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>   private boolean isArray(Type t) {<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>      if (! (t instanceof Class))<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span>         return false;<a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>      Class&lt;?&gt; c = (Class&lt;?&gt;)t;<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>      return (c.isArray());<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>   }<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span><a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>   private String sname(String key) {<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>      assertFieldNotNull(key, "key");<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>      int i = key.indexOf('/');<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span>      if (i == -1)<a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>         return "";<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>      return key.substring(0, i);<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>   }<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span><a name="line.1923"></a>
+<span class="sourceLineNo">1924</span>   private String skey(String key) {<a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>      int i = key.indexOf('/');<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>      if (i == -1)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>         return key;<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>      return key.substring(i+1);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>   }<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>   private String section(String section) {<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>      assertFieldNotNull(section, "section");<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>      if (isEmpty(section))<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>         return "";<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>      return section;<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>   }<a name="line.1936"></a>
 <span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>   // Other methods<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span><a name="line.1941"></a>
-<span class="sourceLineNo">1942</span>   @Override /* Object */<a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>   public String toString() {<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>      return configMap.toString();<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>   }<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span><a name="line.1946"></a>
-<span class="sourceLineNo">1947</span>   @Override /* Object */<a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>   protected void finalize() throws Throwable {<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>      close();<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>   }<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>}<a name="line.1951"></a>
+<span class="sourceLineNo">1938</span>   private void checkWrite() {<a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>      if (readOnly)<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>         throw new UnsupportedOperationException("Cannot call this method on a read-only configuration.");<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>   }<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span><a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>   // Other methods<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span><a name="line.1947"></a>
+<span class="sourceLineNo">1948</span>   @Override /* Object */<a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>   public String toString() {<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>      return configMap.toString();<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>   }<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span><a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>   @Override /* Object */<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>   protected void finalize() throws Throwable {<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>      close();<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span>   }<a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>}<a name="line.1957"></a>
 
 
 
diff --git a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/microservice/Microservice.html b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/microservice/Microservice.html
index cb30eb0..c1209f7 100644
--- a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/microservice/Microservice.html
+++ b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/microservice/Microservice.html
@@ -178,610 +178,609 @@
 <span class="sourceLineNo">170</span>            }<a name="line.170"></a>
 <span class="sourceLineNo">171</span>         } else {<a name="line.171"></a>
 <span class="sourceLineNo">172</span>            // Otherwise, read from manifest file in the jar file containing the main class.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>            URLClassLoader cl = (URLClassLoader)getClass().getClassLoader();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>            URL url = cl.findResource("META-INF/MANIFEST.MF");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>            if (url != null) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>               try {<a name="line.176"></a>
-<span class="sourceLineNo">177</span>                  m.read(url.openStream());<a name="line.177"></a>
-<span class="sourceLineNo">178</span>               } catch (IOException e) {<a name="line.178"></a>
-<span class="sourceLineNo">179</span>                  throw new IOException("Problem detected in MANIFEST.MF.  Contents below:\n " + read(url.openStream()), e);<a name="line.179"></a>
-<span class="sourceLineNo">180</span>               }<a name="line.180"></a>
-<span class="sourceLineNo">181</span>            }<a name="line.181"></a>
-<span class="sourceLineNo">182</span>         }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>         manifest = new ManifestFile(m);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>      ManifestFileVar.init(manifest);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      this.manifest = manifest;<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>      // --------------------------------------------------------------------------------<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      // Try to resolve the configuration if not specified.<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      // --------------------------------------------------------------------------------<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      Config config = builder.config;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      ConfigBuilder configBuilder = builder.configBuilder.varResolver(builder.varResolverBuilder.build()).store(ConfigMemoryStore.DEFAULT);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      if (config == null) {<a name="line.193"></a>
-<span class="sourceLineNo">194</span>         ConfigStore store = builder.configStore;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>         for (String name : getCandidateConfigNames()) {<a name="line.195"></a>
-<span class="sourceLineNo">196</span>             if (store != null) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>                if (store.exists(name)) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>                   configBuilder.store(store).name(name);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>                   break;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>                }<a name="line.200"></a>
-<span class="sourceLineNo">201</span>             } else {<a name="line.201"></a>
-<span class="sourceLineNo">202</span>                if (ConfigFileStore.DEFAULT.exists(name)) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>                   configBuilder.store(ConfigFileStore.DEFAULT).name(name);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>                   break;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>                }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>                if (ConfigClasspathStore.DEFAULT.exists(name)) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>                   configBuilder.store(ConfigClasspathStore.DEFAULT).name(name);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>                   break;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>                }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>             }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>         }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>         config = configBuilder.build();<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      }<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      this.config = config;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      Config.setSystemDefault(this.config);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>      this.config.addListener(this);<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>      //-------------------------------------------------------------------------------------------------------------<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      // Var resolver.<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      //-------------------------------------------------------------------------------------------------------------<a name="line.220"></a>
-<span class="sourceLineNo">221</span>      VarResolverBuilder varResolverBuilder = builder.varResolverBuilder;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      this.varResolver = varResolverBuilder.contextObject(ConfigVar.SESSION_config, config).build();<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>      // --------------------------------------------------------------------------------<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      // Initialize console commands.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // --------------------------------------------------------------------------------<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      this.consoleEnabled = ObjectUtils.firstNonNull(builder.consoleEnabled, config.getBoolean("Console/enabled", false));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      if (consoleEnabled) {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>         Console c = System.console();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>         this.consoleReader = ObjectUtils.firstNonNull(builder.consoleReader, new Scanner(c == null ? new InputStreamReader(System.in) : c.reader()));<a name="line.230"></a>
-<span class="sourceLineNo">231</span>         this.consoleWriter = ObjectUtils.firstNonNull(builder.consoleWriter, c == null ? new PrintWriter(System.out, true) : c.writer());<a name="line.231"></a>
-<span class="sourceLineNo">232</span><a name="line.232"></a>
-<span class="sourceLineNo">233</span>         for (ConsoleCommand cc : builder.consoleCommands) {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>            consoleCommandMap.put(cc.getName(), cc);<a name="line.234"></a>
-<span class="sourceLineNo">235</span>         }<a name="line.235"></a>
-<span class="sourceLineNo">236</span>         for (String s : config.getStringArray("Console/commands")) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>            ConsoleCommand cc;<a name="line.237"></a>
-<span class="sourceLineNo">238</span>            try {<a name="line.238"></a>
-<span class="sourceLineNo">239</span>               cc = (ConsoleCommand)Class.forName(s).newInstance();<a name="line.239"></a>
-<span class="sourceLineNo">240</span>               consoleCommandMap.put(cc.getName(), cc);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>            } catch (Exception e) {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>               getConsoleWriter().println("Could not create console command '"+s+"', " + e.getLocalizedMessage());<a name="line.242"></a>
-<span class="sourceLineNo">243</span>            }<a name="line.243"></a>
-<span class="sourceLineNo">244</span>         }<a name="line.244"></a>
-<span class="sourceLineNo">245</span>         consoleThread = new Thread("ConsoleThread") {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>            @Override /* Thread */<a name="line.246"></a>
-<span class="sourceLineNo">247</span>            public void run() {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>               Scanner in = getConsoleReader();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>               PrintWriter out = getConsoleWriter();<a name="line.249"></a>
-<span class="sourceLineNo">250</span><a name="line.250"></a>
-<span class="sourceLineNo">251</span>               out.println(messages.getString("ListOfAvailableCommands"));<a name="line.251"></a>
-<span class="sourceLineNo">252</span>               for (ConsoleCommand cc : new TreeMap&lt;&gt;(getConsoleCommands()).values())<a name="line.252"></a>
-<span class="sourceLineNo">253</span>                  out.append("\t").append(cc.getName()).append(" -- ").append(cc.getInfo()).println();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>               out.println();<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>               while (true) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>                  String line = null;<a name="line.257"></a>
-<span class="sourceLineNo">258</span>                  out.append("&gt; ").flush();<a name="line.258"></a>
-<span class="sourceLineNo">259</span>                  line = in.nextLine();<a name="line.259"></a>
-<span class="sourceLineNo">260</span>                  Args args = new Args(line);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>                  if (! args.isEmpty())<a name="line.261"></a>
-<span class="sourceLineNo">262</span>                     executeCommand(args, in, out);<a name="line.262"></a>
-<span class="sourceLineNo">263</span>               }<a name="line.263"></a>
-<span class="sourceLineNo">264</span>            }<a name="line.264"></a>
-<span class="sourceLineNo">265</span>         };<a name="line.265"></a>
-<span class="sourceLineNo">266</span>         consoleThread.setDaemon(true);<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      } else {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>         this.consoleReader = null;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>         this.consoleWriter = null;<a name="line.269"></a>
-<span class="sourceLineNo">270</span>         this.consoleThread = null;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>      //-------------------------------------------------------------------------------------------------------------<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      // Other.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      //-------------------------------------------------------------------------------------------------------------<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      this.listener = builder.listener != null ? builder.listener : new BasicMicroserviceListener();<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>      init();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   }<a name="line.279"></a>
-<span class="sourceLineNo">280</span><a name="line.280"></a>
-<span class="sourceLineNo">281</span>   private List&lt;String&gt; getCandidateConfigNames() {<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      Args args = getArgs();<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      if (getArgs().hasArg("configFile"))<a name="line.283"></a>
-<span class="sourceLineNo">284</span>         return Collections.singletonList(args.getArg("configFile"));<a name="line.284"></a>
-<span class="sourceLineNo">285</span><a name="line.285"></a>
-<span class="sourceLineNo">286</span>      ManifestFile manifest = getManifest();<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      if (manifest.containsKey("Main-Config"))<a name="line.287"></a>
-<span class="sourceLineNo">288</span>         return Collections.singletonList(manifest.getString("Main-Config"));<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>      return Config.getCandidateSystemDefaultConfigNames();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>   }<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   // Abstract lifecycle methods.<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.295"></a>
-<span class="sourceLineNo">296</span><a name="line.296"></a>
-<span class="sourceLineNo">297</span>   /**<a name="line.297"></a>
-<span class="sourceLineNo">298</span>    * Initializes this microservice.<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    *<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    * &lt;p&gt;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    * This method can be called whenever the microservice is not started.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>    *<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    * &lt;p&gt;<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    * It will initialize (or reinitialize) the console commands, system properties, and logger.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    *<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    * @return This object (for method chaining).<a name="line.306"></a>
-<span class="sourceLineNo">307</span>    * @throws Exception<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   public synchronized Microservice init() throws Exception {<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>      // --------------------------------------------------------------------------------<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      // Set system properties.<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      // --------------------------------------------------------------------------------<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      Set&lt;String&gt; spKeys = config.getKeys("SystemProperties");<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      if (spKeys != null)<a name="line.315"></a>
-<span class="sourceLineNo">316</span>         for (String key : spKeys)<a name="line.316"></a>
-<span class="sourceLineNo">317</span>            System.setProperty(key, config.getString("SystemProperties/"+key));<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>      // --------------------------------------------------------------------------------<a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Initialize logging.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      // --------------------------------------------------------------------------------<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      this.logger = builder.logger;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      LogConfig logConfig = builder.logConfig != null ? builder.logConfig : new LogConfig();<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      if (this.logger == null) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>         LogManager.getLogManager().reset();<a name="line.325"></a>
-<span class="sourceLineNo">326</span>         this.logger = Logger.getLogger("");<a name="line.326"></a>
-<span class="sourceLineNo">327</span>         String logFile = firstNonNull(logConfig.logFile, config.getString("Logging/logFile"));<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>         if (isNotEmpty(logFile)) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>            String logDir = firstNonNull(logConfig.logDir, config.getString("Logging/logDir", "."));<a name="line.330"></a>
-<span class="sourceLineNo">331</span>            mkdirs(new File(logDir), false);<a name="line.331"></a>
-<span class="sourceLineNo">332</span><a name="line.332"></a>
-<span class="sourceLineNo">333</span>            boolean append = firstNonNull(logConfig.append, config.getBoolean("Logging/append"));<a name="line.333"></a>
-<span class="sourceLineNo">334</span>            int limit = firstNonNull(logConfig.limit, config.getInt("Logging/limit", 1024*1024));<a name="line.334"></a>
-<span class="sourceLineNo">335</span>            int count = firstNonNull(logConfig.count, config.getInt("Logging/count", 1));<a name="line.335"></a>
-<span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>            FileHandler fh = new FileHandler(logDir + '/' + logFile, limit, count, append);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>            Formatter f = logConfig.formatter;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>            if (f == null) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>               String format = config.getString("Logging/format", "[{date} {level}] {msg}%n");<a name="line.341"></a>
-<span class="sourceLineNo">342</span>               String dateFormat = config.getString("Logging/dateFormat", "yyyy.MM.dd hh:mm:ss");<a name="line.342"></a>
-<span class="sourceLineNo">343</span>               boolean useStackTraceHashes = config.getBoolean("Logging/useStackTraceHashes");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>               f = new LogEntryFormatter(format, dateFormat, useStackTraceHashes);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>            }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>            fh.setFormatter(f);<a name="line.346"></a>
-<span class="sourceLineNo">347</span>            fh.setLevel(firstNonNull(logConfig.fileLevel, config.getObjectWithDefault("Logging/fileLevel", Level.INFO, Level.class)));<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            logger.addHandler(fh);<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>            ConsoleHandler ch = new ConsoleHandler();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>            ch.setLevel(firstNonNull(logConfig.consoleLevel, config.getObjectWithDefault("Logging/consoleLevel", Level.WARNING, Level.class)));<a name="line.351"></a>
-<span class="sourceLineNo">352</span>            ch.setFormatter(f);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>            logger.addHandler(ch);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>         }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>      ObjectMap loggerLevels = config.getObject("Logging/levels", ObjectMap.class);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      if (loggerLevels != null)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>         for (String l : loggerLevels.keySet())<a name="line.359"></a>
-<span class="sourceLineNo">360</span>            Logger.getLogger(l).setLevel(loggerLevels.get(l, Level.class));<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      for (String l : logConfig.levels.keySet())<a name="line.361"></a>
-<span class="sourceLineNo">362</span>         Logger.getLogger(l).setLevel(logConfig.levels.get(l));<a name="line.362"></a>
-<span class="sourceLineNo">363</span><a name="line.363"></a>
-<span class="sourceLineNo">364</span>      return this;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>   }<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>   /**<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    * Start this application.<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    *<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    * &lt;p&gt;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    * Overridden methods MUST call this method FIRST so that the {@link MicroserviceListener#onStart(Microservice)} method is called.<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    *<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    * @return This object (for method chaining).<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    * @throws Exception<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    */<a name="line.375"></a>
-<span class="sourceLineNo">376</span>   public synchronized Microservice start() throws Exception {<a name="line.376"></a>
-<span class="sourceLineNo">377</span><a name="line.377"></a>
-<span class="sourceLineNo">378</span>      if (config.getName() == null)<a name="line.378"></a>
-<span class="sourceLineNo">379</span>         err(messages, "RunningClassWithoutConfig", getClass().getSimpleName());<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      else<a name="line.380"></a>
-<span class="sourceLineNo">381</span>         out(messages, "RunningClassWithConfig", getClass().getSimpleName(), config.getName());<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>      Runtime.getRuntime().addShutdownHook(<a name="line.383"></a>
-<span class="sourceLineNo">384</span>         new Thread("ShutdownHookThread") {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>            @Override /* Thread */<a name="line.385"></a>
-<span class="sourceLineNo">386</span>            public void run() {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>               try {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>                  Microservice.this.stop();<a name="line.388"></a>
-<span class="sourceLineNo">389</span>                  Microservice.this.stopConsole();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>               } catch (Exception e) {<a name="line.390"></a>
-<span class="sourceLineNo">391</span>                  e.printStackTrace();<a name="line.391"></a>
-<span class="sourceLineNo">392</span>               }<a name="line.392"></a>
-<span class="sourceLineNo">393</span>            }<a name="line.393"></a>
-<span class="sourceLineNo">394</span>         }<a name="line.394"></a>
-<span class="sourceLineNo">395</span>      );<a name="line.395"></a>
-<span class="sourceLineNo">396</span><a name="line.396"></a>
-<span class="sourceLineNo">397</span>      listener.onStart(this);<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>      return this;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   }<a name="line.400"></a>
-<span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>   /**<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    * Starts the console thread for this microservice.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    *<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    * @return This object (for method chaining).<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    * @throws Exception<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    */<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   public synchronized Microservice startConsole() throws Exception {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      if (consoleThread != null &amp;&amp; ! consoleThread.isAlive())<a name="line.409"></a>
-<span class="sourceLineNo">410</span>         consoleThread.start();<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      return this;<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   }<a name="line.412"></a>
-<span class="sourceLineNo">413</span><a name="line.413"></a>
-<span class="sourceLineNo">414</span>   /**<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    * Stops the console thread for this microservice.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    *<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    * @return This object (for method chaining).<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    * @throws Exception<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    */<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   public synchronized Microservice stopConsole() throws Exception {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      if (consoleThread != null &amp;&amp; consoleThread.isAlive())<a name="line.421"></a>
-<span class="sourceLineNo">422</span>         consoleThread.interrupt();<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      return this;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>   /**<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    * Returns the command-line arguments passed into the application.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    *<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    * &lt;p&gt;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    * This method can be called from the class constructor.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    *<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    * &lt;p&gt;<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    * See {@link Args} for details on using this method.<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    *<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    * @return The command-line arguments passed into the application.<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    */<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   public Args getArgs() {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      return args;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>   /**<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    * Returns the external INI-style configuration file that can be used to configure your microservice.<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    *<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    * &lt;p&gt;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    * The config location is determined in the following order:<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    * &lt;ol class='spaced-list'&gt;<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    *    &lt;li&gt;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    *       The first argument passed to the microservice jar.<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    *    &lt;li&gt;<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    *       The &lt;code&gt;Main-Config&lt;/code&gt; entry in the microservice jar manifest file.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    *    &lt;li&gt;<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    *       The name of the microservice jar with a &lt;js&gt;".cfg"&lt;/js&gt; suffix (e.g.<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    *       &lt;js&gt;"mymicroservice.jar"&lt;/js&gt;-&amp;gt;&lt;js&gt;"mymicroservice.cfg"&lt;/js&gt;).<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    * &lt;/ol&gt;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    *<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    * &lt;p&gt;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    * If all methods for locating the config fail, then this method returns an empty config.<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    *<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    * &lt;p&gt;<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    * Subclasses can set their own config file by using the following methods:<a name="line.460"></a>
-<span class="sourceLineNo">461</span>    * &lt;ul class='doctree'&gt;<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    *    &lt;li class='jm'&gt;{@link MicroserviceBuilder#configStore(ConfigStore)}<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    *    &lt;li class='jm'&gt;{@link MicroserviceBuilder#configName(String)}<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    * &lt;/ul&gt;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    *<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    * &lt;p&gt;<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    * String variables are automatically resolved using the variable resolver returned by {@link #getVarResolver()}.<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    *<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    * &lt;p&gt;<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    * This method can be called from the class constructor.<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    *<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>    * &lt;p class='bcode w800'&gt;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    *    &lt;cc&gt;#--------------------------&lt;/cc&gt;<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    *    &lt;cc&gt;# My section&lt;/cc&gt;<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    *    &lt;cc&gt;#--------------------------&lt;/cc&gt;<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    *    &lt;cs&gt;[MySection]&lt;/cs&gt;<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    *<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    *    &lt;cc&gt;# An integer&lt;/cc&gt;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    *    &lt;ck&gt;anInt&lt;/ck&gt; = 1<a name="line.480"></a>
-<span class="sourceLineNo">481</span>    *<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    *    &lt;cc&gt;# A boolean&lt;/cc&gt;<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    *    &lt;ck&gt;aBoolean&lt;/ck&gt; = true<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    *<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    *    &lt;cc&gt;# An int array&lt;/cc&gt;<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    *    &lt;ck&gt;anIntArray&lt;/ck&gt; = 1,2,3<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    *<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    *    &lt;cc&gt;# A POJO that can be converted from a String&lt;/cc&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    *    &lt;ck&gt;aURL&lt;/ck&gt; = http://foo<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    *<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    *    &lt;cc&gt;# A POJO that can be converted from JSON&lt;/cc&gt;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    *    &lt;ck&gt;aBean&lt;/ck&gt; = {foo:'bar',baz:123}<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    *<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    *    &lt;cc&gt;# A system property&lt;/cc&gt;<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    *    &lt;ck&gt;locale&lt;/ck&gt; = $S{java.locale, en_US}<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    *<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    *    &lt;cc&gt;# An environment variable&lt;/cc&gt;<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    *    &lt;ck&gt;path&lt;/ck&gt; = $E{PATH, unknown}<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    *<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    *    &lt;cc&gt;# A manifest file entry&lt;/cc&gt;<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    *    &lt;ck&gt;mainClass&lt;/ck&gt; = $MF{Main-Class}<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    *<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    *    &lt;cc&gt;# Another value in this config file&lt;/cc&gt;<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    *    &lt;ck&gt;sameAsAnInt&lt;/ck&gt; = $C{MySection/anInt}<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    *<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    *    &lt;cc&gt;# A command-line argument in the form "myarg=foo"&lt;/cc&gt;<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    *    &lt;ck&gt;myArg&lt;/ck&gt; = $A{myarg}<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    *<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    *    &lt;cc&gt;# The first command-line argument&lt;/cc&gt;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    *    &lt;ck&gt;firstArg&lt;/ck&gt; = $A{0}<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    *<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    *    &lt;cc&gt;# Look for system property, or env var if that doesn't exist, or command-line arg if that doesn't exist.&lt;/cc&gt;<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    *    &lt;ck&gt;nested&lt;/ck&gt; = $S{mySystemProperty,$E{MY_ENV_VAR,$A{0}}}<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    *<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    *    &lt;cc&gt;# A POJO with embedded variables&lt;/cc&gt;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>    *    &lt;ck&gt;aBean2&lt;/ck&gt; = {foo:'$A{0}',baz:$C{MySection/anInt}}<a name="line.516"></a>
-<span class="sourceLineNo">517</span>    * &lt;/p&gt;<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    *<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    * &lt;p class='bcode w800'&gt;<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    *    &lt;jc&gt;// Java code for accessing config entries above.&lt;/jc&gt;<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    *    Config cf = getConfig();<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    *<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    *    &lt;jk&gt;int&lt;/jk&gt; anInt = cf.getInt(&lt;js&gt;"MySection/anInt"&lt;/js&gt;);<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    *    &lt;jk&gt;boolean&lt;/jk&gt; aBoolean = cf.getBoolean(&lt;js&gt;"MySection/aBoolean"&lt;/js&gt;);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    *    &lt;jk&gt;int&lt;/jk&gt;[] anIntArray = cf.getObject(&lt;jk&gt;int&lt;/jk&gt;[].&lt;jk&gt;class&lt;/jk&gt;, &lt;js&gt;"MySection/anIntArray"&lt;/js&gt;);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    *    URL aURL = cf.getObject(URL.&lt;jk&gt;class&lt;/jk&gt;, &lt;js&gt;"MySection/aURL"&lt;/js&gt;);<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    *    MyBean aBean = cf.getObject(MyBean.&lt;jk&gt;class&lt;/jk&gt;, &lt;js&gt;"MySection/aBean"&lt;/js&gt;);<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    *    Locale locale = cf.getObject(Locale.&lt;jk&gt;class&lt;/jk&gt;, &lt;js&gt;"MySection/locale"&lt;/js&gt;);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    *    String path = cf.getString(&lt;js&gt;"MySection/path"&lt;/js&gt;);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>    *    String mainClass = cf.getString(&lt;js&gt;"MySection/mainClass"&lt;/js&gt;);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    *    &lt;jk&gt;int&lt;/jk&gt; sameAsAnInt = cf.getInt(&lt;js&gt;"MySection/sameAsAnInt"&lt;/js&gt;);<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    *    String myArg = cf.getString(&lt;js&gt;"MySection/myArg"&lt;/js&gt;);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    *    String firstArg = cf.getString(&lt;js&gt;"MySection/firstArg"&lt;/js&gt;);<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    * &lt;/p&gt;<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    *<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    * @return The config file for this application, or &lt;jk&gt;null&lt;/jk&gt; if no config file is configured.<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    */<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   public Config getConfig() {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      return config;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   }<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>   /**<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    * Returns the main jar manifest file contents as a simple {@link ObjectMap}.<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    *<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    * &lt;p&gt;<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    * This map consists of the contents of {@link Manifest#getMainAttributes()} with the keys and entries converted to<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    * simple strings.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    * &lt;p&gt;<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    * This method can be called from the class constructor.<a name="line.549"></a>
-<span class="sourceLineNo">550</span>    *<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    * &lt;p class='bcode w800'&gt;<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    *    &lt;jc&gt;// Get Main-Class from manifest file.&lt;/jc&gt;<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    *    String mainClass = Microservice.&lt;jsm&gt;getManifest&lt;/jsm&gt;().getString(&lt;js&gt;"Main-Class"&lt;/js&gt;, &lt;js&gt;"unknown"&lt;/js&gt;);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    *<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    *    &lt;jc&gt;// Get Rest-Resources from manifest file.&lt;/jc&gt;<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    *    String[] restResources = Microservice.&lt;jsm&gt;getManifest&lt;/jsm&gt;().getStringArray(&lt;js&gt;"Rest-Resources"&lt;/js&gt;);<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    * &lt;/p&gt;<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    *<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    * @return The manifest file from the main jar, or &lt;jk&gt;null&lt;/jk&gt; if the manifest file could not be retrieved.<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    */<a name="line.561"></a>
-<span class="sourceLineNo">562</span>   public ManifestFile getManifest() {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      return manifest;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>   }<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>   /**<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    * Returns the variable resolver for resolving variables in strings and files.<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    *<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    * &lt;p&gt;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    * Variables can be controlled by the following methods:<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    * &lt;ul class='doctree'&gt;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    *    &lt;li class='jm'&gt;{@link MicroserviceBuilder#vars(Class...)}<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    *    &lt;li class='jm'&gt;{@link MicroserviceBuilder#varContext(String, Object)}<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    * &lt;/ul&gt;<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    *<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    * @return The VarResolver used by this Microservice, or &lt;jk&gt;null&lt;/jk&gt; if it was never created.<a name="line.576"></a>
-<span class="sourceLineNo">577</span>    */<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   public VarResolver getVarResolver() {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      return varResolver;<a name="line.579"></a>
-<span class="sourceLineNo">580</span>   }<a name="line.580"></a>
-<span class="sourceLineNo">581</span><a name="line.581"></a>
-<span class="sourceLineNo">582</span>   /**<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    * Returns the logger for this microservice.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    *<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    * @return The logger for this microservice.<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    */<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   public Logger getLogger() {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      return logger;<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   }<a name="line.589"></a>
-<span class="sourceLineNo">590</span><a name="line.590"></a>
-<span class="sourceLineNo">591</span>   /**<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    * Executes a console command.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    *<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    * @param args<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    *    The command arguments.<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    *    &lt;br&gt;The first entry in the arguments is always the command name.<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    * @param in Console input.<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    * @param out Console output.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>    * @return &lt;jk&gt;true&lt;/jk&gt; if the command returned &lt;jk&gt;true&lt;/jk&gt; meaning the console thread should exit.<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    */<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   public boolean executeCommand(Args args, Scanner in, PrintWriter out) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      ConsoleCommand cc = consoleCommandMap.get(args.getArg(0));<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      if (cc == null) {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>         out.println(messages.getString("UnknownCommand"));<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      } else {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>         try {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>            return cc.execute(in, out, args);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>         } catch (Exception e) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>            e.printStackTrace(out);<a name="line.609"></a>
-<span class="sourceLineNo">610</span>         }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      }<a name="line.611"></a>
-<span class="sourceLineNo">612</span>      return false;<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   }<a name="line.613"></a>
-<span class="sourceLineNo">614</span><a name="line.614"></a>
-<span class="sourceLineNo">615</span>   /**<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    * Convenience method for executing a console command directly.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    *<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    * &lt;p&gt;<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    * Allows you to execute a console command outside the console by simulating input and output.<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    *<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    * @param command The command name to execute.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    * @param input Optional input to the command.  Can be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    * @param args Optional command arguments to pass to the command.<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    * @return The command output.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>   public String executeCommand(String command, String input, Object...args) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      StringWriter sw = new StringWriter();<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      List&lt;String&gt; l = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      l.add(command);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>      for (Object a : args)<a name="line.630"></a>
-<span class="sourceLineNo">631</span>         l.add(asString(a));<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      Args args2 = new Args(l.toArray(new String[l.size()]));<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      try (Scanner in = new Scanner(input); PrintWriter out = new PrintWriter(sw)) {<a name="line.633"></a>
-<span class="sourceLineNo">634</span>         executeCommand(args2, in, out);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>      }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>      return sw.toString();<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   }<a name="line.637"></a>
-<span class="sourceLineNo">638</span><a name="line.638"></a>
-<span class="sourceLineNo">639</span>   /**<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    * Joins the application with the current thread.<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    *<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    * &lt;p&gt;<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    * Default implementation is a no-op.<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    *<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    * @return This object (for method chaining).<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    * @throws Exception<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    */<a name="line.647"></a>
-<span class="sourceLineNo">648</span>   public Microservice join() throws Exception {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      return this;<a name="line.649"></a>
-<span class="sourceLineNo">650</span>   }<a name="line.650"></a>
-<span class="sourceLineNo">651</span><a name="line.651"></a>
-<span class="sourceLineNo">652</span>   /**<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    * Stop this application.<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    *<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    * &lt;p&gt;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    * Overridden methods MUST call this method LAST so that the {@link MicroserviceListener#onStop(Microservice)} method is called.<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    *<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    * @return This object (for method chaining).<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    * @throws Exception<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    */<a name="line.660"></a>
-<span class="sourceLineNo">661</span>   public Microservice stop() throws Exception {<a name="line.661"></a>
-<span class="sourceLineNo">662</span>      listener.onStop(this);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      return this;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>   /**<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    * Stops the console (if it's started) and calls {@link System#exit(int)}.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    *<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    * @throws Exception<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>   public void exit() throws Exception {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      try {<a name="line.672"></a>
-<span class="sourceLineNo">673</span>         stopConsole();<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      } catch (Exception e) {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>         e.printStackTrace();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>      }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      System.exit(0);<a name="line.677"></a>
-<span class="sourceLineNo">678</span>   }<a name="line.678"></a>
-<span class="sourceLineNo">679</span><a name="line.679"></a>
-<span class="sourceLineNo">680</span>   /**<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    * Kill the JVM by calling &lt;code&gt;System.exit(2);&lt;/code&gt;.<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    */<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   public void kill() {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      // This triggers the shutdown hook.<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      System.exit(2);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>   }<a name="line.686"></a>
+<span class="sourceLineNo">173</span>            URL url = getClass().getResource("META-INF/MANIFEST.MF");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>            if (url != null) {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>               try {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>                  m.read(url.openStream());<a name="line.176"></a>
+<span class="sourceLineNo">177</span>               } catch (IOException e) {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>                  throw new IOException("Problem detected in MANIFEST.MF.  Contents below:\n " + read(url.openStream()), e);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>               }<a name="line.179"></a>
+<span class="sourceLineNo">180</span>            }<a name="line.180"></a>
+<span class="sourceLineNo">181</span>         }<a name="line.181"></a>
+<span class="sourceLineNo">182</span>         manifest = new ManifestFile(m);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      }<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      ManifestFileVar.init(manifest);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      this.manifest = manifest;<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>      // --------------------------------------------------------------------------------<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      // Try to resolve the configuration if not specified.<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      // --------------------------------------------------------------------------------<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      Config config = builder.config;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      ConfigBuilder configBuilder = builder.configBuilder.varResolver(builder.varResolverBuilder.build()).store(ConfigMemoryStore.DEFAULT);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      if (config == null) {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>         ConfigStore store = builder.configStore;<a name="line.193"></a>
+<span class="sourceLineNo">194</span>         for (String name : getCandidateConfigNames()) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>             if (store != null) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>                if (store.exists(name)) {<a name="line.196"></a>
+<span class="sourceLineNo">197</span>                   configBuilder.store(store).name(name);<a name="line.197"></a>
+<span class="sourceLineNo">198</span>                   break;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>                }<a name="line.199"></a>
+<span class="sourceLineNo">200</span>             } else {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>                if (ConfigFileStore.DEFAULT.exists(name)) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>                   configBuilder.store(ConfigFileStore.DEFAULT).name(name);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>                   break;<a name="line.203"></a>
+<span class="sourceLineNo">204</span>                }<a name="line.204"></a>
+<span class="sourceLineNo">205</span>                if (ConfigClasspathStore.DEFAULT.exists(name)) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>                   configBuilder.store(ConfigClasspathStore.DEFAULT).name(name);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>                   break;<a name="line.207"></a>
+<span class="sourceLineNo">208</span>                }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>             }<a name="line.209"></a>
+<span class="sourceLineNo">210</span>         }<a name="line.210"></a>
+<span class="sourceLineNo">211</span>         config = configBuilder.build();<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      }<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      this.config = config;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      Config.setSystemDefault(this.config);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      this.config.addListener(this);<a name="line.215"></a>
+<span class="sourceLineNo">216</span><a name="line.216"></a>
+<span class="sourceLineNo">217</span>      //-------------------------------------------------------------------------------------------------------------<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      // Var resolver.<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      //-------------------------------------------------------------------------------------------------------------<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      VarResolverBuilder varResolverBuilder = builder.varResolverBuilder;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.varResolver = varResolverBuilder.contextObject(ConfigVar.SESSION_config, config).build();<a name="line.221"></a>
+<span class="sourceLineNo">222</span><a name="line.222"></a>
+<span class="sourceLineNo">223</span>      // --------------------------------------------------------------------------------<a name="line.223"></a>
+<span class="sourceLineNo">224</span>      // Initialize console commands.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>      // --------------------------------------------------------------------------------<a name="line.225"></a>
+<span class="sourceLineNo">226</span>      this.consoleEnabled = ObjectUtils.firstNonNull(builder.consoleEnabled, config.getBoolean("Console/enabled", false));<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      if (consoleEnabled) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>         Console c = System.console();<a name="line.228"></a>
+<span class="sourceLineNo">229</span>         this.consoleReader = ObjectUtils.firstNonNull(builder.consoleReader, new Scanner(c == null ? new InputStreamReader(System.in) : c.reader()));<a name="line.229"></a>
+<span class="sourceLineNo">230</span>         this.consoleWriter = ObjectUtils.firstNonNull(builder.consoleWriter, c == null ? new PrintWriter(System.out, true) : c.writer());<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>         for (ConsoleCommand cc : builder.consoleCommands) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>            consoleCommandMap.put(cc.getName(), cc);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>         }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>         for (String s : config.getStringArray("Console/commands")) {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>            ConsoleCommand cc;<a name="line.236"></a>
+<span class="sourceLineNo">237</span>            try {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>               cc = (ConsoleCommand)Class.forName(s).newInstance();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>               consoleCommandMap.put(cc.getName(), cc);<a name="line.239"></a>
+<span class="sourceLineNo">240</span>            } catch (Exception e) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>               getConsoleWriter().println("Could not create console command '"+s+"', " + e.getLocalizedMessage());<a name="line.241"></a>
+<span class="sourceLineNo">242</span>            }<a name="line.242"></a>
+<span class="sourceLineNo">243</span>         }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>         consoleThread = new Thread("ConsoleThread") {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>            @Override /* Thread */<a name="line.245"></a>
+<span class="sourceLineNo">246</span>            public void run() {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>               Scanner in = getConsoleReader();<a name="line.247"></a>
+<span class="sourceLineNo">248</span>               PrintWriter out = getConsoleWriter();<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>               out.println(messages.getString("ListOfAvailableCommands"));<a name="line.250"></a>
+<span class="sourceLineNo">251</span>               for (ConsoleCommand cc : new TreeMap&lt;&gt;(getConsoleCommands()).values())<a name="line.251"></a>
+<span class="sourceLineNo">252</span>                  out.append("\t").append(cc.getName()).append(" -- ").append(cc.getInfo()).println();<a name="line.252"></a>
+<span class="sourceLineNo">253</span>               out.println();<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>               while (true) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>                  String line = null;<a name="line.256"></a>
+<span class="sourceLineNo">257</span>                  out.append("&gt; ").flush();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>                  line = in.nextLine();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>                  Args args = new Args(line);<a name="line.259"></a>
+<span class="sourceLineNo">260</span>                  if (! args.isEmpty())<a name="line.260"></a>
+<span class="sourceLineNo">261</span>                     executeCommand(args, in, out);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>               }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>            }<a name="line.263"></a>
+<span class="sourceLineNo">264</span>         };<a name="line.264"></a>
+<span class="sourceLineNo">265</span>         consoleThread.setDaemon(true);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      } else {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>         this.consoleReader = null;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>         this.consoleWriter = null;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>         this.consoleThread = null;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>      }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>      //-------------------------------------------------------------------------------------------------------------<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      // Other.<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      //-------------------------------------------------------------------------------------------------------------<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      this.listener = builder.listener != null ? builder.listener : new BasicMicroserviceListener();<a name="line.275"></a>
+<span class="sourceLineNo">276</span><a name="line.276"></a>
+<span class="sourceLineNo">277</span>      init();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>   private List&lt;String&gt; getCandidateConfigNames() {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      Args args = getArgs();<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      if (getArgs().hasArg("configFile"))<a name="line.282"></a>
+<span class="sourceLineNo">283</span>         return Collections.singletonList(args.getArg("configFile"));<a name="line.283"></a>
+<span class="sourceLineNo">284</span><a name="line.284"></a>
+<span class="sourceLineNo">285</span>      ManifestFile manifest = getManifest();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      if (manifest.containsKey("Main-Config"))<a name="line.286"></a>
+<span class="sourceLineNo">287</span>         return Collections.singletonList(manifest.getString("Main-Config"));<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>      return Config.getCandidateSystemDefaultConfigNames();<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   }<a name="line.290"></a>
+<span class="sourceLineNo">291</span><a name="line.291"></a>
+<span class="sourceLineNo">292</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   // Abstract lifecycle methods.<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.294"></a>
+<span class="sourceLineNo">295</span><a name="line.295"></a>
+<span class="sourceLineNo">296</span>   /**<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    * Initializes this microservice.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    *<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    * &lt;p&gt;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    * This method can be called whenever the microservice is not started.<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    *<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    * &lt;p&gt;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    * It will initialize (or reinitialize) the console commands, system properties, and logger.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    *<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    * @return This object (for method chaining).<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    * @throws Exception<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    */<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   public synchronized Microservice init() throws Exception {<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // --------------------------------------------------------------------------------<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      // Set system properties.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      // --------------------------------------------------------------------------------<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      Set&lt;String&gt; spKeys = config.getKeys("SystemProperties");<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      if (spKeys != null)<a name="line.314"></a>
+<span class="sourceLineNo">315</span>         for (String key : spKeys)<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            System.setProperty(key, config.getString("SystemProperties/"+key));<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>      // --------------------------------------------------------------------------------<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      // Initialize logging.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      // --------------------------------------------------------------------------------<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      this.logger = builder.logger;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      LogConfig logConfig = builder.logConfig != null ? builder.logConfig : new LogConfig();<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      if (this.logger == null) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>         LogManager.getLogManager().reset();<a name="line.324"></a>
+<span class="sourceLineNo">325</span>         this.logger = Logger.getLogger("");<a name="line.325"></a>
+<span class="sourceLineNo">326</span>         String logFile = firstNonNull(logConfig.logFile, config.getString("Logging/logFile"));<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>         if (isNotEmpty(logFile)) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            String logDir = firstNonNull(logConfig.logDir, config.getString("Logging/logDir", "."));<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            mkdirs(new File(logDir), false);<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>            boolean append = firstNonNull(logConfig.append, config.getBoolean("Logging/append"));<a name="line.332"></a>
+<span class="sourceLineNo">333</span>            int limit = firstNonNull(logConfig.limit, config.getInt("Logging/limit", 1024*1024));<a name="line.333"></a>
+<span class="sourceLineNo">334</span>            int count = firstNonNull(logConfig.count, config.getInt("Logging/count", 1));<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>            FileHandler fh = new FileHandler(logDir + '/' + logFile, limit, count, append);<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>            Formatter f = logConfig.formatter;<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            if (f == null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>               String format = config.getString("Logging/format", "[{date} {level}] {msg}%n");<a name="line.340"></a>
+<span class="sourceLineNo">341</span>               String dateFormat = config.getString("Logging/dateFormat", "yyyy.MM.dd hh:mm:ss");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>               boolean useStackTraceHashes = config.getBoolean("Logging/useStackTraceHashes");<a name="line.342"></a>
+<span class="sourceLineNo">343</span>               f = new LogEntryFormatter(format, dateFormat, useStackTraceHashes);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>            }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>            fh.setFormatter(f);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            fh.setLevel(firstNonNull(logConfig.fileLevel, config.getObjectWithDefault("Logging/fileLevel", Level.INFO, Level.class)));<a name="line.346"></a>
+<span class="sourceLineNo">347</span>            logger.addHandler(fh);<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>            ConsoleHandler ch = new ConsoleHandler();<a name="line.349"></a>
+<span class="sourceLineNo">350</span>            ch.setLevel(firstNonNull(logConfig.consoleLevel, config.getObjectWithDefault("Logging/consoleLevel", Level.WARNING, Level.class)));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>            ch.setFormatter(f);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>            logger.addHandler(ch);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>         }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      }<a name="line.354"></a>
+<span class="sourceLineNo">355</span><a name="line.355"></a>
+<span class="sourceLineNo">356</span>      ObjectMap loggerLevels = config.getObject("Logging/levels", ObjectMap.class);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      if (loggerLevels != null)<a name="line.357"></a>
+<span class="sourceLineNo">358</span>         for (String l : loggerLevels.keySet())<a name="line.358"></a>
+<span class="sourceLineNo">359</span>            Logger.getLogger(l).setLevel(loggerLevels.get(l, Level.class));<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      for (String l : logConfig.levels.keySet())<a name="line.360"></a>
+<span class="sourceLineNo">361</span>         Logger.getLogger(l).setLevel(logConfig.levels.get(l));<a name="line.361"></a>
+<span class="sourceLineNo">362</span><a name="line.362"></a>
+<span class="sourceLineNo">363</span>      return this;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>   }<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>   /**<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    * Start this application.<a name="line.367"></a>
+<span class="sourceLineNo">368</span>    *<a name="line.368"></a>
+<span class="sourceLineNo">369</span>    * &lt;p&gt;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    * Overridden methods MUST call this method FIRST so that the {@link MicroserviceListener#onStart(Microservice)} method is called.<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    *<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    * @return This object (for method chaining).<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    * @throws Exception<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    */<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   public synchronized Microservice start() throws Exception {<a name="line.375"></a>
+<span class="sourceLineNo">376</span><a name="line.376"></a>
+<span class="sourceLineNo">377</span>      if (config.getName() == null)<a name="line.377"></a>
+<span class="sourceLineNo">378</span>         err(messages, "RunningClassWithoutConfig", getClass().getSimpleName());<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      else<a name="line.379"></a>
+<span class="sourceLineNo">380</span>         out(messages, "RunningClassWithConfig", getClass().getSimpleName(), config.getName());<a name="line.380"></a>
+<span class="sourceLineNo">381</span><a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Runtime.getRuntime().addShutdownHook(<a name="line.382"></a>
+<span class="sourceLineNo">383</span>         new Thread("ShutdownHookThread") {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>            @Override /* Thread */<a name="line.384"></a>
+<span class="sourceLineNo">385</span>            public void run() {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>               try {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>                  Microservice.this.stop();<a name="line.387"></a>
+<span class="sourceLineNo">388</span>                  Microservice.this.stopConsole();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>               } catch (Exception e) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>                  e.printStackTrace();<a name="line.390"></a>
+<span class="sourceLineNo">391</span>               }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>            }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>         }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      );<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>      listener.onStart(this);<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>      return this;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   }<a name="line.399"></a>
+<span class="sourceLineNo">400</span><a name="line.400"></a>
+<span class="sourceLineNo">401</span>   /**<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    * Starts the console thread for this microservice.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    *<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    * @return This object (for method chaining).<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    * @throws Exception<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    */<a name="line.406"></a>
+<span class="sourceLineNo">407</span>   public synchronized Microservice startConsole() throws Exception {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (consoleThread != null &amp;&amp; ! consoleThread.isAlive())<a name="line.408"></a>
+<span class="sourceLineNo">409</span>         consoleThread.start();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      return this;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>   }<a name="line.411"></a>
+<span class="sourceLineNo">412</span><a name="line.412"></a>
+<span class="sourceLineNo">413</span>   /**<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    * Stops the console thread for this microservice.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    *<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    * @return This object (for method chaining).<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    * @throws Exception<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    */<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   public synchronized Microservice stopConsole() throws Exception {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      if (consoleThread != null &amp;&amp; consoleThread.isAlive())<a name="line.420"></a>
+<span class="sourceLineNo">421</span>         consoleThread.interrupt();<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      return this;<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   }<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>   /**<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    * Returns the command-line arguments passed into the application.<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    *<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    * &lt;p&gt;<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    * This method can be called from the class constructor.<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    *<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    * &lt;p&gt;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    * See {@link Args} for details on using this method.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    *<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    * @return The command-line arguments passed into the application.<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    */<a name="line.435"></a>
+<span class="sourceLineNo">436</span>   public Args getArgs() {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      return args;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>   }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>   /**<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    * Returns the external INI-style configuration file that can be used to configure your microservice.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    *<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    * &lt;p&gt;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    * The config location is determined in the following order:<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    * &lt;ol class='spaced-list'&gt;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    *    &lt;li&gt;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    *       The first argument passed to the microservice jar.<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    *    &lt;li&gt;<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    *       The &lt;code&gt;Main-Config&lt;/code&gt; entry in the microservice jar manifest file.<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    *    &lt;li&gt;<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    *       The name of the microservice jar with a &lt;js&gt;".cfg"&lt;/js&gt; suffix (e.g.<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    *       &lt;js&gt;"mymicroservice.jar"&lt;/js&gt;-&amp;gt;&lt;js&gt;"mymicroservice.cfg"&lt;/js&gt;).<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    * &lt;/ol&gt;<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    *<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    * &lt;p&gt;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    * If all methods for locating the config fail, then this method returns an empty config.<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    *<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    * &lt;p&gt;<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    * Subclasses can set their own config file by using the following methods:<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    * &lt;ul class='doctree'&gt;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>    *    &lt;li class='jm'&gt;{@link MicroserviceBuilder#configStore(ConfigStore)}<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    *    &lt;li class='jm'&gt;{@link MicroserviceBuilder#configName(String)}<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    * &lt;/ul&gt;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    *<a name="line.464"></a>
+<span class="sourceLineNo">465</span>    * &lt;p&gt;<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    * String variables are automatically resolved using the variable resolver returned by {@link #getVarResolver()}.<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    *<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    * &lt;p&gt;<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    * This method can be called from the class constructor.<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    *<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    * &lt;p class='bcode w800'&gt;<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    *    &lt;cc&gt;#--------------------------&lt;/cc&gt;<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    *    &lt;cc&gt;# My section&lt;/cc&gt;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    *    &lt;cc&gt;#--------------------------&lt;/cc&gt;<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    *    &lt;cs&gt;[MySection]&lt;/cs&gt;<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    *<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    *    &lt;cc&gt;# An integer&lt;/cc&gt;<a name="line.478"></a>
+<span class="sourceLineNo">479</span>    *    &lt;ck&gt;anInt&lt;/ck&gt; = 1<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    *<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    *    &lt;cc&gt;# A boolean&lt;/cc&gt;<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    *    &lt;ck&gt;aBoolean&lt;/ck&gt; = true<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    *<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    *    &lt;cc&gt;# An int array&lt;/cc&gt;<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    *    &lt;ck&gt;anIntArray&lt;/ck&gt; = 1,2,3<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    *<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    *    &lt;cc&gt;# A POJO that can be converted from a String&lt;/cc&gt;<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    *    &lt;ck&gt;aURL&lt;/ck&gt; = http://foo<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    *<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    *    &lt;cc&gt;# A POJO that can be converted from JSON&lt;/cc&gt;<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    *    &lt;ck&gt;aBean&lt;/ck&gt; = {foo:'bar',baz:123}<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    *<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    *    &lt;cc&gt;# A system property&lt;/cc&gt;<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    *    &lt;ck&gt;locale&lt;/ck&gt; = $S{java.locale, en_US}<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    *<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    *    &lt;cc&gt;# An environment variable&lt;/cc&gt;<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    *    &lt;ck&gt;path&lt;/ck&gt; = $E{PATH, unknown}<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    *<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    *    &lt;cc&gt;# A manifest file entry&lt;/cc&gt;<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    *    &lt;ck&gt;mainClass&lt;/ck&gt; = $MF{Main-Class}<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    *<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    *    &lt;cc&gt;# Another value in this config file&lt;/cc&gt;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    *    &lt;ck&gt;sameAsAnInt&lt;/ck&gt; = $C{MySection/anInt}<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    *<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    *    &lt;cc&gt;# A command-line argument in the form "myarg=foo"&lt;/cc&gt;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    *    &lt;ck&gt;myArg&lt;/ck&gt; = $A{myarg}<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    *<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    *    &lt;cc&gt;# The first command-line argument&lt;/cc&gt;<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    *    &lt;ck&gt;firstArg&lt;/ck&gt; = $A{0}<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    *<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    *    &lt;cc&gt;# Look for system property, or env var if that doesn't exist, or command-line arg if that doesn't exist.&lt;/cc&gt;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    *    &lt;ck&gt;nested&lt;/ck&gt; = $S{mySystemProperty,$E{MY_ENV_VAR,$A{0}}}<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    *<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    *    &lt;cc&gt;# A POJO with embedded variables&lt;/cc&gt;<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    *    &lt;ck&gt;aBean2&lt;/ck&gt; = {foo:'$A{0}',baz:$C{MySection/anInt}}<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    * &lt;/p&gt;<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    *<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    * &lt;p class='bcode w800'&gt;<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    *    &lt;jc&gt;// Java code for accessing config entries above.&lt;/jc&gt;<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    *    Config cf = getConfig();<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    *<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    *    &lt;jk&gt;int&lt;/jk&gt; anInt = cf.getInt(&lt;js&gt;"MySection/anInt"&lt;/js&gt;);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    *    &lt;jk&gt;boolean&lt;/jk&gt; aBoolean = cf.getBoolean(&lt;js&gt;"MySection/aBoolean"&lt;/js&gt;);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    *    &lt;jk&gt;int&lt;/jk&gt;[] anIntArray = cf.getObject(&lt;jk&gt;int&lt;/jk&gt;[].&lt;jk&gt;class&lt;/jk&gt;, &lt;js&gt;"MySection/anIntArray"&lt;/js&gt;);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    *    URL aURL = cf.getObject(URL.&lt;jk&gt;class&lt;/jk&gt;, &lt;js&gt;"MySection/aURL"&lt;/js&gt;);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    *    MyBean aBean = cf.getObject(MyBean.&lt;jk&gt;class&lt;/jk&gt;, &lt;js&gt;"MySection/aBean"&lt;/js&gt;);<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    *    Locale locale = cf.getObject(Locale.&lt;jk&gt;class&lt;/jk&gt;, &lt;js&gt;"MySection/locale"&lt;/js&gt;);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    *    String path = cf.getString(&lt;js&gt;"MySection/path"&lt;/js&gt;);<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    *    String mainClass = cf.getString(&lt;js&gt;"MySection/mainClass"&lt;/js&gt;);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    *    &lt;jk&gt;int&lt;/jk&gt; sameAsAnInt = cf.getInt(&lt;js&gt;"MySection/sameAsAnInt"&lt;/js&gt;);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    *    String myArg = cf.getString(&lt;js&gt;"MySection/myArg"&lt;/js&gt;);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    *    String firstArg = cf.getString(&lt;js&gt;"MySection/firstArg"&lt;/js&gt;);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    * &lt;/p&gt;<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    *<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    * @return The config file for this application, or &lt;jk&gt;null&lt;/jk&gt; if no config file is configured.<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    */<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   public Config getConfig() {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      return config;<a name="line.538"></a>
+<span class="sourceLineNo">539</span>   }<a name="line.539"></a>
+<span class="sourceLineNo">540</span><a name="line.540"></a>
+<span class="sourceLineNo">541</span>   /**<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    * Returns the main jar manifest file contents as a simple {@link ObjectMap}.<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    *<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    * &lt;p&gt;<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    * This map consists of the contents of {@link Manifest#getMainAttributes()} with the keys and entries converted to<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    * simple strings.<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    * &lt;p&gt;<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    * This method can be called from the class constructor.<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    *<a name="line.549"></a>
+<span class="sourceLineNo">550</span>    * &lt;h5 class='section'&gt;Example:&lt;/h5&gt;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>    * &lt;p class='bcode w800'&gt;<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    *    &lt;jc&gt;// Get Main-Class from manifest file.&lt;/jc&gt;<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    *    String mainClass = Microservice.&lt;jsm&gt;getManifest&lt;/jsm&gt;().getString(&lt;js&gt;"Main-Class"&lt;/js&gt;, &lt;js&gt;"unknown"&lt;/js&gt;);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    *<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    *    &lt;jc&gt;// Get Rest-Resources from manifest file.&lt;/jc&gt;<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    *    String[] restResources = Microservice.&lt;jsm&gt;getManifest&lt;/jsm&gt;().getStringArray(&lt;js&gt;"Rest-Resources"&lt;/js&gt;);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    * &lt;/p&gt;<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    *<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    * @return The manifest file from the main jar, or &lt;jk&gt;null&lt;/jk&gt; if the manifest file could not be retrieved.<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    */<a name="line.560"></a>
+<span class="sourceLineNo">561</span>   public ManifestFile getManifest() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      return manifest;<a name="line.562"></a>
+<span class="sourceLineNo">563</span>   }<a name="line.563"></a>
+<span class="sourceLineNo">564</span><a name="line.564"></a>
+<span class="sourceLineNo">565</span>   /**<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    * Returns the variable resolver for resolving variables in strings and files.<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    *<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    * &lt;p&gt;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    * Variables can be controlled by the following methods:<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    * &lt;ul class='doctree'&gt;<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    *    &lt;li class='jm'&gt;{@link MicroserviceBuilder#vars(Class...)}<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    *    &lt;li class='jm'&gt;{@link MicroserviceBuilder#varContext(String, Object)}<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    * &lt;/ul&gt;<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    *<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    * @return The VarResolver used by this Microservice, or &lt;jk&gt;null&lt;/jk&gt; if it was never created.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>    */<a name="line.576"></a>
+<span class="sourceLineNo">577</span>   public VarResolver getVarResolver() {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      return varResolver;<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   }<a name="line.579"></a>
+<span class="sourceLineNo">580</span><a name="line.580"></a>
+<span class="sourceLineNo">581</span>   /**<a name="line.581"></a>
+<span class="sourceLineNo">582</span>    * Returns the logger for this microservice.<a name="line.582"></a>
+<span class="sourceLineNo">583</span>    *<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    * @return The logger for this microservice.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    */<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   public Logger getLogger() {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      return logger;<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   }<a name="line.588"></a>
+<span class="sourceLineNo">589</span><a name="line.589"></a>
+<span class="sourceLineNo">590</span>   /**<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    * Executes a console command.<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    *<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    * @param args<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    *    The command arguments.<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    *    &lt;br&gt;The first entry in the arguments is always the command name.<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    * @param in Console input.<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    * @param out Console output.<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    * @return &lt;jk&gt;true&lt;/jk&gt; if the command returned &lt;jk&gt;true&lt;/jk&gt; meaning the console thread should exit.<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    */<a name="line.599"></a>
+<span class="sourceLineNo">600</span>   public boolean executeCommand(Args args, Scanner in, PrintWriter out) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      ConsoleCommand cc = consoleCommandMap.get(args.getArg(0));<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      if (cc == null) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>         out.println(messages.getString("UnknownCommand"));<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      } else {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>         try {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>            return cc.execute(in, out, args);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>         } catch (Exception e) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>            e.printStackTrace(out);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>         }<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      }<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      return false;<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   }<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>   /**<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    * Convenience method for executing a console command directly.<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    *<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    * &lt;p&gt;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    * Allows you to execute a console command outside the console by simulating input and output.<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    *<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    * @param command The command name to execute.<a name="line.620"></a>
+<span class="sourceLineNo">621</span>    * @param input Optional input to the command.  Can be &lt;jk&gt;null&lt;/jk&gt;.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    * @param args Optional command arguments to pass to the command.<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    * @return The command output.<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    */<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   public String executeCommand(String command, String input, Object...args) {<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      StringWriter sw = new StringWriter();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>      List&lt;String&gt; l = new ArrayList&lt;&gt;();<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      l.add(command);<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      for (Object a : args)<a name="line.629"></a>
+<span class="sourceLineNo">630</span>         l.add(asString(a));<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      Args args2 = new Args(l.toArray(new String[l.size()]));<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      try (Scanner in = new Scanner(input); PrintWriter out = new PrintWriter(sw)) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>         executeCommand(args2, in, out);<a name="line.633"></a>
+<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
+<span class="sourceLineNo">635</span>      return sw.toString();<a name="line.635"></a>
+<span class="sourceLineNo">636</span>   }<a name="line.636"></a>
+<span class="sourceLineNo">637</span><a name="line.637"></a>
+<span class="sourceLineNo">638</span>   /**<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    * Joins the application with the current thread.<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    *<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    * &lt;p&gt;<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    * Default implementation is a no-op.<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    *<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    * @return This object (for method chaining).<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    * @throws Exception<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    */<a name="line.646"></a>
+<span class="sourceLineNo">647</span>   public Microservice join() throws Exception {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      return this;<a name="line.648"></a>
+<span class="sourceLineNo">649</span>   }<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>   /**<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    * Stop this application.<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    *<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    * &lt;p&gt;<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    * Overridden methods MUST call this method LAST so that the {@link MicroserviceListener#onStop(Microservice)} method is called.<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    *<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    * @return This object (for method chaining).<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    * @throws Exception<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    */<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   public Microservice stop() throws Exception {<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      listener.onStop(this);<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      return this;<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   }<a name="line.663"></a>
+<span class="sourceLineNo">664</span><a name="line.664"></a>
+<span class="sourceLineNo">665</span>   /**<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    * Stops the console (if it's started) and calls {@link System#exit(int)}.<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    *<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    * @throws Exception<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    */<a name="line.669"></a>
+<span class="sourceLineNo">670</span>   public void exit() throws Exception {<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      try {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>         stopConsole();<a name="line.672"></a>
+<span class="sourceLineNo">673</span>      } catch (Exception e) {<a name="line.673"></a>
+<span class="sourceLineNo">674</span>         e.printStackTrace();<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      }<a name="line.675"></a>
+<span class="sourceLineNo">676</span>      System.exit(0);<a name="line.676"></a>
+<span class="sourceLineNo">677</span>   }<a name="line.677"></a>
+<span class="sourceLineNo">678</span><a name="line.678"></a>
+<span class="sourceLineNo">679</span>   /**<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    * Kill the JVM by calling &lt;code&gt;System.exit(2);&lt;/code&gt;.<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    */<a name="line.681"></a>
+<span class="sourceLineNo">682</span>   public void kill() {<a name="line.682"></a>
+<span class="sourceLineNo">683</span>      // This triggers the shutdown hook.<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      System.exit(2);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   }<a name="line.685"></a>
+<span class="sourceLineNo">686</span><a name="line.686"></a>
 <span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   // Other methods.<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.691"></a>
-<span class="sourceLineNo">692</span><a name="line.692"></a>
-<span class="sourceLineNo">693</span>   /**<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    * Returns the console commands associated with this microservice.<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    *<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    * @return The console commands associated with this microservice as an unmodifiable map.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    */<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   public final Map&lt;String,ConsoleCommand&gt; getConsoleCommands() {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      return consoleCommandMap;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>   /**<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    * Returns the console reader.<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    *<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    * &lt;p&gt;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    * Subclasses can override this method to provide their own console input.<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    *<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    * @return The console reader.  Never &lt;jk&gt;null&lt;/jk&gt;.<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    */<a name="line.709"></a>
-<span class="sourceLineNo">710</span>   protected Scanner getConsoleReader() {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      return consoleReader;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>   }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>   /**<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    * Returns the console writer.<a name="line.715"></a>
-<span class="sourceLineNo">716</span>    *<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    * &lt;p&gt;<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    * Subclasses can override this method to provide their own console output.<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    *<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    * @return The console writer.  Never &lt;jk&gt;null&lt;/jk&gt;.<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    */<a name="line.721"></a>
-<span class="sourceLineNo">722</span>   protected PrintWriter getConsoleWriter() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      return consoleWriter;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>   }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>   /**<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    * Prints a localized message to the console writer.<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    *<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    * &lt;p&gt;<a name="line.729"></a>
-<span class="sourceLineNo">730</span>    * Ignored if &lt;js&gt;"Console/enabled"&lt;/js&gt; is &lt;jk&gt;false&lt;/jk&gt;.<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    *<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    * @param mb The message bundle containing the message.<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    * @param messageKey The message key.<a name="line.733"></a>
-<span class="sourceLineNo">734</span>    * @param args Optional {@link MessageFormat}-style arguments.<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    */<a name="line.735"></a>
-<span class="sourceLineNo">736</span>   public void out(MessageBundle mb, String messageKey, Object...args) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      String msg = mb.getString(messageKey, args);<a name="line.737"></a>
-<span class="sourceLineNo">738</span>      if (consoleEnabled)<a name="line.738"></a>
-<span class="sourceLineNo">739</span>         getConsoleWriter().println(msg);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>      log(Level.INFO, msg);<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   }<a name="line.741"></a>
-<span class="sourceLineNo">742</span><a name="line.742"></a>
-<span class="sourceLineNo">743</span>   /**<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    * Prints a localized message to STDERR.<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    *<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    * &lt;p&gt;<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    * Ignored if &lt;js&gt;"Console/enabled"&lt;/js&gt; is &lt;jk&gt;false&lt;/jk&gt;.<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    *<a name="line.748"></a>
-<span class="sourceLineNo">749</span>    * @param mb The message bundle containing the message.<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    * @param messageKey The message key.<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    * @param args Optional {@link MessageFormat}-style arguments.<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    */<a name="line.752"></a>
-<span class="sourceLineNo">753</span>   public void err(MessageBundle mb, String messageKey, Object...args) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      String msg = mb.getString(messageKey, args);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (consoleEnabled)<a name="line.755"></a>
-<span class="sourceLineNo">756</span>         System.err.println(mb.getString(messageKey, args));  // NOT DEBUG<a name="line.756"></a>
-<span class="sourceLineNo">757</span>      log(Level.SEVERE, msg);<a name="line.757"></a>
-<span class="sourceLineNo">758</span>   }<a name="line.758"></a>
-<span class="sourceLineNo">759</span><a name="line.759"></a>
-<span class="sourceLineNo">760</span>   /**<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    * Logs a message to the log file.<a name="line.761"></a>
-<span class="sourceLineNo">762</span>    *<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    * @param level<a name="line.763"></a>
-<span class="sourceLineNo">764</span>    * @param message The message text.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>    * @param args Optional {@link MessageFormat}-style arguments.<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    */<a name="line.766"></a>
-<span class="sourceLineNo">767</span>   protected void log(Level level, String message, Object...args) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>      String msg = args.length == 0 ? message : MessageFormat.format(message, args);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      getLogger().log(level, msg);<a name="line.769"></a>
-<span class="sourceLineNo">770</span>   }<a name="line.770"></a>
-<span class="sourceLineNo">771</span><a name="line.771"></a>
-<span class="sourceLineNo">772</span>   @Override /* ConfigChangeListener */<a name="line.772"></a>
-<span class="sourceLineNo">773</span>   public void onConfigChange(ConfigEvents events) {<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      listener.onConfigChange(this, events);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>   }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>}<a name="line.776"></a>
+<span class="sourceLineNo">688</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   // Other methods.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>   //-----------------------------------------------------------------------------------------------------------------<a name="line.690"></a>
+<span class="sourceLineNo">691</span><a name="line.691"></a>
+<span class="sourceLineNo">692</span>   /**<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    * Returns the console commands associated with this microservice.<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    *<a name="line.694"></a>
+<span class="sourceLineNo">695</span>    * @return The console commands associated with this microservice as an unmodifiable map.<a name="line.695"></a>
+<span class="sourceLineNo">696</span>    */<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   public final Map&lt;String,ConsoleCommand&gt; getConsoleCommands() {<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      return consoleCommandMap;<a name="line.698"></a>
+<span class="sourceLineNo">699</span>   }<a name="line.699"></a>
+<span class="sourceLineNo">700</span><a name="line.700"></a>
+<span class="sourceLineNo">701</span>   /**<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    * Returns the console reader.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    *<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    * &lt;p&gt;<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    * Subclasses can override this method to provide their own console input.<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    *<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    * @return The console reader.  Never &lt;jk&gt;null&lt;/jk&gt;.<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    */<a name="line.708"></a>
+<span class="sourceLineNo">709</span>   protected Scanner getConsoleReader() {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>      return consoleReader;<a name="line.710"></a>
+<span class="sourceLineNo">711</span>   }<a name="line.711"></a>
+<span class="sourceLineNo">712</span><a name="line.712"></a>
+<span class="sourceLineNo">713</span>   /**<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    * Returns the console writer.<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    *<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    * &lt;p&gt;<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    * Subclasses can override this method to provide their own console output.<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    *<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    * @return The console writer.  Never &lt;jk&gt;null&lt;/jk&gt;.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    */<a name="line.720"></a>
+<span class="sourceLineNo">721</span>   protected PrintWriter getConsoleWriter() {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      return consoleWriter;<a name="line.722"></a>
+<span class="sourceLineNo">723</span>   }<a name="line.723"></a>
+<span class="sourceLineNo">724</span><a name="line.724"></a>
+<span class="sourceLineNo">725</span>   /**<a name="line.725"></a>
+<span class="sourceLineNo">726</span>    * Prints a localized message to the console writer.<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    *<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    * &lt;p&gt;<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    * Ignored if &lt;js&gt;"Console/enabled"&lt;/js&gt; is &lt;jk&gt;false&lt;/jk&gt;.<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    *<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    * @param mb The message bundle containing the message.<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    * @param messageKey The message key.<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    * @param args Optional {@link MessageFormat}-style arguments.<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    */<a name="line.734"></a>
+<span class="sourceLineNo">735</span>   public void out(MessageBundle mb, String messageKey, Object...args) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>      String msg = mb.getString(messageKey, args);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>      if (consoleEnabled)<a name="line.737"></a>
+<span class="sourceLineNo">738</span>         getConsoleWriter().println(msg);<a name="line.738"></a>
+<span class="sourceLineNo">739</span>      log(Level.INFO, msg);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>   }<a name="line.740"></a>
+<span class="sourceLineNo">741</span><a name="line.741"></a>
+<span class="sourceLineNo">742</span>   /**<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    * Prints a localized message to STDERR.<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    *<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    * &lt;p&gt;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    * Ignored if &lt;js&gt;"Console/enabled"&lt;/js&gt; is &lt;jk&gt;false&lt;/jk&gt;.<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    *<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    * @param mb The message bundle containing the message.<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    * @param messageKey The message key.<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    * @param args Optional {@link MessageFormat}-style arguments.<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    */<a name="line.751"></a>
+<span class="sourceLineNo">752</span>   public void err(MessageBundle mb, String messageKey, Object...args) {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      String msg = mb.getString(messageKey, args);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (consoleEnabled)<a name="line.754"></a>
+<span class="sourceLineNo">755</span>         System.err.println(mb.getString(messageKey, args));  // NOT DEBUG<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      log(Level.SEVERE, msg);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>   }<a name="line.757"></a>
+<span class="sourceLineNo">758</span><a name="line.758"></a>
+<span class="sourceLineNo">759</span>   /**<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    * Logs a message to the log file.<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    *<a name="line.761"></a>
+<span class="sourceLineNo">762</span>    * @param level<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    * @param message The message text.<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    * @param args Optional {@link MessageFormat}-style arguments.<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    */<a name="line.765"></a>
+<span class="sourceLineNo">766</span>   protected void log(Level level, String message, Object...args) {<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      String msg = args.length == 0 ? message : MessageFormat.format(message, args);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      getLogger().log(level, msg);<a name="line.768"></a>
+<span class="sourceLineNo">769</span>   }<a name="line.769"></a>
+<span class="sourceLineNo">770</span><a name="line.770"></a>
+<span class="sourceLineNo">771</span>   @Override /* ConfigChangeListener */<a name="line.771"></a>
+<span class="sourceLineNo">772</span>   public void onConfigChange(ConfigEvents events) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      listener.onConfigChange(this, events);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>   }<a name="line.774"></a>
+<span class="sourceLineNo">775</span>}<a name="line.775"></a>
 
 
 
diff --git a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRest.html b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRest.html
index 63fc890..d71e213 100644
--- a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRest.html
+++ b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRest.html
@@ -23,88 +23,90 @@
 <span class="sourceLineNo">015</span>import static org.apache.juneau.http.HttpMethodName.*;<a name="line.15"></a>
 <span class="sourceLineNo">016</span>import static org.apache.juneau.jsonschema.JsonSchemaGenerator.*;<a name="line.16"></a>
 <span class="sourceLineNo">017</span><a name="line.17"></a>
-<span class="sourceLineNo">018</span>import org.apache.juneau.dto.swagger.*;<a name="line.18"></a>
-<span class="sourceLineNo">019</span>import org.apache.juneau.dto.swagger.ui.*;<a name="line.19"></a>
-<span class="sourceLineNo">020</span>import org.apache.juneau.rest.annotation.*;<a name="line.20"></a>
-<span class="sourceLineNo">021</span><a name="line.21"></a>
-<span class="sourceLineNo">022</span>/**<a name="line.22"></a>
-<span class="sourceLineNo">023</span> *<a name="line.23"></a>
-<span class="sourceLineNo">024</span> *<a name="line.24"></a>
-<span class="sourceLineNo">025</span> * &lt;h5 class='section'&gt;See Also:&lt;/h5&gt;<a name="line.25"></a>
-<span class="sourceLineNo">026</span> * &lt;ul&gt;<a name="line.26"></a>
-<span class="sourceLineNo">027</span> *    &lt;li class='link'&gt;{@doc juneau-rest-server.Instantiation.BasicRestServlet}<a name="line.27"></a>
-<span class="sourceLineNo">028</span> * &lt;/ul&gt;<a name="line.28"></a>
-<span class="sourceLineNo">029</span> */<a name="line.29"></a>
-<span class="sourceLineNo">030</span>@RestResource(<a name="line.30"></a>
-<span class="sourceLineNo">031</span><a name="line.31"></a>
-<span class="sourceLineNo">032</span>   // Allow OPTIONS requests to be simulated using ?method=OPTIONS query parameter.<a name="line.32"></a>
-<span class="sourceLineNo">033</span>   allowedMethodParams="OPTIONS",<a name="line.33"></a>
-<span class="sourceLineNo">034</span><a name="line.34"></a>
-<span class="sourceLineNo">035</span>   // HTML-page specific settings.<a name="line.35"></a>
-<span class="sourceLineNo">036</span>   htmldoc=@HtmlDoc(<a name="line.36"></a>
-<span class="sourceLineNo">037</span>      // Basic page navigation links.<a name="line.37"></a>
-<span class="sourceLineNo">038</span>      navlinks={<a name="line.38"></a>
-<span class="sourceLineNo">039</span>         "up: request:/..",<a name="line.39"></a>
-<span class="sourceLineNo">040</span>         "options: servlet:/?method=OPTIONS"<a name="line.40"></a>
-<span class="sourceLineNo">041</span>      }<a name="line.41"></a>
-<span class="sourceLineNo">042</span>   )<a name="line.42"></a>
-<span class="sourceLineNo">043</span>)<a name="line.43"></a>
-<span class="sourceLineNo">044</span>public abstract class BasicRest implements BasicRestConfig {<a name="line.44"></a>
-<span class="sourceLineNo">045</span><a name="line.45"></a>
-<span class="sourceLineNo">046</span>   /**<a name="line.46"></a>
-<span class="sourceLineNo">047</span>    * [OPTIONS /*] - Show resource options.<a name="line.47"></a>
-<span class="sourceLineNo">048</span>    *<a name="line.48"></a>
-<span class="sourceLineNo">049</span>    * @param req The HTTP request.<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    * @return A bean containing the contents for the OPTIONS page.<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    */<a name="line.51"></a>
-<span class="sourceLineNo">052</span>   @RestMethod(name=OPTIONS, path="/*",<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>      summary="Swagger documentation",<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      description="Swagger documentation for this resource.",<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>      htmldoc=@HtmlDoc(<a name="line.57"></a>
-<span class="sourceLineNo">058</span>         // Override the nav links for the swagger page.<a name="line.58"></a>
-<span class="sourceLineNo">059</span>         navlinks={<a name="line.59"></a>
-<span class="sourceLineNo">060</span>            "back: servlet:/",<a name="line.60"></a>
-<span class="sourceLineNo">061</span>            "json: servlet:/?method=OPTIONS&amp;Accept=text/json&amp;plainText=true"<a name="line.61"></a>
-<span class="sourceLineNo">062</span>         },<a name="line.62"></a>
-<span class="sourceLineNo">063</span>         // Never show aside contents of page inherited from class.<a name="line.63"></a>
-<span class="sourceLineNo">064</span>         aside="NONE"<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      ),<a name="line.65"></a>
-<span class="sourceLineNo">066</span><a name="line.66"></a>
-<span class="sourceLineNo">067</span>      // POJO swaps to apply to all serializers/parsers on this method.<a name="line.67"></a>
-<span class="sourceLineNo">068</span>      pojoSwaps={<a name="line.68"></a>
-<span class="sourceLineNo">069</span>         // Use the SwaggerUI swap when rendering Swagger beans.<a name="line.69"></a>
-<span class="sourceLineNo">070</span>         // This is a per-media-type swap that only applies to text/html requests.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>         SwaggerUI.class<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      },<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
-<span class="sourceLineNo">074</span>      // Properties to apply to all serializers/parsers and REST-specific API objects on this method.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>      properties={<a name="line.75"></a>
-<span class="sourceLineNo">076</span>         // Add descriptions to the following types when not specified:<a name="line.76"></a>
-<span class="sourceLineNo">077</span>         @Property(name=JSONSCHEMA_addDescriptionsTo, value="bean,collection,array,map,enum"),<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>         // Add x-example to the following types:<a name="line.79"></a>
-<span class="sourceLineNo">080</span>         @Property(name=JSONSCHEMA_addExamplesTo, value="bean,collection,array,map"),<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>         // Don't generate schema information on the Swagger bean itself or HTML beans.<a name="line.82"></a>
-<span class="sourceLineNo">083</span>         @Property(name=JSONSCHEMA_ignoreTypes, value="Swagger,org.apache.juneau.dto.html5.*")<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      },<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>      // Shortcut for boolean properties.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      flags={<a name="line.87"></a>
-<span class="sourceLineNo">088</span>         // Use $ref references for bean definitions to reduce duplication in Swagger.<a name="line.88"></a>
-<span class="sourceLineNo">089</span>         JSONSCHEMA_useBeanDefs,<a name="line.89"></a>
-<span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>         // When parsing generated beans, ignore unknown properties that may only exist as getters and not setters.<a name="line.91"></a>
-<span class="sourceLineNo">092</span>         BEAN_ignoreUnknownBeanProperties<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      }<a name="line.93"></a>
-<span class="sourceLineNo">094</span>   )<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   public Swagger getOptions(RestRequest req) {<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      // Localized Swagger for this resource is available through the RestRequest object.<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      return req.getSwagger();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>}<a name="line.99"></a>
+<span class="sourceLineNo">018</span>import javax.servlet.http.*;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import org.apache.juneau.dto.swagger.*;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import org.apache.juneau.dto.swagger.ui.*;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import org.apache.juneau.rest.annotation.*;<a name="line.22"></a>
+<span class="sourceLineNo">023</span><a name="line.23"></a>
+<span class="sourceLineNo">024</span>/**<a name="line.24"></a>
+<span class="sourceLineNo">025</span> * Identical to {@link BasicRestServlet} but doesn't extend from {@link HttpServlet}<a name="line.25"></a>
+<span class="sourceLineNo">026</span> *<a name="line.26"></a>
+<span class="sourceLineNo">027</span> * &lt;h5 class='section'&gt;See Also:&lt;/h5&gt;<a name="line.27"></a>
+<span class="sourceLineNo">028</span> * &lt;ul&gt;<a name="line.28"></a>
+<span class="sourceLineNo">029</span> *    &lt;li class='link'&gt;{@doc juneau-rest-server.Instantiation.BasicRest}<a name="line.29"></a>
+<span class="sourceLineNo">030</span> * &lt;/ul&gt;<a name="line.30"></a>
+<span class="sourceLineNo">031</span> */<a name="line.31"></a>
+<span class="sourceLineNo">032</span>@RestResource(<a name="line.32"></a>
+<span class="sourceLineNo">033</span><a name="line.33"></a>
+<span class="sourceLineNo">034</span>   // Allow OPTIONS requests to be simulated using ?method=OPTIONS query parameter.<a name="line.34"></a>
+<span class="sourceLineNo">035</span>   allowedMethodParams="OPTIONS",<a name="line.35"></a>
+<span class="sourceLineNo">036</span><a name="line.36"></a>
+<span class="sourceLineNo">037</span>   // HTML-page specific settings.<a name="line.37"></a>
+<span class="sourceLineNo">038</span>   htmldoc=@HtmlDoc(<a name="line.38"></a>
+<span class="sourceLineNo">039</span>      // Basic page navigation links.<a name="line.39"></a>
+<span class="sourceLineNo">040</span>      navlinks={<a name="line.40"></a>
+<span class="sourceLineNo">041</span>         "up: request:/..",<a name="line.41"></a>
+<span class="sourceLineNo">042</span>         "options: servlet:/?method=OPTIONS"<a name="line.42"></a>
+<span class="sourceLineNo">043</span>      }<a name="line.43"></a>
+<span class="sourceLineNo">044</span>   )<a name="line.44"></a>
+<span class="sourceLineNo">045</span>)<a name="line.45"></a>
+<span class="sourceLineNo">046</span>public abstract class BasicRest implements BasicRestConfig {<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>   /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>    * [OPTIONS /*] - Show resource options.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>    *<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    * @param req The HTTP request.<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    * @return A bean containing the contents for the OPTIONS page.<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    */<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   @RestMethod(name=OPTIONS, path="/*",<a name="line.54"></a>
+<span class="sourceLineNo">055</span><a name="line.55"></a>
+<span class="sourceLineNo">056</span>      summary="Swagger documentation",<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      description="Swagger documentation for this resource.",<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>      htmldoc=@HtmlDoc(<a name="line.59"></a>
+<span class="sourceLineNo">060</span>         // Override the nav links for the swagger page.<a name="line.60"></a>
+<span class="sourceLineNo">061</span>         navlinks={<a name="line.61"></a>
+<span class="sourceLineNo">062</span>            "back: servlet:/",<a name="line.62"></a>
+<span class="sourceLineNo">063</span>            "json: servlet:/?method=OPTIONS&amp;Accept=text/json&amp;plainText=true"<a name="line.63"></a>
+<span class="sourceLineNo">064</span>         },<a name="line.64"></a>
+<span class="sourceLineNo">065</span>         // Never show aside contents of page inherited from class.<a name="line.65"></a>
+<span class="sourceLineNo">066</span>         aside="NONE"<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      ),<a name="line.67"></a>
+<span class="sourceLineNo">068</span><a name="line.68"></a>
+<span class="sourceLineNo">069</span>      // POJO swaps to apply to all serializers/parsers on this method.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>      pojoSwaps={<a name="line.70"></a>
+<span class="sourceLineNo">071</span>         // Use the SwaggerUI swap when rendering Swagger beans.<a name="line.71"></a>
+<span class="sourceLineNo">072</span>         // This is a per-media-type swap that only applies to text/html requests.<a name="line.72"></a>
+<span class="sourceLineNo">073</span>         SwaggerUI.class<a name="line.73"></a>
+<span class="sourceLineNo">074</span>      },<a name="line.74"></a>
+<span class="sourceLineNo">075</span><a name="line.75"></a>
+<span class="sourceLineNo">076</span>      // Properties to apply to all serializers/parsers and REST-specific API objects on this method.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>      properties={<a name="line.77"></a>
+<span class="sourceLineNo">078</span>         // Add descriptions to the following types when not specified:<a name="line.78"></a>
+<span class="sourceLineNo">079</span>         @Property(name=JSONSCHEMA_addDescriptionsTo, value="bean,collection,array,map,enum"),<a name="line.79"></a>
+<span class="sourceLineNo">080</span><a name="line.80"></a>
+<span class="sourceLineNo">081</span>         // Add x-example to the following types:<a name="line.81"></a>
+<span class="sourceLineNo">082</span>         @Property(name=JSONSCHEMA_addExamplesTo, value="bean,collection,array,map"),<a name="line.82"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>         // Don't generate schema information on the Swagger bean itself or HTML beans.<a name="line.84"></a>
+<span class="sourceLineNo">085</span>         @Property(name=JSONSCHEMA_ignoreTypes, value="Swagger,org.apache.juneau.dto.html5.*")<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      },<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>      // Shortcut for boolean properties.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      flags={<a name="line.89"></a>
+<span class="sourceLineNo">090</span>         // Use $ref references for bean definitions to reduce duplication in Swagger.<a name="line.90"></a>
+<span class="sourceLineNo">091</span>         JSONSCHEMA_useBeanDefs,<a name="line.91"></a>
+<span class="sourceLineNo">092</span><a name="line.92"></a>
+<span class="sourceLineNo">093</span>         // When parsing generated beans, ignore unknown properties that may only exist as getters and not setters.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>         BEAN_ignoreUnknownBeanProperties<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      }<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   )<a name="line.96"></a>
+<span class="sourceLineNo">097</span>   public Swagger getOptions(RestRequest req) {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      // Localized Swagger for this resource is available through the RestRequest object.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      return req.getSwagger();<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>}<a name="line.101"></a>
 
 
 
diff --git a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestGroup.html b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestGroup.html
index a560269..aa086dd 100644
--- a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestGroup.html
+++ b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestGroup.html
@@ -22,40 +22,35 @@
 <span class="sourceLineNo">014</span><a name="line.14"></a>
 <span class="sourceLineNo">015</span>import static org.apache.juneau.http.HttpMethodName.*;<a name="line.15"></a>
 <span class="sourceLineNo">016</span><a name="line.16"></a>
-<span class="sourceLineNo">017</span>import org.apache.juneau.rest.annotation.*;<a name="line.17"></a>
-<span class="sourceLineNo">018</span>import org.apache.juneau.rest.helper.*;<a name="line.18"></a>
-<span class="sourceLineNo">019</span><a name="line.19"></a>
-<span class="sourceLineNo">020</span>/**<a name="line.20"></a>
-<span class="sourceLineNo">021</span> * Specialized subclass of {@link BasicRestServlet} for showing "group" pages.<a name="line.21"></a>
-<span class="sourceLineNo">022</span> *<a name="line.22"></a>
-<span class="sourceLineNo">023</span> * &lt;p&gt;<a name="line.23"></a>
-<span class="sourceLineNo">024</span> * Group pages consist of simple lists of child resource URLs and their labels.<a name="line.24"></a>
-<span class="sourceLineNo">025</span> * They're meant to be used as jumping-off points for child resources.<a name="line.25"></a>
-<span class="sourceLineNo">026</span> *<a name="line.26"></a>
-<span class="sourceLineNo">027</span> * &lt;p&gt;<a name="line.27"></a>
-<span class="sourceLineNo">028</span> * Child resources are specified using the {@link RestResource#children() @RestResource(children)} annotation.<a name="line.28"></a>
-<span class="sourceLineNo">029</span> *<a name="line.29"></a>
-<span class="sourceLineNo">030</span> * &lt;h5 class='section'&gt;See Also:&lt;/h5&gt;<a name="line.30"></a>
-<span class="sourceLineNo">031</span> * &lt;ul&gt;<a name="line.31"></a>
-<span class="sourceLineNo">032</span> *    &lt;li class='link'&gt;{@doc juneau-rest-server.Instantiation.RouterPages}<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * &lt;/ul&gt;<a name="line.33"></a>
-<span class="sourceLineNo">034</span> */<a name="line.34"></a>
-<span class="sourceLineNo">035</span>@RestResource<a name="line.35"></a>
-<span class="sourceLineNo">036</span>public abstract class BasicRestGroup extends BasicRest {<a name="line.36"></a>
-<span class="sourceLineNo">037</span><a name="line.37"></a>
-<span class="sourceLineNo">038</span>   /**<a name="line.38"></a>
-<span class="sourceLineNo">039</span>    * [GET /] - Get child resources.<a name="line.39"></a>
-<span class="sourceLineNo">040</span>    *<a name="line.40"></a>
-<span class="sourceLineNo">041</span>    * @param req The HTTP request.<a name="line.41"></a>
-<span class="sourceLineNo">042</span>    * @return The bean containing links to the child resources.<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    * @throws Exception<a name="line.43"></a>
-<span class="sourceLineNo">044</span>    */<a name="line.44"></a>
-<span class="sourceLineNo">045</span>   @RestMethod(name=GET, path="/", summary="Navigation page")<a name="line.45"></a>
-<span class="sourceLineNo">046</span>   public ChildResourceDescriptions getChildren(RestRequest req) throws Exception {<a name="line.46"></a>
-<span class="sourceLineNo">047</span>      return new ChildResourceDescriptions(req);<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   }<a name="line.48"></a>
-<span class="sourceLineNo">049</span>}<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
+<span class="sourceLineNo">017</span>import javax.servlet.http.*;<a name="line.17"></a>
+<span class="sourceLineNo">018</span><a name="line.18"></a>
+<span class="sourceLineNo">019</span>import org.apache.juneau.rest.annotation.*;<a name="line.19"></a>
+<span class="sourceLineNo">020</span>import org.apache.juneau.rest.helper.*;<a name="line.20"></a>
+<span class="sourceLineNo">021</span><a name="line.21"></a>
+<span class="sourceLineNo">022</span>/**<a name="line.22"></a>
+<span class="sourceLineNo">023</span> * Identical to {@link BasicRestServletGroup} but doesn't extend from {@link HttpServlet}<a name="line.23"></a>
+<span class="sourceLineNo">024</span> *<a name="line.24"></a>
+<span class="sourceLineNo">025</span> * &lt;h5 class='section'&gt;See Also:&lt;/h5&gt;<a name="line.25"></a>
+<span class="sourceLineNo">026</span> * &lt;ul&gt;<a name="line.26"></a>
+<span class="sourceLineNo">027</span> *    &lt;li class='link'&gt;{@doc juneau-rest-server.Instantiation.BasicRestGroup}<a name="line.27"></a>
+<span class="sourceLineNo">028</span> * &lt;/ul&gt;<a name="line.28"></a>
+<span class="sourceLineNo">029</span> */<a name="line.29"></a>
+<span class="sourceLineNo">030</span>@RestResource<a name="line.30"></a>
+<span class="sourceLineNo">031</span>public abstract class BasicRestGroup extends BasicRest {<a name="line.31"></a>
+<span class="sourceLineNo">032</span><a name="line.32"></a>
+<span class="sourceLineNo">033</span>   /**<a name="line.33"></a>
+<span class="sourceLineNo">034</span>    * [GET /] - Get child resources.<a name="line.34"></a>
+<span class="sourceLineNo">035</span>    *<a name="line.35"></a>
+<span class="sourceLineNo">036</span>    * @param req The HTTP request.<a name="line.36"></a>
+<span class="sourceLineNo">037</span>    * @return The bean containing links to the child resources.<a name="line.37"></a>
+<span class="sourceLineNo">038</span>    * @throws Exception<a name="line.38"></a>
+<span class="sourceLineNo">039</span>    */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>   @RestMethod(name=GET, path="/", summary="Navigation page")<a name="line.40"></a>
+<span class="sourceLineNo">041</span>   public ChildResourceDescriptions getChildren(RestRequest req) throws Exception {<a name="line.41"></a>
+<span class="sourceLineNo">042</span>      return new ChildResourceDescriptions(req);<a name="line.42"></a>
+<span class="sourceLineNo">043</span>   }<a name="line.43"></a>
+<span class="sourceLineNo">044</span>}<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
 
 
 
diff --git a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestJena.html b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestJena.html
index 9e74e3c..ff07e46 100644
--- a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestJena.html
+++ b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestJena.html
@@ -20,31 +20,33 @@
 <span class="sourceLineNo">012</span>// ***************************************************************************************************************************<a name="line.12"></a>
 <span class="sourceLineNo">013</span>package org.apache.juneau.rest;<a name="line.13"></a>
 <span class="sourceLineNo">014</span><a name="line.14"></a>
-<span class="sourceLineNo">015</span>import org.apache.juneau.jena.*;<a name="line.15"></a>
-<span class="sourceLineNo">016</span>import org.apache.juneau.rest.annotation.*;<a name="line.16"></a>
-<span class="sourceLineNo">017</span><a name="line.17"></a>
-<span class="sourceLineNo">018</span>/**<a name="line.18"></a>
-<span class="sourceLineNo">019</span> * Resource servlet with additional RDF support.<a name="line.19"></a>
-<span class="sourceLineNo">020</span> */<a name="line.20"></a>
-<span class="sourceLineNo">021</span>@SuppressWarnings("serial")<a name="line.21"></a>
-<span class="sourceLineNo">022</span>@RestResource(<a name="line.22"></a>
-<span class="sourceLineNo">023</span>   serializers={<a name="line.23"></a>
-<span class="sourceLineNo">024</span>      Inherit.class,<a name="line.24"></a>
-<span class="sourceLineNo">025</span>      RdfXmlSerializer.class,<a name="line.25"></a>
-<span class="sourceLineNo">026</span>      RdfXmlAbbrevSerializer.class,<a name="line.26"></a>
-<span class="sourceLineNo">027</span>      TurtleSerializer.class,<a name="line.27"></a>
-<span class="sourceLineNo">028</span>      NTripleSerializer.class,<a name="line.28"></a>
-<span class="sourceLineNo">029</span>      N3Serializer.class<a name="line.29"></a>
-<span class="sourceLineNo">030</span>   },<a name="line.30"></a>
-<span class="sourceLineNo">031</span>   parsers={<a name="line.31"></a>
-<span class="sourceLineNo">032</span>      Inherit.class,<a name="line.32"></a>
-<span class="sourceLineNo">033</span>      RdfXmlParser.class,<a name="line.33"></a>
-<span class="sourceLineNo">034</span>      TurtleParser.class,<a name="line.34"></a>
-<span class="sourceLineNo">035</span>      NTripleParser.class,<a name="line.35"></a>
-<span class="sourceLineNo">036</span>      N3Parser.class<a name="line.36"></a>
-<span class="sourceLineNo">037</span>   }<a name="line.37"></a>
-<span class="sourceLineNo">038</span>)<a name="line.38"></a>
-<span class="sourceLineNo">039</span>public abstract class BasicRestJena extends BasicRestServlet {}<a name="line.39"></a>
+<span class="sourceLineNo">015</span>import javax.servlet.http.HttpServlet;<a name="line.15"></a>
+<span class="sourceLineNo">016</span><a name="line.16"></a>
+<span class="sourceLineNo">017</span>import org.apache.juneau.jena.*;<a name="line.17"></a>
+<span class="sourceLineNo">018</span>import org.apache.juneau.rest.annotation.*;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>/**<a name="line.20"></a>
+<span class="sourceLineNo">021</span> * Identical to {@link BasicRestServletJena} but doesn't extend from {@link HttpServlet}<a name="line.21"></a>
+<span class="sourceLineNo">022</span> */<a name="line.22"></a>
+<span class="sourceLineNo">023</span>@SuppressWarnings("serial")<a name="line.23"></a>
+<span class="sourceLineNo">024</span>@RestResource(<a name="line.24"></a>
+<span class="sourceLineNo">025</span>   serializers={<a name="line.25"></a>
+<span class="sourceLineNo">026</span>      Inherit.class,<a name="line.26"></a>
+<span class="sourceLineNo">027</span>      RdfXmlSerializer.class,<a name="line.27"></a>
+<span class="sourceLineNo">028</span>      RdfXmlAbbrevSerializer.class,<a name="line.28"></a>
+<span class="sourceLineNo">029</span>      TurtleSerializer.class,<a name="line.29"></a>
+<span class="sourceLineNo">030</span>      NTripleSerializer.class,<a name="line.30"></a>
+<span class="sourceLineNo">031</span>      N3Serializer.class<a name="line.31"></a>
+<span class="sourceLineNo">032</span>   },<a name="line.32"></a>
+<span class="sourceLineNo">033</span>   parsers={<a name="line.33"></a>
+<span class="sourceLineNo">034</span>      Inherit.class,<a name="line.34"></a>
+<span class="sourceLineNo">035</span>      RdfXmlParser.class,<a name="line.35"></a>
+<span class="sourceLineNo">036</span>      TurtleParser.class,<a name="line.36"></a>
+<span class="sourceLineNo">037</span>      NTripleParser.class,<a name="line.37"></a>
+<span class="sourceLineNo">038</span>      N3Parser.class<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   }<a name="line.39"></a>
+<span class="sourceLineNo">040</span>)<a name="line.40"></a>
+<span class="sourceLineNo">041</span>public abstract class BasicRestJena extends BasicRestServlet {}<a name="line.41"></a>
 
 
 
diff --git a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestJenaGroup.html b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestJenaGroup.html
index c61d50d..5ec8bdb 100644
--- a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestJenaGroup.html
+++ b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestJenaGroup.html
@@ -20,31 +20,33 @@
 <span class="sourceLineNo">012</span>// ***************************************************************************************************************************<a name="line.12"></a>
 <span class="sourceLineNo">013</span>package org.apache.juneau.rest;<a name="line.13"></a>
 <span class="sourceLineNo">014</span><a name="line.14"></a>
-<span class="sourceLineNo">015</span>import org.apache.juneau.jena.*;<a name="line.15"></a>
-<span class="sourceLineNo">016</span>import org.apache.juneau.rest.annotation.*;<a name="line.16"></a>
-<span class="sourceLineNo">017</span><a name="line.17"></a>
-<span class="sourceLineNo">018</span>/**<a name="line.18"></a>
-<span class="sourceLineNo">019</span> * Resource group with additional RDF support.<a name="line.19"></a>
-<span class="sourceLineNo">020</span> */<a name="line.20"></a>
-<span class="sourceLineNo">021</span>@SuppressWarnings("serial")<a name="line.21"></a>
-<span class="sourceLineNo">022</span>@RestResource(<a name="line.22"></a>
-<span class="sourceLineNo">023</span>   serializers={<a name="line.23"></a>
-<span class="sourceLineNo">024</span>      Inherit.class,<a name="line.24"></a>
-<span class="sourceLineNo">025</span>      RdfXmlSerializer.class,<a name="line.25"></a>
-<span class="sourceLineNo">026</span>      RdfXmlAbbrevSerializer.class,<a name="line.26"></a>
-<span class="sourceLineNo">027</span>      TurtleSerializer.class,<a name="line.27"></a>
-<span class="sourceLineNo">028</span>      NTripleSerializer.class,<a name="line.28"></a>
-<span class="sourceLineNo">029</span>      N3Serializer.class<a name="line.29"></a>
-<span class="sourceLineNo">030</span>   },<a name="line.30"></a>
-<span class="sourceLineNo">031</span>   parsers={<a name="line.31"></a>
-<span class="sourceLineNo">032</span>      Inherit.class,<a name="line.32"></a>
-<span class="sourceLineNo">033</span>      RdfXmlParser.class,<a name="line.33"></a>
-<span class="sourceLineNo">034</span>      TurtleParser.class,<a name="line.34"></a>
-<span class="sourceLineNo">035</span>      NTripleParser.class,<a name="line.35"></a>
-<span class="sourceLineNo">036</span>      N3Parser.class<a name="line.36"></a>
-<span class="sourceLineNo">037</span>   }<a name="line.37"></a>
-<span class="sourceLineNo">038</span>)<a name="line.38"></a>
-<span class="sourceLineNo">039</span>public abstract class BasicRestJenaGroup extends BasicRestServletGroup {}<a name="line.39"></a>
+<span class="sourceLineNo">015</span>import javax.servlet.http.HttpServlet;<a name="line.15"></a>
+<span class="sourceLineNo">016</span><a name="line.16"></a>
+<span class="sourceLineNo">017</span>import org.apache.juneau.jena.*;<a name="line.17"></a>
+<span class="sourceLineNo">018</span>import org.apache.juneau.rest.annotation.*;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>/**<a name="line.20"></a>
+<span class="sourceLineNo">021</span> * Identical to {@link BasicRestServletJenaGroup} but doesn't extend from {@link HttpServlet}<a name="line.21"></a>
+<span class="sourceLineNo">022</span> */<a name="line.22"></a>
+<span class="sourceLineNo">023</span>@SuppressWarnings("serial")<a name="line.23"></a>
+<span class="sourceLineNo">024</span>@RestResource(<a name="line.24"></a>
+<span class="sourceLineNo">025</span>   serializers={<a name="line.25"></a>
+<span class="sourceLineNo">026</span>      Inherit.class,<a name="line.26"></a>
+<span class="sourceLineNo">027</span>      RdfXmlSerializer.class,<a name="line.27"></a>
+<span class="sourceLineNo">028</span>      RdfXmlAbbrevSerializer.class,<a name="line.28"></a>
+<span class="sourceLineNo">029</span>      TurtleSerializer.class,<a name="line.29"></a>
+<span class="sourceLineNo">030</span>      NTripleSerializer.class,<a name="line.30"></a>
+<span class="sourceLineNo">031</span>      N3Serializer.class<a name="line.31"></a>
+<span class="sourceLineNo">032</span>   },<a name="line.32"></a>
+<span class="sourceLineNo">033</span>   parsers={<a name="line.33"></a>
+<span class="sourceLineNo">034</span>      Inherit.class,<a name="line.34"></a>
+<span class="sourceLineNo">035</span>      RdfXmlParser.class,<a name="line.35"></a>
+<span class="sourceLineNo">036</span>      TurtleParser.class,<a name="line.36"></a>
+<span class="sourceLineNo">037</span>      NTripleParser.class,<a name="line.37"></a>
+<span class="sourceLineNo">038</span>      N3Parser.class<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   }<a name="line.39"></a>
+<span class="sourceLineNo">040</span>)<a name="line.40"></a>
+<span class="sourceLineNo">041</span>public abstract class BasicRestJenaGroup extends BasicRestServletGroup {}<a name="line.41"></a>
 
 
 
diff --git a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestServletGroup.html b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestServletGroup.html
index e38aeb5..b099ae8 100644
--- a/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestServletGroup.html
+++ b/content/site/apidocs-8.0.1/src-html/org/apache/juneau/rest/BasicRestServletGroup.html
@@ -37,7 +37,7 @@
 <span class="sourceLineNo">029</span> *<a name="line.29"></a>
 <span class="sourceLineNo">030</span> * &lt;h5 class='section'&gt;See Also:&lt;/h5&gt;<a name="line.30"></a>
 <span class="sourceLineNo">031</span> * &lt;ul&gt;<a name="line.31"></a>
-<span class="sourceLineNo">032</span> *    &lt;li class='link'&gt;{@doc juneau-rest-server.Instantiation.RouterPages}<a name="line.32"></a>
+<span class="sourceLineNo">032</span> *    &lt;li class='link'&gt;{@doc juneau-rest-server.Instantiation.BasicRestServletGroup}<a name="line.32"></a>
 <span class="sourceLineNo">033</span> * &lt;/ul&gt;<a name="line.33"></a>
 <span class="sourceLineNo">034</span> */<a name="line.34"></a>
 <span class="sourceLineNo">035</span>@RestResource<a name="line.35"></a>