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

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


The following commit(s) were added to refs/heads/master by this push:
     new 45b301e  New variable resolvers.
45b301e is described below

commit 45b301e077cacc96098e1950cf9656f9c09f41e7
Author: JamesBognar <[email protected]>
AuthorDate: Wed Feb 28 19:51:49 2018 -0500

    New variable resolvers.
---
 eclipse-preferences/user-dictionary.txt            |   2 +
 .../juneau/config/internal/package-info.java       |  18 ++
 .../{SwitchVarTest.java => LowerCaseVarTest.java}  |  27 +-
 .../{SwitchVarTest.java => NotEmptyVarTest.java}   |  30 +-
 ...SwitchVarTest.java => PatternMatchVarTest.java} |  36 +--
 .../org/apache/juneau/svl/vars/SwitchVarTest.java  |  40 +--
 .../{SwitchVarTest.java => UpperCaseVarTest.java}  |  27 +-
 .../java/org/apache/juneau/svl/VarResolver.java    |   8 +-
 .../org/apache/juneau/svl/VarResolverBuilder.java  |   6 +-
 .../org/apache/juneau/svl/vars/LowerCaseVar.java   |  51 ++++
 .../org/apache/juneau/svl/vars/NotEmptyVar.java    |  51 ++++
 .../vars/{SwitchVar.java => PatternMatchVar.java}  |  37 +--
 .../java/org/apache/juneau/svl/vars/SwitchVar.java |  29 +-
 .../org/apache/juneau/svl/vars/UpperCaseVar.java   |  51 ++++
 juneau-doc/src/main/javadoc/overview.html          | 304 ++++++++++++---------
 15 files changed, 439 insertions(+), 278 deletions(-)

diff --git a/eclipse-preferences/user-dictionary.txt 
b/eclipse-preferences/user-dictionary.txt
index 0c387d7..e41539c 100644
--- a/eclipse-preferences/user-dictionary.txt
+++ b/eclipse-preferences/user-dictionary.txt
@@ -494,3 +494,5 @@ maven
 configurability
 navlinks
 fav
+transactional
+rollback
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/package-info.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/package-info.java
new file mode 100755
index 0000000..e04991d
--- /dev/null
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/package-info.java
@@ -0,0 +1,18 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+
+/**
+ * Internal Utilities
+ */
+package org.apache.juneau.config.internal;
+
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/LowerCaseVarTest.java
similarity index 55%
copy from 
juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
copy to 
juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/LowerCaseVarTest.java
index 2dfaf0b..91e2eb3 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/LowerCaseVarTest.java
@@ -17,36 +17,17 @@ import static org.junit.Assert.*;
 import org.apache.juneau.svl.*;
 import org.junit.*;
 
-public class SwitchVarTest {
+public class LowerCaseVarTest {
 
        
//====================================================================================================
        // test - Basic tests
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(SwitchVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = new 
VarResolverBuilder().vars(LowerCaseVar.class, 
SystemPropertiesVar.class).build();
 
-               System.setProperty("SwitchVarTest.test", "foobar");
+               System.setProperty("LowerCaseVar.test", "fooBAR");
 
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar,YES}"));
-               assertEquals("YES", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar , YES }"));
-               assertEquals("", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES,NO}"));
-               assertEquals("NO", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar2 , YES , NO }"));
-
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foo*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*bar,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},??????,YES,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},*xbar,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},?????,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},???????,YES,NO}"));
-
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2}"));
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,fooy*,YES2,NO}"));
+               assertEquals("foobar", 
vr.resolve("$LC{$S{LowerCaseVar.test}}"));
        }
 }
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/NotEmptyVarTest.java
similarity index 55%
copy from 
juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
copy to 
juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/NotEmptyVarTest.java
index 2dfaf0b..0fc804d 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/NotEmptyVarTest.java
@@ -17,36 +17,18 @@ import static org.junit.Assert.*;
 import org.apache.juneau.svl.*;
 import org.junit.*;
 
-public class SwitchVarTest {
+public class NotEmptyVarTest {
 
        
//====================================================================================================
        // test - Basic tests
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(SwitchVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = new 
VarResolverBuilder().vars(NotEmptyVar.class, SystemPropertiesVar.class).build();
 
-               System.setProperty("SwitchVarTest.test", "foobar");
-
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar,YES}"));
-               assertEquals("YES", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar , YES }"));
-               assertEquals("", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES,NO}"));
-               assertEquals("NO", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar2 , YES , NO }"));
-
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foo*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*bar,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},??????,YES,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},*xbar,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},?????,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},???????,YES,NO}"));
-
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2}"));
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,fooy*,YES2,NO}"));
+               assertEquals("false", vr.resolve("$NE{}"));
+               assertEquals("false", vr.resolve("$NE{ }"));
+               assertEquals("false", vr.resolve("$NE{ $S{xxx} }"));
+               assertEquals("true", vr.resolve("$NE{ foo }"));
        }
 }
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/PatternMatchVarTest.java
similarity index 55%
copy from 
juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
copy to 
juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/PatternMatchVarTest.java
index 2dfaf0b..f77d693 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/PatternMatchVarTest.java
@@ -17,36 +17,30 @@ import static org.junit.Assert.*;
 import org.apache.juneau.svl.*;
 import org.junit.*;
 
-public class SwitchVarTest {
+public class PatternMatchVarTest {
 
        
//====================================================================================================
        // test - Basic tests
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(SwitchVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = new 
VarResolverBuilder().vars(PatternMatchVar.class, 
SystemPropertiesVar.class).build();
 
-               System.setProperty("SwitchVarTest.test", "foobar");
+               System.setProperty("PatternMatchVarTest.test", "foobar");
 
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar,YES}"));
-               assertEquals("YES", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar , YES }"));
-               assertEquals("", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES,NO}"));
-               assertEquals("NO", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar2 , YES , NO }"));
+               assertEquals("true", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},foobar}"));
+               assertEquals("true", vr.resolve("$PM{ $S{ 
PatternMatchVarTest.test } , foobar }"));
+               assertEquals("false", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},foobar2}"));
+               assertEquals("false", vr.resolve("$PM{ $S{ 
PatternMatchVarTest.test } , foobar2  }"));
 
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foo*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*bar,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},??????,YES,NO}"));
+               assertEquals("true", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},foo*}"));
+               assertEquals("true", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},*bar}"));
+               assertEquals("true", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},*}"));
+               assertEquals("true", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},??????}"));
 
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},*xbar,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},?????,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},???????,YES,NO}"));
-
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2}"));
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,fooy*,YES2,NO}"));
+               assertEquals("false", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},foox*}"));
+               assertEquals("false", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},*xbar}"));
+               assertEquals("false", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},?????}"));
+               assertEquals("false", 
vr.resolve("$PM{$S{PatternMatchVarTest.test},???????}"));
        }
 }
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
index 2dfaf0b..36faf04 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
@@ -28,25 +28,25 @@ public class SwitchVarTest {
 
                System.setProperty("SwitchVarTest.test", "foobar");
 
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar,YES}"));
-               assertEquals("YES", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar , YES }"));
-               assertEquals("", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES,NO}"));
-               assertEquals("NO", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar2 , YES , NO }"));
-
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foo*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*bar,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},??????,YES,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},*xbar,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},?????,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},???????,YES,NO}"));
-
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2}"));
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,fooy*,YES2,NO}"));
+               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar:YES}"));
+               assertEquals("YES", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar : YES }"));
+               assertEquals("", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2:YES}"));
+               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2:YES,*:NO}"));
+               assertEquals("NO", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar2 : YES , *:NO }"));
+
+               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foo*:YES,*:NO}"));
+               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*bar:YES,*:NO}"));
+               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*:YES,*:NO}"));
+               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},??????:YES,*:NO}"));
+
+               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*:YES,*:NO}"));
+               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},*xbar:YES,*:NO}"));
+               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},?????:YES,*:NO}"));
+               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},???????:YES,*:NO}"));
+
+               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*:YES1,foo*:YES2}"));
+               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*:YES1,foo*:YES2,*:NO}"));
+
+               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*:YES1,fooy*:YES2,*:NO}"));
        }
 }
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/UpperCaseVarTest.java
similarity index 55%
copy from 
juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
copy to 
juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/UpperCaseVarTest.java
index 2dfaf0b..e412906 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/SwitchVarTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/svl/vars/UpperCaseVarTest.java
@@ -17,36 +17,17 @@ import static org.junit.Assert.*;
 import org.apache.juneau.svl.*;
 import org.junit.*;
 
