juneau-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamesbog...@apache.org
Subject [juneau] branch master updated: New variable resolvers.
Date Thu, 01 Mar 2018 00:51:51 GMT
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 <jamesbognar@apache.org>
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
jamesbognar@apache.org.

Mime
View raw message