-public class SwitchVarTest {
+public class UpperCaseVarTest {
 
        
//====================================================================================================
        // test - Basic tests
        
//====================================================================================================
        @Test
        public void test() throws Exception {
-               VarResolver vr = new VarResolverBuilder().vars(SwitchVar.class, 
SystemPropertiesVar.class).build();
+               VarResolver vr = new 
VarResolverBuilder().vars(UpperCaseVar.class, 
SystemPropertiesVar.class).build();
 
-               System.setProperty("SwitchVarTest.test", "foobar");
+               System.setProperty("UpperCaseVar.test", "fooBAR");
 
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar,YES}"));
-               assertEquals("YES", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar , YES }"));
-               assertEquals("", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foobar2,YES,NO}"));
-               assertEquals("NO", vr.resolve("$SW{ $S{ SwitchVarTest.test } , 
foobar2 , YES , NO }"));
-
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},foo*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*bar,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},*,YES,NO}"));
-               assertEquals("YES", 
vr.resolve("$SW{$S{SwitchVarTest.test},??????,YES,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},*xbar,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},?????,YES,NO}"));
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},???????,YES,NO}"));
-
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2}"));
-               assertEquals("YES2", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,foo*,YES2,NO}"));
-
-               assertEquals("NO", 
vr.resolve("$SW{$S{SwitchVarTest.test},foox*,YES1,fooy*,YES2,NO}"));
+               assertEquals("FOOBAR", 
vr.resolve("$UC{$S{UpperCaseVar.test}}"));
        }
 }
diff --git 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolver.java 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolver.java
index 6bc5d27..c007a4c 100644
--- 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolver.java
+++ 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolver.java
@@ -65,9 +65,13 @@ public class VarResolver {
         * <ul>
         *      <li><code>$S{key}</code>,<code>$S{key,default}</code> - {@link 
SystemPropertiesVar}
         *      <li><code>$E{key}</code>,<code>$E{key,default}</code> - {@link 
EnvVariablesVar}
-        *      <li><code>$IF{booleanValue,thenValue[,elseValue]}</code> - 
{@link IfVar}
-        *      
<li><code>$SW{test,matchPattern,thenValue[,matchPattern,thenValue][,elseValue]}</code>
 - {@link SwitchVar}
+        *      <li><code>$IF{booleanValue, thenValue[, elseValue]}</code> - 
{@link IfVar}
+        *      <li><code>$SW{stringValue, matchPattern:thenValue[, 
matchPattern:thenValue}</code> - {@link SwitchVar}
         *      <li><code>$CO{arg1[,arg2...]}</code> - {@link CoalesceVar}
+        *      <li><code>$PM{stringValue,matchPattern}</code> - {@link 
PatternMatchVar}
+        *      <li><code>$UC{stringValue}</code> - {@link UpperCaseVar}
+        *      <li><code>$LC{stringValue}</code> - {@link LowerCaseVar}
+        *      <li><code>$NE{stringValue}</code> - {@link NotEmptyVar}
         * </ul>
         * 
         * @see SystemPropertiesVar
diff --git 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
index 617c5ab..edea10e 100644
--- 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
+++ 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/VarResolverBuilder.java
@@ -68,12 +68,16 @@ public class VarResolverBuilder {
         *      <li>{@link SwitchVar}
         *      <li>{@link IfVar}
         *      <li>{@link CoalesceVar}
+        *      <li>{@link PatternMatchVar}
+        *      <li>{@link UpperCaseVar}
+        *      <li>{@link LowerCaseVar}
+        *      <li>{@link NotEmptyVar}
         * </ul>
         * 
         * @return This object (for method chaining).
         */
        public VarResolverBuilder defaultVars() {
-               return vars(SystemPropertiesVar.class, EnvVariablesVar.class, 
SwitchVar.class, IfVar.class, CoalesceVar.class);
+               return vars(SystemPropertiesVar.class, EnvVariablesVar.class, 
SwitchVar.class, IfVar.class, CoalesceVar.class, PatternMatchVar.class, 
UpperCaseVar.class, LowerCaseVar.class, NotEmptyVar.class);
        }
 
        /**
diff --git 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/LowerCaseVar.java
 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/LowerCaseVar.java
new file mode 100644
index 0000000..53d422e
--- /dev/null
+++ 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/LowerCaseVar.java
@@ -0,0 +1,51 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.svl.vars;
+
+import org.apache.juneau.svl.*;
+
+/**
+ * Upper-case variable resolver.
+ * 
+ * <p>
+ * The format for this var is <js>"$LC{stringValue}"</js>.
+ * 
+ * <p>
+ * This variable simply converts to value to lower-case.
+ * 
+ * <p>
+ * Since this is a {@link SimpleVar}, any variables contained in the result 
will be recursively resolved.
+ * Likewise, if the arguments contain any variables, those will be resolved 
before they are passed to this var.
+ * 
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ *     <li class='link'><a class="doclink" 
href="../../../../../overview-summary.html#juneau-rest-server.SvlVariables">Overview
 &gt; juneau-rest-server &gt; SVL Variables</a>
+ * </ul>
+ */
+public class LowerCaseVar extends SimpleVar {
+
+       /** The name of this variable. */
+       public static final String NAME = "LC";
+
+       /**
+        * Constructor.
+        */
+       public LowerCaseVar() {
+               super(NAME);
+       }
+
+       @Override /* Parameter */
+       public String resolve(VarResolverSession session, String key) {
+               return key.toLowerCase();
+       }
+}
\ No newline at end of file
diff --git 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/NotEmptyVar.java
 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/NotEmptyVar.java
new file mode 100644
index 0000000..01d28c7
--- /dev/null
+++ 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/NotEmptyVar.java
@@ -0,0 +1,51 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.svl.vars;
+
+import org.apache.juneau.svl.*;
+
+/**
+ * Upper-case variable resolver.
+ * 
+ * <p>
+ * The format for this var is <js>"$NE{stringValue}"</js>.
+ * 
+ * <p>
+ * This variable returns <js>"true"</js> if the contents are not empty.
+ * 
+ * <p>
+ * Since this is a {@link SimpleVar}, any variables contained in the result 
will be recursively resolved.
+ * Likewise, if the arguments contain any variables, those will be resolved 
before they are passed to this var.
+ * 
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ *     <li class='link'><a class="doclink" 
href="../../../../../overview-summary.html#juneau-rest-server.SvlVariables">Overview
 &gt; juneau-rest-server &gt; SVL Variables</a>
+ * </ul>
+ */
+public class NotEmptyVar extends SimpleVar {
+
+       /** The name of this variable. */
+       public static final String NAME = "NE";
+
+       /**
+        * Constructor.
+        */
+       public NotEmptyVar() {
+               super(NAME);
+       }
+
+       @Override /* Parameter */
+       public String resolve(VarResolverSession session, String key) {
+               return String.valueOf(! key.trim().isEmpty());
+       }
+}
\ No newline at end of file
diff --git 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/PatternMatchVar.java
similarity index 70%
copy from 
juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
copy to 
juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/PatternMatchVar.java
index 2cdbbed..e638acc 100644
--- 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
+++ 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/PatternMatchVar.java
@@ -19,15 +19,12 @@ import java.util.regex.*;
 import org.apache.juneau.svl.*;
 
 /**
- * A basic switch/case logic variable resolver.
+ * A logical variable resolver that resolves to <js>"true</js> if a pattern 
matches.
  * 
  * <p>
  * The format for this var is one of the following:
  * <ul>
- *     <li><js>"$SW{stringArg,pattern,thenValue}"</js>
- *     <li><js>"$SW{stringArg,pattern,thenValue,elseValue}"</js>
- *     <li><js>"$SW{stringArg,pattern,thenValue,pattern,thenValue}"</js>
- *     
<li><js>"$SW{stringArg,pattern,thenValue,pattern,thenValue,elsePattern}"</js>
+ *     <li><js>"$PM{stringArg, pattern}"</js>
  *     <li>...
  * </ul>
  * 
@@ -38,10 +35,10 @@ import org.apache.juneau.svl.*;
  * <h5 class='section'>Example:</h5>
  * <p class='bcode'>
  *     <jc>// Create a variable resolver that resolves system properties and 
$SW vars.</jc>
- *     VarResolver r = 
VarResolver.<jsm>create</jsm>().vars(SwitchVar.<jk>class</jk>, 
SystemPropertiesVar.<jk>class</jk>).build();
+ *     VarResolver r = 
VarResolver.<jsm>create</jsm>().vars(PatternMatchVar.<jk>class</jk>, 
SystemPropertiesVar.<jk>class</jk>).build();
  * 
  *     <jc>// Use it!</jc>
- *     System.<jsf>out</jsf>.println(r.resolve(<js>"We are running on 
$SW{$P{os.name},*win*,Windows,Something else}!"</js>));
+ *     System.<jsf>out</jsf>.println(r.resolve(<js>"Running on Windows?  
$PM{$P{os.name},*win*}!"</js>));
  * </p>
  * 
  * <p>
@@ -53,36 +50,26 @@ import org.apache.juneau.svl.*;
  *     <li class='link'><a class="doclink" 
href="../../../../../overview-summary.html#juneau-svl.SvlVariables">Overview 
&gt; juneau-svl &gt; SVL Variables</a>
  * </ul>
  */
-public class SwitchVar extends MultipartVar {
+public class PatternMatchVar extends MultipartVar {
 
        /** The name of this variable. */
-       public static final String NAME = "SW";
+       public static final String NAME = "PM";
 
        /**
         * Constructor.
         */
-       public SwitchVar() {
+       public PatternMatchVar() {
                super(NAME);
        }
 
        @Override /* MultipartVar */
        public String resolve(VarResolverSession session, String[] args) {
-               if (args.length < 3)
-                       illegalArg("Invalid number of arguments passed to $SW 
var.  Must have 3 or more arguments.");
+               if (args.length < 2)
+                       illegalArg("Invalid number of arguments passed to $PM 
var.  Must have 2 or more arguments.");
 
                String stringArg = args[0];
-               for (int i = 1; i < args.length;) {
-                       String pattern = args[i++];
-                       if (args.length == i)
-                               return pattern;  // We've reached an else.
-
-                       Pattern p = Pattern.compile(pattern.replace("*", 
".*").replace("?", "."));
-                       if (p.matcher(stringArg).matches())
-                               return args[i];
-                       i++;
-               }
-
-               // Nothing matched and no else clause.
-               return "";
+               String pattern = args[1];
+               Pattern p = Pattern.compile(pattern.replace("*", 
".*").replace("?", "."));
+               return String.valueOf(p.matcher(stringArg).matches());
        }
 }
diff --git 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
index 2cdbbed..9a094ef 100644
--- 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
+++ 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.internal.ThrowableUtils.*;
 
 import java.util.regex.*;
 
+import org.apache.juneau.internal.*;
 import org.apache.juneau.svl.*;
 
 /**
@@ -24,10 +25,7 @@ import org.apache.juneau.svl.*;
  * <p>
  * The format for this var is one of the following:
  * <ul>
- *     <li><js>"$SW{stringArg,pattern,thenValue}"</js>
- *     <li><js>"$SW{stringArg,pattern,thenValue,elseValue}"</js>
- *     <li><js>"$SW{stringArg,pattern,thenValue,pattern,thenValue}"</js>
- *     
<li><js>"$SW{stringArg,pattern,thenValue,pattern,thenValue,elsePattern}"</js>
+ *     <li><js>"$SW{stringArg, pattern:thenValue[, pattern:thenValue...]}"</js>
  *     <li>...
  * </ul>
  * 
@@ -41,7 +39,7 @@ import org.apache.juneau.svl.*;
  *     VarResolver r = 
VarResolver.<jsm>create</jsm>().vars(SwitchVar.<jk>class</jk>, 
SystemPropertiesVar.<jk>class</jk>).build();
  * 
  *     <jc>// Use it!</jc>
- *     System.<jsf>out</jsf>.println(r.resolve(<js>"We are running on 
$SW{$P{os.name},*win*,Windows,Something else}!"</js>));
+ *     System.<jsf>out</jsf>.println(r.resolve(<js>"We are running on 
$SW{$P{os.name},*win*:Windows,*:Something else}!"</js>));
  * </p>
  * 
  * <p>
@@ -67,19 +65,20 @@ public class SwitchVar extends MultipartVar {
 
        @Override /* MultipartVar */
        public String resolve(VarResolverSession session, String[] args) {
-               if (args.length < 3)
-                       illegalArg("Invalid number of arguments passed to $SW 
var.  Must have 3 or more arguments.");
+               if (args.length < 2)
+                       illegalArg("Invalid number of arguments passed to $SW 
var.  Must have 2 or more arguments.");
 
                String stringArg = args[0];
-               for (int i = 1; i < args.length;) {
-                       String pattern = args[i++];
-                       if (args.length == i)
-                               return pattern;  // We've reached an else.
-
-                       Pattern p = Pattern.compile(pattern.replace("*", 
".*").replace("?", "."));
+               for (int i = 1; i < args.length; i++) {
+                       String pattern = args[i];
+                       
+                       String[] parts = StringUtils.split(pattern, ':', 2);
+                       if (parts.length < 2)
+                               illegalArg("Invalid arguments passed to $SW 
var.  Each case statement must contains 'pattern:value'.");
+                       
+                       Pattern p = Pattern.compile(parts[0].replace("*", 
".*").replace("?", "."));
                        if (p.matcher(stringArg).matches())
-                               return args[i];
-                       i++;
+                               return parts[1];
                }
 
                // Nothing matched and no else clause.
diff --git 
a/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/UpperCaseVar.java
 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/UpperCaseVar.java
new file mode 100644
index 0000000..1842f6d
--- /dev/null
+++ 
b/juneau-core/juneau-svl/src/main/java/org/apache/juneau/svl/vars/UpperCaseVar.java
@@ -0,0 +1,51 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.svl.vars;
+
+import org.apache.juneau.svl.*;
+
+/**
+ * Upper-case variable resolver.
+ * 
+ * <p>
+ * The format for this var is <js>"$UC{stringValue}"</js>.
+ * 
+ * <p>
+ * This variable simply converts to value to upper-case.
+ * 
+ * <p>
+ * Since this is a {@link SimpleVar}, any variables contained in the result 
will be recursively resolved.
+ * Likewise, if the arguments contain any variables, those will be resolved 
before they are passed to this var.
+ * 
+ * <h5 class='section'>See Also:</h5>
+ * <ul>
+ *     <li class='link'><a class="doclink" 
href="../../../../../overview-summary.html#juneau-rest-server.SvlVariables">Overview
 &gt; juneau-rest-server &gt; SVL Variables</a>
+ * </ul>
+ */
+public class UpperCaseVar extends SimpleVar {
+
+       /** The name of this variable. */
+       public static final String NAME = "UC";
+
+       /**
+        * Constructor.
+        */
+       public UpperCaseVar() {
+               super(NAME);
+       }
+
+       @Override /* Parameter */
+       public String resolve(VarResolverSession session, String key) {
+               return key.toUpperCase();
+       }
+}
\ No newline at end of file
diff --git a/juneau-doc/src/main/javadoc/overview.html 
b/juneau-doc/src/main/javadoc/overview.html
index 348fbbb..75106d4 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -4683,9 +4683,7 @@
                <p>
                        The <code>juneau-config</code> library contains a 
powerful API for creating and using INI-style config files.
                </p>
-               <p>
-                       An example of the contents of a config file:
-               </p>
+               <h5 class='figure'>Example configuration file:</h5>
                <p class='bcode'>
        <cc># A set of entries</cc>
        <cs>[Section1]</cs>
@@ -4705,7 +4703,7 @@
                <p>
                        Config files are access through the {@link 
org.apache.juneau.config.Config} class which
                        are created through the {@link 
org.apache.juneau.config.ConfigBuilder} class.
-                       <br><code>create()</code> methods are provided on the 
<code>Config</code> class for creating builders:
+                       <br>Builder creator methods are provided on the 
<code>Config</code> class:
                </p>
                <p class='bcode'>
        <jc>// Create a Config object</jc>
@@ -4744,11 +4742,11 @@
                        <li>
                                Filesystem watcher integration allowing changes 
on the file system to be reflected in real-time.
                        <li>
-                               Config files can be modified through the Config 
class (e.g. add/remove/modify sections and keys, add/remove comments and 
whitespace, etc...).
-                               <br>When using these APIs, you <b>DO NOT</b> 
lose formatting in your existing configuration file.
-                               All existing whitespace and comments are 
preserved for you!
+                               Modifications through the Config class (e.g. 
add/remove/modify sections and keys, add/remove comments and whitespace, 
etc...) 
+                               <b>DO NOT</b> cause loss of formatting in the 
file.
+                               <br>All existing whitespace and comments are 
preserved for you!
                        <li>
-                               Support for value encoding for added security.
+                               Value encoding for added security.
                        <li>
                                Support for SVL variables.
                        <li>
@@ -4803,11 +4801,11 @@
                                        <br>Subsequent lines start with a tab 
character.
                                        <p class='bcode'>
        <ck>multiLineValue</ck> = 
-               <cv>Line 1,</cv>
-               <cv>Line 2,</cv>
-               <cv>Line 3</cv>
+               <cv>line 1,</cv>
+               <cv>line 2,</cv>
+               <cv>line 3</cv>
                                        </p>
-                                       <br>When retrieved, the above 
translates to <js>"Line1,\nLine2,\nLine3"</js>.
+                                       <br>When retrieved, the above 
translates to <js>"line1,\nline2,\nline3"</js>.
                                <li>
                                        Leading and trailing whitespace on 
values are ignored.
                                <li>
@@ -4875,6 +4873,10 @@
        
        <cc># A long</cc>
        <ck>key4</ck> = <cv>10000000000</cv>
+       
+       <cc># Doubles</cc>
+       <ck>key5</ck> = <cv>6.67e−11</cv>
+       <ck>key6</ck> = <cv>Infinity</cv>
                        </p>
                        <p>
                                The following methods are provided for 
accessing primitive values:
@@ -4948,7 +4950,7 @@
                                <br>However in practice, we're typically 
talking about the following:
                        </p>
                        <ul>
-                               <li>Objects convertable from Strings.
+                               <li>Objects convertible from Strings.
                                <li>Beans.
                        </ul>
                        <p>
@@ -4964,7 +4966,7 @@
        URL key4 = c.getObject(<js>"Section1/key4"</js>, URL.<jk>class</jk>);
                        </p>
                        <p>
-                               Beans are represented as Lax JSON by default:
+                               Beans are represented as {@link 
org.apache.juneau.json.JsonSerializer#DEFAULT_LAX Lax JSON} by default:
                        </p>
                        <p class='bcode'>
        <jc>// Contact information</jc>
@@ -4986,7 +4988,7 @@
        }
 
        <jc>// Example usage</jc>
-       Config c = 
Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
+       Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build();
        Address myAddress = c.getObject(<js>"ContactInfo/address"</js>, 
Address.<jk>class</jk>);
                        </p>
                        <p>
@@ -5003,7 +5005,7 @@
                                </ul>
                        </ul>
                        <p>
-                               The default parser can also be overridden using 
the following getters:
+                               The default parser can also be overridden on 
the following getters:
                        </p>
                        <ul class='doctree'>
                                <li class='jc'>{@link 
org.apache.juneau.config.Config}
@@ -5149,10 +5151,10 @@
                                Oftentimes, it might be useful to parse into 
the {@link org.apache.juneau.ObjectList} and {@link org.apache.juneau.ObjectMap}
                                classes that provide the various convenience 
methods for working with JSON-like data structures:
                        </p>
-                       <ul>
-                               <li><code>getObject(<js>"..."</js>, 
ObjectList.<jk>class</jk>)</code>
-                               <li><code>getObject(<js>"..."</js>, 
ObjectMap.<jk>class</jk>)</code> 
-                       </ul>
+                       <p class='bcode'>
+       ObjectMap m = c.getObject(<js>"key1"</js>, ObjectMap.<jk>class</jk>);
+       ObjectList l = c.getObject(<js>"key2"</js>, ObjectList.<jk>class</jk>);
+                       </p>
                </div>
 
                <!-- 
========================================================================================================
 -->
@@ -5176,40 +5178,38 @@
                                <li>BASE-64 (default)
                                        <br>Example: 
<code><js>"Zm9vYmFycw=="</js></code>
                                <li>Hexadecimal
-                                       <br>Example: 
<code><js>"666F6F62617273</js></code>
+                                       <br>Example: 
<code><js>"666F6F62617273"</js></code>
                                <li>Spaced hexadecimal
-                                       <br>Example: <code><js>"66 6F 6F 62 61 
72 73</js></code>
+                                       <br>Example: <code><js>"66 6F 6F 62 61 
72 73"</js></code>
                        </ul>
                        <p>
-                               The binary data format is controlled via the 
following:
+                               The binary data format is controlled via the 
following setting:
                        </p>
                        <ul class='doctree'>
                                <li class='jf'>{@link 
org.apache.juneau.config.Config#CONFIG_binaryFormat}
-                               <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#binaryFormat(String)}
                        </ul>
                        <p>
                                For example:
                        </p>
                        <p class='bcode'>
-       <ck>bytes</ck> = <cv>Zm9vYmFycw==</cv>
+       <ck>key</ck> = <cv>Zm9vYmFycw==</cv>
                        </p>
                        <p class='bcode'>
-       <jk>byte</jk>[] bytes = c.getBytes(<js>"bytes"</js>);
+       <jk>byte</jk>[] bytes = c.getBytes(<js>"key"</js>);
                        </p>
                        <p>
                                Binary lines can be split up into separate 
lines for readability:
                        </p>
                        <p class='bcode'>
-       <ck>bytes</ck> = 
+       <ck>key</ck> = 
                <cv>Zm9vYm
                Fycw==</cv>
                        </p>
                        <p>
-                               Binary data line wrapping can be controlled via 
the following:
+                               Binary data line wrapping can be controlled via 
the following setting:
                        </p>
                        <ul class='doctree'>
                                <li class='jf'>{@link 
org.apache.juneau.config.Config#CONFIG_binaryLineLength}
-                               <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#binaryLineLength(int)}
                        </ul>
                </div>
 
@@ -5220,7 +5220,7 @@
        <h3 class='topic' onclick='toggle(this)'>6.3 - Variables</h3>
        <div class='topic'>
                <p>
-                       Config files can contain variables that get resolved 
dynamically using the {@link org.apache.juneau.svl.VarResolver} API.
+                       Config files can contain variables that get resolved 
dynamically using the previously-described {@link 
org.apache.juneau.svl.VarResolver} API.
                </p>
                <h5 class='figure'>Example:</h5>
                <p class='bcode'>
@@ -5235,14 +5235,11 @@
        <cc># An environment variable</cc>
        <ck>path</ck> = <cv>$E{PATH, unknown}</cv>
        
-       <cc># Another system property</cc>
-       <ck>anInt</ck> = <cv>$C{anInt, -1}</cv>
-
        <cc># Another value in this config file</cc>
-       <ck>sameAsAnInt</ck> = <cv>$C{MySection/anInt}</cv>
+       <ck>anotherLocale</ck> = <cv>$C{MySection/locale}</cv>
        
        <cc># Look for system property, or env var if that doesn't exist, or a 
default value if that doesn't exist.</cc>
-       <ck>nested</ck> = 
<cv>$S{mySystemProperty,$E{MY_ENV_VAR,$C{MySection/anInt}}}</cv>
+       <ck>nested</ck> = 
<cv>$S{mySystemProperty,$E{MY_ENV_VAR,$C{MySection/anotherLocale}}}</cv>
 
        <cc># A POJO with embedded variables</cc>
        <ck>aBean</ck> = <cv>{foo:'$S{foo}',baz:$C{MySection/anInt}}</cv>
@@ -5260,23 +5257,21 @@
                        which provides support for the following variables and 
constructs:
                </p>
                <ul class='spaced-list'>
-                       <li><code>$C{key}</code>,<code>$C{key,default}</code> - 
{@link org.apache.juneau.config.vars.ConfigVar}
-                       <li><code>$S{key}</code>,<code>$S{key,default}</code> - 
{@link org.apache.juneau.svl.vars.SystemPropertiesVar}
-                       <li><code>$E{key}</code>,<code>$E{key,default}</code> - 
{@link org.apache.juneau.svl.vars.EnvVariablesVar}
+                       <li><code>$C{key}</code>, <code>$C{key,default}</code> 
- {@link org.apache.juneau.config.vars.ConfigVar}
+                       <li><code>$S{key}</code>, <code>$S{key,default}</code> 
- {@link org.apache.juneau.svl.vars.SystemPropertiesVar}
+                       <li><code>$E{key}</code>, <code>$E{key,default}</code> 
- {@link org.apache.juneau.svl.vars.EnvVariablesVar}
                </ul>
                <p>
-                       The variable resolver can be overridden via the 
following:
+                       The variable resolver is controlled via the following 
setting:
                </p>
                <ul class='doctree'>
                        <li class='jf'>{@link 
org.apache.juneau.config.Config#CONFIG_varResolver}
-                       <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#varResolver(Class)}
-                       <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#varResolver(VarResolver)}
                </ul>
                <p>
                        Additionally, the following method can be used to 
retrieve a <code>Config</code> with a different variable resolver:
                </p>
                <ul class='doctree'>
-                       <li class='jf'>{@link 
org.apache.juneau.config.Config#resolving(VarResolverSession)}
+                       <li class='jm'>{@link 
org.apache.juneau.config.Config#resolving(VarResolverSession)}
                </ul>
 
                <!-- 
========================================================================================================
 -->
@@ -5287,9 +5282,13 @@
                                The default variable resolver also provides the 
following logic variables for performing simple logical operations:
                        </p>
                        <ul class='spaced-list'>
-                               
<li><code>$IF{booleanValue,thenValue[,elseValue]}</code> - {@link 
org.apache.juneau.svl.vars.IfVar}
-                               
<li><code>$SW{test,matchPattern:thenValue[,matchPattern:thenValue...]}</code> - 
{@link org.apache.juneau.svl.vars.SwitchVar}
-                               <li><code>$CO{arg1[,arg2...]}</code> - {@link 
org.apache.juneau.svl.vars.CoalesceVar}
+                               <li><code>$IF{booleanValue, thenValue[, 
elseValue]}</code> - {@link org.apache.juneau.svl.vars.IfVar}
+                               <li><code>$SW{stringValue, 
matchPattern:thenValue[ ,matchPattern:thenValue...]}</code> - {@link 
org.apache.juneau.svl.vars.SwitchVar}
+                               <li><code>$CO{arg1[, arg2...]}</code> - {@link 
org.apache.juneau.svl.vars.CoalesceVar}
+                               <li><code>$PM{stringValue, matchPattern}</code> 
- {@link org.apache.juneau.svl.vars.PatternMatchVar}
+                               <li><code>$UC{stringValue}</code> - {@link 
org.apache.juneau.svl.vars.UpperCaseVar}
+                               <li><code>$LC{stringValue}</code> - {@link 
org.apache.juneau.svl.vars.LowerCaseVar}
+                               <li><code>$NE{stringValue}</code> - {@link 
org.apache.juneau.svl.vars.NotEmptyVar}
                        </ul>
                        <p>
                                The <code>$IF</code> variable can be used for 
simple if/else logic:
@@ -5325,7 +5324,7 @@
        <cc># Shell command depends on the OS</cc>
        <ck>shellCommand</ck> = 
                <cv>$SW{                
-                       $S{os.name},
+                       $LC{$S{os.name}},
                        *win*: bat,
                        linux: bash,
                        *: sh
@@ -5343,6 +5342,17 @@
                        false
                }</cv>          
                        </p>
+                       <p>
+                               The <code>$PM</code> variable can be used for 
calculating boolean values:
+                       </p>
+                       <p class='bcode'>
+       <cc># Debug flag can be enabled by system property or environment 
variable.</cc>
+       <ck>isWindows</ck> = 
+               <cv>$PM{                
+                       $LC{$S{os.name}},
+                       *win*
+               }</cv>          
+                       </p>
                </div>
        </div>
 
@@ -5357,7 +5367,7 @@
                        Encoded entries are denoted with a <js>'*'</js> 
character at the end of the key name.
                </p>
                <p>
-                       For example, the following password is marked for 
encoding....
+                       For example, the following password is marked for 
encoding:
                </p>
                <p class='bcode'>
        <cs>[MyHost]</cs>
@@ -5371,13 +5381,19 @@
                <p>
                        Custom encoders can be used to provide your own 
encoding support by implementing the {@link 
org.apache.juneau.config.encode.ConfigEncoder} interface.
                </p>
+               <ul class='doctree'>
+                       <li class='jic'>{@link 
org.apache.juneau.config.encode.ConfigEncoder}
+                       <ul>
+                               <li class='jm'>{@link 
org.apache.juneau.config.encode.ConfigEncoder#encode(String,String) 
encode(String,String)}
+                               <li class='jm'>{@link 
org.apache.juneau.config.encode.ConfigEncoder#decode(String,String) 
decode(String,String)}
+                               <li class='jm'>{@link 
org.apache.juneau.config.encode.ConfigEncoder#isEncoded(String) 
isEncoded(String)}
+                       </ul>
+               </ul>
                <p>
-                       Encoders are controlled via the following:
+                       Encoders are controlled via the following setting:
                </p>
                <ul class='doctree'>
                        <li class='jf'>{@link 
org.apache.juneau.config.Config#CONFIG_encoder}
-                       <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#encoder(Class)}
-                       <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#encoder(ConfigEncoder)}
                </ul>
                <p>
                        Encoded values can be set to plain-text values.  
@@ -5385,7 +5401,7 @@
                </p>
                <p>
                        Unencoded values are encoded when the file is saved 
using the {@link org.apache.juneau.config.Config#commit()} method.
-                       <br>They can also be encoded by calling {@link 
org.apache.juneau.config.Config#encodeEntries()}.
+                       <br>They can also be encoded immediately by calling 
{@link org.apache.juneau.config.Config#encodeEntries()}.
                </p>
        </div>
 
@@ -5394,9 +5410,10 @@
        <h3 class='topic' onclick='toggle(this)'>6.5 - Section Maps</h3>
        <div class='topic'>
                <p>
-                       Config sections can be retrieved in-bulk using the  
-                       {@link 
org.apache.juneau.config.Config#getSectionAsMap(String)} method:
+                       Config sections can be retrieved in-bulk using  
+                       {@link 
org.apache.juneau.config.Config#getSectionAsMap(String)}.
                </p>
+               <h5 class='figure'>Example:</h5>
                <p class='bcode'>
        <jc>// Example config file</jc>
        <cs>[MyAddress]</cs>
@@ -5407,7 +5424,7 @@
                </p>
                <p class='bcode'>
        <jc>// Example usage</jc>
-       Config c = 
Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
+       Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build();
        
        ObjectMap m = c.getSectionAsMap(<js>"MyAddress"</js>);
        
@@ -5416,6 +5433,9 @@
        String state = m.getString(<js>"state"</js>);
        <jk>int</jk> zip = m.getInt(<js>"zip"</js>);
                </p>
+               <p>
+                       Maps created this way are snapshot copies of the 
section at the time of the method call.
+               </p>
        </div>
 
        <!-- 
========================================================================================================
 -->
@@ -5423,9 +5443,10 @@
        <h3 class='topic' onclick='toggle(this)'>6.6 - Section Beans</h3>
        <div class='topic'>
                <p>
-                       Config files can also be used to directly populate 
beans using the 
-                       {@link 
org.apache.juneau.config.Config#getSectionAsBean(String,Class,boolean)}:
+                       Config files can also be used to directly populate 
beans using 
+                       {@link 
org.apache.juneau.config.Config#getSectionAsBean(String,Class,boolean)}.
                </p>
+               <h5 class='figure'>Example:</h5>
                <p class='bcode'>
        <jc>// Example config file</jc>
        <cs>[MyAddress]</cs>
@@ -5443,8 +5464,11 @@
        }
 
        <jc>// Example usage</jc>
-       Config cf = 
Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
-       Address myAddress = cf.getSectionAsBean(<js>"MyAddress"</js>, 
Address.<jk>class</jk>);
+       Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build();
+       Address myAddress = c.getSectionAsBean(<js>"MyAddress"</js>, 
Address.<jk>class</jk>);
+               </p>
+               <p>
+                       Like maps, beans created this way are snapshot copies 
of the section at the time of the method call.
                </p>
        </div>
 
@@ -5460,6 +5484,7 @@
                        While section maps and beans retrieve copies of the 
configuration data at the time of the method
                        call, section interfaces can also be use to set values 
in the underlying configuration.
                </p>
+               <h5 class='figure'>Example:</h5>
                <p class='bcode'>
        <jc>// Example config file</jc>
        <cs>[MySection]</cs>
@@ -5495,7 +5520,7 @@
        }
        
        <jc>// Example usage.</jc>
-       Config c = 
Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
+       Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build();
        MyConfigInterface ci = c.getSectionAsInterface(<js>"MySection"</js>, 
MyConfigInterface.<jk>class</jk>);
        
        <jc>// Read a value.</jc>
@@ -5532,7 +5557,7 @@
                </ul>
                <p class='bcode'>
        <jc>// Construct the sample config file programmatically</jc>
-       Config c = 
Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build()
+       Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build()
                .set(<js>"key1"</js>, 1)
                .set(<js>"key2"</js>, <jk>true</jk>)
                .set(<js>"key3"</js>, <jk>new int</jk>[]{1,2,3})
@@ -5553,7 +5578,7 @@
                Arrays.asList(
                        <js>"# Comment 1"</js>, <js>""</js>, <js>"# Comment 
2"</js>
                )
-       )
+       );
                </p>
                <p class='bcode'>
        <cc># Comment 1</cc>
@@ -5599,8 +5624,9 @@
                <h4 class='topic' onclick='toggle(this)'>6.8.1 - File System 
Changes</h4>
                <div class='topic'>
                        <p>
-                               In general, changes made to configuration files 
will be updated immediately in the <code>Config</code>
-                               object (although this is configurable and 
described in detail later).
+                               In general, external file modifications will be 
detected immediately in the <code>Config</code>
+                               object when a watcher thread is enabled 
(explained later).
+                               <br>Otherwise, they are detected when a commit 
is performed.
                        </p>
                        <p>
                                The <code>Config</code> object maintains an 
in-memory record of all changes that have been applied to it
@@ -5614,6 +5640,10 @@
                                contents have been modified, we will then 
reload the configuration from the file system, apply the
                                changes, and then try to save to the file 
system again (up to 10 times).
                        </p>
+                       <p>
+                               If the same entry is both internally and 
externally modified, the external modification will be 
+                               overwritten (although both change events will 
be seen by listeners).
+                       </p>
                </div>
                
                <!-- 
========================================================================================================
 -->
@@ -5625,7 +5655,7 @@
                                instead of using the predefined serializer.
                        </p>
                        <p class='bcode'>
-       <jc>// Set an XML value instead of a.</jc>
+       <jc>// Set an XML value instead of JSON.</jc>
        c.set(<js>"key1"</js>, myAddress, 
XmlSerializer.<jsf>DEFAULT_SQ_READABLE</jsf>);
                        </p>
                        <p class='bcode'>
@@ -5641,7 +5671,7 @@
                                The value can then be retrieved using the 
equivalent parser:
                        </p>
                        <p class='bcode'>
-       Address a = c.getObject(<js>"key1"</js>, XmlParser.<jsf>DEFAULT</jsf>, 
Address.<jk>class</jk>);                 
+       Address myAddress = c.getObject(<js>"key1"</js>, 
XmlParser.<jsf>DEFAULT</jsf>, Address.<jk>class</jk>);                 
                        </p>
                </div>
 
@@ -5657,6 +5687,8 @@
                                <ul>
                                        <li class='jm'>{@link 
org.apache.juneau.config.Config#setSection(String,List,Map) 
setSection(String,List,Map)}
                                        <li class='jm'>{@link 
org.apache.juneau.config.Config#load(Map) load(Map)}
+                                       <li class='jm'>{@link 
org.apache.juneau.config.Config#load(Reader,boolean) load(Reader,boolean)}
+                                       <li class='jm'>{@link 
org.apache.juneau.config.Config#load(String,boolean) load(String,boolean)}
                                </ul>
                        </ul>
                        <p>
@@ -5680,7 +5712,7 @@
                        </ul>
                </ul>
                <p>
-                       The event listener interface consists of the following 
method:
+                       The {@link 
org.apache.juneau.config.event.ConfigEventListener} interface consists of the 
following method:
                </p>            
                <ul class='doctree'>
                        <li class='jic'>{@link 
org.apache.juneau.config.event.ConfigEventListener}
@@ -5688,6 +5720,9 @@
                                <li class='jm'>{@link 
org.apache.juneau.config.event.ConfigEventListener#onConfigChange(List) 
onConfigChange(List&lt;ConfigEvent&gt;)}
                        </ul>
                </ul>
+               <p>
+                       The {@link org.apache.juneau.config.event.ConfigEvent} 
class provides access to all the information about the updated entry:
+               </p>
                <ul class='doctree'>
                        <li class='jc'>{@link 
org.apache.juneau.config.event.ConfigEvent}
                        <ul>
@@ -5701,9 +5736,9 @@
                        </ul>
                </ul>
                <p>
-                       This method is triggered:
+                       The listener method is triggered:
                </p>
-               <ul>
+               <ul class='spaced-list'>
                        <li>After {@link 
org.apache.juneau.config.Config#commit()} is called.
                        <li>When the file changes on the file system. 
                </ul>
@@ -5720,7 +5755,11 @@
                        <jk>public void</jk> 
onConfigChange(List&lt;ConfigEvent&gt; events) {
                                <jk>for</jk> (ConfigEvent event : events) {
                                        <jk>if</jk> (event.getType() == 
<jsf>SET_ENTRY</jsf>) {
-                                               <jk>if</jk> 
(event.getSection().equals(<js>"MySection"</js>) &amp;&amp; 
event.getKey().equals(<js>"key1"</js>)) {
+                                               
+                                               String section = 
event.getSection();
+                                               String key = event.getKey();
+                                       
+                                               <jk>if</jk> 
(section.equals(<js>"MySection"</js>) &amp;&amp; key.equals(<js>"key1"</js>)) {
                
                                                        <jc>// Get the new 
value from the event.</jc>
                                                        String newVal = 
event.getValue();
@@ -5763,7 +5802,7 @@
                        Configuration files are stored in entities called 
Stores.
                </p>
                <p>
-                       The API for implementing a store is simple:
+                       The methods that need to be implemented on a store are:
                </p>
                <ul class='doctree'>
                        <li class='jac'>{@link 
org.apache.juneau.config.store.ConfigStore}
@@ -5775,24 +5814,31 @@
                </ul>
                <p>
                        Read is self-explanatory:
-                       <br><code>String read(String name)</code>
-                       <br>Simple return the string contents of the specified 
configuration name:
+               </p>
+               <p class='bcode'>
+       <jk>public</jk> String read(String name) {
+               <jc>// Return the contents of the specified configuration.</jc>
+       }
                </p>
                <p>
                        Write is slightly trickier:
-                       <br><code>String write(String name, String oldContents, 
String newContents)</code>
-                       <br>With this method, you pass in the old and new 
contents.
-                       <br>There are two possible outcomes to this call:
                </p>
-               <ul>
-                       <li>The old contents match the current stored contents, 
the new contents will get stored, and the method returns <jk>null</jk>.
-                       <li>The old contents DO NOT match the current stored 
contents (i.e. it was modified in some way), the new contents are NOT
-                       stored, and the method returns the current stored 
contents.
-               </ul>
+               <p class='bcode'>
+       <jk>public</jk> String write(String name, String oldContents, String 
newContents) {
+               <jc>// If the old contents match the current stored contents, 
the new contents will get stored, 
+               //      and the method returns null.
+               // If the old contents DO NOT match the current stored contents 
(i.e. it was modified in some way), 
+               //      the new contents are NOT stored, and the method returns 
the current stored contents.</jc>
+       }
+               </p>
                <p>
-                       The update method is called whenever the stored file 
gets modified:
-                       <br><code><jk>void</jk> update(String name, String 
newContents)</code>
+                       The update method is called whenever the stored file 
gets modified externally:
                </p>            
+               <p class='bcode'>
+       <jk>public</jk> String update(String name, String newContents) {
+               <jc>// Do something with the updated contents.</jc>
+       }
+               </p>
                <p>
                        The <code>ConfigStore</code> class also has the 
following listener methods:
                </p>
@@ -5810,7 +5856,7 @@
                <ul class='doctree'>
                        <li class='jic'>{@link 
org.apache.juneau.config.store.ConfigStoreListener}
                        <ul>
-                               <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigStoreListener#onChange(String)} - Called 
when file changes.  New contents passed in.
+                               <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigStoreListener#onChange(String)} - Called 
when file changes.  New contents are passed in.
                        </ul>
                </ul>
                <p>
@@ -5825,11 +5871,10 @@
                        <li class='jc'>{@link 
org.apache.juneau.config.store.ConfigMemoryStore} - In-memory storage.
                </ul>
                <p>
-                       The store is defined on the <code>Config</code> object 
via the following:
+                       The store is defined on the <code>Config</code> object 
via the following setting:
                </p>
                <ul>
                        <li class='jf'>{@link 
org.apache.juneau.config.Config#CONFIG_store}
-                       <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#store(ConfigStore)}
                </ul>
                
                <h5 class='figure'>Example:</h5>
@@ -5852,9 +5897,9 @@
                                <br>There is no hard persistence and is used 
primarily for testing purposes.
                        </p>
                        <p>
-                               However, the implementation provides a good 
idea on how stores work, especially the write method:
+                               However, the implementation provides a good 
idea on how stores work (especially the write method):
                        </p>
-                       <p>
+                       <p class='bcode'>
        <jk>public class</jk> ConfigMemoryStore <jk>extends</jk> ConfigStore {
        
                <jc>// Some methods ommitted.</jc>
@@ -5905,13 +5950,13 @@
                                It provides the following configurable settings:
                        </p>
                        <ul class='doctree'>
-                               <li class='jic'>{@link 
org.apache.juneau.config.store.ConfigFileStore}
+                               <li class='jc'>{@link 
org.apache.juneau.config.store.ConfigFileStore}
                                <ul>
-                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_charset}
-                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_directory}
-                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_updateOnWrite}
-                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_useWatcher}
-                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_watcherSensitivity}
+                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_charset 
FILESTORE_charset}
+                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_directory 
FILESTORE_directory}
+                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_updateOnWrite 
FILESTORE_updateOnWrite}
+                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_useWatcher 
FILESTORE_useWatcher}
+                                       <li class='jm'>{@link 
org.apache.juneau.config.store.ConfigFileStore#FILESTORE_watcherSensitivity 
FILESTORE_watcherSensitivity}
                                </ul>
                        </ul>
                        
@@ -5937,7 +5982,7 @@
                                The example belows shows a starting point for 
an implementation based on a relational database.
                                <br>Completing it is left as an exercise:
                        </p>
-                       <h5 class='figure'>Store Class</h5>
+                       <h5 class='figure'>Example Store Class:</h5>
                        <p class='bcode'>
        <jk>public class</jk> ConfigSqlStore <jk>extends</jk> ConfigStore {
 
@@ -5997,7 +6042,7 @@
                <jk>public synchronized</jk> String read(String name) {
                        String contents = <jf>cache</jf>.get(name);
                        <jk>if</jk> (contents == <jk>null</jk>) {
-                               contents = readDatabaseValue();
+                               contents = readDatabaseValue(name);
                                update(name, contents);
                        }
                        <jk>return</jk> contents;
@@ -6040,7 +6085,7 @@
                                The purpose of the builder class is to simply 
set values in the {@link org.apache.juneau.PropertyStore}
                                that's passed to the <code>ConfigStore</code>:
                        </p>
-                       <h5 class='figure'>Builder Class</h5>
+                       <h5 class='figure'>Example Builder Class:</h5>
                        <p class='bcode'>
        <jk>public class</jk> ConfigSqlStoreBuilder <jk>extends</jk> 
ConfigStoreBuilder {
 
@@ -6048,7 +6093,7 @@
                        <jk>super</jk>();
                }
 
-               <jk>publicv ConfigSqlStoreBuilder(PropertyStore ps) {
+               <jk>public</jk> ConfigSqlStoreBuilder(PropertyStore ps) {
                        <jk>super</jk>(ps);
                }
 
@@ -6090,9 +6135,8 @@
                </p>
                <ul class='doctree'>
                        <li class='jf'>{@link 
org.apache.juneau.config.Config#CONFIG_readOnly}
-                       <li class='jm'>{@link 
org.apache.juneau.config.ConfigBuilder#readOnly()}
                </ul>
-               <h6 class='figure'>Example:</h6>
+               <h5 class='figure'>Example:</h5>
                <p class='bcode'>
        <jc>// Create a read-only config</jc>
        Config c = 
Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).readOnly().build();
@@ -7950,7 +7994,7 @@
                <p>
                        The registered {@link 
org.apache.juneau.rest.RestContext#REST_partParser} is used to convert strings
                        to POJOs and controls what POJO types are supported.
-                       <br>As a general rule, any POJO convertable from a 
String is supported.
+                       <br>As a general rule, any POJO convertible from a 
String is supported.
                </p>
                <ul class='doctree'>
                        <li class='warn'>
@@ -8005,7 +8049,7 @@
                <p>
                        The registered {@link 
org.apache.juneau.rest.RestContext#REST_partParser} is used to convert strings
                        to POJOs and controls what POJO types are supported.
-                       <br>As a general rule, any POJO convertable from a 
String is supported.
+                       <br>As a general rule, any POJO convertible from a 
String is supported.
                </p>
                <h5 class='section'>See Also:</h5>
                <ul>
@@ -8884,10 +8928,10 @@
                        These properties are then accessible through the {@link 
org.apache.juneau.config.Config} class.
                </p>
                <p class='bcode'>
-       Config cf = 
Config.<jsm>create</jsm>().name(<js>"myconfig.cfg"</js>).build();
-       String path = cf.getString(<js>"MyProperties/path"</js>);
-       File javaHome = cf.getObject(<js>"MyProperties/javaHome"</js>, 
File.<jk>class</jk>);
-       String customMessage = 
cf.getString(<js>"MyProperties/customMessage"</js>);
+       Config c = Config.<jsm>create</jsm>(<js>"myconfig.cfg"</js>).build();
+       String path = c.getString(<js>"MyProperties/path"</js>);
+       File javaHome = c.getObject(<js>"MyProperties/javaHome"</js>, 
File.<jk>class</jk>);
+       String customMessage = 
c.getString(<js>"MyProperties/customMessage"</js>);
                </p>
                <p>
                        Configuration files are associated with REST resources 
through the following:
@@ -8936,9 +8980,9 @@
                <jk>private final</jk> File <jf>javaHome</jf>;
        
                <jk>public</jk> MyResource(RestContextBuilder builder) {
-                       Config cf = builder.getConfig();
-                       <jf>path</jf> = 
cf.getString(<js>"MyProperties/path"</js>);
-                       <jf>javaHome</jf> = cf.getObject(File.<jk>class</jk>, 
<js>"MyProperties/javaHome"</js>);
+                       Config c = builder.getConfig();
+                       <jf>path</jf> = 
c.getString(<js>"MyProperties/path"</js>);
+                       <jf>javaHome</jf> = c.getObject(File.<jk>class</jk>, 
<js>"MyProperties/javaHome"</js>);
                }
                </p>
                <p>
@@ -11432,8 +11476,8 @@
                        <h5 class='figure'>Code that reads an 
<code>SSLOpts</code> bean from the config file</h5>
                        <p class='bcode'>
        <jc>// Read config file and set SSL options based on what's in that 
file.</jc>
-       Config cf = 
Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
-       SSLOpts ssl = cf.getObject(SSLOpts.<jk>class</jk>, 
<js>"Connection/ssl"</js>);
+       Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build();
+       SSLOpts ssl = c.getObject(SSLOpts.<jk>class</jk>, 
<js>"Connection/ssl"</js>);
        RestClient rc = RestClient.<jsm>create</jsm>().enableSSL(ssl).build();
                        </p>
                </div>
@@ -12624,20 +12668,20 @@
        </p>
        <p class='bcode'>
        <jc>// Java code for accessing config entries above.</jc>
-       Config cf = Microservice.<jsm>getInstance</jsm>().getConfig();
-       
-       <jk>int</jk> anInt = cf.getInt(<js>"MySection/anInt"</js>); 
-       <jk>boolean</jk> aBoolean = 
cf.getBoolean(<js>"MySection/aBoolean"</js>); 
-       <jk>int</jk>[] anIntArray = cf.getObject(<jk>int</jk>[].<jk>class</jk>, 
<js>"MySection/anIntArray"</js>); 
-       URL aURL = cf.getObject(URL.<jk>class</jk>, <js>"MySection/aURL"</js>); 
-       String aPassword = cf.getString(<js>"MySection/aPassword"</js>);
-       MyBean aBean = cf.getObject(MyBean.<jk>class</jk>, 
<js>"MySection/aBean"</js>); 
-       Locale locale = cf.getObject(Locale.<jk>class</jk>, 
<js>"MySection/locale"</js>); 
-       String path = cf.getString(<js>"MySection/path"</js>); 
-       String mainClass = cf.getString(<js>"MySection/mainClass"</js>); 
-       <jk>int</jk> sameAsAnInt = cf.getInt(<js>"MySection/sameAsAnInt"</js>); 
-       String myArg = cf.getString(<js>"MySection/myArg"</js>); 
-       String firstArg = cf.getString(<js>"MySection/firstArg"</js>); 
+       Config c = Microservice.<jsm>getInstance</jsm>().getConfig();
+       
+       <jk>int</jk> anInt = c.getInt(<js>"MySection/anInt"</js>); 
+       <jk>boolean</jk> aBoolean = 
c.getBoolean(<js>"MySection/aBoolean"</js>); 
+       <jk>int</jk>[] anIntArray = c.getObject(<jk>int</jk>[].<jk>class</jk>, 
<js>"MySection/anIntArray"</js>); 
+       URL aURL = c.getObject(URL.<jk>class</jk>, <js>"MySection/aURL"</js>); 
+       String aPassword = c.getString(<js>"MySection/aPassword"</js>);
+       MyBean aBean = c.getObject(MyBean.<jk>class</jk>, 
<js>"MySection/aBean"</js>); 
+       Locale locale = c.getObject(Locale.<jk>class</jk>, 
<js>"MySection/locale"</js>); 
+       String path = c.getString(<js>"MySection/path"</js>); 
+       String mainClass = c.getString(<js>"MySection/mainClass"</js>); 
+       <jk>int</jk> sameAsAnInt = c.getInt(<js>"MySection/sameAsAnInt"</js>); 
+       String myArg = c.getString(<js>"MySection/myArg"</js>); 
+       String firstArg = c.getString(<js>"MySection/firstArg"</js>); 
                </p>
        
                <!-- 
===========================================================================================================
 -->
@@ -16467,6 +16511,18 @@
                        TBD
                </p>
 
+               <h5 class='topic'>juneau-svl</h5>
+               <ul class='spaced-list'>
+                       <li>
+                               New variables:
+                               <ul>
+                                       <li>{@link 
org.apache.juneau.svl.vars.PatternMatchVar}
+                                       <li>{@link 
org.apache.juneau.svl.vars.NotEmptyVar}
+                                       <li>{@link 
org.apache.juneau.svl.vars.UpperCaseVar}
+                                       <li>{@link 
org.apache.juneau.svl.vars.LowerCaseVar}
+                               </ul>
+               </ul>
+               
                <h5 class='topic'>juneau-config</h5>
                <ul class='spaced-list'>
                        <li>

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to